Merge "Installer: Link 4.0 family of CC licenses"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 16 Dec 2015 19:41:49 +0000 (19:41 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 16 Dec 2015 19:41:49 +0000 (19:41 +0000)
1090 files changed:
.jscsrc
Gemfile
Gemfile.lock
HISTORY
RELEASE-NOTES-1.26 [deleted file]
RELEASE-NOTES-1.27
Rakefile [new file with mode: 0644]
api.php
autoload.php
composer.json
docs/extension.schema.json
docs/hooks.txt
docs/memcached.txt
includes/AjaxResponse.php
includes/Block.php
includes/Category.php
includes/Collation.php
includes/DefaultSettings.php
includes/Defines.php
includes/EditPage.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/ForkController.php
includes/GlobalFunctions.php
includes/Hooks.php
includes/Html.php
includes/HttpFunctions.php
includes/Import.php
includes/Linker.php
includes/MWTimestamp.php
includes/MagicWord.php
includes/MediaWiki.php
includes/MovePage.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/PHPVersionError.php
includes/Preferences.php
includes/PrefixSearch.php
includes/Revision.php
includes/Sanitizer.php
includes/Setup.php
includes/SiteStats.php
includes/TemplateParser.php
includes/Title.php
includes/User.php [deleted file]
includes/UserArray.php [deleted file]
includes/UserArrayFromResult.php [deleted file]
includes/UserRightsProxy.php [deleted file]
includes/WatchedItem.php
includes/WebRequestUpload.php
includes/WebResponse.php
includes/WebStart.php
includes/XmlSelect.php
includes/actions/HistoryAction.php
includes/actions/RawAction.php
includes/api/ApiBase.php
includes/api/ApiContinuationManager.php
includes/api/ApiCreateAccount.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiExpandTemplates.php
includes/api/ApiFeedRecentChanges.php
includes/api/ApiFeedWatchlist.php
includes/api/ApiFormatBase.php
includes/api/ApiFormatDbg.php [deleted file]
includes/api/ApiFormatRaw.php
includes/api/ApiFormatTxt.php [deleted file]
includes/api/ApiFormatYaml.php [deleted file]
includes/api/ApiHelp.php
includes/api/ApiLogin.php
includes/api/ApiMain.php
includes/api/ApiMessage.php
includes/api/ApiMove.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiParamInfo.php
includes/api/ApiParse.php
includes/api/ApiProtect.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryCategoryMembers.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryIWLinks.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLangLinks.php
includes/api/ApiQueryRandom.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiQueryStashImageInfo.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiQueryUsers.php
includes/api/ApiResult.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiStashEdit.php
includes/api/ApiTokens.php
includes/api/ApiUpload.php
includes/api/ApiWatch.php
includes/api/i18n/bgn.json [new file with mode: 0644]
includes/api/i18n/br.json
includes/api/i18n/ca.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/diq.json [new file with mode: 0644]
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/eu.json
includes/api/i18n/fa.json
includes/api/i18n/fi.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/id.json [new file with mode: 0644]
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/ksh.json
includes/api/i18n/lb.json
includes/api/i18n/lki.json [new file with mode: 0644]
includes/api/i18n/lt.json
includes/api/i18n/mr.json
includes/api/i18n/nap.json
includes/api/i18n/pl.json
includes/api/i18n/ps.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/sd.json
includes/api/i18n/si.json
includes/api/i18n/sr-ec.json
includes/api/i18n/sv.json
includes/api/i18n/tcy.json [new file with mode: 0644]
includes/api/i18n/tl.json
includes/api/i18n/tr.json
includes/api/i18n/uk.json
includes/api/i18n/vi.json
includes/api/i18n/zh-hans.json
includes/api/i18n/zh-hant.json
includes/cache/BacklinkCache.php
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/HTMLFileCache.php
includes/cache/LinkCache.php
includes/cache/LocalisationCache.php
includes/cache/MessageBlobStore.php
includes/cache/MessageCache.php
includes/changes/CategoryMembershipChange.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RecentChange.php
includes/clientpool/RedisConnectionPool.php
includes/clientpool/SquidPurgeClient.php
includes/compat/MemcachedClientCompat.php [new file with mode: 0644]
includes/compat/RunningStatCompat.php [new file with mode: 0644]
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/IContextSource.php
includes/context/RequestContext.php
includes/db/ChronologyProtector.php
includes/db/DBConnRef.php
includes/db/Database.php
includes/db/DatabaseError.php
includes/db/DatabaseMysqlBase.php
includes/db/DatabaseOracle.php
includes/db/DatabasePostgres.php
includes/db/DatabaseUtility.php
includes/db/IDatabase.php
includes/db/IORMRow.php [deleted file]
includes/db/IORMTable.php [deleted file]
includes/db/ORMIterator.php [deleted file]
includes/db/ORMResult.php [deleted file]
includes/db/ORMRow.php [deleted file]
includes/db/ORMTable.php [deleted file]
includes/db/loadbalancer/LBFactory.php
includes/db/loadbalancer/LBFactoryMulti.php
includes/db/loadbalancer/LBFactorySimple.php
includes/db/loadbalancer/LoadBalancer.php
includes/db/loadbalancer/LoadMonitorMySQL.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/LegacySpi.php
includes/debug/logger/LoggerFactory.php
includes/debug/logger/MonologSpi.php
includes/debug/logger/NullSpi.php
includes/debug/logger/Spi.php
includes/debug/logger/monolog/AvroFormatter.php
includes/debug/logger/monolog/BufferHandler.php
includes/debug/logger/monolog/LegacyFormatter.php
includes/debug/logger/monolog/LegacyHandler.php
includes/debug/logger/monolog/SyslogHandler.php
includes/deferred/CdnCacheUpdate.php [new file with mode: 0644]
includes/deferred/DeferrableUpdate.php [new file with mode: 0644]
includes/deferred/DeferredUpdates.php
includes/deferred/HTMLCacheUpdate.php
includes/deferred/LinksUpdate.php
includes/deferred/MergeableUpdate.php [new file with mode: 0644]
includes/deferred/SearchUpdate.php
includes/deferred/SiteStatsUpdate.php
includes/deferred/SquidUpdate.php [deleted file]
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/diff/TableDiffFormatter.php
includes/exception/ErrorPageError.php
includes/exception/MWExceptionHandler.php
includes/externalstore/ExternalStoreMwstore.php
includes/filebackend/FSFile.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendGroup.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/SwiftFileBackend.php
includes/filebackend/filejournal/FileJournal.php
includes/filebackend/lockmanager/DBLockManager.php
includes/filebackend/lockmanager/LockManager.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignAPIFile.php
includes/filerepo/file/LocalFile.php
includes/gallery/ImageGalleryBase.php
includes/gallery/TraditionalImageGallery.php
includes/htmlform/HTMLApiField.php
includes/htmlform/HTMLAutoCompleteSelectField.php
includes/htmlform/HTMLButtonField.php
includes/htmlform/HTMLCheckField.php
includes/htmlform/HTMLComboboxField.php [new file with mode: 0644]
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/HTMLHiddenField.php
includes/htmlform/HTMLRadioField.php
includes/htmlform/HTMLSelectNamespace.php
includes/htmlform/HTMLSelectOrOtherField.php
includes/htmlform/OOUIHTMLForm.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlInstaller.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/installer/WebInstallerPage.php
includes/installer/i18n/ast.json
includes/installer/i18n/azb.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/bgn.json
includes/installer/i18n/bn.json
includes/installer/i18n/ca.json
includes/installer/i18n/cs.json
includes/installer/i18n/cy.json
includes/installer/i18n/da.json
includes/installer/i18n/de.json
includes/installer/i18n/el.json
includes/installer/i18n/en.json
includes/installer/i18n/es.json
includes/installer/i18n/eu.json
includes/installer/i18n/fa.json
includes/installer/i18n/fr.json
includes/installer/i18n/frc.json
includes/installer/i18n/gl.json
includes/installer/i18n/he.json
includes/installer/i18n/id.json
includes/installer/i18n/is.json
includes/installer/i18n/it.json
includes/installer/i18n/ja.json
includes/installer/i18n/jv.json
includes/installer/i18n/ksh.json
includes/installer/i18n/lb.json
includes/installer/i18n/lki.json [new file with mode: 0644]
includes/installer/i18n/lt.json
includes/installer/i18n/mk.json
includes/installer/i18n/mr.json
includes/installer/i18n/nap.json
includes/installer/i18n/pl.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/ru.json
includes/installer/i18n/sd.json
includes/installer/i18n/sl.json
includes/installer/i18n/sr-ec.json
includes/installer/i18n/tr.json
includes/installer/i18n/tt-cyrl.json
includes/installer/i18n/vi.json
includes/installer/i18n/yi.json
includes/installer/i18n/zh-hans.json
includes/installer/i18n/zh-hant.json
includes/jobqueue/Job.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueFederated.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/JobRunner.php
includes/jobqueue/README
includes/jobqueue/aggregator/JobQueueAggregatorRedis.php
includes/jobqueue/jobs/CategoryMembershipChangeJob.php [new file with mode: 0644]
includes/jobqueue/jobs/CdnPurgeJob.php [new file with mode: 0644]
includes/jobqueue/jobs/HTMLCacheUpdateJob.php
includes/jobqueue/jobs/RefreshLinksJob.php
includes/jobqueue/utils/BacklinkJobUtils.php
includes/libs/ObjectFactory.php
includes/libs/RunningStat.php [deleted file]
includes/libs/SamplingStatsdClient.php
includes/libs/StatusValue.php
includes/libs/StringUtils.php
includes/libs/Timing.php [new file with mode: 0644]
includes/libs/Xhprof.php
includes/libs/composer/ComposerInstalled.php [new file with mode: 0644]
includes/libs/objectcache/APCBagOStuff.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/HashBagOStuff.php
includes/libs/objectcache/IExpiringStore.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedClient.php [new file with mode: 0644]
includes/libs/objectcache/MemcachedPhpBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/MultiWriteBagOStuff.php [new file with mode: 0644]
includes/libs/objectcache/WANObjectCache.php
includes/logging/ImportLogFormatter.php [new file with mode: 0644]
includes/logging/LogEventsList.php
includes/mail/EmailNotification.php
includes/mail/UserMailer.php
includes/media/DjVu.php
includes/media/FormatMetadata.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/media/TransformationalImageHandler.php
includes/mime.types
includes/objectcache/MemcachedBagOStuff.php [deleted file]
includes/objectcache/MemcachedClient.php [deleted file]
includes/objectcache/MemcachedPeclBagOStuff.php
includes/objectcache/MemcachedPhpBagOStuff.php [deleted file]
includes/objectcache/MultiWriteBagOStuff.php [deleted file]
includes/objectcache/ObjectCache.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/objectcache/SqlBagOStuff.php
includes/page/Article.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/parser/CacheTime.php
includes/parser/CoreParserFunctions.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/ParserOutput.php
includes/parser/Preprocessor.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/password/MWSaltedPassword.php
includes/password/PasswordFactory.php
includes/password/PasswordPolicyChecks.php
includes/password/UserPasswordPolicy.php
includes/poolcounter/PoolWorkArticleView.php
includes/profiler/output/ProfilerOutputDb.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/DerivativeResourceLoaderContext.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderEditToolbarModule.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLanguageNamesModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserGroupsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelFileList.php
includes/revisiondelete/RevisionDeleter.php
includes/search/SearchExactMatchRescorer.php [new file with mode: 0644]
includes/search/SearchOracle.php
includes/search/SearchPostgres.php
includes/search/SearchResultSet.php
includes/site/Site.php
includes/site/SiteList.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/QueryPage.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllMessages.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCategories.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEditTags.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExport.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialImport.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListusers.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPageLanguage.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialPreferences.php
includes/specials/SpecialPrefixindex.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialProtectedtitles.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialSearch.php
includes/specials/SpecialStatistics.php
includes/specials/SpecialTags.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWatchlist.php
includes/specials/SpecialWhatlinkshere.php
includes/tidy/RaggettWrapper.php
includes/tidy/TidyDriverBase.php
includes/title/MediaWikiTitleCodec.php
includes/upload/UploadBase.php
includes/upload/UploadFromFile.php
includes/upload/UploadStash.php
includes/user/CentralIdLookup.php [new file with mode: 0644]
includes/user/LocalIdLookup.php [new file with mode: 0644]
includes/user/User.php [new file with mode: 0644]
includes/user/UserArray.php [new file with mode: 0644]
includes/user/UserArrayFromResult.php [new file with mode: 0644]
includes/user/UserRightsProxy.php [new file with mode: 0644]
includes/utils/FileContentsHasher.php
includes/utils/IP.php
includes/utils/MWCryptHKDF.php
includes/utils/MWCryptRand.php
includes/utils/UIDGenerator.php
includes/widget/TitleInputWidget.php
index.php
languages/Language.php
languages/classes/LanguageAz.php
languages/classes/LanguageKaa.php
languages/classes/LanguageKk.php
languages/classes/LanguageTr.php
languages/i18n/ady-cyrl.json
languages/i18n/af.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bn.json
languages/i18n/bo.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ceb.json
languages/i18n/ckb.json
languages/i18n/crh-cyrl.json
languages/i18n/cs.json
languages/i18n/cu.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frr.json
languages/i18n/fy.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/khw.json
languages/i18n/kiu.json
languages/i18n/kk-cyrl.json
languages/i18n/km.json
languages/i18n/kn.json
languages/i18n/ko.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lij.json
languages/i18n/lki.json [new file with mode: 0644]
languages/i18n/lmo.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/nah.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/olo.json
languages/i18n/or.json
languages/i18n/pam.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qu.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sc.json
languages/i18n/scn.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tl.json
languages/i18n/tr.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/tyv.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vec.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vmf.json
languages/i18n/war.json
languages/i18n/wo.json
languages/i18n/wuu.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesEn.php
languages/messages/MessagesKo.php
languages/messages/MessagesPa.php
load.php
maintenance/Doxyfile
maintenance/Maintenance.php
maintenance/README
maintenance/archives/patch-msg_resource.sql [deleted file]
maintenance/backupTextPass.inc
maintenance/benchmarks/bench_Wikimedia_base_convert.php [new file with mode: 0644]
maintenance/benchmarks/bench_wfBaseConvert.php [deleted file]
maintenance/benchmarks/benchmarkPurge.php
maintenance/cdb.php
maintenance/cleanupImages.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupTable.inc
maintenance/cleanupTitles.php
maintenance/clearCacheStats.php [deleted file]
maintenance/convertExtensionToRegistration.php
maintenance/createAndPromote.php
maintenance/createCommonPasswordCdb.php [new file with mode: 0644]
maintenance/findHooks.php
maintenance/findOrphanedFiles.php [new file with mode: 0644]
maintenance/fixDefaultJsonContentPages.php [new file with mode: 0644]
maintenance/importDump.php
maintenance/install.php
maintenance/jsduck/categories.json
maintenance/makeTestEdits.php [new file with mode: 0644]
maintenance/mcc.php
maintenance/mssql/tables.sql
maintenance/mwdoc-filter.php
maintenance/mwdocgen.php
maintenance/namespaceDupes.php
maintenance/oracle/archives/patch_16_17_schema_changes.sql
maintenance/oracle/tables.sql
maintenance/populateFilearchiveSha1.php
maintenance/postgres/archives/patch-msg_resource.sql [deleted file]
maintenance/postgres/archives/patch-msg_resource_links.sql [deleted file]
maintenance/postgres/tables.sql
maintenance/purgeChangedPages.php
maintenance/purgeList.php
maintenance/refreshLinks.php
maintenance/showCacheStats.php [deleted file]
maintenance/tables.sql
maintenance/updateSpecialPages.php
mw-config/config.js
mw-config/index.php
package.json
profileinfo.php
resources/Resources.php
resources/ResourcesOOUI.php
resources/lib/jquery.i18n/GPL-LICENSE
resources/lib/jquery.i18n/package.json
resources/lib/jquery.i18n/src/jquery.i18n.language.js
resources/lib/oojs-ui/i18n/bn.json
resources/lib/oojs-ui/i18n/bs.json
resources/lib/oojs-ui/i18n/ca.json
resources/lib/oojs-ui/i18n/cs.json
resources/lib/oojs-ui/i18n/fi.json
resources/lib/oojs-ui/i18n/hr.json
resources/lib/oojs-ui/i18n/hu.json
resources/lib/oojs-ui/i18n/hy.json
resources/lib/oojs-ui/i18n/jv.json
resources/lib/oojs-ui/i18n/lb.json
resources/lib/oojs-ui/i18n/lki.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/lt.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/pt-br.json
resources/lib/oojs-ui/i18n/pt.json
resources/lib/oojs-ui/i18n/sd.json [new file with mode: 0644]
resources/lib/oojs-ui/i18n/wuu.json
resources/lib/oojs-ui/oojs-ui-apex-noimages.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-mediawiki-noimages.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui.js
resources/lib/oojs-ui/themes/apex/icons-editing-advanced.json
resources/lib/oojs-ui/themes/apex/icons-interactions.json [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/icons-media.json [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/icons.json
resources/lib/oojs-ui/themes/apex/images/icons/add.png
resources/lib/oojs-ui/themes/apex/images/icons/add.svg
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/beta.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/beta.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clear.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clear.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clock.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/clock.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/heart.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/heart.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/image.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/image.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/insert.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/insert.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/key-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/noWikiText-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/noWikiText-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/noWikiText-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/noWikiText-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/picture.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/picture.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/remove.png [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/remove.svg [deleted file]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/search.png
resources/lib/oojs-ui/themes/apex/images/icons/search.svg
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/trash.png
resources/lib/oojs-ui/themes/apex/images/icons/trash.svg
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.svg
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png
resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.svg
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/apex/images/icons/wikiText.png
resources/lib/oojs-ui/themes/apex/images/icons/wikiText.svg
resources/lib/oojs-ui/themes/apex/images/indicators/search-ltr.svg
resources/lib/oojs-ui/themes/apex/images/indicators/search-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/icons-editing-advanced.json
resources/lib/oojs-ui/themes/mediawiki/icons-media.json
resources/lib/oojs-ui/themes/mediawiki/icons.json
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/add.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/add.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/insert-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/insert-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.png [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.svg [deleted file]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.png [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.svg [new file with mode: 0644]
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText-invert.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText.png
resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-ltr.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl-invert.svg
resources/lib/oojs-ui/themes/mediawiki/images/indicators/search-rtl.svg
resources/lib/oojs/oojs.jquery.js
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css
resources/src/mediawiki.legacy/commonPrint.css
resources/src/mediawiki.legacy/oldshared.css
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.WikitextMessagePoster.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/content.externallinks.css
resources/src/mediawiki.special/mediawiki.special.changeemail.css [deleted file]
resources/src/mediawiki.special/mediawiki.special.changeemail.js [deleted file]
resources/src/mediawiki.special/mediawiki.special.changeslist.visitedstatus.js [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.css
resources/src/mediawiki.special/mediawiki.special.preferences.css [deleted file]
resources/src/mediawiki.special/mediawiki.special.preferences.js
resources/src/mediawiki.special/mediawiki.special.preferences.styles.css [new file with mode: 0644]
resources/src/mediawiki.special/mediawiki.special.search.css [changed mode: 0644->0755]
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.special/mediawiki.special.userlogin.common.css
resources/src/mediawiki.special/mediawiki.special.watchlist.js [new file with mode: 0644]
resources/src/mediawiki.ui/components/buttons.less
resources/src/mediawiki.ui/components/checkbox.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/radio.less
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js
resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less
resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js
resources/src/mediawiki/api.js
resources/src/mediawiki/api/messages.js [new file with mode: 0644]
resources/src/mediawiki/api/user.js [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option2/ccbysa.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option2/ccbysa.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option2/noderiv.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option2/noderiv.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option2/ownwork.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option2/ownwork.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option2/useful.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option2/useful.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/camera.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/camera.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/graphics.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/graphics.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/guide.html [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/search-ltr.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/search-ltr.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/search-rtl.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/search-rtl.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/website-ltr.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/website-ltr.svg [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/website-rtl.png [new file with mode: 0644]
resources/src/mediawiki/bookletlayout/option4/website-rtl.svg [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css [deleted file]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.less [new file with mode: 0644]
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.Dialog.js
resources/src/mediawiki/mediawiki.Upload.js
resources/src/mediawiki/mediawiki.Uri.js
resources/src/mediawiki/mediawiki.experiments.js
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.feedlink.css
resources/src/mediawiki/mediawiki.htmlform.css
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.notification.css
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.raggett.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.requestIdleCallback.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.toc.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.toc.print.css [new file with mode: 0644]
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/page/gallery.js
resources/src/mediawiki/page/image-pagination.js
resources/src/mediawiki/page/startup.js
resources/src/oojs-ui-local.js [new file with mode: 0644]
serialized/commonpasswords.cdb [new file with mode: 0644]
tests/TestsAutoLoader.php
tests/browser/environments.yml
tests/browser/features/support/env.rb
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/DiffHistoryBlobTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php [deleted file]
tests/phpunit/includes/GlobalFunctions/wfTimestampTest.php
tests/phpunit/includes/ImportTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/TemplateParserTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/UserArrayFromResultTest.php [deleted file]
tests/phpunit/includes/UserTest.php [deleted file]
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiResultTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/api/format/ApiFormatDbgTest.php [deleted file]
tests/phpunit/includes/api/format/ApiFormatTxtTest.php [deleted file]
tests/phpunit/includes/api/query/ApiQueryTest.php
tests/phpunit/includes/content/CssContentHandlerTest.php
tests/phpunit/includes/content/JavaScriptContentHandlerTest.php
tests/phpunit/includes/content/JavaScriptContentTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/db/ORMRowTest.php [deleted file]
tests/phpunit/includes/db/ORMTableTest.php [deleted file]
tests/phpunit/includes/db/TestORMRowTest.php [deleted file]
tests/phpunit/includes/deferred/CdnCacheUpdateTest.php [new file with mode: 0644]
tests/phpunit/includes/deferred/DeferredUpdatesTest.php
tests/phpunit/includes/deferred/LinksUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/MigrateFileRepoLayoutTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/RunningStatTest.php [deleted file]
tests/phpunit/includes/libs/TimingTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/BagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php [new file with mode: 0644]
tests/phpunit/includes/logging/ImportLogFormatterTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/BagOStuffTest.php [deleted file]
tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php [new file with mode: 0644]
tests/phpunit/includes/objectcache/MultiWriteBagOStuffTest.php [deleted file]
tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php [deleted file]
tests/phpunit/includes/objectcache/WANObjectCacheTest.php [deleted file]
tests/phpunit/includes/page/WikiPageTest.php
tests/phpunit/includes/parser/MediaWikiParserTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/resourceloader/DerivativeResourceLoaderContextTest.php
tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
tests/phpunit/includes/site/SiteListTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/user/CentralIdLookupTest.php [new file with mode: 0644]
tests/phpunit/includes/user/LocalIdLookupTest.php [new file with mode: 0644]
tests/phpunit/includes/user/UserArrayFromResultTest.php [new file with mode: 0644]
tests/phpunit/includes/user/UserTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/UIDGeneratorTest.php
tests/phpunit/languages/LanguageConverterTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/phpunit.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suite.xml
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.requestIdleCallback.test.js [new file with mode: 0644]
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/startup.test.js
thumb.php

diff --git a/.jscsrc b/.jscsrc
index c1fbc9a..3b94b90 100644 (file)
--- a/.jscsrc
+++ b/.jscsrc
@@ -7,7 +7,17 @@
        "disallowQuotedKeysInObjects": "allButReserved",
        "requireDotNotation": { "allExcept": [ "keywords" ] },
        "jsDoc": {
+               "checkAnnotations": {
+                       "preset": "jsduck5",
+                       "extra": {
+                               "context": true,
+                               "source": true,
+                               "see": true,
+                               "private": true
+                       }
+               },
                "checkParamNames": true,
+               "checkRedundantAccess": true,
                "checkRedundantReturns": true,
                "checkTypes": "strictNativeCase",
                "requireNewlineAfterDescription": true,
diff --git a/Gemfile b/Gemfile
index 392558c..ee09906 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,4 @@
-# ruby=ruby-2.1.2
-# ruby-gemset=core
-
 source 'https://rubygems.org'
 
-gem 'mediawiki_selenium', '~> 1.2.1'
-gem 'rubocop', require: false
+gem 'mediawiki_selenium', '~> 1.6.3'
+gem 'rubocop', '~> 0.32.1', require: false
index 3a695ef..4d0203a 100644 (file)
@@ -5,7 +5,7 @@ GEM
     astrolabe (1.3.0)
       parser (>= 2.2.0.pre.3, < 3.0)
     builder (3.2.2)
-    childprocess (0.5.6)
+    childprocess (0.5.8)
       ffi (~> 1.0, >= 1.0.11)
     cucumber (1.3.20)
       builder (>= 2.1.2)
@@ -13,15 +13,15 @@ GEM
       gherkin (~> 2.12)
       multi_json (>= 1.7.5, < 2.0)
       multi_test (>= 0.1.2)
-    data_magic (0.21)
+    data_magic (0.22)
       faker (>= 1.1.2)
-      yml_reader (>= 0.4)
+      yml_reader (>= 0.6)
     diff-lcs (1.2.5)
-    domain_name (0.5.24)
+    domain_name (0.5.25)
       unf (>= 0.0.5, < 1.0.0)
-    faker (1.4.3)
+    faker (1.6.1)
       i18n (~> 0.5)
-    faraday (0.9.1)
+    faraday (0.9.2)
       multipart-post (>= 1.2, < 3)
     faraday-cookie_jar (0.0.6)
       faraday (>= 0.7.4)
@@ -29,29 +29,30 @@ GEM
     ffi (1.9.10)
     gherkin (2.12.2)
       multi_json (~> 1.3)
-    headless (1.0.2)
+    headless (2.2.0)
     http-cookie (1.0.2)
       domain_name (~> 0.5)
     i18n (0.7.0)
     json (1.8.3)
-    mediawiki_api (0.4.1)
+    mediawiki_api (0.5.0)
       faraday (~> 0.9, >= 0.9.0)
       faraday-cookie_jar (~> 0.0, >= 0.0.6)
-    mediawiki_selenium (1.2.1)
-      cucumber (~> 1.3, >= 1.3.10)
-      headless (~> 1.0, >= 1.0.1)
+    mediawiki_selenium (1.6.3)
+      cucumber (~> 1.3, >= 1.3.20)
+      headless (~> 2.0, >= 2.1.0)
       json (~> 1.8, >= 1.8.1)
-      mediawiki_api (~> 0.2, >= 0.2.1)
+      mediawiki_api (~> 0.5, >= 0.5.0)
       page-object (~> 1.0)
       rest-client (~> 1.6, >= 1.6.7)
+      rspec-core (~> 2.14, >= 2.14.4)
       rspec-expectations (~> 2.14, >= 2.14.4)
       syntax (~> 1.2, >= 1.2.0)
       thor (~> 0.19, >= 0.19.1)
-    mime-types (2.6.1)
+    mime-types (2.99)
     multi_json (1.11.2)
     multi_test (0.1.2)
     multipart-post (2.0.0)
-    netrc (0.10.3)
+    netrc (0.11.0)
     page-object (1.1.0)
       page_navigation (>= 0.9)
       selenium-webdriver (>= 2.44.0)
@@ -66,6 +67,7 @@ GEM
       http-cookie (>= 1.0.2, < 2.0)
       mime-types (>= 1.16, < 3.0)
       netrc (~> 0.7)
+    rspec-core (2.99.2)
     rspec-expectations (2.99.2)
       diff-lcs (>= 1.1.3, < 2.0)
     rubocop (0.32.1)
@@ -76,7 +78,7 @@ GEM
       ruby-progressbar (~> 1.4)
     ruby-progressbar (1.7.5)
     rubyzip (1.1.7)
-    selenium-webdriver (2.46.2)
+    selenium-webdriver (2.48.1)
       childprocess (~> 0.5)
       multi_json (~> 1.0)
       rubyzip (~> 1.0)
@@ -86,17 +88,14 @@ GEM
     unf (0.1.4)
       unf_ext
     unf_ext (0.0.7.1)
-    watir-webdriver (0.8.0)
+    watir-webdriver (0.9.1)
       selenium-webdriver (>= 2.46.2)
     websocket (1.2.2)
-    yml_reader (0.5)
+    yml_reader (0.6)
 
 PLATFORMS
   ruby
 
 DEPENDENCIES
-  mediawiki_selenium (~> 1.2.1)
-  rubocop
-
-BUNDLED WITH
-   1.10.5
+  mediawiki_selenium (~> 1.6.3)
+  rubocop (~> 0.32.1)
diff --git a/HISTORY b/HISTORY
index 0c2b8ac..9cb5399 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,7 +1,304 @@
 Change notes from older releases. For current info see RELEASE-NOTES-1.27.
 
+== MediaWiki 1.26 ==
+
+=== Configuration changes in 1.26 ===
+* $wgPasswordResetRoutes['email'] = true by default.
+* $wgEnableParserCache was deprecated, set $wgParserCacheType to CACHE_NONE
+  instead if you want to disable the parser cache.
+* New-style continuation is now the default for API action=continue. Clients may
+  use the 'rawcontinue' parameter to receive raw query-continue data, but the
+  new style is encouraged as it's harder to implement incorrectly.
+* Deprecated API formats dump and wddx have been completely removed.
+* (T7645) The "Signature" button on the edit toolbar is now hidden by default
+  in non-talk namespaces. A new configuration variable,
+  $wgExtraSignatureNamespaces, controls in which subject (non-talk) namespaces
+  the "Signature" button on the edit toolbar will be displayed.
+* $wgResourceLoaderUseESI was deprecated and removed. This was an experimental
+  feature that was never enabled by default.
+* $wgResourceLoaderExperimentalAsyncLoading was deprecated and removed.
+  This experimental feature was never enabled by default and is obsolete as of
+  MediaWiki 1.26, in where ResourceLoader became fully asynchronous.
+* $wgMasterWaitTimeout was removed (deprecated in 1.24).
+* Fields in ParserOptions are now private. Use the accessors instead.
+* Custom LESS functions (defined via $wgResourceLoaderLESSFunctions or
+  in extension.json) have been removed, after being deprecated in 1.24.
+* $wgAlwaysUseTidy has been removed.
+* ResetSessionID hook has been removed. Nothing seems to use it.
+* Certain AuthPlugin methods are deprecated in favor of new hooks:
+** AuthPlugin::initUser() is replaced by LocalUserCreated.
+** AuthPlugin::updateUser() is replaced by UserLoggedIn.
+** AuthPlugin::updateExternalDB() is replaced by the existing UserSaveSettings.
+** AuthPlugin::updateExternalDBGroups() is replaced by UserGroupsChanged.
+** AuthPluginUser::isHidden() is replaced by UserIsHidden.
+** AuthPluginUser::isLocked() is replaced by UserIsLocked.
+* The UserRights hook is deprecated in favor of the new UserGroupsChanged hook.
+* AuthPlugin::initUser() and AuthPlugin::updateUser() should no longer replace
+  the passed User object.
+* $wgBlockAllowsUTEdit is now set to true by default. This allows
+  blocked users to edit their talk pages unless explicitly disabled
+  when they are being blocked.
+
+=== New features in 1.26 ===
+* (T51506) Now action=info gives estimates of actual watchers for a page.
+  See $wgRCMaxAge, $wgWatchersMaxAge and $wgUnwatchedPageSecret
+  to learn how to configure if needed.
+* Change tags can now be hidden in the interface by disabling the associated
+  "tag-<id>" interface message.
+* ':' (colon) is now invalid in usernames for new accounts. Existing accounts
+  are not affected.
+* Added a new hook, 'LogException', to log exceptions in nonstandard ways.
+* Revive the 'SpecialSearchResultsAppend' hook which occurs after the list of
+  search results are rendered. The initial use case is to append a "give us
+  feedback" link beneath the search results.
+* Added a new hook, 'RejectParserCacheValue', which allows extensions to
+  reject an otherwise-successful parser cache lookup. The intent is to allow
+  extensions to manage the eviction of archaic HTML output from the cache.
+* (T68699) The expiration of the UserID and Token login cookies
+  ($wgExtendedLoginCookieExpiration) can be configured independently of the
+  expiration of all other cookies ($wgCookieExpiration).
+* (T50519) Support for generating JPEG/PNG thumbnails from WebP images added
+  if ImageMagick is used as image scaler ($wgUseImageMagick = true). Uploading
+  of WebP images still disabled by default. Add $wgFileExtensions[] =
+  'webp'; to LocalSettings.php to enable uploading of WebP images.
+* Added new hooks 'EnhancedChangesListModifyLineData' &
+  'EnhancedChangesListModifyBlockLineData', to modify the data used to build
+  lines in enhanced recentchanges and watchlist.
+* Caches that need purging ability now use the WANObjectCache interface.
+  This corresponds to a new $wgMainWANCache setting, which defaults to using
+  the $wgMainCacheType settings.
+* Callers needing fast light-weight data stores use $wgMainStash to select
+  the store type from $wgObjectCaches. The default is the local database.
+* Interface message overrides in the MediaWiki namespace will now be cached in
+  memcached and APC (if available), rather than memcached and local files.
+* Added a new hook, 'RandomPageQuery', to allow modification of the query used
+  by Special:Random to select random pages.
+* $wgTransactionalTimeLimit was added, which controls the request time limit
+  for potentially slow POST requests that need to be as atomic as possible.
+* ResourceLoader now loads all scripts asynchronously. The top-queue and
+  startup modules are no longer synchronously loaded.
+* 'mediawiki.ui.button' styles are no longer unconditionally loaded on every
+  page. During the deprecation period, the styles will only be loaded on pages
+  which contain 'mw-ui-button' in their HTML. Starting in 1.28, the styles will
+  only be loaded if explicitly required.
+* If search returns zero results and current search engine has a "did you mean"
+  suggestion, results for suggestion will be shown. Can be disabled by setting
+  $wgSearchRunSuggestedQuery to false.
+* Added several JavaScript libraries for uploading files to MediaWiki
+  from the client-side. See documentation for mw.Upload and its
+  subclasses for more information.
+* Added OOUI dialogs and layout for file upload interfaces. See
+  documentation for mw.Upload.Dialog, mw.Upload.BookletLayout and its
+  subclasses for more information.
+
+== extension.json changes in 1.26 ==
+* (T99344) The extension.json schema is now versioned. All extensions
+  and skins should set a "manifest_version" property corresponding to
+  the schema version they were written for. The only supported version
+  currently is "1".
+* (T102523) The error message if a non-array attribute is set was improved.
+* (T107646) Configuration settings can now specify how they should be merged,
+  which is necessary for arrays using integer keys.
+* (T110389) Adding namespaces through extension.json now actually works
+* $wgNamespaceProtection can now be set in extension.json.
+* $wgCapitalLinkOverrides can now be set in extension.json.
+* (T97186) Extensions using a custom prefix for their configuration settings
+  can now set a "_prefix" key to override the default of "wg".
+* (T99084) Extensions can now specify what MediaWiki core versions they
+  depend upon.
+* (T105236) The extension.json schema now validates custom classes in
+  the "ResourceModules" property properly.
+
+=== External library changes in 1.26 ===
+==== Upgraded external libraries ====
+* Updated es5-shim from v4.0.0 to v4.1.5.
+* Updated json2 from revision 2014-02-04 to 2015-05-03.
+* Updated Sinon.JS from 1.10.3 to 1.15.4.
+* Updated jQuery Client from v1.0.0 to v2.0.0.
+* Updated QUnit from v1.17.1 to v1.18.0.
+* Updated liuggio/statsd-php-client from v1.0.12 to v1.0.16.
+* Updated oojs/oojs-ui from v0.11.3 to v0.12.12.
+* Updated wikimedia/cdb from v1.0.1 to v1.3.0.
+* Updated wikimedia/utfnormal from v1.0.2 to v1.0.3.
+* Updated wikimedia/composer-merge-plugin from v1.0.0 to v1.3.0.
+* Updated zordius/lightncandy from v0.18 to v0.21.
+
+==== New external libraries ====
+* Added composer/semver v1.0.0.
+* Added mediawiki/at-ease v1.1.0.
+* Added wikimedia/assert v0.2.2.
+* Added wikimedia/ip-set v1.0.1.
+* Added wikimedia/wrappedstring v2.0.0.
+
+==== Removed and replaced external libraries ====
+* Replaced leafo/lessphp v0.5.0 with oyejorge/less.php v1.7.0.9.
+
+=== Bug fixes in 1.26 ===
+* (T53283) load.php sometimes sends 304 response without full headers
+* (T65198) Talk page tabs now have a "rel=discussion" attribute
+* (T98841) {{msgnw:}} now preserves comments even when subst: is not used.
+* (T104142) $wgEmergencyContact and $wgPasswordSender now use their default
+  value if set to an empty string.
+
+=== Action API changes in 1.26 ===
+* New-style continuation is now the default for action=continue. Clients may
+  use the 'rawcontinue' parameter to receive raw query-continue data, but the
+  new style is encouraged as it's harder to implement incorrectly.
+* Deprecated API formats dump and wddx have been completely removed.
+* API action=query&list=tags: The displayname can now be boolean false if the
+  tag is meant to be hidden from user interfaces.
+* action=import no longer allows both the namespace= and rootpage= parameters
+  to be set. If they are both set, the value of rootpage= will be ignored.
+* prop=revision output in enum mode is now sorted by timestamp rather than
+  revision ID. This usually won't make any difference.
+* (T102645) Namespace list from meta=siteinfo&siprop=namespaces is now an array
+  with formatversion=2.
+* Various other output from meta=siteinfo will now always be arrays instead of
+  sometimes being numerically-indexed objects with formatversion=2.
+* When errors about users being blocked are returned, they now include
+  information about the relevant block.
+* (T99926) list=random has higher limits, in line with other API modules.
+* list=random's rnredirect parameter is deprecated in favor of a new
+  rnfilterredir parameter that also allows for listing both redirects and
+  non-redirects.
+* list=random now supports continuation.
+* API responses to GET requests may now include ETag and Last-Modified headers,
+  and will honor corresponding If-None-Match and If-Modified-Since on such
+  requests.
+
+=== Action API internal changes in 1.26 ===
+* New metadata item ApiResult::META_KVP_MERGE to allow for merging the KVP key
+  into the value when the value is an assoc.
+* API action modules may now provide values for the RFC 7232 ETag and
+  Last-Modified headers. The API will check these against If-None-Match and
+  If-Modified-Since request headers on GET requests and avoid executing the
+  module when appropriate.
+
+=== Languages updated in 1.26 ===
+
+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 Phabricator reports.
+
+* Languages added:
+** ase (American sign language), thanks to translator Icemandeaf
+** dty (डोटेली/Doteli), thanks to translators जनक राज भट्ट, बिप्लब आनन्द,
+   मेश सिंह बोहरा, and राम प्रसाद जोशी
+** luz (لئری دوٙمینی / Southern Luri)
+** olo (Livvinкarjala / Livvi-Karelian), thanks to translators Denö, Hiloin Natoi,
+   Ilja.mos, and Mashoi7
+
+=== Other changes in 1.26 ===
+* ChangeTags::tagDescription() will return false if the interface message
+  for the tag is disabled.
+* Added PageHistoryPager::doBatchLookups hook.
+* Added $wikiId parameter to FormatAutocomments hook.
+* Added ParserCacheSaveComplete to ParserCache
+* supportsDirectEditing and supportsDirectApiEditing methods added to
+  ContentHandler, to provide a way for ApiEditPage and EditPage to check
+  if direct editing of content is allowed. These methods return false,
+  by default for the ContentHandler base class and true for TextContentHandler
+  and it's derivative classes (everything in core). For Content types that
+  do not support direct editing, an alternative mechanism should be provided
+  for editing, such as action overrides or specific api modules.
+* mediaWiki.confirmCloseWindow now returns an object of functions, instead of
+  one function. The callback can't be called directly any more. The callback
+  function is replaced with confirmCloseWindow.release().
+* BREAKING CHANGE: Added an optional ResouceLoaderContext parameter to
+  ResourceLoaderModule::getDependencies(). Extension classes that override that
+  method should be updated. If they aren't updated, PHP Strict standards
+  warnings will appear when E_STRICT error reporting is enabled. Note: in the
+  near future, this parameter will probably become non-optional.
+* Removed maintenance script deleteImageMemcached.php.
+* MWFunction::newObj() was removed (deprecated in 1.25).
+  ObjectFactory::getObjectFromSpec() should be used instead.
+* The parser will no longer randomize the string it uses to mark the place of
+  items that were stripped during parsing. It will use a fixed string instead.
+  This causes the parser to re-use the regular expressions it uses to search
+  and replace markers rather than generate novel expressions on each parse.
+  Re-using regular expressions will improve performance on HHVM and the
+  forthcoming PHP 7. The interfaces changes accompanying this change are:
+  - Parser::getRandomString() and Parser::uniqPrefix() have been deprecated.
+  - The $uniq_prefix argument for Parser::extractTagsAndParams() and the
+    $prefix argument for StripState::_construct() are deprecated and their
+    value is ignored.
+* wfSuppressWarnings() and wfRestoreWarnings() were split into a separate library,
+  mediawiki/at-ease, and are now deprecated. Callers should use
+  MediaWiki\suppressWarnings() and MediaWiki\restoreWarnings() directly.
+* The Block class constructor now takes an associative array of parameters
+  instead of many optional positional arguments. Calling the constructor the old
+  way will issue a deprecation warning.
+* The jquery.mwExtension module was deprecated.
+* $wgSpecialPageGroups was removed (deprecated in 1.21).
+* SpecialPageFactory::setGroup was removed (deprecated in 1.21).
+* SpecialPageFactory::getGroup was removed (deprecated in 1.21).
+* DatabaseBase::ignoreErrors() is now protected.
+* BREAKING CHANGE: mediawiki.legacy.ajax has been removed, following
+  a lengthy deprecation period.
+* The ScopedPHPTimeout class was removed.
+* Removed maintenance script fixSlaveDesync.php.
+* Watchlist tokens, SpecialResetTokens, and User::getTokenFromOption()
+  are deprecated. Applications using those can work via the OAuth
+  extension instead. New tokens types should not be added.
+* DatabaseBase::errorCount() was removed (unused).
+* $wgDeferredUpdateList was removed.
+* DeferredUpdates::addHTMLCacheUpdate() was removed.
+
 == MediaWiki 1.25 ==
 
+== MediaWiki 1.25.3 ==
+
+This is a security and maintenance release of the MediaWiki 1.25 branch.
+
+=== Changes since 1.25.2 ===
+
+* (T98975) Fix having multiple callbacks for a single hook.
+* (T107632) maintenance/refreshLinks.php did not always remove all links
+  pointing to nonexistent pages.
+* (T104142) $wgEmergencyContact and $wgPasswordSender now use their default
+  value if set to an empty string.
+* (T62174) Provide fallbacks for use of mb_convert_encoding() in
+  HtmlFormatter. It was causing an error when accessing the api help page
+  if the mbstring PHP extension was not installed.
+* (T105896) Confirmation emails would sometimes contain invalid codes.
+* (T105597) Fixed edit stash inclusion queries.
+* (T91850) SECURITY: Add throttle check in ApiUpload and SpecialUpload
+* (T91203, T91205) SECURITY: API: Improve validation in chunked uploading
+* (T95589) SECURITY: RevDel: Check all revisions for suppression, not just the
+  first
+* (T108616) SECURITY: Avoid exposure of local path in PNG thumbnails
+
+== MediaWiki 1.25.2 ==
+
+This is a security and maintenance release of the MediaWiki 1.25 branch.
+
+=== Changes since 1.25.1 ===
+
+* (T94116) SECURITY: Compare API watchlist token in constant time
+* (T97391) SECURITY: Escape error message strings in thumb.php
+* (T106893) SECURITY: Don't leak autoblocked IP addresses on
+  Special:DeletedContributions
+* (T102562) Fix InstantCommons parameters to handle the new HTTPS-only
+  policy of Wikimedia Commons.
+* (T100767) Setting a configuration setting for skin or extension to
+  false in LocalSettings.php was not working.
+* (T100635) API action=opensearch json output no longer breaks when
+  $wgDebugToolbar is enabled.
+* (T102522) Using an extension.json or skin.json file which has
+  a "manifest_version" property for 1.26 compatability will no longer
+  trigger warnings.
+* (T86156) Running updateSearchIndex.php will not throw an error as
+  page_restrictions has been added to the locked table list.
+* Special:Version would throw notices if using SVN due to an incorrectly
+  named variable. Add an additional check that an index is defined.
+
+== MediaWiki 1.25.1 ==
+
+This is a bug fix release of the MediaWiki 1.25 branch.
+
+=== Changes since 1.25 ===
+* (T100351) Fix syntax errors in extension.json of ConfirmEdit extension
+
 === Configuration changes in 1.25 ===
 * $wgPageShowWatchingUsers was removed.
 * $wgLocalVirtualHosts has been added to replace $wgConf->localVHosts.
@@ -548,6 +845,76 @@ For notes on 1.24.x and older releases, see HISTORY.
 
 == MediaWiki 1.24 ==
 
+== MediaWiki 1.24.4 ==
+
+This is a security and maintenance release of the MediaWiki 1.24 branch.
+
+== Changes since 1.24.3 ==
+
+* (T91653) Minimal PSR-3 debug logger to support backports from 1.25+.
+* (T68650) Fix indexing of moved pages with PostgreSQL. Requires running
+  update.php to fix.
+* (T91850) SECURITY: Add throttle check in ApiUpload and SpecialUpload
+* (T91203, T91205) SECURITY: API: Improve validation in chunked uploading
+* (T95589) SECURITY: RevDel: Check all revisions for suppression, not just the
+  first
+* (T108616) SECURITY: Avoid exposure of local path in PNG thumbnails
+
+== MediaWiki 1.24.3 ==
+
+This is a security and maintenance release of the MediaWiki 1.24 branch.
+
+== Changes since 1.24.2 ==
+
+* (T94116) SECURITY: Compare API watchlist token in constant time
+* (T97391) SECURITY: Escape error message strings in thumb.php
+* (T106893) SECURITY: Don't leak autoblocked IP addresses on
+  Special:DeletedContributions
+* Update jQuery from v1.11.2 to v1.11.3.
+* (T102562) Fix InstantCommons parameters to handle the new HTTPS-only
+  policy of Wikimedia Commons.
+
+== MediaWiki 1.24.2 ==
+
+This is a security and maintenance release of the MediaWiki 1.24 branch.
+
+== Changes since 1.24.1 ==
+
+* (T85848, T71210) SECURITY: Don't parse XMP blocks that contain XML entities,
+  to prevent various DoS attacks.
+* (T85848) SECURITY: Don't allow directly calling Xml::isWellFormed, to reduce
+  likelihood of DoS.
+* (T88310) SECURITY: Always expand xml entities when checking SVG's.
+* (T73394) SECURITY: Escape > in Html::expandAttributes to prevent XSS.
+* (T85855) SECURITY: Don't execute another user's CSS or JS on preview.
+* (T64685) SECURITY: Allow setting maximal password length to prevent DoS when
+  using PBKDF2.
+* (T85349, T85850, T86711) SECURITY: Multiple issues fixed in SVG filtering to
+  prevent XSS and protect viewer's privacy.
+* Fix case of SpecialAllPages/SpecialAllMessages in SpecialPageFactory to fix
+  loading these special pages when $wgAutoloadAttemptLowercase is false.
+* (bug T70087) Fix Special:ActiveUsers page for installations using
+  PostgreSQL.
+* (bug T76254) Fix deleting of pages with PostgreSQL. Requires a schema change
+  and running update.php to fix.
+
+== MediaWiki 1.24.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.24 branch.
+
+== Changes since 1.24.0 ==
+
+* (bug T76686) [SECURITY] thumb.php outputs wikitext message as raw HTML, which
+  could lead to xss. Permission to edit MediaWiki namespace is required to
+  exploit this.
+* (bug T77028) [SECURITY] Malicious site can bypass CORS restrictions in
+  $wgCrossSiteAJAXdomains in API calls if it only included an allowed domain as
+  part of its name.
+* (bug T74222) The original patch for T74222 was reverted as unnecessary.
+* Fixed a couple of entries in RELEASE-NOTES-1.24.
+* (bug T76168) OutputPage: Add accessors for some protected properties.
+* (bug T74834) Make 1.24 branch directly installable under PostgreSQL.
+
 === Configuration changes in 1.24 ===
 * MediaWiki will no longer run if register_globals is enabled. It has been
   deprecated for 5 years now, and was removed in PHP 5.4. For more information
@@ -1243,6 +1610,174 @@ of files that are no longer available follows.
 
 == MediaWiki 1.23 ==
 
+== MediaWiki 1.23.11 ==
+
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+== Changes since 1.23.10 ==
+
+* (T91850) SECURITY: Add throttle check in ApiUpload and SpecialUpload
+* (T91203, T91205) SECURITY: API: Improve validation in chunked uploading
+* (T108616) SECURITY: Avoid exposure of local path in PNG thumbnails
+
+== MediaWiki 1.23.10 ==
+
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+== Changes since 1.23.9 ==
+
+* (T94116) SECURITY: Compare API watchlist token in constant time
+* (T97391) SECURITY: Escape error message strings in thumb.php
+* (T106893) SECURITY: Don't leak autoblocked IP addresses on
+  Special:DeletedContributions
+* (bug 67644) Make AutoLoaderTest handle namespaces
+* (T91653) Minimal PSR-3 debug logger to support backports from 1.25+.
+* (T102562) Fix InstantCommons parameters to handle the new HTTPS-only
+  policy of Wikimedia Commons.
+
+== MediaWiki 1.23.9 ==
+
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+== Changes since 1.23.8 ==
+
+* (T85848, T71210) SECURITY: Don't parse XMP blocks that contain XML entities,
+  to prevent various DoS attacks.
+* (T85848) SECURITY: Don't allow directly calling Xml::isWellFormed, to reduce
+  likelihood of DoS.
+* (T88310) SECURITY: Always expand xml entities when checking SVG's.
+* (T73394) SECURITY: Escape > in Html::expandAttributes to prevent XSS.
+* (T85855) SECURITY: Don't execute another user's CSS or JS on preview.
+* (T85349, T85850, T86711) SECURITY: Multiple issues fixed in SVG filtering to
+  prevent XSS and protect viewer's privacy.
+* (bug T68650) Fix indexing of moved pages with PostgreSQL. Requires running
+  update.php to fix.
+* (bug T70087) Fix Special:ActiveUsers page for installations using 
+  PostgreSQL.
+
+== MediaWiki 1.23.8 ==
+
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+== Changes since 1.23.7 ==
+
+* (bug T76686) [SECURITY] thumb.php outputs wikitext message as raw HTML, which
+  could lead to xss. Permission to edit MediaWiki namespace is required to
+  exploit this.
+* (bug T77028) [SECURITY] Malicious site can bypass CORS restrictions in
+  $wgCrossSiteAJAXdomains in API calls if it only included an allowed domain as
+  part of its name.
+* (bug T74222) The original patch for T74222 was reverted as unnecessary.
+
+== MediaWiki 1.23.7 ==
+
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+== Changes since 1.23.6 ==
+
+* (bugs 66776, 71478) SECURITY:  User PleaseStand reported a way to inject code
+  into API clients that used format=php to process pages that underwent flash
+  policy mangling. This was fixed along with improving how the mangling was done
+  for format=json, and allowing sites to disable the mangling using
+  $wgMangleFlashPolicy.
+* (bug 70901) SECURITY: User Jackmcbarn reported that the ability to update
+  the content model for a page could allow an unprivileged attacker to edit
+  another user's common.js under certain circumstances. The user right
+  "editcontentmodel" was added, and is needed to change a revision's content
+  model.
+* (bug 71111) SECURITY: User PleaseStand reported that on wikis that allow raw
+  HTML, it is not safe to preview wikitext coming from an untrusted source such
+  as a cross-site request. Thus add an edit token to the form, and when raw HTML
+  is allowed, ensure the token is provided before showing the preview. This
+  check is not performed on wikis that both allow raw HTML and anonymous
+  editing, since there are easier ways to exploit that scenario.
+* (bug 72222) SECURITY: Do not show log action when the entry is revdeleted with
+  DELETED_ACTION. NOTICE: this may be reverted in a future release pending a
+  public RFC about the desired functionality. This issue was reported by user
+  Bawolff.
+* (bug 71621) Make allowing site-wide styles on restricted special pages a
+  config option.
+* (bug 42723) Added updated version history from 1.19.2 to 1.22.13
+* $wgMangleFlashPolicy was added to make MediaWiki's mangling of anything that
+  might be a flash policy directive configurable.
+
+== MediaWiki 1.23.6 ==
+
+This is a maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.5 ===
+* (Bug 72274) Job queue not running (HTTP 411) due to missing
+  Content-Length: header
+* (Bug 67440) Allow classes to be registered properly from installer
+
+== MediaWiki 1.23.5 ==
+
+This is a security release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.4 ===
+* (bug 70672) SECURITY: OutputPage: Remove separation of css and js module
+  allowance.
+
+== MediaWiki 1.23.4 ==
+
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.3 ===
+
+* (bug 69008) SECURITY: Enhance CSS filtering in SVG files. Filter <style>
+  elements; normalize style elements and attributes before filtering; add
+  checks for attributes that contain css; add unit tests for html5sec and
+  reported bugs.
+* (bug 65998) Make MySQLi work with non-standard socket.
+* (bug 66986) GlobalVarConfig shouldn't throw exceptions for null-valued config
+  settings.
+
+== MediaWiki 1.23.3 ==
+
+This is a maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.2 ===
+
+* (bug 68501) Correctly handle incorrect namespace in cleanupTitles.php.
+* (bug 64970) Fix support for blobs on DatabaseOracle::update.
+* (bug 66574) Display MediaWiki:Loginprompt on the login page.
+* (bug 67870) wfShellExec() cuts off stdout at multiples of 8192 bytes.
+* (bug 60629) Handle invalid language code gracefully in
+  Language::fetchLanguageNames.
+* (bug 62017) Restore the number of rows shown on Special:Watchlist.
+* Check for boolean false result from database query in SqlBagOStuff.
+
+== MediaWiki 1.23.2 ==
+
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.1 ===
+
+* (bug 68187) SECURITY: Prepend jsonp callback with comment.
+* (bug 66608) SECURITY: Fix for XSS issue in bug 66608: Generate the URL used
+  for loading a new page in Javascript,instead of relying on the URL in the link
+  that has been clicked.
+* (bug 65778) SECURITY: Copy prevent-clickjacking between OutputPage and
+  ParserOutput.
+* (bug 68313) Preferences: Turn stubthreshold back into a combo box.
+* (bug 65214) Fix initSiteStats.php maintenance script.
+* (bug 67594) Special:ActiveUsers: Fix to work with PostgreSQL.
+
+== MediaWiki 1.23.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.23 branch.
+
+=== Changes since 1.23.0 ===
+
+* (bug 65839) SECURITY: Prevent external resources in SVG files.
+* (bug 67025) Special:Watchlist: Don't try to render empty row.
+* (bug 66922) Don't allow some E_NOTICE messages to end up in the LocalSettings.php.
+* (bug 66467) FileBackend: Avoid using popen() when "parallelize" is disabled.
+* (bug 66428) MimeMagic: Don't seek before BOF. This has weird side effects
+  like only extracting the tail of the file partially or not at all.
+* (bug 66182) Removed -x flag on some php files.
+
+
 === Configuration changes in 1.23 ===
 * (bug 13250) Restored method for clearing a watchlist in web UI
   so that users with large watchlists don't have to perform
@@ -1712,6 +2247,44 @@ changes to languages because of Bugzilla reports.
 
 == MediaWiki 1.22 ==
 
+== MediaWiki 1.22.15 ==
+
+This is a security and maintenance release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.14 ===
+
+* (bug T76686) [SECURITY] thumb.php outputs wikitext message as raw HTML, which
+  could lead to xss. Permission to edit MediaWiki namespace is required to
+  exploit this.
+* (bug T77028) [SECURITY] Malicious site can bypass CORS restrictions in
+  $wgCrossSiteAJAXdomains in API calls if it only included an allowed domain as
+  part of its name.
+* (bug T74222) The original patch for T74222 was reverted as unnecessary.
+
+== MediaWiki 1.22.14 ==
+
+This is a security and maintenance release of the MediaWiki 1.22 branch.
+
+=== Changes since 1.22.13 ===
+
+* (bugs 66776, 71478) SECURITY:  User PleaseStand reported a way to inject code
+  into API clients that used format=php to process pages that underwent flash
+  policy mangling. This was fixed along with improving how the mangling was done
+  for format=json, and allowing sites to disable the mangling using
+  $wgMangleFlashPolicy.
+* (bug 70901) SECURITY: User Jackmcbarn reported that the ability to update
+  the content model for a page could allow an unprivileged attacker to edit
+  another user's common.js under certain circumstances. The user right
+  "editcontentmodel" was added, and is needed to change a revision's content
+  model.
+* (bug 72222) SECURITY: Do not show log action when the entry is revdeleted with
+  DELETED_ACTION. NOTICE: this may be reverted in a future release pending a
+  public RFC about the desired functionality. This issue was reported by user
+  Bawolff.
+* (bug 71621) Make allowing site-wide styles on restricted special pages a
+  config option.
+* $wgMangleFlashPolicy was added to make MediaWiki's mangling of anything that
+  might be a flash policy directive configurable.
 
 == MediaWiki 1.22.13 ==
 This is a maintenance release of the MediaWiki 1.22 branch.
diff --git a/RELEASE-NOTES-1.26 b/RELEASE-NOTES-1.26
deleted file mode 100644 (file)
index 53d9188..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-Security reminder: If you have PHP's register_globals option set, you must
-turn it off. MediaWiki will not work with it enabled.
-
-== MediaWiki 1.26 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.26 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== Configuration changes in 1.26 ===
-* $wgPasswordResetRoutes['email'] = true by default.
-* $wgEnableParserCache was deprecated, set $wgParserCacheType to CACHE_NONE
-  instead if you want to disable the parser cache.
-* New-style continuation is now the default for API action=continue. Clients may
-  use the 'rawcontinue' parameter to receive raw query-continue data, but the
-  new style is encouraged as it's harder to implement incorrectly.
-* Deprecated API formats dump and wddx have been completely removed.
-* (T7645) The "Signature" button on the edit toolbar is now hidden by default
-  in non-talk namespaces. A new configuration variable,
-  $wgExtraSignatureNamespaces, controls in which subject (non-talk) namespaces
-  the "Signature" button on the edit toolbar will be displayed.
-* $wgResourceLoaderUseESI was deprecated and removed. This was an experimental
-  feature that was never enabled by default.
-* $wgResourceLoaderExperimentalAsyncLoading was deprecated and removed.
-  This experimental feature was never enabled by default and is obsolete as of
-  MediaWiki 1.26, in where ResourceLoader became fully asynchronous.
-* $wgMasterWaitTimeout was removed (deprecated in 1.24).
-* Fields in ParserOptions are now private. Use the accessors instead.
-* Custom LESS functions (defined via $wgResourceLoaderLESSFunctions)
-  have been removed, after being deprecated in 1.24.
-* $wgAlwaysUseTidy has been removed.
-* ResetSessionID hook has been removed. Nothing seems to use it.
-* Certain AuthPlugin methods are deprecated in favor of new hooks:
-** AuthPlugin::initUser() is replaced by LocalUserCreated.
-** AuthPlugin::updateUser() is replaced by UserLoggedIn.
-** AuthPlugin::updateExternalDB() is replaced by the existing UserSaveSettings.
-** AuthPlugin::updateExternalDBGroups() is replaced by UserGroupsChanged.
-** AuthPluginUser::isHidden() is replaced by UserIsHidden.
-** AuthPluginUser::isLocked() is replaced by UserIsLocked.
-* The UserRights hook is deprecated in favor of the new UserGroupsChanged hook.
-* AuthPlugin::initUser() and AuthPlugin::updateUser() should no longer replace
-  the passed User object.
-* $wgBlockAllowsUTEdit is now set to true by default. This allows
-  blocked users to edit their talk pages unless explicitly disabled
-  when they are being blocked.
-* CLDRPluralRule* classes have been replaced with wikimedia/cldr-plural-rule-parser.
-
-=== New features in 1.26 ===
-* (T51506) Now action=info gives estimates of actual watchers for a page.
-  See $wgRCMaxAge, $wgWatchersMaxAge and $wgUnwatchedPageSecret
-  to learn how to configure if needed.
-* Change tags can now be hidden in the interface by disabling the associated
-  "tag-<id>" interface message.
-* ':' (colon) is now invalid in usernames for new accounts. Existing accounts
-  are not affected.
-* Added a new hook, 'LogException', to log exceptions in nonstandard ways.
-* Revive the 'SpecialSearchResultsAppend' hook which occurs after the list of
-  search results are rendered. The initial use case is to append a "give us
-  feedback" link beneath the search results.
-* Added a new hook, 'RejectParserCacheValue', which allows extensions to
-  reject an otherwise-successful parser cache lookup. The intent is to allow
-  extensions to manage the eviction of archaic HTML output from the cache.
-* (T68699) The expiration of the UserID and Token login cookies
-  ($wgExtendedLoginCookieExpiration) can be configured independently of the
-  expiration of all other cookies ($wgCookieExpiration).
-* (T50519) Support for generating JPEG/PNG thumbnails from WebP images added
-  if ImageMagick is used as image scaler ($wgUseImageMagick = true). Uploading
-  of WebP images still disabled by default. Add $wgFileExtensions[] =
-  'webp'; to LocalSettings.php to enable uploading of WebP images.
-* Added new hooks 'EnhancedChangesListModifyLineData' &
-  'EnhancedChangesListModifyBlockLineData', to modify the data used to build
-  lines in enhanced recentchanges and watchlist.
-* Caches that need purging ability now use the WANObjectCache interface.
-  This corresponds to a new $wgMainWANCache setting, which defaults to using
-  the $wgMainCacheType settings.
-* Added MWTimestamp::getTimezoneString() which returns the localized timezone
-  string, if available. To localize this string, see the comments of
-  $wgLocaltimezone in includes/DefaultSettings.php.
-* Callers needing fast light-weight data stores use $wgMainStash to select
-  the store type from $wgObjectCaches. The default is the local database.
-* Interface message overrides in the MediaWiki namespace will now be cached in
-  memcached and APC (if available), rather than memcached and local files.
-* Added a new hook, 'RandomPageQuery', to allow modification of the query used
-  by Special:Random to select random pages.
-* $wgTransactionalTimeLimit was added, which controls the request time limit
-  for potentially slow POST requests that need to be as atomic as possible.
-* ResourceLoader now loads all scripts asynchronously. The top-queue and
-  startup modules are no longer synchronously loaded.
-* 'mediawiki.ui.button' styles are no longer unconditionally loaded on every
-  page. During the deprecation period, the styles will only be loaded on pages
-  which contain 'mw-ui-button' in their HTML. Starting in 1.28, the styles will
-  only be loaded if explicitly required.
-* If search returns zero results and current search engine has a "did you mean"
-  suggestion, results for suggestion will be shown. Can be disabled by setting
-  $wgSearchRunSuggestedQuery to false.
-* Added several JavaScript libraries for uploading files to MediaWiki
-  from the client-side. See documentation for mw.Upload and its
-  subclasses for more information.
-* Added OOUI dialogs and layout for file upload interfaces. See
-  documentation for mw.Upload.Dialog, mw.Upload.BookletLayout and its
-  subclasses for more information.
-
-== External libraries ==
-=== Upgraded external libraries ===
-* Updated es5-shim from v4.0.0 to v4.1.5.
-* Updated json2 from revision 2014-02-04 to 2015-05-03.
-* Updated Sinon.JS from 1.10.3 to 1.15.4.
-* Updated jQuery Client from v1.0.0 to v2.0.0.
-* Updated QUnit from v1.17.1 to v1.18.0.
-* Updated liuggio/statsd-php-client from v1.0.12 to v1.0.16
-* Updated oojs/oojs-ui from v0.9.8 to v0.12.9.
-* Updated wikimedia/utfnormal from v1.0.2 to v1.0.3
-* Updated wikimedia/composer-merge-plugin from v1.0.0 to v1.2.1.
-* Updated zordius/lightncandy from v0.18 to v0.21.
-
-=== New external libraries ===
-* Added composer/semver v0.1.0.
-* Added mediawiki/at-ease v1.1.0.
-* Added wikimedia/assert v0.2.2.
-* Added wikimedia/cldr-plural-rule-parser v1.0.0
-* Added wikimedia/ip-set v1.0.1.
-* Added wikimedia/wrappedstring v2.0.0.
-
-=== Removed and replaced external libraries ===
-* Replaced leafo/lessphp v0.5.0 with oyejorge/less.php: v1.7.0.8
-
-=== Bug fixes in 1.26 ===
-* (T53283) load.php sometimes sends 304 response without full headers
-* (T65198) Talk page tabs now have a "rel=discussion" attribute
-* (T98841) {{msgnw:}} now preserves comments even when subst: is not used.
-* (T104142) $wgEmergencyContact and $wgPasswordSender now use their default
-  value if set to an empty string.
-
-=== Action API changes in 1.26 ===
-* New-style continuation is now the default for action=continue. Clients may
-  use the 'rawcontinue' parameter to receive raw query-continue data, but the
-  new style is encouraged as it's harder to implement incorrectly.
-* Deprecated API formats dump and wddx have been completely removed.
-* API action=query&list=tags: The displayname can now be boolean false if the
-  tag is meant to be hidden from user interfaces.
-* action=import no longer allows both the namespace= and rootpage= parameters
-  to be set. If they are both set, the value of rootpage= will be ignored.
-* prop=revision output in enum mode is now sorted by timestamp rather than
-  revision ID. This usually won't make any difference.
-* (T102645) Namespace list from meta=siteinfo&siprop=namespaces is now an array
-  with formatversion=2.
-* Various other output from meta=siteinfo will now always be arrays instead of
-  sometimes being numerically-indexed objects with formatversion=2.
-* When errors about users being blocked are returned, they now include
-  information about the relevant block.
-* (T99926) list=random has higher limits, in line with other API modules.
-* list=random's rnredirect parameter is deprecated in favor of a new
-  rnfilterredir parameter that also allows for listing both redirects and
-  non-redirects.
-* list=random now supports continuation.
-* API responses to GET requests may now include ETag and Last-Modified headers,
-  and will honor corresponding If-None-Match and If-Modified-Since on such
-  requests.
-* (T47988) The protect log event details now use new-style formatting.
-
-=== Action API internal changes in 1.26 ===
-* New metadata item ApiResult::META_KVP_MERGE to allow for merging the KVP key
-  into the value when the value is an assoc.
-* API action modules may now provide values for the RFC 7232 ETag and
-  Last-Modified headers. The API will check these against If-None-Match and
-  If-Modified-Since request headers on GET requests and avoid executing the
-  module when appropriate.
-
-=== Languages updated in 1.26 ===
-
-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 Phabricator reports.
-
-* Languages added:
-** ase (American sign language), thanks to translator Icemandeaf
-** dty (डोटेली/Doteli), thanks to translators जनक राज भट्ट, बिप्लब आनन्द,
-   मेश सिंह बोहरा, and राम प्रसाद जोशी
-** luz (لئری دوٙمینی / Southern Luri)
-** olo (Livvinкarjala / Livvi-Karelian), thanks to translators Denö, Hiloin Natoi,
-   Ilja.mos, and Mashoi7
-
-=== Other changes in 1.26 ===
-* ChangeTags::tagDescription() will return false if the interface message
-  for the tag is disabled.
-* Added PageHistoryPager::doBatchLookups hook.
-* Added $wikiId parameter to FormatAutocomments hook.
-* Added ParserCacheSaveComplete to ParserCache
-* supportsDirectEditing and supportsDirectApiEditing methods added to
-  ContentHandler, to provide a way for ApiEditPage and EditPage to check
-  if direct editing of content is allowed. These methods return false,
-  by default for the ContentHandler base class and true for TextContentHandler
-  and it's derivative classes (everything in core). For Content types that
-  do not support direct editing, an alternative mechanism should be provided
-  for editing, such as action overrides or specific api modules.
-* mediaWiki.confirmCloseWindow now returns an object of functions, instead of
-  one function. The callback can't be called directly any more. The callback
-  function is replaced with confirmCloseWindow.release().
-* BREAKING CHANGE: Added an optional ResouceLoaderContext parameter to
-  ResourceLoaderModule::getDependencies(). Extension classes that override that
-  method should be updated. If they aren't updated, PHP Strict standards
-  warnings will appear when E_STRICT error reporting is enabled. Note: in the
-  near future, this parameter will probably become non-optional.
-* Removed maintenance script deleteImageMemcached.php.
-* MWFunction::newObj() was removed (deprecated in 1.25).
-  ObjectFactory::getObjectFromSpec() should be used instead.
-* The parser will no longer randomize the string it uses to mark the place of
-  items that were stripped during parsing. It will use a fixed string instead.
-  This causes the parser to re-use the regular expressions it uses to search
-  and replace markers rather than generate novel expressions on each parse.
-  Re-using regular expressions will improve performance on HHVM and the
-  forthcoming PHP 7. The interfaces changes accompanying this change are:
-  - Parser::getRandomString() and Parser::uniqPrefix() have been deprecated.
-  - The $uniq_prefix argument for Parser::extractTagsAndParams() and the
-    $prefix argument for StripState::_construct() are deprecated and their
-    value is ignored.
-* wfSuppressWarnings() and wfRestoreWarnings() were split into a separate library,
-  mediawiki/at-ease, and are now deprecated. Callers should use
-  MediaWiki\suppressWarnings() and MediaWiki\restoreWarnings() directly.
-* The Block class constructor now takes an associative array of parameters
-  instead of many optional positional arguments. Calling the constructor the old
-  way will issue a deprecation warning.
-* The jquery.mwExtension module was deprecated.
-* $wgSpecialPageGroups was removed (deprecated in 1.21).
-* SpecialPageFactory::setGroup was removed (deprecated in 1.21).
-* SpecialPageFactory::getGroup was removed (deprecated in 1.21).
-* DatabaseBase::ignoreErrors() is now protected.
-* BREAKING CHANGE: mediawiki.legacy.ajax has been removed, following
-  a lengthy deprecation period.
-* The ScopedPHPTimeout class was removed.
-* Removed maintenance script fixSlaveDesync.php.
-* Watchlist tokens, SpecialResetTokens, and User::getTokenFromOption()
-  are deprecated. Applications using those can work via the OAuth
-  extension instead. New tokens types should not be added.
-* (T36948) The default file revert message's timestamp is now in $wgLocaltimezone,
-  instead of UTC.
-* DatabaseBase::errorCount() was removed (unused).
-* $wgDeferredUpdateList was removed.
-* DeferredUpdates::addHTMLCacheUpdate() was removed.
-* The default name of the 'suppress' group page has been changed from
-  'Project:Oversight' to 'Project:Suppress'.
-* (T84937) Free external links ("autolinked" urls) will now be terminated
-  by &nbsp; and HTML entity encodings of &nbsp, <, and >.
-* DatabaseBase::resultObject() is now protected (use outside Database classes
-  not necessary since 1.11).
-* Calling ResourceLoaderFileModule::readStyleFiles() without a
-  ResourceLoaderContext instance is deprecated.
-* ResourceLoader::getLessCompiler() now takes an optional parameter of
-  additional LESS variables to set for the compiler.
-
-== Compatibility ==
-
-MediaWiki 1.26 requires PHP 5.3.3 or later. There is experimental support for
-HHVM 3.3.0.
-
-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
-Oracle and Microsoft SQL Server.
-
-The supported versions are:
-
-* MySQL 5.0.3 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-* Microsoft SQL Server 2005 (9.00.1399)
-
-== Upgrading ==
-
-1.26 has several database changes since 1.25, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-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, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.25.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 f8293b9..ef14ada 100644 (file)
@@ -45,6 +45,22 @@ production.
    creation of passwordless "system" users for logged actions.
 * $wgMaxSquidPurgeTitles was removed.
 * $wgAjaxWatch was removed. This is now enabled by default.
+* $wgUseInstantCommons now hotlinks Commons images by default instead of
+  downloading originals and thumbnailing them locally. This allows wikis to save
+  on CPU and bandwidth while reducing time to first byte for pages, even without
+  a thumbnail handler. See $wgForeignFileRepos documentation for tweaks.
+* (T27397) WebP is enabled by default as an uploadable filetype.
+* (T48998) $wgArticlePath must now be either a full url, or start with a "/".
+* $wgRateLimitLog was removed; use $wgDebugLogGroups['ratelimit'] instead.
+* Deprecated API formats dbg, txt, and yaml have been removed.
+* CLDRPluralRule* classes have been replaced with wikimedia/cldr-plural-rule-parser.
+* Removed $wgProfilePerHost, $wgUDPProfilerHost, $wgUDPProfilerPort,
+  $wgUDPProfilerFormatString, $wgStatsMethod, $wgAggregateStatsID, $wgStatsFormatString,
+  and $wgProfileCallTree (deprecated since 1.20).
+* For proper operation of LocalIdLookup with shared user tables, ensure that
+  $wgSharedDB and $wgSharedTables are properly set even on the "central" wiki
+  that all others are sharing from and that $wgLocalDatabases is set to the
+  full list of sharing wikis on all those wikis.
 
 === New features in 1.27 ===
 * $wgDataCenterId and $wgDataCenterRoles where added, which will serve as
@@ -63,10 +79,44 @@ production.
   setting in the relevant section of $wgLBFactoryConf.
 * User::newSystemUser() may be used to simplify the creation of passwordless
   "system" users for logged actions from scripts and extensions.
-
-==== External libraries ====
+* Extensions can now return detailed error information via the API when
+  preventing user actions using 'getUserPermissionsErrors' and similar hooks
+  by using ApiMessage instances instead of strings for the $result value.
+* $wgAPIMaxLagThreshold was added to limit bot changes when databases lag
+  becomes too high.
+* Skins and extensions can now use FlexBox mixins (.flex-display(@display: flex)
+  and .flex(@grow: 1, @shrink: 1, @width: auto, @order: 1)) in Less to create
+  cross-browser-compatible FlexBox rules. Users will still need to add fallback
+  float rules or the like for compatibility with IE9- separately.
+* Added MWTimestamp::getTimezoneString() which returns the localized timezone
+  string, if available. To localize this string, see the comments of
+  $wgLocaltimezone in includes/DefaultSettings.php.
+* Added CentralIdLookup, a service that allows extensions needing a concept of
+  "central" users to get that without having to know about specific central
+  authentication extensions.
+* $wgMaxUserDBWriteDuration added to limit huge user-generated transactions.
+  Regular web request transactions that takes longer than this are aborted.
+* Added a new hook, 'TitleMoveCompleting', which runs before a page move is committed.
+* $wgCdnReboundPurgeDelay was added to provide secondary delayed purges of URLs
+  from CDN to mitigate DB replication lag and WAN cache purge lag.
+
+=== External library changes in 1.27 ===
+==== Upgraded external libraries ====
+* Updated oojs/oojs-ui from v0.12.12 to v0.13.3.
+* Updated composer/semver from v1.0.0 to v1.2.0.
+* Update liuggio/statsd-php-client to 1.0.18.
+
+==== New external libraries ====
+* Added wikimedia/base-convert v1.0.1.
+* Added wikimedia/cldr-plural-rule-parser v1.0.0.
+* Added wikimedia/relpath v1.0.3.
+* Added wikimedia/running-stat v1.1.0.
+
+==== Removed and replaced external libraries ====
 
 === Bug fixes in 1.27 ===
+* Special:Upload will now display correct maximum allowed file size when running
+  under HHVM (T116347).
 
 === Action API changes in 1.27 ===
 * Added list=allrevisions.
@@ -78,18 +128,63 @@ production.
   "was-deleted" warning.
 * Added difftotextpst to query=revisions which preforms a pre-save transform on
   the text before diffing it.
+* Deprecated formats dbg, txt, and yaml have been removed.
+* (T47988) The protect log event details now use new-style formatting.
+* The following response properties from action=login are deprecated, and may
+  be removed in the future: lgtoken, cookieprefix, sessionid. Clients should
+  handle cookies to properly manage session state.
 
 === Action API internal changes in 1.27 ===
 * ApiQueryORM removed.
+* The following classes have been removed:
+** ApiFormatDbg
+** ApiFormatTxt
+** ApiFormatYaml
+* ApiQueryBase::getDirectionDescription is now marked as deprecated. It should
+  have been so marked since 1.25 when ApiBase::getParamDescription was
+  deprecated, but was overlooked at the time.
 
 === Languages updated in 1.27 ===
 
 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.
+changes to languages because of Phabricator reports.
+
+* (T113688) Change default numerals from Gurmukhi to Arabic for Punjabi locale.
 
 === Other changes in 1.27 ===
 * ProfilerOutputUdp was removed. Note that there is a ProfilerOutputStats class.
+* WikiPage::doDeleteArticleReal() and WikiPage::doDeleteArticle() now
+  ignore the 2nd and 3rd arguments (formerly $id and $commit).
+* Removed "loaderScripts" option from ResourceLoaderFileModule class.
+* Removed ORM-like wrapper added in 1.20.
+* LinkCache::getGoodLinks and LinkCache::getBadLinks were removed (deprecated in 1.26).
+* WikiPage::doQuickEdit() was removed (deprecated since 1.21).
+* Removed SiteObject and SiteArray classes (deprecated in 1.21).
+* MessageBlobStore::getInstance() was removed (deprecated since 1.25).
+* (T84937) Free external links ("autolinked" urls) will now be terminated
+  by &nbsp; and HTML entity encodings of &nbsp, <, and >.
+* (T36948) The default file revert message's timestamp is now in $wgLocaltimezone,
+  instead of UTC.
+* The default name of the 'suppress' group page has been changed from
+  'Project:Oversight' to 'Project:Suppress'.
+* DatabaseBase::resultObject() is now protected (use outside Database classes
+  not necessary since 1.11).
+* Calling ResourceLoaderFileModule::readStyleFiles() without a
+  ResourceLoaderContext instance is deprecated.
+* ResourceLoader::getLessCompiler() now takes an optional parameter of
+  additional LESS variables to set for the compiler.
+* wfBaseConvert() marked as deprecated, use Wikimedia\base_convert() directly instead.
+* Obsolete maintenance scripts clearCacheStats.php and showCacheStats.php
+  were removed. The underlying data is sent to StatsD (see $wgStatsdServer).
+* Removed msg_resource_links database table and associated code.
+* Removed msg_resource database table and associated code.
+* Skin::getNamespaceNotice() was removed.
+* wfIsConfiguredProxy() was removed (deprecated since 1.24).
+* wfDebugTimer() was removed (deprecated since 1.25).
+* wfIsTrustedProxy() was removed (deprecated since 1.24).
+* wfGetIP() was removed (deprecated since 1.19).
+* MWHookException was removed.
 
 == Compatibility ==
 
diff --git a/Rakefile b/Rakefile
new file mode 100644 (file)
index 0000000..6eef121
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,14 @@
+require 'bundler/setup'
+
+require 'rubocop/rake_task'
+RuboCop::RakeTask.new(:rubocop) do |task|
+  # if you use mediawiki-vagrant, rubocop will by default use it's .rubocop.yml
+  # the next line makes it explicit that you want .rubocop.yml from the directory
+  # where `bundle exec rake` is executed
+  task.options = ['-c', '.rubocop.yml']
+end
+
+task default: [:test]
+
+desc 'Run all build/tests commands (CI entry point)'
+task test: [:rubocop]
diff --git a/api.php b/api.php
index af7c452..83c1373 100644 (file)
--- a/api.php
+++ b/api.php
@@ -35,11 +35,6 @@ use MediaWiki\Logger\LegacyLogger;
 // So extensions (and other code) can check whether they're running in API mode
 define( 'MW_API', true );
 
-// Bail on old versions of PHP, or if composer has not been run yet to install
-// dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
-require_once dirname( __FILE__ ) . '/includes/PHPVersionCheck.php';
-wfEntryPointCheck( 'api.php' );
-
 require __DIR__ . '/includes/WebStart.php';
 
 $starttime = microtime( true );
index 8720f33..dea31ab 100644 (file)
@@ -36,16 +36,13 @@ $wgAutoloadLocalClasses = array(
        'ApiFeedWatchlist' => __DIR__ . '/includes/api/ApiFeedWatchlist.php',
        'ApiFileRevert' => __DIR__ . '/includes/api/ApiFileRevert.php',
        'ApiFormatBase' => __DIR__ . '/includes/api/ApiFormatBase.php',
-       'ApiFormatDbg' => __DIR__ . '/includes/api/ApiFormatDbg.php',
        'ApiFormatFeedWrapper' => __DIR__ . '/includes/api/ApiFormatFeedWrapper.php',
        'ApiFormatJson' => __DIR__ . '/includes/api/ApiFormatJson.php',
        'ApiFormatNone' => __DIR__ . '/includes/api/ApiFormatNone.php',
        'ApiFormatPhp' => __DIR__ . '/includes/api/ApiFormatPhp.php',
        'ApiFormatRaw' => __DIR__ . '/includes/api/ApiFormatRaw.php',
-       'ApiFormatTxt' => __DIR__ . '/includes/api/ApiFormatTxt.php',
        'ApiFormatXml' => __DIR__ . '/includes/api/ApiFormatXml.php',
        'ApiFormatXmlRsd' => __DIR__ . '/includes/api/ApiRsd.php',
-       'ApiFormatYaml' => __DIR__ . '/includes/api/ApiFormatYaml.php',
        'ApiHelp' => __DIR__ . '/includes/api/ApiHelp.php',
        'ApiHelpParamValueMessage' => __DIR__ . '/includes/api/ApiHelpParamValueMessage.php',
        'ApiImageRotate' => __DIR__ . '/includes/api/ApiImageRotate.php',
@@ -167,8 +164,8 @@ $wgAutoloadLocalClasses = array(
        'BenchIfSwitch' => __DIR__ . '/maintenance/benchmarks/bench_if_switch.php',
        'BenchStrtrStrReplace' => __DIR__ . '/maintenance/benchmarks/bench_strtr_str_replace.php',
        'BenchUtf8TitleCheck' => __DIR__ . '/maintenance/benchmarks/bench_utf8_title_check.php',
-       'BenchWfBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_wfBaseConvert.php',
        'BenchWfIsWindows' => __DIR__ . '/maintenance/benchmarks/bench_wfIsWindows.php',
+       'BenchWikimediaBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_Wikimedia_base_convert.php',
        'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php',
        'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php',
        'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php',
@@ -195,12 +192,16 @@ $wgAutoloadLocalClasses = array(
        'Category' => __DIR__ . '/includes/Category.php',
        'CategoryFinder' => __DIR__ . '/includes/CategoryFinder.php',
        'CategoryMembershipChange' => __DIR__ . '/includes/changes/CategoryMembershipChange.php',
+       'CategoryMembershipChangeJob' => __DIR__ . '/includes/jobqueue/jobs/CategoryMembershipChangeJob.php',
        'CategoryPage' => __DIR__ . '/includes/page/CategoryPage.php',
        'CategoryPager' => __DIR__ . '/includes/specials/SpecialCategories.php',
        'CategoryViewer' => __DIR__ . '/includes/CategoryViewer.php',
        'CdbException' => __DIR__ . '/includes/compat/CdbCompat.php',
        'CdbReader' => __DIR__ . '/includes/compat/CdbCompat.php',
        'CdbWriter' => __DIR__ . '/includes/compat/CdbCompat.php',
+       'CdnCacheUpdate' => __DIR__ . '/includes/deferred/CdnCacheUpdate.php',
+       'CdnPurgeJob' => __DIR__ . '/includes/jobqueue/jobs/CdnPurgeJob.php',
+       'CentralIdLookup' => __DIR__ . '/includes/user/CentralIdLookup.php',
        'CgzCopyTransaction' => __DIR__ . '/maintenance/storage/recompressTracked.php',
        'ChangePassword' => __DIR__ . '/maintenance/changePassword.php',
        'ChangeTags' => __DIR__ . '/includes/changetags/ChangeTags.php',
@@ -229,7 +230,6 @@ $wgAutoloadLocalClasses = array(
        'CleanupPreferences' => __DIR__ . '/maintenance/cleanupPreferences.php',
        'CleanupRemovedModules' => __DIR__ . '/maintenance/cleanupRemovedModules.php',
        'CleanupSpam' => __DIR__ . '/maintenance/cleanupSpam.php',
-       'ClearCacheStats' => __DIR__ . '/maintenance/clearCacheStats.php',
        'ClearInterwikiCache' => __DIR__ . '/maintenance/clearInterwikiCache.php',
        'CliInstaller' => __DIR__ . '/includes/installer/CliInstaller.php',
        'CloneDatabase' => __DIR__ . '/includes/db/CloneDatabase.php',
@@ -242,6 +242,7 @@ $wgAutoloadLocalClasses = array(
        'CompareParserCache' => __DIR__ . '/maintenance/compareParserCache.php',
        'CompareParsers' => __DIR__ . '/maintenance/compareParsers.php',
        'ComposerHookHandler' => __DIR__ . '/includes/composer/ComposerHookHandler.php',
+       'ComposerInstalled' => __DIR__ . '/includes/libs/composer/ComposerInstalled.php',
        'ComposerJson' => __DIR__ . '/includes/libs/composer/ComposerJson.php',
        'ComposerLock' => __DIR__ . '/includes/libs/composer/ComposerLock.php',
        'ComposerPackageModifier' => __DIR__ . '/includes/composer/ComposerPackageModifier.php',
@@ -289,6 +290,7 @@ $wgAutoloadLocalClasses = array(
        'DBQueryError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DBReadOnlyError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DBSiteStore' => __DIR__ . '/includes/site/DBSiteStore.php',
+       'DBTransactionError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DBUnexpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
        'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
        'Database' => __DIR__ . '/includes/db/Database.php',
@@ -307,7 +309,7 @@ $wgAutoloadLocalClasses = array(
        'DateFormats' => __DIR__ . '/maintenance/language/date-formats.php',
        'DateFormatter' => __DIR__ . '/includes/parser/DateFormatter.php',
        'DeadendPagesPage' => __DIR__ . '/includes/specials/SpecialDeadendpages.php',
-       'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
+       'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferrableUpdate.php',
        'DeferredStringifier' => __DIR__ . '/includes/libs/DeferredStringifier.php',
        'DeferredUpdates' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
        'DeleteAction' => __DIR__ . '/includes/actions/DeleteAction.php',
@@ -445,7 +447,9 @@ $wgAutoloadLocalClasses = array(
        'FileRepoStatus' => __DIR__ . '/includes/filerepo/FileRepoStatus.php',
        'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
        'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
+       'FindOrphanedFiles' => __DIR__ . '/maintenance/findOrphanedFiles.php',
        'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
+       'FixDefaultJsonContentPages' => __DIR__ . '/maintenance/fixDefaultJsonContentPages.php',
        'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
        'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
        'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
@@ -469,6 +473,7 @@ $wgAutoloadLocalClasses = array(
        'GanConverter' => __DIR__ . '/languages/classes/LanguageGan.php',
        'GenderCache' => __DIR__ . '/includes/cache/GenderCache.php',
        'GenerateCollationData' => __DIR__ . '/maintenance/language/generateCollationData.php',
+       'GenerateCommonPassword' => __DIR__ . '/maintenance/createCommonPasswordCdb.php',
        'GenerateJsonI18n' => __DIR__ . '/maintenance/generateJsonI18n.php',
        'GenerateNormalizerDataAr' => __DIR__ . '/maintenance/language/generateNormalizerDataAr.php',
        'GenerateNormalizerDataMl' => __DIR__ . '/maintenance/language/generateNormalizerDataMl.php',
@@ -489,6 +494,7 @@ $wgAutoloadLocalClasses = array(
        'HTMLCacheUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/HTMLCacheUpdateJob.php',
        'HTMLCheckField' => __DIR__ . '/includes/htmlform/HTMLCheckField.php',
        'HTMLCheckMatrix' => __DIR__ . '/includes/htmlform/HTMLCheckMatrix.php',
+       'HTMLComboboxField' => __DIR__ . '/includes/htmlform/HTMLComboboxField.php',
        'HTMLEditTools' => __DIR__ . '/includes/htmlform/HTMLEditTools.php',
        'HTMLFileCache' => __DIR__ . '/includes/cache/HTMLFileCache.php',
        'HTMLFloatField' => __DIR__ . '/includes/htmlform/HTMLFloatField.php',
@@ -540,9 +546,8 @@ $wgAutoloadLocalClasses = array(
        'IDatabase' => __DIR__ . '/includes/db/IDatabase.php',
        'IEContentAnalyzer' => __DIR__ . '/includes/libs/IEContentAnalyzer.php',
        'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
+       'IExpiringStore' => __DIR__ . '/includes/libs/objectcache/IExpiringStore.php',
        'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
-       'IORMRow' => __DIR__ . '/includes/db/IORMRow.php',
-       'IORMTable' => __DIR__ . '/includes/db/IORMTable.php',
        'IP' => __DIR__ . '/includes/utils/IP.php',
        'IPSet' => __DIR__ . '/includes/compat/IPSetCompat.php',
        'IPTC' => __DIR__ . '/includes/media/IPTC.php',
@@ -559,6 +564,7 @@ $wgAutoloadLocalClasses = array(
        'ImageListPager' => __DIR__ . '/includes/specials/SpecialListfiles.php',
        'ImagePage' => __DIR__ . '/includes/page/ImagePage.php',
        'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
+       'ImportLogFormatter' => __DIR__ . '/includes/logging/ImportLogFormatter.php',
        'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
        'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
        'ImportSites' => __DIR__ . '/maintenance/importSites.php',
@@ -692,6 +698,7 @@ $wgAutoloadLocalClasses = array(
        'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileMoveBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
        'LocalFileRestoreBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalIdLookup' => __DIR__ . '/includes/user/LocalIdLookup.php',
        'LocalRepo' => __DIR__ . '/includes/filerepo/LocalRepo.php',
        'LocalSettingsGenerator' => __DIR__ . '/includes/installer/LocalSettingsGenerator.php',
        'LocalisationCache' => __DIR__ . '/includes/cache/LocalisationCache.php',
@@ -718,9 +725,8 @@ $wgAutoloadLocalClasses = array(
        'MWDocGen' => __DIR__ . '/maintenance/mwdocgen.php',
        'MWException' => __DIR__ . '/includes/exception/MWException.php',
        'MWExceptionHandler' => __DIR__ . '/includes/exception/MWExceptionHandler.php',
-       'MWHookException' => __DIR__ . '/includes/Hooks.php',
        'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
-       'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MWMemcached' => __DIR__ . '/includes/compat/MemcachedClientCompat.php',
        'MWMessagePack' => __DIR__ . '/includes/libs/MWMessagePack.php',
        'MWNamespace' => __DIR__ . '/includes/MWNamespace.php',
        'MWOldPassword' => __DIR__ . '/includes/password/MWOldPassword.php',
@@ -778,16 +784,18 @@ $wgAutoloadLocalClasses = array(
        'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php',
        'MediaWiki\\Widget\\TitleInputWidget' => __DIR__ . '/includes/widget/TitleInputWidget.php',
        'MediaWiki\\Widget\\UserInputWidget' => __DIR__ . '/includes/widget/UserInputWidget.php',
-       'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MemCachedClientforWiki' => __DIR__ . '/includes/compat/MemcachedClientCompat.php',
        'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
-       'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
+       'MemcachedBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedBagOStuff.php',
+       'MemcachedClient' => __DIR__ . '/includes/libs/objectcache/MemcachedClient.php',
        'MemcachedPeclBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPeclBagOStuff.php',
-       'MemcachedPhpBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPhpBagOStuff.php',
+       'MemcachedPhpBagOStuff' => __DIR__ . '/includes/libs/objectcache/MemcachedPhpBagOStuff.php',
        'MemoizedCallable' => __DIR__ . '/includes/libs/MemoizedCallable.php',
        'MemoryFileBackend' => __DIR__ . '/includes/filebackend/MemoryFileBackend.php',
        'MergeHistoryPager' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
        'MergeLogFormatter' => __DIR__ . '/includes/logging/MergeLogFormatter.php',
        'MergeMessageFileList' => __DIR__ . '/maintenance/mergeMessageFileList.php',
+       'MergeableUpdate' => __DIR__ . '/includes/deferred/MergeableUpdate.php',
        'Message' => __DIR__ . '/includes/Message.php',
        'MessageBlobStore' => __DIR__ . '/includes/cache/MessageBlobStore.php',
        'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
@@ -816,7 +824,7 @@ $wgAutoloadLocalClasses = array(
        'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
        'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
        'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
-       'MultiWriteBagOStuff' => __DIR__ . '/includes/objectcache/MultiWriteBagOStuff.php',
+       'MultiWriteBagOStuff' => __DIR__ . '/includes/libs/objectcache/MultiWriteBagOStuff.php',
        'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
        'MutableContext' => __DIR__ . '/includes/context/MutableContext.php',
        'MwSql' => __DIR__ . '/maintenance/sql.php',
@@ -846,10 +854,6 @@ $wgAutoloadLocalClasses = array(
        'OOUIHTMLForm' => __DIR__ . '/includes/htmlform/OOUIHTMLForm.php',
        'ORAField' => __DIR__ . '/includes/db/DatabaseOracle.php',
        'ORAResult' => __DIR__ . '/includes/db/DatabaseOracle.php',
-       'ORMIterator' => __DIR__ . '/includes/db/ORMIterator.php',
-       'ORMResult' => __DIR__ . '/includes/db/ORMResult.php',
-       'ORMRow' => __DIR__ . '/includes/db/ORMRow.php',
-       'ORMTable' => __DIR__ . '/includes/db/ORMTable.php',
        'ObjectCache' => __DIR__ . '/includes/objectcache/ObjectCache.php',
        'ObjectCacheSessionHandler' => __DIR__ . '/includes/objectcache/ObjectCacheSessionHandler.php',
        'ObjectFactory' => __DIR__ . '/includes/libs/ObjectFactory.php',
@@ -1075,7 +1079,7 @@ $wgAutoloadLocalClasses = array(
        'RollbackEdits' => __DIR__ . '/maintenance/rollbackEdits.php',
        'RowUpdateGenerator' => __DIR__ . '/includes/utils/RowUpdateGenerator.php',
        'RunJobs' => __DIR__ . '/maintenance/runJobs.php',
-       'RunningStat' => __DIR__ . '/includes/libs/RunningStat.php',
+       'RunningStat' => __DIR__ . '/includes/compat/RunningStatCompat.php',
        'SQLiteField' => __DIR__ . '/includes/db/DatabaseSqlite.php',
        'SVGMetadataExtractor' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
        'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
@@ -1088,6 +1092,7 @@ $wgAutoloadLocalClasses = array(
        'SearchDump' => __DIR__ . '/maintenance/dumpIterator.php',
        'SearchEngine' => __DIR__ . '/includes/search/SearchEngine.php',
        'SearchEngineDummy' => __DIR__ . '/includes/search/SearchEngine.php',
+       'SearchExactMatchRescorer' => __DIR__ . '/includes/search/SearchExactMatchRescorer.php',
        'SearchHighlighter' => __DIR__ . '/includes/search/SearchHighlighter.php',
        'SearchMssql' => __DIR__ . '/includes/search/SearchMssql.php',
        'SearchMySQL' => __DIR__ . '/includes/search/SearchMySQL.php',
@@ -1103,17 +1108,14 @@ $wgAutoloadLocalClasses = array(
        'SevenZipStream' => __DIR__ . '/maintenance/7zip.inc',
        'ShiConverter' => __DIR__ . '/languages/classes/LanguageShi.php',
        'ShortPagesPage' => __DIR__ . '/includes/specials/SpecialShortpages.php',
-       'ShowCacheStats' => __DIR__ . '/maintenance/showCacheStats.php',
        'ShowJobs' => __DIR__ . '/maintenance/showJobs.php',
        'ShowSiteStats' => __DIR__ . '/maintenance/showSiteStats.php',
        'Site' => __DIR__ . '/includes/site/Site.php',
-       'SiteArray' => __DIR__ . '/includes/site/SiteList.php',
        'SiteConfiguration' => __DIR__ . '/includes/SiteConfiguration.php',
        'SiteExporter' => __DIR__ . '/includes/site/SiteExporter.php',
        'SiteImporter' => __DIR__ . '/includes/site/SiteImporter.php',
        'SiteList' => __DIR__ . '/includes/site/SiteList.php',
        'SiteLookup' => __DIR__ . '/includes/site/SiteLookup.php',
-       'SiteObject' => __DIR__ . '/includes/site/Site.php',
        'SiteSQLStore' => __DIR__ . '/includes/site/SiteSQLStore.php',
        'SiteStats' => __DIR__ . '/includes/SiteStats.php',
        'SiteStatsInit' => __DIR__ . '/includes/SiteStats.php',
@@ -1213,7 +1215,7 @@ $wgAutoloadLocalClasses = array(
        'SqliteUpdater' => __DIR__ . '/includes/installer/SqliteUpdater.php',
        'SquidPurgeClient' => __DIR__ . '/includes/clientpool/SquidPurgeClient.php',
        'SquidPurgeClientPool' => __DIR__ . '/includes/clientpool/SquidPurgeClientPool.php',
-       'SquidUpdate' => __DIR__ . '/includes/deferred/SquidUpdate.php',
+       'SquidUpdate' => __DIR__ . '/includes/deferred/CdnCacheUpdate.php',
        'SrConverter' => __DIR__ . '/languages/classes/LanguageSr.php',
        'StatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'Status' => __DIR__ . '/includes/Status.php',
@@ -1237,7 +1239,6 @@ $wgAutoloadLocalClasses = array(
        'SwiftVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/SwiftVirtualRESTService.php',
        'SyncFileBackend' => __DIR__ . '/maintenance/syncFileBackend.php',
        'TableCleanup' => __DIR__ . '/maintenance/cleanupTable.inc',
-       'TableCleanupTest' => __DIR__ . '/maintenance/cleanupTable.inc',
        'TableDiffFormatter' => __DIR__ . '/includes/diff/TableDiffFormatter.php',
        'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
        'TagLogFormatter' => __DIR__ . '/includes/logging/TagLogFormatter.php',
@@ -1256,6 +1257,7 @@ $wgAutoloadLocalClasses = array(
        'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
        'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
        'TimestampException' => __DIR__ . '/includes/exception/TimestampException.php',
+       'Timing' => __DIR__ . '/includes/libs/Timing.php',
        'Title' => __DIR__ . '/includes/Title.php',
        'TitleArray' => __DIR__ . '/includes/TitleArray.php',
        'TitleArrayFromResult' => __DIR__ . '/includes/TitleArrayFromResult.php',
@@ -1323,9 +1325,9 @@ $wgAutoloadLocalClasses = array(
        'UploadStashZeroLengthFileException' => __DIR__ . '/includes/upload/UploadStash.php',
        'UppercaseCollation' => __DIR__ . '/includes/Collation.php',
        'UsageException' => __DIR__ . '/includes/api/ApiMain.php',
-       'User' => __DIR__ . '/includes/User.php',
-       'UserArray' => __DIR__ . '/includes/UserArray.php',
-       'UserArrayFromResult' => __DIR__ . '/includes/UserArrayFromResult.php',
+       'User' => __DIR__ . '/includes/user/User.php',
+       'UserArray' => __DIR__ . '/includes/user/UserArray.php',
+       'UserArrayFromResult' => __DIR__ . '/includes/user/UserArrayFromResult.php',
        'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php',
        'UserCache' => __DIR__ . '/includes/cache/UserCache.php',
        'UserDupes' => __DIR__ . '/maintenance/userDupes.inc',
@@ -1333,7 +1335,7 @@ $wgAutoloadLocalClasses = array(
        'UserNotLoggedIn' => __DIR__ . '/includes/exception/UserNotLoggedIn.php',
        'UserOptions' => __DIR__ . '/maintenance/userOptions.inc',
        'UserPasswordPolicy' => __DIR__ . '/includes/password/UserPasswordPolicy.php',
-       'UserRightsProxy' => __DIR__ . '/includes/UserRightsProxy.php',
+       'UserRightsProxy' => __DIR__ . '/includes/user/UserRightsProxy.php',
        'UsercreateTemplate' => __DIR__ . '/includes/templates/Usercreate.php',
        'UserloginTemplate' => __DIR__ . '/includes/templates/Userlogin.php',
        'UserrightsPage' => __DIR__ . '/includes/specials/SpecialUserrights.php',
index 6209017..e0cece5 100644 (file)
                "wiki": "https://www.mediawiki.org/"
        },
        "require": {
-               "composer/semver": "1.0.0",
+               "composer/semver": "1.2.0",
                "cssjanus/cssjanus": "1.1.1",
                "ext-iconv": "*",
-               "liuggio/statsd-php-client": "1.0.16",
+               "liuggio/statsd-php-client": "1.0.18",
                "mediawiki/at-ease": "1.1.0",
-               "oojs/oojs-ui": "0.12.12",
+               "oojs/oojs-ui": "0.14.1",
                "oyejorge/less.php": "1.7.0.9",
                "php": ">=5.3.3",
                "psr/log": "1.0.0",
                "wikimedia/assert": "0.2.2",
+               "wikimedia/base-convert": "1.0.1",
                "wikimedia/cdb": "1.3.0",
                "wikimedia/cldr-plural-rule-parser": "1.0.0",
-               "wikimedia/composer-merge-plugin": "1.2.1",
+               "wikimedia/composer-merge-plugin": "1.3.0",
                "wikimedia/ip-set": "1.0.1",
                "wikimedia/relpath": "1.0.3",
+               "wikimedia/running-stat": "1.1.0",
                "wikimedia/utfnormal": "1.0.3",
                "wikimedia/wrappedstring": "2.0.0",
                "zordius/lightncandy": "0.21"
@@ -39,7 +41,7 @@
                "jakub-onderka/php-parallel-lint": "0.9",
                "justinrainbow/json-schema": "~1.3",
                "mediawiki/mediawiki-codesniffer": "0.4.0",
-               "monolog/monolog": "1.14.0",
+               "monolog/monolog": "~1.17.2",
                "nmred/kafka-php": "0.1.4",
                "phpunit/phpunit": "3.7.37",
                "wikimedia/avro": "1.7.7"
@@ -80,7 +82,8 @@
                "merge-plugin": {
                        "include": [
                                "composer.local.json"
-                       ]
+                       ],
+                       "merge-dev": false
                }
        }
 }
index 218a19c..b635467 100644 (file)
                "ResourceModules": {
                        "type": "object",
                        "description": "ResourceLoader modules to register",
-                       "additionalProperties": false,
                        "patternProperties": {
                                "^[a-zA-Z0-9-\\.]+$": {
                                        "type": "object",
-                                       "description": "A single ResourceLoader module descriptor",
-                                       "properties": {
-                                               "localBasePath": {
-                                                       "type": "string",
-                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
-                                               },
-                                               "remoteBasePath": {
-                                                       "type": "string",
-                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
-                                               },
-                                               "remoteExtPath": {
-                                                       "type": "string",
-                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
-                                               },
-                                               "scripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to always include (array of file paths)",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "languageScripts": {
-                                                       "type": "object",
-                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
-                                                       "patternProperties": {
-                                                               "^[a-zA-Z0-9-]{2,}$": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                       "anyOf": [
+                                               {
+                                                       "description": "A ResourceLoaderFileModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "localBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all local paths in $options. Defaults to $IP"
+                                                               },
+                                                               "remoteBasePath": {
+                                                                       "type": "string",
+                                                                       "description": "Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath"
+                                                               },
+                                                               "remoteExtPath": {
+                                                                       "type": "string",
+                                                                       "description": "Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath"
+                                                               },
+                                                               "scripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to always include (array of file paths)",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
-                                                               }
-                                                       }
-                                               },
-                                               "skinScripts": {
-                                                       "type": "object",
-                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
-                                                       "patternProperties": {
-                                                               ".+": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                                               },
+                                                               "languageScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific language contexts (mapping of language code to file path(s))",
+                                                                       "patternProperties": {
+                                                                               "^[a-zA-Z0-9-]{2,}$": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "skinScripts": {
+                                                                       "type": "object",
+                                                                       "description": "Scripts to include in specific skin contexts (mapping of skin name to script(s)",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "debugScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in debug contexts",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
-                                                               }
-                                                       }
-                                               },
-                                               "debugScripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to include in debug contexts",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "loaderScripts": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Scripts to include in the startup module",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "dependencies": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Modules which must be loaded before this module",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "styles": {
-                                                       "type": ["string", "array", "object"],
-                                                       "description": "Styles to always load",
-                                                       "items": {
-                                                               "type": "string"
-                                                       }
-                                               },
-                                               "skinStyles": {
-                                                       "type": "object",
-                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
-                                                       "patternProperties": {
-                                                               ".+": {
-                                                                       "type": [
-                                                                               "string",
-                                                                               "array"
-                                                                       ],
+                                                               },
+                                                               "loaderScripts": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Scripts to include in the startup module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "dependencies": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Modules which must be loaded before this module",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "styles": {
+                                                                       "type": ["string", "array", "object"],
+                                                                       "description": "Styles to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "skinStyles": {
+                                                                       "type": "object",
+                                                                       "description": "Styles to include in specific skin contexts (mapping of skin name to style(s))",
+                                                                       "patternProperties": {
+                                                                               ".+": {
+                                                                                       "type": [
+                                                                                               "string",
+                                                                                               "array"
+                                                                                       ],
+                                                                                       "items": {
+                                                                                               "type": "string"
+                                                                                       }
+                                                                               }
+                                                                       }
+                                                               },
+                                                               "messages": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "Messages to always load",
+                                                                       "items": {
+                                                                               "type": "string"
+                                                                       }
+                                                               },
+                                                               "group": {
+                                                                       "type": "string",
+                                                                       "description": "Group which this module should be loaded together with"
+                                                               },
+                                                               "position": {
+                                                                       "type": "string",
+                                                                       "description": "Position on the page to load this module at",
+                                                                       "enum": [
+                                                                               "bottom",
+                                                                               "top"
+                                                                       ]
+                                                               },
+                                                               "templates": {
+                                                                       "type": "object",
+                                                                       "description": "Templates to be loaded for client-side usage"
+                                                               },
+                                                               "targets": {
+                                                                       "type": ["string", "array"],
+                                                                       "description": "ResourceLoader target the module can run on",
                                                                        "items": {
                                                                                "type": "string"
                                                                        }
                                                                }
                                                        }
                                                },
-                                               "messages": {
-                                                       "type": ["string", "array"],
-                                                       "description": "Messages to always load",
-                                                       "items": {
-                                                               "type": "string"
+                                               {
+                                                       "description": "A ResourceLoaderImageModule definition",
+                                                       "additionalProperties": false,
+                                                       "properties": {
+                                                               "class": {
+                                                                       "enum": ["ResourceLoaderImageModule"]
+                                                               },
+                                                               "data": {
+                                                                       "type": "string"
+                                                               },
+                                                               "prefix": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selector": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithoutVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "selectorWithVariant": {
+                                                                       "type": "string"
+                                                               },
+                                                               "variants": {
+                                                                       "type": "object"
+                                                               },
+                                                               "images": {
+                                                                       "type": "object"
+                                                               },
+                                                               "position": {
+                                                                       "enum": [
+                                                                               "top",
+                                                                               "bottom"
+                                                                       ]
+                                                               }
                                                        }
                                                },
-                                               "group": {
-                                                       "type": "string",
-                                                       "description": "Group which this module should be loaded together with"
-                                               },
-                                               "position": {
-                                                       "type": "string",
-                                                       "description": "Position on the page to load this module at",
-                                                       "enum": [
-                                                               "bottom",
-                                                               "top"
-                                                       ]
-                                               },
-                                               "templates": {
-                                                       "type": "object",
-                                                       "description": "Templates to be loaded for client-side usage"
+                                               {
+                                                       "description": "An arbitrary ResourceLoaderModule definition",
+                                                       "properties": {
+                                                               "class": {
+                                                                       "type": "string",
+                                                                       "pattern": "^((?!ResourceLoader(File|Image)Module).)*$"
+                                                               }
+                                                       },
+                                                       "required": ["class"]
                                                }
-                                       }
+                                       ]
                                }
                        }
                },
                        },
                        "patternProperties": {
                                "^[a-zA-Z_\u007f-\u00ff][a-zA-Z0-9_\u007f-\u00ff]*$": {
-                                       "type": ["object", "array", "string", "integer", "null", "boolean"],
                                        "properties": {
                                                "_merge_strategy": {
                                                        "type": "string",
index 8d36603..0cb4756 100644 (file)
@@ -10,8 +10,8 @@ event
      page is saved. A wiki page is deleted. Often there are two events
      associated with a single action: one before the code is run to make the
      event happen, and one after. Each event has a name, preferably in
-     CamelCase. For example, 'UserLogin', 'ArticleSave', 'ArticleSaveComplete',
-     'ArticleDelete'.
+     CamelCase. For example, 'UserLogin', 'PageContentSave',
+     'PageContentSaveComplete', 'ArticleDelete'.
 
 hook
      A clump of code and data that should be run when an event happens. This can
@@ -170,8 +170,8 @@ different: 'onArticleSave', 'onUserLogin', etc.
 The extra data is useful if we want to use the same function or object for
 different purposes. For example:
 
-       $wgHooks['ArticleSaveComplete'][] = array( 'ircNotify', 'TimStarling' );
-       $wgHooks['ArticleSaveComplete'][] = array( 'ircNotify', 'brion' );
+       $wgHooks['PageContentSaveComplete'][] = array( 'ircNotify', 'TimStarling' );
+       $wgHooks['PageContentSaveComplete'][] = array( 'ircNotify', 'brion' );
 
 This code would result in ircNotify being run twice when an article is saved:
 once for 'TimStarling', and once for 'brion'.
@@ -245,7 +245,7 @@ $user: the User object about to be created (read-only, incomplete)
 
 'AbortAutoblock': Return false to cancel an autoblock.
 $autoblockip: The IP going to be autoblocked.
-$block: The block from which the autoblock is coming.
+&$block: The block from which the autoblock is coming.
 
 'AbortChangePassword': Return false to cancel password change.
 $user: the User object to which the password change is occuring
@@ -326,7 +326,7 @@ just before adding its HTML to parser output.
 $parser: Parser object that called the hook
 $ig: Gallery, an object of one of the gallery classes (inheriting from
   ImageGalleryBase)
-$html: HTML generated by the gallery
+&$html: HTML generated by the gallery
 
 'AlternateEdit': Before checking if a user can edit a page and before showing
 the edit form ( EditPage::edit() ). This is triggered on &action=edit.
@@ -469,7 +469,7 @@ function is func($pageid, $title), where $pageid is the page ID of the page the
 token is requested for and $title is the associated Title object. In the hook,
 just add your callback to the $tokenFunctions array and return true (returning
 false makes no sense).
-$tokenFunctions: array(action => callback)
+&$tokenFunctions: array(action => callback)
 
 'APIQueryRecentChangesTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes
 instead.
@@ -482,7 +482,7 @@ page associated to the revision the token is requested for, $title the
 associated Title object and $rc the associated RecentChange object. In the
 hook, just add your callback to the $tokenFunctions array and return true
 (returning false makes no sense).
-$tokenFunctions: array(action => callback)
+&$tokenFunctions: array(action => callback)
 
 'APIQueryRevisionsTokens': DEPRECATED! Use ApiQueryTokensRegisterTypes instead.
 Use this hook to add custom tokens to prop=revisions. Every token has an
@@ -494,7 +494,7 @@ page associated to the revision the token is requested for, $title the
 associated Title object and $rev the associated Revision object. In the hook,
 just add your callback to the $tokenFunctions array and return true (returning
 false makes no sense).
-$tokenFunctions: array(action => callback)
+&$tokenFunctions: array(action => callback)
 
 'APIQuerySiteInfoGeneralInfo': Use this hook to add extra information to the
 sites general information.
@@ -518,7 +518,7 @@ false if the user isn't allowed to obtain it. The prototype of the callback
 function is func($user) where $user is the User object. In the hook, just add
 your callback to the $tokenFunctions array and return true (returning false
 makes no sense).
-$tokenFunctions: array(action => callback)
+&$tokenFunctions: array(action => callback)
 
 'ApiRsdServiceApis': Add or remove APIs from the RSD services list. Each service
 should have its own entry in the $apis array and have a unique name, passed as
@@ -541,12 +541,12 @@ $logTypes: Array of log types being queried
 'ArticleAfterFetchContent': DEPRECATED! Use ArticleAfterFetchContentObject
 instead.
 After fetching content of an article from the database.
-$article: the article (object) being loaded from the database
+&$article: the article (object) being loaded from the database
 &$content: the content (string) of the article
 
 'ArticleAfterFetchContentObject': After fetching content of an article from the
 database.
-$article: the article (object) being loaded from the database
+&$article: the article (object) being loaded from the database
 &$content: the content of the article, as a Content object
 
 'ArticleConfirmDelete': Before writing the confirmation form for article
@@ -568,12 +568,12 @@ $title: title of the page
 $output: reference to $wgOut
 
 'ArticleDelete': Before an article is deleted.
-$wikiPage: the WikiPage (object) being deleted
-$user: the user (object) deleting the article
-$reason: the reason (string) the article is being deleted
-$error: if the deletion was prohibited, the (raw HTML) error message to display
+&$wikiPage: the WikiPage (object) being deleted
+&$user: the user (object) deleting the article
+&$reason: the reason (string) the article is being deleted
+&$error: if the deletion was prohibited, the (raw HTML) error message to display
   (added in 1.13)
-$status: Status object, modify this to throw an error. Overridden by $error
+&$status: Status object, modify this to throw an error. Overridden by $error
   (added in 1.20)
 $suppress: Whether this is a suppression deletion or not (added in 1.27)
 
@@ -582,8 +582,8 @@ $title: Title of the article that has been deleted.
 $outputPage: OutputPage that can be used to append the output.
 
 'ArticleDeleteComplete': After an article is deleted.
-$wikiPage: the WikiPage that was deleted
-$user: the user that deleted the article
+&$wikiPage: the WikiPage that was deleted
+&$user: the user that deleted the article
 $reason: the reason the article was deleted
 $id: id of the article that was deleted
 $content: the Content of the deleted page
@@ -596,19 +596,19 @@ $recipient: User (object) who's talk page was edited
 
 'ArticleEditUpdates': When edit updates (mainly link tracking) are made when an
 article has been changed.
-$wikiPage: the WikiPage (object)
-$editInfo: data holder that includes the parser output ($editInfo->output) for
+&$wikiPage: the WikiPage (object)
+&$editInfo: data holder that includes the parser output ($editInfo->output) for
   that page after the change
 $changed: bool for if the page was changed
 
 'ArticleEditUpdatesDeleteFromRecentchanges': Before deleting old entries from
 recentchanges table, return false to not delete old entries.
-$wikiPage: WikiPage (object) being modified
+&$wikiPage: WikiPage (object) being modified
 
 'ArticleFromTitle': when creating an article object from a title object using
 Wiki::articleFromTitle().
-$title: Title (object) used to create the article object
-$article: Article (object) that will be returned
+&$title: Title (object) used to create the article object
+&$article: Article (object) that will be returned
 $context: IContextSource (object)
 
 'ArticleInsertComplete': DEPRECATED! Use PageContentInsertComplete.
@@ -628,34 +628,34 @@ $targetTitle: target title (object)
 $destTitle: destination title (object)
 
 'ArticlePageDataAfter': After loading data of an article from the database.
-$wikiPage: WikiPage (object) whose data were loaded
-$row: row (object) returned from the database server
+&$wikiPage: WikiPage (object) whose data were loaded
+&$row: row (object) returned from the database server
 
 'ArticlePageDataBefore': Before loading data of an article from the database.
-$wikiPage: WikiPage (object) that data will be loaded
-$fields: fields (array) to load from the database
+&$wikiPage: WikiPage (object) that data will be loaded
+&$fields: fields (array) to load from the database
 
 'ArticlePrepareTextForEdit': Called when preparing text to be saved.
 $wikiPage: the WikiPage being saved
 $popts: parser options to be used for pre-save transformation
 
 'ArticleProtect': Before an article is protected.
-$wikiPage: the WikiPage being protected
-$user: the user doing the protection
+&$wikiPage: the WikiPage being protected
+&$user: the user doing the protection
 $protect: Set of restriction keys
 $reason: Reason for protect
 
 'ArticleProtectComplete': After an article is protected.
-$wikiPage: the WikiPage that was protected
-$user: the user who did the protection
+&$wikiPage: the WikiPage that was protected
+&$user: the user who did the protection
 $protect: Set of restriction keys
 $reason: Reason for protect
 
 'ArticlePurge': Before executing "&action=purge".
-$wikiPage: WikiPage (object) to purge
+&$wikiPage: WikiPage (object) to purge
 
 'ArticleRevisionUndeleted': After an article revision is restored.
-$title: the article title
+&$title: the article title
 $revision: the revision
 $oldPageID: the page ID of the revision when archived (may be null)
 
@@ -695,7 +695,7 @@ $status: Status object about to be returned by doEditContent()
 $baseRevId: the rev ID (or false) this edit was based on
 
 'ArticleUndelete': When one or more revisions of an article are restored.
-$title: Title corresponding to the article restored
+&$title: Title corresponding to the article restored
 $create: Whether or not the restoration caused the page to be created (i.e. it
   didn't exist before).
 $comment: The comment associated with the undeletion.
@@ -708,7 +708,7 @@ $user: User who is performing the log action
 
 'ArticleUpdateBeforeRedirect': After a page is updated (usually on save), before
 the user is redirected back to the page.
-&$article: the article
+$article: the article
 &$sectionanchor: The section anchor link (e.g. "#overview" )
 &$extraq: Extra query parameters which can be added via hooked functions
 
@@ -734,7 +734,7 @@ viewing.
 
 'ArticleViewRedirect': Before setting "Redirected from ..." subtitle when a
 redirect was followed.
-$article: target article (object)
+&$article: target article (object)
 
 'AuthPluginAutoCreate': Called when creating a local account for an user logged
 in from an external authentication method.
@@ -748,7 +748,7 @@ Gives a chance for an extension to set it programmatically to a variable class.
 $type: condition type
 $args: arguments
 $user: user
-$result: result of checking autopromote condition
+&$result: result of checking autopromote condition
 
 'BacklinkCacheGetConditions': Allows to set conditions for query when links to
 certain title are fetched.
@@ -768,7 +768,7 @@ $name: Image name being checked
 
 'BaseTemplateAfterPortlet': After output of portlets, allow injecting
 custom HTML after the section. Any uses of the hook need to handle escaping.
-$template BaseTemplate
+$template: BaseTemplate
 $portlet: string portlet name
 &$html: string
 
@@ -796,7 +796,7 @@ $context: IContextSource object
 'BeforeInitialize': Before anything is initialized in
 MediaWiki::performRequest().
 &$title: Title being used for request
-$unused: null
+&$unused: null
 &$output: OutputPage object
 &$user: User
 $request: WebRequest object
@@ -852,8 +852,8 @@ $image: File
 &$mto: null, set to a MediaTransformOutput
 
 'BlockIp': Before an IP address or user is blocked.
-$block: the Block object about to be saved
-$user: the user _doing_ the block (not the one being blocked)
+&$block: the Block object about to be saved
+&$user: the user _doing_ the block (not the one being blocked)
 &$reason: if the hook is aborted, the error message to be returned in an array
 
 'BlockIpComplete': After an IP address or user is blocked.
@@ -891,7 +891,7 @@ $category: Category that page was removed from
 $wikiPage: WikiPage that was removed
 
 'CategoryPageView': Before viewing a categorypage in CategoryPage::view.
-$catpage: CategoryPage instance
+&$catpage: CategoryPage instance
 
 'CategoryViewer::doCategoryQuery': After querying for pages to be displayed
 in a Category page. Gives extensions the opportunity to batch load any
@@ -1070,7 +1070,7 @@ $article: Article being edited
 $user: User performing the edit
 
 'DatabaseOraclePostInit': Called after initialising an Oracle database
-&$db: the DatabaseOracle object
+$db: the DatabaseOracle object
 
 'DeletedContribsPager::reallyDoQuery': Called before really executing the query
 for Special:DeletedContributions
@@ -1094,6 +1094,7 @@ diff view, i.e. undo, etc.
 $newRev: Revision object of the "new" revision
 &$links: Array of HTML links
 $oldRev: Revision object of the "old" revision (may be null)
+$user: Current user object
 
 'DiffViewHeader': Called before diff display
 $diff: DifferenceEngine object that's calling
@@ -1102,8 +1103,8 @@ $newRev: Revision object of the "new" revision
 
 'DisplayOldSubtitle': before creating subtitle when browsing old versions of
 an article
-$article: article (object) being viewed
-$oldid: oldid (int) being viewed
+&$article: article (object) being viewed
+&$oldid: oldid (int) being viewed
 
 'DoEditSectionLink': DEPRECATED! Use SkinEditSectionLinks instead.
 Override the HTML generated for section edit links
@@ -1173,16 +1174,16 @@ return value is ignored (should always return true)
 
 'EditPage::showEditForm:fields': allows injection of form field into edit form
 Return value is ignored (should always return true)
-$editor: the EditPage instance for reference
-$out: an OutputPage instance to write to
+&$editor: the EditPage instance for reference
+&$out: an OutputPage instance to write to
 
 'EditPage::showEditForm:initial': before showing the edit form
 Return false to halt editing; you'll need to handle error messages, etc.
 yourself. Alternatively, modifying $error and returning true will cause the
 contents of $error to be echoed at the top of the edit form as wikitext.
 Return true without altering $error to allow the edit to proceed.
-$editor: EditPage instance (object)
-$out: an OutputPage instance to write to
+&$editor: EditPage instance (object)
+&$out: an OutputPage instance to write to
 
 'EditPage::showReadOnlyForm:initial': similar to EditPage::showEditForm:initial
 but for the read-only 'view source' variant of the edit form.
@@ -1267,21 +1268,21 @@ $title: title of page being edited
 'EmailConfirmed': When checking that the user's email address is "confirmed".
 This runs before the other checks, such as anonymity and the real check; return
 true to allow those checks to occur, and false if checking is done.
-$user: User being checked
-$confirmed: Whether or not the email address is confirmed
+&$user: User being checked
+&$confirmed: Whether or not the email address is confirmed
 
 'EmailUser': Before sending email from one user to another.
-$to: MailAddress object of receiving user
-$from: MailAddress object of sending user
-$subject: subject of the mail
-$text: text of the mail
+&$to: MailAddress object of receiving user
+&$from: MailAddress object of sending user
+&$subject: subject of the mail
+&$text: text of the mail
 &$error: Out-param for an error
 
 'EmailUserCC': Before sending the copy of the email to the author.
-$to: MailAddress object of receiving user
-$from: MailAddress object of sending user
-$subject: subject of the mail
-$text: text of the mail
+&$to: MailAddress object of receiving user
+&$from: MailAddress object of sending user
+&$subject: subject of the mail
+&$text: text of the mail
 
 'EmailUserComplete': After sending email from one user to another.
 $to: MailAddress object of receiving user
@@ -1290,7 +1291,7 @@ $subject: subject of the mail
 $text: text of the mail
 
 'EmailUserForm': After building the email user form object.
-$form: HTMLForm object
+&$form: HTMLForm object
 
 'EmailUserPermissionsErrors': to retrieve permissions errors for emailing a
 user.
@@ -1343,12 +1344,12 @@ $user: User the list is being fetched for
   return false override the list derivative used)
 
 'FileDeleteComplete': When a file is deleted.
-$file: reference to the deleted file
-$oldimage: in case of the deletion of an old image, the name of the old file
-$article: in case all revisions of the file are deleted a reference to the
+&$file: reference to the deleted file
+&$oldimage: in case of the deletion of an old image, the name of the old file
+&$article: in case all revisions of the file are deleted a reference to the
   WikiFilePage associated with the file.
-$user: user who performed the deletion
-$reason: reason
+&$user: user who performed the deletion
+&$reason: reason
 
 'FileTransformed': When a file is transformed and moved into storage.
 $file: reference to the File object
@@ -1363,10 +1364,10 @@ $user: user who performed the undeletion
 $reason: reason
 
 '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
+$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)
-$hasDescription : Boolean indicating that there was already a description page
+$hasDescription: Boolean indicating that there was already a description page
   and a new one from the comment wasn't created (since 1.17)
 
 'FormatAutocomments': When an autocomment is formatted by the Linker.
@@ -1389,11 +1390,11 @@ gallery.
 
 'GetAutoPromoteGroups': When determining which autopromote groups a user is
 entitled to be in.
-&$user: user to promote.
+$user: user to promote.
 &$promote: groups that will be added.
 
 'GetBlockedStatus': after loading blocking status of an user from the database
-$user: user (object) being checked
+&$user: user (object) being checked
 
 'GetCacheVaryCookies': Get cookies that should vary cache options.
 $out: OutputPage object
@@ -1402,8 +1403,8 @@ $out: OutputPage object
 
 'GetCanonicalURL': Modify fully-qualified URLs used for IRC and e-mail
 notifications.
-$title: Title object of page
-$url: string value as output (out parameter, can modify)
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getCanonicalURL()
 
 'GetDefaultSortkey': Override the default sortkey for a page.
@@ -1439,8 +1440,8 @@ $single: Only extract the current language; if false, the prop value should
 &$maxCacheTime: how long the results can be cached
 
 'GetFullURL': Modify fully-qualified URLs used in redirects/export/offsite data.
-$title: Title object of page
-$url: string value as output (out parameter, can modify)
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getFullURL()
 
 'GetHumanTimestamp': Pre-emptively override the human-readable timestamp
@@ -1453,8 +1454,8 @@ $user: User whose preferences are being used to make timestamp
 $lang: Language that will be used to render the timestamp
 
 'GetInternalURL': Modify fully-qualified URLs used for squid cache purging.
-$title: Title object of page
-$url: string value as output (out parameter, can modify)
+&$title: Title object of page
+&$url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getInternalURL()
 
 'GetIP': modify the ip of the current user (called only once).
@@ -1470,17 +1471,17 @@ working with internal urls (non-interwiki) then it may be preferable to work
 with the GetLocalURL::Internal or GetLocalURL::Article hooks as GetLocalURL can
 be buggy for internal urls on render if you do not re-implement the horrible
 hack that Title::getLocalURL uses in your own extension.
-$title: Title object of page
+&$title: Title object of page
 &$url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getLocalURL()
 
 'GetLocalURL::Article': Modify local URLs specifically pointing to article paths
 without any fancy queries or variants.
-$title: Title object of page
+&$title: Title object of page
 &$url: string value as output (out parameter, can modify)
 
 'GetLocalURL::Internal': Modify local URLs to internal pages.
-$title: Title object of page
+&$title: Title object of page
 &$url: string value as output (out parameter, can modify)
 $query: query options passed to Title::getLocalURL()
 
@@ -1521,26 +1522,30 @@ $lang: Language that will be used to render the timestamp
 'getUserPermissionsErrors': Add a permissions error when permissions errors are
 checked for. Use instead of userCan for most cases. Return false if the user
 can't do it, and populate $result with the reason in the form of
-array( messagename, param1, param2, ... ). For consistency, error messages
+array( messagename, param1, param2, ... ) or a MessageSpecifier instance (you
+might want to use ApiMessage to provide machine-readable details for the API).
+For consistency, error messages
 should be plain text with no special coloring, bolding, etc. to show that
 they're errors; presenting them properly to the user as errors is done by the
 caller.
-$title: Title object being checked against
-$user: Current user object
+&$title: Title object being checked against
+&$user: Current user object
 $action: Action being checked
-$result: User permissions error to add. If none, return true.
+&$result: User permissions error to add. If none, return true.
 
 'getUserPermissionsErrorsExpensive': Equal to getUserPermissionsErrors, but is
 called only if expensive checks are enabled. Add a permissions error when
 permissions errors are checked for. Return false if the user can't do it, and
 populate $result with the reason in the form of array( messagename, param1,
-param2, ... ). For consistency, error messages should be plain text with no
+param2, ... ) or a MessageSpecifier instance (you might want to use ApiMessage
+to provide machine-readable details for the API). For consistency, error
+messages should be plain text with no
 special coloring, bolding, etc. to show that they're errors; presenting them
 properly to the user as errors is done by the caller.
-$title: Title object being checked against
-$user: Current user object
+&$title: Title object being checked against
+&$user: Current user object
 $action: Action being checked
-$result: User permissions error to add. If none, return true.
+&$result: User permissions error to add. If none, return true.
 
 'GitViewers': Called when generating the list of git viewers for
 Special:Version, use this to change the list.
@@ -1550,6 +1555,8 @@ Special:Version, use this to change the list.
 page history view, i.e. undo, rollback, etc.
 $rev: Revision object
 &$links: Array of HTML links
+$prevRev: Revision object, next in line in page history, or null
+$user: Current user object
 
 'HTMLFileCache::useFileCache': Override whether a page should be cached in file
 cache.
@@ -1571,8 +1578,8 @@ just modify a few things using call-by-reference.
 
 'ImageOpenShowImageInlineBefore': Call potential extension just before showing
 the image on an image page.
-$imagePage: ImagePage object ($this)
-$output: $wgOut
+&$imagePage: ImagePage object ($this)
+&$output: $wgOut
 
 'ImagePageAfterImageLinks': Called after the image links section on an image
 page is built.
@@ -1616,7 +1623,7 @@ $logInfo: Array of information
 'ImportHandlePageXMLTag': When parsing a XML tag in a page.
 Return false to stop further processing of the tag
 $reader: XMLReader object
-$pageInfo: Array of information
+&$pageInfo: Array of information
 
 'ImportHandleRevisionXMLTag': When parsing a XML tag in a page revision.
 Return false to stop further processing of the tag
@@ -1643,11 +1650,11 @@ $context: IContextSource object
 &$pageInfo: Array of information
 
 'InitializeArticleMaybeRedirect': MediaWiki check to see if title is a redirect.
-$title: Title object for the current page
-$request: WebRequest
-$ignoreRedirect: boolean to skip redirect check
-$target: Title/string of redirect target
-$article: Article object
+&$title: Title object for the current page
+&$request: WebRequest
+&$ignoreRedirect: boolean to skip redirect check
+&$target: Title/string of redirect target
+&$article: Article object
 
 'InternalParseBeforeLinks': during Parser's internalParse method before links
 but after nowiki/noinclude/includeonly/onlyinclude and other processings.
@@ -1680,11 +1687,11 @@ Callee may modify $url and $query, URL will be constructed as $url . $query
 $rc: RecentChange object that triggered url generation
 
 'IsFileCacheable': Override the result of Article::isFileCacheable() (if true)
-$article: article (object) being checked
+&$article: article (object) being checked
 
-'IsTrustedProxy': Override the result of wfIsTrustedProxy()
-$ip: IP being check
-$result: Change this value to override the result of wfIsTrustedProxy()
+'IsTrustedProxy': Override the result of IP::isTrustedProxy()
+&$ip: IP being check
+&$result: Change this value to override the result of IP::isTrustedProxy()
 
 'IsUploadAllowedFromUrl': Override the result of UploadFromUrl::isAllowedUrl()
 $url: URL used to upload from
@@ -1707,7 +1714,7 @@ $code: The language code or the language we're looking for a messages file for
 'LanguageGetMagic': DEPRECATED! Use $magicWords in a file listed in
 $wgExtensionMessagesFiles instead.
 Use this to define synonyms of magic words depending of the language
-$magicExtensions: associative array of magic words synonyms
+&$magicExtensions: associative array of magic words synonyms
 $lang: language code (string)
 
 'LanguageGetNamespaces': Provide custom ordering for namespaces or
@@ -1718,7 +1725,7 @@ CanonicalNamespaces for that.
 'LanguageGetSpecialPageAliases': DEPRECATED! Use $specialPageAliases in a file
 listed in $wgExtensionMessagesFiles instead.
 Use to define aliases of special pages names depending of the language
-$specialPageAliases: associative array of magic words synonyms
+&$specialPageAliases: associative array of magic words synonyms
 $lang: language code (string)
 
 'LanguageGetTranslatedLanguageNames': Provide translated language names.
@@ -1812,15 +1819,15 @@ including delete and insert, has completed for all link tables
 &$tags: The list of tags.
 
 'LoadExtensionSchemaUpdates': Called during database installation and updates.
-&$updater: A DatabaseUpdater subclass
+$updater: A DatabaseUpdater subclass
 
 'LocalFile::getHistory': Called before file history query performed.
-$file: the File object
-$tables: tables
-$fields: select fields
-$conds: conditions
-$opts: query options
-$join_conds: JOIN conditions
+&$file: the File object
+&$tables: tables
+&$fields: select fields
+&$conds: conditions
+&$opts: query options
+&$join_conds: JOIN conditions
 
 'LocalFilePurgeThumbnails': Called before thumbnails for a local file a purged.
 $file: the File object
@@ -1938,7 +1945,7 @@ Special:LonelyPages.
 &$joinConds: join conditions for the query
 
 'MagicWordwgVariableIDs': When defining new magic words IDs.
-$variableIDs: array of strings
+&$variableIDs: array of strings
 
 'MaintenanceRefreshLinksInit': before executing the refreshLinks.php maintenance
 script.
@@ -1954,17 +1961,17 @@ $out: The OutputPage which called the hook, can be used to get the real title.
 
 'MarkPatrolled': Before an edit is marked patrolled.
 $rcid: ID of the revision to be marked patrolled
-$user: the user (object) marking the revision as patrolled
+&$user: the user (object) marking the revision as patrolled
 $wcOnlySysopsCanPatrol: config setting indicating whether the user needs to be a
   sysop in order to mark an edit patrolled.
-$auto true if the edit is being marked as patrolled automatically
+$auto: true if the edit is being marked as patrolled automatically
 
 'MarkPatrolledComplete': After an edit is marked patrolled.
 $rcid: ID of the revision marked as patrolled
-$user: user (object) who marked the edit patrolled
+&$user: user (object) who marked the edit patrolled
 $wcOnlySysopsCanPatrol: config setting indicating whether the user must be a
   sysop to patrol the edit.
-$auto true if the edit is being marked as patrolled automatically
+$auto: true if the edit is being marked as patrolled automatically
 
 'MediaWikiPerformAction': Override MediaWiki::performAction(). Use this to do
 something completely different, after the basic globals have been set up, but
@@ -1989,7 +1996,7 @@ $text: new contents of the page.
 
 'MessagesPreLoad': When loading a message from the database.
 $title: title of the message (string)
-$message: value (string), change it to the message you want to define
+&$message: value (string), change it to the message you want to define
 
 'MimeMagicGuessFromContent': Allows MW extensions guess the MIME by content.
 $mimeMagic: Instance of MimeMagic.
@@ -2039,7 +2046,7 @@ $status: Status object to pass error messages to
 '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
+&$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().
 
@@ -2072,7 +2079,7 @@ displayed.
 return false to omit the line from RecentChanges and Watchlist special pages.
 &$changeslist: The OldChangesList instance.
 &$s: HTML of the form "<li>...</li>" containing one RC entry.
-&$rc: The RecentChange object.
+$rc: The RecentChange object.
 &$classes: array of css classes for the <li> element
 
 'OpenSearchUrls': Called when constructing the OpenSearch description XML. Hooks
@@ -2092,13 +2099,13 @@ $parserOutput: ParserOutput resulting from rendering the page.
 
 'OtherBlockLogLink': Get links to the block log from extensions which blocks
 users and/or IP addresses too.
-$otherBlockLink: An array with links to other block logs
+&$otherBlockLink: An array with links to other block logs
 $ip: The requested IP address or username
 
 'OutputPageBeforeHTML': A page has been processed by the parser and the
 resulting HTML is about to be displayed.
-$parserOutput: the parserOutput (object) that corresponds to the page
-$text: the text that will be displayed, in HTML (string)
+&$parserOutput: the parserOutput (object) that corresponds to the page
+&$text: the text that will be displayed, in HTML (string)
 
 'OutputPageBodyAttributes': Called when OutputPage::headElement is creating the
 body tag to allow for extensions to add attributes to the body of the page they
@@ -2116,14 +2123,14 @@ since the last visit.
 'OutputPageMakeCategoryLinks': Links are about to be generated for the page's
 categories. Implementations should return false if they generate the category
 links, so the default link generation is skipped.
-$out: OutputPage instance (object)
+&$out: OutputPage instance (object)
 $categories: associative array, keys are category names, values are category
   types ("normal" or "hidden")
-$links: array, intended to hold the result. Must be an associative array with
+&$links: array, intended to hold the result. Must be an associative array with
   category types as keys and arrays of HTML links as values.
 
 'OutputPageParserOutput': after adding a parserOutput to $wgOut
-$out: OutputPage instance (object)
+&$out: OutputPage instance (object)
 $parserOutput: parserOutput instance being added in $out
 
 'PageContentInsertComplete': After a new article is created.
@@ -2167,7 +2174,7 @@ $status: Status object about to be returned by doEditContent()
 $baseRevId: the rev ID (or false) this edit was based on
 
 'PageHistoryBeforeList': When a history page list is about to be constructed.
-$article: the article that the history is loading for
+&$article: the article that the history is loading for
 $context: RequestContext object
 
 'PageHistoryLineEnding': Right before the end <li> is added to a history line.
@@ -2185,8 +2192,8 @@ $result: a ResultWrapper representing the query result
 
 'PageHistoryPager::getQueryInfo': when a history pager query parameter set is
 constructed.
-$pager: the pager
-$queryInfo: the query parameters
+&$pager: the pager
+&$queryInfo: the query parameters
 
 'PageRenderingHash': Alter the parser cache option hash key. A parser extension
 which depends on user options should install this hook and append its values to
@@ -2203,39 +2210,39 @@ $user: User (object) for the user who is viewing.
 
 'ParserAfterParse': Called from Parser::parse() just after the call to
 Parser::internalParse() returns.
-$parser: parser object
-$text: text being parsed
-$stripState: stripState used (object)
+&$parser: parser object
+&$text: text being parsed
+&$stripState: stripState used (object)
 
 'ParserAfterStrip': Called at end of parsing time.
 TODO: No more strip, deprecated ?
-$parser: parser object
-$text: text being parsed
-$stripState: stripState used (object)
+&$parser: parser object
+&$text: text being parsed
+&$stripState: stripState used (object)
 
 'ParserAfterTidy': Called after Parser::tidy() in Parser::parse()
-$parser: Parser object being used
-$text: text that will be returned
+&$parser: Parser object being used
+&$text: text that will be returned
 
 'ParserAfterUnstrip': Called after the first unstripGeneral() in
 Parser::internalParseHalfParsed()
-$parser: Parser object being used
-$text: text that will be returned
+&$parser: Parser object being used
+&$text: text that will be returned
 
 'ParserBeforeInternalParse': Called at the beginning of Parser::internalParse().
-$parser: Parser object
-$text: text to parse
-$stripState: StripState instance being used
+&$parser: Parser object
+&$text: text to parse
+&$stripState: StripState instance being used
 
 'ParserBeforeStrip': Called at start of parsing time.
 TODO: No more strip, deprecated ?
-$parser: parser object
-$text: text being parsed
-$stripState: stripState used (object)
+&$parser: parser object
+&$text: text being parsed
+&$stripState: stripState used (object)
 
 'ParserBeforeTidy': Called before tidy and custom tags replacements.
-$parser: Parser object being used
-$text: actual text
+&$parser: Parser object being used
+&$text: actual text
 
 'ParserCacheSaveComplete': Called after a ParserOutput has been committed to
 the parser cache.
@@ -2246,7 +2253,7 @@ $popts: ParserOptions used for generating $parserOutput
 $revId: ID of the revision that was parsed to create $parserOutput
 
 'ParserClearState': Called at the end of Parser::clearState().
-$parser: Parser object being cleared
+&$parser: Parser object being cleared
 
 'ParserCloned': Called when the parser is cloned.
 $parser: Newly-cloned Parser object
@@ -2256,22 +2263,22 @@ $parser: Newly-cloned Parser object
 
 'ParserGetVariableValueSwitch': Called when the parser need the value of a
 custom magic word
-$parser: Parser object
-$varCache: array to store the value in case of multiples calls of the
+&$parser: Parser object
+&$varCache: array to store the value in case of multiples calls of the
   same magic word
-$index: index (string) of the magic
-$ret: value of the magic word (the hook should set it)
-$frame: PPFrame object to use for expanding any template variables
+&$index: index (string) of the magic
+&$ret: value of the magic word (the hook should set it)
+&$frame: PPFrame object to use for expanding any template variables
 
 'ParserGetVariableValueTs': Use this to change the value of the time for the
 {{LOCAL...}} magic word.
-$parser: Parser object
-$time: actual time (timestamp)
+&$parser: Parser object
+&$time: actual time (timestamp)
 
 'ParserGetVariableValueVarCache': use this to change the value of the variable
 cache or return false to not use it.
-$parser: Parser object
-$varCache: variable cache (array)
+&$parser: Parser object
+&$varCache: variable cache (array)
 
 'ParserLimitReport': DEPRECATED! Use ParserLimitReportPrepare and
 ParserLimitReportFormat instead.
@@ -2321,7 +2328,7 @@ $showEditLinks: boolean describing whether this section has an edit link
 
 'ParserTestParser': Called when creating a new instance of Parser in
 tests/parser/parserTest.inc.
-$parser: Parser object created
+&$parser: Parser object created
 
 'ParserTestTables': Alter the list of tables to duplicate when parser tests are
 run. Use when page save hooks require the presence of custom tables to ensure
@@ -2394,9 +2401,9 @@ $offset: number of results to offset from the beginning
 
 'PrefixSearchExtractNamespace': Called if core was not able to extract a
 namespace from the search string so that extensions can attempt it.
-$namespaces: array of int namespace keys to search in (change this if you can
+&$namespaces: array of int namespace keys to search in (change this if you can
   extract namespaces)
-$search: search term (replace this with term without the namespace if you can
+&$search: search term (replace this with term without the namespace if you can
   extract one)
 
 'PrefsEmailAudit': Called when user changes their email address.
@@ -2412,7 +2419,7 @@ $error: error (string) 'badretype', 'wrongpassword', 'error' or 'success'
 'ProtectionForm::buildForm': Called after all protection type fieldsets are made
 in the form.
 $article: the title being (un)protected
-$output: a string of the form HTML so far
+&$output: a string of the form HTML so far
 
 'ProtectionForm::save': Called when a protection form is submitted.
 $article: the Page being (un)protected
@@ -2436,7 +2443,7 @@ random pages.
 &$text: The text that's going to be the output
 
 'RecentChange_save': Called at the end of RecentChange::save().
-$recentChange: RecentChange object
+&$recentChange: RecentChange object
 
 'RedirectSpecialArticleRedirectParams': Lets you alter the set of parameter
 names such as "oldid" that are preserved when using redirecting special pages
@@ -2594,7 +2601,8 @@ $terms: Search terms, for highlighting
 &$text: Text to use for the link
 $result: The search result
 $terms: The search terms entered
-$page: The SpecialSearch object.
+$page: The SpecialSearch object
+&$query: Query string to be appended to the link
 
 'SidebarBeforeOutput': Allows to edit sidebar just before it is output by skins.
 Warning: This hook is run on each display. You should consider to use
@@ -2715,8 +2723,8 @@ page output.
 &$tpl: QuickTemplate engine object
 
 'SkinTemplatePreventOtherActiveTabs': Use this to prevent showing active tabs.
-$sktemplate: SkinTemplate object
-$res: set to true to prevent active tabs
+&$sktemplate: SkinTemplate object
+&$res: set to true to prevent active tabs
 
 'SkinTemplateTabAction': Override SkinTemplate::tabAction().
 You can either create your own array, or alter the parameters for
@@ -2733,7 +2741,7 @@ $checkEdit: Whether or not the action=edit query should be added if appropriate.
 
 'SkinTemplateToolboxEnd': Called by SkinTemplate skins after toolbox links have
 been rendered (useful for adding more).
-$sk: The QuickTemplate based skin template running the hook.
+&$sk: The QuickTemplate based skin template running the hook.
 $dummy: Called when SkinTemplateToolboxEnd is used from a BaseTemplate skin,
   extensions that add support for BaseTemplateToolbox should watch for this
   dummy parameter with "$dummy=false" in their code and return without echoing
@@ -2741,7 +2749,7 @@ $dummy: Called when SkinTemplateToolboxEnd is used from a BaseTemplate skin,
 
 'SoftwareInfo': Called by Special:Version for returning information about the
 software.
-$software: The array of software in format 'name' => 'version'. See
+&$software: The array of software in format 'name' => 'version'. See
   SpecialVersion::softwareInformation().
 
 'SpecialBlockModifyFormFields': Add more fields to Special:Block
@@ -2756,27 +2764,27 @@ $sp: SpecialPage instance, providing context
 'SpecialListusersDefaultQuery': Called right before the end of
 UsersPager::getDefaultQuery().
 $pager: The UsersPager instance
-$query: The query array to be returned
+&$query: The query array to be returned
 
 'SpecialListusersFormatRow': Called right before the end of
 UsersPager::formatRow().
-$item: HTML to be returned. Will be wrapped in <li></li> after the hook finishes
+&$item: HTML to be returned. Will be wrapped in <li></li> after the hook finishes
 $row: Database row object
 
 'SpecialListusersHeader': Called before closing the <fieldset> in
 UsersPager::getPageHeader().
 $pager: The UsersPager instance
-$out: The header HTML
+&$out: The header HTML
 
 'SpecialListusersHeaderForm': Called before adding the submit button in
 UsersPager::getPageHeader().
 $pager: The UsersPager instance
-$out: The header HTML
+&$out: The header HTML
 
 'SpecialListusersQueryInfo': Called right before the end of.
 UsersPager::getQueryInfo()
 $pager: The UsersPager instance
-$query: The query array to be returned
+&$query: The query array to be returned
 
 'SpecialLogAddLogSearchRelations': Add log relations to the current log
 $type: String of the log type
@@ -2784,9 +2792,9 @@ $request: WebRequest object for getting the value provided by the current user
 &$qc: Array for query conditions to add
 
 'SpecialMovepageAfterMove': Called after moving a page.
-$movePage: MovePageForm object
-$oldTitle: old title (object)
-$newTitle: new title (object)
+&$movePage: MovePageForm object
+&$oldTitle: old title (object)
+&$newTitle: new title (object)
 
 'SpecialNewpagesConditions': Called when building sql query for
 Special:NewPages.
@@ -2805,7 +2813,7 @@ $special: the special page object
 
 'SpecialPage_initList': Called when setting up SpecialPageFactory::$list, use
 this hook to remove a core special page or conditionally register special pages.
-$list: list (array) of core special pages
+&$list: list (array) of core special pages
 
 'SpecialPageAfterExecute': Called after SpecialPage::execute.
 $special: the SpecialPage object
@@ -2821,7 +2829,7 @@ $name: name of the special page
 
 'SpecialPasswordResetOnSubmit': When executing a form submission on
 Special:PasswordReset.
-$users: array of User objects.
+&$users: array of User objects.
 $data: array of data submitted by the user
 &$error: string, error code (message key) used to describe to error (out
   parameter). The hook needs to return false when setting this, otherwise it
@@ -2929,7 +2937,7 @@ $context: IContextSource object
 
 'SpecialUploadComplete': Called after successfully uploading a file from
 Special:Upload.
-$form: The SpecialUpload object
+&$form: The SpecialUpload object
 
 'SpecialVersionVersionUrl': Called when building the URL for Special:Version.
 $wgVersion: Current $wgVersion for you to use
@@ -3000,7 +3008,7 @@ $title: Title object that is being checked
 'TitleIsCssOrJsPage': DEPRECATED! Use ContentHandlerDefaultModelFor instead.
 Called when determining if a page is a CSS or JS page.
 $title: Title object that is being checked
-$result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page.
+&$result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page.
   Hooks may change this value to override the return value of
   Title::isCssOrJsPage().
 
@@ -3008,7 +3016,7 @@ $result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page.
 that this hook is not called for interwiki pages or pages in immovable
 namespaces: for these, isMovable() always returns false.
 $title: Title object that is being checked
-$result: Boolean; whether MediaWiki currently thinks this page is movable.
+&$result: Boolean; whether MediaWiki currently thinks this page is movable.
   Hooks may change this value to override the return value of
   Title::isMovable().
 
@@ -3016,7 +3024,7 @@ $result: Boolean; whether MediaWiki currently thinks this page is movable.
 Called when determining if a page is a wikitext or should
 be handled by separate handler (via ArticleViewCustom).
 $title: Title object that is being checked
-$result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
+&$result: Boolean; whether MediaWiki currently thinks this is a wikitext page.
   Hooks may change this value to override the return value of
   Title::isWikitextPage()
 
@@ -3025,7 +3033,15 @@ $old: old title
 $nt: new title
 $user: user who does the move
 
-'TitleMoveComplete': After moving an article (title).
+'TitleMoveComplete': After moving an article (title), post-commit.
+&$old: old title
+&$nt: new title
+&$user: user who did the move
+$pageid: database ID of the page that's been moved
+$redirid: database ID of the created redirect
+$reason: reason for the move
+
+'TitleMoveCompleting': After moving an article (title), pre-commit.
 $old: old title
 $nt: new title
 $user: user who did the move
@@ -3085,19 +3101,19 @@ $action: action name
 $article: article "acted on"
 
 'UnwatchArticle': Before a watch is removed from an article.
-$user: user watching
-$page: WikiPage object to be removed
+&$user: user watching
+&$page: WikiPage object to be removed
 &$status: Status object to be returned if the hook returns false
 
 'UnwatchArticleComplete': After a watch is removed from an article.
 $user: user that watched
-$page: WikiPage object that was watched
+&$page: WikiPage object that was watched
 
 'UpdateUserMailerFormattedPageStatus': Before notification email gets sent.
-$formattedPageStatus: list of valid page states
+&$formattedPageStatus: list of valid page states
 
 'UploadComplete': Upon completion of a file upload.
-$uploadBase: UploadBase (or subclass) object. File can be accessed by
+&$uploadBase: UploadBase (or subclass) object. File can be accessed by
   $uploadBase->getLocalFile().
 
 'UploadCreateFromRequest': When UploadBase::createFromRequest has been called.
@@ -3109,16 +3125,16 @@ poke at member variables like $mUploadDescription before the file is saved. Do
 not use this hook to break upload processing. This will return the user to a
 blank form with no error message; use UploadVerification and UploadVerifyFile
 instead.
-$form: UploadForm object
+&$form: UploadForm object
 
 'UploadForm:initial': Before the upload form is generated. You might set the
 member-variables $uploadFormTextTop and $uploadFormTextAfterSummary to inject
 text (HTML) either before or after the editform.
-$form: UploadForm object
+&$form: UploadForm object
 
 'UploadFormInitDescriptor': After the descriptor for the upload form as been
 assembled.
-$descriptor: (array) the HTMLForm descriptor
+&$descriptor: (array) the HTMLForm descriptor
 
 'UploadFormSourceDescriptors': after the standard source inputs have been
 added to the descriptor
@@ -3145,9 +3161,9 @@ $mime: (string) The uploaded file's MIME type, as detected by MediaWiki.
 
 'User::mailPasswordInternal': before creation and mailing of a user's new
 temporary password
-$user: the user who sent the message out
-$ip: IP of the user who sent the message out
-$u: the account whose new password will be set
+&$user: the user who sent the message out
+&$ip: IP of the user who sent the message out
+&$u: the account whose new password will be set
 
 'UserAddGroup': Called when adding a group; return false to override
 stock group addition.
@@ -3161,26 +3177,26 @@ $res: database result used to create the object
 
 'userCan': To interrupt/advise the "user can do X to Y article" check. If you
 want to display an error message, try getUserPermissionsErrors.
-$title: Title object being checked against
-$user: Current user object
+&$title: Title object being checked against
+&$user: Current user object
 $action: Action being checked
-$result: Pointer to result returned if hook returns false. If null is returned,
+&$result: Pointer to result returned if hook returns false. If null is returned,
   userCan checks are continued by internal code.
 
 'UserCanSendEmail': To override User::canSendEmail() permission check.
-$user: User (object) whose permission is being checked
+&$user: User (object) whose permission is being checked
 &$canSend: bool set on input, can override on output
 
 'UserClearNewTalkNotification': Called when clearing the "You have new
 messages!" message, return false to not delete it.
-$user: User (object) that will clear the message
+&$user: User (object) that will clear the message
 $oldid: ID of the talk page revision being viewed (0 means the most recent one)
 
 'UserCreateForm': change to manipulate the login form
-$template: SimpleTemplate instance for the form
+&$template: SimpleTemplate instance for the form
 
 'UserEffectiveGroups': Called in User::getEffectiveGroups().
-$user: User to get groups for
+&$user: User to get groups for
 &$groups: Current effective groups
 
 'UserGetAllRights': After calculating a list of all available rights.
@@ -3277,18 +3293,18 @@ $user: User object
 $user: User object for the logged-in user
 
 'UserLoginComplete': After a user has logged in.
-$user: the user object that was created on login
-$inject_html: Any HTML to inject after the "logged in" message.
+&$user: the user object that was created on login
+&$inject_html: Any HTML to inject after the "logged in" message.
 
 'UserLoginForm': change to manipulate the login form
-$template: SimpleTemplate instance for the form
+&$template: SimpleTemplate instance for the form
 
 'UserLogout': Before a user logs out.
-$user: the user object that is about to be logged out
+&$user: the user object that is about to be logged out
 
 'UserLogoutComplete': After a user has logged out.
-$user: the user object _after_ logout (won't have name, ID, etc.)
-$inject_html: Any HTML to inject after the "logged out" message.
+&$user: the user object _after_ logout (won't have name, ID, etc.)
+&$inject_html: Any HTML to inject after the "logged out" message.
 $oldName: name of the user before logout (string)
 
 'UserMailerChangeReturnPath': Called to generate a VERP return address
@@ -3298,7 +3314,7 @@ $to: Array of MailAddress objects for the recipients
 
 'UserMailerSplitTo': Called in UserMailer::send() to give extensions a chance
 to split up an email with multiple the To: field into separate emails.
-$to: array of MailAddress objects; unset the ones which should be mailed separately
+&$to: array of MailAddress objects; unset the ones which should be mailed separately
 
 'UserMailerTransformContent': Called in UserMailer::send() to change email contents.
 Extensions can block sending the email by returning false and setting $error.
@@ -3338,8 +3354,8 @@ $resetKinds: array containing the kinds of preferences to reset
 
 'UserRetrieveNewTalks': Called when retrieving "You have new messages!"
 message(s).
-$user: user retrieving new talks messages
-$talks: array of new talks page(s)
+&$user: user retrieving new talks messages
+&$talks: array of new talks page(s)
 
 'UserRights': DEPRECATED! Use UserGroupsChanged instead.
 After a user's group memberships are changed.
@@ -3387,13 +3403,13 @@ used to alter the SQL query which gets the list of wanted pages.
 &$query: query array, see QueryPage::getQueryInfo() for format documentation
 
 'WatchArticle': Before a watch is added to an article.
-$user: user that will watch
-$page: WikiPage object to be watched
+&$user: user that will watch
+&$page: WikiPage object to be watched
 &$status: Status object to be returned if the hook returns false
 
 'WatchArticleComplete': After a watch is added to an article.
-$user: user that watched
-$page: WikiPage object watched
+&$user: user that watched
+&$page: WikiPage object watched
 
 'WatchlistEditorBeforeFormRender': Before building the Special:EditWatchlist
 form, used to manipulate the list of pages or preload data based on that list.
@@ -3428,7 +3444,7 @@ run a MediaWiki cli script.
 
 'wgQueryPages': Called when initialising list of QueryPage subclasses, use this
 to add new query pages to be updated with maintenance/updateSpecialPages.php.
-$qp: The list of QueryPages
+&$qp: The list of QueryPages
 
 'WhatLinksHereProps': Allows annotations to be added to WhatLinksHere
 $row: The DB row of the entry.
@@ -3459,7 +3475,7 @@ $title: The title of the page.
 
 'XmlDumpWriterWriteRevision': Called at the end of a revision in an XML dump, to
 add extra metadata.
-$obj: The XmlDumpWriter object.
+&$obj: The XmlDumpWriter object.
 &$out: The text being output.
 $row: The database row for the revision.
 $text: The revision text.
index ad2307f..55fa725 100644 (file)
@@ -232,14 +232,6 @@ Special:Recentchanges (feed):
        Special:Recentchanges?action=purge&feed=atom,
        but note need $wgGroupPermissions[...]['purge'] permission.
 
-Statistics:
-       controlled by: $wgStatsMethod
-       key: $wgDBname:stats:$key
-       ex: wikibd:stats:request_with_session
-       stores: counter for statistics (see maintenance/showCacheStats.php script)
-       expiry: none (?)
-       cleared by: maintenance/clearCacheStats.php script
-
 User:
        key: $wgDBname:user:id:$sId
        ex: wikidb:user:id:51
index 34bb65f..db989a4 100644 (file)
@@ -175,14 +175,14 @@ class AjaxResponse {
                }
 
                if ( $this->mCacheDuration ) {
-                       # If squid caches are configured, tell them to cache the response,
-                       # and tell the client to always check with the squid. Otherwise,
+                       # If CDN caches are configured, tell them to cache the response,
+                       # and tell the client to always check with the CDN. Otherwise,
                        # tell the client to use a cached copy, without a way to purge it.
 
                        if ( $this->mConfig->get( 'UseSquid' ) ) {
                                # Expect explicit purge of the proxy cache, but require end user agents
                                # to revalidate against the proxy on each visit.
-                               # Surrogate-Control controls our Squid, Cache-Control downstream caches
+                               # Surrogate-Control controls our CDN, Cache-Control downstream caches
 
                                if ( $this->mConfig->get( 'UseESI' ) ) {
                                        header( 'Surrogate-Control: max-age=' . $this->mCacheDuration . ', content="ESI/1.0"' );
index 5dee23e..4729f50 100644 (file)
@@ -308,8 +308,8 @@ class Block {
                        if ( $block->getType() == self::TYPE_RANGE ) {
                                # This is the number of bits that are allowed to vary in the block, give
                                # or take some floating point errors
-                               $end = wfBaseconvert( $block->getRangeEnd(), 16, 10 );
-                               $start = wfBaseconvert( $block->getRangeStart(), 16, 10 );
+                               $end = Wikimedia\base_convert( $block->getRangeEnd(), 16, 10 );
+                               $start = Wikimedia\base_convert( $block->getRangeStart(), 16, 10 );
                                $size = log( $end - $start + 1, 2 );
 
                                # This has the nice property that a /32 block is ranked equally with a
@@ -681,10 +681,10 @@ class Block {
        public static function isWhitelistedFromAutoblocks( $ip ) {
                // Try to get the autoblock_whitelist from the cache, as it's faster
                // than getting the msg raw and explode()'ing it.
-
-               $lines = ObjectCache::getMainWANInstance()->getWithSetCallback(
+               $cache = ObjectCache::getMainWANInstance();
+               $lines = $cache->getWithSetCallback(
                        wfMemcKey( 'ipb', 'autoblock', 'whitelist' ),
-                       86400,
+                       $cache::TTL_DAY,
                        function () {
                                return explode( "\n",
                                        wfMessage( 'autoblock_whitelist' )->inContentLanguage()->plain() );
index 1b05f33..3860172 100644 (file)
@@ -327,7 +327,7 @@ class Category {
                        array( 'LOCK IN SHARE MODE' )
                );
 
-               if ( $this->mId ) {
+               if ( $this->mID ) {
                        # The category row already exists, so do a plain UPDATE instead
                        # of INSERT...ON DUPLICATE KEY UPDATE to avoid creating a gap
                        # in the cat_id sequence. The row may or may not be "affected".
index 40e8627..7fa5c6e 100644 (file)
@@ -508,7 +508,7 @@ class IcuCollation extends Collation {
 
                // Save to cache
                $this->firstLetterData = $data;
-               $cache->set( $cacheKey, $data, 86400 * 7 /* 1 week */ );
+               $cache->set( $cacheKey, $data, $cache::TTL_WEEK );
                return $data;
        }
 
index 189ce42..39b133b 100644 (file)
@@ -535,6 +535,12 @@ $wgUseInstantCommons = false;
  */
 $wgForeignUploadTargets = array();
 
+/**
+ * Cross-wiki upload A/B test configuration.
+ */
+$wgForeignUploadTestEnabled = false;
+$wgForeignUploadTestDefault = 1;
+
 /**
  * File backend structure configuration.
  *
@@ -805,7 +811,7 @@ $wgRepositoryBaseUrl = "https://commons.wikimedia.org/wiki/File:";
  * such as odt or doc, and untrusted users are allowed to upload files, then
  * your wiki will be vulnerable to cross-site request forgery (CSRF).
  */
-$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg' );
+$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg', 'webp' );
 
 /**
  * Files with these extensions will never be allowed as uploads.
@@ -1493,7 +1499,7 @@ $wgPasswordSenderName = 'MediaWiki Mail';
  * It might be necessary to adapt the address or to set it equal
  * to the $wgEmergencyContact address.
  */
-$wgNoReplyAddress = 'reply@not.possible';
+$wgNoReplyAddress = 'reply@not.possible.invalid';
 
 /**
  * Set to true to enable the e-mail basic features:
@@ -2211,8 +2217,8 @@ $wgObjectCaches = array(
        CACHE_DB => array( 'class' => 'SqlBagOStuff', 'loggroup' => 'SQLBagOStuff' ),
 
        CACHE_ANYTHING => array( 'factory' => 'ObjectCache::newAnything' ),
-       CACHE_ACCEL => array( 'factory' => 'ObjectCache::newAccelerator' ),
-       CACHE_MEMCACHED => array( 'factory' => 'ObjectCache::newMemcached', 'loggroup' => 'memcached' ),
+       CACHE_ACCEL => array( 'factory' => 'ObjectCache::getLocalServerInstance' ),
+       CACHE_MEMCACHED => array( 'class' => 'MemcachedPhpBagOStuff', 'loggroup' => 'memcached' ),
 
        'db-replicated' => array(
                'class'       => 'ReplicatedBagOStuff',
@@ -2263,7 +2269,8 @@ $wgMainWANCache = false;
  * the value is an associative array of parameters. The "cacheId" parameter is
  * a cache identifier from $wgObjectCaches. The "relayerConfig" parameter is an
  * array used to construct an EventRelayer object. The "pool" parameter is a
- * string that is used as a PubSub channel prefix.
+ * string that is used as a PubSub channel prefix. The "loggroup" parameter
+ * controls where log events are sent.
  *
  * @since 1.26
  */
@@ -2357,8 +2364,15 @@ $wgMemCachedPersistent = false;
 $wgMemCachedTimeout = 500000;
 
 /**
- * Set this to true to make a local copy of the message cache, for use in
- * addition to memcached. The files will be put in $wgCacheDirectory.
+ * Set this to true to maintain a copy of the message cache on the local server.
+ *
+ * This layer of message cache is in addition to the one configured by $wgMessageCacheType.
+ *
+ * The local copy is put in APC. If APC is not installed, this setting does nothing.
+ *
+ * Note that this is about the message cache, which stores interface messages
+ * maintained as wiki pages. This is separate from the localisation cache for interface
+ * messages provided by the software, which is configured by $wgLocalisationCacheConf.
  */
 $wgUseLocalMessageCache = false;
 
@@ -2432,10 +2446,8 @@ $wgStyleVersion = '303';
 
 /**
  * This will cache static pages for non-logged-in users to reduce
- * database traffic on public sites.
- * Automatically sets $wgShowIPinHeader = false
- * ResourceLoader requests to default language and skins are cached
- * as well as single module requests.
+ * database traffic on public sites. ResourceLoader requests to default
+ * language and skins are cached as well as single module requests.
  */
 $wgUseFileCache = false;
 
@@ -2528,7 +2540,7 @@ $wgExtensionInfoMTime = false;
 /** @} */ # end of cache settings
 
 /************************************************************************//**
- * @name   HTTP proxy (Squid) settings
+ * @name   HTTP proxy (CDN) settings
  *
  * Many of these settings apply to any HTTP proxy used in front of MediaWiki,
  * although they are referred to as Squid settings for historical reasons.
@@ -2541,7 +2553,7 @@ $wgExtensionInfoMTime = false;
  */
 
 /**
- * Enable/disable Squid.
+ * Enable/disable CDN.
  * See https://www.mediawiki.org/wiki/Manual:Squid_caching
  */
 $wgUseSquid = false;
@@ -2569,7 +2581,7 @@ $wgUseKeyHeader = false;
 $wgVaryOnXFP = false;
 
 /**
- * Internal server name as known to Squid, if different.
+ * Internal server name as known to CDN, if different.
  *
  * @par Example:
  * @code
@@ -2581,7 +2593,7 @@ $wgInternalServer = false;
 /**
  * Cache TTL for the CDN sent as s-maxage (without ESI) or
  * Surrogate-Control (with ESI). Without ESI, you should strip
- * out s-maxage in the Squid config.
+ * out s-maxage in the CDN config.
  *
  * 18000 seconds = 5 hours, more cache hits with 2678400 = 31 days.
  */
@@ -2594,6 +2606,15 @@ $wgSquidMaxage = 18000;
  */
 $wgCdnMaxageLagged = 30;
 
+/**
+ * If set, any SquidPurge call on a URL or URLs will send a second purge no less than
+ * this many seconds later via the job queue. This requires delayed job support.
+ * This should be safely higher than the 'max lag' value in $wgLBFactoryConf.
+ *
+ * @since 1.27
+ */
+$wgCdnReboundPurgeDelay = 0;
+
 /**
  * Default maximum age for raw CSS/JS accesses
  *
@@ -3154,13 +3175,6 @@ $wgWellFormedXml = true;
  */
 $wgXhtmlNamespaces = array();
 
-/**
- * Show IP address, for non-logged in users. It's necessary to switch this off
- * for some forms of caching.
- * @warning Will disable file cache.
- */
-$wgShowIPinHeader = true;
-
 /**
  * Site notice shown at the top of each page
  *
@@ -3396,14 +3410,14 @@ $wgMangleFlashPolicy = true;
 /** @} */ # End of output format settings }
 
 /*************************************************************************//**
- * @name   Resource loader settings
+ * @name   ResourceLoader settings
  * @{
  */
 
 /**
  * Client-side resource modules.
  *
- * Extensions should add their resource loader module definitions
+ * Extensions should add their ResourceLoader module definitions
  * to the $wgResourceModules variable.
  *
  * @par Example:
@@ -3528,7 +3542,7 @@ $wgResourceLoaderSources = array();
 $wgResourceBasePath = null;
 
 /**
- * Maximum time in seconds to cache resources served by the resource loader.
+ * Maximum time in seconds to cache resources served by ResourceLoader.
  * Used to set last modified headers (max-age/s-maxage).
  *
  * Following options to distinguish:
@@ -3735,7 +3749,7 @@ $wgResourceLoaderStorageVersion = 1;
  */
 $wgAllowSiteCSSOnRestrictedPages = false;
 
-/** @} */ # End of resource loader settings }
+/** @} */ # End of ResourceLoader settings }
 
 /*************************************************************************//**
  * @name   Page title and interwiki link settings
@@ -4334,6 +4348,21 @@ $wgActiveUserDays = 30;
  * @{
  */
 
+/**
+ * Central ID lookup providers
+ * Key is the provider ID, value is a specification for ObjectFactory
+ * @since 1.27
+ */
+$wgCentralIdLookupProviders = array(
+       'local' => array( 'class' => 'LocalIdLookup' ),
+);
+
+/**
+ * Central ID lookup provider to use by default
+ * @var string
+ */
+$wgCentralIdLookupProvider = 'local';
+
 /**
  * Password policy for local wiki users. A user's effective policy
  * is the superset of all policy statements from the policies for the
@@ -4351,6 +4380,10 @@ $wgActiveUserDays = 30;
  *     - PasswordCannotMatchUsername - Password cannot match username to
  *     - PasswordCannotMatchBlacklist - Username/password combination cannot
  *             match a specific, hardcoded blacklist.
+ *     - PasswordCannotBePopular - Blacklist passwords which are known to be
+ *             commonly chosen. Set to integer n to ban the top n passwords.
+ *             If you want to ban all common passwords on file, use the
+ *             PHP_INT_MAX constant.
  * @since 1.26
  */
 $wgPasswordPolicy = array(
@@ -4359,11 +4392,13 @@ $wgPasswordPolicy = array(
                        'MinimalPasswordLength' => 8,
                        'MinimumPasswordLengthToLogin' => 1,
                        'PasswordCannotMatchUsername' => true,
+                       'PasswordCannotBePopular' => 25,
                ),
                'sysop' => array(
                        'MinimalPasswordLength' => 8,
                        'MinimumPasswordLengthToLogin' => 1,
                        'PasswordCannotMatchUsername' => true,
+                       'PasswordCannotBePopular' => 25,
                ),
                'bot' => array(
                        'MinimalPasswordLength' => 8,
@@ -4383,6 +4418,7 @@ $wgPasswordPolicy = array(
                'PasswordCannotMatchUsername' => 'PasswordPolicyChecks::checkPasswordCannotMatchUsername',
                'PasswordCannotMatchBlacklist' => 'PasswordPolicyChecks::checkPasswordCannotMatchBlacklist',
                'MaximalPasswordLength' => 'PasswordPolicyChecks::checkMaximalPasswordLength',
+               'PasswordCannotBePopular' => 'PasswordPolicyChecks::checkPopularPasswordBlacklist'
        ),
 );
 
@@ -4576,6 +4612,7 @@ $wgDefaultUserOptions = array(
        'watchlisthideown' => 0,
        'watchlisthidepatrolled' => 0,
        'watchlisthidecategorization' => 1,
+       'watchlistreloadautomatically' => 0,
        'watchmoves' => 0,
        'watchrollback' => 0,
        'wllimit' => 250,
@@ -5202,90 +5239,88 @@ $wgApplyIpBlocksToXff = false;
  * @par Example:
  * To set a generic maximum of 4 hits in 60 seconds:
  * @code
- * $wgRateLimits = array( 4, 60 );
+ *     $wgRateLimits = array( 4, 60 );
  * @endcode
  *
- * You could also limit per action and then type of users. See the inline
- * code for a template to use.
- *
- * This option set is experimental and likely to change.
+ * @par Example:
+ * You could also limit per action and then type of users.
+ * @code
+ *     $wgRateLimits = array(
+ *         'edit' => array(
+ *             'anon' => array( x, y ), // any and all anonymous edits (aggregate)
+ *             'user' => array( x, y ), // each logged-in user
+ *             'newbie' => array( x, y ), // each new autoconfirmed accounts; overrides 'user'
+ *             'ip' => array( x, y ), // each anon and recent account
+ *             'subnet' => array( x, y ), // ... within a /24 subnet in IPv4 or /64 in IPv6
+ *         )
+ *     )
+ * @endcode
  *
- * @warning Requires memcached.
+ * @warning Requires that $wgMainCacheType is set to something persistent
  */
 $wgRateLimits = array(
+       // Page edits
        'edit' => array(
-               'anon' => null, // for any and all anonymous edits (aggregate)
-               'user' => null, // for each logged-in user
-               'newbie' => null, // for each recent (autoconfirmed) account; overrides 'user'
-               'ip' => null, // for each anon and recent account
-               'subnet' => null, // ... within a /24 subnet in IPv4 or /64 in IPv6
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
+       ),
+       // Page moves
+       'move' => array(
+               'newbie' => array( 2, 120 ),
+               'user' => array( 8, 60 ),
        ),
+       // File uploads
        'upload' => array(
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
        ),
-       'move' => array(
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Page rollbacks
+       'rollback' => array(
+               'user' => array( 10, 60 ),
+               'newbie' => array( 5, 120 )
        ),
-       'mailpassword' => array( // triggering password resets emails
-               'anon' => null,
+       // Triggering password resets emails
+       'mailpassword' => array(
+               'ip' => array( 5, 3600 ),
        ),
-       'emailuser' => array( // emailing other users using MediaWiki
-               'user' => null,
+       // Emailing other users using MediaWiki
+       'emailuser' => array(
+               'ip' => array( 5, 86400 ),
+               'newbie' => array( 5, 86400 ),
+               'user' => array( 20, 86400 ),
        ),
-       'linkpurge' => array( // purges of link tables
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Purging pages
+       'purge' => array(
+               'ip' => array( 30, 60 ),
+               'user' => array( 30, 60 ),
        ),
-       'renderfile' => array( // files rendered via thumb.php or thumb_handler.php
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Purges of link tables
+       'linkpurge' => array(
+               'ip' => array( 30, 60 ),
+               'user' => array( 30, 60 ),
        ),
-       'renderfile-nonstandard' => array( // same as above but for non-standard thumbnails
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Files rendered via thumb.php or thumb_handler.php
+       'renderfile' => array(
+               'ip' => array( 700, 30 ),
+               'user' => array( 700, 30 ),
        ),
-       'stashedit' => array( // stashing edits into cache before save
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Same as above but for non-standard thumbnails
+       'renderfile-nonstandard' => array(
+               'ip' => array( 70, 30 ),
+               'user' => array( 70, 30 ),
        ),
-       'changetag' => array( // adding or removing change tags
-               'user' => null,
-               'newbie' => null,
+       // Stashing edits into cache before save
+       'stashedit' => array(
+               'ip' => array( 30, 60 ),
+               'newbie' => array( 30, 60 ),
        ),
-       'purge' => array( // purging pages
-               'anon' => null,
-               'user' => null,
-               'newbie' => null,
-               'ip' => null,
-               'subnet' => null,
+       // Adding or removing change tags
+       'changetag' => array(
+               'ip' => array( 8, 60 ),
+               'newbie' => array( 8, 60 ),
        ),
 );
 
-/**
- * Set to a filename to log rate limiter hits.
- *
- * @deprecated since 1.23, use $wgDebugLogGroups['ratelimit'] instead
- */
-$wgRateLimitLog = null;
-
 /**
  * Array of IPs which should be excluded from rate limits.
  * This may be useful for whitelisting NAT gateways for conferences, etc.
@@ -5665,79 +5700,6 @@ $wgProfileLimit = 0.0;
  */
 $wgProfileOnly = false;
 
-/**
- * If true, print a raw call tree instead of per-function report
- */
-$wgProfileCallTree = false;
-
-/**
- * Should application server host be put into profiling table
- *
- * @deprecated set $wgProfiler['perhost'] = true instead
- */
-$wgProfilePerHost = null;
-
-/**
- * Host for UDP profiler.
- *
- * The host should be running a daemon which can be obtained from MediaWiki
- * Git at:
- * https://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile
- *
- * @deprecated set $wgProfiler['udphost'] instead
- */
-$wgUDPProfilerHost = null;
-
-/**
- * Port for UDP profiler.
- * @see $wgUDPProfilerHost
- *
- * @deprecated set $wgProfiler['udpport'] instead
- */
-$wgUDPProfilerPort = null;
-
-/**
- * Format string for the UDP profiler. The UDP profiler invokes sprintf() with
- * (profile id, count, cpu, cpu_sq, real, real_sq, entry name, memory) as
- * arguments. You can use sprintf's argument numbering/swapping capability to
- * repeat, re-order or omit fields.
- *
- * @see $wgStatsFormatString
- * @since 1.22
- *
- * @deprecated set $wgProfiler['udpformat'] instead
- */
-$wgUDPProfilerFormatString = null;
-
-/**
- * Destination for wfIncrStats() data...
- * 'cache' to go into the system cache, if enabled (memcached)
- * 'udp' to be sent to the UDP profiler (see $wgUDPProfilerHost)
- * false to disable
- */
-$wgStatsMethod = 'cache';
-
-/**
- * When $wgStatsMethod is 'udp', setting this to a string allows statistics to
- * be aggregated over more than one wiki. The string will be used in place of
- * the DB name in outgoing UDP packets. If this is set to false, the DB name
- * will be used.
- */
-$wgAggregateStatsID = false;
-
-/**
- * When $wgStatsMethod is 'udp', this variable specifies how stats should be
- * formatted. Its value should be a format string suitable for a sprintf()
- * invocation with (id, count, key) arguments, where 'id' is either
- * $wgAggregateStatsID or the DB name, 'count' is the value by which the metric
- * is being incremented, and 'key' is the metric name.
- *
- * @see $wgUDPProfilerFormatString
- * @see $wgAggregateStatsID
- * @since 1.22
- */
-$wgStatsFormatString = "stats/%s - %s 1 1 1 1 %s\n";
-
 /**
  * Destination of statsd metrics.
  *
@@ -5751,15 +5713,13 @@ $wgStatsFormatString = "stats/%s - %s 1 1 1 1 %s\n";
 $wgStatsdServer = false;
 
 /**
- * Prefix for metric names sent to wgStatsdServer.
- *
- * Defaults to "MediaWiki".
+ * Prefix for metric names sent to $wgStatsdServer.
  *
  * @see RequestContext::getStats
  * @see BufferingStatsdDataFactory
  * @since 1.25
  */
-$wgStatsdMetricPrefix = false;
+$wgStatsdMetricPrefix = 'MediaWiki';
 
 /**
  * InfoAction retrieves a list of transclusion links (both to and from).
@@ -6182,7 +6142,14 @@ $wgRCEngines = array(
 );
 
 /**
- * Treat category membership changes as a RecentChange
+ * Treat category membership changes as a RecentChange.
+ * Changes are mentioned in RC for page actions as follows:
+ *   - creation: pages created with categories are mentioned
+ *   - edit: category additions/removals to existing pages are mentioned
+ *   - move: nothing is mentioned (unless templates used depend on the title)
+ *   - deletion: nothing is mentioned
+ *   - undeletion: nothing is mentioned
+ *
  * @since 1.27
  */
 $wgRCWatchCategoryMembership = false;
@@ -6735,8 +6702,11 @@ $wgJobClasses = array(
        'PublishStashedFile' => 'PublishStashedFileJob',
        'ThumbnailRender' => 'ThumbnailRenderJob',
        'recentChangesUpdate' => 'RecentChangesUpdateJob',
-       'refreshLinksPrioritized' => 'RefreshLinksJob', // for cascading protection
+       'refreshLinksPrioritized' => 'RefreshLinksJob',
+       'refreshLinksDynamic' => 'RefreshLinksJob',
        'activityUpdateJob' => 'ActivityUpdateJob',
+       'categoryMembershipChange' => 'CategoryMembershipChangeJob',
+       'cdnPurge' => 'CdnPurgeJob',
        'enqueue' => 'EnqueueJob', // local queue for multi-DC setups
        'null' => 'NullJob'
 );
@@ -7013,8 +6983,8 @@ $wgLogActionsHandlers = array(
        'delete/event' => 'DeleteLogFormatter',
        'delete/restore' => 'DeleteLogFormatter',
        'delete/revision' => 'DeleteLogFormatter',
-       'import/interwiki' => 'LogFormatter',
-       'import/upload' => 'LogFormatter',
+       'import/interwiki' => 'ImportLogFormatter',
+       'import/upload' => 'ImportLogFormatter',
        'managetags/activate' => 'LogFormatter',
        'managetags/create' => 'LogFormatter',
        'managetags/deactivate' => 'LogFormatter',
@@ -7318,6 +7288,13 @@ $wgAPIMaxResultSize = 8388608;
  */
 $wgAPIMaxUncachedDiffs = 1;
 
+/**
+ * Maximum amount of DB lag on a majority of DB slaves to tolerate
+ * before forcing bots to retry any write requests via API errors.
+ * This should be lower than the 'max lag' value in $wgLBFactoryConf.
+ */
+$wgAPIMaxLagThreshold = 7;
+
 /**
  * Log file or URL (TCP or UDP) to log API requests to, or false to disable
  * API request logging
@@ -7762,6 +7739,28 @@ $wgVirtualRestConfig = array(
  */
 $wgSearchRunSuggestedQuery = true;
 
+/**
+ * Where popular password file is located.
+ *
+ * Default in core contains 50,000 most popular. This config
+ * allows you to change which file, in case you want to generate
+ * a password file with > 50000 entries in it.
+ *
+ * @see maintenance/createCommonPasswordCdb.php
+ * @since 1.27
+ * @var string path to file
+ */
+$wgPopularPasswordFile = __DIR__ . '/../serialized/commonpasswords.cdb';
+
+/*
+ * Max time (in seconds) a user-generated transaction can spend in writes.
+ * If exceeded, the transaction is rolled back with an error instead of being committed.
+ *
+ * @var int|bool Disabled if false
+ * @since 1.27
+ */
+$wgMaxUserDBWriteDuration = false;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index b8a0ec0..9a6950e 100644 (file)
@@ -181,7 +181,7 @@ define( 'EDIT_UPDATE', 2 );
 define( 'EDIT_MINOR', 4 );
 define( 'EDIT_SUPPRESS_RC', 8 );
 define( 'EDIT_FORCE_BOT', 16 );
-define( 'EDIT_DEFER_UPDATES', 32 );
+define( 'EDIT_DEFER_UPDATES', 32 ); // Unused since 1.27
 define( 'EDIT_AUTOSUMMARY', 64 );
 /**@}*/
 
index 81f35f9..47912cb 100644 (file)
@@ -201,6 +201,8 @@ class EditPage {
 
        /** @var Article */
        public $mArticle;
+       /** @var WikiPage */
+       private $page;
 
        /** @var Title */
        public $mTitle;
@@ -399,6 +401,7 @@ class EditPage {
         */
        public function __construct( Article $article ) {
                $this->mArticle = $article;
+               $this->page = $article->getPage(); // model object
                $this->mTitle = $article->getTitle();
 
                $this->contentModel = $this->mTitle->getContentModel();
@@ -1002,6 +1005,7 @@ class EditPage {
         * for saving, preview parsing and so on...
         *
         * @param WebRequest $request
+        * @return string|null
         */
        protected function importContentFormData( &$request ) {
                return; // Don't do anything, EditPage already extracted wpTextbox1
@@ -1014,7 +1018,7 @@ class EditPage {
         */
        function initialiseForm() {
                global $wgUser;
-               $this->edittime = $this->mArticle->getTimestamp();
+               $this->edittime = $this->page->getTimestamp();
 
                $content = $this->getContentObject( false ); # TODO: track content object?!
                if ( $content === false ) {
@@ -1098,13 +1102,13 @@ class EditPage {
                                                !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
                                                !$oldrev->isDeleted( Revision::DELETED_TEXT )
                                        ) {
-                                               $content = $this->mArticle->getUndoContent( $undorev, $oldrev );
+                                               $content = $this->page->getUndoContent( $undorev, $oldrev );
 
                                                if ( $content === false ) {
                                                        # Warn the user that something went wrong
                                                        $undoMsg = 'failure';
                                                } else {
-                                                       $oldContent = $this->mArticle->getPage()->getContent( Revision::RAW );
+                                                       $oldContent = $this->page->getContent( Revision::RAW );
                                                        $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
                                                        $newContent = $content->preSaveTransform( $this->mTitle, $wgUser, $popts );
 
@@ -1198,6 +1202,26 @@ class EditPage {
                return $content;
        }
 
+       /**
+        * Get the edit's parent revision ID
+        *
+        * The "parent" revision is the ancestor that should be recorded in this
+        * page's revision history.  It is either the revision ID of the in-memory
+        * article content, or in the case of a 3-way merge in order to rebase
+        * across a recoverable edit conflict, the ID of the newer revision to
+        * which we have rebased this page.
+        *
+        * @since 1.27
+        * @return int Revision ID
+        */
+       public function getParentRevId() {
+               if ( $this->parentRevId ) {
+                       return $this->parentRevId;
+               } else {
+                       return $this->mArticle->getRevIdFetched();
+               }
+       }
+
        /**
         * Get the current content of the page. This is basically similar to
         * WikiPage::getContent( Revision::RAW ) except that when the page doesn't exist an empty
@@ -1207,7 +1231,7 @@ class EditPage {
         * @return Content
         */
        protected function getCurrentContent() {
-               $rev = $this->mArticle->getRevision();
+               $rev = $this->page->getRevision();
                $content = $rev ? $rev->getContent( Revision::RAW ) : null;
 
                if ( $content === false || $content === null ) {
@@ -1337,7 +1361,7 @@ class EditPage {
         * @param int $statusValue The status value (to check for new article status)
         */
        protected function setPostEditCookie( $statusValue ) {
-               $revisionId = $this->mArticle->getLatest();
+               $revisionId = $this->page->getLatest();
                $postEditKey = self::POST_EDIT_COOKIE_KEY_PREFIX . $revisionId;
 
                $val = 'saved';
@@ -1760,8 +1784,8 @@ class EditPage {
 
                # Load the page data from the master. If anything changes in the meantime,
                # we detect it by using page_latest like a token in a 1 try compare-and-swap.
-               $this->mArticle->loadPageData( 'fromdbmaster' );
-               $new = !$this->mArticle->exists();
+               $this->page->loadPageData( 'fromdbmaster' );
+               $new = !$this->page->exists();
 
                if ( $new ) {
                        // Late check for create permission, just in case *PARANOIA*
@@ -1813,19 +1837,19 @@ class EditPage {
 
                        # Article exists. Check for edit conflict.
 
-                       $this->mArticle->clear(); # Force reload of dates, etc.
-                       $timestamp = $this->mArticle->getTimestamp();
+                       $this->page->clear(); # Force reload of dates, etc.
+                       $timestamp = $this->page->getTimestamp();
 
                        wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
 
                        if ( $timestamp != $this->edittime ) {
                                $this->isConflict = true;
                                if ( $this->section == 'new' ) {
-                                       if ( $this->mArticle->getUserText() == $wgUser->getName() &&
-                                               $this->mArticle->getComment() == $this->newSectionSummary()
+                                       if ( $this->page->getUserText() == $wgUser->getName() &&
+                                               $this->page->getComment() == $this->newSectionSummary()
                                        ) {
                                                // Probably a duplicate submission of a new comment.
-                                               // This can happen when squid resends a request after
+                                               // This can happen when CDN resends a request after
                                                // a timeout but the first one actually went through.
                                                wfDebug( __METHOD__
                                                        . ": duplicate new section submission; trigger edit conflict!\n" );
@@ -1860,7 +1884,7 @@ class EditPage {
                                        . ": conflict! getting section '{$this->section}' for time '{$this->edittime}'"
                                        . " (article time '{$timestamp}')\n" );
 
-                               $content = $this->mArticle->replaceSectionContent(
+                               $content = $this->page->replaceSectionContent(
                                        $this->section,
                                        $textbox_content,
                                        $sectionTitle,
@@ -1868,7 +1892,7 @@ class EditPage {
                                );
                        } else {
                                wfDebug( __METHOD__ . ": getting section '{$this->section}'\n" );
-                               $content = $this->mArticle->replaceSectionContent(
+                               $content = $this->page->replaceSectionContent(
                                        $this->section,
                                        $textbox_content,
                                        $sectionTitle
@@ -1983,7 +2007,7 @@ class EditPage {
                        ( ( $this->minoredit && !$this->isNew ) ? EDIT_MINOR : 0 ) |
                        ( $bot ? EDIT_FORCE_BOT : 0 );
 
-               $doEditStatus = $this->mArticle->doEditContent(
+               $doEditStatus = $this->page->doEditContent(
                        $content,
                        $this->summary,
                        $flags,
@@ -2041,7 +2065,7 @@ class EditPage {
        }
 
        /**
-        * @param Title $title
+        * @param User $user
         * @param string $oldModel
         * @param string $newModel
         * @param string $reason
@@ -2059,26 +2083,26 @@ class EditPage {
                $log->publish( $logid );
        }
 
-
        /**
         * Register the change of watch status
         */
        protected function updateWatchlist() {
                global $wgUser;
 
-               if ( $wgUser->isLoggedIn()
-                       && $this->watchthis != $wgUser->isWatched( $this->mTitle, WatchedItem::IGNORE_USER_RIGHTS )
-               ) {
-                       $fname = __METHOD__;
-                       $title = $this->mTitle;
-                       $watch = $this->watchthis;
-
-                       // Do this in its own transaction to reduce contention...
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->onTransactionIdle( function () use ( $dbw, $title, $watch, $wgUser, $fname ) {
-                               WatchAction::doWatchOrUnwatch( $watch, $title, $wgUser );
-                       } );
+               if ( !$wgUser->isLoggedIn() ) {
+                       return;
                }
+
+               $user = $wgUser;
+               $title = $this->mTitle;
+               $watch = $this->watchthis;
+               // Do this in its own transaction to reduce contention...
+               DeferredUpdates::addCallableUpdate( function () use ( $user, $title, $watch ) {
+                       if ( $watch == $user->isWatched( $title, WatchedItem::IGNORE_USER_RIGHTS ) ) {
+                               return; // nothing to change
+                       }
+                       WatchAction::doWatchOrUnwatch( $watch, $title, $user );
+               } );
        }
 
        /**
@@ -2118,6 +2142,8 @@ class EditPage {
 
                if ( $result ) {
                        $editContent = $result;
+                       // Update parentRevId to what we just merged.
+                       $this->parentRevId = $currentRevision->getId();
                        return true;
                }
 
@@ -2125,7 +2151,9 @@ class EditPage {
        }
 
        /**
-        * @return Revision
+        * @note: this method is very poorly named. If the user opened the form with ?oldid=X,
+        *        one might think of X as the "base revision", which is NOT what this returns.
+        * @return Revision Current version when the edit was started
         */
        function getBaseRevision() {
                if ( !$this->mBaseRevision ) {
@@ -2578,8 +2606,7 @@ class EditPage {
                $wgOut->addHTML( Html::hidden( 'wpAutoSummary', $autosumm ) );
 
                $wgOut->addHTML( Html::hidden( 'oldid', $this->oldid ) );
-               $wgOut->addHTML( Html::hidden( 'parentRevId',
-                       $this->parentRevId ?: $this->mArticle->getRevIdFetched() ) );
+               $wgOut->addHTML( Html::hidden( 'parentRevId', $this->getParentRevId() ) );
 
                $wgOut->addHTML( Html::hidden( 'format', $this->contentFormat ) );
                $wgOut->addHTML( Html::hidden( 'model', $this->contentModel ) );
@@ -2630,7 +2657,7 @@ class EditPage {
                        Linker::formatTemplates( $this->getTemplates(), $this->preview, $this->section != '' ) ) );
 
                $wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'hiddencats' ),
-                       Linker::formatHiddenCategories( $this->mArticle->getHiddenCategories() ) ) );
+                       Linker::formatHiddenCategories( $this->page->getHiddenCategories() ) ) );
 
                $wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'limitreport' ),
                        self::getPreviewLimitReport( $this->mParserOutput ) ) );
@@ -2707,7 +2734,7 @@ class EditPage {
 
                if ( $this->isConflict ) {
                        $wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
-                       $this->edittime = $this->mArticle->getTimestamp();
+                       $this->edittime = $this->page->getTimestamp();
                } else {
                        if ( $this->section != '' && !$this->isSectionEditSupported() ) {
                                // We use $this->section to much before this and getVal('wgSection') directly in other places
@@ -2848,6 +2875,7 @@ class EditPage {
                }
                if ( $this->mTitle->isCascadeProtected() ) {
                        # Is this page under cascading protection from some source pages?
+                       /** @var Title[] $cascadeSources */
                        list( $cascadeSources, /* $restrictions */ ) = $this->mTitle->getCascadeProtectionSources();
                        $notice = "<div class='mw-cascadeprotectedwarning'>\n$1\n";
                        $cascadeSourcesCount = count( $cascadeSources );
@@ -3217,7 +3245,7 @@ HTML
 
                $textboxContent = $this->toEditContent( $this->textbox1 );
 
-               $newContent = $this->mArticle->replaceSectionContent(
+               $newContent = $this->page->replaceSectionContent(
                                                        $this->section, $textboxContent,
                                                        $this->summary, $this->edittime );
 
@@ -3607,7 +3635,7 @@ HTML
                                $note = wfMessage( 'previewnote' )->plain() . ' ' . $continueEditing;
                        }
 
-                       $parserOptions = $this->mArticle->makeParserOptions( $this->mArticle->getContext() );
+                       $parserOptions = $this->page->makeParserOptions( $this->mArticle->getContext() );
                        $parserOptions->setIsPreview( true );
                        $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
 
@@ -3679,6 +3707,8 @@ HTML
                        if ( count( $parserOutput->getWarnings() ) ) {
                                $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
                        }
+
+                       ScopedCallback::consume( $scopedCallback );
                } catch ( MWContentSerializationException $ex ) {
                        $m = wfMessage(
                                'content-failed-to-parse',
index 57ba4b3..b058975 100644 (file)
@@ -30,18 +30,19 @@ class FeedUtils {
 
        /**
         * Check whether feed's cache should be cleared; for changes feeds
-        * If the feed should be purged; $timekey and $key will be removed from
-        * $messageMemc
+        * If the feed should be purged; $timekey and $key will be removed from cache
         *
         * @param string $timekey Cache key of the timestamp of the last item
         * @param string $key Cache key of feed's content
         */
        public static function checkPurge( $timekey, $key ) {
-               global $wgRequest, $wgUser, $messageMemc;
+               global $wgRequest, $wgUser;
+
                $purge = $wgRequest->getVal( 'action' ) === 'purge';
                if ( $purge && $wgUser->isAllowed( 'purge' ) ) {
-                       $messageMemc->delete( $timekey );
-                       $messageMemc->delete( $key );
+                       $cache = ObjectCache::getMainWANInstance();
+                       $cache->delete( $timekey, 1 );
+                       $cache->delete( $key, 1 );
                }
        }
 
index 5e7f5b2..8b41ad4 100644 (file)
@@ -190,6 +190,7 @@ class FileDeleteForm {
                        $page = WikiPage::factory( $title );
                        $dbw = wfGetDB( DB_MASTER );
                        try {
+                               $dbw->startAtomic( __METHOD__ );
                                // delete the associated article first
                                $error = '';
                                $deleteStatus = $page->doDeleteArticleReal( $reason, $suppress, 0, false, $error, $user );
@@ -198,11 +199,15 @@ class FileDeleteForm {
                                if ( $deleteStatus->isOK() ) {
                                        $status = $file->delete( $reason, $suppress, $user );
                                        if ( $status->isOK() ) {
-                                               $dbw->commit( __METHOD__ );
                                                $status->value = $deleteStatus->value; // log id
+                                               $dbw->endAtomic( __METHOD__ );
                                        } else {
+                                               // Page deleted but file still there? rollback page delete
                                                $dbw->rollback( __METHOD__ );
                                        }
+                               } else {
+                                       // Done; nothing changed
+                                       $dbw->endAtomic( __METHOD__ );
                                }
                        } catch ( Exception $e ) {
                                // Rollback before returning to prevent UI from displaying
index c1765e2..4a021ee 100644 (file)
@@ -153,7 +153,9 @@ class ForkController {
                wfGetLBFactory()->destroyInstance();
                FileBackendGroup::destroySingleton();
                LockManagerGroup::destroySingletons();
+               JobQueueGroup::destroySingletons();
                ObjectCache::clear();
+               RedisConnectionPool::destroySingletons();
                $wgMemc = null;
        }
 
index cda3154..e30b371 100644 (file)
@@ -308,10 +308,15 @@ function wfMergeErrorArrays( /*...*/ ) {
        $out = array();
        foreach ( $args as $errors ) {
                foreach ( $errors as $params ) {
+                       $originalParams = $params;
+                       if ( $params[0] instanceof MessageSpecifier ) {
+                               $msg = $params[0];
+                               $params = array_merge( array( $msg->getKey() ), $msg->getParams() );
+                       }
                        # @todo FIXME: Sometimes get nested arrays for $params,
                        # which leads to E_NOTICEs
                        $spec = implode( "\t", $params );
-                       $out[$spec] = $params;
+                       $out[$spec] = $originalParams;
                }
        }
        return array_values( $out );
@@ -369,20 +374,22 @@ function wfObjectToArray( $objOrArray, $recursive = true ) {
  * not likely to give duplicate values for any realistic
  * number of articles.
  *
+ * @note This is designed for use in relation to Special:RandomPage
+ *       and the page_random database field.
+ *
  * @return string
  */
 function wfRandom() {
-       # The maximum random value is "only" 2^31-1, so get two random
-       # values to reduce the chance of dupes
+       // The maximum random value is "only" 2^31-1, so get two random
+       // values to reduce the chance of dupes
        $max = mt_getrandmax() + 1;
        $rand = number_format( ( mt_rand() * $max + mt_rand() ) / $max / $max, 12, '.', '' );
-
        return $rand;
 }
 
 /**
- * Get a random string containing a number of pseudo-random hex
- * characters.
+ * Get a random string containing a number of pseudo-random hex characters.
+ *
  * @note This is not secure, if you are trying to generate some sort
  *       of token please use MWCryptRand instead.
  *
@@ -453,12 +460,12 @@ function wfUrlencode( $s ) {
 }
 
 /**
- * This function takes two arrays as input, and returns a CGI-style string, e.g.
+ * This function takes one or two arrays as input, and returns a CGI-style string, e.g.
  * "days=7&limit=100". Options in the first array override options in the second.
  * Options set to null or false will not be output.
  *
  * @param array $array1 ( String|Array )
- * @param array $array2 ( String|Array )
+ * @param array|null $array2 ( String|Array )
  * @param string $prefix
  * @return string
  */
@@ -1044,7 +1051,6 @@ function wfDebug( $text, $dest = 'all', array $context = array() ) {
 
        $text = trim( $text );
 
-       // Inline logic from deprecated wfDebugTimer()
        if ( $wgDebugTimestamps ) {
                $context['seconds_elapsed'] = sprintf(
                        '%6.4f',
@@ -1087,26 +1093,6 @@ function wfIsDebugRawPage() {
        return $cache;
 }
 
-/**
- * Get microsecond timestamps for debug logs
- *
- * @deprecated since 1.25
- * @return string
- */
-function wfDebugTimer() {
-       global $wgDebugTimestamps, $wgRequestTime;
-
-       wfDeprecated( __METHOD__, '1.25' );
-
-       if ( !$wgDebugTimestamps ) {
-               return '';
-       }
-
-       $prefix = sprintf( "%6.4f", microtime( true ) - $wgRequestTime );
-       $mem = sprintf( "%5.1fM", ( memory_get_usage( true ) / ( 1024 * 1024 ) ) );
-       return "$prefix $mem  ";
-}
-
 /**
  * Send a line giving PHP memory usage.
  *
@@ -1233,7 +1219,7 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
  * @param string $file Filename
  * @param array $context Additional logging context data
  * @throws MWException
- * @deprecated since 1.25 Use \\MediaWiki\\Logger\\LegacyLogger::emit or UDPTransport
+ * @deprecated since 1.25 Use \MediaWiki\Logger\LegacyLogger::emit or UDPTransport
  */
 function wfErrorLog( $text, $file, array $context = array() ) {
        wfDeprecated( __METHOD__, '1.25' );
@@ -3325,6 +3311,8 @@ function wfRelativePath( $path, $from ) {
  * Supports base 2 through 36; digit values 10-36 are represented
  * as lowercase letters a-z. Input is case-insensitive.
  *
+ * @deprecated 1.27 Use Wikimedia\base_convert() directly
+ *
  * @param string $input Input number
  * @param int $sourceBase Base of the input number
  * @param int $destBase Desired base of the output
@@ -3336,97 +3324,7 @@ function wfRelativePath( $path, $from ) {
 function wfBaseConvert( $input, $sourceBase, $destBase, $pad = 1,
        $lowercase = true, $engine = 'auto'
 ) {
-       $input = (string)$input;
-       if (
-               $sourceBase < 2 ||
-               $sourceBase > 36 ||
-               $destBase < 2 ||
-               $destBase > 36 ||
-               $sourceBase != (int)$sourceBase ||
-               $destBase != (int)$destBase ||
-               $pad != (int)$pad ||
-               !preg_match(
-                       "/^[" . substr( '0123456789abcdefghijklmnopqrstuvwxyz', 0, $sourceBase ) . "]+$/i",
-                       $input
-               )
-       ) {
-               return false;
-       }
-
-       static $baseChars = array(
-               10 => 'a', 11 => 'b', 12 => 'c', 13 => 'd', 14 => 'e', 15 => 'f',
-               16 => 'g', 17 => 'h', 18 => 'i', 19 => 'j', 20 => 'k', 21 => 'l',
-               22 => 'm', 23 => 'n', 24 => 'o', 25 => 'p', 26 => 'q', 27 => 'r',
-               28 => 's', 29 => 't', 30 => 'u', 31 => 'v', 32 => 'w', 33 => 'x',
-               34 => 'y', 35 => 'z',
-
-               '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,
-               '6' => 6, '7' => 7, '8' => 8, '9' => 9, 'a' => 10, 'b' => 11,
-               'c' => 12, 'd' => 13, 'e' => 14, 'f' => 15, 'g' => 16, 'h' => 17,
-               'i' => 18, 'j' => 19, 'k' => 20, 'l' => 21, 'm' => 22, 'n' => 23,
-               'o' => 24, 'p' => 25, 'q' => 26, 'r' => 27, 's' => 28, 't' => 29,
-               'u' => 30, 'v' => 31, 'w' => 32, 'x' => 33, 'y' => 34, 'z' => 35
-       );
-
-       if ( extension_loaded( 'gmp' ) && ( $engine == 'auto' || $engine == 'gmp' ) ) {
-               // Removing leading zeros works around broken base detection code in
-               // some PHP versions (see <https://bugs.php.net/bug.php?id=50175> and
-               // <https://bugs.php.net/bug.php?id=55398>).
-               $result = gmp_strval( gmp_init( ltrim( $input, '0' ) ?: '0', $sourceBase ), $destBase );
-       } elseif ( extension_loaded( 'bcmath' ) && ( $engine == 'auto' || $engine == 'bcmath' ) ) {
-               $decimal = '0';
-               foreach ( str_split( strtolower( $input ) ) as $char ) {
-                       $decimal = bcmul( $decimal, $sourceBase );
-                       $decimal = bcadd( $decimal, $baseChars[$char] );
-               }
-
-               // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
-               for ( $result = ''; bccomp( $decimal, 0 ); $decimal = bcdiv( $decimal, $destBase, 0 ) ) {
-                       $result .= $baseChars[bcmod( $decimal, $destBase )];
-               }
-               // @codingStandardsIgnoreEnd
-
-               $result = strrev( $result );
-       } else {
-               $inDigits = array();
-               foreach ( str_split( strtolower( $input ) ) as $char ) {
-                       $inDigits[] = $baseChars[$char];
-               }
-
-               // Iterate over the input, modulo-ing out an output digit
-               // at a time until input is gone.
-               $result = '';
-               while ( $inDigits ) {
-                       $work = 0;
-                       $workDigits = array();
-
-                       // Long division...
-                       foreach ( $inDigits as $digit ) {
-                               $work *= $sourceBase;
-                               $work += $digit;
-
-                               if ( $workDigits || $work >= $destBase ) {
-                                       $workDigits[] = (int)( $work / $destBase );
-                               }
-                               $work %= $destBase;
-                       }
-
-                       // All that division leaves us with a remainder,
-                       // which is conveniently our next output digit.
-                       $result .= $baseChars[$work];
-
-                       // And we continue!
-                       $inDigits = $workDigits;
-               }
-
-               $result = strrev( $result );
-       }
-
-       if ( !$lowercase ) {
-               $result = strtoupper( $result );
-       }
-
-       return str_pad( $result, $pad, '0', STR_PAD_LEFT );
+       return Wikimedia\base_convert( $input, $sourceBase, $destBase, $pad, $lowercase, $engine );
 }
 
 /**
@@ -4100,7 +3998,7 @@ function wfIsBadImage( $name, $contextTitle = false, $blacklist = null ) {
                return $bad;
        }
 
-       $cache = ObjectCache::newAccelerator( 'hash' );
+       $cache = ObjectCache::getLocalServerInstance( 'hash' );
        $key = wfMemcKey( 'bad-image-list', ( $blacklist === null ) ? 'default' : md5( $blacklist ) );
        $badImages = $cache->get( $key );
 
@@ -4174,46 +4072,6 @@ function wfIsInfinity( $str ) {
        return in_array( $str, $infinityValues );
 }
 
-/**
- * Work out the IP address based on various globals
- * For trusted proxies, use the XFF client IP (first of the chain)
- *
- * @deprecated since 1.19; call $wgRequest->getIP() directly.
- * @return string
- */
-function wfGetIP() {
-       wfDeprecated( __METHOD__, '1.19' );
-       global $wgRequest;
-       return $wgRequest->getIP();
-}
-
-/**
- * Checks if an IP is a trusted proxy provider.
- * Useful to tell if X-Forwarded-For data is possibly bogus.
- * Squid cache servers for the site are whitelisted.
- * @deprecated Since 1.24, use IP::isTrustedProxy()
- *
- * @param string $ip
- * @return bool
- */
-function wfIsTrustedProxy( $ip ) {
-       wfDeprecated( __METHOD__, '1.24' );
-       return IP::isTrustedProxy( $ip );
-}
-
-/**
- * Checks if an IP matches a proxy we've configured.
- * @deprecated Since 1.24, use IP::isConfiguredProxy()
- *
- * @param string $ip
- * @return bool
- * @since 1.23 Supports CIDR ranges in $wgSquidServersNoPurge
- */
-function wfIsConfiguredProxy( $ip ) {
-       wfDeprecated( __METHOD__, '1.24' );
-       return IP::isConfiguredProxy( $ip );
-}
-
 /**
  * Returns true if these thumbnail parameters match one that MediaWiki
  * requests from file description pages and/or parser output.
index 980d350..cd38a7d 100644 (file)
  * @file
  */
 
-/**
- * @since 1.18
- */
-class MWHookException extends MWException {
-}
-
 /**
  * Hooks class.
  *
@@ -193,34 +187,17 @@ class Hooks {
                        $badhookmsg = null;
                        $hook_args = array_merge( $hook, $args );
 
-                       set_error_handler( 'Hooks::hookErrorHandler' );
-
                        // mark hook as deprecated, if deprecation version is specified
                        if ( $deprecatedVersion !== null ) {
                                wfDeprecated( "$event hook (used in $func)", $deprecatedVersion );
                        }
 
-                       try {
-                               $retval = call_user_func_array( $callback, $hook_args );
-                       } catch ( MWHookException $e ) {
-                               $badhookmsg = $e->getMessage();
-                       } catch ( Exception $e ) {
-                               restore_error_handler();
-                               throw $e;
-                       }
-
-                       restore_error_handler();
+                       $retval = call_user_func_array( $callback, $hook_args );
 
                        // Process the return value.
                        if ( is_string( $retval ) ) {
                                // String returned means error.
                                throw new FatalError( $retval );
-                       } elseif ( $badhookmsg !== null ) {
-                               // Exception was thrown from Hooks::hookErrorHandler.
-                               throw new MWException(
-                                       'Detected bug in an extension! ' .
-                                       "Hook $func has invalid call signature; " . $badhookmsg
-                               );
                        } elseif ( $retval === false ) {
                                // False was returned. Stop processing, but no error.
                                return false;
@@ -229,31 +206,4 @@ class Hooks {
 
                return true;
        }
-
-       /**
-        * Handle PHP errors issued inside a hook. Catch errors that have to do
-        * with a function expecting a reference, missing arguments, or wrong argument
-        * types. Pass all others through to to the default error handler.
-        *
-        * This is useful for throwing errors for major callback invocation errors
-        * (with regard to parameter signature) which PHP just gives warnings for.
-        *
-        * @since 1.18
-        *
-        * @param int $errno Error number (unused)
-        * @param string $errstr Error message
-        * @throws MWHookException If the error has to do with the function signature
-        * @return bool
-        */
-       public static function hookErrorHandler( $errno, $errstr ) {
-               if ( strpos( $errstr, 'expected to be a reference, value given' ) !== false
-                       || strpos( $errstr, 'Missing argument ' ) !== false
-                       || strpos( $errstr, ' expects parameter ' ) !== false
-               ) {
-                       throw new MWHookException( $errstr, $errno );
-               }
-
-               // Delegate unhandled errors to the default handlers
-               return false;
-       }
 }
index b7958dd..5f91dac 100644 (file)
@@ -359,8 +359,6 @@ class Html {
                        'keygen' => array( 'keytype' => 'rsa' ),
                        'link' => array( 'media' => 'all' ),
                        'menu' => array( 'type' => 'list' ),
-                       // Note: the use of text/javascript here instead of other JavaScript
-                       // MIME types follows the HTML5 spec.
                        'script' => array( 'type' => 'text/javascript' ),
                        'style' => array(
                                'media' => 'all',
@@ -674,7 +672,6 @@ class Html {
                }
 
                return self::rawElement( 'style', array(
-                       'type' => 'text/css',
                        'media' => $media,
                ), $contents );
        }
@@ -691,7 +688,6 @@ class Html {
                return self::element( 'link', array(
                        'rel' => 'stylesheet',
                        'href' => $url,
-                       'type' => 'text/css',
                        'media' => $media,
                ) );
        }
index 60196ab..e6801e3 100644 (file)
@@ -80,7 +80,8 @@ class Http {
                } else {
                        $errors = $status->getErrorsByType( 'error' );
                        $logger = LoggerFactory::getInstance( 'http' );
-                       $logger->warning( $status->getWikiText(), array( 'caller' => $caller ) );
+                       $logger->warning( $status->getWikiText(),
+                               array( 'error' => $errors, 'caller' => $caller, 'content' => $req->getContent() ) );
                        return false;
                }
        }
index 33ab4ea..519f74a 100644 (file)
@@ -515,6 +515,7 @@ class WikiImporter {
                while ( $this->reader->read() ) {
                        switch ( $this->reader->nodeType ) {
                        case XMLReader::TEXT:
+                       case XMLReader::CDATA:
                        case XMLReader::SIGNIFICANT_WHITESPACE:
                                $buffer .= $this->reader->value;
                                break;
@@ -1498,7 +1499,7 @@ class WikiRevision {
         */
        function getSha1() {
                if ( $this->sha1base36 ) {
-                       return wfBaseConvert( $this->sha1base36, 36, 16 );
+                       return Wikimedia\base_convert( $this->sha1base36, 36, 16 );
                }
                return false;
        }
@@ -1963,23 +1964,38 @@ class ImportStreamSource implements ImportSource {
                if ( $page == '' ) {
                        return Status::newFatal( 'import-noarticle' );
                }
-               $link = Title::newFromText( "$interwiki:Special:Export/$page" );
-               if ( is_null( $link ) || !$link->isExternal() ) {
+
+               # Look up the first interwiki prefix, and let the foreign site handle
+               # subsequent interwiki prefixes
+               $firstIwPrefix = strtok( $interwiki, ':' );
+               $firstIw = Interwiki::fetch( $firstIwPrefix );
+               if ( !$firstIw ) {
                        return Status::newFatal( 'importbadinterwiki' );
-               } else {
-                       $params = array();
-                       if ( $history ) {
-                               $params['history'] = 1;
-                       }
-                       if ( $templates ) {
-                               $params['templates'] = 1;
-                       }
-                       if ( $pageLinkDepth ) {
-                               $params['pagelink-depth'] = $pageLinkDepth;
-                       }
-                       $url = $link->getFullURL( $params );
-                       # For interwikis, use POST to avoid redirects.
-                       return ImportStreamSource::newFromURL( $url, "POST" );
                }
+
+               $additionalIwPrefixes = strtok( '' );
+               if ( $additionalIwPrefixes ) {
+                       $additionalIwPrefixes .= ':';
+               }
+               # Have to do a DB-key replacement ourselves; otherwise spaces get
+               # URL-encoded to +, which is wrong in this case. Similar to logic in
+               # Title::getLocalURL
+               $link = $firstIw->getURL( strtr( "${additionalIwPrefixes}Special:Export/$page",
+                       ' ', '_' ) );
+
+               $params = array();
+               if ( $history ) {
+                       $params['history'] = 1;
+               }
+               if ( $templates ) {
+                       $params['templates'] = 1;
+               }
+               if ( $pageLinkDepth ) {
+                       $params['pagelink-depth'] = $pageLinkDepth;
+               }
+
+               $url = wfAppendQuery( $link, $params );
+               # For interwikis, use POST to avoid redirects.
+               return ImportStreamSource::newFromURL( $url, "POST" );
        }
 }
index e821004..5255b9a 100644 (file)
@@ -1393,7 +1393,10 @@ class Linker {
         * is ignored
         *
         * @todo FIXME: Doesn't handle sub-links as in image thumb texts like the main parser
-        * @param string $comment Text to format links in
+        * @param string $comment Text to format links in. WARNING! Since the output of this
+        *      function is html, $comment must be sanitized for use as html. You probably want
+        *      to pass $comment through Sanitizer::escapeHtmlAllowEntities() before calling
+        *      this function.
         * @param Title|null $title An optional title object used to links to sections
         * @param bool $local Whether section links should refer to local page
         * @param string|null $wikiId Id of the wiki to link to (if not the local wiki),
@@ -1469,7 +1472,7 @@ class Linker {
                                                if ( $target->getText() == '' && !$target->isExternal()
                                                        && !$local && $title
                                                ) {
-                                                       $newTarget = clone ( $title );
+                                                       $newTarget = clone $title;
                                                        $newTarget->setFragment( '#' . $target->getFragment() );
                                                        $target = $newTarget;
                                                }
index 639403d..937aedb 100644 (file)
@@ -377,7 +377,7 @@ class MWTimestamp {
         * Premade translations are not shipped as format() may return whatever the
         * system uses, localized or not, so translation must be done through wiki.
         *
-        * @since 1.25
+        * @since 1.27
         * @return Message The localized timezone message
         */
        public function getTimezoneMessage() {
index 2c7ba91..80e60d2 100644 (file)
@@ -23,6 +23,8 @@
  * @ingroup Parser
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * This class encapsulates "magic words" such as "#redirect", __NOTOC__, etc.
  *
@@ -951,13 +953,28 @@ class MagicWordArray {
                                continue;
                        }
                        $matches = array();
-                       if ( preg_match_all( $regex, $text, $matches, PREG_SET_ORDER ) ) {
+                       $res = preg_match_all( $regex, $text, $matches, PREG_SET_ORDER );
+                       if ( $res === false ) {
+                               LoggerFactory::getInstance( 'parser' )->warning( 'preg_match_all returned false', array(
+                                       'code' => preg_last_error(),
+                                       'regex' => $regex,
+                                       'text' => $text,
+                               ) );
+                       } elseif ( $res ) {
                                foreach ( $matches as $m ) {
                                        list( $name, $param ) = $this->parseMatch( $m );
                                        $found[$name] = $param;
                                }
                        }
-                       $text = preg_replace( $regex, '', $text );
+                       $res = preg_replace( $regex, '', $text );
+                       if ( $res === null ) {
+                               LoggerFactory::getInstance( 'parser' )->warning( 'preg_replace returned null', array(
+                                       'code' => preg_last_error(),
+                                       'regex' => $regex,
+                                       'text' => $text,
+                               ) );
+                       }
+                       $text = $res;
                }
                return $found;
        }
index 676108c..bb0f1e4 100644 (file)
@@ -308,7 +308,7 @@ class MediaWiki {
                $targetUrl = wfExpandUrl( $title->getFullURL(), PROTO_CURRENT );
 
                if ( $targetUrl != $request->getFullRequestURL() ) {
-                       $output->setSquidMaxage( 1200 );
+                       $output->setCdnMaxage( 1200 );
                        $output->redirect( $targetUrl, '301' );
                        return true;
                }
@@ -443,15 +443,15 @@ class MediaWiki {
                $action = Action::factory( $act, $page, $this->context );
 
                if ( $action instanceof Action ) {
-                       # Let Squid cache things if we can purge them.
+                       # Let CDN cache things if we can purge them.
                        if ( $this->config->get( 'UseSquid' ) &&
                                in_array(
-                                       // Use PROTO_INTERNAL because that's what getSquidURLs() uses
+                                       // Use PROTO_INTERNAL because that's what getCdnUrls() uses
                                        wfExpandUrl( $request->getRequestURL(), PROTO_INTERNAL ),
-                                       $requestTitle->getSquidURLs()
+                                       $requestTitle->getCdnUrls()
                                )
                        ) {
-                               $output->setSquidMaxage( $this->config->get( 'SquidMaxage' ) );
+                               $output->setCdnMaxage( $this->config->get( 'SquidMaxage' ) );
                        }
 
                        $action->show();
@@ -486,35 +486,62 @@ class MediaWiki {
                $this->doPostOutputShutdown( 'normal' );
        }
 
+       /**
+        * @see MediaWiki::preOutputCommit()
+        * @since 1.26
+        */
+       public function doPreOutputCommit() {
+               self::preOutputCommit( $this->context );
+       }
+
        /**
         * This function commits all DB changes as needed before
         * the user can receive a response (in case commit fails)
         *
-        * @since 1.26
+        * @param IContextSource $context
+        * @since 1.27
         */
-       public function doPreOutputCommit() {
+       public static function preOutputCommit( IContextSource $context ) {
                // Either all DBs should commit or none
                ignore_user_abort( true );
 
-               // Commit all changes and record ChronologyProtector positions
+               $config = $context->getConfig();
+
                $factory = wfGetLBFactory();
+               // Check if any transaction was too big
+               $limit = $config->get( 'MaxUserDBWriteDuration' );
+               $factory->forEachLB( function ( LoadBalancer $lb ) use ( $limit ) {
+                       $lb->forEachOpenConnection( function ( IDatabase $db ) use ( $limit ) {
+                               $time = $db->pendingWriteQueryDuration();
+                               if ( $limit > 0 && $time > $limit ) {
+                                       throw new DBTransactionError(
+                                               $db,
+                                               wfMessage( 'transaction-duration-limit-exceeded', $time, $limit )->plain()
+                                       );
+                               }
+                       } );
+               } );
+               // Commit all changes
                $factory->commitMasterChanges();
+               // Record ChronologyProtector positions
                $factory->shutdown();
+               wfDebug( __METHOD__ . ': all transactions committed' );
 
-               wfDebug( __METHOD__ . ' completed; all transactions committed' );
+               DeferredUpdates::doUpdates( 'enqueue', DeferredUpdates::PRESEND );
+               wfDebug( __METHOD__ . ': pre-send deferred updates completed' );
 
                // Set a cookie to tell all CDN edge nodes to "stick" the user to the
                // DC that handles this POST request (e.g. the "master" data center)
-               $request = $this->context->getRequest();
+               $request = $context->getRequest();
                if ( $request->wasPosted() && $factory->hasOrMadeRecentMasterChanges() ) {
-                       $expires = time() + $this->config->get( 'DataCenterUpdateStickTTL' );
-                       $request->response()->setCookie( 'UseDC', 'master', $expires );
+                       $expires = time() + $config->get( 'DataCenterUpdateStickTTL' );
+                       $request->response()->setCookie( 'UseDC', 'master', $expires, array( 'prefix' => '' ) );
                }
 
                // Avoid letting a few seconds of slave lag cause a month of stale data
                if ( $factory->laggedSlaveUsed() ) {
-                       $maxAge = $this->config->get( 'CdnMaxageLagged' );
-                       $this->context->getOutput()->lowerCdnMaxage( $maxAge );
+                       $maxAge = $config->get( 'CdnMaxageLagged' );
+                       $context->getOutput()->lowerCdnMaxage( $maxAge );
                        $request->response()->header( "X-Database-Lagged: true" );
                        wfDebugLog( 'replication', "Lagged DB used; CDN cache TTL limited to $maxAge seconds" );
                }
@@ -531,6 +558,9 @@ class MediaWiki {
         * @since 1.26
         */
        public function doPostOutputShutdown( $mode = 'normal' ) {
+               $timing = $this->context->getTiming();
+               $timing->mark( 'requestShutdown' );
+
                // Show visible profiling data if enabled (which cannot be post-send)
                Profiler::instance()->logDataPageOutputOnly();
 
@@ -707,7 +737,7 @@ class MediaWiki {
                // Commit and close up!
                $factory = wfGetLBFactory();
                $factory->commitMasterChanges();
-               $factory->shutdown();
+               $factory->shutdown( LBFactory::SHUTDOWN_NO_CHRONPROT );
 
                wfDebug( "Request ended normally\n" );
        }
index 2cd9698..b918955 100644 (file)
@@ -247,7 +247,7 @@ class MovePage {
                        RepoGroup::singleton()->clearCache( $this->newTitle ); # clear false negative cache
                }
 
-               $dbw->begin( __METHOD__ ); # If $file was a LocalFile, its transaction would have closed our own.
+               $dbw->startAtomic( __METHOD__ );
                $pageid = $this->oldTitle->getArticleID( Title::GAID_FOR_UPDATE );
                $protected = $this->oldTitle->isProtected();
 
@@ -369,12 +369,20 @@ class MovePage {
                        WatchedItem::duplicateEntries( $this->oldTitle, $this->newTitle );
                }
 
-               $dbw->commit( __METHOD__ );
-
                Hooks::run(
-                       'TitleMoveComplete',
-                       array( &$this->oldTitle, &$this->newTitle, &$user, $pageid, $redirid, $reason )
+                       'TitleMoveCompleting',
+                       array( $this->oldTitle, $this->newTitle, $user, $pageid, $redirid, $reason )
                );
+
+               $dbw->endAtomic( __METHOD__ );
+
+               $params = array( &$this->oldTitle, &$this->newTitle, &$user, $pageid, $redirid, $reason );
+               $dbw->onTransactionIdle( function () use ( $params, $dbw ) {
+                       // Keep each single hook handler atomic
+                       $dbw->setFlag( DBO_TRX ); // flag is automatically reset by DB layer
+                       Hooks::run( 'TitleMoveComplete', $params );
+               } );
+
                return Status::newGood();
        }
 
index 39716ca..30f193c 100644 (file)
@@ -162,7 +162,7 @@ function wfMangleFlashPolicy( $s ) {
 }
 
 /**
- * Add a Content-Length header if possible. This makes it cooperate with squid better.
+ * Add a Content-Length header if possible. This makes it cooperate with CDN better.
  *
  * @param int $length
  */
index d29ec54..67c54bb 100644 (file)
@@ -50,7 +50,7 @@ class OutputPage extends ContextSource {
 
        /**
         * @var array Additional stylesheets. Looks like this is for extensions.
-        *   Might be replaced by resource loader.
+        *   Might be replaced by ResourceLoader.
         */
        protected $mExtStyles = array();
 
@@ -132,7 +132,7 @@ class OutputPage extends ContextSource {
        private $mLanguageLinks = array();
 
        /**
-        * Used for JavaScript (pre resource loader)
+        * Used for JavaScript (predates ResourceLoader)
         * @todo We should split JS / CSS.
         * mScripts content is inserted as is in "<head>" by Skin. This might
         * contain either a link to a stylesheet or inline CSS.
@@ -151,8 +151,6 @@ class OutputPage extends ContextSource {
        /** @var array Array of elements in "<head>". Parser might add its own headers! */
        protected $mHeadItems = array();
 
-       // @todo FIXME: Next 5 variables probably come from the resource loader
-
        /** @var array */
        protected $mModules = array();
 
@@ -224,7 +222,7 @@ class OutputPage extends ContextSource {
        /**
         * @var bool Comes from the parser. This was probably made to load CSS/JS
         * only if we had "<gallery>". Used directly in CategoryPage.php.
-        * Looks like resource loader can replace this.
+        * Looks like ResourceLoader can replace this.
         */
        public $mNoGallery = false;
 
@@ -235,8 +233,8 @@ class OutputPage extends ContextSource {
        private $mParseWarnings = array();
 
        /** @var int Cache stuff. Looks like mEnableClientCache */
-       protected $mSquidMaxage = 0;
-       /** @var int Upper limit on mSquidMaxage */
+       protected $mCdnMaxage = 0;
+       /** @var int Upper limit on mCdnMaxage */
        protected $mCdnMaxageLimit = INF;
 
        /**
@@ -458,6 +456,8 @@ class OutputPage extends ContextSource {
 
        /**
         * Add raw HTML to the list of scripts (including \<script\> tag, etc.)
+        * Internal use only. Use OutputPage::addModules() or OutputPage::addJsConfigVars()
+        * if possible.
         *
         * @param string $script Raw HTML
         */
@@ -468,26 +468,31 @@ class OutputPage extends ContextSource {
        /**
         * Register and add a stylesheet from an extension directory.
         *
+        * @deprecated since 1.27 use addModuleStyles() or addStyle() instead
         * @param string $url Path to sheet.  Provide either a full url (beginning
         *             with 'http', etc) or a relative path from the document root
         *             (beginning with '/').  Otherwise it behaves identically to
         *             addStyle() and draws from the /skins folder.
         */
        public function addExtensionStyle( $url ) {
+               wfDeprecated( __METHOD__, '1.27' );
                array_push( $this->mExtStyles, $url );
        }
 
        /**
         * Get all styles added by extensions
         *
+        * @deprecated since 1.27
         * @return array
         */
        function getExtStyle() {
+               wfDeprecated( __METHOD__, '1.27' );
                return $this->mExtStyles;
        }
 
        /**
         * Add a JavaScript file out of skins/common, or a given relative path.
+        * Internal use only. Use OutputPage::addModules() if possible.
         *
         * @param string $file Filename in skins/common or complete on-server path
         *              (/foo/bar.js)
@@ -508,6 +513,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Add a self-contained script tag with the given contents
+        * Internal use only. Use OutputPage::addModules() if possible.
         *
         * @param string $script JavaScript text, no "<script>" tags
         */
@@ -568,8 +574,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add one or more modules recognized by the resource loader. Modules added
-        * through this function will be loaded by the resource loader when the
+        * Add one or more modules recognized by ResourceLoader. Modules added
+        * through this function will be loaded by ResourceLoader when the
         * page loads.
         *
         * @param string|array $modules Module name (string) or array of module names
@@ -591,8 +597,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add only JS of one or more modules recognized by the resource loader. Module
-        * scripts added through this function will be loaded by the resource loader when
+        * Add only JS of one or more modules recognized by ResourceLoader. Module
+        * scripts added through this function will be loaded by ResourceLoader when
         * the page loads.
         *
         * @param string|array $modules Module name (string) or array of module names
@@ -610,25 +616,11 @@ class OutputPage extends ContextSource {
         * @return array Array of module names
         */
        public function getModuleStyles( $filter = false, $position = null ) {
-               // T97420
-               $resourceLoader = $this->getResourceLoader();
-
-               foreach ( $this->mModuleStyles as $val ) {
-                       $module = $resourceLoader->getModule( $val );
-
-                       if ( $module instanceof ResourceLoaderModule && $module->isPositionDefault() ) {
-                               $warning = __METHOD__ . ': style module should define its position explicitly: ' .
-                                       $val . ' ' . get_class( $module );
-                               wfDebugLog( 'resourceloader', $warning );
-                               wfLogWarning( $warning );
-                       }
-               }
-
                return $this->getModules( $filter, $position, 'mModuleStyles' );
        }
 
        /**
-        * Add only CSS of one or more modules recognized by the resource loader.
+        * Add only CSS of one or more modules recognized by ResourceLoader.
         *
         * Module styles added through this function will be added using standard link CSS
         * tags, rather than as a combined Javascript and CSS package. Thus, they will
@@ -707,6 +699,12 @@ class OutputPage extends ContextSource {
        /**
         * Add or replace an header item to the output
         *
+        * Whenever possible, use more specific options like ResourceLoader modules,
+        * OutputPage::addLink(), OutputPage::addMetaLink() and OutputPage::addFeedLink()
+        * Fallback options for those are: OutputPage::addStyle, OutputPage::addScript(),
+        * OutputPage::addInlineScript() and OutputPage::addInlineStyle()
+        * This would be your very LAST fallback.
+        *
         * @param string $name Item name
         * @param string $value Raw HTML
         */
@@ -1034,16 +1032,6 @@ class OutputPage extends ContextSource {
                $this->addSubtitle( $str );
        }
 
-       /**
-        * Add $str to the subtitle
-        *
-        * @deprecated since 1.19; use addSubtitle() instead
-        * @param string|Message $str String or Message to add to the subtitle
-        */
-       public function appendSubtitle( $str ) {
-               $this->addSubtitle( $str );
-       }
-
        /**
         * Add $str to the subtitle
         *
@@ -1355,6 +1343,8 @@ class OutputPage extends ContextSource {
                        array( &$this, $categories, &$this->mCategoryLinks ) )
                ) {
                        foreach ( $categories as $category => $type ) {
+                               // array keys will cast numeric category names to ints, so cast back to string
+                               $category = (string)$category;
                                $origcategory = $category;
                                $title = Title::makeTitleSafe( NS_CATEGORY, $category );
                                if ( !$title ) {
@@ -1764,6 +1754,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         */
        public function addParserOutputNoText( $parserOutput ) {
+               wfDeprecated( __METHOD__, '1.24' );
                $this->addParserOutputMetadata( $parserOutput );
        }
 
@@ -1941,24 +1932,32 @@ class OutputPage extends ContextSource {
                return Parser::stripOuterParagraph( $parsed );
        }
 
+       /**
+        * @param $maxage
+        * @deprecated since 1.27 Use setCdnMaxage() instead
+        */
+       public function setSquidMaxage( $maxage ) {
+               $this->setCdnMaxage( $maxage );
+       }
+
        /**
         * Set the value of the "s-maxage" part of the "Cache-control" HTTP header
         *
-        * @param int $maxage Maximum cache time on the Squid, in seconds.
+        * @param int $maxage Maximum cache time on the CDN, in seconds.
         */
-       public function setSquidMaxage( $maxage ) {
-               $this->mSquidMaxage = min( $maxage, $this->mCdnMaxageLimit );
+       public function setCdnMaxage( $maxage ) {
+               $this->mCdnMaxage = min( $maxage, $this->mCdnMaxageLimit );
        }
 
        /**
         * Lower the value of the "s-maxage" part of the "Cache-control" HTTP header
         *
-        * @param int $maxage Maximum cache time on the Squid, in seconds
+        * @param int $maxage Maximum cache time on the CDN, in seconds
         * @since 1.27
         */
        public function lowerCdnMaxage( $maxage ) {
                $this->mCdnMaxageLimit = min( $maxage, $this->mCdnMaxageLimit );
-               $this->setSquidMaxage( $this->mSquidMaxage );
+               $this->setCdnMaxage( $this->mCdnMaxage );
        }
 
        /**
@@ -2179,27 +2178,27 @@ class OutputPage extends ContextSource {
                if ( $this->mEnableClientCache ) {
                        if (
                                $config->get( 'UseSquid' ) && session_id() == '' && !$this->isPrintable() &&
-                               $this->mSquidMaxage != 0 && !$this->haveCacheVaryCookies()
+                               $this->mCdnMaxage != 0 && !$this->haveCacheVaryCookies()
                        ) {
                                if ( $config->get( 'UseESI' ) ) {
                                        # We'll purge the proxy cache explicitly, but require end user agents
                                        # to revalidate against the proxy on each visit.
-                                       # Surrogate-Control controls our Squid, Cache-Control downstream caches
+                                       # Surrogate-Control controls our CDN, Cache-Control downstream caches
                                        wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"');
                                        $response->header( 'Surrogate-Control: max-age=' . $config->get( 'SquidMaxage' )
-                                               . '+' . $this->mSquidMaxage . ', content="ESI/1.0"' );
+                                               . '+' . $this->mCdnMaxage . ', content="ESI/1.0"' );
                                        $response->header( 'Cache-Control: s-maxage=0, must-revalidate, max-age=0' );
                                } else {
                                        # We'll purge the proxy cache for anons explicitly, but require end user agents
                                        # to revalidate against the proxy on each visit.
-                                       # IMPORTANT! The Squid needs to replace the Cache-Control header with
+                                       # IMPORTANT! The CDN needs to replace the Cache-Control header with
                                        # Cache-Control: s-maxage=0, must-revalidate, max-age=0
                                        wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **\n", 'log' );
                                        # start with a shorter timeout for initial testing
                                        # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" );
-                                       $response->header( 'Cache-Control: s-maxage=' . $this->mSquidMaxage
+                                       $response->header( 'Cache-Control: s-maxage=' . $this->mCdnMaxage
                                                . ', must-revalidate, max-age=0' );
                                }
                        } else {
@@ -2344,6 +2343,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.18
         */
        function blockedPage() {
+               wfDeprecated( __METHOD__, '1.18' );
                throw new UserBlockedError( $this->getUser()->mBlock );
        }
 
@@ -2428,7 +2428,7 @@ class OutputPage extends ContextSource {
                        # not especially useful as a returnto parameter. Use the title
                        # from the request instead, if there was one.
                        $request = $this->getRequest();
-                       $returnto = Title::newFromURL( $request->getVal( 'title', '' ) );
+                       $returnto = Title::newFromText( $request->getVal( 'title', '' ) );
                        if ( $action == 'edit' ) {
                                $msg = 'whitelistedittext';
                                $displayReturnto = $returnto;
@@ -2495,18 +2495,10 @@ class OutputPage extends ContextSource {
         * @throws PermissionsError
         */
        public function permissionRequired( $permission ) {
+               wfDeprecated( __METHOD__, '1.18' );
                throw new PermissionsError( $permission );
        }
 
-       /**
-        * Produce the stock "please login to use the wiki" page
-        *
-        * @deprecated since 1.19; throw the exception directly
-        */
-       public function loginToUse() {
-               throw new PermissionsError( 'read' );
-       }
-
        /**
         * Format a list of error messages
         *
@@ -2898,7 +2890,7 @@ class OutputPage extends ContextSource {
                                // on-wiki like user pages, or user preferences; we need to find the highest
                                // timestamp of these user-changeable modules so we can ensure cache misses on change
                                // This should NOT be done for the site group (bug 27564) because anons get that too
-                               // and we shouldn't be putting timestamps in Squid-cached HTML
+                               // and we shouldn't be putting timestamps in CDN-cached HTML
                                $version = null;
                                if ( $group === 'user' ) {
                                        $query['version'] = $resourceLoader->getCombinedVersion( $context, array_keys( $grpModules ) );
@@ -3074,10 +3066,6 @@ class OutputPage extends ContextSource {
                        ResourceLoaderModule::TYPE_SCRIPTS
                );
 
-               $links[] = $this->makeResourceLoaderLink( $this->getModuleStyles( true, 'bottom' ),
-                       ResourceLoaderModule::TYPE_STYLES
-               );
-
                // Modules requests - let the client calculate dependencies and batch requests as it likes
                // Only load modules that have marked themselves for loading at the bottom
                $modules = $this->getModules( true, 'bottom' );
@@ -3143,9 +3131,6 @@ class OutputPage extends ContextSource {
         * @return string
         */
        function getBottomScripts() {
-               // In case the skin wants to add bottom CSS
-               $this->getSkin()->setupSkinUserCss( $this );
-
                return $this->getScriptsForBottomQueue();
        }
 
@@ -3313,7 +3298,11 @@ class OutputPage extends ContextSource {
         */
        public function userCanPreview() {
                $request = $this->getRequest();
-               if ( $request->getVal( 'action' ) !== 'submit' || !$request->wasPosted() ) {
+               if (
+                       $request->getVal( 'action' ) !== 'submit' ||
+                       !$request->getCheck( 'wpPreview' ) ||
+                       !$request->wasPosted()
+               ) {
                        return false;
                }
 
@@ -3624,7 +3613,7 @@ class OutputPage extends ContextSource {
 
        /**
         * Add a local or specified stylesheet, with the given media options.
-        * Meant primarily for internal use...
+        * Internal use only. Use OutputPage::addModuleStyles() if possible.
         *
         * @param string $style URL to the file
         * @param string $media To specify a media type, 'screen', 'printable', 'handheld' or any.
@@ -3649,6 +3638,8 @@ class OutputPage extends ContextSource {
 
        /**
         * Adds inline CSS styles
+        * Internal use only. Use OutputPage::addModuleStyles() if possible.
+        *
         * @param mixed $style_css Inline CSS
         * @param string $flip Set to 'flip' to flip the CSS if needed
         */
@@ -3684,7 +3675,7 @@ class OutputPage extends ContextSource {
                $otherTags = array(); // Tags to append after the normal <link> tags
                $resourceLoader = $this->getResourceLoader();
 
-               $moduleStyles = $this->getModuleStyles( true, 'top' );
+               $moduleStyles = $this->getModuleStyles();
 
                // Per-site custom styles
                $moduleStyles[] = 'site';
@@ -3963,6 +3954,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.17
         */
        public function includeJQuery( array $modules = array() ) {
+               wfDeprecated( __METHOD__, '1.17' );
                return array();
        }
 
index 233ebf2..41e88c2 100644 (file)
@@ -40,7 +40,9 @@ function wfEntryPointCheck( $entryPoint ) {
                wfPHPVersionError( $entryPoint, $mwVersion, $minimumVersionPHP, $phpVersion );
        }
 
+       // @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
        if ( !file_exists( dirname( __FILE__ ) . '/../vendor/autoload.php' ) ) {
+               // @codingStandardsIgnoreEnd
                wfMissingVendorError( $entryPoint, $mwVersion );
        }
 }
@@ -180,7 +182,7 @@ HTML;
  * @param string $mwVersion See wfGenericError
  */
 function wfMissingVendorError( $type, $mwVersion ) {
-       $shortText = "Installing some external dependencies (e.g. via composer) is also required.";
+       $shortText = "Installing some external dependencies (e.g. via composer) is required.";
 
        $longText = "Error: You are missing some external dependencies. \n"
                . "MediaWiki now also has some external dependencies that need to be installed\n"
index 007ea89..9fbcf89 100644 (file)
@@ -21,4 +21,6 @@
  * @deprecated 1.25
  * @file
  */
+// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
 require_once dirname( __FILE__ ) . '/PHPVersionCheck.php';
+// @codingStandardsIgnoreEnd
index 0f8dcc3..ad25fa8 100644 (file)
@@ -508,7 +508,6 @@ class Preferences {
                                                # Apply the same CSS class used on the input to the message:
                                                'cssclass' => $emailauthenticationclass,
                                        );
-                                       $defaultPreferences['emailaddress']['cssclass'] = $emailauthenticationclass;
                                }
                        }
 
@@ -1006,6 +1005,11 @@ class Preferences {
                        'section' => 'watchlist/advancedwatchlist',
                        'label-message' => 'tog-watchlisthideliu',
                );
+               $defaultPreferences['watchlistreloadautomatically'] = array(
+                       'type' => 'toggle',
+                       'section' => 'watchlist/advancedwatchlist',
+                       'label-message' => 'tog-watchlistreloadautomatically',
+               );
 
                if ( $config->get( 'RCWatchCategoryMembership' ) ) {
                        $defaultPreferences['watchlisthidecategorization'] = array(
@@ -1269,7 +1273,7 @@ class Preferences {
         * @param IContextSource $context
         * @param string $formClass
         * @param array $remove Array of items to remove
-        * @return HtmlForm
+        * @return PreferencesForm|HtmlForm
         */
        static function getFormObject(
                $user,
@@ -1655,4 +1659,12 @@ class PreferencesForm extends HTMLForm {
                Hooks::run( 'PreferencesGetLegend', array( $this, $key, &$legend ) );
                return $legend;
        }
+
+       /**
+        * Get the keys of each top level preference section.
+        * @return array of section keys
+        */
+       function getPreferenceSections() {
+               return array_keys( array_filter( $this->mFieldTree, 'is_array' ) );
+       }
 }
index 430b4b8..c6f187d 100644 (file)
@@ -164,106 +164,9 @@ abstract class PrefixSearch {
                return $this->strings( $this->handleResultFromHook( $srchres, $namespaces, $search, $limit ) );
        }
 
-       /**
-        * Default search backend does proper prefix searching, but custom backends
-        * may sort based on other algorythms that may cause the exact title match
-        * to not be in the results or be lower down the list.
-        * @param array $srchres results from the hook
-        * @return array munged results from the hook
-        */
        private function handleResultFromHook( $srchres, $namespaces, $search, $limit ) {
-               // Pick namespace (based on PrefixSearch::defaultSearchBackend)
-               $ns = in_array( NS_MAIN, $namespaces ) ? NS_MAIN : $namespaces[0];
-               $t = Title::newFromText( $search, $ns );
-               if ( !$t || !$t->exists() ) {
-                       // No exact match so just return the search results
-                       return $srchres;
-               }
-               $string = $t->getPrefixedText();
-               $key = array_search( $string, $srchres );
-               if ( $key !== false ) {
-                       // Exact match was in the results so just move it to the front
-                       return $this->pullFront( $key, $srchres );
-               }
-               // Exact match not in the search results so check for some redirect handling cases
-               if ( $t->isRedirect() ) {
-                       $target = $this->getRedirectTarget( $t );
-                       $key = array_search( $target, $srchres );
-                       if ( $key !== false ) {
-                               // Exact match is a redirect to one of the returned matches so pull the
-                               // returned match to the front.  This might look odd but the alternative
-                               // is to put the redirect in front and drop the match.  The name of the
-                               // found match is often more descriptive/better formed than the name of
-                               // the redirect AND by definition they share a prefix.  Hopefully this
-                               // choice is less confusing and more helpful.  But it might not be.  But
-                               // it is the choice we're going with for now.
-                               return $this->pullFront( $key, $srchres );
-                       }
-                       $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
-                       if ( isset( $redirectTargetsToRedirect[$target] ) ) {
-                               // The exact match and something in the results list are both redirects
-                               // to the same thing!  In this case we'll pull the returned match to the
-                               // top following the same logic above.  Again, it might not be a perfect
-                               // choice but it'll do.
-                               return $this->pullFront( $redirectTargetsToRedirect[$target], $srchres );
-                       }
-               } else {
-                       $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
-                       if ( isset( $redirectTargetsToRedirect[$string] ) ) {
-                               // The exact match is the target of a redirect already in the results list so remove
-                               // the redirect from the results list and push the exact match to the front
-                               array_splice( $srchres, $redirectTargetsToRedirect[$string], 1 );
-                               array_unshift( $srchres, $string );
-                               return $srchres;
-                       }
-               }
-
-               // Exact match is totally unique from the other results so just add it to the front
-               array_unshift( $srchres, $string );
-               // And roll one off the end if the results are too long
-               if ( count( $srchres ) > $limit ) {
-                       array_pop( $srchres );
-               }
-               return $srchres;
-       }
-
-       /**
-        * @param Array(string) $titles as strings
-        * @return Array(string => int) redirect target prefixedText to index of title in titles
-        *   that is a redirect to it.
-        */
-       private function redirectTargetsToRedirect( $titles ) {
-               $result = array();
-               foreach ( $titles as $key => $titleText ) {
-                       $title = Title::newFromText( $titleText );
-                       if ( !$title || !$title->isRedirect() ) {
-                               continue;
-                       }
-                       $target = $this->getRedirectTarget( $title );
-                       if ( !$target ) {
-                               continue;
-                       }
-                       $result[$target] = $key;
-               }
-               return $result;
-       }
-
-       /**
-        * @param int $key key to pull to the front
-        * @return array $array with the item at $key pulled to the front
-        */
-       private function pullFront( $key, $array ) {
-               $cut = array_splice( $array, $key, 1 );
-               array_unshift( $array, $cut[0] );
-               return $array;
-       }
-
-       private function getRedirectTarget( $title ) {
-               $page = WikiPage::factory( $title );
-               if ( !$page->exists() ) {
-                       return null;
-               }
-               return $page->getRedirectTarget()->getPrefixedText();
+               $rescorer = new SearchExactMatchRescorer();
+               return $rescorer->rescore( $search, $namespaces, $srchres, $limit );
        }
 
        /**
@@ -362,10 +265,7 @@ abstract class PrefixSearch {
                        $ns = NS_MAIN; // if searching on many always default to main
                }
 
-               $t = null;
-               if ( is_string( $search ) ) {
-                       $t = Title::newFromText( $search, $ns );
-               }
+               $t = Title::newFromText( $search, $ns );
 
                $prefix = $t ? $t->getDBkey() : '';
                $dbr = wfGetDB( DB_SLAVE );
index a498817..1d7ac72 100644 (file)
@@ -1505,11 +1505,18 @@ class Revision implements IDBAccessObject {
                }
 
                $content = $this->getContent( Revision::RAW );
+               $prefixedDBkey = $title->getPrefixedDBkey();
+               $revId = $this->mId;
 
-               if ( !$content || !$content->isValid() ) {
-                       $t = $title->getPrefixedDBkey();
-
-                       throw new MWException( "Content of $t is not valid! Content model is $model" );
+               if ( !$content ) {
+                       throw new MWException(
+                               "Content of revision $revId ($prefixedDBkey) could not be loaded for validation!"
+                       );
+               }
+               if ( !$content->isValid() ) {
+                       throw new MWException(
+                               "Content of revision $revId ($prefixedDBkey) is not valid! Content model is $model"
+                       );
                }
        }
 
@@ -1519,7 +1526,7 @@ class Revision implements IDBAccessObject {
         * @return string
         */
        public static function base36Sha1( $text ) {
-               return wfBaseConvert( sha1( $text ), 16, 36, 31 );
+               return Wikimedia\base_convert( sha1( $text ), 16, 36, 31 );
        }
 
        /**
index f88dd05..b1b5da2 100644 (file)
@@ -476,7 +476,8 @@ class Sanitizer {
                                }
 
                                $badtag = false;
-                               if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
+                               $t = strtolower( $t );
+                               if ( isset( $htmlelements[$t] ) ) {
                                        # Check our stack
                                        if ( $slash && isset( $htmlsingleonly[$t] ) ) {
                                                $badtag = true;
@@ -596,7 +597,8 @@ class Sanitizer {
                                        list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
 
                                        $badtag = false;
-                                       if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
+                                       $t = strtolower( $t );
+                                       if ( isset( $htmlelements[$t] ) ) {
                                                if ( is_callable( $processCallback ) ) {
                                                        call_user_func_array( $processCallback, array( &$params, $args ) );
                                                }
@@ -748,7 +750,15 @@ class Sanitizer {
                        }
 
                        # Allow any attribute beginning with "data-"
-                       if ( !preg_match( '/^data-(?!ooui)/i', $attribute ) && !isset( $whitelist[$attribute] ) ) {
+                       # However:
+                       # * data-ooui is reserved for ooui
+                       # * data-mw and data-parsoid are reserved for parsoid
+                       # * data-mw-<ext name here> is reserved for extensions (or core) if
+                       #   they need to communicate some data to the client and want to be
+                       #   sure that it isn't coming from an untrusted user.
+                       if ( !preg_match( '/^data-(?!ooui|mw|parsoid)/i', $attribute )
+                               && !isset( $whitelist[$attribute] )
+                       ) {
                                continue;
                        }
 
@@ -1629,7 +1639,7 @@ class Sanitizer {
 
                        # 10.2
                        'ul'         => array_merge( $common, array( 'type' ) ),
-                       'ol'         => array_merge( $common, array( 'type', 'start' ) ),
+                       'ol'         => array_merge( $common, array( 'type', 'start', 'reversed' ) ),
                        'li'         => array_merge( $common, array( 'type', 'value' ) ),
 
                        # 10.3
index fbfef1f..e22184f 100644 (file)
@@ -238,7 +238,10 @@ if ( $wgUseInstantCommons ) {
                'class' => 'ForeignAPIRepo',
                'name' => 'wikimediacommons',
                'apibase' => 'https://commons.wikimedia.org/w/api.php',
+               'url' => 'https://upload.wikimedia.org/wikipedia/commons',
+               'thumbUrl' => 'https://upload.wikimedia.org/wikipedia/commons/thumb',
                'hashLevels' => 2,
+               'transformVia404' => true,
                'fetchDescription' => true,
                'descriptionCacheExpiry' => 43200,
                'apiThumbCacheExpiry' => 86400,
@@ -377,9 +380,12 @@ if ( $wgResourceLoaderMaxQueryLength === false ) {
 // upload size.
 $wgMinUploadChunkSize = min(
        $wgMinUploadChunkSize,
-       $wgMaxUploadSize,
-       wfShorthandToInteger( ini_get( 'upload_max_filesize' ), 1e100 ),
-       wfShorthandToInteger( ini_get( 'post_max_size' ), 1e100 ) - 1024 # Leave room for other parameters
+       UploadBase::getMaxUploadSize( 'file' ),
+       UploadBase::getMaxPhpUploadSize(),
+       ( wfShorthandToInteger(
+               ini_get( 'post_max_size' ) ?: ini_get( 'hhvm.server.max_post_size' ),
+               PHP_INT_MAX
+       ) ?: PHP_INT_MAX ) - 1024 // Leave some room for other POST parameters
 );
 
 /**
@@ -415,11 +421,9 @@ if ( is_array( $wgExtraNamespaces ) ) {
 // To determine the user language, use $wgLang->getCode()
 $wgContLanguageCode = $wgLanguageCode;
 
-// Easy to forget to falsify $wgShowIPinHeader for static caches.
-// If file cache or squid cache is on, just disable this (DWIMD).
-// Do the same for $wgDebugToolbar.
+// Easy to forget to falsify $wgDebugToolbar for static caches.
+// If file cache or CDN cache is on, just disable this (DWIMD).
 if ( $wgUseFileCache || $wgUseSquid ) {
-       $wgShowIPinHeader = false;
        $wgDebugToolbar = false;
 }
 
@@ -468,11 +472,6 @@ if ( $wgCookieSecure === 'detect' ) {
        $wgCookieSecure = ( WebRequest::detectProtocol() === 'https' );
 }
 
-// Back compatibility for $wgRateLimitLog deprecated with 1.23
-if ( $wgRateLimitLog && !array_key_exists( 'ratelimit', $wgDebugLogGroups ) ) {
-       $wgDebugLogGroups['ratelimit'] = $wgRateLimitLog;
-}
-
 if ( $wgProfileOnly ) {
        $wgDebugLogGroups['profileoutput'] = $wgDebugLogFile;
        $wgDebugLogFile = '';
@@ -510,6 +509,21 @@ MWExceptionHandler::installHandler();
 
 require_once "$IP/includes/compat/normal/UtfNormalUtil.php";
 
+
+$ps_validation = Profiler::instance()->scopedProfileIn( $fname . '-validation' );
+
+// T48998: Bail out early if $wgArticlePath is non-absolute
+if ( !preg_match( '/^(https?:\/\/|\/)/', $wgArticlePath ) ) {
+       throw new FatalError(
+               'If you use a relative URL for $wgArticlePath, it must start ' .
+               'with a slash (<code>/</code>).<br><br>See ' .
+               '<a href="https://www.mediawiki.org/wiki/Manual:$wgArticlePath">' .
+               'https://www.mediawiki.org/wiki/Manual:$wgArticlePath</a>.'
+       );
+}
+
+Profiler::instance()->scopedProfileOut( $ps_validation );
+
 $ps_default2 = Profiler::instance()->scopedProfileIn( $fname . '-defaults2' );
 
 if ( $wgCanonicalServer === false ) {
@@ -621,7 +635,10 @@ $wgMemc = wfGetMainCache();
 $messageMemc = wfGetMessageCacheStorage();
 $parserMemc = wfGetParserCacheStorage();
 
-wfDebugLog( 'caches', 'main: ' . get_class( $wgMemc ) .
+wfDebugLog( 'caches',
+       'cluster: ' . get_class( $wgMemc ) .
+       ', WAN: ' . $wgMainWANCache .
+       ', stash: ' . $wgMainStash .
        ', message: ' . get_class( $messageMemc ) .
        ', parser: ' . get_class( $parserMemc ) );
 
@@ -689,7 +706,7 @@ $wgTitle = null;
 Profiler::instance()->scopedProfileOut( $ps_globals );
 $ps_extensions = Profiler::instance()->scopedProfileIn( $fname . '-extensions' );
 
-// Extension setup functions for extensions other than skins
+// Extension setup functions
 // Entries should be added to this variable during the inclusion
 // of the extension file. This allows the extension to perform
 // any necessary initialisation in the fully initialised environment
index 5b361b9..33bab65 100644 (file)
@@ -180,9 +180,10 @@ class SiteStats {
         * @return int
         */
        static function numberingroup( $group ) {
-               return ObjectCache::getMainWANInstance()->getWithSetCallback(
+               $cache = ObjectCache::getMainWANInstance();
+               return $cache->getWithSetCallback(
                        wfMemcKey( 'SiteStats', 'groupcounts', $group ),
-                       3600,
+                       $cache::TTL_HOUR,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) {
                                $dbr = wfGetDB( DB_SLAVE );
 
index 44d264d..8ce3420 100644 (file)
@@ -103,7 +103,7 @@ class TemplateParser {
 
                if ( $secretKey ) {
                        // See if the compiled PHP code is stored in cache.
-                       $cache = ObjectCache::newAccelerator( CACHE_ANYTHING );
+                       $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
                        $key = $cache->makeKey( 'template', $templateName, $fastHash );
                        $code = $this->forceRecompile ? null : $cache->get( $key );
 
index 9ada4f3..5d8b072 100644 (file)
@@ -31,7 +31,7 @@
  *       and does not rely on global state or the database.
  */
 class Title {
-       /** @var MapCacheLRU */
+       /** @var HashBagOStuff */
        static private $titleCache = null;
 
        /**
@@ -252,7 +252,7 @@ class Title {
         * Create a new Title from text, such as what one would find in a link. De-
         * codes any HTML entities in the text.
         *
-        * @param string $text The link text; spaces, prefixes, and an
+        * @param string|null $text The link text; spaces, prefixes, and an
         *   initial ':' indicating the main namespace are accepted.
         * @param int $defaultNamespace The namespace to use if none is specified
         *   by a prefix.  If you want to force a specific namespace even if
@@ -264,13 +264,13 @@ class Title {
        public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
                if ( is_object( $text ) ) {
                        throw new InvalidArgumentException( '$text must be a string.' );
-               } elseif ( !is_string( $text ) ) {
+               }
+               if ( $text !== null && !is_string( $text ) ) {
                        wfDebugLog( 'T76305', wfGetAllCallers( 5 ) );
-                       wfWarn(
-                               __METHOD__ . ': $text must be a string. ' .
-                                       'This will throw an InvalidArgumentException in future.',
-                               2
-                       );
+                       return null;
+               }
+               if ( $text === null ) {
+                       return null;
                }
 
                try {
@@ -296,24 +296,23 @@ class Title {
         */
        public static function newFromTextThrow( $text, $defaultNamespace = NS_MAIN ) {
                if ( is_object( $text ) ) {
-                       throw new MWException( 'Title::newFromTextThrow given an object' );
+                       throw new MWException( '$text must be a string, given an object' );
                }
 
-               $cache = self::getTitleCache();
+               $titleCache = self::getTitleCache();
 
-               /**
-                * Wiki pages often contain multiple links to the same page.
-                * Title normalization and parsing can become expensive on
-                * pages with many links, so we can save a little time by
-                * caching them.
-                *
-                * In theory these are value objects and won't get changed...
-                */
-               if ( $defaultNamespace == NS_MAIN && $cache->has( $text ) ) {
-                       return $cache->get( $text );
+               // Wiki pages often contain multiple links to the same page.
+               // Title normalization and parsing can become expensive on pages with many
+               // links, so we can save a little time by caching them.
+               // In theory these are value objects and won't get changed...
+               if ( $defaultNamespace == NS_MAIN ) {
+                       $t = $titleCache->get( $text );
+                       if ( $t ) {
+                               return $t;
+                       }
                }
 
-               # Convert things like &eacute; &#257; or &#x3017; into normalized (bug 14952) text
+               // Convert things like &eacute; &#257; or &#x3017; into normalized (bug 14952) text
                $filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
 
                $t = new Title();
@@ -322,7 +321,7 @@ class Title {
 
                $t->secureAndSplit();
                if ( $defaultNamespace == NS_MAIN ) {
-                       $cache->set( $text, $t );
+                       $titleCache->set( $text, $t );
                }
                return $t;
        }
@@ -363,11 +362,11 @@ class Title {
        }
 
        /**
-        * @return MapCacheLRU
+        * @return HashBagOStuff
         */
        private static function getTitleCache() {
                if ( self::$titleCache == null ) {
-                       self::$titleCache = new MapCacheLRU( self::CACHE_MAX );
+                       self::$titleCache = new HashBagOStuff( array( 'maxKeys' => self::CACHE_MAX ) );
                }
                return self::$titleCache;
        }
@@ -1825,7 +1824,7 @@ class Title {
 
        /**
         * Get the URL form for an internal link.
-        * - Used in various Squid-related code, in case we have a different
+        * - Used in various CDN-related code, in case we have a different
         * internal hostname for the server from the exposed one.
         *
         * This uses $wgInternalServer to qualify the path, or $wgServer
@@ -1944,7 +1943,7 @@ class Title {
         *   - secure : does cheap and expensive checks, using the master as needed
         * @param array $ignoreErrors Array of Strings Set this to a list of message keys
         *   whose corresponding errors may be ignored.
-        * @return array Array of arguments to wfMessage to explain permissions problems.
+        * @return array Array of arrays of the arguments to wfMessage to explain permissions problems.
         */
        public function getUserPermissionsErrors(
                $action, $user, $rigor = 'secure', $ignoreErrors = array()
@@ -1953,9 +1952,12 @@ class Title {
 
                // Remove the errors being ignored.
                foreach ( $errors as $index => $error ) {
-                       $error_key = is_array( $error ) ? $error[0] : $error;
+                       $errKey = is_array( $error ) ? $error[0] : $error;
 
-                       if ( in_array( $error_key, $ignoreErrors ) ) {
+                       if ( in_array( $errKey, $ignoreErrors ) ) {
+                               unset( $errors[$index] );
+                       }
+                       if ( $errKey instanceof MessageSpecifier && in_array( $errKey->getKey(), $ignoreErrors ) ) {
                                unset( $errors[$index] );
                        }
                }
@@ -2054,6 +2056,9 @@ class Title {
                } elseif ( $result !== '' && is_string( $result ) ) {
                        // A string representing a message-id
                        $errors[] = array( $result );
+               } elseif ( $result instanceof MessageSpecifier ) {
+                       // A message specifier representing an error
+                       $errors[] = array( $result );
                } elseif ( $result === false ) {
                        // a generic "We don't want them to do that"
                        $errors[] = array( 'badaccess-group0' );
@@ -3552,12 +3557,12 @@ class Title {
        }
 
        /**
-        * Get a list of URLs to purge from the Squid cache when this
+        * Get a list of URLs to purge from the CDN cache when this
         * page changes
         *
         * @return string[] Array of String the URLs
         */
-       public function getSquidURLs() {
+       public function getCdnUrls() {
                $urls = array(
                        $this->getInternalURL(),
                        $this->getInternalURL( 'action=history' )
@@ -3583,15 +3588,20 @@ class Title {
        }
 
        /**
-        * Purge all applicable Squid URLs
+        * @deprecated since 1.27 use getCdnUrls()
+        */
+       public function getSquidURLs() {
+               return $this->getCdnUrls();
+       }
+
+       /**
+        * Purge all applicable CDN URLs
         */
        public function purgeSquid() {
-               global $wgUseSquid;
-               if ( $wgUseSquid ) {
-                       $urls = $this->getSquidURLs();
-                       $u = new SquidUpdate( $urls );
-                       $u->doUpdate();
-               }
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $this->getCdnUrls() ),
+                       DeferredUpdates::PRESEND
+               );
        }
 
        /**
@@ -4412,7 +4422,7 @@ class Title {
        }
 
        /**
-        * Update page_touched timestamps and send squid purge messages for
+        * Update page_touched timestamps and send CDN purge messages for
         * pages linking to this title. May be sent to the job queue depending
         * on the number of links. Typically called on create and delete.
         */
diff --git a/includes/User.php b/includes/User.php
deleted file mode 100644 (file)
index 6e52a1d..0000000
+++ /dev/null
@@ -1,5333 +0,0 @@
-<?php
-/**
- * Implements the User class for the %MediaWiki software.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- */
-
-/**
- * String Some punctuation to prevent editing from broken text-mangling proxies.
- * @ingroup Constants
- */
-define( 'EDIT_TOKEN_SUFFIX', '+\\' );
-
-/**
- * The User object encapsulates all of the user-specific settings (user_id,
- * name, rights, email address, options, last login time). Client
- * classes use the getXXX() functions to access these fields. These functions
- * do all the work of determining whether the user is logged in,
- * whether the requested option can be satisfied from cookies or
- * whether a database query is needed. Most of the settings needed
- * for rendering normal pages are set in the cookie to minimize use
- * of the database.
- */
-class User implements IDBAccessObject {
-       /**
-        * @const int Number of characters in user_token field.
-        */
-       const TOKEN_LENGTH = 32;
-
-       /**
-        * Global constant made accessible as class constants so that autoloader
-        * magic can be used.
-        */
-       const EDIT_TOKEN_SUFFIX = EDIT_TOKEN_SUFFIX;
-
-       /**
-        * @const int Serialized record version.
-        */
-       const VERSION = 10;
-
-       /**
-        * Maximum items in $mWatchedItems
-        */
-       const MAX_WATCHED_ITEMS_CACHE = 100;
-
-       /**
-        * Exclude user options that are set to their default value.
-        * @since 1.25
-        */
-       const GETOPTIONS_EXCLUDE_DEFAULTS = 1;
-
-       /**
-        * Array of Strings List of member variables which are saved to the
-        * shared cache (memcached). Any operation which changes the
-        * corresponding database fields must call a cache-clearing function.
-        * @showinitializer
-        */
-       protected static $mCacheVars = array(
-               // user table
-               'mId',
-               'mName',
-               'mRealName',
-               'mEmail',
-               'mTouched',
-               'mToken',
-               'mEmailAuthenticated',
-               'mEmailToken',
-               'mEmailTokenExpires',
-               'mRegistration',
-               'mEditCount',
-               // user_groups table
-               'mGroups',
-               // user_properties table
-               'mOptionOverrides',
-       );
-
-       /**
-        * Array of Strings Core rights.
-        * Each of these should have a corresponding message of the form
-        * "right-$right".
-        * @showinitializer
-        */
-       protected static $mCoreRights = array(
-               'apihighlimits',
-               'applychangetags',
-               'autoconfirmed',
-               'autopatrol',
-               'bigdelete',
-               'block',
-               'blockemail',
-               'bot',
-               'browsearchive',
-               'changetags',
-               'createaccount',
-               'createpage',
-               'createtalk',
-               'delete',
-               'deletedhistory',
-               'deletedtext',
-               'deletelogentry',
-               'deleterevision',
-               'edit',
-               'editcontentmodel',
-               'editinterface',
-               'editprotected',
-               'editmyoptions',
-               'editmyprivateinfo',
-               'editmyusercss',
-               'editmyuserjs',
-               'editmywatchlist',
-               'editsemiprotected',
-               'editusercssjs', # deprecated
-               'editusercss',
-               'edituserjs',
-               'hideuser',
-               'import',
-               'importupload',
-               'ipblock-exempt',
-               'managechangetags',
-               'markbotedits',
-               'mergehistory',
-               'minoredit',
-               'move',
-               'movefile',
-               'move-categorypages',
-               'move-rootuserpages',
-               'move-subpages',
-               'nominornewtalk',
-               'noratelimit',
-               'override-export-depth',
-               'pagelang',
-               'passwordreset',
-               'patrol',
-               'patrolmarks',
-               'protect',
-               'proxyunbannable',
-               'purge',
-               'read',
-               'reupload',
-               'reupload-own',
-               'reupload-shared',
-               'rollback',
-               'sendemail',
-               'siteadmin',
-               'suppressionlog',
-               'suppressredirect',
-               'suppressrevision',
-               'unblockself',
-               'undelete',
-               'unwatchedpages',
-               'upload',
-               'upload_by_url',
-               'userrights',
-               'userrights-interwiki',
-               'viewmyprivateinfo',
-               'viewmywatchlist',
-               'viewsuppressed',
-               'writeapi',
-       );
-
-       /**
-        * String Cached results of getAllRights()
-        */
-       protected static $mAllRights = false;
-
-       /** Cache variables */
-       // @{
-       public $mId;
-       /** @var string */
-       public $mName;
-       /** @var string */
-       public $mRealName;
-
-       /**
-        * These fields were marked "@private", but were defined as public to
-        * maintain compatibility with PHP4 code since PHP4 didn't support access
-        * restrictions. AuthManager makes password handling pluggable, meaning
-        * these fields don't make sense anymore. If this broke something, see
-        * T89459 for the context of the change.
-        * @deprecated These are mostly unused, but kept for now to raise errors on attempted access.
-        */
-       // @{
-       private $mPassword = null;
-       private $mNewpassword;
-       private $mNewpassTime;
-       private $mPasswordExpires;
-       // @}
-
-       /** @var string */
-       public $mEmail;
-       /** @var string TS_MW timestamp from the DB */
-       public $mTouched;
-       /** @var string TS_MW timestamp from cache */
-       protected $mQuickTouched;
-       /** @var string */
-       protected $mToken;
-       /** @var string */
-       public $mEmailAuthenticated;
-       /** @var string */
-       protected $mEmailToken;
-       /** @var string */
-       protected $mEmailTokenExpires;
-       /** @var string */
-       protected $mRegistration;
-       /** @var int */
-       protected $mEditCount;
-       /** @var array */
-       public $mGroups;
-       /** @var array */
-       protected $mOptionOverrides;
-       // @}
-
-       /**
-        * Bool Whether the cache variables have been loaded.
-        */
-       // @{
-       public $mOptionsLoaded;
-
-       /**
-        * Array with already loaded items or true if all items have been loaded.
-        */
-       protected $mLoadedItems = array();
-       // @}
-
-       /**
-        * String Initialization data source if mLoadedItems!==true. May be one of:
-        *  - 'defaults'   anonymous user initialised from class defaults
-        *  - 'name'       initialise from mName
-        *  - 'id'         initialise from mId
-        *  - 'session'    log in from cookies or session if possible
-        *
-        * Use the User::newFrom*() family of functions to set this.
-        */
-       public $mFrom;
-
-       /**
-        * Lazy-initialized variables, invalidated with clearInstanceCache
-        */
-       protected $mNewtalk;
-       /** @var string */
-       protected $mDatePreference;
-       /** @var string */
-       public $mBlockedby;
-       /** @var string */
-       protected $mHash;
-       /** @var array */
-       public $mRights;
-       /** @var string */
-       protected $mBlockreason;
-       /** @var array */
-       protected $mEffectiveGroups;
-       /** @var array */
-       protected $mImplicitGroups;
-       /** @var array */
-       protected $mFormerGroups;
-       /** @var bool */
-       protected $mBlockedGlobally;
-       /** @var bool */
-       protected $mLocked;
-       /** @var bool */
-       public $mHideName;
-       /** @var array */
-       public $mOptions;
-
-       /**
-        * @var WebRequest
-        */
-       private $mRequest;
-
-       /** @var Block */
-       public $mBlock;
-
-       /** @var bool */
-       protected $mAllowUsertalk;
-
-       /** @var Block */
-       private $mBlockedFromCreateAccount = false;
-
-       /** @var array */
-       private $mWatchedItems = array();
-
-       /** @var integer User::READ_* constant bitfield used to load data */
-       protected $queryFlagsUsed = self::READ_NORMAL;
-
-       public static $idCacheByName = array();
-
-       /**
-        * Lightweight constructor for an anonymous user.
-        * Use the User::newFrom* factory functions for other kinds of users.
-        *
-        * @see newFromName()
-        * @see newFromId()
-        * @see newFromConfirmationCode()
-        * @see newFromSession()
-        * @see newFromRow()
-        */
-       public function __construct() {
-               $this->clearInstanceCache( 'defaults' );
-       }
-
-       /**
-        * @return string
-        */
-       public function __toString() {
-               return $this->getName();
-       }
-
-       /**
-        * Load the user table data for this object from the source given by mFrom.
-        *
-        * @param integer $flags User::READ_* constant bitfield
-        */
-       public function load( $flags = self::READ_NORMAL ) {
-               if ( $this->mLoadedItems === true ) {
-                       return;
-               }
-
-               // Set it now to avoid infinite recursion in accessors
-               $this->mLoadedItems = true;
-               $this->queryFlagsUsed = $flags;
-
-               switch ( $this->mFrom ) {
-                       case 'defaults':
-                               $this->loadDefaults();
-                               break;
-                       case 'name':
-                               // Make sure this thread sees its own changes
-                               if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
-                                       $flags |= self::READ_LATEST;
-                                       $this->queryFlagsUsed = $flags;
-                               }
-
-                               $this->mId = self::idFromName( $this->mName, $flags );
-                               if ( !$this->mId ) {
-                                       // Nonexistent user placeholder object
-                                       $this->loadDefaults( $this->mName );
-                               } else {
-                                       $this->loadFromId( $flags );
-                               }
-                               break;
-                       case 'id':
-                               $this->loadFromId( $flags );
-                               break;
-                       case 'session':
-                               if ( !$this->loadFromSession() ) {
-                                       // Loading from session failed. Load defaults.
-                                       $this->loadDefaults();
-                               }
-                               Hooks::run( 'UserLoadAfterLoadFromSession', array( $this ) );
-                               break;
-                       default:
-                               throw new UnexpectedValueException(
-                                       "Unrecognised value for User->mFrom: \"{$this->mFrom}\"" );
-               }
-       }
-
-       /**
-        * Load user table data, given mId has already been set.
-        * @param integer $flags User::READ_* constant bitfield
-        * @return bool False if the ID does not exist, true otherwise
-        */
-       public function loadFromId( $flags = self::READ_NORMAL ) {
-               if ( $this->mId == 0 ) {
-                       $this->loadDefaults();
-                       return false;
-               }
-
-               // Try cache (unless this needs data from the master DB).
-               // NOTE: if this thread called saveSettings(), the cache was cleared.
-               $latest = DBAccessObjectUtils::hasFlags( $flags, self::READ_LATEST );
-               if ( $latest || !$this->loadFromCache() ) {
-                       wfDebug( "User: cache miss for user {$this->mId}\n" );
-                       // Load from DB (make sure this thread sees its own changes)
-                       if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
-                               $flags |= self::READ_LATEST;
-                       }
-                       if ( !$this->loadFromDatabase( $flags ) ) {
-                               // Can't load from ID, user is anonymous
-                               return false;
-                       }
-                       $this->saveToCache();
-               }
-
-               $this->mLoadedItems = true;
-               $this->queryFlagsUsed = $flags;
-
-               return true;
-       }
-
-       /**
-        * Load user data from shared cache, given mId has already been set.
-        *
-        * @return bool false if the ID does not exist or data is invalid, true otherwise
-        * @since 1.25
-        */
-       protected function loadFromCache() {
-               if ( $this->mId == 0 ) {
-                       $this->loadDefaults();
-                       return false;
-               }
-
-               $key = wfMemcKey( 'user', 'id', $this->mId );
-               $data = ObjectCache::getMainWANInstance()->get( $key );
-               if ( !is_array( $data ) || $data['mVersion'] < self::VERSION ) {
-                       // Object is expired
-                       return false;
-               }
-
-               wfDebug( "User: got user {$this->mId} from cache\n" );
-
-               // Restore from cache
-               foreach ( self::$mCacheVars as $name ) {
-                       $this->$name = $data[$name];
-               }
-
-               return true;
-       }
-
-       /**
-        * Save user data to the shared cache
-        *
-        * This method should not be called outside the User class
-        */
-       public function saveToCache() {
-               $this->load();
-               $this->loadGroups();
-               $this->loadOptions();
-
-               if ( $this->isAnon() ) {
-                       // Anonymous users are uncached
-                       return;
-               }
-
-               $data = array();
-               foreach ( self::$mCacheVars as $name ) {
-                       $data[$name] = $this->$name;
-               }
-               $data['mVersion'] = self::VERSION;
-               $key = wfMemcKey( 'user', 'id', $this->mId );
-
-               $opts = Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
-               ObjectCache::getMainWANInstance()->set( $key, $data, 3600, $opts );
-       }
-
-       /** @name newFrom*() static factory methods */
-       // @{
-
-       /**
-        * Static factory method for creation from username.
-        *
-        * This is slightly less efficient than newFromId(), so use newFromId() if
-        * you have both an ID and a name handy.
-        *
-        * @param string $name Username, validated by Title::newFromText()
-        * @param string|bool $validate Validate username. Takes the same parameters as
-        *  User::getCanonicalName(), except that true is accepted as an alias
-        *  for 'valid', for BC.
-        *
-        * @return User|bool User object, or false if the username is invalid
-        *  (e.g. if it contains illegal characters or is an IP address). If the
-        *  username is not present in the database, the result will be a user object
-        *  with a name, zero user ID and default settings.
-        */
-       public static function newFromName( $name, $validate = 'valid' ) {
-               if ( $validate === true ) {
-                       $validate = 'valid';
-               }
-               $name = self::getCanonicalName( $name, $validate );
-               if ( $name === false ) {
-                       return false;
-               } else {
-                       // Create unloaded user object
-                       $u = new User;
-                       $u->mName = $name;
-                       $u->mFrom = 'name';
-                       $u->setItemLoaded( 'name' );
-                       return $u;
-               }
-       }
-
-       /**
-        * Static factory method for creation from a given user ID.
-        *
-        * @param int $id Valid user ID
-        * @return User The corresponding User object
-        */
-       public static function newFromId( $id ) {
-               $u = new User;
-               $u->mId = $id;
-               $u->mFrom = 'id';
-               $u->setItemLoaded( 'id' );
-               return $u;
-       }
-
-       /**
-        * Factory method to fetch whichever user has a given email confirmation code.
-        * This code is generated when an account is created or its e-mail address
-        * has changed.
-        *
-        * If the code is invalid or has expired, returns NULL.
-        *
-        * @param string $code Confirmation code
-        * @param int $flags User::READ_* bitfield
-        * @return User|null
-        */
-       public static function newFromConfirmationCode( $code, $flags = 0 ) {
-               $db = ( $flags & self::READ_LATEST ) == self::READ_LATEST
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
-
-               $id = $db->selectField(
-                       'user',
-                       'user_id',
-                       array(
-                               'user_email_token' => md5( $code ),
-                               'user_email_token_expires > ' . $db->addQuotes( $db->timestamp() ),
-                       )
-               );
-
-               return $id ? User::newFromId( $id ) : null;
-       }
-
-       /**
-        * Create a new user object using data from session or cookies. If the
-        * login credentials are invalid, the result is an anonymous user.
-        *
-        * @param WebRequest|null $request Object to use; $wgRequest will be used if omitted.
-        * @return User
-        */
-       public static function newFromSession( WebRequest $request = null ) {
-               $user = new User;
-               $user->mFrom = 'session';
-               $user->mRequest = $request;
-               return $user;
-       }
-
-       /**
-        * Create a new user object from a user row.
-        * The row should have the following fields from the user table in it:
-        * - either user_name or user_id to load further data if needed (or both)
-        * - user_real_name
-        * - all other fields (email, etc.)
-        * It is useless to provide the remaining fields if either user_id,
-        * user_name and user_real_name are not provided because the whole row
-        * will be loaded once more from the database when accessing them.
-        *
-        * @param stdClass $row A row from the user table
-        * @param array $data Further data to load into the object (see User::loadFromRow for valid keys)
-        * @return User
-        */
-       public static function newFromRow( $row, $data = null ) {
-               $user = new User;
-               $user->loadFromRow( $row, $data );
-               return $user;
-       }
-
-       /**
-        * Static factory method for creation of a "system" user from username.
-        *
-        * A "system" user is an account that's used to attribute logged actions
-        * taken by MediaWiki itself, as opposed to a bot or human user. Examples
-        * might include the 'Maintenance script' or 'Conversion script' accounts
-        * used by various scripts in the maintenance/ directory or accounts such
-        * as 'MediaWiki message delivery' used by the MassMessage extension.
-        *
-        * This can optionally create the user if it doesn't exist, and "steal" the
-        * account if it does exist.
-        *
-        * @param string $name Username
-        * @param array $options Options are:
-        *  - validate: As for User::getCanonicalName(), default 'valid'
-        *  - create: Whether to create the user if it doesn't already exist, default true
-        *  - steal: Whether to reset the account's password and email if it
-        *    already exists, default false
-        * @return User|null
-        */
-       public static function newSystemUser( $name, $options = array() ) {
-               $options += array(
-                       'validate' => 'valid',
-                       'create' => true,
-                       'steal' => false,
-               );
-
-               $name = self::getCanonicalName( $name, $options['validate'] );
-               if ( $name === false ) {
-                       return null;
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               $row = $dbw->selectRow(
-                       'user',
-                       array_merge(
-                               self::selectFields(),
-                               array( 'user_password', 'user_newpassword' )
-                       ),
-                       array( 'user_name' => $name ),
-                       __METHOD__
-               );
-               if ( !$row ) {
-                       // No user. Create it?
-                       return $options['create'] ? self::createNew( $name ) : null;
-               }
-               $user = self::newFromRow( $row );
-
-               // A user is considered to exist as a non-system user if it has a
-               // password set, or a temporary password set, or an email set.
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               try {
-                       $password = $passwordFactory->newFromCiphertext( $row->user_password );
-               } catch ( PasswordError $e ) {
-                       wfDebug( 'Invalid password hash found in database.' );
-                       $password = PasswordFactory::newInvalidPassword();
-               }
-               try {
-                       $newpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
-               } catch ( PasswordError $e ) {
-                       wfDebug( 'Invalid password hash found in database.' );
-                       $newpassword = PasswordFactory::newInvalidPassword();
-               }
-               if ( !$password instanceof InvalidPassword || !$newpassword instanceof InvalidPassword
-                       || $user->mEmail
-               ) {
-                       // User exists. Steal it?
-                       if ( !$options['steal'] ) {
-                               return null;
-                       }
-
-                       $nopass = PasswordFactory::newInvalidPassword()->toString();
-
-                       $dbw->update(
-                               'user',
-                               array(
-                                       'user_password' => $nopass,
-                                       'user_newpassword' => $nopass,
-                                       'user_newpass_time' => null,
-                               ),
-                               array( 'user_id' => $user->getId() ),
-                               __METHOD__
-                       );
-                       $user->invalidateEmail();
-                       $user->saveSettings();
-               }
-
-               return $user;
-       }
-
-       // @}
-
-       /**
-        * Get the username corresponding to a given user ID
-        * @param int $id User ID
-        * @return string|bool The corresponding username
-        */
-       public static function whoIs( $id ) {
-               return UserCache::singleton()->getProp( $id, 'name' );
-       }
-
-       /**
-        * Get the real name of a user given their user ID
-        *
-        * @param int $id User ID
-        * @return string|bool The corresponding user's real name
-        */
-       public static function whoIsReal( $id ) {
-               return UserCache::singleton()->getProp( $id, 'real_name' );
-       }
-
-       /**
-        * Get database id given a user name
-        * @param string $name Username
-        * @param integer $flags User::READ_* constant bitfield
-        * @return int|null The corresponding user's ID, or null if user is nonexistent
-        */
-       public static function idFromName( $name, $flags = self::READ_NORMAL ) {
-               $nt = Title::makeTitleSafe( NS_USER, $name );
-               if ( is_null( $nt ) ) {
-                       // Illegal name
-                       return null;
-               }
-
-               if ( isset( self::$idCacheByName[$name] ) ) {
-                       return self::$idCacheByName[$name];
-               }
-
-               $db = ( $flags & self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
-
-               $s = $db->selectRow(
-                       'user',
-                       array( 'user_id' ),
-                       array( 'user_name' => $nt->getText() ),
-                       __METHOD__
-               );
-
-               if ( $s === false ) {
-                       $result = null;
-               } else {
-                       $result = $s->user_id;
-               }
-
-               self::$idCacheByName[$name] = $result;
-
-               if ( count( self::$idCacheByName ) > 1000 ) {
-                       self::$idCacheByName = array();
-               }
-
-               return $result;
-       }
-
-       /**
-        * Reset the cache used in idFromName(). For use in tests.
-        */
-       public static function resetIdByNameCache() {
-               self::$idCacheByName = array();
-       }
-
-       /**
-        * Does the string match an anonymous IPv4 address?
-        *
-        * This function exists for username validation, in order to reject
-        * usernames which are similar in form to IP addresses. Strings such
-        * as 300.300.300.300 will return true because it looks like an IP
-        * address, despite not being strictly valid.
-        *
-        * We match "\d{1,3}\.\d{1,3}\.\d{1,3}\.xxx" as an anonymous IP
-        * address because the usemod software would "cloak" anonymous IP
-        * addresses like this, if we allowed accounts like this to be created
-        * new users could get the old edits of these anonymous users.
-        *
-        * @param string $name Name to match
-        * @return bool
-        */
-       public static function isIP( $name ) {
-               return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name )
-                       || IP::isIPv6( $name );
-       }
-
-       /**
-        * Is the input a valid username?
-        *
-        * Checks if the input is a valid username, we don't want an empty string,
-        * an IP address, anything that contains slashes (would mess up subpages),
-        * is longer than the maximum allowed username size or doesn't begin with
-        * a capital letter.
-        *
-        * @param string $name Name to match
-        * @return bool
-        */
-       public static function isValidUserName( $name ) {
-               global $wgContLang, $wgMaxNameChars;
-
-               if ( $name == ''
-                       || User::isIP( $name )
-                       || strpos( $name, '/' ) !== false
-                       || strlen( $name ) > $wgMaxNameChars
-                       || $name != $wgContLang->ucfirst( $name )
-               ) {
-                       wfDebugLog( 'username', __METHOD__ .
-                               ": '$name' invalid due to empty, IP, slash, length, or lowercase" );
-                       return false;
-               }
-
-               // Ensure that the name can't be misresolved as a different title,
-               // such as with extra namespace keys at the start.
-               $parsed = Title::newFromText( $name );
-               if ( is_null( $parsed )
-                       || $parsed->getNamespace()
-                       || strcmp( $name, $parsed->getPrefixedText() ) ) {
-                       wfDebugLog( 'username', __METHOD__ .
-                               ": '$name' invalid due to ambiguous prefixes" );
-                       return false;
-               }
-
-               // Check an additional blacklist of troublemaker characters.
-               // Should these be merged into the title char list?
-               $unicodeBlacklist = '/[' .
-                       '\x{0080}-\x{009f}' . # iso-8859-1 control chars
-                       '\x{00a0}' .          # non-breaking space
-                       '\x{2000}-\x{200f}' . # various whitespace
-                       '\x{2028}-\x{202f}' . # breaks and control chars
-                       '\x{3000}' .          # ideographic space
-                       '\x{e000}-\x{f8ff}' . # private use
-                       ']/u';
-               if ( preg_match( $unicodeBlacklist, $name ) ) {
-                       wfDebugLog( 'username', __METHOD__ .
-                               ": '$name' invalid due to blacklisted characters" );
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Usernames which fail to pass this function will be blocked
-        * from user login and new account registrations, but may be used
-        * internally by batch processes.
-        *
-        * If an account already exists in this form, login will be blocked
-        * by a failure to pass this function.
-        *
-        * @param string $name Name to match
-        * @return bool
-        */
-       public static function isUsableName( $name ) {
-               global $wgReservedUsernames;
-               // Must be a valid username, obviously ;)
-               if ( !self::isValidUserName( $name ) ) {
-                       return false;
-               }
-
-               static $reservedUsernames = false;
-               if ( !$reservedUsernames ) {
-                       $reservedUsernames = $wgReservedUsernames;
-                       Hooks::run( 'UserGetReservedNames', array( &$reservedUsernames ) );
-               }
-
-               // Certain names may be reserved for batch processes.
-               foreach ( $reservedUsernames as $reserved ) {
-                       if ( substr( $reserved, 0, 4 ) == 'msg:' ) {
-                               $reserved = wfMessage( substr( $reserved, 4 ) )->inContentLanguage()->text();
-                       }
-                       if ( $reserved == $name ) {
-                               return false;
-                       }
-               }
-               return true;
-       }
-
-       /**
-        * Usernames which fail to pass this function will be blocked
-        * from new account registrations, but may be used internally
-        * either by batch processes or by user accounts which have
-        * already been created.
-        *
-        * Additional blacklisting may be added here rather than in
-        * isValidUserName() to avoid disrupting existing accounts.
-        *
-        * @param string $name String to match
-        * @return bool
-        */
-       public static function isCreatableName( $name ) {
-               global $wgInvalidUsernameCharacters;
-
-               // Ensure that the username isn't longer than 235 bytes, so that
-               // (at least for the builtin skins) user javascript and css files
-               // will work. (bug 23080)
-               if ( strlen( $name ) > 235 ) {
-                       wfDebugLog( 'username', __METHOD__ .
-                               ": '$name' invalid due to length" );
-                       return false;
-               }
-
-               // Preg yells if you try to give it an empty string
-               if ( $wgInvalidUsernameCharacters !== '' ) {
-                       if ( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
-                               wfDebugLog( 'username', __METHOD__ .
-                                       ": '$name' invalid due to wgInvalidUsernameCharacters" );
-                               return false;
-                       }
-               }
-
-               return self::isUsableName( $name );
-       }
-
-       /**
-        * Is the input a valid password for this user?
-        *
-        * @param string $password Desired password
-        * @return bool
-        */
-       public function isValidPassword( $password ) {
-               // simple boolean wrapper for getPasswordValidity
-               return $this->getPasswordValidity( $password ) === true;
-       }
-
-
-       /**
-        * Given unvalidated password input, return error message on failure.
-        *
-        * @param string $password Desired password
-        * @return bool|string|array True on success, string or array of error message on failure
-        */
-       public function getPasswordValidity( $password ) {
-               $result = $this->checkPasswordValidity( $password );
-               if ( $result->isGood() ) {
-                       return true;
-               } else {
-                       $messages = array();
-                       foreach ( $result->getErrorsByType( 'error' ) as $error ) {
-                               $messages[] = $error['message'];
-                       }
-                       foreach ( $result->getErrorsByType( 'warning' ) as $warning ) {
-                               $messages[] = $warning['message'];
-                       }
-                       if ( count( $messages ) === 1 ) {
-                               return $messages[0];
-                       }
-                       return $messages;
-               }
-       }
-
-       /**
-        * Check if this is a valid password for this user
-        *
-        * Create a Status object based on the password's validity.
-        * The Status should be set to fatal if the user should not
-        * be allowed to log in, and should have any errors that
-        * would block changing the password.
-        *
-        * If the return value of this is not OK, the password
-        * should not be checked. If the return value is not Good,
-        * the password can be checked, but the user should not be
-        * able to set their password to this.
-        *
-        * @param string $password Desired password
-        * @param string $purpose one of 'login', 'create', 'reset'
-        * @return Status
-        * @since 1.23
-        */
-       public function checkPasswordValidity( $password, $purpose = 'login' ) {
-               global $wgPasswordPolicy;
-
-               $upp = new UserPasswordPolicy(
-                       $wgPasswordPolicy['policies'],
-                       $wgPasswordPolicy['checks']
-               );
-
-               $status = Status::newGood();
-               $result = false; // init $result to false for the internal checks
-
-               if ( !Hooks::run( 'isValidPassword', array( $password, &$result, $this ) ) ) {
-                       $status->error( $result );
-                       return $status;
-               }
-
-               if ( $result === false ) {
-                       $status->merge( $upp->checkUserPassword( $this, $password, $purpose ) );
-                       return $status;
-               } elseif ( $result === true ) {
-                       return $status;
-               } else {
-                       $status->error( $result );
-                       return $status; // the isValidPassword hook set a string $result and returned true
-               }
-       }
-
-       /**
-        * Given unvalidated user input, return a canonical username, or false if
-        * the username is invalid.
-        * @param string $name User input
-        * @param string|bool $validate Type of validation to use:
-        *   - false        No validation
-        *   - 'valid'      Valid for batch processes
-        *   - 'usable'     Valid for batch processes and login
-        *   - 'creatable'  Valid for batch processes, login and account creation
-        *
-        * @throws InvalidArgumentException
-        * @return bool|string
-        */
-       public static function getCanonicalName( $name, $validate = 'valid' ) {
-               // Force usernames to capital
-               global $wgContLang;
-               $name = $wgContLang->ucfirst( $name );
-
-               # Reject names containing '#'; these will be cleaned up
-               # with title normalisation, but then it's too late to
-               # check elsewhere
-               if ( strpos( $name, '#' ) !== false ) {
-                       return false;
-               }
-
-               // Clean up name according to title rules,
-               // but only when validation is requested (bug 12654)
-               $t = ( $validate !== false ) ?
-                       Title::newFromText( $name ) : Title::makeTitle( NS_USER, $name );
-               // Check for invalid titles
-               if ( is_null( $t ) ) {
-                       return false;
-               }
-
-               // Reject various classes of invalid names
-               global $wgAuth;
-               $name = $wgAuth->getCanonicalName( $t->getText() );
-
-               switch ( $validate ) {
-                       case false:
-                               break;
-                       case 'valid':
-                               if ( !User::isValidUserName( $name ) ) {
-                                       $name = false;
-                               }
-                               break;
-                       case 'usable':
-                               if ( !User::isUsableName( $name ) ) {
-                                       $name = false;
-                               }
-                               break;
-                       case 'creatable':
-                               if ( !User::isCreatableName( $name ) ) {
-                                       $name = false;
-                               }
-                               break;
-                       default:
-                               throw new InvalidArgumentException(
-                                       'Invalid parameter value for $validate in ' . __METHOD__ );
-               }
-               return $name;
-       }
-
-       /**
-        * Count the number of edits of a user
-        *
-        * @param int $uid User ID to check
-        * @return int The user's edit count
-        *
-        * @deprecated since 1.21 in favour of User::getEditCount
-        */
-       public static function edits( $uid ) {
-               wfDeprecated( __METHOD__, '1.21' );
-               $user = self::newFromId( $uid );
-               return $user->getEditCount();
-       }
-
-       /**
-        * Return a random password.
-        *
-        * @deprecated since 1.27, use PasswordFactory::generateRandomPasswordString()
-        * @return string New random password
-        */
-       public static function randomPassword() {
-               global $wgMinimalPasswordLength;
-               return PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
-       }
-
-       /**
-        * Set cached properties to default.
-        *
-        * @note This no longer clears uncached lazy-initialised properties;
-        *       the constructor does that instead.
-        *
-        * @param string|bool $name
-        */
-       public function loadDefaults( $name = false ) {
-               $this->mId = 0;
-               $this->mName = $name;
-               $this->mRealName = '';
-               $this->mEmail = '';
-               $this->mOptionOverrides = null;
-               $this->mOptionsLoaded = false;
-
-               $loggedOut = $this->getRequest()->getCookie( 'LoggedOut' );
-               if ( $loggedOut !== null ) {
-                       $this->mTouched = wfTimestamp( TS_MW, $loggedOut );
-               } else {
-                       $this->mTouched = '1'; # Allow any pages to be cached
-               }
-
-               $this->mToken = null; // Don't run cryptographic functions till we need a token
-               $this->mEmailAuthenticated = null;
-               $this->mEmailToken = '';
-               $this->mEmailTokenExpires = null;
-               $this->mRegistration = wfTimestamp( TS_MW );
-               $this->mGroups = array();
-
-               Hooks::run( 'UserLoadDefaults', array( $this, $name ) );
-       }
-
-       /**
-        * Return whether an item has been loaded.
-        *
-        * @param string $item Item to check. Current possibilities:
-        *   - id
-        *   - name
-        *   - realname
-        * @param string $all 'all' to check if the whole object has been loaded
-        *   or any other string to check if only the item is available (e.g.
-        *   for optimisation)
-        * @return bool
-        */
-       public function isItemLoaded( $item, $all = 'all' ) {
-               return ( $this->mLoadedItems === true && $all === 'all' ) ||
-                       ( isset( $this->mLoadedItems[$item] ) && $this->mLoadedItems[$item] === true );
-       }
-
-       /**
-        * Set that an item has been loaded
-        *
-        * @param string $item
-        */
-       protected function setItemLoaded( $item ) {
-               if ( is_array( $this->mLoadedItems ) ) {
-                       $this->mLoadedItems[$item] = true;
-               }
-       }
-
-       /**
-        * Load user data from the session or login cookie.
-        *
-        * @return bool True if the user is logged in, false otherwise.
-        */
-       private function loadFromSession() {
-               $result = null;
-               Hooks::run( 'UserLoadFromSession', array( $this, &$result ) );
-               if ( $result !== null ) {
-                       return $result;
-               }
-
-               $request = $this->getRequest();
-
-               $cookieId = $request->getCookie( 'UserID' );
-               $sessId = $request->getSessionData( 'wsUserID' );
-
-               if ( $cookieId !== null ) {
-                       $sId = intval( $cookieId );
-                       if ( $sessId !== null && $cookieId != $sessId ) {
-                               wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
-                                       cookie user ID ($sId) don't match!" );
-                               return false;
-                       }
-                       $request->setSessionData( 'wsUserID', $sId );
-               } elseif ( $sessId !== null && $sessId != 0 ) {
-                       $sId = $sessId;
-               } else {
-                       return false;
-               }
-
-               if ( $request->getSessionData( 'wsUserName' ) !== null ) {
-                       $sName = $request->getSessionData( 'wsUserName' );
-               } elseif ( $request->getCookie( 'UserName' ) !== null ) {
-                       $sName = $request->getCookie( 'UserName' );
-                       $request->setSessionData( 'wsUserName', $sName );
-               } else {
-                       return false;
-               }
-
-               $proposedUser = User::newFromId( $sId );
-               if ( !$proposedUser->isLoggedIn() ) {
-                       // Not a valid ID
-                       return false;
-               }
-
-               global $wgBlockDisablesLogin;
-               if ( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
-                       // User blocked and we've disabled blocked user logins
-                       return false;
-               }
-
-               if ( $request->getSessionData( 'wsToken' ) ) {
-                       $passwordCorrect =
-                               ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
-                       $from = 'session';
-               } elseif ( $request->getCookie( 'Token' ) ) {
-                       # Get the token from DB/cache and clean it up to remove garbage padding.
-                       # This deals with historical problems with bugs and the default column value.
-                       $token = rtrim( $proposedUser->getToken( false ) ); // correct token
-                       // Make comparison in constant time (bug 61346)
-                       $passwordCorrect = strlen( $token )
-                               && hash_equals( $token, $request->getCookie( 'Token' ) );
-                       $from = 'cookie';
-               } else {
-                       // No session or persistent login cookie
-                       return false;
-               }
-
-               if ( ( $sName === $proposedUser->getName() ) && $passwordCorrect ) {
-                       $this->loadFromUserObject( $proposedUser );
-                       $request->setSessionData( 'wsToken', $this->mToken );
-                       wfDebug( "User: logged in from $from\n" );
-                       return true;
-               } else {
-                       // Invalid credentials
-                       wfDebug( "User: can't log in from $from, invalid credentials\n" );
-                       return false;
-               }
-       }
-
-       /**
-        * Load user and user_group data from the database.
-        * $this->mId must be set, this is how the user is identified.
-        *
-        * @param integer $flags User::READ_* constant bitfield
-        * @return bool True if the user exists, false if the user is anonymous
-        */
-       public function loadFromDatabase( $flags = self::READ_LATEST ) {
-               // Paranoia
-               $this->mId = intval( $this->mId );
-
-               // Anonymous user
-               if ( !$this->mId ) {
-                       $this->loadDefaults();
-                       return false;
-               }
-
-               list( $index, $options ) = DBAccessObjectUtils::getDBOptions( $flags );
-               $db = wfGetDB( $index );
-
-               $s = $db->selectRow(
-                       'user',
-                       self::selectFields(),
-                       array( 'user_id' => $this->mId ),
-                       __METHOD__,
-                       $options
-               );
-
-               $this->queryFlagsUsed = $flags;
-               Hooks::run( 'UserLoadFromDatabase', array( $this, &$s ) );
-
-               if ( $s !== false ) {
-                       // Initialise user table data
-                       $this->loadFromRow( $s );
-                       $this->mGroups = null; // deferred
-                       $this->getEditCount(); // revalidation for nulls
-                       return true;
-               } else {
-                       // Invalid user_id
-                       $this->mId = 0;
-                       $this->loadDefaults();
-                       return false;
-               }
-       }
-
-       /**
-        * Initialize this object from a row from the user table.
-        *
-        * @param stdClass $row Row from the user table to load.
-        * @param array $data Further user data to load into the object
-        *
-        *      user_groups             Array with groups out of the user_groups table
-        *      user_properties         Array with properties out of the user_properties table
-        */
-       protected function loadFromRow( $row, $data = null ) {
-               $all = true;
-
-               $this->mGroups = null; // deferred
-
-               if ( isset( $row->user_name ) ) {
-                       $this->mName = $row->user_name;
-                       $this->mFrom = 'name';
-                       $this->setItemLoaded( 'name' );
-               } else {
-                       $all = false;
-               }
-
-               if ( isset( $row->user_real_name ) ) {
-                       $this->mRealName = $row->user_real_name;
-                       $this->setItemLoaded( 'realname' );
-               } else {
-                       $all = false;
-               }
-
-               if ( isset( $row->user_id ) ) {
-                       $this->mId = intval( $row->user_id );
-                       $this->mFrom = 'id';
-                       $this->setItemLoaded( 'id' );
-               } else {
-                       $all = false;
-               }
-
-               if ( isset( $row->user_id ) && isset( $row->user_name ) ) {
-                       self::$idCacheByName[$row->user_name] = $row->user_id;
-               }
-
-               if ( isset( $row->user_editcount ) ) {
-                       $this->mEditCount = $row->user_editcount;
-               } else {
-                       $all = false;
-               }
-
-               if ( isset( $row->user_email ) ) {
-                       $this->mEmail = $row->user_email;
-                       $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );
-                       $this->mToken = $row->user_token;
-                       if ( $this->mToken == '' ) {
-                               $this->mToken = null;
-                       }
-                       $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $row->user_email_authenticated );
-                       $this->mEmailToken = $row->user_email_token;
-                       $this->mEmailTokenExpires = wfTimestampOrNull( TS_MW, $row->user_email_token_expires );
-                       $this->mRegistration = wfTimestampOrNull( TS_MW, $row->user_registration );
-               } else {
-                       $all = false;
-               }
-
-               if ( $all ) {
-                       $this->mLoadedItems = true;
-               }
-
-               if ( is_array( $data ) ) {
-                       if ( isset( $data['user_groups'] ) && is_array( $data['user_groups'] ) ) {
-                               $this->mGroups = $data['user_groups'];
-                       }
-                       if ( isset( $data['user_properties'] ) && is_array( $data['user_properties'] ) ) {
-                               $this->loadOptions( $data['user_properties'] );
-                       }
-               }
-       }
-
-       /**
-        * Load the data for this user object from another user object.
-        *
-        * @param User $user
-        */
-       protected function loadFromUserObject( $user ) {
-               $user->load();
-               $user->loadGroups();
-               $user->loadOptions();
-               foreach ( self::$mCacheVars as $var ) {
-                       $this->$var = $user->$var;
-               }
-       }
-
-       /**
-        * Load the groups from the database if they aren't already loaded.
-        */
-       private function loadGroups() {
-               if ( is_null( $this->mGroups ) ) {
-                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
-                               ? wfGetDB( DB_MASTER )
-                               : wfGetDB( DB_SLAVE );
-                       $res = $db->select( 'user_groups',
-                               array( 'ug_group' ),
-                               array( 'ug_user' => $this->mId ),
-                               __METHOD__ );
-                       $this->mGroups = array();
-                       foreach ( $res as $row ) {
-                               $this->mGroups[] = $row->ug_group;
-                       }
-               }
-       }
-
-       /**
-        * Add the user to the group if he/she meets given criteria.
-        *
-        * Contrary to autopromotion by \ref $wgAutopromote, the group will be
-        *   possible to remove manually via Special:UserRights. In such case it
-        *   will not be re-added automatically. The user will also not lose the
-        *   group if they no longer meet the criteria.
-        *
-        * @param string $event Key in $wgAutopromoteOnce (each one has groups/criteria)
-        *
-        * @return array Array of groups the user has been promoted to.
-        *
-        * @see $wgAutopromoteOnce
-        */
-       public function addAutopromoteOnceGroups( $event ) {
-               global $wgAutopromoteOnceLogInRC, $wgAuth;
-
-               if ( wfReadOnly() || !$this->getId() ) {
-                       return array();
-               }
-
-               $toPromote = Autopromote::getAutopromoteOnceGroups( $this, $event );
-               if ( !count( $toPromote ) ) {
-                       return array();
-               }
-
-               if ( !$this->checkAndSetTouched() ) {
-                       return array(); // raced out (bug T48834)
-               }
-
-               $oldGroups = $this->getGroups(); // previous groups
-               foreach ( $toPromote as $group ) {
-                       $this->addGroup( $group );
-               }
-               // update groups in external authentication database
-               Hooks::run( 'UserGroupsChanged', array( $this, $toPromote, array(), false ) );
-               $wgAuth->updateExternalDBGroups( $this, $toPromote );
-
-               $newGroups = array_merge( $oldGroups, $toPromote ); // all groups
-
-               $logEntry = new ManualLogEntry( 'rights', 'autopromote' );
-               $logEntry->setPerformer( $this );
-               $logEntry->setTarget( $this->getUserPage() );
-               $logEntry->setParameters( array(
-                       '4::oldgroups' => $oldGroups,
-                       '5::newgroups' => $newGroups,
-               ) );
-               $logid = $logEntry->insert();
-               if ( $wgAutopromoteOnceLogInRC ) {
-                       $logEntry->publish( $logid );
-               }
-
-               return $toPromote;
-       }
-
-       /**
-        * Bump user_touched if it didn't change since this object was loaded
-        *
-        * On success, the mTouched field is updated.
-        * The user serialization cache is always cleared.
-        *
-        * @return bool Whether user_touched was actually updated
-        * @since 1.26
-        */
-       protected function checkAndSetTouched() {
-               $this->load();
-
-               if ( !$this->mId ) {
-                       return false; // anon
-               }
-
-               // Get a new user_touched that is higher than the old one
-               $oldTouched = $this->mTouched;
-               $newTouched = $this->newTouchedTimestamp();
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->update( 'user',
-                       array( 'user_touched' => $dbw->timestamp( $newTouched ) ),
-                       array(
-                               'user_id' => $this->mId,
-                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
-                       ),
-                       __METHOD__
-               );
-               $success = ( $dbw->affectedRows() > 0 );
-
-               if ( $success ) {
-                       $this->mTouched = $newTouched;
-                       $this->clearSharedCache();
-               } else {
-                       // Clears on failure too since that is desired if the cache is stale
-                       $this->clearSharedCache( 'refresh' );
-               }
-
-               return $success;
-       }
-
-       /**
-        * Clear various cached data stored in this object. The cache of the user table
-        * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
-        *
-        * @param bool|string $reloadFrom Reload user and user_groups table data from a
-        *   given source. May be "name", "id", "defaults", "session", or false for no reload.
-        */
-       public function clearInstanceCache( $reloadFrom = false ) {
-               $this->mNewtalk = -1;
-               $this->mDatePreference = null;
-               $this->mBlockedby = -1; # Unset
-               $this->mHash = false;
-               $this->mRights = null;
-               $this->mEffectiveGroups = null;
-               $this->mImplicitGroups = null;
-               $this->mGroups = null;
-               $this->mOptions = null;
-               $this->mOptionsLoaded = false;
-               $this->mEditCount = null;
-
-               if ( $reloadFrom ) {
-                       $this->mLoadedItems = array();
-                       $this->mFrom = $reloadFrom;
-               }
-       }
-
-       /**
-        * Combine the language default options with any site-specific options
-        * and add the default language variants.
-        *
-        * @return array Array of String options
-        */
-       public static function getDefaultOptions() {
-               global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
-
-               static $defOpt = null;
-               if ( !defined( 'MW_PHPUNIT_TEST' ) && $defOpt !== null ) {
-                       // Disabling this for the unit tests, as they rely on being able to change $wgContLang
-                       // mid-request and see that change reflected in the return value of this function.
-                       // Which is insane and would never happen during normal MW operation
-                       return $defOpt;
-               }
-
-               $defOpt = $wgDefaultUserOptions;
-               // Default language setting
-               $defOpt['language'] = $wgContLang->getCode();
-               foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
-                       $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
-               }
-               foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
-                       $defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
-               }
-               $defOpt['skin'] = Skin::normalizeKey( $wgDefaultSkin );
-
-               Hooks::run( 'UserGetDefaultOptions', array( &$defOpt ) );
-
-               return $defOpt;
-       }
-
-       /**
-        * Get a given default option value.
-        *
-        * @param string $opt Name of option to retrieve
-        * @return string Default option value
-        */
-       public static function getDefaultOption( $opt ) {
-               $defOpts = self::getDefaultOptions();
-               if ( isset( $defOpts[$opt] ) ) {
-                       return $defOpts[$opt];
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * Get blocking information
-        * @param bool $bFromSlave Whether to check the slave database first.
-        *   To improve performance, non-critical checks are done against slaves.
-        *   Check when actually saving should be done against master.
-        */
-       private function getBlockedStatus( $bFromSlave = true ) {
-               global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
-
-               if ( -1 != $this->mBlockedby ) {
-                       return;
-               }
-
-               wfDebug( __METHOD__ . ": checking...\n" );
-
-               // Initialize data...
-               // Otherwise something ends up stomping on $this->mBlockedby when
-               // things get lazy-loaded later, causing false positive block hits
-               // due to -1 !== 0. Probably session-related... Nothing should be
-               // overwriting mBlockedby, surely?
-               $this->load();
-
-               # We only need to worry about passing the IP address to the Block generator if the
-               # user is not immune to autoblocks/hardblocks, and they are the current user so we
-               # know which IP address they're actually coming from
-               if ( !$this->isAllowed( 'ipblock-exempt' ) && $this->equals( $wgUser ) ) {
-                       $ip = $this->getRequest()->getIP();
-               } else {
-                       $ip = null;
-               }
-
-               // User/IP blocking
-               $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
-
-               // Proxy blocking
-               if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
-                       && !in_array( $ip, $wgProxyWhitelist )
-               ) {
-                       // Local list
-                       if ( self::isLocallyBlockedProxy( $ip ) ) {
-                               $block = new Block;
-                               $block->setBlocker( wfMessage( 'proxyblocker' )->text() );
-                               $block->mReason = wfMessage( 'proxyblockreason' )->text();
-                               $block->setTarget( $ip );
-                       } elseif ( $this->isAnon() && $this->isDnsBlacklisted( $ip ) ) {
-                               $block = new Block;
-                               $block->setBlocker( wfMessage( 'sorbs' )->text() );
-                               $block->mReason = wfMessage( 'sorbsreason' )->text();
-                               $block->setTarget( $ip );
-                       }
-               }
-
-               // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
-               if ( !$block instanceof Block
-                       && $wgApplyIpBlocksToXff
-                       && $ip !== null
-                       && !$this->isAllowed( 'proxyunbannable' )
-                       && !in_array( $ip, $wgProxyWhitelist )
-               ) {
-                       $xff = $this->getRequest()->getHeader( 'X-Forwarded-For' );
-                       $xff = array_map( 'trim', explode( ',', $xff ) );
-                       $xff = array_diff( $xff, array( $ip ) );
-                       $xffblocks = Block::getBlocksForIPList( $xff, $this->isAnon(), !$bFromSlave );
-                       $block = Block::chooseBlock( $xffblocks, $xff );
-                       if ( $block instanceof Block ) {
-                               # Mangle the reason to alert the user that the block
-                               # originated from matching the X-Forwarded-For header.
-                               $block->mReason = wfMessage( 'xffblockreason', $block->mReason )->text();
-                       }
-               }
-
-               if ( $block instanceof Block ) {
-                       wfDebug( __METHOD__ . ": Found block.\n" );
-                       $this->mBlock = $block;
-                       $this->mBlockedby = $block->getByName();
-                       $this->mBlockreason = $block->mReason;
-                       $this->mHideName = $block->mHideName;
-                       $this->mAllowUsertalk = !$block->prevents( 'editownusertalk' );
-               } else {
-                       $this->mBlockedby = '';
-                       $this->mHideName = 0;
-                       $this->mAllowUsertalk = false;
-               }
-
-               // Extensions
-               Hooks::run( 'GetBlockedStatus', array( &$this ) );
-
-       }
-
-       /**
-        * Whether the given IP is in a DNS blacklist.
-        *
-        * @param string $ip IP to check
-        * @param bool $checkWhitelist Whether to check the whitelist first
-        * @return bool True if blacklisted.
-        */
-       public function isDnsBlacklisted( $ip, $checkWhitelist = false ) {
-               global $wgEnableDnsBlacklist, $wgDnsBlacklistUrls, $wgProxyWhitelist;
-
-               if ( !$wgEnableDnsBlacklist ) {
-                       return false;
-               }
-
-               if ( $checkWhitelist && in_array( $ip, $wgProxyWhitelist ) ) {
-                       return false;
-               }
-
-               return $this->inDnsBlacklist( $ip, $wgDnsBlacklistUrls );
-       }
-
-       /**
-        * Whether the given IP is in a given DNS blacklist.
-        *
-        * @param string $ip IP to check
-        * @param string|array $bases Array of Strings: URL of the DNS blacklist
-        * @return bool True if blacklisted.
-        */
-       public function inDnsBlacklist( $ip, $bases ) {
-
-               $found = false;
-               // @todo FIXME: IPv6 ???  (http://bugs.php.net/bug.php?id=33170)
-               if ( IP::isIPv4( $ip ) ) {
-                       // Reverse IP, bug 21255
-                       $ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
-
-                       foreach ( (array)$bases as $base ) {
-                               // Make hostname
-                               // If we have an access key, use that too (ProjectHoneypot, etc.)
-                               $basename = $base;
-                               if ( is_array( $base ) ) {
-                                       if ( count( $base ) >= 2 ) {
-                                               // Access key is 1, base URL is 0
-                                               $host = "{$base[1]}.$ipReversed.{$base[0]}";
-                                       } else {
-                                               $host = "$ipReversed.{$base[0]}";
-                                       }
-                                       $basename = $base[0];
-                               } else {
-                                       $host = "$ipReversed.$base";
-                               }
-
-                               // Send query
-                               $ipList = gethostbynamel( $host );
-
-                               if ( $ipList ) {
-                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $basename!" );
-                                       $found = true;
-                                       break;
-                               } else {
-                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $basename." );
-                               }
-                       }
-               }
-
-               return $found;
-       }
-
-       /**
-        * Check if an IP address is in the local proxy list
-        *
-        * @param string $ip
-        *
-        * @return bool
-        */
-       public static function isLocallyBlockedProxy( $ip ) {
-               global $wgProxyList;
-
-               if ( !$wgProxyList ) {
-                       return false;
-               }
-
-               if ( !is_array( $wgProxyList ) ) {
-                       // Load from the specified file
-                       $wgProxyList = array_map( 'trim', file( $wgProxyList ) );
-               }
-
-               if ( !is_array( $wgProxyList ) ) {
-                       $ret = false;
-               } elseif ( array_search( $ip, $wgProxyList ) !== false ) {
-                       $ret = true;
-               } elseif ( array_key_exists( $ip, $wgProxyList ) ) {
-                       // Old-style flipped proxy list
-                       $ret = true;
-               } else {
-                       $ret = false;
-               }
-               return $ret;
-       }
-
-       /**
-        * Is this user subject to rate limiting?
-        *
-        * @return bool True if rate limited
-        */
-       public function isPingLimitable() {
-               global $wgRateLimitsExcludedIPs;
-               if ( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
-                       // No other good way currently to disable rate limits
-                       // for specific IPs. :P
-                       // But this is a crappy hack and should die.
-                       return false;
-               }
-               return !$this->isAllowed( 'noratelimit' );
-       }
-
-       /**
-        * Primitive rate limits: enforce maximum actions per time period
-        * to put a brake on flooding.
-        *
-        * The method generates both a generic profiling point and a per action one
-        * (suffix being "-$action".
-        *
-        * @note When using a shared cache like memcached, IP-address
-        * last-hit counters will be shared across wikis.
-        *
-        * @param string $action Action to enforce; 'edit' if unspecified
-        * @param int $incrBy Positive amount to increment counter by [defaults to 1]
-        * @return bool True if a rate limiter was tripped
-        */
-       public function pingLimiter( $action = 'edit', $incrBy = 1 ) {
-               // Call the 'PingLimiter' hook
-               $result = false;
-               if ( !Hooks::run( 'PingLimiter', array( &$this, $action, &$result, $incrBy ) ) ) {
-                       return $result;
-               }
-
-               global $wgRateLimits;
-               if ( !isset( $wgRateLimits[$action] ) ) {
-                       return false;
-               }
-
-               // Some groups shouldn't trigger the ping limiter, ever
-               if ( !$this->isPingLimitable() ) {
-                       return false;
-               }
-
-               global $wgMemc;
-
-               $limits = $wgRateLimits[$action];
-               $keys = array();
-               $id = $this->getId();
-               $userLimit = false;
-
-               if ( isset( $limits['anon'] ) && $id == 0 ) {
-                       $keys[wfMemcKey( 'limiter', $action, 'anon' )] = $limits['anon'];
-               }
-
-               if ( isset( $limits['user'] ) && $id != 0 ) {
-                       $userLimit = $limits['user'];
-               }
-               if ( $this->isNewbie() ) {
-                       if ( isset( $limits['newbie'] ) && $id != 0 ) {
-                               $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
-                       }
-                       if ( isset( $limits['ip'] ) ) {
-                               $ip = $this->getRequest()->getIP();
-                               $keys["mediawiki:limiter:$action:ip:$ip"] = $limits['ip'];
-                       }
-                       if ( isset( $limits['subnet'] ) ) {
-                               $ip = $this->getRequest()->getIP();
-                               $matches = array();
-                               $subnet = false;
-                               if ( IP::isIPv6( $ip ) ) {
-                                       $parts = IP::parseRange( "$ip/64" );
-                                       $subnet = $parts[0];
-                               } elseif ( preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
-                                       // IPv4
-                                       $subnet = $matches[1];
-                               }
-                               if ( $subnet !== false ) {
-                                       $keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
-                               }
-                       }
-               }
-               // Check for group-specific permissions
-               // If more than one group applies, use the group with the highest limit
-               foreach ( $this->getGroups() as $group ) {
-                       if ( isset( $limits[$group] ) ) {
-                               if ( $userLimit === false
-                                       || $limits[$group][0] / $limits[$group][1] > $userLimit[0] / $userLimit[1]
-                               ) {
-                                       $userLimit = $limits[$group];
-                               }
-                       }
-               }
-               // Set the user limit key
-               if ( $userLimit !== false ) {
-                       list( $max, $period ) = $userLimit;
-                       wfDebug( __METHOD__ . ": effective user limit: $max in {$period}s\n" );
-                       $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
-               }
-
-               $triggered = false;
-               foreach ( $keys as $key => $limit ) {
-                       list( $max, $period ) = $limit;
-                       $summary = "(limit $max in {$period}s)";
-                       $count = $wgMemc->get( $key );
-                       // Already pinged?
-                       if ( $count ) {
-                               if ( $count >= $max ) {
-                                       wfDebugLog( 'ratelimit', "User '{$this->getName()}' " .
-                                               "(IP {$this->getRequest()->getIP()}) tripped $key at $count $summary" );
-                                       $triggered = true;
-                               } else {
-                                       wfDebug( __METHOD__ . ": ok. $key at $count $summary\n" );
-                               }
-                       } else {
-                               wfDebug( __METHOD__ . ": adding record for $key $summary\n" );
-                               if ( $incrBy > 0 ) {
-                                       $wgMemc->add( $key, 0, intval( $period ) ); // first ping
-                               }
-                       }
-                       if ( $incrBy > 0 ) {
-                               $wgMemc->incr( $key, $incrBy );
-                       }
-               }
-
-               return $triggered;
-       }
-
-       /**
-        * Check if user is blocked
-        *
-        * @param bool $bFromSlave Whether to check the slave database instead of
-        *   the master. Hacked from false due to horrible probs on site.
-        * @return bool True if blocked, false otherwise
-        */
-       public function isBlocked( $bFromSlave = true ) {
-               return $this->getBlock( $bFromSlave ) instanceof Block && $this->getBlock()->prevents( 'edit' );
-       }
-
-       /**
-        * Get the block affecting the user, or null if the user is not blocked
-        *
-        * @param bool $bFromSlave Whether to check the slave database instead of the master
-        * @return Block|null
-        */
-       public function getBlock( $bFromSlave = true ) {
-               $this->getBlockedStatus( $bFromSlave );
-               return $this->mBlock instanceof Block ? $this->mBlock : null;
-       }
-
-       /**
-        * Check if user is blocked from editing a particular article
-        *
-        * @param Title $title Title to check
-        * @param bool $bFromSlave Whether to check the slave database instead of the master
-        * @return bool
-        */
-       public function isBlockedFrom( $title, $bFromSlave = false ) {
-               global $wgBlockAllowsUTEdit;
-
-               $blocked = $this->isBlocked( $bFromSlave );
-               $allowUsertalk = ( $wgBlockAllowsUTEdit ? $this->mAllowUsertalk : false );
-               // If a user's name is suppressed, they cannot make edits anywhere
-               if ( !$this->mHideName && $allowUsertalk && $title->getText() === $this->getName()
-                       && $title->getNamespace() == NS_USER_TALK ) {
-                       $blocked = false;
-                       wfDebug( __METHOD__ . ": self-talk page, ignoring any blocks\n" );
-               }
-
-               Hooks::run( 'UserIsBlockedFrom', array( $this, $title, &$blocked, &$allowUsertalk ) );
-
-               return $blocked;
-       }
-
-       /**
-        * If user is blocked, return the name of the user who placed the block
-        * @return string Name of blocker
-        */
-       public function blockedBy() {
-               $this->getBlockedStatus();
-               return $this->mBlockedby;
-       }
-
-       /**
-        * If user is blocked, return the specified reason for the block
-        * @return string Blocking reason
-        */
-       public function blockedFor() {
-               $this->getBlockedStatus();
-               return $this->mBlockreason;
-       }
-
-       /**
-        * If user is blocked, return the ID for the block
-        * @return int Block ID
-        */
-       public function getBlockId() {
-               $this->getBlockedStatus();
-               return ( $this->mBlock ? $this->mBlock->getId() : false );
-       }
-
-       /**
-        * Check if user is blocked on all wikis.
-        * Do not use for actual edit permission checks!
-        * This is intended for quick UI checks.
-        *
-        * @param string $ip IP address, uses current client if none given
-        * @return bool True if blocked, false otherwise
-        */
-       public function isBlockedGlobally( $ip = '' ) {
-               if ( $this->mBlockedGlobally !== null ) {
-                       return $this->mBlockedGlobally;
-               }
-               // User is already an IP?
-               if ( IP::isIPAddress( $this->getName() ) ) {
-                       $ip = $this->getName();
-               } elseif ( !$ip ) {
-                       $ip = $this->getRequest()->getIP();
-               }
-               $blocked = false;
-               Hooks::run( 'UserIsBlockedGlobally', array( &$this, $ip, &$blocked ) );
-               $this->mBlockedGlobally = (bool)$blocked;
-               return $this->mBlockedGlobally;
-       }
-
-       /**
-        * Check if user account is locked
-        *
-        * @return bool True if locked, false otherwise
-        */
-       public function isLocked() {
-               if ( $this->mLocked !== null ) {
-                       return $this->mLocked;
-               }
-               global $wgAuth;
-               $authUser = $wgAuth->getUserInstance( $this );
-               $this->mLocked = (bool)$authUser->isLocked();
-               Hooks::run( 'UserIsLocked', array( $this, &$this->mLocked ) );
-               return $this->mLocked;
-       }
-
-       /**
-        * Check if user account is hidden
-        *
-        * @return bool True if hidden, false otherwise
-        */
-       public function isHidden() {
-               if ( $this->mHideName !== null ) {
-                       return $this->mHideName;
-               }
-               $this->getBlockedStatus();
-               if ( !$this->mHideName ) {
-                       global $wgAuth;
-                       $authUser = $wgAuth->getUserInstance( $this );
-                       $this->mHideName = (bool)$authUser->isHidden();
-                       Hooks::run( 'UserIsHidden', array( $this, &$this->mHideName ) );
-               }
-               return $this->mHideName;
-       }
-
-       /**
-        * Get the user's ID.
-        * @return int The user's ID; 0 if the user is anonymous or nonexistent
-        */
-       public function getId() {
-               if ( $this->mId === null && $this->mName !== null && User::isIP( $this->mName ) ) {
-                       // Special case, we know the user is anonymous
-                       return 0;
-               } elseif ( !$this->isItemLoaded( 'id' ) ) {
-                       // Don't load if this was initialized from an ID
-                       $this->load();
-               }
-               return $this->mId;
-       }
-
-       /**
-        * Set the user and reload all fields according to a given ID
-        * @param int $v User ID to reload
-        */
-       public function setId( $v ) {
-               $this->mId = $v;
-               $this->clearInstanceCache( 'id' );
-       }
-
-       /**
-        * Get the user name, or the IP of an anonymous user
-        * @return string User's name or IP address
-        */
-       public function getName() {
-               if ( $this->isItemLoaded( 'name', 'only' ) ) {
-                       // Special case optimisation
-                       return $this->mName;
-               } else {
-                       $this->load();
-                       if ( $this->mName === false ) {
-                               // Clean up IPs
-                               $this->mName = IP::sanitizeIP( $this->getRequest()->getIP() );
-                       }
-                       return $this->mName;
-               }
-       }
-
-       /**
-        * Set the user name.
-        *
-        * This does not reload fields from the database according to the given
-        * name. Rather, it is used to create a temporary "nonexistent user" for
-        * later addition to the database. It can also be used to set the IP
-        * address for an anonymous user to something other than the current
-        * remote IP.
-        *
-        * @note User::newFromName() has roughly the same function, when the named user
-        * does not exist.
-        * @param string $str New user name to set
-        */
-       public function setName( $str ) {
-               $this->load();
-               $this->mName = $str;
-       }
-
-       /**
-        * Get the user's name escaped by underscores.
-        * @return string Username escaped by underscores.
-        */
-       public function getTitleKey() {
-               return str_replace( ' ', '_', $this->getName() );
-       }
-
-       /**
-        * Check if the user has new messages.
-        * @return bool True if the user has new messages
-        */
-       public function getNewtalk() {
-               $this->load();
-
-               // Load the newtalk status if it is unloaded (mNewtalk=-1)
-               if ( $this->mNewtalk === -1 ) {
-                       $this->mNewtalk = false; # reset talk page status
-
-                       // Check memcached separately for anons, who have no
-                       // entire User object stored in there.
-                       if ( !$this->mId ) {
-                               global $wgDisableAnonTalk;
-                               if ( $wgDisableAnonTalk ) {
-                                       // Anon newtalk disabled by configuration.
-                                       $this->mNewtalk = false;
-                               } else {
-                                       $this->mNewtalk = $this->checkNewtalk( 'user_ip', $this->getName() );
-                               }
-                       } else {
-                               $this->mNewtalk = $this->checkNewtalk( 'user_id', $this->mId );
-                       }
-               }
-
-               return (bool)$this->mNewtalk;
-       }
-
-       /**
-        * Return the data needed to construct links for new talk page message
-        * alerts. If there are new messages, this will return an associative array
-        * with the following data:
-        *     wiki: The database name of the wiki
-        *     link: Root-relative link to the user's talk page
-        *     rev: The last talk page revision that the user has seen or null. This
-        *         is useful for building diff links.
-        * If there are no new messages, it returns an empty array.
-        * @note This function was designed to accomodate multiple talk pages, but
-        * currently only returns a single link and revision.
-        * @return array
-        */
-       public function getNewMessageLinks() {
-               $talks = array();
-               if ( !Hooks::run( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
-                       return $talks;
-               } elseif ( !$this->getNewtalk() ) {
-                       return array();
-               }
-               $utp = $this->getTalkPage();
-               $dbr = wfGetDB( DB_SLAVE );
-               // Get the "last viewed rev" timestamp from the oldest message notification
-               $timestamp = $dbr->selectField( 'user_newtalk',
-                       'MIN(user_last_timestamp)',
-                       $this->isAnon() ? array( 'user_ip' => $this->getName() ) : array( 'user_id' => $this->getID() ),
-                       __METHOD__ );
-               $rev = $timestamp ? Revision::loadFromTimestamp( $dbr, $utp, $timestamp ) : null;
-               return array( array( 'wiki' => wfWikiID(), 'link' => $utp->getLocalURL(), 'rev' => $rev ) );
-       }
-
-       /**
-        * Get the revision ID for the last talk page revision viewed by the talk
-        * page owner.
-        * @return int|null Revision ID or null
-        */
-       public function getNewMessageRevisionId() {
-               $newMessageRevisionId = null;
-               $newMessageLinks = $this->getNewMessageLinks();
-               if ( $newMessageLinks ) {
-                       // Note: getNewMessageLinks() never returns more than a single link
-                       // and it is always for the same wiki, but we double-check here in
-                       // case that changes some time in the future.
-                       if ( count( $newMessageLinks ) === 1
-                               && $newMessageLinks[0]['wiki'] === wfWikiID()
-                               && $newMessageLinks[0]['rev']
-                       ) {
-                               /** @var Revision $newMessageRevision */
-                               $newMessageRevision = $newMessageLinks[0]['rev'];
-                               $newMessageRevisionId = $newMessageRevision->getId();
-                       }
-               }
-               return $newMessageRevisionId;
-       }
-
-       /**
-        * Internal uncached check for new messages
-        *
-        * @see getNewtalk()
-        * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param string|int $id User's IP address for anonymous users, User ID otherwise
-        * @return bool True if the user has new messages
-        */
-       protected function checkNewtalk( $field, $id ) {
-               $dbr = wfGetDB( DB_SLAVE );
-
-               $ok = $dbr->selectField( 'user_newtalk', $field, array( $field => $id ), __METHOD__ );
-
-               return $ok !== false;
-       }
-
-       /**
-        * Add or update the new messages flag
-        * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param string|int $id User's IP address for anonymous users, User ID otherwise
-        * @param Revision|null $curRev New, as yet unseen revision of the user talk page. Ignored if null.
-        * @return bool True if successful, false otherwise
-        */
-       protected function updateNewtalk( $field, $id, $curRev = null ) {
-               // Get timestamp of the talk page revision prior to the current one
-               $prevRev = $curRev ? $curRev->getPrevious() : false;
-               $ts = $prevRev ? $prevRev->getTimestamp() : null;
-               // Mark the user as having new messages since this revision
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->insert( 'user_newtalk',
-                       array( $field => $id, 'user_last_timestamp' => $dbw->timestampOrNull( $ts ) ),
-                       __METHOD__,
-                       'IGNORE' );
-               if ( $dbw->affectedRows() ) {
-                       wfDebug( __METHOD__ . ": set on ($field, $id)\n" );
-                       return true;
-               } else {
-                       wfDebug( __METHOD__ . " already set ($field, $id)\n" );
-                       return false;
-               }
-       }
-
-       /**
-        * Clear the new messages flag for the given user
-        * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
-        * @param string|int $id User's IP address for anonymous users, User ID otherwise
-        * @return bool True if successful, false otherwise
-        */
-       protected function deleteNewtalk( $field, $id ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'user_newtalk',
-                       array( $field => $id ),
-                       __METHOD__ );
-               if ( $dbw->affectedRows() ) {
-                       wfDebug( __METHOD__ . ": killed on ($field, $id)\n" );
-                       return true;
-               } else {
-                       wfDebug( __METHOD__ . ": already gone ($field, $id)\n" );
-                       return false;
-               }
-       }
-
-       /**
-        * Update the 'You have new messages!' status.
-        * @param bool $val Whether the user has new messages
-        * @param Revision $curRev New, as yet unseen revision of the user talk
-        *   page. Ignored if null or !$val.
-        */
-       public function setNewtalk( $val, $curRev = null ) {
-               if ( wfReadOnly() ) {
-                       return;
-               }
-
-               $this->load();
-               $this->mNewtalk = $val;
-
-               if ( $this->isAnon() ) {
-                       $field = 'user_ip';
-                       $id = $this->getName();
-               } else {
-                       $field = 'user_id';
-                       $id = $this->getId();
-               }
-
-               if ( $val ) {
-                       $changed = $this->updateNewtalk( $field, $id, $curRev );
-               } else {
-                       $changed = $this->deleteNewtalk( $field, $id );
-               }
-
-               if ( $changed ) {
-                       $this->invalidateCache();
-               }
-       }
-
-       /**
-        * Generate a current or new-future timestamp to be stored in the
-        * user_touched field when we update things.
-        * @return string Timestamp in TS_MW format
-        */
-       private function newTouchedTimestamp() {
-               global $wgClockSkewFudge;
-
-               $time = wfTimestamp( TS_MW, time() + $wgClockSkewFudge );
-               if ( $this->mTouched && $time <= $this->mTouched ) {
-                       $time = wfTimestamp( TS_MW, wfTimestamp( TS_UNIX, $this->mTouched ) + 1 );
-               }
-
-               return $time;
-       }
-
-       /**
-        * Clear user data from memcached
-        *
-        * Use after applying updates to the database; caller's
-        * responsibility to update user_touched if appropriate.
-        *
-        * Called implicitly from invalidateCache() and saveSettings().
-        *
-        * @param string $mode Use 'refresh' to clear now; otherwise before DB commit
-        */
-       public function clearSharedCache( $mode = 'changed' ) {
-               $id = $this->getId();
-               if ( !$id ) {
-                       return;
-               }
-
-               $key = wfMemcKey( 'user', 'id', $id );
-               if ( $mode === 'refresh' ) {
-                       ObjectCache::getMainWANInstance()->delete( $key, 1 );
-               } else {
-                       wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $key ) {
-                               ObjectCache::getMainWANInstance()->delete( $key );
-                       } );
-               }
-       }
-
-       /**
-        * Immediately touch the user data cache for this account
-        *
-        * Calls touch() and removes account data from memcached
-        */
-       public function invalidateCache() {
-               $this->touch();
-               $this->clearSharedCache();
-       }
-
-       /**
-        * Update the "touched" timestamp for the user
-        *
-        * This is useful on various login/logout events when making sure that
-        * a browser or proxy that has multiple tenants does not suffer cache
-        * pollution where the new user sees the old users content. The value
-        * of getTouched() is checked when determining 304 vs 200 responses.
-        * Unlike invalidateCache(), this preserves the User object cache and
-        * avoids database writes.
-        *
-        * @since 1.25
-        */
-       public function touch() {
-               $id = $this->getId();
-               if ( $id ) {
-                       $key = wfMemcKey( 'user-quicktouched', 'id', $id );
-                       ObjectCache::getMainWANInstance()->touchCheckKey( $key );
-                       $this->mQuickTouched = null;
-               }
-       }
-
-       /**
-        * Validate the cache for this account.
-        * @param string $timestamp A timestamp in TS_MW format
-        * @return bool
-        */
-       public function validateCache( $timestamp ) {
-               return ( $timestamp >= $this->getTouched() );
-       }
-
-       /**
-        * Get the user touched timestamp
-        *
-        * Use this value only to validate caches via inequalities
-        * such as in the case of HTTP If-Modified-Since response logic
-        *
-        * @return string TS_MW Timestamp
-        */
-       public function getTouched() {
-               $this->load();
-
-               if ( $this->mId ) {
-                       if ( $this->mQuickTouched === null ) {
-                               $key = wfMemcKey( 'user-quicktouched', 'id', $this->mId );
-                               $cache = ObjectCache::getMainWANInstance();
-
-                               $this->mQuickTouched = wfTimestamp( TS_MW, $cache->getCheckKeyTime( $key ) );
-                       }
-
-                       return max( $this->mTouched, $this->mQuickTouched );
-               }
-
-               return $this->mTouched;
-       }
-
-       /**
-        * Get the user_touched timestamp field (time of last DB updates)
-        * @return string TS_MW Timestamp
-        * @since 1.26
-        */
-       public function getDBTouched() {
-               $this->load();
-
-               return $this->mTouched;
-       }
-
-       /**
-        * @deprecated Removed in 1.27.
-        * @return Password
-        * @since 1.24
-        */
-       public function getPassword() {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
-       /**
-        * @deprecated Removed in 1.27.
-        * @return Password
-        * @since 1.24
-        */
-       public function getTemporaryPassword() {
-               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
-       }
-
-       /**
-        * Set the password and reset the random token.
-        * Calls through to authentication plugin if necessary;
-        * will have no effect if the auth plugin refuses to
-        * pass the change through or if the legal password
-        * checks fail.
-        *
-        * As a special case, setting the password to null
-        * wipes it, so the account cannot be logged in until
-        * a new password is set, for instance via e-mail.
-        *
-        * @deprecated since 1.27. AuthManager is coming.
-        * @param string $str New password to set
-        * @throws PasswordError On failure
-        * @return bool
-        */
-       public function setPassword( $str ) {
-               global $wgAuth;
-
-               if ( $str !== null ) {
-                       if ( !$wgAuth->allowPasswordChange() ) {
-                               throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() );
-                       }
-
-                       $status = $this->checkPasswordValidity( $str );
-                       if ( !$status->isGood() ) {
-                               throw new PasswordError( $status->getMessage()->text() );
-                       }
-               }
-
-               if ( !$wgAuth->setPassword( $this, $str ) ) {
-                       throw new PasswordError( wfMessage( 'externaldberror' )->text() );
-               }
-
-               $this->setToken();
-               $this->setOption( 'watchlisttoken', false );
-               $this->setPasswordInternal( $str );
-
-               return true;
-       }
-
-       /**
-        * Set the password and reset the random token unconditionally.
-        *
-        * @deprecated since 1.27. AuthManager is coming.
-        * @param string|null $str New password to set or null to set an invalid
-        *  password hash meaning that the user will not be able to log in
-        *  through the web interface.
-        */
-       public function setInternalPassword( $str ) {
-               global $wgAuth;
-
-               if ( $wgAuth->allowSetLocalPassword() ) {
-                       $this->setToken();
-                       $this->setOption( 'watchlisttoken', false );
-                       $this->setPasswordInternal( $str );
-               }
-       }
-
-       /**
-        * Actually set the password and such
-        * @param string|null $str New password to set or null to set an invalid
-        *  password hash meaning that the user will not be able to log in
-        *  through the web interface.
-        */
-       private function setPasswordInternal( $str ) {
-               $id = self::idFromName( $this->getName() );
-               if ( $id ) {
-                       $passwordFactory = new PasswordFactory();
-                       $passwordFactory->init( RequestContext::getMain()->getConfig() );
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update(
-                               'user',
-                               array(
-                                       'user_password' => $passwordFactory->newFromPlaintext( $str )->toString(),
-                                       'user_newpassword' => PasswordFactory::newInvalidPassword()->toString(),
-                                       'user_newpass_time' => $dbw->timestampOrNull( null ),
-                               ),
-                               array(
-                                       'user_id' => $id,
-                               ),
-                               __METHOD__
-                       );
-                       $this->mPassword = null;
-               } else {
-                       $this->mPassword = $str;
-               }
-       }
-
-       /**
-        * Get the user's current token.
-        * @param bool $forceCreation Force the generation of a new token if the
-        *   user doesn't have one (default=true for backwards compatibility).
-        * @return string Token
-        */
-       public function getToken( $forceCreation = true ) {
-               $this->load();
-               if ( !$this->mToken && $forceCreation ) {
-                       $this->setToken();
-               }
-               return $this->mToken;
-       }
-
-       /**
-        * Set the random token (used for persistent authentication)
-        * Called from loadDefaults() among other places.
-        *
-        * @param string|bool $token If specified, set the token to this value
-        */
-       public function setToken( $token = false ) {
-               $this->load();
-               if ( !$token ) {
-                       $this->mToken = MWCryptRand::generateHex( self::TOKEN_LENGTH );
-               } else {
-                       $this->mToken = $token;
-               }
-       }
-
-       /**
-        * Set the password for a password reminder or new account email
-        *
-        * @deprecated since 1.27, AuthManager is coming
-        * @param string $str New password to set or null to set an invalid
-        *  password hash meaning that the user will not be able to use it
-        * @param bool $throttle If true, reset the throttle timestamp to the present
-        */
-       public function setNewpassword( $str, $throttle = true ) {
-               $id = $this->getId();
-               if ( $id == 0 ) {
-                       throw new LogicException( 'Cannot set new password for a user that is not in the database.' );
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               $update = array(
-                       'user_newpassword' => $passwordFactory->newFromPlaintext( $str )->toString(),
-               );
-
-               if ( $str === null ) {
-                       $update['user_newpass_time'] = null;
-               } elseif ( $throttle ) {
-                       $update['user_newpass_time'] = $dbw->timestamp();
-               }
-
-               $dbw->update( 'user', $update, array( 'user_id' => $id ), __METHOD__ );
-       }
-
-       /**
-        * Has password reminder email been sent within the last
-        * $wgPasswordReminderResendTime hours?
-        * @return bool
-        */
-       public function isPasswordReminderThrottled() {
-               global $wgPasswordReminderResendTime;
-
-               if ( !$wgPasswordReminderResendTime ) {
-                       return false;
-               }
-
-               $this->load();
-
-               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
-               $newpassTime = $db->selectField(
-                       'user',
-                       'user_newpass_time',
-                       array( 'user_id' => $this->getId() ),
-                       __METHOD__
-               );
-
-               if ( $newpassTime === null ) {
-                       return false;
-               }
-               $expiry = wfTimestamp( TS_UNIX, $newpassTime ) + $wgPasswordReminderResendTime * 3600;
-               return time() < $expiry;
-       }
-
-       /**
-        * Get the user's e-mail address
-        * @return string User's email address
-        */
-       public function getEmail() {
-               $this->load();
-               Hooks::run( 'UserGetEmail', array( $this, &$this->mEmail ) );
-               return $this->mEmail;
-       }
-
-       /**
-        * Get the timestamp of the user's e-mail authentication
-        * @return string TS_MW timestamp
-        */
-       public function getEmailAuthenticationTimestamp() {
-               $this->load();
-               Hooks::run( 'UserGetEmailAuthenticationTimestamp', array( $this, &$this->mEmailAuthenticated ) );
-               return $this->mEmailAuthenticated;
-       }
-
-       /**
-        * Set the user's e-mail address
-        * @param string $str New e-mail address
-        */
-       public function setEmail( $str ) {
-               $this->load();
-               if ( $str == $this->mEmail ) {
-                       return;
-               }
-               $this->invalidateEmail();
-               $this->mEmail = $str;
-               Hooks::run( 'UserSetEmail', array( $this, &$this->mEmail ) );
-       }
-
-       /**
-        * Set the user's e-mail address and a confirmation mail if needed.
-        *
-        * @since 1.20
-        * @param string $str New e-mail address
-        * @return Status
-        */
-       public function setEmailWithConfirmation( $str ) {
-               global $wgEnableEmail, $wgEmailAuthentication;
-
-               if ( !$wgEnableEmail ) {
-                       return Status::newFatal( 'emaildisabled' );
-               }
-
-               $oldaddr = $this->getEmail();
-               if ( $str === $oldaddr ) {
-                       return Status::newGood( true );
-               }
-
-               $this->setEmail( $str );
-
-               if ( $str !== '' && $wgEmailAuthentication ) {
-                       // Send a confirmation request to the new address if needed
-                       $type = $oldaddr != '' ? 'changed' : 'set';
-                       $result = $this->sendConfirmationMail( $type );
-                       if ( $result->isGood() ) {
-                               // Say to the caller that a confirmation mail has been sent
-                               $result->value = 'eauth';
-                       }
-               } else {
-                       $result = Status::newGood( true );
-               }
-
-               return $result;
-       }
-
-       /**
-        * Get the user's real name
-        * @return string User's real name
-        */
-       public function getRealName() {
-               if ( !$this->isItemLoaded( 'realname' ) ) {
-                       $this->load();
-               }
-
-               return $this->mRealName;
-       }
-
-       /**
-        * Set the user's real name
-        * @param string $str New real name
-        */
-       public function setRealName( $str ) {
-               $this->load();
-               $this->mRealName = $str;
-       }
-
-       /**
-        * Get the user's current setting for a given option.
-        *
-        * @param string $oname The option to check
-        * @param string $defaultOverride A default value returned if the option does not exist
-        * @param bool $ignoreHidden Whether to ignore the effects of $wgHiddenPrefs
-        * @return string User's current value for the option
-        * @see getBoolOption()
-        * @see getIntOption()
-        */
-       public function getOption( $oname, $defaultOverride = null, $ignoreHidden = false ) {
-               global $wgHiddenPrefs;
-               $this->loadOptions();
-
-               # We want 'disabled' preferences to always behave as the default value for
-               # users, even if they have set the option explicitly in their settings (ie they
-               # set it, and then it was disabled removing their ability to change it).  But
-               # we don't want to erase the preferences in the database in case the preference
-               # is re-enabled again.  So don't touch $mOptions, just override the returned value
-               if ( !$ignoreHidden && in_array( $oname, $wgHiddenPrefs ) ) {
-                       return self::getDefaultOption( $oname );
-               }
-
-               if ( array_key_exists( $oname, $this->mOptions ) ) {
-                       return $this->mOptions[$oname];
-               } else {
-                       return $defaultOverride;
-               }
-       }
-
-       /**
-        * Get all user's options
-        *
-        * @param int $flags Bitwise combination of:
-        *   User::GETOPTIONS_EXCLUDE_DEFAULTS  Exclude user options that are set
-        *                                      to the default value. (Since 1.25)
-        * @return array
-        */
-       public function getOptions( $flags = 0 ) {
-               global $wgHiddenPrefs;
-               $this->loadOptions();
-               $options = $this->mOptions;
-
-               # We want 'disabled' preferences to always behave as the default value for
-               # users, even if they have set the option explicitly in their settings (ie they
-               # set it, and then it was disabled removing their ability to change it).  But
-               # we don't want to erase the preferences in the database in case the preference
-               # is re-enabled again.  So don't touch $mOptions, just override the returned value
-               foreach ( $wgHiddenPrefs as $pref ) {
-                       $default = self::getDefaultOption( $pref );
-                       if ( $default !== null ) {
-                               $options[$pref] = $default;
-                       }
-               }
-
-               if ( $flags & self::GETOPTIONS_EXCLUDE_DEFAULTS ) {
-                       $options = array_diff_assoc( $options, self::getDefaultOptions() );
-               }
-
-               return $options;
-       }
-
-       /**
-        * Get the user's current setting for a given option, as a boolean value.
-        *
-        * @param string $oname The option to check
-        * @return bool User's current value for the option
-        * @see getOption()
-        */
-       public function getBoolOption( $oname ) {
-               return (bool)$this->getOption( $oname );
-       }
-
-       /**
-        * Get the user's current setting for a given option, as an integer value.
-        *
-        * @param string $oname The option to check
-        * @param int $defaultOverride A default value returned if the option does not exist
-        * @return int User's current value for the option
-        * @see getOption()
-        */
-       public function getIntOption( $oname, $defaultOverride = 0 ) {
-               $val = $this->getOption( $oname );
-               if ( $val == '' ) {
-                       $val = $defaultOverride;
-               }
-               return intval( $val );
-       }
-
-       /**
-        * Set the given option for a user.
-        *
-        * You need to call saveSettings() to actually write to the database.
-        *
-        * @param string $oname The option to set
-        * @param mixed $val New value to set
-        */
-       public function setOption( $oname, $val ) {
-               $this->loadOptions();
-
-               // Explicitly NULL values should refer to defaults
-               if ( is_null( $val ) ) {
-                       $val = self::getDefaultOption( $oname );
-               }
-
-               $this->mOptions[$oname] = $val;
-       }
-
-       /**
-        * Get a token stored in the preferences (like the watchlist one),
-        * resetting it if it's empty (and saving changes).
-        *
-        * @param string $oname The option name to retrieve the token from
-        * @return string|bool User's current value for the option, or false if this option is disabled.
-        * @see resetTokenFromOption()
-        * @see getOption()
-        * @deprecated 1.26 Applications should use the OAuth extension
-        */
-       public function getTokenFromOption( $oname ) {
-               global $wgHiddenPrefs;
-
-               $id = $this->getId();
-               if ( !$id || in_array( $oname, $wgHiddenPrefs ) ) {
-                       return false;
-               }
-
-               $token = $this->getOption( $oname );
-               if ( !$token ) {
-                       // Default to a value based on the user token to avoid space
-                       // wasted on storing tokens for all users. When this option
-                       // is set manually by the user, only then is it stored.
-                       $token = hash_hmac( 'sha1', "$oname:$id", $this->getToken() );
-               }
-
-               return $token;
-       }
-
-       /**
-        * Reset a token stored in the preferences (like the watchlist one).
-        * *Does not* save user's preferences (similarly to setOption()).
-        *
-        * @param string $oname The option name to reset the token in
-        * @return string|bool New token value, or false if this option is disabled.
-        * @see getTokenFromOption()
-        * @see setOption()
-        */
-       public function resetTokenFromOption( $oname ) {
-               global $wgHiddenPrefs;
-               if ( in_array( $oname, $wgHiddenPrefs ) ) {
-                       return false;
-               }
-
-               $token = MWCryptRand::generateHex( 40 );
-               $this->setOption( $oname, $token );
-               return $token;
-       }
-
-       /**
-        * Return a list of the types of user options currently returned by
-        * User::getOptionKinds().
-        *
-        * Currently, the option kinds are:
-        * - 'registered' - preferences which are registered in core MediaWiki or
-        *                  by extensions using the UserGetDefaultOptions hook.
-        * - 'registered-multiselect' - as above, using the 'multiselect' type.
-        * - 'registered-checkmatrix' - as above, using the 'checkmatrix' type.
-        * - 'userjs' - preferences with names starting with 'userjs-', intended to
-        *              be used by user scripts.
-        * - 'special' - "preferences" that are not accessible via User::getOptions
-        *               or User::setOptions.
-        * - 'unused' - preferences about which MediaWiki doesn't know anything.
-        *              These are usually legacy options, removed in newer versions.
-        *
-        * The API (and possibly others) use this function to determine the possible
-        * option types for validation purposes, so make sure to update this when a
-        * new option kind is added.
-        *
-        * @see User::getOptionKinds
-        * @return array Option kinds
-        */
-       public static function listOptionKinds() {
-               return array(
-                       'registered',
-                       'registered-multiselect',
-                       'registered-checkmatrix',
-                       'userjs',
-                       'special',
-                       'unused'
-               );
-       }
-
-       /**
-        * Return an associative array mapping preferences keys to the kind of a preference they're
-        * used for. Different kinds are handled differently when setting or reading preferences.
-        *
-        * See User::listOptionKinds for the list of valid option types that can be provided.
-        *
-        * @see User::listOptionKinds
-        * @param IContextSource $context
-        * @param array $options Assoc. array with options keys to check as keys.
-        *   Defaults to $this->mOptions.
-        * @return array The key => kind mapping data
-        */
-       public function getOptionKinds( IContextSource $context, $options = null ) {
-               $this->loadOptions();
-               if ( $options === null ) {
-                       $options = $this->mOptions;
-               }
-
-               $prefs = Preferences::getPreferences( $this, $context );
-               $mapping = array();
-
-               // Pull out the "special" options, so they don't get converted as
-               // multiselect or checkmatrix.
-               $specialOptions = array_fill_keys( Preferences::getSaveBlacklist(), true );
-               foreach ( $specialOptions as $name => $value ) {
-                       unset( $prefs[$name] );
-               }
-
-               // Multiselect and checkmatrix options are stored in the database with
-               // one key per option, each having a boolean value. Extract those keys.
-               $multiselectOptions = array();
-               foreach ( $prefs as $name => $info ) {
-                       if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
-                                       ( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
-                               $opts = HTMLFormField::flattenOptions( $info['options'] );
-                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
-
-                               foreach ( $opts as $value ) {
-                                       $multiselectOptions["$prefix$value"] = true;
-                               }
-
-                               unset( $prefs[$name] );
-                       }
-               }
-               $checkmatrixOptions = array();
-               foreach ( $prefs as $name => $info ) {
-                       if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
-                                       ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
-                               $columns = HTMLFormField::flattenOptions( $info['columns'] );
-                               $rows = HTMLFormField::flattenOptions( $info['rows'] );
-                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
-
-                               foreach ( $columns as $column ) {
-                                       foreach ( $rows as $row ) {
-                                               $checkmatrixOptions["$prefix$column-$row"] = true;
-                                       }
-                               }
-
-                               unset( $prefs[$name] );
-                       }
-               }
-
-               // $value is ignored
-               foreach ( $options as $key => $value ) {
-                       if ( isset( $prefs[$key] ) ) {
-                               $mapping[$key] = 'registered';
-                       } elseif ( isset( $multiselectOptions[$key] ) ) {
-                               $mapping[$key] = 'registered-multiselect';
-                       } elseif ( isset( $checkmatrixOptions[$key] ) ) {
-                               $mapping[$key] = 'registered-checkmatrix';
-                       } elseif ( isset( $specialOptions[$key] ) ) {
-                               $mapping[$key] = 'special';
-                       } elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
-                               $mapping[$key] = 'userjs';
-                       } else {
-                               $mapping[$key] = 'unused';
-                       }
-               }
-
-               return $mapping;
-       }
-
-       /**
-        * Reset certain (or all) options to the site defaults
-        *
-        * The optional parameter determines which kinds of preferences will be reset.
-        * Supported values are everything that can be reported by getOptionKinds()
-        * and 'all', which forces a reset of *all* preferences and overrides everything else.
-        *
-        * @param array|string $resetKinds Which kinds of preferences to reset. Defaults to
-        *  array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
-        *  for backwards-compatibility.
-        * @param IContextSource|null $context Context source used when $resetKinds
-        *  does not contain 'all', passed to getOptionKinds().
-        *  Defaults to RequestContext::getMain() when null.
-        */
-       public function resetOptions(
-               $resetKinds = array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' ),
-               IContextSource $context = null
-       ) {
-               $this->load();
-               $defaultOptions = self::getDefaultOptions();
-
-               if ( !is_array( $resetKinds ) ) {
-                       $resetKinds = array( $resetKinds );
-               }
-
-               if ( in_array( 'all', $resetKinds ) ) {
-                       $newOptions = $defaultOptions;
-               } else {
-                       if ( $context === null ) {
-                               $context = RequestContext::getMain();
-                       }
-
-                       $optionKinds = $this->getOptionKinds( $context );
-                       $resetKinds = array_intersect( $resetKinds, self::listOptionKinds() );
-                       $newOptions = array();
-
-                       // Use default values for the options that should be deleted, and
-                       // copy old values for the ones that shouldn't.
-                       foreach ( $this->mOptions as $key => $value ) {
-                               if ( in_array( $optionKinds[$key], $resetKinds ) ) {
-                                       if ( array_key_exists( $key, $defaultOptions ) ) {
-                                               $newOptions[$key] = $defaultOptions[$key];
-                                       }
-                               } else {
-                                       $newOptions[$key] = $value;
-                               }
-                       }
-               }
-
-               Hooks::run( 'UserResetAllOptions', array( $this, &$newOptions, $this->mOptions, $resetKinds ) );
-
-               $this->mOptions = $newOptions;
-               $this->mOptionsLoaded = true;
-       }
-
-       /**
-        * Get the user's preferred date format.
-        * @return string User's preferred date format
-        */
-       public function getDatePreference() {
-               // Important migration for old data rows
-               if ( is_null( $this->mDatePreference ) ) {
-                       global $wgLang;
-                       $value = $this->getOption( 'date' );
-                       $map = $wgLang->getDatePreferenceMigrationMap();
-                       if ( isset( $map[$value] ) ) {
-                               $value = $map[$value];
-                       }
-                       $this->mDatePreference = $value;
-               }
-               return $this->mDatePreference;
-       }
-
-       /**
-        * Determine based on the wiki configuration and the user's options,
-        * whether this user must be over HTTPS no matter what.
-        *
-        * @return bool
-        */
-       public function requiresHTTPS() {
-               global $wgSecureLogin;
-               if ( !$wgSecureLogin ) {
-                       return false;
-               } else {
-                       $https = $this->getBoolOption( 'prefershttps' );
-                       Hooks::run( 'UserRequiresHTTPS', array( $this, &$https ) );
-                       if ( $https ) {
-                               $https = wfCanIPUseHTTPS( $this->getRequest()->getIP() );
-                       }
-                       return $https;
-               }
-       }
-
-       /**
-        * Get the user preferred stub threshold
-        *
-        * @return int
-        */
-       public function getStubThreshold() {
-               global $wgMaxArticleSize; # Maximum article size, in Kb
-               $threshold = $this->getIntOption( 'stubthreshold' );
-               if ( $threshold > $wgMaxArticleSize * 1024 ) {
-                       // If they have set an impossible value, disable the preference
-                       // so we can use the parser cache again.
-                       $threshold = 0;
-               }
-               return $threshold;
-       }
-
-       /**
-        * Get the permissions this user has.
-        * @return array Array of String permission names
-        */
-       public function getRights() {
-               if ( is_null( $this->mRights ) ) {
-                       $this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
-                       Hooks::run( 'UserGetRights', array( $this, &$this->mRights ) );
-                       // Force reindexation of rights when a hook has unset one of them
-                       $this->mRights = array_values( array_unique( $this->mRights ) );
-               }
-               return $this->mRights;
-       }
-
-       /**
-        * Get the list of explicit group memberships this user has.
-        * The implicit * and user groups are not included.
-        * @return array Array of String internal group names
-        */
-       public function getGroups() {
-               $this->load();
-               $this->loadGroups();
-               return $this->mGroups;
-       }
-
-       /**
-        * Get the list of implicit group memberships this user has.
-        * This includes all explicit groups, plus 'user' if logged in,
-        * '*' for all accounts, and autopromoted groups
-        * @param bool $recache Whether to avoid the cache
-        * @return array Array of String internal group names
-        */
-       public function getEffectiveGroups( $recache = false ) {
-               if ( $recache || is_null( $this->mEffectiveGroups ) ) {
-                       $this->mEffectiveGroups = array_unique( array_merge(
-                               $this->getGroups(), // explicit groups
-                               $this->getAutomaticGroups( $recache ) // implicit groups
-                       ) );
-                       // Hook for additional groups
-                       Hooks::run( 'UserEffectiveGroups', array( &$this, &$this->mEffectiveGroups ) );
-                       // Force reindexation of groups when a hook has unset one of them
-                       $this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
-               }
-               return $this->mEffectiveGroups;
-       }
-
-       /**
-        * Get the list of implicit group memberships this user has.
-        * This includes 'user' if logged in, '*' for all accounts,
-        * and autopromoted groups
-        * @param bool $recache Whether to avoid the cache
-        * @return array Array of String internal group names
-        */
-       public function getAutomaticGroups( $recache = false ) {
-               if ( $recache || is_null( $this->mImplicitGroups ) ) {
-                       $this->mImplicitGroups = array( '*' );
-                       if ( $this->getId() ) {
-                               $this->mImplicitGroups[] = 'user';
-
-                               $this->mImplicitGroups = array_unique( array_merge(
-                                       $this->mImplicitGroups,
-                                       Autopromote::getAutopromoteGroups( $this )
-                               ) );
-                       }
-                       if ( $recache ) {
-                               // Assure data consistency with rights/groups,
-                               // as getEffectiveGroups() depends on this function
-                               $this->mEffectiveGroups = null;
-                       }
-               }
-               return $this->mImplicitGroups;
-       }
-
-       /**
-        * Returns the groups the user has belonged to.
-        *
-        * The user may still belong to the returned groups. Compare with getGroups().
-        *
-        * The function will not return groups the user had belonged to before MW 1.17
-        *
-        * @return array Names of the groups the user has belonged to.
-        */
-       public function getFormerGroups() {
-               $this->load();
-
-               if ( is_null( $this->mFormerGroups ) ) {
-                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
-                               ? wfGetDB( DB_MASTER )
-                               : wfGetDB( DB_SLAVE );
-                       $res = $db->select( 'user_former_groups',
-                               array( 'ufg_group' ),
-                               array( 'ufg_user' => $this->mId ),
-                               __METHOD__ );
-                       $this->mFormerGroups = array();
-                       foreach ( $res as $row ) {
-                               $this->mFormerGroups[] = $row->ufg_group;
-                       }
-               }
-
-               return $this->mFormerGroups;
-       }
-
-       /**
-        * Get the user's edit count.
-        * @return int|null Null for anonymous users
-        */
-       public function getEditCount() {
-               if ( !$this->getId() ) {
-                       return null;
-               }
-
-               if ( $this->mEditCount === null ) {
-                       /* Populate the count, if it has not been populated yet */
-                       $dbr = wfGetDB( DB_SLAVE );
-                       // check if the user_editcount field has been initialized
-                       $count = $dbr->selectField(
-                               'user', 'user_editcount',
-                               array( 'user_id' => $this->mId ),
-                               __METHOD__
-                       );
-
-                       if ( $count === null ) {
-                               // it has not been initialized. do so.
-                               $count = $this->initEditCount();
-                       }
-                       $this->mEditCount = $count;
-               }
-               return (int)$this->mEditCount;
-       }
-
-       /**
-        * Add the user to the given group.
-        * This takes immediate effect.
-        * @param string $group Name of the group to add
-        * @return bool
-        */
-       public function addGroup( $group ) {
-               $this->load();
-
-               if ( !Hooks::run( 'UserAddGroup', array( $this, &$group ) ) ) {
-                       return false;
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               if ( $this->getId() ) {
-                       $dbw->insert( 'user_groups',
-                               array(
-                                       'ug_user' => $this->getID(),
-                                       'ug_group' => $group,
-                               ),
-                               __METHOD__,
-                               array( 'IGNORE' ) );
-               }
-
-               $this->loadGroups();
-               $this->mGroups[] = $group;
-               // In case loadGroups was not called before, we now have the right twice.
-               // Get rid of the duplicate.
-               $this->mGroups = array_unique( $this->mGroups );
-
-               // Refresh the groups caches, and clear the rights cache so it will be
-               // refreshed on the next call to $this->getRights().
-               $this->getEffectiveGroups( true );
-               $this->mRights = null;
-
-               $this->invalidateCache();
-
-               return true;
-       }
-
-       /**
-        * Remove the user from the given group.
-        * This takes immediate effect.
-        * @param string $group Name of the group to remove
-        * @return bool
-        */
-       public function removeGroup( $group ) {
-               $this->load();
-               if ( !Hooks::run( 'UserRemoveGroup', array( $this, &$group ) ) ) {
-                       return false;
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'user_groups',
-                       array(
-                               'ug_user' => $this->getID(),
-                               'ug_group' => $group,
-                       ), __METHOD__
-               );
-               // Remember that the user was in this group
-               $dbw->insert( 'user_former_groups',
-                       array(
-                               'ufg_user' => $this->getID(),
-                               'ufg_group' => $group,
-                       ),
-                       __METHOD__,
-                       array( 'IGNORE' )
-               );
-
-               $this->loadGroups();
-               $this->mGroups = array_diff( $this->mGroups, array( $group ) );
-
-               // Refresh the groups caches, and clear the rights cache so it will be
-               // refreshed on the next call to $this->getRights().
-               $this->getEffectiveGroups( true );
-               $this->mRights = null;
-
-               $this->invalidateCache();
-
-               return true;
-       }
-
-       /**
-        * Get whether the user is logged in
-        * @return bool
-        */
-       public function isLoggedIn() {
-               return $this->getID() != 0;
-       }
-
-       /**
-        * Get whether the user is anonymous
-        * @return bool
-        */
-       public function isAnon() {
-               return !$this->isLoggedIn();
-       }
-
-       /**
-        * Check if user is allowed to access a feature / make an action
-        *
-        * @param string ... Permissions to test
-        * @return bool True if user is allowed to perform *any* of the given actions
-        */
-       public function isAllowedAny() {
-               $permissions = func_get_args();
-               foreach ( $permissions as $permission ) {
-                       if ( $this->isAllowed( $permission ) ) {
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       /**
-        *
-        * @param string ... Permissions to test
-        * @return bool True if the user is allowed to perform *all* of the given actions
-        */
-       public function isAllowedAll() {
-               $permissions = func_get_args();
-               foreach ( $permissions as $permission ) {
-                       if ( !$this->isAllowed( $permission ) ) {
-                               return false;
-                       }
-               }
-               return true;
-       }
-
-       /**
-        * Internal mechanics of testing a permission
-        * @param string $action
-        * @return bool
-        */
-       public function isAllowed( $action = '' ) {
-               if ( $action === '' ) {
-                       return true; // In the spirit of DWIM
-               }
-               // Patrolling may not be enabled
-               if ( $action === 'patrol' || $action === 'autopatrol' ) {
-                       global $wgUseRCPatrol, $wgUseNPPatrol;
-                       if ( !$wgUseRCPatrol && !$wgUseNPPatrol ) {
-                               return false;
-                       }
-               }
-               // Use strict parameter to avoid matching numeric 0 accidentally inserted
-               // by misconfiguration: 0 == 'foo'
-               return in_array( $action, $this->getRights(), true );
-       }
-
-       /**
-        * Check whether to enable recent changes patrol features for this user
-        * @return bool True or false
-        */
-       public function useRCPatrol() {
-               global $wgUseRCPatrol;
-               return $wgUseRCPatrol && $this->isAllowedAny( 'patrol', 'patrolmarks' );
-       }
-
-       /**
-        * Check whether to enable new pages patrol features for this user
-        * @return bool True or false
-        */
-       public function useNPPatrol() {
-               global $wgUseRCPatrol, $wgUseNPPatrol;
-               return (
-                       ( $wgUseRCPatrol || $wgUseNPPatrol )
-                               && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) )
-               );
-       }
-
-       /**
-        * Get the WebRequest object to use with this object
-        *
-        * @return WebRequest
-        */
-       public function getRequest() {
-               if ( $this->mRequest ) {
-                       return $this->mRequest;
-               } else {
-                       global $wgRequest;
-                       return $wgRequest;
-               }
-       }
-
-       /**
-        * Get the current skin, loading it if required
-        * @return Skin The current skin
-        * @todo FIXME: Need to check the old failback system [AV]
-        * @deprecated since 1.18 Use ->getSkin() in the most relevant outputting context you have
-        */
-       public function getSkin() {
-               wfDeprecated( __METHOD__, '1.18' );
-               return RequestContext::getMain()->getSkin();
-       }
-
-       /**
-        * Get a WatchedItem for this user and $title.
-        *
-        * @since 1.22 $checkRights parameter added
-        * @param Title $title
-        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
-        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
-        * @return WatchedItem
-        */
-       public function getWatchedItem( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               $key = $checkRights . ':' . $title->getNamespace() . ':' . $title->getDBkey();
-
-               if ( isset( $this->mWatchedItems[$key] ) ) {
-                       return $this->mWatchedItems[$key];
-               }
-
-               if ( count( $this->mWatchedItems ) >= self::MAX_WATCHED_ITEMS_CACHE ) {
-                       $this->mWatchedItems = array();
-               }
-
-               $this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title, $checkRights );
-               return $this->mWatchedItems[$key];
-       }
-
-       /**
-        * Check the watched status of an article.
-        * @since 1.22 $checkRights parameter added
-        * @param Title $title Title of the article to look at
-        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
-        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
-        * @return bool
-        */
-       public function isWatched( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               return $this->getWatchedItem( $title, $checkRights )->isWatched();
-       }
-
-       /**
-        * Watch an article.
-        * @since 1.22 $checkRights parameter added
-        * @param Title $title Title of the article to look at
-        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
-        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
-        */
-       public function addWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               $this->getWatchedItem( $title, $checkRights )->addWatch();
-               $this->invalidateCache();
-       }
-
-       /**
-        * Stop watching an article.
-        * @since 1.22 $checkRights parameter added
-        * @param Title $title Title of the article to look at
-        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
-        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
-        */
-       public function removeWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
-               $this->getWatchedItem( $title, $checkRights )->removeWatch();
-               $this->invalidateCache();
-       }
-
-       /**
-        * Clear the user's notification timestamp for the given title.
-        * If e-notif e-mails are on, they will receive notification mails on
-        * the next change of the page if it's watched etc.
-        * @note If the user doesn't have 'editmywatchlist', this will do nothing.
-        * @param Title $title Title of the article to look at
-        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
-        */
-       public function clearNotification( &$title, $oldid = 0 ) {
-               global $wgUseEnotif, $wgShowUpdatedMarker;
-
-               // Do nothing if the database is locked to writes
-               if ( wfReadOnly() ) {
-                       return;
-               }
-
-               // Do nothing if not allowed to edit the watchlist
-               if ( !$this->isAllowed( 'editmywatchlist' ) ) {
-                       return;
-               }
-
-               // If we're working on user's talk page, we should update the talk page message indicator
-               if ( $title->getNamespace() == NS_USER_TALK && $title->getText() == $this->getName() ) {
-                       if ( !Hooks::run( 'UserClearNewTalkNotification', array( &$this, $oldid ) ) ) {
-                               return;
-                       }
-
-                       $that = $this;
-                       // Try to update the DB post-send and only if needed...
-                       DeferredUpdates::addCallableUpdate( function() use ( $that, $title, $oldid ) {
-                               if ( !$that->getNewtalk() ) {
-                                       return; // no notifications to clear
-                               }
-
-                               // Delete the last notifications (they stack up)
-                               $that->setNewtalk( false );
-
-                               // If there is a new, unseen, revision, use its timestamp
-                               $nextid = $oldid
-                                       ? $title->getNextRevisionID( $oldid, Title::GAID_FOR_UPDATE )
-                                       : null;
-                               if ( $nextid ) {
-                                       $that->setNewtalk( true, Revision::newFromId( $nextid ) );
-                               }
-                       } );
-               }
-
-               if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
-                       return;
-               }
-
-               if ( $this->isAnon() ) {
-                       // Nothing else to do...
-                       return;
-               }
-
-               // Only update the timestamp if the page is being watched.
-               // The query to find out if it is watched is cached both in memcached and per-invocation,
-               // and when it does have to be executed, it can be on a slave
-               // If this is the user's newtalk page, we always update the timestamp
-               $force = '';
-               if ( $title->getNamespace() == NS_USER_TALK && $title->getText() == $this->getName() ) {
-                       $force = 'force';
-               }
-
-               $this->getWatchedItem( $title )->resetNotificationTimestamp(
-                       $force, $oldid, WatchedItem::DEFERRED
-               );
-       }
-
-       /**
-        * Resets all of the given user's page-change notification timestamps.
-        * If e-notif e-mails are on, they will receive notification mails on
-        * the next change of any watched page.
-        * @note If the user doesn't have 'editmywatchlist', this will do nothing.
-        */
-       public function clearAllNotifications() {
-               if ( wfReadOnly() ) {
-                       return;
-               }
-
-               // Do nothing if not allowed to edit the watchlist
-               if ( !$this->isAllowed( 'editmywatchlist' ) ) {
-                       return;
-               }
-
-               global $wgUseEnotif, $wgShowUpdatedMarker;
-               if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
-                       $this->setNewtalk( false );
-                       return;
-               }
-               $id = $this->getId();
-               if ( $id != 0 ) {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update( 'watchlist',
-                               array( /* SET */ 'wl_notificationtimestamp' => null ),
-                               array( /* WHERE */ 'wl_user' => $id, 'wl_notificationtimestamp IS NOT NULL' ),
-                               __METHOD__
-                       );
-                       // We also need to clear here the "you have new message" notification for the own user_talk page;
-                       // it's cleared one page view later in WikiPage::doViewUpdates().
-               }
-       }
-
-       /**
-        * Set a cookie on the user's client. Wrapper for
-        * WebResponse::setCookie
-        * @param string $name Name of the cookie to set
-        * @param string $value Value to set
-        * @param int $exp Expiration time, as a UNIX time value;
-        *                   if 0 or not specified, use the default $wgCookieExpiration
-        * @param bool $secure
-        *  true: Force setting the secure attribute when setting the cookie
-        *  false: Force NOT setting the secure attribute when setting the cookie
-        *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
-        * @param array $params Array of options sent passed to WebResponse::setcookie()
-        * @param WebRequest|null $request WebRequest object to use; $wgRequest will be used if null
-        *        is passed.
-        */
-       protected function setCookie(
-               $name, $value, $exp = 0, $secure = null, $params = array(), $request = null
-       ) {
-               if ( $request === null ) {
-                       $request = $this->getRequest();
-               }
-               $params['secure'] = $secure;
-               $request->response()->setCookie( $name, $value, $exp, $params );
-       }
-
-       /**
-        * Clear a cookie on the user's client
-        * @param string $name Name of the cookie to clear
-        * @param bool $secure
-        *  true: Force setting the secure attribute when setting the cookie
-        *  false: Force NOT setting the secure attribute when setting the cookie
-        *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
-        * @param array $params Array of options sent passed to WebResponse::setcookie()
-        */
-       protected function clearCookie( $name, $secure = null, $params = array() ) {
-               $this->setCookie( $name, '', time() - 86400, $secure, $params );
-       }
-
-       /**
-        * Set an extended login cookie on the user's client. The expiry of the cookie
-        * is controlled by the $wgExtendedLoginCookieExpiration configuration
-        * variable.
-        *
-        * @see User::setCookie
-        *
-        * @param string $name Name of the cookie to set
-        * @param string $value Value to set
-        * @param bool $secure
-        *  true: Force setting the secure attribute when setting the cookie
-        *  false: Force NOT setting the secure attribute when setting the cookie
-        *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
-        */
-       protected function setExtendedLoginCookie( $name, $value, $secure ) {
-               global $wgExtendedLoginCookieExpiration, $wgCookieExpiration;
-
-               $exp = time();
-               $exp += $wgExtendedLoginCookieExpiration !== null
-                       ? $wgExtendedLoginCookieExpiration
-                       : $wgCookieExpiration;
-
-               $this->setCookie( $name, $value, $exp, $secure );
-       }
-
-       /**
-        * Set the default cookies for this session on the user's client.
-        *
-        * @param WebRequest|null $request WebRequest object to use; $wgRequest will be used if null
-        *        is passed.
-        * @param bool $secure Whether to force secure/insecure cookies or use default
-        * @param bool $rememberMe Whether to add a Token cookie for elongated sessions
-        */
-       public function setCookies( $request = null, $secure = null, $rememberMe = false ) {
-               global $wgExtendedLoginCookies;
-
-               if ( $request === null ) {
-                       $request = $this->getRequest();
-               }
-
-               $this->load();
-               if ( 0 == $this->mId ) {
-                       return;
-               }
-               if ( !$this->mToken ) {
-                       // When token is empty or NULL generate a new one and then save it to the database
-                       // This allows a wiki to re-secure itself after a leak of it's user table or $wgSecretKey
-                       // Simply by setting every cell in the user_token column to NULL and letting them be
-                       // regenerated as users log back into the wiki.
-                       $this->setToken();
-                       if ( !wfReadOnly() ) {
-                               $this->saveSettings();
-                       }
-               }
-               $session = array(
-                       'wsUserID' => $this->mId,
-                       'wsToken' => $this->mToken,
-                       'wsUserName' => $this->getName()
-               );
-               $cookies = array(
-                       'UserID' => $this->mId,
-                       'UserName' => $this->getName(),
-               );
-               if ( $rememberMe ) {
-                       $cookies['Token'] = $this->mToken;
-               } else {
-                       $cookies['Token'] = false;
-               }
-
-               Hooks::run( 'UserSetCookies', array( $this, &$session, &$cookies ) );
-
-               foreach ( $session as $name => $value ) {
-                       $request->setSessionData( $name, $value );
-               }
-               foreach ( $cookies as $name => $value ) {
-                       if ( $value === false ) {
-                               $this->clearCookie( $name );
-                       } elseif ( $rememberMe && in_array( $name, $wgExtendedLoginCookies ) ) {
-                               $this->setExtendedLoginCookie( $name, $value, $secure );
-                       } else {
-                               $this->setCookie( $name, $value, 0, $secure, array(), $request );
-                       }
-               }
-
-               /**
-                * If wpStickHTTPS was selected, also set an insecure cookie that
-                * will cause the site to redirect the user to HTTPS, if they access
-                * it over HTTP. Bug 29898. Use an un-prefixed cookie, so it's the same
-                * as the one set by centralauth (bug 53538). Also set it to session, or
-                * standard time setting, based on if rememberme was set.
-                */
-               if ( $request->getCheck( 'wpStickHTTPS' ) || $this->requiresHTTPS() ) {
-                       $this->setCookie(
-                               'forceHTTPS',
-                               'true',
-                               $rememberMe ? 0 : null,
-                               false,
-                               array( 'prefix' => '' ) // no prefix
-                       );
-               }
-       }
-
-       /**
-        * Log this user out.
-        */
-       public function logout() {
-               if ( Hooks::run( 'UserLogout', array( &$this ) ) ) {
-                       $this->doLogout();
-               }
-       }
-
-       /**
-        * Clear the user's cookies and session, and reset the instance cache.
-        * @see logout()
-        */
-       public function doLogout() {
-               $this->clearInstanceCache( 'defaults' );
-
-               $this->getRequest()->setSessionData( 'wsUserID', 0 );
-
-               $this->clearCookie( 'UserID' );
-               $this->clearCookie( 'Token' );
-               $this->clearCookie( 'forceHTTPS', false, array( 'prefix' => '' ) );
-
-               // Remember when user logged out, to prevent seeing cached pages
-               $this->setCookie( 'LoggedOut', time(), time() + 86400 );
-       }
-
-       /**
-        * Save this user's settings into the database.
-        * @todo Only rarely do all these fields need to be set!
-        */
-       public function saveSettings() {
-               if ( wfReadOnly() ) {
-                       // @TODO: caller should deal with this instead!
-                       // This should really just be an exception.
-                       MWExceptionHandler::logException( new DBExpectedError(
-                               null,
-                               "Could not update user with ID '{$this->mId}'; DB is read-only."
-                       ) );
-                       return;
-               }
-
-               $this->load();
-               if ( 0 == $this->mId ) {
-                       return; // anon
-               }
-
-               // Get a new user_touched that is higher than the old one.
-               // This will be used for a CAS check as a last-resort safety
-               // check against race conditions and slave lag.
-               $oldTouched = $this->mTouched;
-               $newTouched = $this->newTouchedTimestamp();
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->update( 'user',
-                       array( /* SET */
-                               'user_name' => $this->mName,
-                               'user_real_name' => $this->mRealName,
-                               'user_email' => $this->mEmail,
-                               'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
-                               'user_touched' => $dbw->timestamp( $newTouched ),
-                               'user_token' => strval( $this->mToken ),
-                               'user_email_token' => $this->mEmailToken,
-                               'user_email_token_expires' => $dbw->timestampOrNull( $this->mEmailTokenExpires ),
-                       ), array( /* WHERE */
-                               'user_id' => $this->mId,
-                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
-                       ), __METHOD__
-               );
-
-               if ( !$dbw->affectedRows() ) {
-                       // Maybe the problem was a missed cache update; clear it to be safe
-                       $this->clearSharedCache( 'refresh' );
-                       // User was changed in the meantime or loaded with stale data
-                       $from = ( $this->queryFlagsUsed & self::READ_LATEST ) ? 'master' : 'slave';
-                       throw new MWException(
-                               "CAS update failed on user_touched for user ID '{$this->mId}' (read from $from);" .
-                               " the version of the user to be saved is older than the current version."
-                       );
-               }
-
-               $this->mTouched = $newTouched;
-               $this->saveOptions();
-
-               Hooks::run( 'UserSaveSettings', array( $this ) );
-               $this->clearSharedCache();
-               $this->getUserPage()->invalidateCache();
-       }
-
-       /**
-        * If only this user's username is known, and it exists, return the user ID.
-        *
-        * @param int $flags Bitfield of User:READ_* constants; useful for existence checks
-        * @return int
-        */
-       public function idForName( $flags = 0 ) {
-               $s = trim( $this->getName() );
-               if ( $s === '' ) {
-                       return 0;
-               }
-
-               $db = ( ( $flags & self::READ_LATEST ) == self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
-
-               $options = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
-                       ? array( 'LOCK IN SHARE MODE' )
-                       : array();
-
-               $id = $db->selectField( 'user',
-                       'user_id', array( 'user_name' => $s ), __METHOD__, $options );
-
-               return (int)$id;
-       }
-
-       /**
-        * Add a user to the database, return the user object
-        *
-        * @param string $name Username to add
-        * @param array $params Array of Strings Non-default parameters to save to
-        *   the database as user_* fields:
-        *   - email: The user's email address.
-        *   - email_authenticated: The email authentication timestamp.
-        *   - real_name: The user's real name.
-        *   - options: An associative array of non-default options.
-        *   - token: Random authentication token. Do not set.
-        *   - registration: Registration timestamp. Do not set.
-        *
-        * @return User|null User object, or null if the username already exists.
-        */
-       public static function createNew( $name, $params = array() ) {
-               foreach ( array( 'password', 'newpassword', 'newpass_time', 'password_expires' ) as $field ) {
-                       if ( isset( $params[$field] ) ) {
-                               wfDeprecated( __METHOD__ . " with param '$field'", '1.27' );
-                               unset( $params[$field] );
-                       }
-               }
-
-               $user = new User;
-               $user->load();
-               $user->setToken(); // init token
-               if ( isset( $params['options'] ) ) {
-                       $user->mOptions = $params['options'] + (array)$user->mOptions;
-                       unset( $params['options'] );
-               }
-               $dbw = wfGetDB( DB_MASTER );
-               $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
-
-               $noPass = PasswordFactory::newInvalidPassword()->toString();
-
-               $fields = array(
-                       'user_id' => $seqVal,
-                       'user_name' => $name,
-                       'user_password' => $noPass,
-                       'user_newpassword' => $noPass,
-                       'user_email' => $user->mEmail,
-                       'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
-                       'user_real_name' => $user->mRealName,
-                       'user_token' => strval( $user->mToken ),
-                       'user_registration' => $dbw->timestamp( $user->mRegistration ),
-                       'user_editcount' => 0,
-                       'user_touched' => $dbw->timestamp( $user->newTouchedTimestamp() ),
-               );
-               foreach ( $params as $name => $value ) {
-                       $fields["user_$name"] = $value;
-               }
-               $dbw->insert( 'user', $fields, __METHOD__, array( 'IGNORE' ) );
-               if ( $dbw->affectedRows() ) {
-                       $newUser = User::newFromId( $dbw->insertId() );
-               } else {
-                       $newUser = null;
-               }
-               return $newUser;
-       }
-
-       /**
-        * Add this existing user object to the database. If the user already
-        * exists, a fatal status object is returned, and the user object is
-        * initialised with the data from the database.
-        *
-        * Previously, this function generated a DB error due to a key conflict
-        * if the user already existed. Many extension callers use this function
-        * in code along the lines of:
-        *
-        *   $user = User::newFromName( $name );
-        *   if ( !$user->isLoggedIn() ) {
-        *       $user->addToDatabase();
-        *   }
-        *   // do something with $user...
-        *
-        * However, this was vulnerable to a race condition (bug 16020). By
-        * initialising the user object if the user exists, we aim to support this
-        * calling sequence as far as possible.
-        *
-        * Note that if the user exists, this function will acquire a write lock,
-        * so it is still advisable to make the call conditional on isLoggedIn(),
-        * and to commit the transaction after calling.
-        *
-        * @throws MWException
-        * @return Status
-        */
-       public function addToDatabase() {
-               $this->load();
-               if ( !$this->mToken ) {
-                       $this->setToken(); // init token
-               }
-
-               $this->mTouched = $this->newTouchedTimestamp();
-
-               $noPass = PasswordFactory::newInvalidPassword()->toString();
-
-               $dbw = wfGetDB( DB_MASTER );
-               $inWrite = $dbw->writesOrCallbacksPending();
-               $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
-               $dbw->insert( 'user',
-                       array(
-                               'user_id' => $seqVal,
-                               'user_name' => $this->mName,
-                               'user_password' => $noPass,
-                               'user_newpassword' => $noPass,
-                               'user_email' => $this->mEmail,
-                               'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
-                               'user_real_name' => $this->mRealName,
-                               'user_token' => strval( $this->mToken ),
-                               'user_registration' => $dbw->timestamp( $this->mRegistration ),
-                               'user_editcount' => 0,
-                               'user_touched' => $dbw->timestamp( $this->mTouched ),
-                       ), __METHOD__,
-                       array( 'IGNORE' )
-               );
-               if ( !$dbw->affectedRows() ) {
-                       // The queries below cannot happen in the same REPEATABLE-READ snapshot.
-                       // Handle this by COMMIT, if possible, or by LOCK IN SHARE MODE otherwise.
-                       if ( $inWrite ) {
-                               // Can't commit due to pending writes that may need atomicity.
-                               // This may cause some lock contention unlike the case below.
-                               $options = array( 'LOCK IN SHARE MODE' );
-                               $flags = self::READ_LOCKING;
-                       } else {
-                               // Often, this case happens early in views before any writes when
-                               // using CentralAuth. It's should be OK to commit and break the snapshot.
-                               $dbw->commit( __METHOD__, 'flush' );
-                               $options = array();
-                               $flags = self::READ_LATEST;
-                       }
-                       $this->mId = $dbw->selectField( 'user', 'user_id',
-                               array( 'user_name' => $this->mName ), __METHOD__, $options );
-                       $loaded = false;
-                       if ( $this->mId ) {
-                               if ( $this->loadFromDatabase( $flags ) ) {
-                                       $loaded = true;
-                               }
-                       }
-                       if ( !$loaded ) {
-                               throw new MWException( __METHOD__ . ": hit a key conflict attempting " .
-                                       "to insert user '{$this->mName}' row, but it was not present in select!" );
-                       }
-                       return Status::newFatal( 'userexists' );
-               }
-               $this->mId = $dbw->insertId();
-
-               // Set the password now that it's in the DB, if applicable
-               if ( $this->mPassword !== null ) {
-                       $this->setPasswordInternal( $this->mPassword );
-               }
-
-               // Clear instance cache other than user table data, which is already accurate
-               $this->clearInstanceCache();
-
-               $this->saveOptions();
-               return Status::newGood();
-       }
-
-       /**
-        * If this user is logged-in and blocked,
-        * block any IP address they've successfully logged in from.
-        * @return bool A block was spread
-        */
-       public function spreadAnyEditBlock() {
-               if ( $this->isLoggedIn() && $this->isBlocked() ) {
-                       return $this->spreadBlock();
-               }
-               return false;
-       }
-
-       /**
-        * If this (non-anonymous) user is blocked,
-        * block the IP address they've successfully logged in from.
-        * @return bool A block was spread
-        */
-       protected function spreadBlock() {
-               wfDebug( __METHOD__ . "()\n" );
-               $this->load();
-               if ( $this->mId == 0 ) {
-                       return false;
-               }
-
-               $userblock = Block::newFromTarget( $this->getName() );
-               if ( !$userblock ) {
-                       return false;
-               }
-
-               return (bool)$userblock->doAutoblock( $this->getRequest()->getIP() );
-       }
-
-       /**
-        * Get whether the user is explicitly blocked from account creation.
-        * @return bool|Block
-        */
-       public function isBlockedFromCreateAccount() {
-               $this->getBlockedStatus();
-               if ( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
-                       return $this->mBlock;
-               }
-
-               # bug 13611: if the IP address the user is trying to create an account from is
-               # blocked with createaccount disabled, prevent new account creation there even
-               # when the user is logged in
-               if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
-                       $this->mBlockedFromCreateAccount = Block::newFromTarget( null, $this->getRequest()->getIP() );
-               }
-               return $this->mBlockedFromCreateAccount instanceof Block
-                       && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
-                       ? $this->mBlockedFromCreateAccount
-                       : false;
-       }
-
-       /**
-        * Get whether the user is blocked from using Special:Emailuser.
-        * @return bool
-        */
-       public function isBlockedFromEmailuser() {
-               $this->getBlockedStatus();
-               return $this->mBlock && $this->mBlock->prevents( 'sendemail' );
-       }
-
-       /**
-        * Get whether the user is allowed to create an account.
-        * @return bool
-        */
-       public function isAllowedToCreateAccount() {
-               return $this->isAllowed( 'createaccount' ) && !$this->isBlockedFromCreateAccount();
-       }
-
-       /**
-        * Get this user's personal page title.
-        *
-        * @return Title User's personal page title
-        */
-       public function getUserPage() {
-               return Title::makeTitle( NS_USER, $this->getName() );
-       }
-
-       /**
-        * Get this user's talk page title.
-        *
-        * @return Title User's talk page title
-        */
-       public function getTalkPage() {
-               $title = $this->getUserPage();
-               return $title->getTalkPage();
-       }
-
-       /**
-        * Determine whether the user is a newbie. Newbies are either
-        * anonymous IPs, or the most recently created accounts.
-        * @return bool
-        */
-       public function isNewbie() {
-               return !$this->isAllowed( 'autoconfirmed' );
-       }
-
-       /**
-        * Check to see if the given clear-text password is one of the accepted passwords
-        * @deprecated since 1.27. AuthManager is coming.
-        * @param string $password User password
-        * @return bool True if the given password is correct, otherwise False
-        */
-       public function checkPassword( $password ) {
-               global $wgAuth, $wgLegacyEncoding;
-
-               $this->load();
-
-               // Some passwords will give a fatal Status, which means there is
-               // some sort of technical or security reason for this password to
-               // be completely invalid and should never be checked (e.g., T64685)
-               if ( !$this->checkPasswordValidity( $password )->isOK() ) {
-                       return false;
-               }
-
-               // Certain authentication plugins do NOT want to save
-               // domain passwords in a mysql database, so we should
-               // check this (in case $wgAuth->strict() is false).
-               if ( $wgAuth->authenticate( $this->getName(), $password ) ) {
-                       return true;
-               } elseif ( $wgAuth->strict() ) {
-                       // Auth plugin doesn't allow local authentication
-                       return false;
-               } elseif ( $wgAuth->strictUserAuth( $this->getName() ) ) {
-                       // Auth plugin doesn't allow local authentication for this user name
-                       return false;
-               }
-
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
-
-               try {
-                       $mPassword = $passwordFactory->newFromCiphertext( $db->selectField(
-                               'user', 'user_password', array( 'user_id' => $this->getId() ), __METHOD__
-                       ) );
-               } catch ( PasswordError $e ) {
-                       wfDebug( 'Invalid password hash found in database.' );
-                       $mPassword = PasswordFactory::newInvalidPassword();
-               }
-
-               if ( !$mPassword->equals( $password ) ) {
-                       if ( $wgLegacyEncoding ) {
-                               // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
-                               // Check for this with iconv
-                               $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
-                               if ( $cp1252Password === $password || !$mPassword->equals( $cp1252Password ) ) {
-                                       return false;
-                               }
-                       } else {
-                               return false;
-                       }
-               }
-
-               if ( $passwordFactory->needsUpdate( $mPassword ) && !wfReadOnly() ) {
-                       $this->setPasswordInternal( $password );
-               }
-
-               return true;
-       }
-
-       /**
-        * Check if the given clear-text password matches the temporary password
-        * sent by e-mail for password reset operations.
-        *
-        * @deprecated since 1.27. AuthManager is coming.
-        * @param string $plaintext
-        * @return bool True if matches, false otherwise
-        */
-       public function checkTemporaryPassword( $plaintext ) {
-               global $wgNewPasswordExpiry;
-
-               $this->load();
-
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
-
-               $row = $db->selectRow(
-                       'user',
-                       array( 'user_newpassword', 'user_newpass_time' ),
-                       array( 'user_id' => $this->getId() ),
-                       __METHOD__
-               );
-               try {
-                       $mNewpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
-               } catch ( PasswordError $e ) {
-                       wfDebug( 'Invalid password hash found in database.' );
-                       $mNewpassword = PasswordFactory::newInvalidPassword();
-               }
-
-               if ( $mNewpassword->equals( $plaintext ) ) {
-                       if ( is_null( $row->user_newpass_time ) ) {
-                               return true;
-                       }
-                       $expiry = wfTimestamp( TS_UNIX, $row->user_newpass_time ) + $wgNewPasswordExpiry;
-                       return ( time() < $expiry );
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Alias for getEditToken.
-        * @deprecated since 1.19, use getEditToken instead.
-        *
-        * @param string|array $salt Array of Strings Optional function-specific data for hashing
-        * @param WebRequest|null $request WebRequest object to use or null to use $wgRequest
-        * @return string The new edit token
-        */
-       public function editToken( $salt = '', $request = null ) {
-               wfDeprecated( __METHOD__, '1.19' );
-               return $this->getEditToken( $salt, $request );
-       }
-
-       /**
-        * Internal implementation for self::getEditToken() and
-        * self::matchEditToken().
-        *
-        * @param string|array $salt
-        * @param WebRequest $request
-        * @param string|int $timestamp
-        * @return string
-        */
-       private function getEditTokenAtTimestamp( $salt, $request, $timestamp ) {
-               if ( $this->isAnon() ) {
-                       return self::EDIT_TOKEN_SUFFIX;
-               } else {
-                       $token = $request->getSessionData( 'wsEditToken' );
-                       if ( $token === null ) {
-                               $token = MWCryptRand::generateHex( 32 );
-                               $request->setSessionData( 'wsEditToken', $token );
-                       }
-                       if ( is_array( $salt ) ) {
-                               $salt = implode( '|', $salt );
-                       }
-                       return hash_hmac( 'md5', $timestamp . $salt, $token, false ) .
-                               dechex( $timestamp ) .
-                               self::EDIT_TOKEN_SUFFIX;
-               }
-       }
-
-       /**
-        * Initialize (if necessary) and return a session token value
-        * which can be used in edit forms to show that the user's
-        * login credentials aren't being hijacked with a foreign form
-        * submission.
-        *
-        * @since 1.19
-        *
-        * @param string|array $salt Array of Strings Optional function-specific data for hashing
-        * @param WebRequest|null $request WebRequest object to use or null to use $wgRequest
-        * @return string The new edit token
-        */
-       public function getEditToken( $salt = '', $request = null ) {
-               return $this->getEditTokenAtTimestamp(
-                       $salt, $request ?: $this->getRequest(), wfTimestamp()
-               );
-       }
-
-       /**
-        * Generate a looking random token for various uses.
-        *
-        * @return string The new random token
-        * @deprecated since 1.20: Use MWCryptRand for secure purposes or
-        *   wfRandomString for pseudo-randomness.
-        */
-       public static function generateToken() {
-               return MWCryptRand::generateHex( 32 );
-       }
-
-       /**
-        * Get the embedded timestamp from a token.
-        * @param string $val Input token
-        * @return int|null
-        */
-       public static function getEditTokenTimestamp( $val ) {
-               $suffixLen = strlen( self::EDIT_TOKEN_SUFFIX );
-               if ( strlen( $val ) <= 32 + $suffixLen ) {
-                       return null;
-               }
-
-               return hexdec( substr( $val, 32, -$suffixLen ) );
-       }
-
-       /**
-        * Check given value against the token value stored in the session.
-        * A match should confirm that the form was submitted from the
-        * user's own login session, not a form submission from a third-party
-        * site.
-        *
-        * @param string $val Input value to compare
-        * @param string $salt Optional function-specific data for hashing
-        * @param WebRequest|null $request Object to use or null to use $wgRequest
-        * @param int $maxage Fail tokens older than this, in seconds
-        * @return bool Whether the token matches
-        */
-       public function matchEditToken( $val, $salt = '', $request = null, $maxage = null ) {
-               if ( $this->isAnon() ) {
-                       return $val === self::EDIT_TOKEN_SUFFIX;
-               }
-
-               $timestamp = self::getEditTokenTimestamp( $val );
-               if ( $timestamp === null ) {
-                       return false;
-               }
-               if ( $maxage !== null && $timestamp < wfTimestamp() - $maxage ) {
-                       // Expired token
-                       return false;
-               }
-
-               $sessionToken = $this->getEditTokenAtTimestamp(
-                       $salt, $request ?: $this->getRequest(), $timestamp
-               );
-
-               if ( $val != $sessionToken ) {
-                       wfDebug( "User::matchEditToken: broken session data\n" );
-               }
-
-               return hash_equals( $sessionToken, $val );
-       }
-
-       /**
-        * Check given value against the token value stored in the session,
-        * ignoring the suffix.
-        *
-        * @param string $val Input value to compare
-        * @param string $salt Optional function-specific data for hashing
-        * @param WebRequest|null $request Object to use or null to use $wgRequest
-        * @param int $maxage Fail tokens older than this, in seconds
-        * @return bool Whether the token matches
-        */
-       public function matchEditTokenNoSuffix( $val, $salt = '', $request = null, $maxage = null ) {
-               $val = substr( $val, 0, strspn( $val, '0123456789abcdef' ) ) . self::EDIT_TOKEN_SUFFIX;
-               return $this->matchEditToken( $val, $salt, $request, $maxage );
-       }
-
-       /**
-        * Generate a new e-mail confirmation token and send a confirmation/invalidation
-        * mail to the user's given address.
-        *
-        * @param string $type Message to send, either "created", "changed" or "set"
-        * @return Status
-        */
-       public function sendConfirmationMail( $type = 'created' ) {
-               global $wgLang;
-               $expiration = null; // gets passed-by-ref and defined in next line.
-               $token = $this->confirmationToken( $expiration );
-               $url = $this->confirmationTokenUrl( $token );
-               $invalidateURL = $this->invalidationTokenUrl( $token );
-               $this->saveSettings();
-
-               if ( $type == 'created' || $type === false ) {
-                       $message = 'confirmemail_body';
-               } elseif ( $type === true ) {
-                       $message = 'confirmemail_body_changed';
-               } else {
-                       // Messages: confirmemail_body_changed, confirmemail_body_set
-                       $message = 'confirmemail_body_' . $type;
-               }
-
-               return $this->sendMail( wfMessage( 'confirmemail_subject' )->text(),
-                       wfMessage( $message,
-                               $this->getRequest()->getIP(),
-                               $this->getName(),
-                               $url,
-                               $wgLang->timeanddate( $expiration, false ),
-                               $invalidateURL,
-                               $wgLang->date( $expiration, false ),
-                               $wgLang->time( $expiration, false ) )->text() );
-       }
-
-       /**
-        * Send an e-mail to this user's account. Does not check for
-        * confirmed status or validity.
-        *
-        * @param string $subject Message subject
-        * @param string $body Message body
-        * @param User|null $from Optional sending user; if unspecified, default
-        *   $wgPasswordSender will be used.
-        * @param string $replyto Reply-To address
-        * @return Status
-        */
-       public function sendMail( $subject, $body, $from = null, $replyto = null ) {
-               global $wgPasswordSender;
-
-               if ( $from instanceof User ) {
-                       $sender = MailAddress::newFromUser( $from );
-               } else {
-                       $sender = new MailAddress( $wgPasswordSender,
-                               wfMessage( 'emailsender' )->inContentLanguage()->text() );
-               }
-               $to = MailAddress::newFromUser( $this );
-
-               return UserMailer::send( $to, $sender, $subject, $body, array(
-                       'replyTo' => $replyto,
-               ) );
-       }
-
-       /**
-        * Generate, store, and return a new e-mail confirmation code.
-        * A hash (unsalted, since it's used as a key) is stored.
-        *
-        * @note Call saveSettings() after calling this function to commit
-        * this change to the database.
-        *
-        * @param string &$expiration Accepts the expiration time
-        * @return string New token
-        */
-       protected function confirmationToken( &$expiration ) {
-               global $wgUserEmailConfirmationTokenExpiry;
-               $now = time();
-               $expires = $now + $wgUserEmailConfirmationTokenExpiry;
-               $expiration = wfTimestamp( TS_MW, $expires );
-               $this->load();
-               $token = MWCryptRand::generateHex( 32 );
-               $hash = md5( $token );
-               $this->mEmailToken = $hash;
-               $this->mEmailTokenExpires = $expiration;
-               return $token;
-       }
-
-       /**
-        * Return a URL the user can use to confirm their email address.
-        * @param string $token Accepts the email confirmation token
-        * @return string New token URL
-        */
-       protected function confirmationTokenUrl( $token ) {
-               return $this->getTokenUrl( 'ConfirmEmail', $token );
-       }
-
-       /**
-        * Return a URL the user can use to invalidate their email address.
-        * @param string $token Accepts the email confirmation token
-        * @return string New token URL
-        */
-       protected function invalidationTokenUrl( $token ) {
-               return $this->getTokenUrl( 'InvalidateEmail', $token );
-       }
-
-       /**
-        * Internal function to format the e-mail validation/invalidation URLs.
-        * This uses a quickie hack to use the
-        * hardcoded English names of the Special: pages, for ASCII safety.
-        *
-        * @note Since these URLs get dropped directly into emails, using the
-        * short English names avoids insanely long URL-encoded links, which
-        * also sometimes can get corrupted in some browsers/mailers
-        * (bug 6957 with Gmail and Internet Explorer).
-        *
-        * @param string $page Special page
-        * @param string $token Token
-        * @return string Formatted URL
-        */
-       protected function getTokenUrl( $page, $token ) {
-               // Hack to bypass localization of 'Special:'
-               $title = Title::makeTitle( NS_MAIN, "Special:$page/$token" );
-               return $title->getCanonicalURL();
-       }
-
-       /**
-        * Mark the e-mail address confirmed.
-        *
-        * @note Call saveSettings() after calling this function to commit the change.
-        *
-        * @return bool
-        */
-       public function confirmEmail() {
-               // Check if it's already confirmed, so we don't touch the database
-               // and fire the ConfirmEmailComplete hook on redundant confirmations.
-               if ( !$this->isEmailConfirmed() ) {
-                       $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
-                       Hooks::run( 'ConfirmEmailComplete', array( $this ) );
-               }
-               return true;
-       }
-
-       /**
-        * Invalidate the user's e-mail confirmation, and unauthenticate the e-mail
-        * address if it was already confirmed.
-        *
-        * @note Call saveSettings() after calling this function to commit the change.
-        * @return bool Returns true
-        */
-       public function invalidateEmail() {
-               $this->load();
-               $this->mEmailToken = null;
-               $this->mEmailTokenExpires = null;
-               $this->setEmailAuthenticationTimestamp( null );
-               $this->mEmail = '';
-               Hooks::run( 'InvalidateEmailComplete', array( $this ) );
-               return true;
-       }
-
-       /**
-        * Set the e-mail authentication timestamp.
-        * @param string $timestamp TS_MW timestamp
-        */
-       public function setEmailAuthenticationTimestamp( $timestamp ) {
-               $this->load();
-               $this->mEmailAuthenticated = $timestamp;
-               Hooks::run( 'UserSetEmailAuthenticationTimestamp', array( $this, &$this->mEmailAuthenticated ) );
-       }
-
-       /**
-        * Is this user allowed to send e-mails within limits of current
-        * site configuration?
-        * @return bool
-        */
-       public function canSendEmail() {
-               global $wgEnableEmail, $wgEnableUserEmail;
-               if ( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
-                       return false;
-               }
-               $canSend = $this->isEmailConfirmed();
-               Hooks::run( 'UserCanSendEmail', array( &$this, &$canSend ) );
-               return $canSend;
-       }
-
-       /**
-        * Is this user allowed to receive e-mails within limits of current
-        * site configuration?
-        * @return bool
-        */
-       public function canReceiveEmail() {
-               return $this->isEmailConfirmed() && !$this->getOption( 'disablemail' );
-       }
-
-       /**
-        * Is this user's e-mail address valid-looking and confirmed within
-        * limits of the current site configuration?
-        *
-        * @note If $wgEmailAuthentication is on, this may require the user to have
-        * confirmed their address by returning a code or using a password
-        * sent to the address from the wiki.
-        *
-        * @return bool
-        */
-       public function isEmailConfirmed() {
-               global $wgEmailAuthentication;
-               $this->load();
-               $confirmed = true;
-               if ( Hooks::run( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
-                       if ( $this->isAnon() ) {
-                               return false;
-                       }
-                       if ( !Sanitizer::validateEmail( $this->mEmail ) ) {
-                               return false;
-                       }
-                       if ( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() ) {
-                               return false;
-                       }
-                       return true;
-               } else {
-                       return $confirmed;
-               }
-       }
-
-       /**
-        * Check whether there is an outstanding request for e-mail confirmation.
-        * @return bool
-        */
-       public function isEmailConfirmationPending() {
-               global $wgEmailAuthentication;
-               return $wgEmailAuthentication &&
-                       !$this->isEmailConfirmed() &&
-                       $this->mEmailToken &&
-                       $this->mEmailTokenExpires > wfTimestamp();
-       }
-
-       /**
-        * Get the timestamp of account creation.
-        *
-        * @return string|bool|null Timestamp of account creation, false for
-        *  non-existent/anonymous user accounts, or null if existing account
-        *  but information is not in database.
-        */
-       public function getRegistration() {
-               if ( $this->isAnon() ) {
-                       return false;
-               }
-               $this->load();
-               return $this->mRegistration;
-       }
-
-       /**
-        * Get the timestamp of the first edit
-        *
-        * @return string|bool Timestamp of first edit, or false for
-        *  non-existent/anonymous user accounts.
-        */
-       public function getFirstEditTimestamp() {
-               if ( $this->getId() == 0 ) {
-                       return false; // anons
-               }
-               $dbr = wfGetDB( DB_SLAVE );
-               $time = $dbr->selectField( 'revision', 'rev_timestamp',
-                       array( 'rev_user' => $this->getId() ),
-                       __METHOD__,
-                       array( 'ORDER BY' => 'rev_timestamp ASC' )
-               );
-               if ( !$time ) {
-                       return false; // no edits
-               }
-               return wfTimestamp( TS_MW, $time );
-       }
-
-       /**
-        * Get the permissions associated with a given list of groups
-        *
-        * @param array $groups Array of Strings List of internal group names
-        * @return array Array of Strings List of permission key names for given groups combined
-        */
-       public static function getGroupPermissions( $groups ) {
-               global $wgGroupPermissions, $wgRevokePermissions;
-               $rights = array();
-               // grant every granted permission first
-               foreach ( $groups as $group ) {
-                       if ( isset( $wgGroupPermissions[$group] ) ) {
-                               $rights = array_merge( $rights,
-                                       // array_filter removes empty items
-                                       array_keys( array_filter( $wgGroupPermissions[$group] ) ) );
-                       }
-               }
-               // now revoke the revoked permissions
-               foreach ( $groups as $group ) {
-                       if ( isset( $wgRevokePermissions[$group] ) ) {
-                               $rights = array_diff( $rights,
-                                       array_keys( array_filter( $wgRevokePermissions[$group] ) ) );
-                       }
-               }
-               return array_unique( $rights );
-       }
-
-       /**
-        * Get all the groups who have a given permission
-        *
-        * @param string $role Role to check
-        * @return array Array of Strings List of internal group names with the given permission
-        */
-       public static function getGroupsWithPermission( $role ) {
-               global $wgGroupPermissions;
-               $allowedGroups = array();
-               foreach ( array_keys( $wgGroupPermissions ) as $group ) {
-                       if ( self::groupHasPermission( $group, $role ) ) {
-                               $allowedGroups[] = $group;
-                       }
-               }
-               return $allowedGroups;
-       }
-
-       /**
-        * Check, if the given group has the given permission
-        *
-        * If you're wanting to check whether all users have a permission, use
-        * User::isEveryoneAllowed() instead. That properly checks if it's revoked
-        * from anyone.
-        *
-        * @since 1.21
-        * @param string $group Group to check
-        * @param string $role Role to check
-        * @return bool
-        */
-       public static function groupHasPermission( $group, $role ) {
-               global $wgGroupPermissions, $wgRevokePermissions;
-               return isset( $wgGroupPermissions[$group][$role] ) && $wgGroupPermissions[$group][$role]
-                       && !( isset( $wgRevokePermissions[$group][$role] ) && $wgRevokePermissions[$group][$role] );
-       }
-
-       /**
-        * Check if all users have the given permission
-        *
-        * @since 1.22
-        * @param string $right Right to check
-        * @return bool
-        */
-       public static function isEveryoneAllowed( $right ) {
-               global $wgGroupPermissions, $wgRevokePermissions;
-               static $cache = array();
-
-               // Use the cached results, except in unit tests which rely on
-               // being able change the permission mid-request
-               if ( isset( $cache[$right] ) && !defined( 'MW_PHPUNIT_TEST' ) ) {
-                       return $cache[$right];
-               }
-
-               if ( !isset( $wgGroupPermissions['*'][$right] ) || !$wgGroupPermissions['*'][$right] ) {
-                       $cache[$right] = false;
-                       return false;
-               }
-
-               // If it's revoked anywhere, then everyone doesn't have it
-               foreach ( $wgRevokePermissions as $rights ) {
-                       if ( isset( $rights[$right] ) && $rights[$right] ) {
-                               $cache[$right] = false;
-                               return false;
-                       }
-               }
-
-               // Allow extensions (e.g. OAuth) to say false
-               if ( !Hooks::run( 'UserIsEveryoneAllowed', array( $right ) ) ) {
-                       $cache[$right] = false;
-                       return false;
-               }
-
-               $cache[$right] = true;
-               return true;
-       }
-
-       /**
-        * Get the localized descriptive name for a group, if it exists
-        *
-        * @param string $group Internal group name
-        * @return string Localized descriptive group name
-        */
-       public static function getGroupName( $group ) {
-               $msg = wfMessage( "group-$group" );
-               return $msg->isBlank() ? $group : $msg->text();
-       }
-
-       /**
-        * Get the localized descriptive name for a member of a group, if it exists
-        *
-        * @param string $group Internal group name
-        * @param string $username Username for gender (since 1.19)
-        * @return string Localized name for group member
-        */
-       public static function getGroupMember( $group, $username = '#' ) {
-               $msg = wfMessage( "group-$group-member", $username );
-               return $msg->isBlank() ? $group : $msg->text();
-       }
-
-       /**
-        * Return the set of defined explicit groups.
-        * The implicit groups (by default *, 'user' and 'autoconfirmed')
-        * are not included, as they are defined automatically, not in the database.
-        * @return array Array of internal group names
-        */
-       public static function getAllGroups() {
-               global $wgGroupPermissions, $wgRevokePermissions;
-               return array_diff(
-                       array_merge( array_keys( $wgGroupPermissions ), array_keys( $wgRevokePermissions ) ),
-                       self::getImplicitGroups()
-               );
-       }
-
-       /**
-        * Get a list of all available permissions.
-        * @return string[] Array of permission names
-        */
-       public static function getAllRights() {
-               if ( self::$mAllRights === false ) {
-                       global $wgAvailableRights;
-                       if ( count( $wgAvailableRights ) ) {
-                               self::$mAllRights = array_unique( array_merge( self::$mCoreRights, $wgAvailableRights ) );
-                       } else {
-                               self::$mAllRights = self::$mCoreRights;
-                       }
-                       Hooks::run( 'UserGetAllRights', array( &self::$mAllRights ) );
-               }
-               return self::$mAllRights;
-       }
-
-       /**
-        * Get a list of implicit groups
-        * @return array Array of Strings Array of internal group names
-        */
-       public static function getImplicitGroups() {
-               global $wgImplicitGroups;
-
-               $groups = $wgImplicitGroups;
-               # Deprecated, use $wgImplicitGroups instead
-               Hooks::run( 'UserGetImplicitGroups', array( &$groups ), '1.25' );
-
-               return $groups;
-       }
-
-       /**
-        * Get the title of a page describing a particular group
-        *
-        * @param string $group Internal group name
-        * @return Title|bool Title of the page if it exists, false otherwise
-        */
-       public static function getGroupPage( $group ) {
-               $msg = wfMessage( 'grouppage-' . $group )->inContentLanguage();
-               if ( $msg->exists() ) {
-                       $title = Title::newFromText( $msg->text() );
-                       if ( is_object( $title ) ) {
-                               return $title;
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * Create a link to the group in HTML, if available;
-        * else return the group name.
-        *
-        * @param string $group Internal name of the group
-        * @param string $text The text of the link
-        * @return string HTML link to the group
-        */
-       public static function makeGroupLinkHTML( $group, $text = '' ) {
-               if ( $text == '' ) {
-                       $text = self::getGroupName( $group );
-               }
-               $title = self::getGroupPage( $group );
-               if ( $title ) {
-                       return Linker::link( $title, htmlspecialchars( $text ) );
-               } else {
-                       return htmlspecialchars( $text );
-               }
-       }
-
-       /**
-        * Create a link to the group in Wikitext, if available;
-        * else return the group name.
-        *
-        * @param string $group Internal name of the group
-        * @param string $text The text of the link
-        * @return string Wikilink to the group
-        */
-       public static function makeGroupLinkWiki( $group, $text = '' ) {
-               if ( $text == '' ) {
-                       $text = self::getGroupName( $group );
-               }
-               $title = self::getGroupPage( $group );
-               if ( $title ) {
-                       $page = $title->getFullText();
-                       return "[[$page|$text]]";
-               } else {
-                       return $text;
-               }
-       }
-
-       /**
-        * Returns an array of the groups that a particular group can add/remove.
-        *
-        * @param string $group The group to check for whether it can add/remove
-        * @return array Array( 'add' => array( addablegroups ),
-        *     'remove' => array( removablegroups ),
-        *     'add-self' => array( addablegroups to self),
-        *     'remove-self' => array( removable groups from self) )
-        */
-       public static function changeableByGroup( $group ) {
-               global $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
-
-               $groups = array(
-                       'add' => array(),
-                       'remove' => array(),
-                       'add-self' => array(),
-                       'remove-self' => array()
-               );
-
-               if ( empty( $wgAddGroups[$group] ) ) {
-                       // Don't add anything to $groups
-               } elseif ( $wgAddGroups[$group] === true ) {
-                       // You get everything
-                       $groups['add'] = self::getAllGroups();
-               } elseif ( is_array( $wgAddGroups[$group] ) ) {
-                       $groups['add'] = $wgAddGroups[$group];
-               }
-
-               // Same thing for remove
-               if ( empty( $wgRemoveGroups[$group] ) ) {
-                       // Do nothing
-               } elseif ( $wgRemoveGroups[$group] === true ) {
-                       $groups['remove'] = self::getAllGroups();
-               } elseif ( is_array( $wgRemoveGroups[$group] ) ) {
-                       $groups['remove'] = $wgRemoveGroups[$group];
-               }
-
-               // Re-map numeric keys of AddToSelf/RemoveFromSelf to the 'user' key for backwards compatibility
-               if ( empty( $wgGroupsAddToSelf['user'] ) || $wgGroupsAddToSelf['user'] !== true ) {
-                       foreach ( $wgGroupsAddToSelf as $key => $value ) {
-                               if ( is_int( $key ) ) {
-                                       $wgGroupsAddToSelf['user'][] = $value;
-                               }
-                       }
-               }
-
-               if ( empty( $wgGroupsRemoveFromSelf['user'] ) || $wgGroupsRemoveFromSelf['user'] !== true ) {
-                       foreach ( $wgGroupsRemoveFromSelf as $key => $value ) {
-                               if ( is_int( $key ) ) {
-                                       $wgGroupsRemoveFromSelf['user'][] = $value;
-                               }
-                       }
-               }
-
-               // Now figure out what groups the user can add to him/herself
-               if ( empty( $wgGroupsAddToSelf[$group] ) ) {
-                       // Do nothing
-               } elseif ( $wgGroupsAddToSelf[$group] === true ) {
-                       // No idea WHY this would be used, but it's there
-                       $groups['add-self'] = User::getAllGroups();
-               } elseif ( is_array( $wgGroupsAddToSelf[$group] ) ) {
-                       $groups['add-self'] = $wgGroupsAddToSelf[$group];
-               }
-
-               if ( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
-                       // Do nothing
-               } elseif ( $wgGroupsRemoveFromSelf[$group] === true ) {
-                       $groups['remove-self'] = User::getAllGroups();
-               } elseif ( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
-                       $groups['remove-self'] = $wgGroupsRemoveFromSelf[$group];
-               }
-
-               return $groups;
-       }
-
-       /**
-        * Returns an array of groups that this user can add and remove
-        * @return array Array( 'add' => array( addablegroups ),
-        *  'remove' => array( removablegroups ),
-        *  'add-self' => array( addablegroups to self),
-        *  'remove-self' => array( removable groups from self) )
-        */
-       public function changeableGroups() {
-               if ( $this->isAllowed( 'userrights' ) ) {
-                       // This group gives the right to modify everything (reverse-
-                       // compatibility with old "userrights lets you change
-                       // everything")
-                       // Using array_merge to make the groups reindexed
-                       $all = array_merge( User::getAllGroups() );
-                       return array(
-                               'add' => $all,
-                               'remove' => $all,
-                               'add-self' => array(),
-                               'remove-self' => array()
-                       );
-               }
-
-               // Okay, it's not so simple, we will have to go through the arrays
-               $groups = array(
-                       'add' => array(),
-                       'remove' => array(),
-                       'add-self' => array(),
-                       'remove-self' => array()
-               );
-               $addergroups = $this->getEffectiveGroups();
-
-               foreach ( $addergroups as $addergroup ) {
-                       $groups = array_merge_recursive(
-                               $groups, $this->changeableByGroup( $addergroup )
-                       );
-                       $groups['add'] = array_unique( $groups['add'] );
-                       $groups['remove'] = array_unique( $groups['remove'] );
-                       $groups['add-self'] = array_unique( $groups['add-self'] );
-                       $groups['remove-self'] = array_unique( $groups['remove-self'] );
-               }
-               return $groups;
-       }
-
-       /**
-        * Deferred version of incEditCountImmediate()
-        */
-       public function incEditCount() {
-               $that = $this;
-               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $that ) {
-                       $that->incEditCountImmediate();
-               } );
-       }
-
-       /**
-        * Increment the user's edit-count field.
-        * Will have no effect for anonymous users.
-        * @since 1.26
-        */
-       public function incEditCountImmediate() {
-               if ( $this->isAnon() ) {
-                       return;
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-               // No rows will be "affected" if user_editcount is NULL
-               $dbw->update(
-                       'user',
-                       array( 'user_editcount=user_editcount+1' ),
-                       array( 'user_id' => $this->getId(), 'user_editcount IS NOT NULL' ),
-                       __METHOD__
-               );
-               // Lazy initialization check...
-               if ( $dbw->affectedRows() == 0 ) {
-                       // Now here's a goddamn hack...
-                       $dbr = wfGetDB( DB_SLAVE );
-                       if ( $dbr !== $dbw ) {
-                               // If we actually have a slave server, the count is
-                               // at least one behind because the current transaction
-                               // has not been committed and replicated.
-                               $this->initEditCount( 1 );
-                       } else {
-                               // But if DB_SLAVE is selecting the master, then the
-                               // count we just read includes the revision that was
-                               // just added in the working transaction.
-                               $this->initEditCount();
-                       }
-               }
-               // Edit count in user cache too
-               $this->invalidateCache();
-       }
-
-       /**
-        * Initialize user_editcount from data out of the revision table
-        *
-        * @param int $add Edits to add to the count from the revision table
-        * @return int Number of edits
-        */
-       protected function initEditCount( $add = 0 ) {
-               // Pull from a slave to be less cruel to servers
-               // Accuracy isn't the point anyway here
-               $dbr = wfGetDB( DB_SLAVE );
-               $count = (int)$dbr->selectField(
-                       'revision',
-                       'COUNT(rev_user)',
-                       array( 'rev_user' => $this->getId() ),
-                       __METHOD__
-               );
-               $count = $count + $add;
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->update(
-                       'user',
-                       array( 'user_editcount' => $count ),
-                       array( 'user_id' => $this->getId() ),
-                       __METHOD__
-               );
-
-               return $count;
-       }
-
-       /**
-        * Get the description of a given right
-        *
-        * @param string $right Right to query
-        * @return string Localized description of the right
-        */
-       public static function getRightDescription( $right ) {
-               $key = "right-$right";
-               $msg = wfMessage( $key );
-               return $msg->isBlank() ? $right : $msg->text();
-       }
-
-       /**
-        * Make a new-style password hash
-        *
-        * @param string $password Plain-text password
-        * @param bool|string $salt Optional salt, may be random or the user ID.
-        *  If unspecified or false, will generate one automatically
-        * @return string Password hash
-        * @deprecated since 1.24, use Password class
-        */
-       public static function crypt( $password, $salt = false ) {
-               wfDeprecated( __METHOD__, '1.24' );
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               $hash = $passwordFactory->newFromPlaintext( $password );
-               return $hash->toString();
-       }
-
-       /**
-        * Compare a password hash with a plain-text password. Requires the user
-        * ID if there's a chance that the hash is an old-style hash.
-        *
-        * @param string $hash Password hash
-        * @param string $password Plain-text password to compare
-        * @param string|bool $userId User ID for old-style password salt
-        *
-        * @return bool
-        * @deprecated since 1.24, use Password class
-        */
-       public static function comparePasswords( $hash, $password, $userId = false ) {
-               wfDeprecated( __METHOD__, '1.24' );
-
-               // Check for *really* old password hashes that don't even have a type
-               // The old hash format was just an md5 hex hash, with no type information
-               if ( preg_match( '/^[0-9a-f]{32}$/', $hash ) ) {
-                       global $wgPasswordSalt;
-                       if ( $wgPasswordSalt ) {
-                               $password = ":B:{$userId}:{$hash}";
-                       } else {
-                               $password = ":A:{$hash}";
-                       }
-               }
-
-               $passwordFactory = new PasswordFactory();
-               $passwordFactory->init( RequestContext::getMain()->getConfig() );
-               $hash = $passwordFactory->newFromCiphertext( $hash );
-               return $hash->equals( $password );
-       }
-
-       /**
-        * Add a newuser log entry for this user.
-        * Before 1.19 the return value was always true.
-        *
-        * @param string|bool $action Account creation type.
-        *   - String, one of the following values:
-        *     - 'create' for an anonymous user creating an account for himself.
-        *       This will force the action's performer to be the created user itself,
-        *       no matter the value of $wgUser
-        *     - 'create2' for a logged in user creating an account for someone else
-        *     - 'byemail' when the created user will receive its password by e-mail
-        *     - 'autocreate' when the user is automatically created (such as by CentralAuth).
-        *   - Boolean means whether the account was created by e-mail (deprecated):
-        *     - true will be converted to 'byemail'
-        *     - false will be converted to 'create' if this object is the same as
-        *       $wgUser and to 'create2' otherwise
-        *
-        * @param string $reason User supplied reason
-        *
-        * @return int|bool True if not $wgNewUserLog; otherwise ID of log item or 0 on failure
-        */
-       public function addNewUserLogEntry( $action = false, $reason = '' ) {
-               global $wgUser, $wgNewUserLog;
-               if ( empty( $wgNewUserLog ) ) {
-                       return true; // disabled
-               }
-
-               if ( $action === true ) {
-                       $action = 'byemail';
-               } elseif ( $action === false ) {
-                       if ( $this->equals( $wgUser ) ) {
-                               $action = 'create';
-                       } else {
-                               $action = 'create2';
-                       }
-               }
-
-               if ( $action === 'create' || $action === 'autocreate' ) {
-                       $performer = $this;
-               } else {
-                       $performer = $wgUser;
-               }
-
-               $logEntry = new ManualLogEntry( 'newusers', $action );
-               $logEntry->setPerformer( $performer );
-               $logEntry->setTarget( $this->getUserPage() );
-               $logEntry->setComment( $reason );
-               $logEntry->setParameters( array(
-                       '4::userid' => $this->getId(),
-               ) );
-               $logid = $logEntry->insert();
-
-               if ( $action !== 'autocreate' ) {
-                       $logEntry->publish( $logid );
-               }
-
-               return (int)$logid;
-       }
-
-       /**
-        * Add an autocreate newuser log entry for this user
-        * Used by things like CentralAuth and perhaps other authplugins.
-        * Consider calling addNewUserLogEntry() directly instead.
-        *
-        * @return bool
-        */
-       public function addNewUserLogEntryAutoCreate() {
-               $this->addNewUserLogEntry( 'autocreate' );
-
-               return true;
-       }
-
-       /**
-        * Load the user options either from cache, the database or an array
-        *
-        * @param array $data Rows for the current user out of the user_properties table
-        */
-       protected function loadOptions( $data = null ) {
-               global $wgContLang;
-
-               $this->load();
-
-               if ( $this->mOptionsLoaded ) {
-                       return;
-               }
-
-               $this->mOptions = self::getDefaultOptions();
-
-               if ( !$this->getId() ) {
-                       // For unlogged-in users, load language/variant options from request.
-                       // There's no need to do it for logged-in users: they can set preferences,
-                       // and handling of page content is done by $pageLang->getPreferredVariant() and such,
-                       // so don't override user's choice (especially when the user chooses site default).
-                       $variant = $wgContLang->getDefaultVariant();
-                       $this->mOptions['variant'] = $variant;
-                       $this->mOptions['language'] = $variant;
-                       $this->mOptionsLoaded = true;
-                       return;
-               }
-
-               // Maybe load from the object
-               if ( !is_null( $this->mOptionOverrides ) ) {
-                       wfDebug( "User: loading options for user " . $this->getId() . " from override cache.\n" );
-                       foreach ( $this->mOptionOverrides as $key => $value ) {
-                               $this->mOptions[$key] = $value;
-                       }
-               } else {
-                       if ( !is_array( $data ) ) {
-                               wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
-                               // Load from database
-                               $dbr = ( $this->queryFlagsUsed & self::READ_LATEST )
-                                       ? wfGetDB( DB_MASTER )
-                                       : wfGetDB( DB_SLAVE );
-
-                               $res = $dbr->select(
-                                       'user_properties',
-                                       array( 'up_property', 'up_value' ),
-                                       array( 'up_user' => $this->getId() ),
-                                       __METHOD__
-                               );
-
-                               $this->mOptionOverrides = array();
-                               $data = array();
-                               foreach ( $res as $row ) {
-                                       $data[$row->up_property] = $row->up_value;
-                               }
-                       }
-                       foreach ( $data as $property => $value ) {
-                               $this->mOptionOverrides[$property] = $value;
-                               $this->mOptions[$property] = $value;
-                       }
-               }
-
-               $this->mOptionsLoaded = true;
-
-               Hooks::run( 'UserLoadOptions', array( $this, &$this->mOptions ) );
-       }
-
-       /**
-        * Saves the non-default options for this user, as previously set e.g. via
-        * setOption(), in the database's "user_properties" (preferences) table.
-        * Usually used via saveSettings().
-        */
-       protected function saveOptions() {
-               $this->loadOptions();
-
-               // Not using getOptions(), to keep hidden preferences in database
-               $saveOptions = $this->mOptions;
-
-               // Allow hooks to abort, for instance to save to a global profile.
-               // Reset options to default state before saving.
-               if ( !Hooks::run( 'UserSaveOptions', array( $this, &$saveOptions ) ) ) {
-                       return;
-               }
-
-               $userId = $this->getId();
-
-               $insert_rows = array(); // all the new preference rows
-               foreach ( $saveOptions as $key => $value ) {
-                       // Don't bother storing default values
-                       $defaultOption = self::getDefaultOption( $key );
-                       if ( ( $defaultOption === null && $value !== false && $value !== null )
-                               || $value != $defaultOption
-                       ) {
-                               $insert_rows[] = array(
-                                       'up_user' => $userId,
-                                       'up_property' => $key,
-                                       'up_value' => $value,
-                               );
-                       }
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $res = $dbw->select( 'user_properties',
-                       array( 'up_property', 'up_value' ), array( 'up_user' => $userId ), __METHOD__ );
-
-               // Find prior rows that need to be removed or updated. These rows will
-               // all be deleted (the later so that INSERT IGNORE applies the new values).
-               $keysDelete = array();
-               foreach ( $res as $row ) {
-                       if ( !isset( $saveOptions[$row->up_property] )
-                               || strcmp( $saveOptions[$row->up_property], $row->up_value ) != 0
-                       ) {
-                               $keysDelete[] = $row->up_property;
-                       }
-               }
-
-               if ( count( $keysDelete ) ) {
-                       // Do the DELETE by PRIMARY KEY for prior rows.
-                       // In the past a very large portion of calls to this function are for setting
-                       // 'rememberpassword' for new accounts (a preference that has since been removed).
-                       // Doing a blanket per-user DELETE for new accounts with no rows in the table
-                       // caused gap locks on [max user ID,+infinity) which caused high contention since
-                       // updates would pile up on each other as they are for higher (newer) user IDs.
-                       // It might not be necessary these days, but it shouldn't hurt either.
-                       $dbw->delete( 'user_properties',
-                               array( 'up_user' => $userId, 'up_property' => $keysDelete ), __METHOD__ );
-               }
-               // Insert the new preference rows
-               $dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
-       }
-
-       /**
-        * Lazily instantiate and return a factory object for making passwords
-        *
-        * @deprecated since 1.27, create a PasswordFactory directly instead
-        * @return PasswordFactory
-        */
-       public static function getPasswordFactory() {
-               wfDeprecated( __METHOD__, '1.27' );
-               $ret = new PasswordFactory();
-               $ret->init( RequestContext::getMain()->getConfig() );
-               return $ret;
-       }
-
-       /**
-        * Provide an array of HTML5 attributes to put on an input element
-        * intended for the user to enter a new password.  This may include
-        * required, title, and/or pattern, depending on $wgMinimalPasswordLength.
-        *
-        * Do *not* use this when asking the user to enter his current password!
-        * Regardless of configuration, users may have invalid passwords for whatever
-        * reason (e.g., they were set before requirements were tightened up).
-        * Only use it when asking for a new password, like on account creation or
-        * ResetPass.
-        *
-        * Obviously, you still need to do server-side checking.
-        *
-        * NOTE: A combination of bugs in various browsers means that this function
-        * actually just returns array() unconditionally at the moment.  May as
-        * well keep it around for when the browser bugs get fixed, though.
-        *
-        * @todo FIXME: This does not belong here; put it in Html or Linker or somewhere
-        *
-        * @deprecated since 1.27
-        * @return array Array of HTML attributes suitable for feeding to
-        *   Html::element(), directly or indirectly.  (Don't feed to Xml::*()!
-        *   That will get confused by the boolean attribute syntax used.)
-        */
-       public static function passwordChangeInputAttribs() {
-               global $wgMinimalPasswordLength;
-
-               if ( $wgMinimalPasswordLength == 0 ) {
-                       return array();
-               }
-
-               # Note that the pattern requirement will always be satisfied if the
-               # input is empty, so we need required in all cases.
-
-               # @todo FIXME: Bug 23769: This needs to not claim the password is required
-               # if e-mail confirmation is being used.  Since HTML5 input validation
-               # is b0rked anyway in some browsers, just return nothing.  When it's
-               # re-enabled, fix this code to not output required for e-mail
-               # registration.
-               # $ret = array( 'required' );
-               $ret = array();
-
-               # We can't actually do this right now, because Opera 9.6 will print out
-               # the entered password visibly in its error message!  When other
-               # browsers add support for this attribute, or Opera fixes its support,
-               # we can add support with a version check to avoid doing this on Opera
-               # versions where it will be a problem.  Reported to Opera as
-               # DSK-262266, but they don't have a public bug tracker for us to follow.
-               /*
-               if ( $wgMinimalPasswordLength > 1 ) {
-                       $ret['pattern'] = '.{' . intval( $wgMinimalPasswordLength ) . ',}';
-                       $ret['title'] = wfMessage( 'passwordtooshort' )
-                               ->numParams( $wgMinimalPasswordLength )->text();
-               }
-               */
-
-               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_email',
-                       'user_touched',
-                       'user_token',
-                       'user_email_authenticated',
-                       'user_email_token',
-                       'user_email_token_expires',
-                       'user_registration',
-                       'user_editcount',
-               );
-       }
-
-       /**
-        * Factory function for fatal permission-denied errors
-        *
-        * @since 1.22
-        * @param string $permission User right required
-        * @return Status
-        */
-       static function newFatalPermissionDeniedStatus( $permission ) {
-               global $wgLang;
-
-               $groups = array_map(
-                       array( 'User', 'makeGroupLinkWiki' ),
-                       User::getGroupsWithPermission( $permission )
-               );
-
-               if ( $groups ) {
-                       return Status::newFatal( 'badaccess-groups', $wgLang->commaList( $groups ), count( $groups ) );
-               } else {
-                       return Status::newFatal( 'badaccess-group0' );
-               }
-       }
-
-       /**
-        * Checks if two user objects point to the same user.
-        *
-        * @since 1.25
-        * @param User $user
-        * @return bool
-        */
-       public function equals( User $user ) {
-               return $this->getName() === $user->getName();
-       }
-}
diff --git a/includes/UserArray.php b/includes/UserArray.php
deleted file mode 100644 (file)
index 31bd601..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * Class 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 {
-       /**
-        * @param ResultWrapper $res
-        * @return UserArrayFromResult
-        */
-       static function newFromResult( $res ) {
-               $userArray = null;
-               if ( !Hooks::run( 'UserArrayFromResult', array( &$userArray, $res ) ) ) {
-                       return null;
-               }
-               if ( $userArray === null ) {
-                       $userArray = self::newFromResult_internal( $res );
-               }
-               return $userArray;
-       }
-
-       /**
-        * @param array $ids
-        * @return UserArrayFromResult
-        */
-       static function newFromIDs( $ids ) {
-               $ids = array_map( 'intval', (array)$ids ); // paranoia
-               if ( !$ids ) {
-                       // Database::select() doesn't like empty arrays
-                       return new ArrayIterator( array() );
-               }
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select(
-                       'user',
-                       User::selectFields(),
-                       array( 'user_id' => array_unique( $ids ) ),
-                       __METHOD__
-               );
-               return self::newFromResult( $res );
-       }
-
-       /**
-        * @since 1.25
-        * @param array $names
-        * @return UserArrayFromResult
-        */
-       static function newFromNames( $names ) {
-               $names = array_map( 'strval', (array)$names ); // paranoia
-               if ( !$names ) {
-                       // Database::select() doesn't like empty arrays
-                       return new ArrayIterator( array() );
-               }
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select(
-                       'user',
-                       User::selectFields(),
-                       array( 'user_name' => array_unique( $names ) ),
-                       __METHOD__
-               );
-               return self::newFromResult( $res );
-       }
-
-       /**
-        * @param ResultWrapper $res
-        * @return UserArrayFromResult
-        */
-       protected static function newFromResult_internal( $res ) {
-               return new UserArrayFromResult( $res );
-       }
-}
diff --git a/includes/UserArrayFromResult.php b/includes/UserArrayFromResult.php
deleted file mode 100644 (file)
index fb533d0..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-/**
- * Class 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
- */
-
-class UserArrayFromResult extends UserArray implements Countable {
-       /** @var ResultWrapper */
-       public $res;
-
-       /** @var int */
-       public $key;
-
-       /** @var bool|stdClass */
-       public $current;
-
-       /**
-        * @param ResultWrapper $res
-        */
-       function __construct( $res ) {
-               $this->res = $res;
-               $this->key = 0;
-               $this->setCurrent( $this->res->current() );
-       }
-
-       /**
-        * @param bool|stdClass $row
-        * @return void
-        */
-       protected function setCurrent( $row ) {
-               if ( $row === false ) {
-                       $this->current = false;
-               } else {
-                       $this->current = User::newFromRow( $row );
-               }
-       }
-
-       /**
-        * @return int
-        */
-       public function count() {
-               return $this->res->numRows();
-       }
-
-       /**
-        * @return User
-        */
-       function current() {
-               return $this->current;
-       }
-
-       function key() {
-               return $this->key;
-       }
-
-       function next() {
-               $row = $this->res->next();
-               $this->setCurrent( $row );
-               $this->key++;
-       }
-
-       function rewind() {
-               $this->res->rewind();
-               $this->key = 0;
-               $this->setCurrent( $this->res->current() );
-       }
-
-       /**
-        * @return bool
-        */
-       function valid() {
-               return $this->current !== false;
-       }
-}
diff --git a/includes/UserRightsProxy.php b/includes/UserRightsProxy.php
deleted file mode 100644 (file)
index 3a3eb53..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-<?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
- * user rights manipulation.
- */
-class UserRightsProxy {
-
-       /**
-        * Constructor.
-        *
-        * @see newFromId()
-        * @see newFromName()
-        * @param IDatabase $db Db connection
-        * @param string $database Database name
-        * @param string $name User name
-        * @param int $id User ID
-        */
-       private function __construct( $db, $database, $name, $id ) {
-               $this->db = $db;
-               $this->database = $database;
-               $this->name = $name;
-               $this->id = intval( $id );
-               $this->newOptions = array();
-       }
-
-       /**
-        * Accessor for $this->database
-        *
-        * @return string Database name
-        */
-       public function getDBName() {
-               return $this->database;
-       }
-
-       /**
-        * Confirm the selected database name is a valid local interwiki database name.
-        *
-        * @param string $database Database name
-        * @return bool
-        */
-       public static function validDatabase( $database ) {
-               global $wgLocalDatabases;
-               return in_array( $database, $wgLocalDatabases );
-       }
-
-       /**
-        * Same as User::whoIs()
-        *
-        * @param string $database Database name
-        * @param int $id User ID
-        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
-        * @return string User name or false if the user doesn't exist
-        */
-       public static function whoIs( $database, $id, $ignoreInvalidDB = false ) {
-               $user = self::newFromId( $database, $id, $ignoreInvalidDB );
-               if ( $user ) {
-                       return $user->name;
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * Factory function; get a remote user entry by ID number.
-        *
-        * @param string $database Database name
-        * @param int $id User ID
-        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
-        * @return UserRightsProxy|null If doesn't exist
-        */
-       public static function newFromId( $database, $id, $ignoreInvalidDB = false ) {
-               return self::newFromLookup( $database, 'user_id', intval( $id ), $ignoreInvalidDB );
-       }
-
-       /**
-        * Factory function; get a remote user entry by name.
-        *
-        * @param string $database Database name
-        * @param string $name User name
-        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
-        * @return UserRightsProxy|null If doesn't exist
-        */
-       public static function newFromName( $database, $name, $ignoreInvalidDB = false ) {
-               return self::newFromLookup( $database, 'user_name', $name, $ignoreInvalidDB );
-       }
-
-       /**
-        * @param string $database
-        * @param string $field
-        * @param string $value
-        * @param bool $ignoreInvalidDB
-        * @return null|UserRightsProxy
-        */
-       private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
-               global $wgSharedDB, $wgSharedTables;
-               // If the user table is shared, perform the user query on it,
-               // but don't pass it to the UserRightsProxy,
-               // as user rights are normally not shared.
-               if ( $wgSharedDB && in_array( 'user', $wgSharedTables ) ) {
-                       $userdb = self::getDB( $wgSharedDB, $ignoreInvalidDB );
-               } else {
-                       $userdb = self::getDB( $database, $ignoreInvalidDB );
-               }
-
-               $db = self::getDB( $database, $ignoreInvalidDB );
-
-               if ( $db && $userdb ) {
-                       $row = $userdb->selectRow( 'user',
-                               array( 'user_id', 'user_name' ),
-                               array( $field => $value ),
-                               __METHOD__ );
-
-                       if ( $row !== false ) {
-                               return new UserRightsProxy( $db, $database,
-                                       $row->user_name,
-                                       intval( $row->user_id ) );
-                       }
-               }
-               return null;
-       }
-
-       /**
-        * Open a database connection to work on for the requested user.
-        * This may be a new connection to another database for remote users.
-        *
-        * @param string $database
-        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
-        * @return IDatabase|null If invalid selection
-        */
-       public static function getDB( $database, $ignoreInvalidDB = false ) {
-               global $wgDBname;
-               if ( $ignoreInvalidDB || self::validDatabase( $database ) ) {
-                       if ( $database == $wgDBname ) {
-                               // Hmm... this shouldn't happen though. :)
-                               return wfGetDB( DB_MASTER );
-                       } else {
-                               return wfGetDB( DB_MASTER, array(), $database );
-                       }
-               }
-               return null;
-       }
-
-       /**
-        * @return int
-        */
-       public function getId() {
-               return $this->id;
-       }
-
-       /**
-        * @return bool
-        */
-       public function isAnon() {
-               return $this->getId() == 0;
-       }
-
-       /**
-        * Same as User::getName()
-        *
-        * @return string
-        */
-       public function getName() {
-               return $this->name . '@' . $this->database;
-       }
-
-       /**
-        * Same as User::getUserPage()
-        *
-        * @return Title
-        */
-       public function getUserPage() {
-               return Title::makeTitle( NS_USER, $this->getName() );
-       }
-
-       /**
-        * Replaces User::getUserGroups()
-        * @return array
-        */
-       function getGroups() {
-               $res = $this->db->select( 'user_groups',
-                       array( 'ug_group' ),
-                       array( 'ug_user' => $this->id ),
-                       __METHOD__ );
-               $groups = array();
-               foreach ( $res as $row ) {
-                       $groups[] = $row->ug_group;
-               }
-               return $groups;
-       }
-
-       /**
-        * Replaces User::addUserGroup()
-        * @param string $group
-        *
-        * @return bool
-        */
-       function addGroup( $group ) {
-               $this->db->insert( 'user_groups',
-                       array(
-                               'ug_user' => $this->id,
-                               'ug_group' => $group,
-                       ),
-                       __METHOD__,
-                       array( 'IGNORE' ) );
-
-               return true;
-       }
-
-       /**
-        * Replaces User::removeUserGroup()
-        * @param string $group
-        *
-        * @return bool
-        */
-       function removeGroup( $group ) {
-               $this->db->delete( 'user_groups',
-                       array(
-                               'ug_user' => $this->id,
-                               'ug_group' => $group,
-                       ),
-                       __METHOD__ );
-
-               return true;
-       }
-
-       /**
-        * Replaces User::setOption()
-        * @param string $option
-        * @param mixed $value
-        */
-       public function setOption( $option, $value ) {
-               $this->newOptions[$option] = $value;
-       }
-
-       public function saveSettings() {
-               $rows = array();
-               foreach ( $this->newOptions as $option => $value ) {
-                       $rows[] = array(
-                               'up_user' => $this->id,
-                               'up_property' => $option,
-                               'up_value' => $value,
-                       );
-               }
-               $this->db->replace( 'user_properties',
-                       array( array( 'up_user', 'up_property' ) ),
-                       $rows, __METHOD__
-               );
-               $this->invalidateCache();
-       }
-
-       /**
-        * Replaces User::touchUser()
-        */
-       function invalidateCache() {
-               $this->db->update( 'user',
-                       array( 'user_touched' => $this->db->timestamp() ),
-                       array( 'user_id' => $this->id ),
-                       __METHOD__ );
-
-               $key = wfForeignMemcKey( $this->database, false, 'user', 'id', $this->id );
-               $this->db->onTransactionPreCommitOrIdle( function() use ( $key ) {
-                       ObjectCache::getMainWANInstance()->delete( $key );
-               } );
-       }
-}
index adee126..0ef2373 100644 (file)
@@ -290,7 +290,7 @@ class WatchedItem {
                } else {
                        $dbw = wfGetDB( DB_MASTER );
                        $dbw->update( 'watchlist',
-                               array( 'wl_notificationtimestamp' => $notificationTimestamp ),
+                               array( 'wl_notificationtimestamp' => $dbw->timestampOrNull( $notificationTimestamp ) ),
                                $this->dbCond(),
                                __METHOD__
                        );
index e743d9d..c99b0e3 100644 (file)
@@ -127,7 +127,12 @@ class WebRequestUpload {
                }
 
                $contentLength = $this->request->getHeader( 'CONTENT_LENGTH' );
-               if ( $contentLength > wfShorthandToInteger( ini_get( 'post_max_size' ) ) ) {
+               $maxPostSize = wfShorthandToInteger(
+                       ini_get( 'post_max_size' ) ?: ini_get( 'hhvm.server.max_post_size' ),
+                       0
+               );
+
+               if ( $maxPostSize && $contentLength > $maxPostSize ) {
                        # post_max_size is exceeded
                        return true;
                }
index bb7682d..26fb20f 100644 (file)
@@ -136,6 +136,19 @@ class WebResponse {
                                $options['httpOnly'] );
                }
        }
+
+       /**
+        * Unset a browser cookie.
+        * This sets the cookie with an empty value and an expiry set to a time in the past,
+        * which will cause the browser to remove any cookie with the given name, domain and
+        * path from its cookie store. Options other than these (and prefix) have no effect.
+        * @param string $name Cookie name
+        * @param array $options Cookie options, see {@link setCookie()}
+        * @since 1.27
+        */
+       public function clearCookie( $name, $options = array() ) {
+               $this->setCookie( $name, '', time() - 31536000 /* 1 year */, $options );
+       }
 }
 
 /**
index b095577..c5e7457 100644 (file)
@@ -103,6 +103,24 @@ if ( is_readable( "$IP/vendor/autoload.php" ) ) {
        require_once "$IP/vendor/autoload.php";
 }
 
+# Assert that composer dependencies were successfully loaded
+# Purposely no leading \ due to it breaking HHVM RepoAuthorative mode
+# PHP works fine with both versions
+# See https://github.com/facebook/hhvm/issues/5833
+if ( !interface_exists( 'Psr\Log\LoggerInterface' ) ) {
+       $message = (
+               'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
+               "library</a> to be present. This library is not embedded directly in MediaWiki's " .
+               "git repository and must be installed separately by the end user.\n\n" .
+               'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
+               '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
+               'the required components.'
+       );
+       echo $message;
+       trigger_error( $message, E_USER_ERROR );
+       die( 1 );
+}
+
 if ( defined( 'MW_CONFIG_CALLBACK' ) ) {
        # Use a callback function to configure MediaWiki
        call_user_func( MW_CONFIG_CALLBACK );
@@ -141,3 +159,25 @@ if ( !defined( 'MW_NO_SETUP' ) ) {
 if ( isset( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) {
        ignore_user_abort( true );
 }
+
+if ( !defined( 'MW_API' ) &&
+       RequestContext::getMain()->getRequest()->getHeader( 'Promise-Non-Write-API-Action' )
+) {
+       header( 'Cache-Control: no-cache' );
+       header( 'Content-Type: text/html; charset=utf-8' );
+       HttpStatus::header( 400 );
+       $error = wfMessage( 'nonwrite-api-promise-error' )->escaped();
+       $content = <<<EOT
+<!DOCTYPE html>
+<html>
+<head><meta charset="UTF-8" /></head>
+<body>
+$error
+</body>
+</html>
+
+EOT;
+       header( 'Content-Length: ' . strlen( $content ) );
+       echo $content;
+       die();
+}
index 78f4764..9d37b95 100644 (file)
  */
 
 /**
- * Class for generating HTML <select> elements.
+ * Class for generating HTML <select> or <datalist> elements.
  */
 class XmlSelect {
        protected $options = array();
        protected $default = false;
+       protected $tagName = 'select';
        protected $attributes = array();
 
        public function __construct( $name = false, $id = false, $default = false ) {
@@ -49,6 +50,13 @@ class XmlSelect {
                $this->default = $default;
        }
 
+       /**
+        * @param string|array $tagName
+        */
+       public function setTagName( $tagName ) {
+               $this->tagName = $tagName;
+       }
+
        /**
         * @param string $name
         * @param string $value
@@ -127,6 +135,6 @@ class XmlSelect {
                        $contents .= self::formatOptions( $options, $this->default );
                }
 
-               return Html::rawElement( 'select', $this->attributes, rtrim( $contents ) );
+               return Html::rawElement( $this->tagName, $this->attributes, rtrim( $contents ) );
        }
 }
index a81adf9..ca47fce 100644 (file)
@@ -192,7 +192,7 @@ class HistoryAction extends FormlessAction {
                        ( $tagSelector ? ( implode( '&#160;', $tagSelector ) . '&#160;' ) : '' ) .
                        $checkDeleted .
                        Html::submitButton(
-                               $this->msg( 'allpagessubmit' )->text(),
+                               $this->msg( 'historyaction-submit' )->text(),
                                array(),
                                array( 'mw-ui-progressive' )
                        ) . "\n" .
@@ -735,7 +735,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        }
                }
                // Allow extension to add their own links here
-               Hooks::run( 'HistoryRevisionTools', array( $rev, &$tools ) );
+               Hooks::run( 'HistoryRevisionTools', array( $rev, &$tools, $prevRev, $user ) );
 
                if ( $tools ) {
                        $s2 .= ' ' . $this->msg( 'parentheses' )->rawParams( $lang->pipeList( $tools ) )->escaped();
index b71b0e9..6de95a0 100644 (file)
@@ -80,12 +80,12 @@ class RawAction extends FormlessAction {
                        if ( $this->gen ) {
                                $smaxage = $config->get( 'SquidMaxage' );
                        } elseif ( $contentType == 'text/css' || $contentType == 'text/javascript' ) {
-                               // CSS/JS raw content has its own squid max age configuration.
-                               // Note: Title::getSquidURLs() includes action=raw for css/js pages,
+                               // CSS/JS raw content has its own CDN max age configuration.
+                               // Note: Title::getCdnUrls() includes action=raw for css/js pages,
                                // so if using the canonical url, this will get HTCP purges.
                                $smaxage = intval( $config->get( 'ForcedRawSMaxage' ) );
                        } else {
-                               // No squid cache for anything else
+                               // No CDN cache for anything else
                                $smaxage = 0;
                        }
                }
index 1465543..8a98197 100644 (file)
  * @ingroup API
  */
 abstract class ApiBase extends ContextSource {
-       // These constants allow modules to specify exactly how to treat incoming parameters.
 
-       // Default value of the parameter
+       /**
+        * @name Constants for ::getAllowedParams() arrays
+        * These constants are keys in the arrays returned by ::getAllowedParams()
+        * and accepted by ::getParameterFromSettings() that define how the
+        * parameters coming in from the request are to be interpreted.
+        * @{
+        */
+
+       /** (null|boolean|integer|string) Default value of the parameter. */
        const PARAM_DFLT = 0;
-       // Boolean, do we accept more than one item for this parameter (e.g.: titles)?
+
+       /** (boolean) Accept multiple pipe-separated values for this parameter (e.g. titles)? */
        const PARAM_ISMULTI = 1;
-       // Can be either a string type (e.g.: 'integer') or an array of allowed values
+
+       /**
+        * (string|string[]) Either an array of allowed value strings, or a string
+        * type as described below. If not specified, will be determined from the
+        * type of PARAM_DFLT.
+        *
+        * Supported string types are:
+        * - boolean: A boolean parameter, returned as false if the parameter is
+        *   omitted and true if present (even with a falsey value, i.e. it works
+        *   like HTML checkboxes). PARAM_DFLT must be boolean false, if specified.
+        *   Cannot be used with PARAM_ISMULTI.
+        * - integer: An integer value. See also PARAM_MIN, PARAM_MAX, and
+        *   PARAM_RANGE_ENFORCE.
+        * - limit: An integer or the string 'max'. Default lower limit is 0 (but
+        *   see PARAM_MIN), and requires that PARAM_MAX and PARAM_MAX2 be
+        *   specified. Cannot be used with PARAM_ISMULTI.
+        * - namespace: An integer representing a MediaWiki namespace.
+        * - NULL: Any string.
+        * - password: Any non-empty string. Input value is private or sensitive.
+        *   <input type="password"> would be an appropriate HTML form field.
+        * - string: Any non-empty string, not expected to be very long or contain newlines.
+        *   <input type="text"> would be an appropriate HTML form field.
+        * - submodule: The name of a submodule of this module, see PARAM_SUBMODULE_MAP.
+        * - text: Any non-empty string, expected to be very long or contain newlines.
+        *   <textarea> would be an appropriate HTML form field.
+        * - timestamp: A timestamp in any format recognized by MWTimestamp, or the
+        *   string 'now' representing the current timestamp. Will be returned in
+        *   TS_MW format.
+        * - user: A MediaWiki username. Will be returned normalized but not canonicalized.
+        * - upload: An uploaded file. Will be returned as a WebRequestUpload object.
+        *   Cannot be used with PARAM_ISMULTI.
+        */
        const PARAM_TYPE = 2;
-       // Max value allowed for a parameter. Only applies if TYPE='integer'
+
+       /** (integer) Max value allowed for the parameter, for PARAM_TYPE 'integer' and 'limit'. */
        const PARAM_MAX = 3;
-       // Max value allowed for a parameter for bots and sysops. Only applies if TYPE='integer'
+
+       /**
+        * (integer) Max value allowed for the parameter for users with the
+        * apihighlimits right, for PARAM_TYPE 'limit'.
+        */
        const PARAM_MAX2 = 4;
-       // Lowest value allowed for a parameter. Only applies if TYPE='integer'
+
+       /** (integer) Lowest value allowed for the parameter, for PARAM_TYPE 'integer' and 'limit'. */
        const PARAM_MIN = 5;
-       // Boolean, do we allow the same value to be set more than once when ISMULTI=true
+
+       /** (boolean) Allow the same value to be set more than once when PARAM_ISMULTI is true? */
        const PARAM_ALLOW_DUPLICATES = 6;
-       // Boolean, is the parameter deprecated (will show a warning)
+
+       /** (boolean) Is the parameter deprecated (will show a warning)? */
        const PARAM_DEPRECATED = 7;
-       /// @since 1.17
-       const PARAM_REQUIRED = 8; // Boolean, is the parameter required?
-       /// @since 1.17
-       // Boolean, if MIN/MAX are set, enforce (die) these?
-       // Only applies if TYPE='integer' Use with extreme caution
+
+       /**
+        * (boolean) Is the parameter required?
+        * @since 1.17
+        */
+       const PARAM_REQUIRED = 8;
+
+       /**
+        * (boolean) For PARAM_TYPE 'integer', enforce PARAM_MIN and PARAM_MAX?
+        * @since 1.17
+        */
        const PARAM_RANGE_ENFORCE = 9;
-       /// @since 1.25
-       // Specify an alternative i18n message for this help parameter.
-       // Value is $msg for ApiBase::makeMessage()
+
+       /**
+        * (string|array|Message) Specify an alternative i18n documentation message
+        * for this parameter. Default is apihelp-{$path}-param-{$param}.
+        * @since 1.25
+        */
        const PARAM_HELP_MSG = 10;
-       /// @since 1.25
-       // Specify additional i18n messages to append to the normal message. Value
-       // is an array of $msg for ApiBase::makeMessage()
+
+       /**
+        * ((string|array|Message)[]) Specify additional i18n messages to append to
+        * the normal message for this parameter.
+        * @since 1.25
+        */
        const PARAM_HELP_MSG_APPEND = 11;
-       /// @since 1.25
-       // Specify additional information tags for the parameter. Value is an array
-       // of arrays, with the first member being the 'tag' for the info and the
-       // remaining members being the values. In the help, this is formatted using
-       // apihelp-{$path}-paraminfo-{$tag}, which is passed $1 = count, $2 =
-       // comma-joined list of values, $3 = module prefix.
+
+       /**
+        * (array) Specify additional information tags for the parameter. Value is
+        * an array of arrays, with the first member being the 'tag' for the info
+        * and the remaining members being the values. In the help, this is
+        * formatted using apihelp-{$path}-paraminfo-{$tag}, which is passed
+        * $1 = count, $2 = comma-joined list of values, $3 = module prefix.
+        * @since 1.25
+        */
        const PARAM_HELP_MSG_INFO = 12;
-       /// @since 1.25
-       // When PARAM_TYPE is an array, this may be an array mapping those values
-       // to page titles which will be linked in the help.
+
+       /**
+        * (string[]) When PARAM_TYPE is an array, this may be an array mapping
+        * those values to page titles which will be linked in the help.
+        * @since 1.25
+        */
        const PARAM_VALUE_LINKS = 13;
-       /// @since 1.25
-       // When PARAM_TYPE is an array, this is an array mapping those values to
-       // $msg for ApiBase::makeMessage(). Any value not having a mapping will use
-       // apihelp-{$path}-paramvalue-{$param}-{$value} is used.
+
+       /**
+        * ((string|array|Message)[]) When PARAM_TYPE is an array, this is an array
+        * mapping those values to $msg for ApiBase::makeMessage(). Any value not
+        * having a mapping will use apihelp-{$path}-paramvalue-{$param}-{$value}.
+        * @since 1.25
+        */
        const PARAM_HELP_MSG_PER_VALUE = 14;
-       /// @since 1.26
-       // When PARAM_TYPE is 'submodule', map parameter values to submodule paths.
-       // Default is to use all modules in $this->getModuleManager() in the group
-       // matching the parameter name.
+
+       /**
+        * (string[]) When PARAM_TYPE is 'submodule', map parameter values to
+        * submodule paths. Default is to use all modules in
+        * $this->getModuleManager() in the group matching the parameter name.
+        * @since 1.26
+        */
        const PARAM_SUBMODULE_MAP = 15;
-       /// @since 1.26
-       // When PARAM_TYPE is 'submodule', used to indicate the 'g' prefix added by
-       // ApiQueryGeneratorBase (and similar if anything else ever does that).
+
+       /**
+        * (string) When PARAM_TYPE is 'submodule', used to indicate the 'g' prefix
+        * added by ApiQueryGeneratorBase (and similar if anything else ever does that).
+        * @since 1.26
+        */
        const PARAM_SUBMODULE_PARAM_PREFIX = 16;
 
-       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
-       const LIMIT_SML2 = 500; // Slow query, bot/sysop limit
+       /**@}*/
+
+       /** Fast query, standard limit. */
+       const LIMIT_BIG1 = 500;
+       /** Fast query, apihighlimits limit. */
+       const LIMIT_BIG2 = 5000;
+       /** Slow query, standard limit. */
+       const LIMIT_SML1 = 50;
+       /** Slow query, apihighlimits limit. */
+       const LIMIT_SML2 = 500;
 
        /**
         * getAllowedParams() flag: When set, the result could take longer to generate,
@@ -986,6 +1066,17 @@ abstract class ApiBase extends ContextSource {
                        // Set a warning if a deprecated parameter has been passed
                        if ( $deprecated && $value !== false ) {
                                $this->setWarning( "The $encParamName parameter has been deprecated." );
+
+                               $feature = $encParamName;
+                               $m = $this;
+                               while ( !$m->isMain() ) {
+                                       $p = $m->getParent();
+                                       $name = $m->getModuleName();
+                                       $param = $p->encodeParamName( $p->getModuleManager()->getModuleGroup( $name ) );
+                                       $feature = "{$param}={$name}&{$feature}";
+                                       $m = $p;
+                               }
+                               $this->logFeatureUsage( $feature );
                        }
                } elseif ( $required ) {
                        $this->dieUsageMsg( array( 'missingparam', $paramName ) );
@@ -1375,10 +1466,11 @@ abstract class ApiBase extends ContextSource {
         *
         * @since 1.23
         * @param Status $status
+        * @param array|null &$extraData Set if extra data from IApiMessage is available (since 1.27)
         * @return array Array of code and error string
         * @throws MWException
         */
-       public function getErrorFromStatus( $status ) {
+       public function getErrorFromStatus( $status, &$extraData = null ) {
                if ( $status->isGood() ) {
                        throw new MWException( 'Successful status passed to ApiBase::dieStatus' );
                }
@@ -1397,7 +1489,12 @@ abstract class ApiBase extends ContextSource {
                // error messages.
                if ( $errors[0] instanceof Message ) {
                        $msg = $errors[0];
-                       $code = $msg->getKey();
+                       if ( $msg instanceof IApiMessage ) {
+                               $extraData = $msg->getApiData();
+                               $code = $msg->getApiCode();
+                       } else {
+                               $code = $msg->getKey();
+                       }
                } else {
                        $code = array_shift( $errors[0] );
                        $msg = wfMessage( $code, $errors[0] );
@@ -1418,8 +1515,9 @@ abstract class ApiBase extends ContextSource {
         * @throws UsageException always
         */
        public function dieStatus( $status ) {
-               list( $code, $msg ) = $this->getErrorFromStatus( $status );
-               $this->dieUsage( $msg, $code );
+               $extraData = null;
+               list( $code, $msg ) = $this->getErrorFromStatus( $status, $extraData );
+               $this->dieUsage( $msg, $code, 0, $extraData );
        }
 
        // @codingStandardsIgnoreStart Allow long lines. Cannot split these.
@@ -1952,7 +2050,8 @@ abstract class ApiBase extends ContextSource {
                        $error = array( $error );
                }
                $parsed = $this->parseMsg( $error );
-               $this->dieUsage( $parsed['info'], $parsed['code'] );
+               $extraData = isset( $parsed['data'] ) ? $parsed['data'] : null;
+               $this->dieUsage( $parsed['info'], $parsed['code'], 0, $extraData );
        }
 
        /**
@@ -2005,6 +2104,14 @@ abstract class ApiBase extends ContextSource {
                        $key = array_shift( $error );
                }
 
+               if ( $key instanceof IApiMessage ) {
+                       return array(
+                               'code' => $key->getApiCode(),
+                               'info' => $key->inLanguage( 'en' )->useDatabase( false )->text(),
+                               'data' => $key->getApiData()
+                       );
+               }
+
                if ( isset( self::$messageMap[$key] ) ) {
                        return array(
                                'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ),
index 354f4e7..74d0352 100644 (file)
@@ -39,6 +39,7 @@ class ApiContinuationManager {
         * @param ApiBase $module Module starting the continuation
         * @param ApiBase[] $allModules Contains ApiBase instances that will be executed
         * @param array $generatedModules Names of modules that depend on the generator
+        * @throws UsageException
         */
        public function __construct(
                ApiBase $module, array $allModules = array(), array $generatedModules = array()
index 00b7de9..1368bda 100644 (file)
@@ -95,7 +95,7 @@ class ApiCreateAccount extends ApiBase {
                Hooks::run( 'AddNewAccountApiForm', array( $this, $loginForm ) );
                $loginForm->load();
 
-               $status = $loginForm->addNewaccountInternal();
+               $status = $loginForm->addNewAccountInternal();
                LoggerFactory::getInstance( 'authmanager' )->info( 'Account creation attempt via API', array(
                        'event' => 'accountcreation',
                        'status' => $status,
index bfd841f..edcee86 100644 (file)
@@ -88,10 +88,8 @@ class ApiDelete extends ApiBase {
 
                // Deprecated parameters
                if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=delete&watch' );
                        $watch = 'watch';
                } elseif ( $params['unwatch'] ) {
-                       $this->logFeatureUsage( 'action=delete&unwatch' );
                        $watch = 'unwatch';
                } else {
                        $watch = $params['watchlist'];
index 2f1c01c..59264e8 100644 (file)
@@ -100,7 +100,10 @@ class ApiEditPage extends ApiBase {
 
                $name = $titleObj->getPrefixedDBkey();
                $model = $contentHandler->getModelID();
-               if ( $contentHandler->supportsDirectApiEditing() === false ) {
+
+               if ( $params['undo'] > 0 ) {
+                       // allow undo via api
+               } elseif ( $contentHandler->supportsDirectApiEditing() === false ) {
                        $this->dieUsage(
                                "Direct editing via API is not supported for content model $model used by $name",
                                'no-direct-editing'
@@ -244,12 +247,12 @@ class ApiEditPage extends ApiBase {
                                $this->dieUsageMsg( array( 'nosuchrevid', $params['undoafter'] ) );
                        }
 
-                       if ( $undoRev->getPage() != $pageObj->getID() ) {
-                               $this->dieUsageMsg( array( 'revwrongpage', $undoRev->getID(),
+                       if ( $undoRev->getPage() != $pageObj->getId() ) {
+                               $this->dieUsageMsg( array( 'revwrongpage', $undoRev->getId(),
                                        $titleObj->getPrefixedText() ) );
                        }
-                       if ( $undoafterRev->getPage() != $pageObj->getID() ) {
-                               $this->dieUsageMsg( array( 'revwrongpage', $undoafterRev->getID(),
+                       if ( $undoafterRev->getPage() != $pageObj->getId() ) {
+                               $this->dieUsageMsg( array( 'revwrongpage', $undoafterRev->getId(),
                                        $titleObj->getPrefixedText() ) );
                        }
 
@@ -268,7 +271,7 @@ class ApiEditPage extends ApiBase {
                        // If no summary was given and we only undid one rev,
                        // use an autosummary
                        if ( is_null( $params['summary'] ) &&
-                               $titleObj->getNextRevisionID( $undoafterRev->getID() ) == $params['undo']
+                               $titleObj->getNextRevisionID( $undoafterRev->getId() ) == $params['undo']
                        ) {
                                $params['summary'] = wfMessage( 'undo-summary' )
                                        ->params( $params['undo'], $undoRev->getUserText() )->inContentLanguage()->text();
@@ -349,10 +352,8 @@ class ApiEditPage extends ApiBase {
 
                // Deprecated parameters
                if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=edit&watch' );
                        $watch = true;
                } elseif ( $params['unwatch'] ) {
-                       $this->logFeatureUsage( 'action=edit&unwatch' );
                        $watch = false;
                }
 
index 6112534..72adaf8 100644 (file)
@@ -80,10 +80,6 @@ class ApiExpandTemplates extends ApiBase {
                $retval = array();
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
-                       if ( !isset( $prop['parsetree'] ) ) {
-                               $this->logFeatureUsage( 'action=expandtemplates&generatexml' );
-                       }
-
                        $wgParser->startExternalParse( $title_obj, $options, Parser::OT_PREPROCESS );
                        $dom = $wgParser->preprocessToDom( $params['text'] );
                        if ( is_callable( array( $dom, 'saveXML' ) ) ) {
@@ -119,7 +115,7 @@ class ApiExpandTemplates extends ApiBase {
                                                foreach ( $categories as $category => $sortkey ) {
                                                        $entry = array();
                                                        $entry['sortkey'] = $sortkey;
-                                                       ApiResult::setContentValue( $entry, 'category', $category );
+                                                       ApiResult::setContentValue( $entry, 'category', (string)$category );
                                                        $categories_result[] = $entry;
                                                }
                                                ApiResult::setIndexedTagName( $categories_result, 'category' );
index 5adde87..5c0a4af 100644 (file)
@@ -26,6 +26,8 @@
  */
 class ApiFeedRecentChanges extends ApiBase {
 
+       private $params;
+
        /**
         * This module uses a custom feed wrapper printer.
         *
index 0ddb3c3..c841d83 100644 (file)
@@ -181,7 +181,7 @@ class ApiFeedWatchlist extends ApiBase {
                        // Probably a formerly-valid title that's now conflicting with an
                        // interwiki prefix or the like.
                        if ( isset( $info['pageid'] ) ) {
-                               $title = Title::newFromId( $info['pageid'] );
+                               $title = Title::newFromID( $info['pageid'] );
                                $curidParam = array( 'curid' => $info['pageid'] );
                        }
                        if ( !$title || $title->isExternal() ) {
@@ -265,6 +265,15 @@ class ApiFeedWatchlist extends ApiBase {
                                if ( !isset( $p[ApiBase::PARAM_HELP_MSG] ) ) {
                                        $p[ApiBase::PARAM_HELP_MSG] = "apihelp-query+watchlist-param-$from";
                                }
+                               if ( isset( $p[ApiBase::PARAM_TYPE] ) && is_array( $p[ApiBase::PARAM_TYPE] ) &&
+                                       isset( $p[ApiBase::PARAM_HELP_MSG_PER_VALUE] )
+                               ) {
+                                       foreach ( $p[ApiBase::PARAM_TYPE] as $v ) {
+                                               if ( !isset( $p[ApiBase::PARAM_HELP_MSG_PER_VALUE][$v] ) ) {
+                                                       $p[ApiBase::PARAM_HELP_MSG_PER_VALUE][$v] = "apihelp-query+watchlist-paramvalue-$from-$v";
+                                               }
+                                       }
+                               }
                                $ret[$to] = $p;
                        }
                } else {
index 3c10518..be68310 100644 (file)
@@ -207,7 +207,7 @@ abstract class ApiFormatBase extends ApiBase {
 
                        // API handles its own clickjacking protection.
                        // Note, that $wgBreakFrames will still override $wgApiFrameOptions for format mode.
-                       $out->allowClickJacking();
+                       $out->allowClickjacking();
                        $out->output();
                } else {
                        // For non-HTML output, clear all errors that might have been
@@ -245,18 +245,6 @@ abstract class ApiFormatBase extends ApiBase {
                return 'https://www.mediawiki.org/wiki/API:Data_formats';
        }
 
-       /**
-        * To avoid code duplication with the deprecation of dbg, txt
-        * and yaml, this method is added to do the necessary work. It should be
-        * removed when those deprecated formats are removed.
-        */
-       protected function markDeprecated() {
-               $fm = $this->getIsHtml() ? 'fm' : '';
-               $name = $this->getModuleName();
-               $this->logFeatureUsage( "format=$name" );
-               $this->setWarning( "format=$name has been deprecated. Please use format=json$fm instead." );
-       }
-
        /************************************************************************//**
         * @name   Deprecated
         * @{
diff --git a/includes/api/ApiFormatDbg.php b/includes/api/ApiFormatDbg.php
deleted file mode 100644 (file)
index 7d359ad..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Oct 22, 2006
- *
- * Copyright © 2008 Roan Kattouw "<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
- */
-
-/**
- * API PHP's var_export() output formatter
- * @deprecated since 1.24
- * @ingroup API
- */
-class ApiFormatDbg extends ApiFormatBase {
-
-       public function getMimeType() {
-               // This looks like it should be text/plain, but IE7 is so
-               // brain-damaged it tries to parse text/plain as HTML if it
-               // contains HTML tags. Using MIME text/text works around this bug
-               return 'text/text';
-       }
-
-       public function execute() {
-               $this->markDeprecated();
-               $data = $this->getResult()->getResultData( null, array(
-                       'BC' => array(),
-                       'Types' => array(),
-                       'Strip' => 'all',
-               ) );
-               $this->printText( var_export( $data, true ) );
-       }
-
-       public function isDeprecated() {
-               return true;
-       }
-}
index 9dbd4a5..b1a9c98 100644 (file)
@@ -36,7 +36,7 @@ class ApiFormatRaw extends ApiFormatBase {
 
        /**
         * @param ApiMain $main
-        * @param ApiFormatBase |null $errorFallback Object to fall back on for errors
+        * @param ApiFormatBase|null $errorFallback Object to fall back on for errors
         */
        public function __construct( ApiMain $main, ApiFormatBase $errorFallback = null ) {
                parent::__construct( $main, 'raw' );
diff --git a/includes/api/ApiFormatTxt.php b/includes/api/ApiFormatTxt.php
deleted file mode 100644 (file)
index e739d5a..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Oct 22, 2006
- *
- * Copyright © 2008 Roan Kattouw "<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
- */
-
-/**
- * API Text output formatter
- * @deprecated since 1.24
- * @ingroup API
- */
-class ApiFormatTxt extends ApiFormatBase {
-
-       public function getMimeType() {
-               // This looks like it should be text/plain, but IE7 is so
-               // brain-damaged it tries to parse text/plain as HTML if it
-               // contains HTML tags. Using MIME text/text works around this bug
-               return 'text/text';
-       }
-
-       public function execute() {
-               $this->markDeprecated();
-               $data = $this->getResult()->getResultData( null, array(
-                       'BC' => array(),
-                       'Types' => array(),
-                       'Strip' => 'all',
-               ) );
-               $this->printText( print_r( $data, true ) );
-       }
-
-       public function isDeprecated() {
-               return true;
-       }
-}
diff --git a/includes/api/ApiFormatYaml.php b/includes/api/ApiFormatYaml.php
deleted file mode 100644 (file)
index c9089a7..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- *
- *
- * Created on Sep 19, 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
- */
-
-/**
- * API YAML output formatter
- * @deprecated since 1.24
- * @ingroup API
- */
-class ApiFormatYaml extends ApiFormatJson {
-
-       public function getMimeType() {
-               return 'application/yaml';
-       }
-
-       public function execute() {
-               $this->markDeprecated();
-               parent::execute();
-       }
-
-       public function isDeprecated() {
-               return true;
-       }
-}
index c33b27b..b1942bc 100644 (file)
@@ -180,7 +180,7 @@ class ApiHelp extends ApiBase {
                                        $href = $m[2] === '' ? '#' . $m[1] : $m[2];
                                } elseif ( $helptitle !== null ) {
                                        $href = Title::newFromText( str_replace( '$1', $m[1], $helptitle ) . $m[2] )
-                                               ->getFullUrl();
+                                               ->getFullURL();
                                } else {
                                        $href = wfAppendQuery( wfScript( 'api' ), array(
                                                'action' => 'help',
@@ -310,6 +310,7 @@ class ApiHelp extends ApiBase {
                                );
                        }
 
+                       $flags = $module->getHelpFlags();
                        $help['flags'] .= Html::openElement( 'div',
                                array( 'class' => 'apihelp-block apihelp-flags' ) );
                        $msg = $context->msg( 'api-help-flags' );
@@ -319,7 +320,7 @@ class ApiHelp extends ApiBase {
                                );
                        }
                        $help['flags'] .= Html::openElement( 'ul' );
-                       foreach ( $module->getHelpFlags() as $flag ) {
+                       foreach ( $flags as $flag ) {
                                $help['flags'] .= Html::rawElement( 'li', null,
                                        self::wrap( $context->msg( "api-help-flag-$flag" ), "apihelp-flag-$flag" )
                                );
@@ -710,7 +711,6 @@ class ApiHelp extends ApiBase {
                                        $suboptions,
                                        $haveModules
                                );
-                               $numSubmodules = count( $submodules );
                        }
 
                        $module->modifyHelp( $help, $suboptions, $haveModules );
@@ -759,6 +759,8 @@ class ApiHelp extends ApiBase {
                return array(
                        'action=help'
                                => 'apihelp-help-example-main',
+                       'action=help&modules=query&submodules=1'
+                               => 'apihelp-help-example-submodules',
                        'action=help&recursivesubmodules=1'
                                => 'apihelp-help-example-recursive',
                        'action=help&modules=help'
index c66e215..eb376d3 100644 (file)
@@ -99,6 +99,12 @@ class ApiLogin extends ApiBase {
                                $result['result'] = 'Success';
                                $result['lguserid'] = intval( $user->getId() );
                                $result['lgusername'] = $user->getName();
+
+                               // @todo: These are deprecated, and should be removed at some
+                               // point (1.28 at the earliest, and see T121527). They were ok
+                               // when the core cookie-based login was the only thing, but
+                               // CentralAuth broke that a while back and
+                               // SessionManager/AuthManager are *really* going to break it.
                                $result['lgtoken'] = $user->getToken();
                                $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
                                $result['sessionid'] = session_id();
@@ -107,6 +113,8 @@ class ApiLogin extends ApiBase {
                        case LoginForm::NEED_TOKEN:
                                $result['result'] = 'NeedToken';
                                $result['token'] = $loginForm->getLoginToken();
+
+                               // @todo: See above about deprecation
                                $result['cookieprefix'] = $this->getConfig()->get( 'CookiePrefix' );
                                $result['sessionid'] = session_id();
                                break;
index c641c95..49b9786 100644 (file)
@@ -102,13 +102,7 @@ class ApiMain extends ApiBase {
                'phpfm' => 'ApiFormatPhp',
                'xml' => 'ApiFormatXml',
                'xmlfm' => 'ApiFormatXml',
-               'yaml' => 'ApiFormatYaml',
-               'yamlfm' => 'ApiFormatYaml',
                'rawfm' => 'ApiFormatJson',
-               'txt' => 'ApiFormatTxt',
-               'txtfm' => 'ApiFormatTxt',
-               'dbg' => 'ApiFormatDbg',
-               'dbgfm' => 'ApiFormatDbg',
                'none' => 'ApiFormatNone',
        );
 
@@ -440,6 +434,9 @@ class ApiMain extends ApiBase {
                // Log the request whether or not there was an error
                $this->logRequest( microtime( true ) - $t );
 
+               // Commit DBs and send any related cookies and headers
+               MediaWiki::preOutputCommit( $this->getContext() );
+
                // Send cache headers after any code which might generate an error, to
                // avoid sending public cache headers for errors.
                $this->sendCacheHeaders( $isError );
@@ -895,7 +892,7 @@ class ApiMain extends ApiBase {
                }
                if ( $config->get( 'ShowHostnames' ) ) {
                        // servedby is especially useful when debugging errors
-                       $result->addValue( null, 'servedby', wfHostName(), ApiResult::NO_SIZE_CHECK );
+                       $result->addValue( null, 'servedby', wfHostname(), ApiResult::NO_SIZE_CHECK );
                }
                if ( $warnings !== null ) {
                        $result->addValue( null, 'warnings', $warnings, ApiResult::NO_SIZE_CHECK );
@@ -1002,7 +999,6 @@ class ApiMain extends ApiBase {
         */
        protected function checkMaxLag( $module, $params ) {
                if ( $module->shouldCheckMaxlag() && isset( $params['maxlag'] ) ) {
-                       // Check for maxlag
                        $maxLag = $params['maxlag'];
                        list( $host, $lag ) = wfGetLB()->getMaxLag();
                        if ( $lag > $maxLag ) {
@@ -1148,16 +1144,20 @@ class ApiMain extends ApiBase {
                ) {
                        $this->dieUsageMsg( 'readrequired' );
                }
+
                if ( $module->isWriteMode() ) {
                        if ( !$this->mEnableWrite ) {
                                $this->dieUsageMsg( 'writedisabled' );
-                       }
-                       if ( !$user->isAllowed( 'writeapi' ) ) {
+                       } elseif ( !$user->isAllowed( 'writeapi' ) ) {
                                $this->dieUsageMsg( 'writerequired' );
+                       } elseif ( $this->getRequest()->getHeader( 'Promise-Non-Write-API-Action' ) ) {
+                               $this->dieUsage(
+                                       "Promise-Non-Write-API-Action HTTP header cannot be sent to write API modules",
+                                       'promised-nonwrite-api'
+                               );
                        }
-                       if ( wfReadOnly() ) {
-                               $this->dieReadOnly();
-                       }
+
+                       $this->checkReadOnly( $module );
                }
 
                // Allow extensions to stop execution for arbitrary reasons.
@@ -1167,6 +1167,42 @@ class ApiMain extends ApiBase {
                }
        }
 
+       /**
+        * Check if the DB is read-only for this user
+        * @param ApiBase $module An Api module
+        */
+       protected function checkReadOnly( $module ) {
+               if ( wfReadOnly() ) {
+                       $this->dieReadOnly();
+               }
+
+               if ( $module->isWriteMode()
+                       && in_array( 'bot', $this->getUser()->getGroups() )
+                       && wfGetLB()->getServerCount() > 1
+               ) {
+                       // Figure out how many servers have passed the lag threshold
+                       $numLagged = 0;
+                       $lagLimit = $this->getConfig()->get( 'APIMaxLagThreshold' );
+                       foreach ( wfGetLB()->getLagTimes() as $lag ) {
+                               if ( $lag > $lagLimit ) {
+                                       ++$numLagged;
+                               }
+                       }
+                       // If a majority of slaves are too lagged then disallow writes
+                       $slaveCount = wfGetLB()->getServerCount() - 1;
+                       if ( $numLagged >= ceil( $slaveCount / 2 ) ) {
+                               $parsed = $this->parseMsg( array( 'readonlytext' ) );
+                               $this->dieUsage(
+                                       $parsed['info'],
+                                       $parsed['code'],
+                                       /* http error */
+                                       0,
+                                       array( 'readonlyreason' => "Waiting for $numLagged lagged database(s)" )
+                               );
+                       }
+               }
+       }
+
        /**
         * Check asserts of the user's rights
         * @param array $params
@@ -1250,31 +1286,45 @@ class ApiMain extends ApiBase {
 
        /**
         * Log the preceding request
-        * @param int $time Time in seconds
+        * @param float $time Time in seconds
         */
        protected function logRequest( $time ) {
                $request = $this->getRequest();
-               $milliseconds = $time === null ? '?' : round( $time * 1000 );
-               $s = 'API' .
-                       ' ' . $request->getMethod() .
-                       ' ' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
-                       ' ' . $request->getIP() .
-                       ' T=' . $milliseconds . 'ms';
+               $logCtx = array(
+                       'dt' => date( 'c' ),
+                       'client_ip' => $request->getIP(),
+                       'user_agent' => $this->getUserAgent(),
+                       'wiki' => wfWikiID(),
+                       'time_backend_ms' => round( $time * 1000 ),
+                       'params' => array(),
+               );
+
+               // Construct space separated message for 'api' log channel
+               $msg = "API {$request->getMethod()} " .
+                       wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
+                       " {$logCtx['client_ip']} " .
+                       "T={$logCtx['time_backend_ms']}ms";
+
                foreach ( $this->getParamsUsed() as $name ) {
                        $value = $request->getVal( $name );
                        if ( $value === null ) {
                                continue;
                        }
-                       $s .= ' ' . $name . '=';
+
                        if ( strlen( $value ) > 256 ) {
-                               $encValue = $this->encodeRequestLogValue( substr( $value, 0, 256 ) );
-                               $s .= $encValue . '[...]';
+                               $value = substr( $value, 0, 256 );
+                               $encValue = $this->encodeRequestLogValue( $value ) . '[...]';
                        } else {
-                               $s .= $this->encodeRequestLogValue( $value );
+                               $encValue = $this->encodeRequestLogValue( $value );
                        }
+
+                       $logCtx['params'][$name] = $value;
+                       $msg .= " {$name}={$encValue}";
                }
-               $s .= "\n";
-               wfDebugLog( 'api', $s, 'private' );
+
+               wfDebugLog( 'api', $msg, 'private' );
+               // ApiRequest channel is for structured data consumers
+               wfDebugLog( 'ApiRequest', '', 'private', $logCtx );
        }
 
        /**
@@ -1496,7 +1546,7 @@ class ApiMain extends ApiBase {
                        $tocnumber = &$options['tocnumber'];
 
                        $header = $this->msg( 'api-help-datatypes-header' )->parse();
-                       $help['datatypes'] .= Html::rawelement( 'h' . min( 6, $level ),
+                       $help['datatypes'] .= Html::rawElement( 'h' . min( 6, $level ),
                                array( 'id' => 'main/datatypes', 'class' => 'apihelp-header' ),
                                Html::element( 'span', array( 'id' => Sanitizer::escapeId( 'main/datatypes' ) ) ) .
                                $header
@@ -1515,7 +1565,7 @@ class ApiMain extends ApiBase {
                        }
 
                        $header = $this->msg( 'api-credits-header' )->parse();
-                       $help['credits'] .= Html::rawelement( 'h' . min( 6, $level ),
+                       $help['credits'] .= Html::rawElement( 'h' . min( 6, $level ),
                                array( 'id' => 'main/credits', 'class' => 'apihelp-header' ),
                                Html::element( 'span', array( 'id' => Sanitizer::escapeId( 'main/credits' ) ) ) .
                                $header
index 370911a..5c3434f 100644 (file)
@@ -172,7 +172,6 @@ class ApiRawMessage extends RawMessage implements IApiMessage {
         *  - string: passed to RawMessage::__construct
         * @param string|null $code
         * @param array|null $data
-        * @return ApiMessage
         */
        public function __construct( $msg, $code = null, array $data = null ) {
                if ( $msg instanceof RawMessage ) {
index 60fd426..c38457e 100644 (file)
@@ -130,10 +130,8 @@ class ApiMove extends ApiBase {
                        $watch = $params['watchlist'];
                } elseif ( $params['watch'] ) {
                        $watch = 'watch';
-                       $this->logFeatureUsage( 'action=move&watch' );
                } elseif ( $params['unwatch'] ) {
                        $watch = 'unwatch';
-                       $this->logFeatureUsage( 'action=move&unwatch' );
                }
 
                // Watch pages
index 0adb464..5ce43cc 100644 (file)
@@ -140,7 +140,7 @@ class ApiOpenSearch extends ApiBase {
                        $redirects = array();
                        $lb = new LinkBatch( $titles );
                        if ( !$lb->isEmpty() ) {
-                               $db = $this->getDb();
+                               $db = $this->getDB();
                                $res = $db->select(
                                        array( 'page', 'redirect' ),
                                        array( 'page_namespace', 'page_title', 'rd_namespace', 'rd_title' ),
@@ -170,7 +170,7 @@ class ApiOpenSearch extends ApiBase {
                                }
                                if ( !isset( $seen[$ns][$dbkey] ) ) {
                                        $seen[$ns][$dbkey] = true;
-                                       $resultId = $title->getArticleId();
+                                       $resultId = $title->getArticleID();
                                        if ( $resultId === 0 ) {
                                                $resultId = $nextSpecialPageId;
                                                $nextSpecialPageId -= 1;
@@ -181,7 +181,7 @@ class ApiOpenSearch extends ApiBase {
                                                'extract' => false,
                                                'extract trimmed' => false,
                                                'image' => false,
-                                               'url' => wfExpandUrl( $title->getFullUrl(), PROTO_CURRENT ),
+                                               'url' => wfExpandUrl( $title->getFullURL(), PROTO_CURRENT ),
                                        );
                                }
                        }
@@ -311,7 +311,7 @@ class ApiOpenSearch extends ApiBase {
         * Extension:ActiveAbstract.
         *
         * @param string $text
-        * @param int $len Target length; actual result will continue to the end of a sentence.
+        * @param int $length Target length; actual result will continue to the end of a sentence.
         * @return string
         */
        public static function trimExtract( $text, $length ) {
index 74ce053..7a90527 100644 (file)
@@ -35,14 +35,10 @@ class ApiOptions extends ApiBase {
         * Changes preferences of the current user.
         */
        public function execute() {
-               $user = $this->getUser();
-
-               if ( $user->isAnon() ) {
+               if ( $this->getUser()->isAnon() ) {
                        $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
-               }
-
-               if ( !$user->isAllowed( 'editmyoptions' ) ) {
-                       $this->dieUsage( 'You don\'t have permission to edit your options', 'permissiondenied' );
+               } elseif ( !$this->getUser()->isAllowed( 'editmyoptions' ) ) {
+                       $this->dieUsage( "You don't have permission to edit your options", 'permissiondenied' );
                }
 
                $params = $this->extractRequestParams();
@@ -53,11 +49,9 @@ class ApiOptions extends ApiBase {
                }
 
                // Load the user from the master to reduce CAS errors on double post (T95839)
-               if ( wfGetLB()->getServerCount() > 1 ) {
-                       $user = User::newFromId( $user->getId() );
-                       if ( !$user->loadFromId( User::READ_EXCLUSIVE ) ) {
-                               $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
-                       }
+               $user = $this->getUser()->getInstanceForUpdate();
+               if ( !$user ) {
+                       $this->dieUsage( 'Anonymous users cannot change preferences', 'notloggedin' );
                }
 
                if ( $params['reset'] ) {
index 2ab37ad..a808ac0 100644 (file)
@@ -52,7 +52,6 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( is_array( $params['querymodules'] ) ) {
-                       $this->logFeatureUsage( 'action=paraminfo&querymodules' );
                        $queryModules = $params['querymodules'];
                        foreach ( $queryModules as $m ) {
                                $modules[] = 'query+' . $m;
@@ -62,7 +61,6 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( is_array( $params['formatmodules'] ) ) {
-                       $this->logFeatureUsage( 'action=paraminfo&formatmodules' );
                        $formatModules = $params['formatmodules'];
                        foreach ( $formatModules as $m ) {
                                $modules[] = $m;
@@ -109,12 +107,10 @@ class ApiParamInfo extends ApiBase {
                }
 
                if ( $params['mainmodule'] ) {
-                       $this->logFeatureUsage( 'action=paraminfo&mainmodule' );
                        $res['mainmodule'] = $this->getModuleInfo( $this->getMain() );
                }
 
                if ( $params['pagesetmodule'] ) {
-                       $this->logFeatureUsage( 'action=paraminfo&pagesetmodule' );
                        $pageSet = new ApiPageSet( $this->getMain()->getModuleManager()->getModule( 'query' ) );
                        $res['pagesetmodule'] = $this->getModuleInfo( $pageSet );
                        unset( $res['pagesetmodule']['name'] );
@@ -181,7 +177,6 @@ class ApiParamInfo extends ApiBase {
         * @return ApiResult
         */
        private function getModuleInfo( $module ) {
-               $result = $this->getResult();
                $ret = array();
                $path = $module->getModulePath();
 
@@ -204,7 +199,7 @@ class ApiParamInfo extends ApiBase {
                                $ret['sourcename'] = $ret['source'];
                        }
 
-                       $link = SpecialPage::getTitleFor( 'Version', 'License/' . $sourceInfo['name'] )->getFullUrl();
+                       $link = SpecialPage::getTitleFor( 'Version', 'License/' . $sourceInfo['name'] )->getFullURL();
                        if ( isset( $sourceInfo['license-name'] ) ) {
                                $ret['licensetag'] = $sourceInfo['license-name'];
                                $ret['licenselink'] = (string)$link;
index fcab9be..5754c23 100644 (file)
@@ -427,9 +427,6 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) {
-                       if ( !isset( $prop['parsetree'] ) ) {
-                               $this->logFeatureUsage( 'action=parse&generatexml' );
-                       }
                        if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
                                $this->dieUsage( "parsetree is only supported for wikitext content", "notwikitext" );
                        }
@@ -637,7 +634,8 @@ class ApiParse extends ApiBase {
                foreach ( $links as $link => $sortkey ) {
                        $entry = array();
                        $entry['sortkey'] = $sortkey;
-                       ApiResult::setContentValue( $entry, 'category', $link );
+                       // array keys will cast numeric category names to ints, so cast back to string
+                       ApiResult::setContentValue( $entry, 'category', (string)$link );
                        if ( !isset( $hiddencats[$link] ) ) {
                                $entry['missing'] = true;
                        } elseif ( $hiddencats[$link] ) {
@@ -717,7 +715,6 @@ class ApiParse extends ApiBase {
 
        private function formatLimitReportData( $limitReportData ) {
                $result = array();
-               $apiResult = $this->getResult();
 
                foreach ( $limitReportData as $name => $value ) {
                        $entry = array();
index c07aaca..d07301c 100644 (file)
@@ -56,7 +56,6 @@ class ApiProtect extends ApiBase {
                }
 
                $restrictionTypes = $titleObj->getRestrictionTypes();
-               $db = $this->getDB();
 
                $protections = array();
                $expiryarray = array();
@@ -101,9 +100,6 @@ class ApiProtect extends ApiBase {
 
                $cascade = $params['cascade'];
 
-               if ( $params['watch'] ) {
-                       $this->logFeatureUsage( 'action=protect&watch' );
-               }
                $watch = $params['watch'] ? 'watch' : $params['watchlist'];
                $this->setWatch( $watch, $titleObj, 'watchdefault' );
 
index 0711c90..30978a1 100644 (file)
@@ -169,11 +169,9 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                                ),
                        ),
                        'min' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'max' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => 'integer'
                        ),
                        'limit' => array(
index 4f7984e..8cb1119 100644 (file)
@@ -392,7 +392,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        'namespace' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => 'namespace',
-                               ApiBase::PARAM_DFLT => null,
                        ),
                        'start' => array(
                                ApiBase::PARAM_TYPE => 'timestamp',
index 877423e..6c7e69b 100644 (file)
@@ -216,7 +216,7 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        if ( !$this->validateSha1Hash( $sha1 ) ) {
                                $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
                        }
-                       $sha1 = wfBaseConvert( $sha1, 16, 36, 31 );
+                       $sha1 = Wikimedia\base_convert( $sha1, 16, 36, 31 );
                } elseif ( isset( $params['sha1base36'] ) ) {
                        $sha1 = strtolower( $params['sha1base36'] );
                        if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
@@ -374,7 +374,6 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                )
                        ),
                        'mime' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                        ),
                        'limit' => array(
index eb3e553..9ea1b1e 100644 (file)
@@ -59,9 +59,10 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        $fld_rights = isset( $prop['rights'] );
                        $fld_registration = isset( $prop['registration'] );
                        $fld_implicitgroups = isset( $prop['implicitgroups'] );
+                       $fld_centralids = isset( $prop['centralids'] );
                } else {
                        $fld_blockinfo = $fld_editcount = $fld_groups = $fld_registration =
-                               $fld_rights = $fld_implicitgroups = false;
+                               $fld_rights = $fld_implicitgroups = $fld_centralids = false;
                }
 
                $limit = $params['limit'];
@@ -239,6 +240,12 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                'name' => $row->user_name,
                        );
 
+                       if ( $fld_centralids ) {
+                               $data += ApiQueryUserInfo::getCentralUserInfo(
+                                       $this->getConfig(), User::newFromId( $row->user_id ), $params['attachedwiki']
+                               );
+                       }
+
                        if ( $fld_blockinfo && !is_null( $row->ipb_by_text ) ) {
                                $data['blockid'] = (int)$row->ipb_id;
                                $data['blockedby'] = $row->ipb_by_text;
@@ -264,7 +271,6 @@ class ApiQueryAllUsers extends ApiQueryBase {
                        }
 
                        if ( $fld_implicitgroups || $fld_groups || $fld_rights ) {
-                               $user = User::newFromId( $row->user_id );
                                $implicitGroups = User::newFromId( $row->user_id )->getAutomaticGroups();
                                if ( isset( $row->groups ) && $row->groups !== '' ) {
                                        $groups = array_merge( $implicitGroups, explode( '|', $row->groups ) );
@@ -339,7 +345,8 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        'implicitgroups',
                                        'rights',
                                        'editcount',
-                                       'registration'
+                                       'registration',
+                                       'centralids',
                                ),
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
@@ -358,6 +365,7 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                        $this->getConfig()->get( 'ActiveUserDays' )
                                ),
                        ),
+                       'attachedwiki' => null,
                );
        }
 
index 1df14e0..6a31e19 100644 (file)
@@ -357,7 +357,6 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
                // Parse and validate continuation parameter
                $this->cont = array();
                if ( $this->params['continue'] !== null ) {
-                       $db = $this->getDB();
                        $cont = explode( '|', $this->params['continue'] );
 
                        switch ( count( $cont ) ) {
index c4592c8..01968c2 100644 (file)
@@ -317,7 +317,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @param bool $sort
         */
        protected function addTimestampWhereRange( $field, $dir, $start, $end, $sort = true ) {
-               $db = $this->getDb();
+               $db = $this->getDB();
                $this->addWhereRange( $field, $dir,
                        $db->timestampOrNull( $start ), $db->timestampOrNull( $end ), $sort );
        }
@@ -384,7 +384,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return null|string
         */
        public function prepareUrlQuerySearchString( $query = null, $protocol = null ) {
-               $db = $this->getDb();
+               $db = $this->getDB();
                if ( !is_null( $query ) || $query != '' ) {
                        if ( is_null( $protocol ) ) {
                                $protocol = 'http://';
@@ -529,7 +529,7 @@ abstract class ApiQueryBase extends ApiBase {
                        $this->dieUsageMsg( array( 'invalidtitle', $titlePart ) );
                }
 
-               return substr( $t->getDbKey(), 0, -1 );
+               return substr( $t->getDBkey(), 0, -1 );
        }
 
        /**
@@ -547,22 +547,7 @@ abstract class ApiQueryBase extends ApiBase {
                        $this->dieUsageMsg( array( 'invalidtitle', $titlePart ) );
                }
 
-               return array( $t->getNamespace(), substr( $t->getDbKey(), 0, -1 ) );
-       }
-
-       /**
-        * Gets the personalised direction parameter description
-        *
-        * @param string $p ModulePrefix
-        * @param string $extraDirText Any extra text to be appended on the description
-        * @return array
-        */
-       public function getDirectionDescription( $p = '', $extraDirText = '' ) {
-               return array(
-                       "In which direction to enumerate{$extraDirText}",
-                       " newer          - List oldest first. Note: {$p}start has to be before {$p}end.",
-                       " older          - List newest first (default). Note: {$p}start has to be later than {$p}end.",
-               );
+               return array( $t->getNamespace(), substr( $t->getDBkey(), 0, -1 ) );
        }
 
        /**
@@ -679,6 +664,22 @@ abstract class ApiQueryBase extends ApiBase {
                return substr( $this->keyToTitle( $keyPart . 'x' ), 0, -1 );
        }
 
+       /**
+        * Gets the personalised direction parameter description
+        *
+        * @deprecated since 1.25 along with ApiBase::getParamDescription
+        * @param string $p ModulePrefix
+        * @param string $extraDirText Any extra text to be appended on the description
+        * @return array
+        */
+       public function getDirectionDescription( $p = '', $extraDirText = '' ) {
+               return array(
+                       "In which direction to enumerate{$extraDirText}",
+                       " newer          - List oldest first. Note: {$p}start has to be before {$p}end.",
+                       " older          - List newest first (default). Note: {$p}start has to be later than {$p}end.",
+               );
+       }
+
        /**@}*/
 }
 
index 6dcfe0e..35f7617 100644 (file)
@@ -151,29 +151,23 @@ class ApiQueryCategoryMembers extends ApiQueryGeneratorBase {
                                $this->addWhereRange( 'cl_from', $dir, null, null );
                        } else {
                                if ( $params['startsortkeyprefix'] !== null ) {
-                                       $startsortkey = Collation::singleton()->getSortkey( $params['startsortkeyprefix'] );
+                                       $startsortkey = Collation::singleton()->getSortKey( $params['startsortkeyprefix'] );
                                } elseif ( $params['starthexsortkey'] !== null ) {
                                        if ( !$this->validateHexSortkey( $params['starthexsortkey'] ) ) {
                                                $this->dieUsage( 'The starthexsortkey provided is not valid', 'bad_starthexsortkey' );
                                        }
                                        $startsortkey = pack( 'H*', $params['starthexsortkey'] );
                                } else {
-                                       if ( $params['startsortkey'] !== null ) {
-                                               $this->logFeatureUsage( 'list=categorymembers&cmstartsortkey' );
-                                       }
                                        $startsortkey = $params['startsortkey'];
                                }
                                if ( $params['endsortkeyprefix'] !== null ) {
-                                       $endsortkey = Collation::singleton()->getSortkey( $params['endsortkeyprefix'] );
+                                       $endsortkey = Collation::singleton()->getSortKey( $params['endsortkeyprefix'] );
                                } elseif ( $params['endhexsortkey'] !== null ) {
                                        if ( !$this->validateHexSortkey( $params['endhexsortkey'] ) ) {
                                                $this->dieUsage( 'The endhexsortkey provided is not valid', 'bad_endhexsortkey' );
                                        }
                                        $endsortkey = pack( 'H*', $params['endhexsortkey'] );
                                } else {
-                                       if ( $params['endsortkey'] !== null ) {
-                                               $this->logFeatureUsage( 'list=categorymembers&cmendsortkey' );
-                                       }
                                        $endsortkey = $params['endsortkey'];
                                }
 
index 76f594e..fe2ec8f 100644 (file)
@@ -362,7 +362,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                                }
                                if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
                                        if ( $row->ar_sha1 != '' ) {
-                                               $rev['sha1'] = wfBaseConvert( $row->ar_sha1, 36, 16, 40 );
+                                               $rev['sha1'] = Wikimedia\base_convert( $row->ar_sha1, 36, 16, 40 );
                                        } else {
                                                $rev['sha1'] = '';
                                        }
index 8156edb..71be951 100644 (file)
@@ -114,7 +114,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                if ( !$this->validateSha1Hash( $sha1 ) ) {
                                        $this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
                                }
-                               $sha1 = wfBaseConvert( $sha1, 16, 36, 31 );
+                               $sha1 = Wikimedia\base_convert( $sha1, 16, 36, 31 );
                        } elseif ( $sha1base36Set ) {
                                $sha1 = strtolower( $params['sha1base36'] );
                                if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
@@ -183,7 +183,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                $file['user'] = $row->fa_user_text;
                        }
                        if ( $fld_sha1 ) {
-                               $file['sha1'] = wfBaseConvert( $row->fa_sha1, 36, 16, 40 );
+                               $file['sha1'] = Wikimedia\base_convert( $row->fa_sha1, 36, 16, 40 );
                        }
                        if ( $fld_timestamp ) {
                                $file['timestamp'] = wfTimestamp( TS_ISO_8601, $row->fa_timestamp );
index 82619cc..7123138 100644 (file)
@@ -51,7 +51,6 @@ class ApiQueryIWLinks extends ApiQueryBase {
                // Handle deprecated param
                $this->requireMaxOneParameter( $params, 'url', 'prop' );
                if ( $params['url'] ) {
-                       $this->logFeatureUsage( 'prop=iwlinks&iwurl' );
                        $prop = array( 'url' => 1 );
                }
 
index 736ac45..8dbd812 100644 (file)
@@ -225,8 +225,6 @@ class ApiQueryImageInfo extends ApiQueryBase {
         * @return array|null Key-val array of 'width' and 'height', or null
         */
        public function getScale( $params ) {
-               $p = $this->getModulePrefix();
-
                if ( $params['urlwidth'] != -1 ) {
                        $scale = array();
                        $scale['width'] = $params['urlwidth'];
@@ -515,12 +513,12 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        $vals['thumberror'] = $mto->toText();
                                }
                        }
-                       $vals['url'] = wfExpandUrl( $file->getFullURL(), PROTO_CURRENT );
+                       $vals['url'] = wfExpandUrl( $file->getFullUrl(), PROTO_CURRENT );
                        $vals['descriptionurl'] = wfExpandUrl( $file->getDescriptionUrl(), PROTO_CURRENT );
                }
 
                if ( $sha1 ) {
-                       $vals['sha1'] = wfBaseConvert( $file->getSha1(), 36, 16, 40 );
+                       $vals['sha1'] = Wikimedia\base_convert( $file->getSha1(), 36, 16, 40 );
                }
 
                if ( $meta ) {
index b05c75c..6f1e2e5 100644 (file)
@@ -222,7 +222,7 @@ class ApiQueryInfo extends ApiQueryBase {
         */
        public static function getEmailToken( $pageid, $title ) {
                global $wgUser;
-               if ( !$wgUser->canSendEmail() || $wgUser->isBlockedFromEmailUser() ) {
+               if ( !$wgUser->canSendEmail() || $wgUser->isBlockedFromEmailuser() ) {
                        return false;
                }
 
@@ -387,7 +387,11 @@ class ApiQueryInfo extends ApiQueryBase {
                $dbkey = $title->getDBkey();
 
                $pageInfo['contentmodel'] = $title->getContentModel();
-               $pageInfo['pagelanguage'] = $title->getPageLanguage()->getCode();
+
+               $pageLanguage = $title->getPageLanguage();
+               $pageInfo['pagelanguage'] = $pageLanguage->getCode();
+               $pageInfo['pagelanguagehtmlcode'] = $pageLanguage->getHtmlCode();
+               $pageInfo['pagelanguagedir'] = $pageLanguage->getDir();
 
                if ( $titleExists ) {
                        $pageInfo['touched'] = wfTimestamp( TS_ISO_8601, $this->pageTouched[$pageid] );
@@ -743,7 +747,7 @@ class ApiQueryInfo extends ApiQueryBase {
                $this->addFieldsIf( 'wl_notificationtimestamp', $this->fld_notificationtimestamp );
                $this->addWhere( array(
                        $lb->constructSet( 'wl', $db ),
-                       'wl_user' => $user->getID()
+                       'wl_user' => $user->getId()
                ) );
 
                $res = $this->select( __METHOD__ );
@@ -827,7 +831,6 @@ class ApiQueryInfo extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'protection',
@@ -851,7 +854,6 @@ class ApiQueryInfo extends ApiQueryBase {
                        ),
                        'token' => array(
                                ApiBase::PARAM_DEPRECATED => true,
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array_keys( $this->getTokenFunctions() )
                        ),
index 899a382..f964c7a 100644 (file)
@@ -50,7 +50,6 @@ class ApiQueryLangLinks extends ApiQueryBase {
                // Handle deprecated param
                $this->requireMaxOneParameter( $params, 'url', 'prop' );
                if ( $params['url'] ) {
-                       $this->logFeatureUsage( 'prop=langlinks&llurl' );
                        $prop = array( 'url' => 1 );
                }
 
index e553d12..c7dbfb8 100644 (file)
@@ -130,10 +130,6 @@ class ApiQueryRandom extends ApiQueryGeneratorBase {
                        $this->requireMaxOneParameter( $params, 'filterredir', 'redirect' );
                }
 
-               if ( $params['redirect'] ) {
-                       $this->logFeatureUsage( "list=random&rnredirect=" );
-               }
-
                if ( isset( $params['continue'] ) ) {
                        $cont = explode( '|', $params['continue'] );
                        $this->dieContinueUsageIf( count( $cont ) != 4 );
index 0a11f4b..c99d87c 100644 (file)
@@ -552,7 +552,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        }
                        if ( Revision::userCanBitfield( $row->rev_deleted, Revision::DELETED_TEXT, $user ) ) {
                                if ( $row->rev_sha1 !== '' ) {
-                                       $vals['sha1'] = wfBaseConvert( $row->rev_sha1, 36, 16, 40 );
+                                       $vals['sha1'] = Wikimedia\base_convert( $row->rev_sha1, 36, 16, 40 );
                                } else {
                                        $vals['sha1'] = '';
                                }
index 609efb0..d7fb580 100644 (file)
@@ -84,7 +84,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                        $this->dieUsageMsg( array( 'nosuchrevid', $params['diffto'] ) );
                                }
                                if ( !$difftoRev->userCan( Revision::DELETED_TEXT, $this->getUser() ) ) {
-                                       $this->setWarning( "Couldn't diff to r{$difftoRev->getID()}: content is hidden" );
+                                       $this->setWarning( "Couldn't diff to r{$difftoRev->getId()}: content is hidden" );
                                        $params['diffto'] = null;
                                }
                        }
@@ -213,7 +213,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                        if ( $revision->userCan( Revision::DELETED_TEXT, $user ) ) {
                                if ( $revision->getSha1() != '' ) {
-                                       $vals['sha1'] = wfBaseConvert( $revision->getSha1(), 36, 16, 40 );
+                                       $vals['sha1'] = Wikimedia\base_convert( $revision->getSha1(), 36, 16, 40 );
                                } else {
                                        $vals['sha1'] = '';
                                }
@@ -276,9 +276,6 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                }
                if ( $this->fld_parsetree || ( $this->fld_content && $this->generateXML ) ) {
-                       if ( !$this->fld_parsetree ) {
-                               $this->logFeatureUsage( 'action=query&prop=revisions+base&generatexml' );
-                       }
                        if ( $content ) {
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
                                        $t = $content->getNativeData(); # note: don't set $text
@@ -395,7 +392,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                                $engine->setContent( $content, $difftocontent );
                                        }
                                } else {
-                                       $engine = $handler->createDifferenceEngine( $context, $revision->getID(), $this->diffto );
+                                       $engine = $handler->createDifferenceEngine( $context, $revision->getId(), $this->diffto );
                                        $vals['diff']['from'] = $engine->getOldid();
                                        $vals['diff']['to'] = $engine->getNewid();
                                }
@@ -485,15 +482,12 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-parse',
                        ),
                        'section' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-section',
                        ),
                        'diffto' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-diffto',
                        ),
                        'difftotext' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-difftotext',
                        ),
                        'difftotextpst' => array(
@@ -502,7 +496,6 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        ),
                        'contentformat' => array(
                                ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_HELP_MSG => 'apihelp-query+revisions+base-param-contentformat',
                        ),
                );
index 32607a5..637fc4c 100644 (file)
@@ -308,7 +308,6 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_ISMULTI => true,
                        ),
                        'what' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_TYPE => array(
                                        'title',
                                        'text',
index 1265155..ca9ceca 100644 (file)
@@ -245,6 +245,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
                $data['misermode'] = (bool)$config->get( 'MiserMode' );
 
+               $data['uploadsenabled'] = UploadBase::isEnabled();
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
                $data['minuploadchunksize'] = (int)$this->getConfig()->get( 'MinUploadChunkSize' );
 
@@ -265,6 +266,10 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['favicon'] = wfExpandUrl( $favicon, PROTO_RELATIVE );
                }
 
+               $data['centralidlookupprovider'] = $this->getConfig()->get( 'CentralIdLookupProvider' );
+               $providerIds = array_keys( $this->getConfig()->get( 'CentralIdLookupProviders' ) );
+               $data['allcentralidlookupproviders'] = $providerIds;
+
                Hooks::run( 'APIQuerySiteInfoGeneralInfo', array( $this, &$data ) );
 
                return $this->getResult()->addValue( 'query', $property, $data );
@@ -456,7 +461,6 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        );
                }
 
-               $result = $this->getResult();
                ApiResult::setIndexedTagName( $data, 'db' );
 
                return $this->getResult()->addValue( 'query', $property, $data );
@@ -497,7 +501,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                        $arr['number'] = SiteStats::users();
                                // '*' and autopromote groups have no size
                                } elseif ( $group !== '*' && !isset( $autopromote[$group] ) ) {
-                                       $arr['number'] = SiteStats::numberInGroup( $group );
+                                       $arr['number'] = SiteStats::numberingroup( $group );
                                }
                        }
 
@@ -540,18 +544,14 @@ class ApiQuerySiteinfo extends ApiQueryBase {
 
        protected function appendInstalledLibraries( $property ) {
                global $IP;
-               $path = "$IP/composer.lock";
+               $path = "$IP/vendor/composer/installed.json";
                if ( !file_exists( $path ) ) {
-                       // Maybe they're using mediawiki/vendor?
-                       $path = "$IP/vendor/composer.lock";
-                       if ( !file_exists( $path ) ) {
-                               return true;
-                       }
+                       return true;
                }
 
                $data = array();
-               $lock = new ComposerLock( $path );
-               foreach ( $lock->getInstalledDependencies() as $name => $info ) {
+               $installed = new ComposerInstalled( $path );
+               foreach ( $installed->getInstalledDependencies() as $name => $info ) {
                        if ( strpos( $info['type'], 'mediawiki-' ) === 0 ) {
                                // Skip any extensions or skins since they'll be listed
                                // in their proper section
@@ -804,7 +804,7 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                                'subscribers' => array_map( array( 'SpecialVersion', 'arrayToString' ), $subscribers ),
                        );
 
-                       ApiResult::setArrayType( $arr['subscribers'], 'BCarray' );
+                       ApiResult::setArrayType( $arr['subscribers'], 'array' );
                        ApiResult::setIndexedTagName( $arr['subscribers'], 's' );
                        $data[] = $arr;
                }
index 3de72bf..229e158 100644 (file)
@@ -47,7 +47,6 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
 
                // Alias sessionkey to filekey, but give an existing filekey precedence.
                if ( !$params['filekey'] && $params['sessionkey'] ) {
-                       $this->logFeatureUsage( 'prop=stashimageinfo&siisessionkey' );
                        $params['filekey'] = $params['sessionkey'];
                }
 
@@ -78,12 +77,10 @@ class ApiQueryStashImageInfo extends ApiQueryImageInfo {
                return array(
                        'filekey' => array(
                                ApiBase::PARAM_ISMULTI => true,
-                               ApiBase::PARAM_DFLT => null
                        ),
                        'sessionkey' => array(
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_DEPRECATED => true,
-                               ApiBase::PARAM_DFLT => null
                        ),
                        'prop' => array(
                                ApiBase::PARAM_ISMULTI => true,
index e303094..1ef0f35 100644 (file)
@@ -224,7 +224,6 @@ class ApiQueryContributions extends ApiQueryBase {
 
                $show = $this->params['show'];
                if ( $this->params['toponly'] ) { // deprecated/old param
-                       $this->logFeatureUsage( 'list=usercontribs&uctoponly' );
                        $show[] = 'top';
                }
                if ( !is_null( $show ) ) {
index f916537..27663a1 100644 (file)
@@ -33,6 +33,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
 
        const WL_UNREAD_LIMIT = 1000;
 
+       private $params = array();
        private $prop = array();
 
        public function __construct( ApiQuery $query, $moduleName ) {
@@ -40,11 +41,11 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        public function execute() {
-               $params = $this->extractRequestParams();
+               $this->params = $this->extractRequestParams();
                $result = $this->getResult();
 
-               if ( !is_null( $params['prop'] ) ) {
-                       $this->prop = array_flip( $params['prop'] );
+               if ( !is_null( $this->params['prop'] ) ) {
+                       $this->prop = array_flip( $this->params['prop'] );
                }
 
                $r = $this->getCurrentUserInfo();
@@ -76,6 +77,45 @@ class ApiQueryUserInfo extends ApiQueryBase {
                return $vals;
        }
 
+       /**
+        * Get central user info
+        * @param Config $config
+        * @param User $user
+        * @param string|null $attachedWiki
+        * @return array Central user info
+        *  - centralids: Array mapping non-local Central ID provider names to IDs
+        *  - attachedlocal: Array mapping Central ID provider names to booleans
+        *    indicating whether the local user is attached.
+        *  - attachedwiki: Array mapping Central ID provider names to booleans
+        *    indicating whether the user is attached to $attachedWiki.
+        */
+       public static function getCentralUserInfo( Config $config, User $user, $attachedWiki = null ) {
+               $providerIds = array_keys( $config->get( 'CentralIdLookupProviders' ) );
+
+               $ret = array(
+                       'centralids' => array(),
+                       'attachedlocal' => array(),
+               );
+               ApiResult::setArrayType( $ret['centralids'], 'assoc' );
+               ApiResult::setArrayType( $ret['attachedlocal'], 'assoc' );
+               if ( $attachedWiki ) {
+                       $ret['attachedwiki'] = array();
+                       ApiResult::setArrayType( $ret['attachedwiki'], 'assoc' );
+               }
+
+               $name = $user->getName();
+               foreach ( $providerIds as $providerId ) {
+                       $provider = CentralIdLookup::factory( $providerId );
+                       $ret['centralids'][$providerId] = $provider->centralIdFromName( $name );
+                       $ret['attachedlocal'][$providerId] = $provider->isAttached( $user );
+                       if ( $attachedWiki ) {
+                               $ret['attachedwiki'][$providerId] = $provider->isAttached( $user, $attachedWiki );
+                       }
+               }
+
+               return $ret;
+       }
+
        protected function getCurrentUserInfo() {
                $user = $this->getUser();
                $vals = array();
@@ -205,6 +245,12 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        }
                }
 
+               if ( isset( $this->prop['centralids'] ) ) {
+                       $vals += self::getCentralUserInfo(
+                               $this->getConfig(), $this->getUser(), $this->params['attachedwiki']
+                       );
+               }
+
                return $vals;
        }
 
@@ -250,7 +296,6 @@ class ApiQueryUserInfo extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'blockinfo',
@@ -268,6 +313,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                        'acceptlang',
                                        'registrationdate',
                                        'unreadcount',
+                                       'centralids',
                                ),
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => array(
                                        'unreadcount' => array(
@@ -276,7 +322,8 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                                self::WL_UNREAD_LIMIT . '+',
                                        ),
                                ),
-                       )
+                       ),
+                       'attachedwiki' => null,
                );
        }
 
index 1d0048c..db5fb65 100644 (file)
@@ -48,6 +48,7 @@ class ApiQueryUsers extends ApiQueryBase {
                'registration',
                'emailable',
                'gender',
+               'centralids',
        );
 
        public function __construct( ApiQuery $query, $moduleName ) {
@@ -213,6 +214,12 @@ class ApiQueryUsers extends ApiQueryBase {
                                        $data[$name]['gender'] = $gender;
                                }
 
+                               if ( isset( $this->prop['centralids'] ) ) {
+                                       $data[$name] += ApiQueryUserInfo::getCentralUserInfo(
+                                               $this->getConfig(), $user, $params['attachedwiki']
+                                       );
+                               }
+
                                if ( !is_null( $params['token'] ) ) {
                                        $tokenFunctions = $this->getTokenFunctions();
                                        foreach ( $params['token'] as $t ) {
@@ -294,7 +301,6 @@ class ApiQueryUsers extends ApiQueryBase {
        public function getAllowedParams() {
                return array(
                        'prop' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_ISMULTI => true,
                                ApiBase::PARAM_TYPE => array(
                                        'blockinfo',
@@ -305,9 +311,11 @@ class ApiQueryUsers extends ApiQueryBase {
                                        'registration',
                                        'emailable',
                                        'gender',
+                                       'centralids',
                                ),
                                ApiBase::PARAM_HELP_MSG_PER_VALUE => array(),
                        ),
+                       'attachedwiki' => null,
                        'users' => array(
                                ApiBase::PARAM_ISMULTI => true
                        ),
index cd4165b..bd5fe08 100644 (file)
@@ -327,6 +327,7 @@ class ApiResult implements ApiSerializable {
        /**
         * Validate a value for addition to the result
         * @param mixed $value
+        * @return array|mixed|string
         */
        private static function validateValue( $value ) {
                global $wgContLang;
@@ -738,7 +739,7 @@ class ApiResult implements ApiSerializable {
         * Set the array data type for a path
         * @since 1.25
         * @param array|string|null $path See ApiResult::addValue()
-        * @param string $type See ApiResult::META_TYPE
+        * @param string $tag See ApiResult::META_TYPE
         * @param string $kvpKeyName See ApiResult::META_KVP_KEY_NAME
         */
        public function addArrayType( $path, $tag, $kvpKeyName = null ) {
@@ -766,7 +767,7 @@ class ApiResult implements ApiSerializable {
         * Set the array data type for a path recursively
         * @since 1.25
         * @param array|string|null $path See ApiResult::addValue()
-        * @param string $type See ApiResult::META_TYPE
+        * @param string $tag See ApiResult::META_TYPE
         * @param string $kvpKeyName See ApiResult::META_KVP_KEY_NAME
         */
        public function addArrayTypeRecursive( $path, $tag, $kvpKeyName = null ) {
@@ -796,7 +797,7 @@ class ApiResult implements ApiSerializable {
         *
         * @see ApiResult::getResultData()
         * @since 1.25
-        * @param array $data
+        * @param array $dataIn
         * @param array $transforms
         * @return array|object
         */
@@ -830,7 +831,6 @@ class ApiResult implements ApiSerializable {
 
                // BC transformations
                $boolKeys = null;
-               $forceKVP = false;
                if ( isset( $transforms['BC'] ) ) {
                        if ( !is_array( $transforms['BC'] ) ) {
                                throw new InvalidArgumentException( __METHOD__ . ':Value for "BC" must be an array' );
@@ -1090,7 +1090,7 @@ class ApiResult implements ApiSerializable {
                $s = 0;
                if ( is_array( $value ) ) {
                        foreach ( $value as $k => $v ) {
-                               if ( !self::isMetadataKey( $s ) ) {
+                               if ( !self::isMetadataKey( $k ) ) {
                                        $s += self::valueSize( $v );
                                }
                        }
index fa6fabf..33f3bd8 100644 (file)
@@ -103,7 +103,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                if ( $params['entirewatchlist'] ) {
                        // Entire watchlist mode: Just update the thing and return a success indicator
                        $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => $timestamp ),
-                               array( 'wl_user' => $user->getID() ),
+                               array( 'wl_user' => $user->getId() ),
                                __METHOD__
                        );
 
@@ -135,7 +135,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                                // Now process the valid titles
                                $lb = new LinkBatch( $pageSet->getTitles() );
                                $dbw->update( 'watchlist', array( 'wl_notificationtimestamp' => $timestamp ),
-                                       array( 'wl_user' => $user->getID(), $lb->constructSet( 'wl', $dbw ) ),
+                                       array( 'wl_user' => $user->getId(), $lb->constructSet( 'wl', $dbw ) ),
                                        __METHOD__
                                );
 
@@ -144,7 +144,7 @@ class ApiSetNotificationTimestamp extends ApiBase {
                                $res = $dbw->select(
                                        'watchlist',
                                        array( 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ),
-                                       array( 'wl_user' => $user->getID(), $lb->constructSet( 'wl', $dbw ) ),
+                                       array( 'wl_user' => $user->getId(), $lb->constructSet( 'wl', $dbw ) ),
                                        __METHOD__
                                );
                                foreach ( $res as $row ) {
index e87fc97..208e9ca 100644 (file)
@@ -19,6 +19,8 @@
  * @author Aaron Schulz
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Prepare an edit in shared cache so that it can be reused on edit
  *
@@ -39,7 +41,7 @@ class ApiStashEdit extends ApiBase {
        const ERROR_UNCACHEABLE = 'uncacheable';
 
        public function execute() {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
                $user = $this->getUser();
                $params = $this->extractRequestParams();
@@ -106,18 +108,17 @@ class ApiStashEdit extends ApiBase {
                // The user will abort the AJAX request by pressing "save", so ignore that
                ignore_user_abort( true );
 
+               // Use the master DB for fast blocking locks
+               $dbw = wfGetDB( DB_MASTER );
+
                // Get a key based on the source text, format, and user preferences
                $key = self::getStashKey( $title, $content, $user );
                // De-duplicate requests on the same key
                if ( $user->pingLimiter( 'stashedit' ) ) {
                        $status = 'ratelimited';
-               } elseif ( $wgMemc->lock( $key, 0, 30 ) ) {
-                       /** @noinspection PhpUnusedLocalVariableInspection */
-                       $unlocker = new ScopedCallback( function() use ( $key ) {
-                               global $wgMemc;
-                               $wgMemc->unlock( $key );
-                       } );
+               } elseif ( $dbw->lock( $key, __METHOD__, 1 ) ) {
                        $status = self::parseAndStash( $page, $content, $user );
+                       $dbw->unlock( $key, __METHOD__ );
                } else {
                        $status = 'busy';
                }
@@ -133,7 +134,8 @@ class ApiStashEdit extends ApiBase {
         * @since 1.25
         */
        public static function parseAndStash( WikiPage $page, Content $content, User $user ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
+               $logger = LoggerFactory::getInstance( 'StashEdit' );
 
                $format = $content->getDefaultFormat();
                $editInfo = $page->prepareContentForEdit( $content, null, $user, $format, false );
@@ -146,16 +148,16 @@ class ApiStashEdit extends ApiBase {
                        );
 
                        if ( $stashInfo ) {
-                               $ok = $wgMemc->set( $key, $stashInfo, $ttl );
+                               $ok = $cache->set( $key, $stashInfo, $ttl );
                                if ( $ok ) {
-                                       wfDebugLog( 'StashEdit', "Cached parser output for key '$key'." );
+                                       $logger->debug( "Cached parser output for key '$key'." );
                                        return self::ERROR_NONE;
                                } else {
-                                       wfDebugLog( 'StashEdit', "Failed to cache parser output for key '$key'." );
+                                       $logger->error( "Failed to cache parser output for key '$key'." );
                                        return self::ERROR_CACHE;
                                }
                        } else {
-                               wfDebugLog( 'StashEdit', "Uncacheable parser output for key '$key'." );
+                               $logger->info( "Uncacheable parser output for key '$key'." );
                                return self::ERROR_UNCACHEABLE;
                        }
                }
@@ -173,7 +175,7 @@ class ApiStashEdit extends ApiBase {
         * will do nothing. Provided the values are cacheable, they will be stored
         * in memcached so that final edit submission might make use of them.
         *
-        * @param Article|WikiPage $page Page title
+        * @param Page|Article|WikiPage $page Page title
         * @param Content $content Proposed page content
         * @param Content $pstContent The result of preSaveTransform() on $content
         * @param ParserOutput $pOut The result of getParserOutput() on $pstContent
@@ -186,7 +188,8 @@ class ApiStashEdit extends ApiBase {
                Page $page, Content $content, Content $pstContent, ParserOutput $pOut,
                ParserOptions $pstOpts, ParserOptions $pOpts, $timestamp
        ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
+               $logger = LoggerFactory::getInstance( 'StashEdit' );
 
                // getIsPreview() controls parser function behavior that references things
                // like user/revision that don't exists yet. The user/text should already
@@ -208,22 +211,22 @@ class ApiStashEdit extends ApiBase {
                $canonicalPOpts->setIsPreview( true ); // force match
                $canonicalPOpts->setTimestamp( $pOpts->getTimestamp() ); // force match
                if ( !$pOpts->matches( $canonicalPOpts ) ) {
-                       wfDebugLog( 'StashEdit', "Uncacheable preview output for key '$key' (options)." );
+                       $logger->info( "Uncacheable preview output for key '$key' (options)." );
                        return false;
                }
 
                // Build a value to cache with a proper TTL
                list( $stashInfo, $ttl ) = self::buildStashValue( $pstContent, $pOut, $timestamp );
                if ( !$stashInfo ) {
-                       wfDebugLog( 'StashEdit', "Uncacheable parser output for key '$key' (rev/TTL)." );
+                       $logger->info( "Uncacheable parser output for key '$key' (rev/TTL)." );
                        return false;
                }
 
-               $ok = $wgMemc->set( $key, $stashInfo, $ttl );
+               $ok = $cache->set( $key, $stashInfo, $ttl );
                if ( !$ok ) {
-                       wfDebugLog( 'StashEdit', "Failed to cache preview parser output for key '$key'." );
+                       $logger->error( "Failed to cache preview parser output for key '$key'." );
                } else {
-                       wfDebugLog( 'StashEdit', "Cached preview output for key '$key'." );
+                       $logger->debug( "Cached preview output for key '$key'." );
                }
 
                return $ok;
@@ -247,32 +250,37 @@ class ApiStashEdit extends ApiBase {
         * @return stdClass|bool Returns false on cache miss
         */
        public static function checkCache( Title $title, Content $content, User $user ) {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
+               $logger = LoggerFactory::getInstance( 'StashEdit' );
 
                $key = self::getStashKey( $title, $content, $user );
-               $editInfo = $wgMemc->get( $key );
+               $editInfo = $cache->get( $key );
                if ( !is_object( $editInfo ) ) {
                        $start = microtime( true );
                        // We ignore user aborts and keep parsing. Block on any prior parsing
-                       // so as to use it's results and make use of the time spent parsing.
-                       if ( $wgMemc->lock( $key, 30, 30 ) ) {
-                               $editInfo = $wgMemc->get( $key );
-                               $wgMemc->unlock( $key );
+                       // so as to use its results and make use of the time spent parsing.
+                       // Skip this logic if there no master connection in case this method
+                       // is called on an HTTP GET request for some reason.
+                       $lb = wfGetLB();
+                       $dbw = $lb->getAnyOpenConnection( $lb->getWriterIndex() );
+                       if ( $dbw && $dbw->lock( $key, __METHOD__, 30 ) ) {
+                               $editInfo = $cache->get( $key );
+                               $dbw->unlock( $key, __METHOD__ );
                        }
                        $sec = microtime( true ) - $start;
                        if ( $sec > .01 ) {
-                               wfDebugLog( 'StashEdit', "Waited $sec seconds on '$key'." );
+                               $logger->warning( "Waited $sec seconds on '$key'." );
                        }
                }
 
                if ( !is_object( $editInfo ) || !$editInfo->output ) {
-                       wfDebugLog( 'StashEdit', "No cache value for key '$key'." );
+                       $logger->debug( "No cache value for key '$key'." );
                        return false;
                }
 
                $time = wfTimestamp( TS_UNIX, $editInfo->output->getTimestamp() );
                if ( ( time() - $time ) <= 3 ) {
-                       wfDebugLog( 'StashEdit', "Timestamp-based cache hit for key '$key'." );
+                       $logger->debug( "Timestamp-based cache hit for key '$key'." );
                        return $editInfo; // assume nothing changed
                }
 
@@ -300,7 +308,7 @@ class ApiStashEdit extends ApiBase {
                        }
 
                        if ( $changed || $res->numRows() != $templateUses ) {
-                               wfDebugLog( 'StashEdit', "Stale cache for key '$key'; template changed." );
+                               $logger->info( "Stale cache for key '$key'; template changed." );
                                return false;
                        }
                }
@@ -323,12 +331,12 @@ class ApiStashEdit extends ApiBase {
                        }
 
                        if ( $changed || $res->numRows() != count( $files ) ) {
-                               wfDebugLog( 'StashEdit', "Stale cache for key '$key'; file changed." );
+                               $logger->info( "Stale cache for key '$key'; file changed." );
                                return false;
                        }
                }
 
-               wfDebugLog( 'StashEdit', "Cache hit for key '$key'." );
+               $logger->debug( "Cache hit for key '$key'." );
 
                return $editInfo;
        }
@@ -426,6 +434,10 @@ class ApiStashEdit extends ApiBase {
                return true;
        }
 
+       function isWriteMode() {
+               return true;
+       }
+
        function isInternal() {
                return true;
        }
index 4d7fc5a..f92526d 100644 (file)
@@ -73,6 +73,19 @@ class ApiTokens extends ApiBase {
                        $types[$name] = array( 'ApiQueryInfo', 'get' . ucfirst( $name ) . 'Token' );
                }
                Hooks::run( 'ApiTokensGetTokenTypes', array( &$types ) );
+
+               // For forwards-compat, copy any token types from ApiQueryTokens that
+               // we don't already have something for.
+               $user = $this->getUser();
+               $request = $this->getRequest();
+               foreach ( ApiQueryTokens::getTokenTypeSalts() as $name => $salt ) {
+                       if ( !isset( $types[$name] ) ) {
+                               $types[$name] = function () use ( $salt, $user, $request ) {
+                                       return $user->getEditToken( $salt, $request );
+                               };
+                       }
+               }
+
                ksort( $types );
 
                return $types;
index 320649f..e76b365 100644 (file)
@@ -53,7 +53,6 @@ class ApiUpload extends ApiBase {
 
                // Copy the session key to the file key, for backward compatibility.
                if ( !$this->mParams['filekey'] && $this->mParams['sessionkey'] ) {
-                       $this->logFeatureUsage( 'action=upload&sessionkey' );
                        $this->mParams['filekey'] = $this->mParams['sessionkey'];
                }
 
@@ -363,6 +362,10 @@ class ApiUpload extends ApiBase {
                $data['invalidparameter'] = $parameter;
 
                $parsed = $this->parseMsg( $error );
+               if ( isset( $parsed['data'] ) ) {
+                       $data = array_merge( $data, $parsed['data'] );
+               }
+
                $this->dieUsage( $parsed['info'], $parsed['code'], 0, $data );
        }
 
@@ -624,7 +627,6 @@ class ApiUpload extends ApiBase {
        protected function transformWarnings( $warnings ) {
                if ( $warnings ) {
                        // Add indices
-                       $result = $this->getResult();
                        ApiResult::setIndexedTagName( $warnings, 'warning' );
 
                        if ( isset( $warnings['duplicate'] ) ) {
@@ -730,7 +732,6 @@ class ApiUpload extends ApiBase {
 
                // Deprecated parameters
                if ( $this->mParams['watch'] ) {
-                       $this->logFeatureUsage( 'action=upload&watch' );
                        $watch = true;
                }
 
@@ -836,7 +837,6 @@ class ApiUpload extends ApiBase {
                        'url' => null,
                        'filekey' => null,
                        'sessionkey' => array(
-                               ApiBase::PARAM_DFLT => null,
                                ApiBase::PARAM_DEPRECATED => true,
                        ),
                        'stash' => false,
index 85d051d..9eb5f2a 100644 (file)
@@ -85,7 +85,6 @@ class ApiWatch extends ApiBase {
                                );
                        }
 
-                       $this->logFeatureUsage( 'action=watch&title' );
                        $title = Title::newFromText( $params['title'] );
                        if ( !$title || !$title->isWatchable() ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
diff --git a/includes/api/i18n/bgn.json b/includes/api/i18n/bgn.json
new file mode 100644 (file)
index 0000000..4fe6a04
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Ibrahim khashrowdi"
+               ]
+       },
+       "apihelp-block-description": "کار زوروکئ بستین"
+}
index 6810235..9ed9dcb 100644 (file)
@@ -6,8 +6,14 @@
        },
        "apihelp-block-description": "Stankañ un implijer",
        "apihelp-block-param-reason": "Abeg evit stankañ.",
+       "apihelp-createaccount-param-name": "Anv implijer.",
        "apihelp-delete-description": "Diverkañ ur bajenn.",
+       "apihelp-edit-param-text": "Danvez ar bajenn.",
        "apihelp-edit-param-minor": "Kemmig dister.",
        "apihelp-edit-example-edit": "Kemmañ ur bajenn.",
-       "apihelp-expandtemplates-param-title": "Titl ar bajenn."
+       "apihelp-expandtemplates-param-title": "Titl ar bajenn.",
+       "apihelp-login-param-name": "Anv implijer.",
+       "apihelp-login-param-password": "Ger-tremen.",
+       "apihelp-login-example-login": "Kevreañ.",
+       "apihelp-protect-example-protect": "Gwareziñ ur bajenn."
 }
index 4aacd1a..837e3f9 100644 (file)
@@ -5,7 +5,8 @@
                        "Macofe",
                        "Xavier Dengra",
                        "F3RaN",
-                       "Eduardo Martinez"
+                       "Eduardo Martinez",
+                       "Fitoschido"
                ]
        },
        "apihelp-main-param-format": "El format de la sortida.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtra segons etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostra només els canvis de les pàgines enllaçades a aquesta pàgina.",
        "apihelp-feedrecentchanges-example-simple": "Mostra els canvis recents.",
+       "apihelp-help-description": "Mostra l’ajuda dels mòduls especificats.",
        "apihelp-help-example-recursive": "Tota l'ajuda en una sola pàgina.",
        "apihelp-import-param-rootpage": "Importa com a subpàgina d'aquesta pàgina.",
        "apihelp-login-param-name": "Nom d'usuari.",
        "apihelp-login-param-password": "Contrasenya.",
        "apihelp-login-example-login": "Inicia sessió.",
+       "apihelp-options-example-reset": "Reinicialitza totes les preferències.",
        "apihelp-protect-param-cascade": "Activa la protecció en cascada (és a dir, protegeix les plantilles i imatges utilitzades en aquesta pàgina). S'ignora si cap dels nivells de protecció suporta la protecció en cascada.",
        "apihelp-query+pageswithprop-example-generator": "Obtenir informació addicional sobre les 10 primeres pàgines utilitzant <code>__NOTOC__</code>.",
        "apihelp-query+watchlist-paramvalue-prop-title": "Afegeix el títol de la pàgina.",
index 1c3a1de..c1c38ca 100644 (file)
@@ -36,6 +36,8 @@
        "apihelp-block-example-user-complex": "Trvale zablokovat uživatele <kbd>Vandal</kbd> s odůvodněním <kbd>Vandalism</kbd> a zabránit vytváření nových účtů a odesílání e-mailů.",
        "apihelp-checktoken-param-type": "Typ testovaného tokenu.",
        "apihelp-checktoken-param-token": "Token, který se má otestovat.",
+       "apihelp-checktoken-param-maxtokenage": "Nejvyšší povolené stáří tokenu v sekundách.",
+       "apihelp-checktoken-example-simple": "Testuje správnost tokenu <kbd>csrf</kbd>.",
        "apihelp-compare-description": "Vrátí rozdíl dvou stránek.\n\nVe „from“ i „to“ musíte zadat číslo revize, název stránky nebo ID stránky.",
        "apihelp-compare-param-fromtitle": "Název první stránky k porovnání.",
        "apihelp-compare-param-fromid": "ID první stránky k porovnání.",
        "apihelp-watch-example-watch": "Sledovat stránku <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "Zobrazit prvních několik stránek z hlavního jmenného prostoru.",
        "apihelp-format-example-generic": "Výsledek dotazu vrátit ve formátu $1.",
-       "apihelp-dbg-description": "Vypisuje data ve formátu funkce <code>var_export()</code> z PHP.",
-       "apihelp-dbgfm-description": "Vypisuje data ve formátu funkce <code>var_export()</code> z PHP (v čitelné HTML podobě).",
        "apihelp-json-description": "Vypisuje data ve formátu JSON.",
        "apihelp-json-param-callback": "Pokud je uvedeno, obalí výstup do zadaného volání funkce. Z bezpečnostních důvodů budou omezena všechna data specifická pro uživatele.",
        "apihelp-json-param-utf8": "Pokud je uvedeno, bude většina ne-ASCII znaků (ale ne všechny) kódována v UTF-8 místo nahrazení hexadecimálními escape sekvencemi. Implicitní chování, pokud není <var>formatversion</var> nastaveno na <kbd>1</kbd>.",
        "apihelp-php-description": "Vypisuje data v serializačním formátu PHP.",
        "apihelp-phpfm-description": "Vypisuje data v serializačním formátu PHP (v čitelné HTML podobě).",
        "apihelp-rawfm-description": "Data včetně ladicích prvků vypisuje ve formátu JSON (v čitelné HTML podobě).",
-       "apihelp-txt-description": "Vypisuje data ve formátu funkce <code>print_r()</code> z PHP.",
-       "apihelp-txtfm-description": "Vypisuje data ve formátu funkce <code>print_r()</code> z PHP (v čitelné HTML podobě).",
        "apihelp-xml-description": "Vypisuje data ve formátu XML.",
        "apihelp-xml-param-xslt": "Pokud je uvedeno, přidá uvedenou stránku jako stylopis XSL. Hodnotou musí být název stránky ve jmenném prostoru MediaWiki, jejíž název končí na <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Pokud je uvedeno, přidá jmenný prostor XML.",
        "apihelp-xmlfm-description": "Vypisuje data ve formátu XML (v čitelné HTML podobě).",
-       "apihelp-yaml-description": "Vypisuje data ve formátu YAML.",
-       "apihelp-yamlfm-description": "Vypisuje data ve formátu YAML (v čitelné HTML podobě).",
        "api-format-title": "Odpověď z MediaWiki API",
        "api-format-prettyprint-header": "Toto je HTML reprezentace formátu $1. HTML se hodí pro ladění, ale pro aplikační použití je nevhodné.\n\nPro změnu výstupního formátu uveďte parametr <var>format</var>. Abyste viděli ne-HTML reprezentaci formátu $1, nastavte <kbd>format=$2</kbd>.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo v [[Special:ApiHelp/main|nápovědě k API]].",
        "api-format-prettyprint-header-only-html": "Toto je HTML reprezentace určená pro ladění, která není vhodná pro použití v aplikacích.\n\nVíce informací najdete v [[mw:API|úplné dokumentaci]] nebo [[Special:ApiHelp/main|dokumentaci API]].",
index f95e12a..2398d6d 100644 (file)
@@ -13,7 +13,9 @@
                        "Andreasburmeister",
                        "Anomie",
                        "Duder",
-                       "Ljonka"
+                       "Ljonka",
+                       "FriedhelmW",
+                       "Predatorix"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page/de|Dokumentation]]\n* [[mw:API:FAQ/de|Häufig gestellte Fragen]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailingliste]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API-Ankündigungen]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fehlerberichte und Anfragen]\n</div>\n<strong>Status:</strong> Alle auf dieser Seite gezeigten Funktionen sollten funktionieren, allerdings ist die API in aktiver Entwicklung und kann sich zu jeder Zeit ändern. Abonniere die [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ MediaWiki-API-Ankündigungs-Mailingliste], um über Aktualisierungen informiert zu werden.\n\n<strong>Fehlerhafte Anfragen:</strong> Wenn fehlerhafte Anfragen an die API gesendet werden, wird ein HTTP-Header mit dem Schlüssel „MediaWiki-API-Error“ gesendet. Der Wert des Headers und der Fehlercode werden auf den gleichen Wert gesetzt. Für weitere Informationen siehe [[mw:API:Errors_and_warnings|API: Fehler und Warnungen]].",
@@ -73,6 +75,7 @@
        "apihelp-delete-param-title": "Titel der Seite, die gelöscht werden soll. Kann nicht zusammen mit <var>$1pageid</var> verwendet werden.",
        "apihelp-delete-param-pageid": "Seitennummer der Seite, die gelöscht werden soll. Kann nicht zusammen mit <var>$1title</var> verwendet werden.",
        "apihelp-delete-param-reason": "Löschbegründung. Falls nicht festgelegt, wird eine automatisch generierte Begründung verwendet.",
+       "apihelp-delete-param-tags": "Ändere die Schlagworte, die auf den Eintrag im Lösch-Logbuch anzuwenden sind.",
        "apihelp-delete-param-watch": "Seite auf die Beobachtungsliste des aktuellen Benutzers setzen.",
        "apihelp-delete-param-watchlist": "Seite zur Beobachtungsliste des aktuellen Benutzers hinzufügen oder von ihr entfernen, die Standardeinstellungen verwenden oder die Beobachtung nicht ändern.",
        "apihelp-delete-param-unwatch": "Seite von der Beobachtungsliste entfernen.",
@@ -87,6 +90,7 @@
        "apihelp-edit-param-sectiontitle": "Die Überschrift für einen neuen Abschnitt.",
        "apihelp-edit-param-text": "Seiteninhalt.",
        "apihelp-edit-param-summary": "Bearbeitungszusammenfassung. Auch Abschnittsüberschrift, wenn $1section=new und $1sectiontitle nicht festgelegt ist.",
+       "apihelp-edit-param-tags": "Auf die Version anzuwendende Änderungsmarkierungen.",
        "apihelp-edit-param-minor": "Kleine Bearbeitung.",
        "apihelp-edit-param-notminor": "Nicht-kleine Bearbeitung.",
        "apihelp-edit-param-bot": "Diese Bearbeitung als Bot-Bearbeitung markieren.",
        "apihelp-expandtemplates-param-title": "Titel der Seite.",
        "apihelp-expandtemplates-param-text": "Zu konvertierender Wikitext.",
        "apihelp-expandtemplates-param-revid": "Versionsnummer, die für die Anzeige von <nowiki>{{REVISIONID}}</nowiki> und ähnlichen Variablen verwendet wird.",
+       "apihelp-expandtemplates-param-prop": "Welche Informationen abgerufen werden sollen.\n\nBeachte bitte, dass das Ergebnis Wikitext enthält, aber die Ausgabe in einem veralteten Format ist, falls keine Werte ausgewählt sind.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Der expandierte Wikitext.",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "Kategorien in der Eingabe vorhanden, die nicht in der Ausgabe des Wikitextes vertreten sind.",
+       "apihelp-expandtemplates-paramvalue-prop-properties": "Seiteneigenschaften, die durch expandierte magische Wörter im Wikitext definiert sind.",
+       "apihelp-expandtemplates-paramvalue-prop-volatile": "Ob die Ausgabe flüchtig ist und nicht an anderer Stelle auf der Seite wiederverwendet werden sollte.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Die maximale Zeit, nach der der Ergebnis-Cache ungültig wird.",
+       "apihelp-expandtemplates-paramvalue-prop-modules": "Etwaige Ressourcen-Lader-Module, die Parserfunktionen angefordert haben, werden zur Ausgabe hinzugefügt. Entweder <kbd>jsconfigvars</kbd> oder <kbd>encodedjsconfigvars</kbd> müssen gemeinsam mit <kbd>modules</kbd> angefordert werden.",
+       "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite aus.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Der XML-Parserbaum der Eingabe.",
        "apihelp-expandtemplates-param-includecomments": "Ob HTML-Kommentare in der Ausgabe eingeschlossen werden sollen.",
        "apihelp-expandtemplates-param-generatexml": "XML-Parserbaum erzeugen (ersetzt durch $1prop=parsetree).",
        "apihelp-feedrecentchanges-param-hideliu": "Änderungen von registrierten Benutzern ausblenden.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Kontrollierte Änderungen ausblenden.",
        "apihelp-feedrecentchanges-param-hidemyself": "Änderungen des aktuellen Benutzers ausblenden.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Änderungen der Kategorie-Zugehörigkeit verstecken.",
        "apihelp-feedrecentchanges-param-tagfilter": "Nach Markierung filtern.",
        "apihelp-feedrecentchanges-param-target": "Nur Änderungen an Seiten anzeigen, die von dieser Seite verlinkt sind.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Zeige Änderungen an Seiten die von der ausgewählten Seite verlinkt sind.",
+       "apihelp-feedrecentchanges-param-categories": "Zeigt nur Änderungen von Seiten in all diesen Kategorien.",
+       "apihelp-feedrecentchanges-param-categories_any": "Zeigt stattdessen nur Änderungen auf Seiten in einer dieser Kategorien.",
        "apihelp-feedrecentchanges-example-simple": "Letzte Änderungen anzeigen",
        "apihelp-feedrecentchanges-example-30days": "Letzte Änderungen für 30 Tage anzeigen",
        "apihelp-feedwatchlist-description": "Gibt einen Beobachtungslisten-Feed zurück.",
        "apihelp-help-param-wrap": "Die Ausgabe in eine Standard-API-Antwort-Struktur einschließen.",
        "apihelp-help-param-toc": "Ein Inhaltsverzeichnis in der HTML-Ausgabe einschließen.",
        "apihelp-help-example-main": "Hilfe für das Hauptmodul",
+       "apihelp-help-example-submodules": "Hilfe für <kbd>action=query</kbd> und all seine Untermodule.",
        "apihelp-help-example-recursive": "Alle Hilfen in einer Seite",
        "apihelp-help-example-help": "Hilfe für das Hilfemodul selbst",
        "apihelp-help-example-query": "Hilfe für zwei Abfrage-Submodule",
        "apihelp-logout-description": "Abmelden und alle Sitzungsdaten löschen.",
        "apihelp-logout-example-logout": "Meldet den aktuellen Benutzer ab",
        "apihelp-managetags-description": "Ermöglicht Verwaltungsaufgaben zu Änderungsmarkierungen.",
+       "apihelp-managetags-param-operation": "Welcher Vorgang soll ausgeführt werden:\n;create:Ein neues Änderungsschlagwort zum manuellen Gebrauch erstellen.\n;delete:Ein Änderungsschlagwort aus der Datenbank entfernen. Einschließlich dem Entfernen des Schlagworts von allen Überarbeitungen, kürzlichen Änderungseinträgen und Logbuch-Einträgen, in denen es genutzt wird.\n;activate:Ein Änderungsschlagwort aktivieren und damit Benutzern erlauben es manuell anzuwenden.\n;deactive:Ein Änderungsschlagwort deaktivieren und damit die manuelle Verwendung durch Benutzer unterbinden.",
+       "apihelp-managetags-param-tag": "Schlagwort zum Erstellen, Löschen, Aktivieren oder Deaktivieren. Zum Erstellen darf das Schlagwort noch nicht vorhanden sein. Zur Löschung muss das Schlagwort vorhanden sein. Zur Aktivierung muss das Schlagwort vorhanden sein, darf aber nicht von einer Erweiterung in Gebrauch sein. Zur Deaktivierung muss das Schlagwort gegenwärtig aktiv und manuell definiert sein.",
        "apihelp-managetags-param-reason": "optionale Begründung für das Erstellen, Löschen, Aktivieren oder Deaktivieren der Markierung.",
        "apihelp-managetags-param-ignorewarnings": "Warnungen während des Vorgangs ignorieren.",
        "apihelp-managetags-example-create": "Erstellt eine Markierung namens <kbd>spam</kbd> mit der Begründung <kbd>For use in edit patrolling</kbd> (für die Eingangskontrolle).",
        "apihelp-opensearch-param-limit": "Maximale Anzahl zurückzugebender Ergebnisse.",
        "apihelp-opensearch-param-namespace": "Zu durchsuchende Namensräume.",
        "apihelp-opensearch-param-suggest": "Nichts unternehmen, falls <var>[[mw:Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> falsch ist.",
+       "apihelp-opensearch-param-redirects": "Wie mit Weiterleitungen umgegangen werden soll:\n;return:Gibt die Weiterleitung selbst zurück.\n;resolve:Gibt die Zielseite zurück. Kann weniger als $1limit Ergebnisse zurückgeben.\nAus Kompatibilitätsgründen ist für $1format=json die Vorgabe \"return\" und \"resolve\" für alle anderen Formate.",
        "apihelp-opensearch-param-format": "Das Format der Ausgabe.",
+       "apihelp-opensearch-param-warningsaserror": "Wenn Warnungen mit <kbd>format=json</kbd> auftreten, gib einen API-Fehler zurück, anstatt ihn zu ignorieren.",
        "apihelp-opensearch-example-te": "Seiten finden, die mit <kbd>Te</kbd> beginnen.",
+       "apihelp-options-description": "Die Voreinstellungen des gegenwärtigen Benutzers ändern.",
        "apihelp-options-param-reset": "Setzt die Einstellungen auf Websitestandards zurück.",
+       "apihelp-options-param-resetkinds": "Liste von zurückzusetzenden Optionstypen, wenn die <var>$1reset</var>-Option ausgewählt ist.",
+       "apihelp-options-param-change": "Liste von Änderungen, die mit Name=Wert formatiert sind (z.B. skin=vector). Wert darf keine Verkettungszeichen enthalten. Falls kein Wert angegeben wurde (nichtmal ein Gleichheitszeichen), z.B.: optionname|otheroption|..., wird die Option auf ihren Vorgabewert zurückgesetzt.",
+       "apihelp-options-param-optionvalue": "Der Wert für die Option, die durch <var>$1optionname</var> festgelegt wird, darf Verkettungszeichen enthalten.",
        "apihelp-options-example-reset": "Alle Einstellungen zurücksetzen",
        "apihelp-options-example-change": "Ändert die Einstellungen <kbd>skin</kbd> und <kbd>hideminor</kbd>.",
        "apihelp-options-example-complex": "Setzt alle Einstellungen zurück, dann <kbd>skin</kbd> und <kbd>nickname</kbd> festlegen.",
        "apihelp-paraminfo-description": "Ruft Informationen über API-Module ab.",
        "apihelp-paraminfo-param-helpformat": "Format der Hilfe-Zeichenfolgen.",
        "apihelp-parse-param-summary": "Zu parsende Zusammenfassung.",
+       "apihelp-parse-param-prop": "Welche Informationen bezogen werden sollen:",
+       "apihelp-parse-paramvalue-prop-text": "Gibt den geparsten Text des Wikitextes zurück.",
        "apihelp-parse-paramvalue-prop-langlinks": "Gibt die Sprachlinks im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-categories": "Gibt die Kategorien im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-categorieshtml": "Gibt die HTML-Version der Kategorien zurück.",
        "apihelp-parse-paramvalue-prop-templates": "Gibt die Vorlagen im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-images": "Gibt die Bilder im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-externallinks": "Gibt die externen Links im geparsten Wikitext zurück.",
+       "apihelp-parse-paramvalue-prop-sections": "Gibt die Abschnitte im geparsten Wikitext zurück.",
        "apihelp-parse-paramvalue-prop-revid": "Ergänzt die Versionskennung der geparsten Seite.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Ergänzt den Titel des geparsten Wikitextes.",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "Gibt die JavaScript-Konfigurationsvariablen speziell für die Seite als JSON-Zeichenfolge aus.",
+       "apihelp-parse-paramvalue-prop-indicators": "Gibt das HTML der Seitenstatusindikatoren zurück, die auf der Seite verwendet werden.",
+       "apihelp-parse-paramvalue-prop-iwlinks": "Gibt Interwiki-Links des geparsten Wikitextes zurück.",
+       "apihelp-parse-paramvalue-prop-wikitext": "Gibt den originalen Wikitext zurück, der geparst wurde.",
+       "apihelp-parse-paramvalue-prop-properties": "Gibt verschiedene Eigenschaften zurück, die im geparsten Wikitext definiert sind.",
        "apihelp-parse-param-section": "Parst nur den Inhalt dieser Abschnittsnummer.\n\nFalls <kbd>new</kbd>, parst <var>$1text</var> und <var>$1sectiontitle</var>, als ob ein neuer Abschnitt der Seite hinzugefügt wird.\n\n<kbd>new</kbd> ist nur erlaubt mit der Angabe <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Überschrift des neuen Abschnittes, wenn <var>section</var> = <kbd>new</kbd> ist.\n\nAnders als beim Bearbeiten der Seite wird der Parameter nicht durch die <var>summary</var> ersetzt, wenn er weggelassen oder leer ist.",
        "apihelp-parse-param-disableeditsection": "Lässt Abschnittsbearbeitungslinks in der Parserausgabe weg.",
        "apihelp-query+allimages-description": "Alle Bilder nacheinander auflisten.",
        "apihelp-query+allimages-param-sort": "Eigenschaft, nach der sortiert werden soll.",
        "apihelp-query+allimages-param-dir": "Aufzählungsrichtung.",
+       "apihelp-query+allimages-param-minsize": "Beschränkt auf Bilder mit mindestens dieser Anzahl an Bytes.",
+       "apihelp-query+allimages-param-maxsize": "Beschränkt auf Bilder mit höchstens dieser Anzahl an Bytes.",
        "apihelp-query+allimages-param-sha1": "SHA1-Hash des Bildes. Überschreibt $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "SHA1-Hash des Bildes (Basis 36; verwendet in MediaWiki).",
        "apihelp-query+allimages-param-limit": "Wie viele Gesamtbilder zurückgegeben werden sollen.",
        "apihelp-query+logevents-description": "Ereignisse von den Logbüchern abrufen.",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Fügt die Seitenkennung hinzu.",
        "apihelp-query+prefixsearch-param-search": "Such-Zeichenfolge.",
+       "apihelp-query+recentchanges-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel für die Bearbeitung.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Listet Markierungen für den Eintrag auf.",
+       "apihelp-query+recentchanges-example-simple": "Listet die letzten Änderungen auf.",
+       "apihelp-query+redirects-paramvalue-prop-pageid": "Seitenkennung einer jeden Weiterleitung.",
+       "apihelp-query+redirects-paramvalue-prop-title": "Titel einer jeden Weiterleitung.",
+       "apihelp-query+revisions+base-paramvalue-prop-ids": "Die Kennung der Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "Der Zeitstempel der Version.",
+       "apihelp-query+revisions+base-paramvalue-prop-size": "Länge in Bytes der Version.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "Text der Version.",
        "apihelp-query+search-param-prop": "Eigenschaften zur Rückgabe:",
        "apihelp-query+search-example-simple": "Nach <kbd>meaning</kbd> suchen.",
        "apihelp-query+usercontribs-param-start": "Der zurückzugebende Start-Zeitstempel.",
        "apihelp-query+usercontribs-param-end": "Der zurückzugebende End-Zeitstempel.",
        "apihelp-query+usercontribs-param-user": "Die Benutzer, für die Beiträge abgerufen werden sollen.",
-       "apihelp-query+usercontribs-paramvalue-prop-ids": "Ergänzt die Seiten- und Versionskennung.",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "Fügt die Seiten- und Versionskennung hinzu.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Ergänzt den Zeitstempel der Bearbeitung.",
-       "apihelp-query+usercontribs-paramvalue-prop-comment": "Ergänzt den Kommentar der Bearbeitung.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Fügt den Kommentar der Bearbeitung hinzu.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Ergänzt den Bearbeitungszähler des aktuellen Benutzers.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Fügt den bürgerlichen Namen des Benutzers hinzu.",
        "apihelp-query+userinfo-example-simple": "Informationen über den aktuellen Benutzer abrufen",
        "apihelp-userrights-param-user": "Benutzername.",
        "apihelp-userrights-param-userid": "Benutzerkennung.",
        "apihelp-watch-example-watch": "Die Seite <kbd>Main Page</kbd> beobachten.",
+       "apihelp-watch-example-unwatch": "Die Seite <kbd>Main Page</kbd> nicht beobachten.",
        "apihelp-format-example-generic": "Das Abfrageergebnis im $1-Format ausgeben.",
-       "apihelp-dbg-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben.",
-       "apihelp-dbgfm-description": "Daten im PHP-<code>var_export()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-json-description": "Daten im JSON-Format ausgeben.",
        "apihelp-json-param-callback": "Falls angegeben, wird die Ausgabe in einen angegebenen Funktionsaufruf eingeschlossen. Aus Sicherheitsgründen sind benutzerspezifische Daten beschränkt.",
        "apihelp-json-param-utf8": "Falls angegeben, kodiert die meisten (aber nicht alle) Nicht-ASCII-Zeichen als UTF-8 anstatt sie mit hexadezimalen Escape-Sequenzen zu ersetzen. Standard, wenn <var>formatversion</var> nicht <kbd>1</kbd> ist.",
        "apihelp-php-description": "Daten im serialisierten PHP-Format ausgeben.",
        "apihelp-phpfm-description": "Daten im serialisierten PHP-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-rawfm-description": "Daten, einschließlich Fehlerbehebungselementen, im JSON-Format ausgeben (schöngedruckt in HTML).",
-       "apihelp-txt-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben.",
-       "apihelp-txtfm-description": "Daten im PHP-<code>print_r()</code>-Format ausgeben (schöngedruckt in HTML).",
        "apihelp-xml-description": "Daten im XML-Format ausgeben.",
        "apihelp-xml-param-xslt": "Falls angegeben, fügt die benannte Seite als XSL-Stylesheet hinzu. Der Wert muss ein Titel im Namensraum „{{ns:mediawiki}}“ sein und mit <code>.xsl</code> enden.",
        "apihelp-xml-param-includexmlnamespace": "Falls angegeben, ergänzt einen XML-Namensraum.",
        "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).",
-       "apihelp-yaml-description": "Daten im YAML-Format ausgeben.",
-       "apihelp-yamlfm-description": "Daten im YAML-Format ausgeben (schöngedruckt in HTML).",
        "api-format-title": "MediaWiki-API-Ergebnis",
        "api-format-prettyprint-header": "Dies ist die HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege <kbd>format=$2</kbd> fest.\n\nSiehe die [[mw:API|vollständige Dokumentation]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
        "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.",
        "api-help-param-deprecated": "Veraltet.",
        "api-help-param-required": "Dieser Parameter ist erforderlich.",
        "api-help-datatypes-header": "Datentypen",
+       "api-help-param-type-limit": "Typ: Ganzzahl oder <kbd>max</kbd>",
+       "api-help-param-type-integer": "Typ: {{PLURAL:$1|1=Ganzzahl|2=Liste von Ganzzahlen}}",
        "api-help-param-list": "{{PLURAL:$1|1=Einer der folgenden Werte|2=Werte (mit <kbd>{{!}}</kbd> trennen)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Muss leer sein|Kann leer sein oder $2}}",
        "api-help-param-limit": "Nicht mehr als $1 erlaubt.",
        "api-help-param-default": "Standard: $1",
        "api-help-param-default-empty": "Standard: <span class=\"apihelp-empty\">(leer)</span>",
        "api-help-param-token": "Ein „$1“-Token abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
+       "api-help-param-token-webui": "Aus Kompatibilitätsgründen wird der in der Weboberfläche verwendete Token ebenfalls akzeptiert.",
+       "api-help-param-disabled-in-miser-mode": "Deaktiviert aufgrund des [[mw:Manual:$wgMiserMode|Miser-Modus]].",
+       "api-help-param-continue": "Falls weitere Ergebnisse verfügbar sind, dies zum Fortfahren verwenden.",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(keine Beschreibung)</span>",
        "api-help-examples": "{{PLURAL:$1|Beispiel|Beispiele}}:",
        "api-help-permissions": "{{PLURAL:$1|Berechtigung|Berechtigungen}}:",
diff --git a/includes/api/i18n/diq.json b/includes/api/i18n/diq.json
new file mode 100644 (file)
index 0000000..c737355
--- /dev/null
@@ -0,0 +1,33 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Gorizon",
+                       "Mirzali"
+               ]
+       },
+       "apihelp-createaccount-param-name": "Nameyê karberi.",
+       "apihelp-delete-description": "Pele bestere.",
+       "apihelp-disabled-description": "Eno modul aktiv niyo.",
+       "apihelp-edit-description": "Vıraze û pelan bıvurne.",
+       "apihelp-edit-param-text": "Zerreki pele",
+       "apihelp-edit-param-minor": "Vurnayışo qıckek.",
+       "apihelp-edit-param-notminor": "Vurnayışo qıckek niyo.",
+       "apihelp-edit-param-bot": "Nê vurnayışi zey boti nişan ke.",
+       "apihelp-edit-example-edit": "Şeker bıvurne",
+       "apihelp-emailuser-description": "Yew karberi rê e-poste bırışe.",
+       "apihelp-emailuser-param-target": "Karbero ke cı rê e-poste do bırışiyo.",
+       "apihelp-emailuser-param-subject": "Sernameyê mewzuyi.",
+       "apihelp-emailuser-param-text": "Metınê e-posteyi.",
+       "apihelp-emailuser-param-ccme": "Yew kopyaya nê posteyi mı rê bırışe.",
+       "apihelp-expandtemplates-param-title": "Sernameyê pele.",
+       "apihelp-expandtemplates-param-text": "Wikimetıni açarnê.",
+       "apihelp-feedrecentchanges-param-hideminor": "Vurnayışanê qıckekan bınımne.",
+       "apihelp-feedrecentchanges-param-hidebots": "Vurnayışanê botan bınımne.",
+       "apihelp-feedrecentchanges-param-hideanons": "Vurnayışanê karberanê anoniman bınımne.",
+       "apihelp-feedrecentchanges-param-hideliu": "Vurnayışanê karberanê qeydınan bınımne.",
+       "apihelp-login-param-name": "Nameyê karberi.",
+       "apihelp-login-param-password": "Parola.",
+       "apihelp-login-param-domain": "Domain (optional).",
+       "apihelp-login-example-login": "Dekew.",
+       "apihelp-move-description": "Yew pele bere."
+}
index 450d83a..897c05e 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filter by tag.",
        "apihelp-feedrecentchanges-param-target": "Show only changes on pages linked from this page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Show changes on pages linked to the selected page instead.",
+       "apihelp-feedrecentchanges-param-categories": "Show only changes on pages in all of these categories.",
+       "apihelp-feedrecentchanges-param-categories_any": "Show only changes on pages in any of the categories instead.",
        "apihelp-feedrecentchanges-example-simple": "Show recent changes.",
        "apihelp-feedrecentchanges-example-30days": "Show recent changes for 30 days.",
 
        "apihelp-help-param-wrap": "Wrap the output in a standard API response structure.",
        "apihelp-help-param-toc": "Include a table of contents in the HTML output.",
        "apihelp-help-example-main": "Help for the main module.",
+       "apihelp-help-example-submodules": "Help for <kbd>action=query</kbd> and all its submodules.",
        "apihelp-help-example-recursive": "All help in one page.",
        "apihelp-help-example-help": "Help for the help module itself.",
        "apihelp-help-example-query": "Help for two query submodules.",
        "apihelp-query+allusers-paramvalue-prop-rights": "Lists rights that the user has.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "Adds the edit count of the user.",
        "apihelp-query+allusers-paramvalue-prop-registration": "Adds the timestamp of when the user registered if available (may be blank).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "Adds the central IDs and attachment status for the user.",
        "apihelp-query+allusers-param-limit": "How many total user names to return.",
        "apihelp-query+allusers-param-witheditsonly": "Only list users who have made edits.",
        "apihelp-query+allusers-param-activeusers": "Only list users active in the last $1 {{PLURAL:$1|day|days}}.",
+       "apihelp-query+allusers-param-attachedwiki": "With <kbd>$1prop=centralids</kbd>, also indicate whether the user is attached with the wiki identified by this ID.",
        "apihelp-query+allusers-example-Y": "List users starting at <kbd>Y</kbd>.",
 
        "apihelp-query+backlinks-description": "Find all pages that link to the given page.",
        "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Echoes the <code>Accept-Language</code> header sent by the client in a structured format.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Adds the user's registration date.",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "Adds the central IDs and attachment status for the user.",
+       "apihelp-query+userinfo-param-attachedwiki": "With <kbd>$1prop=centralids</kbd>, indicate whether the user is attached with the wiki identified by this ID.",
        "apihelp-query+userinfo-example-simple": "Get information about the current user.",
        "apihelp-query+userinfo-example-data": "Get additional information about the current user.",
 
        "apihelp-query+users-paramvalue-prop-registration": "Adds the user's registration timestamp.",
        "apihelp-query+users-paramvalue-prop-emailable": "Tags if the user can and wants to receive email through [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
+       "apihelp-query+users-paramvalue-prop-centralids": "Adds the central IDs and attachment status for the user.",
+       "apihelp-query+users-param-attachedwiki": "With <kbd>$1prop=centralids</kbd>, indicate whether the user is attached with the wiki identified by this ID.",
        "apihelp-query+users-param-users": "A list of users to obtain information for.",
        "apihelp-query+users-param-token": "Use <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> instead.",
        "apihelp-query+users-example-simple": "Return information for user <kbd>Example</kbd>.",
        "apihelp-watch-example-generator": "Watch the first few pages in the main namespace.",
 
        "apihelp-format-example-generic": "Return the query result in the $1 format.",
-       "apihelp-dbg-description": "Output data in PHP's <code>var_export()</code> format.",
-       "apihelp-dbgfm-description": "Output data in PHP's <code>var_export()</code> format (pretty-print in HTML).",
        "apihelp-json-description": "Output data in JSON format.",
        "apihelp-json-param-callback": "If specified, wraps the output into a given function call. For safety, all user-specific data will be restricted.",
        "apihelp-json-param-utf8": "If specified, encodes most (but not all) non-ASCII characters as UTF-8 instead of replacing them with hexadecimal escape sequences. Default when <var>formatversion</var> is not <kbd>1</kbd>.",
        "apihelp-php-param-formatversion": "Output formatting:\n;1:Backwards-compatible format (XML-style booleans, <samp>*</samp> keys for content nodes, etc.).\n;2:Experimental modern format. Details may change!\n;latest:Use the latest format (currently <kbd>2</kbd>), may change without warning.",
        "apihelp-phpfm-description": "Output data in serialized PHP format (pretty-print in HTML).",
        "apihelp-rawfm-description": "Output data, including debugging elements, in JSON format (pretty-print in HTML).",
-       "apihelp-txt-description": "Output data in PHP's <code>print_r()</code> format.",
-       "apihelp-txtfm-description": "Output data in PHP's <code>print_r()</code> format (pretty-print in HTML).",
        "apihelp-xml-description": "Output data in XML format.",
        "apihelp-xml-param-xslt": "If specified, adds the named page as an XSL stylesheet. The value must be a title in the {{ns:mediawiki}} namespace ending in <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "If specified, adds an XML namespace.",
        "apihelp-xmlfm-description": "Output data in XML format (pretty-print in HTML).",
-       "apihelp-yaml-description": "Output data in YAML format.",
-       "apihelp-yamlfm-description": "Output data in YAML format (pretty-print in HTML).",
 
        "api-format-title": "MediaWiki API result",
        "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set <kbd>format=$2</kbd>.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
index ff80444..91d8faf 100644 (file)
        "apihelp-help-param-helpformat": "Formato de salida de la ayuda.",
        "apihelp-help-param-toc": "Incluir una tabla de contenidos en la salida HTML.",
        "apihelp-help-example-main": "Ayuda del módulo principal",
+       "apihelp-help-example-submodules": "Ayuda para <kbd>action=query</kbd> y todos sus submódulos.",
        "apihelp-help-example-recursive": "Toda la ayuda en una página",
        "apihelp-help-example-help": "Ayuda del módulo de ayuda en sí",
        "apihelp-help-example-query": "Ayuda para dos submódulos de consulta.",
index b6a64dd..079eeb2 100644 (file)
@@ -2,9 +2,12 @@
        "@metadata": {
                "authors": [
                        "Subi",
-                       "Sator"
+                       "Sator",
+                       "An13sa"
                ]
        },
+       "apihelp-main-param-action": "Zein ekintza burutuko da.",
+       "apihelp-main-param-format": "Irteerako formatua.",
        "apihelp-block-description": "Blokeatu erabiltzaile bat.",
        "apihelp-block-param-reason": "Blokeatzeko arrazoia.",
        "apihelp-createaccount-description": "Erabiltzaile kontu berria sortu.",
        "apihelp-createaccount-param-email": "Erabiltzailearen helbide elektronikoa (aukerakoa).",
        "apihelp-createaccount-param-realname": "Erabiltzailearen benetako izena (aukerakoa).",
        "apihelp-delete-description": "Orrialde bat ezabatu.",
+       "apihelp-delete-example-simple": "Ezabatu <kbd>Main Page</kbd>.",
+       "apihelp-disabled-description": "Modulu hau ezgaitu da.",
        "apihelp-edit-description": "Orrialdeak sortu eta aldatu.",
+       "apihelp-edit-param-sectiontitle": "Atal berri baten titulua.",
+       "apihelp-edit-param-text": "Orrialdearen edukia.",
        "apihelp-edit-param-minor": "Aldaketa txikia.",
        "apihelp-edit-example-edit": "Orrialde bat aldatu",
        "apihelp-emailuser-description": "Erabiltzaileari e-maila bidali",
+       "apihelp-emailuser-param-subject": "Gaiaren goiburua.",
+       "apihelp-emailuser-param-text": "Mezuaren gorputza.",
        "apihelp-expandtemplates-param-title": "Orrialdearen izenburua.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "Wikitestu zabaldua.",
        "apihelp-feedcontributions-param-year": "Urtetik aurrera (eta lehenagotik)",
        "apihelp-feedcontributions-param-month": "Hilabetetik aurrera (eta lehenagotik)",
        "apihelp-feedrecentchanges-param-hideminor": "Ezkutatu aldaketa txikiak.",
        "apihelp-feedrecentchanges-example-simple": "Erakutsi aldaketa berriak",
        "apihelp-feedrecentchanges-example-30days": "Erakutsi aldaketa berriak 30 egunez",
        "apihelp-filerevert-param-comment": "Iruzkina igo.",
+       "apihelp-help-example-recursive": "Laguntza guztia orrialde batean.",
        "apihelp-imagerotate-description": "Irudi bat edo gehiago biratu.",
+       "apihelp-import-param-summary": "Inportazioaren laburpena.",
+       "apihelp-import-param-xml": "XML fitxategia igo da.",
        "apihelp-login-param-name": "Erabiltzaile izena.",
        "apihelp-login-param-password": "Pasahitza.",
        "apihelp-login-param-domain": "Domeinua (hautazkoa).",
        "apihelp-login-example-login": "Saioa hasi",
        "apihelp-move-description": "Orrialde bat mugitu",
        "apihelp-move-param-reason": "Berrizenpenaren arrazoia.",
+       "apihelp-move-param-noredirect": "Birzuzenketarik ez sortu.",
+       "apihelp-move-param-ignorewarnings": "Edozein ohar ezikusi.",
+       "apihelp-opensearch-param-namespace": "Bilatzeko izen-tarteak.",
+       "apihelp-opensearch-param-format": "Irteerako formatua.",
        "apihelp-options-example-reset": "Berrezarri hobespen guztiak.",
+       "apihelp-paraminfo-description": "API moduluei buruzko informazioa eskuratu.",
+       "apihelp-parse-param-summary": "Analizatzeko laburpena.",
+       "apihelp-protect-param-reason": "Babesteko edo babesa kentzeko zergatia.",
        "apihelp-protect-example-protect": "Orrialde bat babestu",
+       "apihelp-query+allcategories-description": "Kategoria guztiak zenbakitu.",
        "apihelp-query+allusers-param-witheditsonly": "Bakarrik zerrendatu aldaketak egin dituzten erabiltzaileak.",
        "apihelp-query+allusers-param-activeusers": "Bakarrik zerrendatu azken {{PLURAL:$1|eguneko|$1 egunetako}} erabiltzaile aktiboak.",
+       "apihelp-query+blocks-description": "Zerrendatu blokeatutako erabiltzaile eta IP helbide guztiak.",
        "apihelp-query+imageinfo-param-urlheight": "$1urlwidth-en antzekoa.",
        "apihelp-query+imageusage-example-simple": "Erakutsi [[:File:Albert Einstein Head.jpg]] darabilten orriak",
        "apihelp-query+langlinks-param-inlanguagecode": "Hizkuntza izenak aurkitzeko hizkuntza kodea.",
        "apihelp-query+prefixsearch-param-search": "Bilatu katea.",
        "apihelp-query+protectedtitles-example-simple": "Zerrendatu babestutako izenburuak",
        "apihelp-query+recentchanges-example-simple": "Zerrendatu aldaketa berriak.",
+       "apihelp-query+revisions-example-last5": "<kbd>Orrialde Nagusiaren</kbd> azken 5 berrikuspenak eskuratu.",
+       "apihelp-query+revisions-example-first5": "<kbd>Orrialde Nagusiaren</kbd> lehen 5 berrikuspenak eskuratu.",
+       "apihelp-upload-param-file": "Fitxategiaren edukia.",
        "apihelp-upload-example-url": "Igo URL batetik.",
        "apihelp-userrights-param-reason": "Aldaketarako arrazoia.",
        "api-help-main-header": "Modulu nagusia",
        "api-help-flag-deprecated": "Modulu hau zaharkitua dago.",
+       "api-help-source": "Iturria: $1",
+       "api-help-source-unknown": "Iturria: <span class=\"apihelp-unknown\">ezezaguna</span>",
+       "api-help-license": "Lizentzia: [[$1|$2]]",
+       "api-help-license-noname": "Lizentzia: [[$1|Ikusi esteka]]",
+       "api-help-license-unknown": "Lizentzia: <span class=\"apihelp-unknown\">ezezaguna</span>",
        "api-help-parameters": "{{PLURAL:$1|Parametroa|Parametroak}}:",
        "api-help-param-deprecated": "Zaharkitua.",
        "api-help-param-required": "Parametro hau beharrezkoa da.",
+       "api-help-datatypes-header": "Datu-motak",
+       "api-help-param-type-limit": "Mota: osokoa edo <kbd>max</kbd>",
+       "api-help-param-type-integer": "Mota: {{PLURAL:$1|1=osokoa|2=osokoen zerrenda}}",
+       "api-help-param-type-boolean": "Mota: boolearra ([[Special:ApiHelp/main#main/datatypes|xehetasunak]])",
+       "api-help-param-type-timestamp": "Mota: {{PLURAL:$1|1=data-zigilua|2=data-zigiluen zerrenda}} ([[Special:ApiHelp/main#main/datatypes|onartutako formatuak]])",
+       "api-help-param-type-user": "Mota: {{PLURAL:$1|1=erabiltzaile-izena|2=erabiltzaile-izenen zerrenda}}",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Hutsik egon behar du|Hutsik egon daiteke edo $2}}",
        "api-help-param-limit": "Ez dira $1 baino gehiago onartzen.",
        "api-help-param-limit2": "Ez dira $1 ($2 botentzat) baino gehiago onartzen.",
index 465f102..a5af63a 100644 (file)
                        "Signal89",
                        "Mjbmr",
                        "Ebraminio",
-                       "Macofe"
+                       "Macofe",
+                       "Huji"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|مستندات]]\n* [[mw:API:FAQ|پرسش‌های متداول]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api فهرست پست الکترونیکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce اعلانات رابط برنامه‌نویسی کاربردی]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ایرادها و درخواست‌ها]\n</div>\n\n<strong>وضعیت:</strong> تمام ویژگی‌هایی که در این صفحه نمایش یافته‌اند باید کار بکنند، ولی رابط برنامه‌نویسی کاربردی کماکان در حال توسعه است، و ممکن است در هر زمان تغییر بکند. به عضویت [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ فهرست پست الکترونیکی mediawiki-api-announce] در بیایید تا از تغییرات باخبر شوید.\n\n<strong>درخواست‌های معیوب:</strong> وقتی درخواست‌های معیوب به رابط برنامه‌نویسی کاربردی فرستاده شوند، یک سرایند اچ‌تی‌تی‌پی با کلید «MediaWiki-API-Erorr» فرستاده می‌شود و بعد هم مقدار سرایند و هم کد خطای بازگردانده شده  هر دو به یک مقدار نسبت داده می‌شوند. برای اطلاعات بیشتر [[mw:API:Errors_and_warnings|API: Errors and warnings]] را ببینید.",
        "apihelp-main-param-action": "کدام عملیات را انجام دهد.",
        "apihelp-main-param-format": "فرمت خروجی.",
        "apihelp-main-param-curtimestamp": "برچسب زمان کنونی را در نتیجه قرار دهید.",
        "apihelp-edit-param-undo": "این بازبینی را برگردانید. $1text، $1prependtext و $1appendtext را باطل می‌کند.",
        "apihelp-edit-param-undoafter": "همه بازبینی‌ها را از $1undo تا این یکی برگردانید. اگر تنظیم نشد، فقط یک بازبینی را برگردانید.",
        "apihelp-edit-param-redirect": "اصلاح خودکار تغییرمسیرها.",
+       "apihelp-edit-param-contentmodel": "مدل محتوایی محتوای جدید",
+       "apihelp-edit-param-token": "بلیط باید همیشه به عنوان اخرین پارامتر، یا دست کم بعد از پارامتر $1text فرستاده شود.",
        "apihelp-edit-example-edit": "ویرایش صفحه",
+       "apihelp-edit-example-undo": "واگردانی نسخه‌های ۱۳۵۷۹ تا ۱۳۵۸۵ با خلاصهٔ خودکار.",
        "apihelp-emailuser-description": "ایمیل به کاربر",
        "apihelp-emailuser-param-target": "کاربر برای ارسال ایمیل به وی.",
        "apihelp-emailuser-param-subject": "موضوع هدر.",
@@ -84,6 +89,7 @@
        "apihelp-expandtemplates-description": "گسترش همه الگوها در ویکی نبشته",
        "apihelp-expandtemplates-param-title": "عنوان صفحه",
        "apihelp-expandtemplates-param-text": "تبدیل برای ویکی‌متن.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "ویکی‌متن گسترش‌یافته.",
        "apihelp-feedcontributions-description": "خوراک مشارکت‌های یک کاربر را برمی‌گرداند.",
        "apihelp-feedcontributions-param-feedformat": "فرمت خوراک.",
        "apihelp-feedcontributions-param-namespace": "فیلتر شدن مشارکتها براساس فضای نام.",
        "apihelp-import-param-interwikipage": "برای درون‌ریز میان‌ویکی: صفحه برای درون‌ریزی.",
        "apihelp-import-param-fullhistory": "برای درون‌ریزی میان‌ویکی: درون‌ریزی تاریخچهٔ کامل، نه فقط نسخهٔ موجود.",
        "apihelp-import-param-templates": "برای درون ریزی میان‌ویکی: همچنین درون‌ریزی الگوهای مورد استفاده.",
-       "apihelp-import-param-namespace": "براÛ\8c Ø¯Ø±Ù\88Ù\86â\80\8cرÛ\8cزÛ\8c Ù\85Û\8cاÙ\86â\80\8cÙ\88Û\8cÚ©Û\8c: Ø¯Ø±Ù\88Ù\86â\80\8cرÛ\8cزÛ\8c Ø¨Ù\87 Ø§Û\8cÙ\86 Ù\81ضاÛ\8c Ù\86اÙ\85.",
-       "apihelp-import-param-rootpage": "درون‌ریزی به عنوان زیر صفحهٔ این صفحه.",
+       "apihelp-import-param-namespace": "درÙ\88Ù\86 Ø±Û\8cزÛ\8c Ø¨Ù\87 Ø§Û\8cÙ\86 Ù\81ضاÛ\8c Ù\86اÙ\85. Ù\86Ù\85Û\8câ\80\8cتÙ\88اÙ\86د Ù\87Ù\85زÙ\85اÙ\86 Ø¨Ø§ <var>$1rootpage</var> Ø§Ø³ØªÙ\81ادÙ\87 Ø´Ù\88د.",
+       "apihelp-import-param-rootpage": "درون‌ریزی به عنوان زیر صفحهٔ این صفحه. نمی‌تواند همزمان با <var>$1rootpage</var> استفاده شود.",
        "apihelp-login-param-name": "نام کاربری.",
        "apihelp-login-param-password": "گذرواژه.",
        "apihelp-login-param-domain": "دامنه (اختیاری)",
+       "apihelp-login-param-token": "بلیط ورود به سامانه که در اولین درخواست دریافت شد.",
        "apihelp-login-example-gettoken": "دریافت توکن ورود",
        "apihelp-login-example-login": "ورود",
        "apihelp-logout-description": "خروج به همراه پاک نمودن اطلاعات این نشست",
        "apihelp-query+protectedtitles-param-end": "متوقف‌کردن فهرست‌کردن در این برچسب زمانی حفاظت.",
        "apihelp-query+random-param-namespace": "بازگرداندن صفحه‌های فقط در این فضاهای نام.",
        "apihelp-query+random-param-limit": "محدود کنید چه تعداد صفحه بازگردانده خواهد شد.",
-       "apihelp-query+random-param-redirect": "یک تغییرمسیر تصادفی جای یک صفحه تصادفی بارگیری کنید.",
+       "apihelp-query+random-param-redirect": "از <kbd>$1filterredir=redirects</kbd> استفاده کنید.",
        "apihelp-query+random-example-simple": "بازگرداندن تو صفحهٔ تصادفی از فضای نام اصلی",
        "apihelp-query+random-example-generator": "بازگرداندن اطلاعات صفحه دربارهٔ دو صفحهٔ تصادفی از فضای نام اصلی",
        "apihelp-query+recentchanges-param-start": "برچسب زمانی برای آغاز شمارش از.",
index ac46637..42b86d8 100644 (file)
@@ -9,6 +9,7 @@
        },
        "apihelp-block-description": "Estä käyttäjä.",
        "apihelp-block-param-reason": "Eston syy.",
+       "apihelp-delete-description": "Poista sivu.",
        "apihelp-emailuser-example-email": "Lähetä käyttäjälle <kbd>WikiSysop</kbd> sähköposti, jossa lukee <kbd>Content</kbd>.",
        "apihelp-query+linkshere-param-show": "Näytä vain kohteet, jotka täyttävät nämä kriteerit:\n;redirect:Näytä vain uudelleenohjaukset.\n;!redirect:Näytä vain ei-uudelleenohjaukset",
        "apihelp-tag-example-rev": "Lisää tunniste <kbd>vandalism</kbd> versioon 123 antamatta perustelua.",
index a6db0c2..d306c3e 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrer par balise.",
        "apihelp-feedrecentchanges-param-target": "Afficher uniquement les modifications sur les pages liées depuis cette page.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Afficher les modifications plutôt sur les pages liées vers la page sélectionnée.",
+       "apihelp-feedrecentchanges-param-categories": "Afficher uniquement les modifications sur les pages dans toutes ces catégories",
+       "apihelp-feedrecentchanges-param-categories_any": "Afficher plutôt uniquement les modifications sur les pages dans n’importe laquelle de ces catégories.",
        "apihelp-feedrecentchanges-example-simple": "Afficher les modifications récentes",
        "apihelp-feedrecentchanges-example-30days": "Afficher les modifications récentes sur 30 jours",
        "apihelp-feedwatchlist-description": "Renvoie un flux de liste de suivi.",
        "apihelp-help-param-wrap": "Inclut la sortie dans une structure de réponse API standard.",
        "apihelp-help-param-toc": "Inclure une table des matières dans la sortir HTML.",
        "apihelp-help-example-main": "Aide pour le module principal",
+       "apihelp-help-example-submodules": "Aide pour <kbd>action=query</kbd> et tous ses sous-modules.",
        "apihelp-help-example-recursive": "Toute l’aide sur une page",
        "apihelp-help-example-help": "Aide pour le module d’aide lui-même",
        "apihelp-help-example-query": "Aide pour deux sous-modules de recherche",
        "apihelp-query+allusers-paramvalue-prop-rights": "Liste les droits qu’à l’utilisateur.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "Ajoute le compteur de modifications de l’utilisateur.",
        "apihelp-query+allusers-paramvalue-prop-registration": "Ajoute l’horodatage de l’inscription de l’utilisateur, s’il est disponible (peut être vide).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
        "apihelp-query+allusers-param-limit": "Combien de noms d’utilisateur renvoyer au total.",
        "apihelp-query+allusers-param-witheditsonly": "Ne lister que les utilisateurs qui ont fait des modifications.",
        "apihelp-query+allusers-param-activeusers": "Lister uniquement les utilisateurs actifs durant {{PLURAL:$1|le dernier jour|les $1 derniers jours}}.",
+       "apihelp-query+allusers-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer aussi si l’utilisateur est attaché avec le wiki identifié par cet ID.",
        "apihelp-query+allusers-example-Y": "Lister les utilisateurs en commençant à <kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "Trouver toutes les pages qui ont un lien vers la page donnée.",
        "apihelp-query+backlinks-param-title": "Titre à rechercher. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
        "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser <kbd>prev</kbd>, <kbd>next</kbd> et <kbd>cur</kbd> pour la version précédente, suivante et actuelle respectivement.",
        "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte",
+       "apihelp-query+revisions+base-param-difftotextpst": "Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand c’est utilisé avec <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour <var>$1difftotext</var> et attendu pour la sortie du contenu.",
        "apihelp-query+search-description": "Effectuer une recherche en texte intégral.",
        "apihelp-query+search-param-search": "Rechercher les titres de page ou le contenu correspondant à cette valeur. Vous pouvez utiliser la chaîne de recherche pour invoquer des fonctionnalités de recherche spéciales, selon ce que le serveur de recherche du wiki implémente.",
        "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Renvoie en écho l’entête <code>Accept-Language</code> envoyé par le client dans un format structuré.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Ajoute la date d’inscription de l’utilisateur.",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Ajoute le compteur de pages non lues de la liste de suivi de l’utilisateur (au maximum $1 ; renvoie <samp>$2</samp> s’il y en a plus).",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
+       "apihelp-query+userinfo-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.",
        "apihelp-query+userinfo-example-simple": "Obtenir de l’information sur l’utilisateur actuel",
        "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel",
        "apihelp-query+users-description": "Obtenir des information sur une liste d’utilisateurs",
        "apihelp-query+users-paramvalue-prop-registration": "Ajoute l’horodatage d’inscription de l’utilisateur.",
        "apihelp-query+users-paramvalue-prop-emailable": "Marque si l’utilisateur peut et veut recevoir des courriels via [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Marque le sexe de l’utilisateur. Renvoie « male », « female », ou « unknown ».",
+       "apihelp-query+users-paramvalue-prop-centralids": "Ajoute les IDs centraux et l’état d’attachement de l’utilisateur.",
+       "apihelp-query+users-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.",
        "apihelp-query+users-param-users": "Une liste des utilisateurs sur lesquels obtenir de l’information.",
        "apihelp-query+users-param-token": "Utiliser plutôt <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Ajoute l’horodatage de la dernière notification de la modification à l’utilisateur.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Ajoute l’information de trace le cas échéant.",
        "apihelp-query+watchlist-param-show": "Afficher uniquement les éléments qui correspondent à ces critères. Par exemple, pour voir uniquement les modifications mineures faites par des utilisateurs connectés, mettre $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "Quels types de modification afficher :\n;edit:Modifications ordinaires de page.\n;external:Modifications externes.\n;new:Créations de page.\n;log:Entrées du journal.",
+       "apihelp-query+watchlist-param-type": "Quels types de modification afficher :",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Modifications normales de page",
+       "apihelp-query+watchlist-paramvalue-type-external": "Modifications externes.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Créations de pages.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Entrées du journal.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Modifications d’appartenance aux catégories.",
        "apihelp-query+watchlist-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.",
        "apihelp-query+watchlist-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilsiateur) pour autoriser l’accès à la liste de suivi d&un autre utilisateur.",
        "apihelp-query+watchlist-example-simple": "Lister la révision de tête des pages récemment modifiées dans la liste de suivi de l’utilisateur actuel",
        "apihelp-watch-example-unwatch": "Ne plus suivre la page <kbd>Page principale</kbd>.",
        "apihelp-watch-example-generator": "Suivre les quelques premières pages de l’espace de nom principal",
        "apihelp-format-example-generic": "Renvoyer le résultat de la requête dans le format $1.",
-       "apihelp-dbg-description": "Extraire les données au format de <code>var_export()</code> de PHP.",
-       "apihelp-dbgfm-description": "Extraire les données au format de <code>var_export()</code> de PHP (affiché proprement en HTML).",
        "apihelp-json-description": "Extraire les données au format JSON.",
        "apihelp-json-param-callback": "Si spécifié, inclut la sortie dans l’appel d’une fonction fournie. Pour plus de sûreté, toutes les données spécifiques à l’utilisateur seront restreintes.",
        "apihelp-json-param-utf8": "Si spécifié, encode la plupart (mais pas tous) des caractères non ASCII en URF-8 au lieu de les remplacer par leur séquence d’échappement hexadécimale. Valeur par défaut quand <var>formatversion</var> ne vaut pas <kbd>1</kbd>.",
        "apihelp-php-param-formatversion": "Mise en forme de la sortie :\n;1:Format rétro-compatible (bool&ens de style XML, clés <samp>*</samp> pour les nœuds de contenu, etc.).\n;2:Format moderne expérimental. Des détails peuvent changer !\n;latest:Utilise le dernier format (actuellement <kbd>2</kbd>), peut changer sans avertissement.",
        "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
        "apihelp-rawfm-description": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).",
-       "apihelp-txt-description": "Extraire les données au format de <code>print_r()</code> de PHP.",
-       "apihelp-txtfm-description": "Extraire les données au format de <code>print_r()</code> de PHP (affiché proprement en HTML).",
        "apihelp-xml-description": "Extraire les données au format XML.",
        "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:mediawiki}} se terminant par <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.",
        "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).",
-       "apihelp-yaml-description": "Extraire les données au format YAML.",
-       "apihelp-yamlfm-description": "Extraire les données YAML (affiché proprement en HTML).",
        "api-format-title": "Résultat de l’API de MediaWiki",
        "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
index b8eca86..9d69078 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "Filtrar por etiqueta.",
        "apihelp-feedrecentchanges-param-target": "Mostrar só os cambios nas páxinas ligadas a esta.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostrar os cambios nas páxinas ligadas coa páxina seleccionada.",
+       "apihelp-feedrecentchanges-param-categories": "Só mostrar cambios en páxinas pertencentes a todas estas categorías.",
        "apihelp-feedrecentchanges-example-simple": "Mostrar os cambios recentes",
        "apihelp-feedrecentchanges-example-30days": "Mostrar os cambios recentes limitados a 30 días",
        "apihelp-feedwatchlist-description": "Devolve o fluxo dunha lista de vixiancia.",
        "apihelp-help-param-wrap": "Incluír a saída nunha estrutura de resposta API estándar.",
        "apihelp-help-param-toc": "Incluír unha táboa de contidos na saída por HTML",
        "apihelp-help-example-main": "Axuda para o módulo principal",
+       "apihelp-help-example-submodules": "Axuda para <kbd>action=query</kbd> e todos os seus submódulos.",
        "apihelp-help-example-recursive": "Toda a axuda nunha páxina",
        "apihelp-help-example-help": "Axuda do módulo de axuda en si",
        "apihelp-help-example-query": "Axuda para dous submódulos de consulta.",
        "apihelp-query+recentchanges-param-limit": "Número total de páxinas a devolver.",
        "apihelp-query+recentchanges-param-type": "Que tipos de cambios mostrar.",
        "apihelp-query+recentchanges-param-toponly": "Listar só cambios que son a última revisión.",
+       "apihelp-query+recentchanges-param-generaterevisions": "Cando é usado como xerador, xera identificadore de revisión no canto de títulos. As entradas de modificacións recentes sen identificadores de revisión asociados (p. ex. a maioría das entradas de rexistro) non xerarán nada.",
        "apihelp-query+recentchanges-example-simple": "Listar cambios recentes.",
        "apihelp-query+recentchanges-example-generator": "Obter a información de páxina sobre cambios recentes sen vixiancia.",
        "apihelp-query+redirects-description": "Devolve todas as redireccións das páxinas indicadas.",
        "apihelp-query+revisions+base-param-section": "Recuperar unicamente o contido deste número de sección.",
        "apihelp-query+revisions+base-param-diffto": "ID de revisión a comparar con cada revisión. Use <kbd>prev</kbd>, <kbd>next</kbd> e <kbd>cur</kbd> para a versión precedente, seguinte e actual respectivamente.",
        "apihelp-query+revisions+base-param-difftotext": "Texto co que comparar cada revisión. Só compara un número limitado de revisións. Ignora <var>$1diffto</var>.  Se <var>$1section</var> ten valor, só se comparará co texto esa sección.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Facer unha transformación  sobre o texto antes do gardado e antes de comparalo. Só válidoo cando se usa con <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Formato de serialización usado por <var>$1difftotext</var> e esperado para a saída do contido.",
        "apihelp-query+search-description": "Facer unha busca por texto completo.",
        "apihelp-query+search-param-search": "Buscar os títulos de páxina ou contido que coincidan con este valor. Pode usar a cadea de busca para invocar funcións especiais de busca, dependendo do motor de busca que teña a wiki.",
        "apihelp-query+search-param-limit": "Número total de páxinas a devolver.",
        "apihelp-query+search-param-interwiki": "Incluir na busca resultados de interwikis, se é posible.",
        "apihelp-query+search-param-backend": "Que servidor de busca usar, se non se indica usa o que hai por defecto.",
+       "apihelp-query+search-param-enablerewrites": "Habilitar reescritura da consulta interna. Algúns motores de busca poden reescribir a consulta a outra que se estima que dará mellores resultados, como corrixindo erros de ortografía.",
        "apihelp-query+search-example-simple": "Buscar <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Buscar texto por <kbd>significado</kbd>.",
        "apihelp-query+search-example-generator": "Obter información da páxina sobre as páxinas devoltas por unha busca por <kbd>meaning</kbd>.",
        "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Reenvía a cabeceira <code>Accept-Language</code> enviada polo cliente nun formato estruturado.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Engade a data de rexistro do usuario.",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Engade o número de páxinas sen ler da lista de vixiancia do usuario (máximo $1; devolve <samp>$2</samp> se son máis).",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "Engade os identificadores centrais e o estado de acoplamento do usuario.",
+       "apihelp-query+userinfo-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, \nindica que o usuario está acoplado á wiki identificada por este identificador.",
        "apihelp-query+userinfo-example-simple": "Obter información sobre o usuario actual.",
        "apihelp-query+userinfo-example-data": "Obter información adicional sobre o usuario actual.",
        "apihelp-query+users-description": "Obter información sobre unha lista de usuarios.",
        "apihelp-query+users-paramvalue-prop-registration": "Engade o selo de tempo do rexistro do usuario.",
        "apihelp-query+users-paramvalue-prop-emailable": "Marca se o usuario pode e quere recibir correos usando [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Marca o xénero do usuario. Devolve \"home\", \"muller\" ou \"descoñecido\".",
+       "apihelp-query+users-paramvalue-prop-centralids": "Engade os identificadores centrais e o estado de acoplamento do usuario.",
+       "apihelp-query+users-param-attachedwiki": "Con <kbd>$1prop=centralids</kbd>, \nindica que o usuario está acoplado á wiki identificada por este identificador.",
        "apihelp-query+users-param-users": "Lista de usuarios para os que obter información.",
        "apihelp-query+users-param-token": "Usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> no canto diso.",
        "apihelp-query+users-example-simple": "Mostar información para o usuario <kbd>Example</kbd>.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Engade o selo de tempo da última vez en que o usuario foi avisado da modificación.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Engade información do rexistro cando sexa axeitado.",
        "apihelp-query+watchlist-param-show": "Só mostrar elementos que cumpran esos criterios. Por exemplo, para ver só edicións menores feitas por usuarios conectados, activar $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "Que tipos de cambios mostrar:\n;edit:Modificacións normais de páxina.\n;external:Modificacións externas.\n;new:Creación de páxinas.\n;log:Entradas no rexistro.",
+       "apihelp-query+watchlist-param-type": "Que tipos de cambios mostrar:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Edicións comúns a páxinas.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Cambios externos.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Creacións de páxinas.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Entradas do rexistro",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Modificacións de pertenza á categoría.",
        "apihelp-query+watchlist-param-owner": "Usado con $1token para acceder á lista de páxinas de vixiancia doutro usuario.",
        "apihelp-query+watchlist-param-token": "Identificador de seguridade (dispoñible nas [[Special:Preferences#mw-prefsection-watchlist|preferencias]] de usuario) para permitir o acceso a outros á súa páxina de vixiancia.",
        "apihelp-query+watchlist-example-simple": "Listar a última revisión das páxinas recentemente modificadas da lista de vixiancia do usuario actual.",
        "apihelp-setnotificationtimestamp-example-page": "Restaurar o estado de notificación para a <kbd>Páxina Principal</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixar o selo de tempo de notificación para a <kbd>Main page</kbd> de forma que todas as edicións dende o 1 se xaneiro de 2012 queden sen revisar.",
        "apihelp-setnotificationtimestamp-example-allpages": "Restaurar o estado de notificación para as páxinas no espazo de nomes de <kbd>{{ns:user}}</kbd>.",
+       "apihelp-stashedit-description": "Preparar unha edición na caché compartida.\n\nEstá previsto que sexa usado vía AJAX dende o formulario de edición para mellorar o rendemento de gardado da páxina.",
        "apihelp-stashedit-param-title": "Título da páxina que se está a editar.",
        "apihelp-stashedit-param-section": "Número de selección. O <kbd>0</kbd> é para a sección superior, <kbd>novo</kbd> para unha sección nova.",
        "apihelp-stashedit-param-sectiontitle": "Título para unha nova sección.",
        "apihelp-watch-example-unwatch": "Deixar de vixiar a páxina <kbd>Páxina Principal</kbd>.",
        "apihelp-watch-example-generator": "Vixiar as primeiras páxinas no espazo de nomes principal",
        "apihelp-format-example-generic": "Devolver o resultado da consulta no formato $1.",
-       "apihelp-dbg-description": "Datos de saída en formato <code>var_export()</code> de PHP.",
-       "apihelp-dbgfm-description": "Datos de saída en formato <code>var_export()</code> de PHP(impresión en HTML).",
        "apihelp-json-description": "Datos de saída en formato JSON.",
        "apihelp-json-param-callback": "Se está especificado, inclúe a saída na chamada da función indicada. Para maior seguridade, todos os datos específicos do usuario serán restrinxidos.",
        "apihelp-json-param-utf8": "Se está especificado, codifica a maioría (pero non todos) dos caracteres ASCII como UTF-8 no canto de reemprazalos con secuencias de escape hexadecimais. Por defecto cando <var>formatversion</var> non é <kbd>1</kbd>.",
        "apihelp-php-param-formatversion": "Formato de saída:\n;1:Formato compatible con versións anteriores(booleanos estilo XML,claves <samp>*</samp> para nodos, etc.).\n;2:Formato moderno experimental. Os detalles poden cambiar!\n;latest:Usa o último formato (actualmente kbd>2</kbd>), pode cambiar sen aviso previo.",
        "apihelp-phpfm-description": "Datos de saída en formato serializado de PHP(impresión en HTML).",
        "apihelp-rawfm-description": "Datos de saída, incluíndo os elementos de depuración, en formato JSON (impresión en HTML).",
-       "apihelp-txt-description": "Datos de saída en formato PHP <code>print_r()</code>.",
-       "apihelp-txtfm-description": "Datos de saída en formato <code>print_r()</code> de PHP(impresión en HTML).",
        "apihelp-xml-description": "Datos de saída en formato XML.",
        "apihelp-xml-param-xslt": "Se está indicado, engade o nome da páxina como unha folla de estilo XSL. O valor debe ser un título no espazo de nomes {{ns:mediawiki}} rematando con <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Se está indicado, engade un espazo de nomes XML.",
        "apihelp-xmlfm-description": "Datos de saída en formato XML(impresión en HTML).",
-       "apihelp-yaml-description": "Datos de saída en formato YAML.",
-       "apihelp-yamlfm-description": "Datos de saída en formato YAML(impresión en HTML).",
        "api-format-title": "Resultado de API de MediaWiki",
        "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro <var>format</var> para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe <kbd>format=$2</kbd>.\n\n\nRevise a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.",
        "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.",
index 37243af..b2fe5b8 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "סינון לפי תגית.",
        "apihelp-feedrecentchanges-param-target": "הצגת שינויים שנעשו בדפים המקושרים לדף זה בלבד.",
        "apihelp-feedrecentchanges-param-showlinkedto": "להציג את השינויים בדפים שמקושרים לדף שנבחר במקום זה.",
+       "apihelp-feedrecentchanges-param-categories": "להציג רק שינויים בדפים בכל הקטגוריות האלו.",
+       "apihelp-feedrecentchanges-param-categories_any": "להציג רק שינויים בדפים בכל הקטגוריות במקום.",
        "apihelp-feedrecentchanges-example-simple": "הצגת שינויים אחרונים.",
        "apihelp-feedrecentchanges-example-30days": "הצגת שינויים אחרונים עבור 30 ימים.",
        "apihelp-feedwatchlist-description": "החזרת הזנת רשימת מעקב.",
        "apihelp-help-param-wrap": "לעטוף את הפלט במבנה תשובת API תקני.",
        "apihelp-help-param-toc": "לכלול תוכן עניינים בפלט HTML.",
        "apihelp-help-example-main": "עזרה ליחידה הראשית.",
+       "apihelp-help-example-submodules": "עזרה עבור <kbd>action=query</kbd> וכל התת־מודולים שלו.",
        "apihelp-help-example-recursive": "כל העזרה בדף אחד.",
        "apihelp-help-example-help": "עזרה ליחידת העזרה עצמה.",
        "apihelp-help-example-query": "עזרה לשתי תת־יחידות של שאילתה.",
        "apihelp-query+allusers-paramvalue-prop-rights": "רשימת הההרשאות שיש למשתמש.",
        "apihelp-query+allusers-paramvalue-prop-editcount": "הוספת מניין העריכות של המשתמש .",
        "apihelp-query+allusers-paramvalue-prop-registration": "הוספת חותם־הזמן של זמן הרישום של המשתמש (יכול להיות ריק).",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "הוספת המזהה המרכזי ומצב השיוך למשתמש.",
        "apihelp-query+allusers-param-limit": "כמה שמות משתמש בסך הכול לשנות.",
        "apihelp-query+allusers-param-witheditsonly": "לרשום רק משתמשים שעשו עריכות.",
        "apihelp-query+allusers-param-activeusers": "לרשום רק משתמשים שהיו פעילים {{PLURAL:$1|ביום האחרון|ביומיים האחרונים|ב־$1 הימים האחרונים}}.",
+       "apihelp-query+allusers-param-attachedwiki": "עם <kbd>$1prop=centralids</kbd>, לציין גם האם המשתמש משויך לוויקי עם המזהה הזה.",
        "apihelp-query+allusers-example-Y": "לרשום משתמשים שמתחילים ב־<kbd>Y</kbd>.",
        "apihelp-query+backlinks-description": "מציאת כל הדפים שמקשרים לדף הנתון.",
        "apihelp-query+backlinks-param-title": "איזו כותרת לחפש. לא ניתן להשתמש בזה יחד עם <var>$1pageid</var>.",
        "apihelp-query+userinfo-paramvalue-prop-acceptlang": "מדפיס את כותרת <code>Accept-Language</code> ששלח הלקוח בתסדיר מובנה.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "הוספת תאריך הרישום של המשתמש.",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "הוספת מניין הדפים שלא נקראו ברשימת המעקב של המשתמש (לכל היותר $1; מחזיר <samp>$2</samp> אם יש יותר).",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "הוספת המזהה המרכזי ומצב השיוך למשתמש.",
+       "apihelp-query+userinfo-param-attachedwiki": "עם <kbd>$1prop=centralids</kbd>, לציין האם המשתמש משויך לוויקי עם המזהה הזה.",
        "apihelp-query+userinfo-example-simple": "קבלת מידע על המשתמש הנוכחי.",
        "apihelp-query+userinfo-example-data": "קבלת מידע נוסף על המשתמש הנוכחי.",
        "apihelp-query+users-description": "קבלת מידע על רשימת משתמשים.",
        "apihelp-query+users-paramvalue-prop-registration": "הוספת חותם־הזמן של רישום המשתמש.",
        "apihelp-query+users-paramvalue-prop-emailable": "מתייג אם המשתמש יכול ורוצה לקבל דואר אלקטרוני דרך [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "מתייג את המגדר של המשתמש. מחזיר \"male\"‏, \"female\" או \"unknown\".",
+       "apihelp-query+users-paramvalue-prop-centralids": "הוספת המזהה המרכזי ומצב השיוך למשתמש.",
+       "apihelp-query+users-param-attachedwiki": "עם <kbd>$1prop=centralids</kbd>, לציין האם המשתמש משויך לוויקי עם המזהה הזה.",
        "apihelp-query+users-param-users": "רשימת משתמשים שעליהם צריך לקבל מידע.",
        "apihelp-query+users-param-token": "יש להשתמש ב־<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> במקום.",
        "apihelp-query+users-example-simple": "החזרת מידע עבור המשתמש <kbd>Example</kbd>.",
        "apihelp-watch-example-unwatch": "להפסיק את המעקב אחרי הדף <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "לעקוב אחרי הדפים הראשונים במרחב הראשי.",
        "apihelp-format-example-generic": "להחזיר את תוצאות השאילתה בתסדיר $1.",
-       "apihelp-dbg-description": "לפלוט נתונים בתסדיר <code dir=\"ltr\">var_export()</code> של PHP.",
-       "apihelp-dbgfm-description": "לפלוט את הנתונים בתסדיר <code dir=\"ltr\">var_export()</code> של PHP (עם הדפסה יפה ב־HTML).",
        "apihelp-json-description": "לפלוט נתונים בתסדיר JSON.",
        "apihelp-json-param-callback": "אם זה צוין, עוטף את הפלט לתוך קריאת פונקציה נתונה. למען הבטיחות, כל הנתונים הייחודיים למשתמש יוגבלו.",
        "apihelp-json-param-utf8": "אם זה צוין, רוב התווים שאינם ASCII (אבל לא כולם) יקודדו בתור UTF-8 במקום להתחלף בסדרות חילוף הקסדצימליות. זאת בררת המחדל אם הערך של <var>formatversion</var> הוא לא <kbd>1</kbd>.",
        "apihelp-php-param-formatversion": "תסדיר הפלט:\n;1:תסדיר עם תאימות אחורה (ערכים בוליאניים בסגנון XML, מפתחות <samp>*</samp> לצומתי תוכן, וכו').\n;2:תסדיר מודרני ניסיוני. הפרטים יכולים להשתנות!\n;latest:להשתמש בתסדיר החדש ביותר (כרגע <kbd>2</kbd>), יכול להשתנות ללא התראה.",
        "apihelp-phpfm-description": "לפלוט נתונים בתסדיר PHP מוסדר (עם הדפסה יפה ב־HTML).",
        "apihelp-rawfm-description": "לפלוט את הנתונים, כולל אלמנטים לניפוי שגיאות, בתסדיר JSON (עם הדפסה יפה ב־HTML).",
-       "apihelp-txt-description": "לפלוט נתונים בתסדיר <code dir=\"ltr\">print_r()</code> של PHP.",
-       "apihelp-txtfm-description": "לפלוט את הנתונים בתסדיר <code dir=\"ltr\">print_r()</code> של PHP (עם הדפסה יפה ב־HTML).",
        "apihelp-xml-description": "לפלוט נתונים בתסדיר XML.",
        "apihelp-xml-param-xslt": "אם צוין, יש להוסיף את שם הדף כגיליון עיצוב XSL. על הערך להיות כותרת ב {{ns:mediawiki}} במרחב שם המשתמש, המסתיים ב-  <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "אם זה צוין, מוסיף מרחב שם של XML.",
        "apihelp-xmlfm-description": "לפלוט נתונים בתסדיר XML (עם הדפסה יפה ב־HTML).",
-       "apihelp-yaml-description": "לפלוט את הנתונים בתסדיר YAML.",
-       "apihelp-yamlfm-description": "לפלוט נתונים בתסדיר YAML (עם הדפסה יפה ב־HTML).",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
        "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר <var>format</var> כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום <kbd>format=$2</kbd>.\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
        "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
diff --git a/includes/api/i18n/id.json b/includes/api/i18n/id.json
new file mode 100644 (file)
index 0000000..223e585
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "WongKentir"
+               ]
+       },
+       "apihelp-createaccount-param-name": "Nama pengguna"
+}
index c1123d2..c4f7a3f 100644 (file)
@@ -9,7 +9,8 @@
                        "Ricordisamoa",
                        "Valepert",
                        "Sannita",
-                       "Macofe"
+                       "Macofe",
+                       "Nemo bis"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentazione (in inglese)]]\n* [[mw:API:FAQ|FAQ (in inglese)]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n</div>\n<strong>Stato:</strong> Tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma l'API è ancora in fase d'attivo sviluppo, e potrebbe cambiare in qualsiasi momenento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] per essere informato sugli aggiornamenti.\n\n<strong>Istruzioni sbagliate:</strong> quando vengono impartite all'API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e sia al valore dell'intestazione sia al codice d'errore verrà impostato lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti (in inglese)]].",
        "apihelp-main-param-format": "Formato dell'output.",
        "apihelp-main-param-assert": "Verifica che l'utente sia loggato se si è impostato <kbd>utente</kbd>, o che abbia i permessi di bot se si è impostato <kbd>bot</kbd>.",
        "apihelp-main-param-requestid": "Tutti i valori forniti saranno implementati nella risposta. Potrebbero venir utilizzati per distinguere le richieste.",
-       "apihelp-main-param-servedby": "Includi nei risultati il nome dell'host che ha servito la richiesta.",
-       "apihelp-main-param-curtimestamp": "Includere il timestamp corrente nel risultato.",
+       "apihelp-main-param-servedby": "Includi nel risultato il nome dell'host che ha servito la richiesta.",
+       "apihelp-main-param-curtimestamp": "Includi nel risultato il timestamp attuale.",
        "apihelp-block-description": "Blocca  un utente.",
        "apihelp-block-param-user": "Nome utente, indirizzo IP o range di IP da bloccare.",
        "apihelp-block-param-reason": "Motivo del blocco.",
+       "apihelp-block-param-anononly": "Blocca solo gli utenti non registrati (cioè disattiva i contributi anonimi da questo indirizzo IP).",
        "apihelp-block-param-nocreate": "Impedisci creazione di utenze.",
        "apihelp-block-param-hidename": "Nascondi il nome utente dal registro dei blocchi (Richiede i permessi di <code>hideuser</code>).",
        "apihelp-block-param-reblock": "Se l'utente è già bloccato, sovrascrivere il blocco esistente.",
@@ -72,7 +74,7 @@
        "apihelp-edit-param-tags": "Cambia i tag da applicare alla revisione.",
        "apihelp-edit-param-minor": "Modifica minore.",
        "apihelp-edit-param-notminor": "Modifica non minore.",
-       "apihelp-edit-param-bot": "Segna questa modifica come bot.",
+       "apihelp-edit-param-bot": "Contrassegna questa modifica come bot.",
        "apihelp-edit-param-createonly": "Non modificare la pagina se già esiste.",
        "apihelp-edit-param-nocreate": "Genera un errore se la pagina non esiste.",
        "apihelp-edit-param-watch": "Aggiunge la pagina agli osservati speciali dell'utente attuale.",
        "apihelp-feedrecentchanges-param-hidebots": "Nascondi le modifiche apportate da bot.",
        "apihelp-feedrecentchanges-param-hideanons": "Nascondi le modifiche fatte da utenti anonimi.",
        "apihelp-feedrecentchanges-param-hideliu": "Nascondi le modifiche apportate dagli utenti registrati.",
+       "apihelp-feedrecentchanges-param-hidepatrolled": "Nascondi modifiche verificate.",
        "apihelp-feedrecentchanges-param-hidemyself": "Nasconde le modifiche effettuate dall'utente attuale.",
+       "apihelp-feedrecentchanges-param-tagfilter": "Filtra per etichetta.",
+       "apihelp-feedrecentchanges-param-target": "Mostra solo le modifiche alle pagine collegate da questa pagina.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.",
        "apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.",
        "apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.",
+       "apihelp-feedwatchlist-param-linktosections": "Collega direttamente alla sezione modificata, se possibile.",
+       "apihelp-filerevert-description": "Ripristina un file ad una versione precedente.",
+       "apihelp-filerevert-param-filename": "Nome del file di destinazione, senza il prefisso 'File:'.",
+       "apihelp-filerevert-example-revert": "Ripristina <kbd>Wiki.png</kbd> alla versione del <kbd>2011-03-05T15:27:40Z</kbd>.",
+       "apihelp-help-example-submodules": "Aiuto per <kbd>action=query</kbd> e tutti i suoi sotto-moduli.",
+       "apihelp-imagerotate-description": "Ruota una o più immagini.",
+       "apihelp-imagerotate-param-rotation": "Gradi di rotazione dell'immagine in senso orario.",
+       "apihelp-imagerotate-example-simple": "Ruota <kbd>File:Example.png</kbd> di <kbd>90</kbd> gradi.",
+       "apihelp-imagerotate-example-generator": "Ruota tutte le immagini in <kbd>Category:Flip</kbd> di <kbd>180</kbd> gradi.",
+       "apihelp-import-param-summary": "Oggetto dell'importazione.",
+       "apihelp-import-param-xml": "File XML caricato.",
+       "apihelp-import-param-interwikisource": "Per importazioni interwiki: wiki da cui importare.",
+       "apihelp-import-param-interwikipage": "Per importazioni interwiki: pagina da importare.",
+       "apihelp-import-param-fullhistory": "Per importazioni interwiki: importa l'intera cronologia, non solo la versione attuale.",
+       "apihelp-import-param-templates": "Per importazioni interwiki: importa anche tutti i template inclusi.",
+       "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] nel namespace 100 con cronologia completa.",
        "apihelp-login-param-name": "Nome utente.",
        "apihelp-login-param-password": "Password.",
        "apihelp-login-param-domain": "Dominio (opzionale).",
        "apihelp-userrights-param-userid": "ID utente.",
        "apihelp-watch-description": "Aggiunge o rimuove pagine dagli osservati speciali dell'utente attuale.",
        "api-pageset-param-titles": "Un elenco di titoli su cui lavorare.",
+       "api-pageset-param-pageids": "Un elenco di ID pagina su cui lavorare.",
        "api-pageset-param-revids": "Un elenco di ID versioni su cui lavorare.",
        "api-pageset-param-redirects-generator": "Risolvi automaticamente redirect in <var>$1titles</var>, <var>$1pageids</var>, e <var>$1revids</var>, e nelle pagine restituite da <var>$1generator</var>.",
        "api-pageset-param-converttitles": "Converte i titoli in altre varianti, se necessario. Funziona solo se la lingua del contenuto del wiki supporta la conversione in varianti. Le lingue che supportano la conversione in varianti includono $1",
index 1a99054..287e147 100644 (file)
        "apihelp-help-param-helpformat": "ヘルプの出力形式です。",
        "apihelp-help-param-toc": "HTML 出力に目次を含めます。",
        "apihelp-help-example-main": "メイン モジュールのヘルプ",
+       "apihelp-help-example-submodules": "<kbd>action=query</kbd> とそのすべての下位モジュールに関するヘルプ。",
        "apihelp-help-example-recursive": "すべてのヘルプを1つのページに",
        "apihelp-help-example-help": "ヘルプ モジュール自身のヘルプ",
        "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
        "apihelp-imagerotate-param-rotation": "画像を回転させる時計回りの角度。",
        "apihelp-imagerotate-example-simple": "<kbd>File:Example.png</kbd> を <kbd>90</kbd> 度回転させる。",
        "apihelp-imagerotate-example-generator": "<kbd>Category:Flip</kbd> 内のすべての画像を <kbd>180</kbd> 度回転させる。",
+       "apihelp-import-description": "他のWikiまたはXMLファイルからページを取り込む。\n\n<var>xml</var> パラメーターでファイルを送信する場合、ファイルのアップロードとしてHTTP POSTされなければならない (例えば、multipart/form-dataを使用する) 点に注意してください。",
        "apihelp-import-param-summary": "ページ取り込みの要約。",
        "apihelp-import-param-xml": "XMLファイルをアップロード",
        "apihelp-import-param-interwikisource": "ウィキ間の取り込みの場合: 取り込み元のウィキ。",
        "apihelp-opensearch-param-redirects": "転送を処理する方法:\n;return: 転送ページそのものを返します。\n;resolve: 転送先のページを返します。$1limit より返される結果が少なくなるかもしれません。\n歴史的な理由により、$1format=json では \"return\" が、他の形式では \"resolve\" が既定です。",
        "apihelp-opensearch-param-format": "出力する形式。",
        "apihelp-opensearch-example-te": "<kbd>Te</kbd> から始まるページを検索する。",
+       "apihelp-options-param-reset": "個人設定をサイトの既定値にリセットする。",
        "apihelp-options-example-reset": "すべて初期設定に戻す。",
        "apihelp-options-example-change": "<kbd>skin</kbd> および <kbd>hideminor</kbd> の個人設定を変更する。",
        "apihelp-options-example-complex": "すべての個人設定を初期化し、<kbd>skin</kbd> および <kbd> nickname </kbd> を設定する。",
        "apihelp-parse-param-effectivelanglinks": "エクステンションによって供給された言語リンクが含まれています (for use with <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "この節番号の内容のみを構文解析します。\n\n<kbd>new</kbd> のとき、ページに新しい節を追加するかのように <var>$1text</var> と<var>$1sectiontitle</var> を解析します。\n\n<kbd>new</kbd> は <var>text</var> を指定したときのみ許可されます。",
        "apihelp-parse-param-sectiontitle": "<var>section</var> が <kbd>new</kbd> のときの、新しい節の節名。\n\nページ編集とは異なり、これは <var>summary</var> が省略または空のときにはフォールバックしません。",
+       "apihelp-parse-param-disablelimitreport": "構文解析の出力で制限レポート (New PP limit report) を省略する。",
        "apihelp-parse-param-disablepp": "<var>$1disablelimitreport</var> を代わりに使用してください。",
-       "apihelp-parse-param-disabletidy": "パーサ出力に(例えば整頓)HTMLのクリーンアップを実行しないでください。",
+       "apihelp-parse-param-disableeditsection": "構文解析の出力で節リンクを省略する。",
+       "apihelp-parse-param-disabletidy": "構文解析の出力にHTMLのクリーンアップ (例えば整頓) を適用しない。",
        "apihelp-parse-param-preview": "プレビューモードでのパース",
        "apihelp-parse-example-page": "ページをパース",
        "apihelp-parse-example-text": "ウィキテキストをパース",
        "apihelp-parse-example-summary": "要約を構文解析します。",
        "apihelp-patrol-description": "ページまたは版を巡回済みにします。",
+       "apihelp-patrol-param-rcid": "巡回済みにする最近の更新ID。",
        "apihelp-patrol-param-revid": "巡回済みにする版ID。",
        "apihelp-patrol-example-rcid": "最近の更新を巡回",
        "apihelp-patrol-example-revid": "版を巡回済みにする。",
        "apihelp-protect-description": "ページの保護レベルを変更します。",
        "apihelp-protect-param-title": "保護(解除)するページ名です。$1pageid とは同時に使用できません。",
        "apihelp-protect-param-pageid": "保護(解除)するページIDです。$1title とは同時に使用できません。",
+       "apihelp-protect-param-protections": "<kbd>action=level</kbd> の形式 (例えば、<kbd>edit=sysop</kbd>) で整形された、保護レベルの一覧。\n\n<strong>注意: </strong> ここに列挙されなかった操作の制限は解除されます。",
        "apihelp-protect-param-expiry": "有効期限です。タイムスタンプがひとつだけ指定された場合は、それがすべての保護に適用されます。無期限の保護を行う場合は<kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, または <kbd>never</kbd> を指定します。",
        "apihelp-protect-param-reason": "保護(解除)の理由。",
        "apihelp-protect-param-watch": "指定されると、保護(解除)するページが現在の利用者のウォッチリストに追加されます。",
        "apihelp-protect-example-protect": "ページを保護する。",
+       "apihelp-protect-example-unprotect": "制限値を <kbd>all</kbd> にしてページの保護を解除する。",
        "apihelp-protect-example-unprotect2": "制限を設定されたページ保護を解除します。",
        "apihelp-purge-description": "指定されたページのキャッシュをパージします。\n\n利用者がログインしていない場合は、 POST リクエストが必要です。",
        "apihelp-purge-param-forcelinkupdate": "リンクテーブルを更新します。",
        "apihelp-query-param-export": "指定されたまたは生成されたすべてのページの、現在の版を書き出します。",
        "apihelp-query-param-iwurl": "タイトルがウィキ間リンクである場合に、完全なURLを取得するかどうか。",
        "apihelp-query-example-revisions": "[[Special:ApiHelp/query+siteinfo|サイト情報]]と<kbd>Main Page</kbd>の[[Special:ApiHelp/query+revisions|版]]を取得する。",
+       "apihelp-query-example-allpages": "<kbd>API/</kbd> で始まるページの版を取得する。",
        "apihelp-query+allcategories-description": "すべてのカテゴリを一覧表示します。",
        "apihelp-query+allcategories-param-from": "列挙を開始するカテゴリ。",
        "apihelp-query+allcategories-param-to": "列挙を終了するカテゴリ。",
        "apihelp-query+allfileusages-param-prop": "どの情報を結果に含めるか:",
        "apihelp-query+allfileusages-paramvalue-prop-ids": "使用しているページのページIDを追加します ($1unique とは同時に使用できません)。",
        "apihelp-query+allfileusages-paramvalue-prop-title": "ファイルのページ名を追加します。",
+       "apihelp-query+allfileusages-param-limit": "返す項目の総数。",
+       "apihelp-query+allfileusages-param-dir": "一覧表示する方向。",
        "apihelp-query+allfileusages-example-unique": "ユニークなファイルを一覧表示する。",
        "apihelp-query+allfileusages-example-generator": "ファイルを含むページを取得します。",
        "apihelp-query+allimages-description": "順次すべての画像を列挙します。",
        "apihelp-query+allimages-param-sort": "並べ替えに使用するプロパティ。",
+       "apihelp-query+allimages-param-dir": "一覧表示する方向。",
        "apihelp-query+allimages-param-from": "列挙の始点となる画像タイトル。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-to": "列挙の終点となる画像のページ名。$1sort=name を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-start": "列挙の始点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-end": "列挙の終点となるタイムスタンプ。$1sort=timestamp を指定した場合のみ使用できます。",
        "apihelp-query+allimages-param-prefix": "この値で始まるすべての画像タイトルを検索する。$1sort=name を指定した場合のみ使用できます。",
+       "apihelp-query+allimages-param-minsize": "画像の最小バイト数を制限する。",
+       "apihelp-query+allimages-param-maxsize": "画像の最大バイト数を制限する。",
+       "apihelp-query+allimages-param-sha1": "画像の SHA1 ハッシュ値。$1sha1base36 をオーバーライドします。",
        "apihelp-query+allimages-param-user": "この利用者によりアップロードされたファイルのみを返す。$1sort=timestamp を指定した場合のみ使用できます。 $1filterbots とは同時に使用できません。",
        "apihelp-query+allimages-param-mime": "検索対象のMIMEタイプ、たとえば <kbd>image/jpeg</kbd>。",
        "apihelp-query+allimages-param-limit": "返す画像の総数。",
        "apihelp-query+alllinks-param-from": "列挙を開始するリンクのページ名。",
        "apihelp-query+alllinks-param-to": "列挙を終了するリンクのページ名。",
        "apihelp-query+alllinks-param-prefix": "この値で始まるすべてのリンクされたページを検索する。",
+       "apihelp-query+alllinks-param-unique": "リンクされたページ名を一度だけ表示します。<kbd>$1prop=ids</kbd> とは同時に使用できません。ジェネレーターとして使用される場合、リンク元ではなくリンク先のページを生成します。",
+       "apihelp-query+alllinks-param-prop": "どの情報を結果に含めるか:",
        "apihelp-query+alllinks-paramvalue-prop-title": "リンクのページ名を追加します。",
        "apihelp-query+alllinks-param-namespace": "列挙する名前空間。",
+       "apihelp-query+alllinks-param-dir": "一覧表示する方向。",
        "apihelp-query+alllinks-example-B": "<kbd>B</kbd> で始まるリンクされたページ (存在しないページも含む)を、リンク元のページIDとともに表示する。",
        "apihelp-query+alllinks-example-unique": "ユニークなリンクのタイトルを一覧。",
        "apihelp-query+alllinks-example-generator": "リンクを含むページを取得します。",
        "apihelp-query+allpages-param-to": "列挙を終了するページ名。",
        "apihelp-query+allpages-param-prefix": "この値で始まるすべてのページ名を検索します。",
        "apihelp-query+allpages-param-namespace": "列挙する名前空間。",
+       "apihelp-query+allpages-param-minsize": "ページの最低バイト数を制限する。",
+       "apihelp-query+allpages-param-maxsize": "ページの最大バイト数を制限する。",
        "apihelp-query+allpages-param-prtype": "保護されているページに絞り込む。",
        "apihelp-query+allpages-param-prlevel": "保護レベルで絞り込む ($1type= パラメーターと同時に使用しなければなりません)。",
        "apihelp-query+allpages-param-limit": "返すページの総数。",
+       "apihelp-query+allpages-param-dir": "一覧表示する方向。",
        "apihelp-query+allpages-example-B": "<kbd>B</kbd> で始まるページの一覧を表示する。",
        "apihelp-query+allpages-example-generator": "<kbd>T</kbd> で始まる4つのページに関する情報を表示する。",
        "apihelp-query+allpages-example-generator-revisions": "<kbd>Re</kbd> で始まる最初の非リダイレクトの2ページの内容を表示する。",
+       "apihelp-query+allredirects-description": "ある名前空間へのすべての転送を一覧表示する。",
        "apihelp-query+allredirects-param-from": "列挙を開始するリダイレクトのページ名。",
        "apihelp-query+allredirects-param-to": "列挙を終了するリダイレクトのページ名。",
+       "apihelp-query+allredirects-param-prefix": "この値で始まるすべてのページを検索する。",
+       "apihelp-query+allredirects-param-unique": "転送先ページ名を一度だけ表示します。<kbd>$1prop=ids|fragment|interwiki</kbd> とは同時に使用できません。ジェネレーターとして使用される場合、転送元ではなく転送先のページを生成します。",
+       "apihelp-query+allredirects-param-prop": "どの情報を結果に含めるか:",
+       "apihelp-query+allredirects-paramvalue-prop-title": "転送ページのページ名を追加します。",
        "apihelp-query+allredirects-param-namespace": "列挙する名前空間。",
+       "apihelp-query+allredirects-param-limit": "返す項目の総数。",
+       "apihelp-query+allredirects-param-dir": "一覧表示する方向。",
+       "apihelp-query+allredirects-example-B": "<kbd>B</kbd> で始まる転送先ページ (存在しないページも含む)を、転送元のページIDとともに表示する。",
        "apihelp-query+allrevisions-description": "すべての版を一覧表示する。",
        "apihelp-query+allrevisions-param-start": "列挙の始点となるタイムスタンプ。",
        "apihelp-query+allrevisions-param-end": "列挙の終点となるタイムスタンプ。",
        "apihelp-query+allrevisions-example-user": "利用者 <kbd>Example</kbd> による直近の50版を一覧表示する。",
        "apihelp-query+allrevisions-example-ns-main": "標準名前空間にある最初の50版を一覧表示する。",
        "apihelp-query+alltransclusions-param-prefix": "この値で始まるすべてのトランスクルードされているページを検索する。",
+       "apihelp-query+alltransclusions-param-prop": "どの情報を結果に含めるか:",
        "apihelp-query+alltransclusions-param-namespace": "列挙する前空間。",
+       "apihelp-query+alltransclusions-param-limit": "返す項目の総数。",
+       "apihelp-query+alltransclusions-param-dir": "一覧表示する方向。",
+       "apihelp-query+alltransclusions-example-B": "<kbd>B</kbd> で始まる参照読み込みされているページ (存在しないページも含む)を、参照元のページIDとともに表示する。",
        "apihelp-query+alltransclusions-example-generator": "参照読み込みを含んでいるページを取得する。",
        "apihelp-query+allusers-description": "すべての登録利用者を一覧表示します。",
        "apihelp-query+allusers-param-from": "列挙を開始する利用者名。",
        "apihelp-query+allusers-param-dir": "並べ替えの方向。",
        "apihelp-query+allusers-param-group": "このグループに所属する利用者のみを結果に含める。",
        "apihelp-query+allusers-param-excludegroup": "このグループに所属する利用者を結果から除外する。",
+       "apihelp-query+allusers-param-prop": "どの情報を結果に含めるか:",
+       "apihelp-query+allusers-paramvalue-prop-blockinfo": "利用者に対する現在のブロックに関する情報を追加します。",
+       "apihelp-query+allusers-paramvalue-prop-groups": "利用者が所属する利用者グループを一覧表示します。これはサーバー資源を多めに使用するので、返る結果が制限値より少なくなります。",
+       "apihelp-query+allusers-paramvalue-prop-rights": "利用者が持っている権限を一覧表示します。",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "利用者の編集回数を追加します。",
+       "apihelp-query+allusers-paramvalue-prop-registration": "可能な場合、利用者の登録日時のタイムスタンプを追加します (空白になるかもしれません)。",
        "apihelp-query+allusers-param-limit": "返す利用者名の総数。",
        "apihelp-query+allusers-param-witheditsonly": "編集履歴のある利用者のみ一覧表示する。",
        "apihelp-query+allusers-param-activeusers": "最近 $1 {{PLURAL:$1|日間}}のアクティブな利用者のみを一覧表示する。",
        "apihelp-query+backlinks-param-title": "検索するページ名。<var>$1pageid</var> とは同時に使用できません。",
        "apihelp-query+backlinks-param-pageid": "検索するページID。<var>$1title</var>とは同時に使用できません。",
        "apihelp-query+backlinks-param-namespace": "列挙する名前空間。",
+       "apihelp-query+backlinks-param-dir": "一覧表示する方向。",
        "apihelp-query+backlinks-example-simple": "<kbd>Main page</kbd> へのリンクを表示する。",
        "apihelp-query+backlinks-example-generator": "<kbd>Main page</kbd> にリンクしているページの情報を取得する。",
        "apihelp-query+blocks-description": "ブロックされた利用者とIPアドレスを一覧表示します。",
        "apihelp-query+blocks-param-show": "これらの基準を満たす項目のみを表示します。\nたとえば、IPアドレスの無期限ブロックのみを表示するには、<kbd>$1show=ip|!temp</kbd> を設定します。",
        "apihelp-query+blocks-example-simple": "ブロックを一覧表示する。",
        "apihelp-query+blocks-example-users": "利用者<kbd>Alice</kbd> および <kbd>Bob</kbd> のブロックを一覧表示する。",
+       "apihelp-query+categories-description": "ページが属するすべてのカテゴリを一覧表示します。",
        "apihelp-query+categories-param-prop": "各カテゴリについて取得する追加のプロパティ:",
        "apihelp-query+categories-paramvalue-prop-timestamp": "カテゴリが追加されたときのタイムスタンプを追加します。",
        "apihelp-query+categories-paramvalue-prop-hidden": "<code>_&#95;HIDDENCAT_&#95;</code>で隠されているカテゴリに印を付ける。",
        "apihelp-query+embeddedin-param-title": "検索するページ名。$1pageid とは同時に使用できません。",
        "apihelp-query+embeddedin-param-pageid": "検索するページID. $1titleとは同時に使用できません。",
        "apihelp-query+embeddedin-param-namespace": "列挙する名前空間。",
+       "apihelp-query+embeddedin-param-filterredir": "転送ページを絞り込む方法。",
+       "apihelp-query+embeddedin-param-limit": "返すページの総数。",
        "apihelp-query+embeddedin-example-simple": "<kbd>Template:Stub</kbd> を参照読み込みしているページを表示する。",
        "apihelp-query+embeddedin-example-generator": "<kbd>Template:Stub</kbd> をトランスクルードしているページに関する情報を取得する。",
        "apihelp-query+extlinks-description": "与えられたページにあるすべての外部URL (インターウィキを除く) を返します。",
        "apihelp-query+extlinks-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ<var>$1query</var> が設定されている場合, protocol は <kbd>http</kbd> となります。すべての外部リンクを一覧表示するためにはこのパラメータと <var>$1query</var> の両方を空にしてください。",
        "apihelp-query+extlinks-example-simple": "<kbd>Main Page</kbd> の外部リンクの一覧を取得する。",
        "apihelp-query+exturlusage-description": "与えられたURLを含むページを一覧表示します。",
+       "apihelp-query+exturlusage-param-prop": "どの情報を結果に含めるか:",
        "apihelp-query+exturlusage-paramvalue-prop-ids": "ページのIDを追加します。",
        "apihelp-query+exturlusage-paramvalue-prop-title": "ページ名と名前空間IDを追加します。",
        "apihelp-query+exturlusage-paramvalue-prop-url": "ページ内で使用されているURLを追加します。",
+       "apihelp-query+exturlusage-param-protocol": "URLのプロトコル。このパラメータが空であり、かつ<var>$1query</var> が設定されている場合, protocol は <kbd>http</kbd> となります。すべての外部リンクを一覧表示するためにはこのパラメータと <var>$1query</var> の両方を空にしてください。",
        "apihelp-query+exturlusage-param-namespace": "列挙するページ名前空間。",
        "apihelp-query+exturlusage-example-simple": "<kbd>http://www.mediawiki.org</kbd> にリンクしているページを一覧表示する。",
        "apihelp-query+filearchive-description": "削除されたファイルをすべて順に列挙します。",
        "apihelp-query+filearchive-param-from": "列挙の始点となる画像のページ名。",
        "apihelp-query+filearchive-param-to": "列挙の終点となる画像のページ名。",
+       "apihelp-query+filearchive-param-dir": "一覧表示する方向。",
+       "apihelp-query+filearchive-param-sha1": "画像の SHA1 ハッシュ値。$1sha1base36 をオーバーライドします。",
        "apihelp-query+filearchive-param-prop": "どの画像情報を取得するか:",
        "apihelp-query+filearchive-paramvalue-prop-timestamp": "バージョンがアップロードされたタイムスタンプを追加します。",
        "apihelp-query+filearchive-paramvalue-prop-user": "画像のバージョンをアップロードした利用者を追加します。",
        "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "画像サムネイルのMIMEタイプを追加します(url と $1urlwidth パラメータが必須です)。",
        "apihelp-query+imageinfo-paramvalue-prop-mediatype": "ファイルのメディアタイプを追加します。",
        "apihelp-query+imageinfo-paramvalue-prop-metadata": "ファイルのバージョンの Exif メタデータを一覧表示します。",
+       "apihelp-query+imageinfo-paramvalue-prop-archivename": "非最新バージョンのアーカイブバージョンのファイル名を追加します。",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "バージョンのビット深度を追加します。",
        "apihelp-query+imageinfo-param-start": "一覧表示の始点となるタイムスタンプ。",
        "apihelp-query+imageinfo-param-end": "一覧表示の終点となるタイムスタンプ。",
        "apihelp-query+info-param-prop": "追加で取得するプロパティ:",
        "apihelp-query+info-paramvalue-prop-protection": "それぞれのページの保護レベルを一覧表示する。",
        "apihelp-query+info-example-simple": "<kbd>Main Page</kbd> に関する情報を取得する。",
+       "apihelp-query+iwbacklinks-param-prefix": "インターウィキ接頭辞。",
+       "apihelp-query+iwbacklinks-param-title": "検索するウィキ間リンク。<var>$1blprefix</var>と同時に使用しなければなりません。",
+       "apihelp-query+iwbacklinks-param-limit": "返すページの総数。",
        "apihelp-query+iwbacklinks-param-prop": "取得するプロパティ:",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "インターウィキ接頭辞を追加します。",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "ウィキ間リンクのページ名を追加します。",
+       "apihelp-query+iwbacklinks-param-dir": "一覧表示する方向。",
        "apihelp-query+iwbacklinks-example-simple": "[[wikibooks:Test]] へリンクしているページを取得する。",
        "apihelp-query+iwbacklinks-example-generator": "[[wikibooks:Test]] へリンクしているページの情報を取得する。",
+       "apihelp-query+iwlinks-description": "ページからのすべてのウィキ間リンクを返します。",
+       "apihelp-query+iwlinks-param-url": "完全なURLを取得するかどうか (<var>$1prop</var>とは同時に使用できません).",
+       "apihelp-query+iwlinks-param-prop": "各言語間リンクについて取得する追加のプロパティ:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "完全なURLを追加します。",
        "apihelp-query+iwlinks-param-limit": "返すウィキ間リンクの数。",
        "apihelp-query+iwlinks-param-prefix": "この接頭辞のウィキ間リンクのみを返す。",
        "apihelp-query+iwlinks-param-title": "検索するウィキ間リンク。<var>$1</var> と同時に使用しなければなりません。",
+       "apihelp-query+iwlinks-param-dir": "一覧表示する方向。",
        "apihelp-query+iwlinks-example-simple": "<kbd>Main Page</kbd> にあるウィキ間リンクを取得する。",
        "apihelp-query+langbacklinks-param-lang": "言語間リンクの言語。",
        "apihelp-query+langbacklinks-param-title": "検索する言語間リンク。$1lang と同時に使用しなければなりません。",
        "apihelp-query+langbacklinks-param-limit": "返すページの総数。",
        "apihelp-query+langbacklinks-param-prop": "取得するプロパティ:",
+       "apihelp-query+langbacklinks-paramvalue-prop-lllang": "言語間リンクの言語コードを追加します。",
        "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "言語間リンクのページ名を追加します。",
+       "apihelp-query+langbacklinks-param-dir": "一覧表示する方向。",
        "apihelp-query+langbacklinks-example-simple": "[[:fr:Test]] へリンクしているページを取得する。",
        "apihelp-query+langbacklinks-example-generator": "[[:fr:Test]] へリンクしているページの情報を取得する。",
+       "apihelp-query+langlinks-description": "ページからのすべての言語間リンクを返します。",
        "apihelp-query+langlinks-param-limit": "返す言語間リンクの数。",
        "apihelp-query+langlinks-param-url": "完全なURLを取得するかどうか (<var>$1prop</var>とは同時に使用できません).",
+       "apihelp-query+langlinks-param-prop": "各言語間リンクについて取得する追加のプロパティ:",
        "apihelp-query+langlinks-paramvalue-prop-url": "完全なURLを追加します。",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "ネイティブ言語名を追加します。",
        "apihelp-query+langlinks-param-lang": "この言語コードの言語間リンクのみを返す。",
        "apihelp-query+langlinks-param-title": "検索するリンク。<var>$1lang</var>と同時に使用しなければなりません。",
+       "apihelp-query+langlinks-param-dir": "一覧表示する方向。",
        "apihelp-query+langlinks-example-simple": "<kbd>Main Page</kbd> にある言語間リンクを取得する。",
        "apihelp-query+links-description": "ページからのすべてのリンクを返します。",
        "apihelp-query+links-param-namespace": "この名前空間へのリンクのみ表示する。",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "編集のフラグを追加します。",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "編集のタイムスタンプを追加します。",
        "apihelp-query+recentchanges-paramvalue-prop-title": "編集のページ名を追加します。",
-       "apihelp-query+recentchanges-paramvalue-prop-ids": "ページID、最近の変更IDと新旧の版IDを追加します。",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "ページID、最近の更新IDと新旧の版IDを追加します。",
        "apihelp-query+recentchanges-paramvalue-prop-sizes": "バイト単位の新旧のページの長さを追加します。",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "編集されたページが転送ページである場合、印を付けます。",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "巡回可能な編集について、巡回済みかどうか印を付けます。",
        "apihelp-watch-example-watch": "<kbd>Main Page</kbd> をウォッチする。",
        "apihelp-watch-example-unwatch": "<kbd>Main Page</kbd> のウォッチを解除する。",
        "apihelp-format-example-generic": "クエリの結果を $1 形式に返します。",
-       "apihelp-dbg-description": "データを PHP の <code>var_export()</code> 形式で出力します。",
-       "apihelp-dbgfm-description": "データを PHP の <code>var_export()</code> 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-json-description": "データを JSON 形式で出力します。",
        "apihelp-json-param-callback": "指定すると、指定した関数呼び出しで出力をラップします。安全のため、利用者固有のデータはすべて制限されます。",
        "apihelp-json-param-utf8": "指定すると、大部分の非 ASCII 文字 (すべてではありません) を、16 進のエスケープ シーケンスに置換する代わりに UTF-8 として符号化します。<var>formatversion</var> が <kbd>1</kbd> でない場合は既定です。",
        "apihelp-php-description": "データを PHP のシリアル化した形式で出力します。",
        "apihelp-phpfm-description": "データを PHP のシリアル化した形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-rawfm-description": "データをデバッグ要素付きで JSON 形式 (HTML に埋め込んだ形式) で出力します。",
-       "apihelp-txt-description": "データを PHP の <code>print_r()</code> 形式で出力します。",
-       "apihelp-txtfm-description": "データを PHP の <code>print_r()</code> 形式 (HTML に埋め込んだ形式) で出力します。",
        "apihelp-xml-description": "データを XML 形式で出力します。",
        "apihelp-xml-param-xslt": "指定すると、XSLスタイルシートとして名付けられたページを追加します。値は、必ず、{{ns:mediawiki}} 名前空間の、ページ名の末尾が <code>.xsl</code> でのタイトルである必要があります。",
        "apihelp-xml-param-includexmlnamespace": "指定すると、XML 名前空間を追加します。",
        "apihelp-xmlfm-description": "データを XML 形式 (HTML に埋め込んだ形式) で出力します。",
-       "apihelp-yaml-description": "データを YAML 形式で出力します。",
-       "apihelp-yamlfm-description": "データを YAML 形式 (HTML に埋め込んだ形式) で出力します。",
        "api-format-title": "MediaWiki API の結果",
        "api-format-prettyprint-header": "このページは $1 形式を HTML で表現したものです。HTML はデバッグに役立ちますが、アプリケーションでの使用には適していません。\n\n<var>format</var> パラメーターを指定すると出力形式を変更できます 。$1 形式の非 HTML 版を閲覧するには、format=$2 を設定してください。\n\n詳細情報については [[mw:API|完全な説明文書]]または [[Special:ApiHelp/main|API のヘルプ]]を参照してください。",
        "api-pageset-param-titles": "対象のページ名のリスト。",
index ccd0dc3..cf45cae 100644 (file)
                        "Yearning"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|설명문서]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 공지 사항] * [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상 작동할 것이지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 바뀔 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors_and_warnings|API:오류 및 경고]]를 참조하십시오.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|설명문서]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 공지 사항] * [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청] </div>\n<strong>상태:</strong> 이 페이지에 표시된 모든 기능은 정상적으로 작동하지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 변경될 수 있습니다. 업데이트 정보를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors_and_warnings|API:오류와 경고]]를 참조하십시오.",
        "apihelp-main-param-action": "수행할 동작",
        "apihelp-main-param-format": "출력값의 형식.",
+       "apihelp-main-param-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, <samp>maxlag</samp> 오류 코드와 <samp>Waiting for $host: $lag seconds lagged</samp> 메시지가 제공됩니다.<br />[[mw:Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]] 에서 더 많은 정보를 얻을 수 있습니다.",
+       "apihelp-main-param-smaxage": "<code>s-maxage</code> HTTP 캐시 컨트롤 헤더를 설정합니다. 에러는 캐시되지 않습니다.",
+       "apihelp-main-param-maxage": "<code>max-age</code> HTTP 캐시 컨트롤 헤더를 설정합니다. 에러는 캐시되지 않습니다.",
+       "apihelp-main-param-assert": "<kbd>user</kbd> 플래그가 설정되어 있다면 로그인 여부를 체크하며, <kbd>bot</kbd>  플래그가 설정되어 있다면 봇 사용자 권한이 설정되어 있는지 확인합니다.",
+       "apihelp-main-param-requestid": "주어진 요청 값은 응답에 포함됩니다. 요청을 구분하기 위해 사용될 수 있습니다.",
+       "apihelp-main-param-servedby": "결과에 요청을 처리한 호스트네임을 포함합니다.",
+       "apihelp-main-param-curtimestamp": "결과의 타임스탬프를 포함합니다.",
        "apihelp-block-description": "사용자를 차단합니다.",
        "apihelp-block-param-user": "차단하고자 하는 계정 이름, IP 주소 또는 대역",
        "apihelp-block-param-expiry": "기한. 상대값(예시: <kbd>5 months</kbd> 또는 </kbd>2 weeks</kbd>) 또는 절대값(예시: <kbd>2014-09-18T12:34:56Z</kbd>)이 될 수 있습니다. <kbd>infinite</kbd>, <kbd>indefinite</kbd> 또는 <kbd>never</kbd>로 설정하면 무기한으로 설정됩니다.",
        "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.",
        "apihelp-block-example-ip-simple": "IP <kbd>192.0.2.5</kbd>에 대해 <kbd>First strike</kbd>라는 이유로 3일간 차단하기",
        "apihelp-block-example-user-complex": "사용자 <kbd>Vandal</kbd>을 <kbd>Vandalism</kbd>이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기",
+       "apihelp-checktoken-param-type": "테스트되는 토큰의 종류.",
        "apihelp-checktoken-param-token": "테스트할 토큰",
+       "apihelp-checktoken-param-maxtokenage": "초로 계산된 토큰의 최대 나이.",
+       "apihelp-checktoken-example-simple": "<kbd>csrf</kbd> 토큰의 유효성을 테스트합니다.",
+       "apihelp-clearhasmsg-description": "현재 사용자의 <code>hasmsg</code> 플래그를 비웁니다.",
+       "apihelp-clearhasmsg-example-1": "현재 계정의 <code>hasmsg</code> 플래그를 삭제합니다.",
+       "apihelp-compare-param-fromtitle": "비교할 첫 이름.",
+       "apihelp-compare-param-fromid": "비교할 첫 문서 ID.",
+       "apihelp-compare-param-fromrev": "비교할 첫 판.",
+       "apihelp-compare-param-totitle": "비교할 두번째 제목.",
+       "apihelp-compare-param-toid": "비교할 두번째 문서 ID.",
+       "apihelp-compare-param-torev": "비교할 두번째 판.",
+       "apihelp-compare-example-1": "판 1과 2의 차이를 생성합니다.",
        "apihelp-createaccount-description": "새 사용자 계정을 만듭니다.",
        "apihelp-createaccount-param-name": "사용자 이름",
        "apihelp-createaccount-param-password": "비밀번호입니다. (<var>$1mailpassword</var>가 설정되어 있으면 무시됩니다)",
+       "apihelp-createaccount-param-domain": "외부 인증의 도메인 (선택적)",
+       "apihelp-createaccount-param-token": "첫 요청에서 획득한 계정 생성 토큰.",
        "apihelp-createaccount-param-email": "사용자 이메일 주소 (선택).",
        "apihelp-createaccount-param-realname": "사용자 실명 (선택).",
+       "apihelp-createaccount-param-mailpassword": "아무 값이든 존재한다면, 랜덤 비밀번호가 이메일로 전송됩니다.",
+       "apihelp-createaccount-param-reason": "선택적인, 기록에 남을 계정을 만드는 이유",
        "apihelp-createaccount-example-pass": "사용자 <kbd>testuser</kbd>를 만들고 비밀번호를 <kbd>test123</kbd>으로 설정합니다.",
        "apihelp-createaccount-example-mail": "사용자 <kbd>testmailuser</kbd>를 만들고 자동 생성된 비밀번호를 이메일로 보냅니다.",
        "apihelp-delete-description": "문서 삭제",
        "apihelp-edit-param-notminor": "사소하지 않은 편집.",
        "apihelp-edit-param-bot": "이 편집을 봇으로 표시.",
        "apihelp-edit-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.",
+       "apihelp-edit-param-redirect": "자동으로 넘겨주기 처리하기.",
+       "apihelp-edit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.",
        "apihelp-edit-example-edit": "문서 편집",
        "apihelp-emailuser-description": "사용자에게 이메일을 보냅니다.",
        "apihelp-emailuser-param-target": "이메일을 받을 사용자.",
+       "apihelp-emailuser-param-subject": "제목 헤더.",
+       "apihelp-emailuser-param-text": "메일 본문.",
        "apihelp-emailuser-param-ccme": "자신에게 메일의 복사본을 보냅니다.",
+       "apihelp-emailuser-example-email": "<kbd>WikiSysop</kbd> 사용자에게 텍스트 <kbd>콘텐츠</kbd>로 이메일을 보냅니다.",
+       "apihelp-expandtemplates-description": "모든 틀을 위키텍스트로 확장.",
        "apihelp-expandtemplates-param-title": "문서 제목",
        "apihelp-expandtemplates-param-text": "변환할 위키텍스트.",
+       "apihelp-expandtemplates-paramvalue-prop-wikitext": "확장된 위키텍스트.",
+       "apihelp-expandtemplates-paramvalue-prop-parsetree": "입력값의 XML 파서 트리.",
+       "apihelp-feedcontributions-description": "사용자 기여 피드를 반환합니다.",
+       "apihelp-feedcontributions-param-feedformat": "피드 포맷.",
+       "apihelp-feedcontributions-param-user": "기여를 읽을 사용자 이름.",
+       "apihelp-feedcontributions-param-namespace": "기여를 분류할 이름공간",
        "apihelp-feedcontributions-param-deletedonly": "삭제된 기여만 봅니다.",
        "apihelp-feedcontributions-param-toponly": "최신 판인 편집만 봅니다.",
+       "apihelp-feedrecentchanges-param-feedformat": "피드 포맷.",
        "apihelp-feedrecentchanges-param-hideminor": "사소한 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hidebots": "봇의 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-param-hideanons": "익명 사용자의 편집을 숨깁니다.",
        "apihelp-feedrecentchanges-example-30days": "30일간의 최근 바뀜을 봅니다.",
        "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.",
        "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>를 <kbd>2011-03-05T15:27:40Z</kbd> 판으로 되돌립니다.",
+       "apihelp-import-param-xml": "업로드한 XML 파일.",
        "apihelp-login-param-name": "계정 이름.",
        "apihelp-login-param-password": "비밀번호.",
+       "apihelp-login-param-domain": "도메인 (선택).",
        "apihelp-login-example-login": "로그인.",
        "apihelp-move-description": "문서 이동하기.",
        "apihelp-move-param-reason": "제목을 변경하는 이유",
        "apihelp-options-example-reset": "모든 설정 초기화",
        "apihelp-protect-example-protect": "문서 보호",
        "apihelp-query+allmessages-example-ipb": "<kbd>ipb-</kbd>로 시작하는 메시지를 보입니다.",
+       "apihelp-query+allrevisions-description": "모든 판 표시.",
        "apihelp-query+pageswithprop-param-limit": "나타낼 문서의 최대 수입니다.",
        "apihelp-query+pageswithprop-param-dir": "정렬 순서",
        "apihelp-query+prefixsearch-param-search": "문자열 검색",
index ea7c9eb..c6b08c1 100644 (file)
@@ -60,6 +60,7 @@
        "apihelp-delete-param-title": "De Övverschreff vun dä Sigg zom fottschmiiße. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ bruche.",
        "apihelp-delete-param-pageid": "De Kännong vun dä Sigg zom fottschmiiße. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
        "apihelp-delete-param-reason": "Der Jrond för et Fottschmiiße. Wann dä nit aanjejovve es, weed ene automattesch usjräschnete Jrond jenumme.",
+       "apihelp-delete-param-tags": "Donn de Makehronge änndere, di för dä Enndraach em Logbohch jesaz wähde sulle.",
        "apihelp-delete-param-watch": "Donn di Sigg en däm aktoälle Metmaacher sing Oppaßleß opnämme.",
        "apihelp-delete-param-watchlist": "Donn di Sigg op däm aktoälle Metmaacher sing Oppaßleß udder nemm se druß fott, donn de Enschtällonge nämme, udder donn de Oppaßleß jaa nit verändere.",
        "apihelp-delete-param-unwatch": "Schmihß di Sigg us däm aktoälle Metmaacher singe Oppaßless erus.",
        "apihelp-help-param-wrap": "Donn de Ußjahbe en dem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> sing schtandattmähßejje Schtruktuhr vun de Antwood enschlehße.",
        "apihelp-help-param-toc": "Donn en Enhhaldserzeijschensß en de Ußjahbe vum <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ennschlehße.",
        "apihelp-help-example-main": "Hölp för et Houpmoduhl.",
+       "apihelp-help-example-submodules": "Hölp för „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">action=query</kbd>“ un alle Ongermoduhle.",
        "apihelp-help-example-recursive": "Alle Hölp en eine Sigg.",
        "apihelp-help-example-help": "Alle Hölp övver de Hölp säälver.",
        "apihelp-help-example-query": "Hölp för zwei Ongermoduhle för Frohre.",
        "apihelp-parse-paramvalue-prop-sections": "Jitt de Affschnedde em jepahßde Wikkitäx uß.",
        "apihelp-parse-paramvalue-prop-revid": "Deiht de Kännong vun de Väsjohn vun dä jepahßde Sigg derbei.",
        "apihelp-parse-paramvalue-prop-displaytitle": "Deiht de Övverschreff vum jepahßde Wikkitäx derbei.",
+       "apihelp-parse-paramvalue-prop-headitems": "Jitt de Saacher för enn der <code>&lt;head&gt;</code> vun dä Sigg ze donn.",
        "apihelp-parse-paramvalue-prop-modules": "Jitt dem <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Delivery system in MediaWiki for the optimized run-time loading and managing of modules\">ResourceLoader</i> sing Moduhle uß, di en dä Sigg jebruch wähde. Äntwehder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">jsconfigvars</kbd>“ udder „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">encodedjsconfigvars</kbd>“ moß mer met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">modules</kbd>“ zesamme aanforrdere.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "Livvert de Varrejahble vun dä Ennschtällonge vum JavaSkrep, di äxtra för heh di Sigg enjeschtallt sin.",
        "apihelp-parse-paramvalue-prop-iwlinks": "Jitt de Engewikkilengks em jepahßde Wikkitäx uß.",
        "apihelp-query+allredirects-example-unique": "Ongerscheidlijje Sigge opleste.",
        "apihelp-query+allredirects-example-unique-generator": "Hollt alle Zihlsigge un makkehr di (noch) nit doh sin.",
        "apihelp-query+allredirects-example-generator": "Holl de Sigge met de Ömleidonge.",
+       "apihelp-query+allrevisions-description": "Donn alle Väsjohne opleßte.",
+       "apihelp-query+allrevisions-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
+       "apihelp-query+allrevisions-param-end": "Et Dattom un de Zigg bes woh hen opjezallt wähde sull.",
+       "apihelp-query+allrevisions-param-user": "Donn blohß Väsjohne vun heh däm Metmaacher opleßte.",
+       "apihelp-query+allrevisions-param-excludeuser": "Donn kein Väsjohne vun heh däm Metmaacher opleßte.",
+       "apihelp-query+allrevisions-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
+       "apihelp-query+allrevisions-param-generatetitles": "Wann als ene  Jenerahtor enjesaz, brängk dat Övverschreffte un kein Kännonge vun Väsjohne.",
+       "apihelp-query+allrevisions-example-user": "Donn de läzde fuffzisch Beijdrähsch vum Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ opleßte.",
+       "apihelp-query+allrevisions-example-ns-main": "Donn de eezde fuffzisch Väsjohne em Houp-Appachemang opleßte.",
        "apihelp-query+alltransclusions-param-from": "De Övverschreff vun dä ennjeföhschte Sigg, woh de Leß medd aanfange sull.",
        "apihelp-query+alltransclusions-param-to": "De Övverschreff vun dä ennjeföhschte Sigg, woh et Zälle ophühre sull.",
        "apihelp-query+alltransclusions-param-prefix": "Söhk noh alle dä ennjeföhschte Sigge ier Övverschreffte, di met heh däm Täx aanfange.",
        "apihelp-query+fileusage-param-prop": "Wat för en Eijeschaffte holle:",
        "apihelp-query+fileusage-paramvalue-prop-pageid": "De Kännong för jehde Sigg.",
        "apihelp-query+fileusage-paramvalue-prop-title": "De Övverschreff för jehde Sigg.",
-       "apihelp-query+fileusage-paramvalue-prop-redirect": "Zeijsch aan, wann di Sigge en Ömleijdong es.",
+       "apihelp-query+fileusage-paramvalue-prop-redirect": "Zeijsch aan, wann di Sigg en Ömleijdong es.",
        "apihelp-query+fileusage-param-namespace": "Donn blohß Sigge en heh dä Appachtemangs metnämme.",
        "apihelp-query+fileusage-param-limit": "Wi vill holle?",
        "apihelp-query+fileusage-example-simple": "Holl Aanjahbe övver Sigge, di de Dattei „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[:File:Example.jpg]].</code>“ bruche.",
        "apihelp-query+recentchanges-param-user": "Donn blohß Änderonge vun heh däm Metmaacher opleßte.",
        "apihelp-query+recentchanges-param-excludeuser": "Donn kein Änderonge vun heh däm Metmaacher opleßte.",
        "apihelp-query+recentchanges-param-tag": "Donn blohß Änderonge met heh dä Makkehrong opleßte.",
+       "apihelp-query+recentchanges-paramvalue-prop-tags": "Donn de Makkehronge för dä Enndraach opleßte.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Donn de Pröhvsom för di Enndrähsch oplesßte, di met enne Väsjohn zesamme hange.",
+       "apihelp-query+recentchanges-param-token": "Nemm „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>“ schtatt dämm.",
        "apihelp-query+recentchanges-param-limit": "Wi vill Änderonge ensjesammp zem aanzeije?",
        "apihelp-query+recentchanges-param-type": "Wat för en Zoot Änneronge aanzeije?",
        "apihelp-query+recentchanges-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.",
+       "apihelp-query+recentchanges-param-generaterevisions": "Wann als ene  Jenerahtor enjesaz, brängk dat Kännonge vun Väsjohne un kein Övverschreffte. Enndrähsch en de neußte Änderonge der ohne en Väsjohnskännong, alsu de miehste Logbohchenndrähsch, bränge jaa nix.",
        "apihelp-query+recentchanges-example-simple": "Zeijsch de {{LCFIRST:{{int:recentchanges}}}}",
        "apihelp-query+redirects-description": "Jiff alle Ömleijdonge noh dä aanjejovve Sigge uß.",
        "apihelp-query+redirects-param-prop": "Wat för en Eijeschaffte holle:",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "Makkehronge vun dä Väsjohn.",
        "apihelp-query+revisions+base-param-limit": "Wi vill Väsjohne sulle ußjejovve wähde?",
        "apihelp-query+revisions+base-param-section": "Holl blohß der Ennhald vun däm Affschnett met heh dä Nommer.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Donn dä Täx ömsäze wi vör em Affseschere, ih de Ongerscheijde erus jefonge wähde. Jeihd blohß mem Parramehter <var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1difftotext</var> zesamme.",
        "apihelp-query+search-description": "Söhk em jannze Täx.",
        "apihelp-query+search-param-search": "Söhk noh alle Övverschreffte vun Sigge udder Ennhallde, woh dä Wäät drop paß. Mer kann heh met besönder Aufjahbe beim Söhke schtälle, jeh nohdämm wadd_em Wikki sing Projramm för et Söhke esu alles kann.",
        "apihelp-query+search-param-namespace": "Söhk blohß en heh dä Appachtemangs.",
        "apihelp-query+templates-example-generator": "Holl Ennfommazjuhneövver di Sigge met di Schablohne, di en dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ jebruch wähde.",
        "apihelp-query+templates-example-namespaces": "Holl Sigge uß de {{ns:user}} un {{ns:template}} Appachtemangs, di en di Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ enjeschloße wähde.",
        "apihelp-query+transcludedin-description": "Fengk alle Sigge, di di aanjejovve Sigge enneschlehße.",
+       "apihelp-query+transcludedin-param-prop": "Wat för en Eijeschaffte holle:",
+       "apihelp-query+transcludedin-paramvalue-prop-pageid": "De Kännong för jehde Sigg.",
+       "apihelp-query+transcludedin-paramvalue-prop-title": "De Övverschreff för jehde Sigg.",
+       "apihelp-query+transcludedin-paramvalue-prop-redirect": "Zeijsch aan, wann di Sigg en Ömleijdong es.",
        "apihelp-query+transcludedin-param-namespace": "Donn blohß Sigge en heh dä Appachtemangs ennschlehße.",
        "apihelp-query+transcludedin-param-limit": "Wi vill ußjävve.",
        "apihelp-query+transcludedin-example-simple": "Holl en Leß met Sigge, di en dä Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ ennjeschloße wähde.",
        "apihelp-query+usercontribs-param-userprefix": "Holl beijdrähsch för alle Metmaacher, dänne ier Nahme met heh däm Wääd aanfange. Övverschriehv „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1user</code>“.",
        "apihelp-query+usercontribs-param-namespace": "Donn blohß Beijdrähsch en heh dä Appachtemangs opleßte.",
        "apihelp-query+usercontribs-param-prop": "Donn zohsäzlejje Aanjahbe ennschlehße:",
+       "apihelp-query+usercontribs-paramvalue-prop-ids": "Donn de Kännong för jehde Sigg un jehe Väsjohn derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "Donn de Övverschrevv un de Kännong för et Appachtemang derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Deihd de neuje Jrühße noh dä Änderong derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Deihd de Änderong vun dä Jrühße vun dä Änderong derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Deihd de Makkehronge vun dä Änderong derbei.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "Donn de Makkehronge vun dä Änderong opleßte.",
        "apihelp-query+usercontribs-param-tag": "Donn blohß Väsjohne met heh dä Makehrong opleßte.",
        "apihelp-query+usercontribs-param-toponly": "Bloß Änderonge aanzeije, woh de neußte Väsjohn beij eruß kohm.",
        "apihelp-query+usercontribs-example-user": "Zeijsch dem Metmaacher „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>“ sing Beijdrähsch.",
        "apihelp-query+usercontribs-example-ipprefix": "Zeijsch de Beijdrähsch vun alle <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Internet Protocol\">IP</i>-Adräße, di met „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">192.0.2.</kbd>“ bejenne.",
        "apihelp-query+userinfo-description": "Holl Aanjahbe övver dä aktoälle Metmaacher.",
        "apihelp-query+userinfo-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "Donn alle Jroppe opleßte, woh dä heh Metmaacher dren es.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Donn alle Jroppe opleßte, woh dä heh Metmaacher aotomattesch dren es.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "Donn alle Rääschte opleßte, di dä Metmaacher hät.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Donn alle Jroppe opleßte, woh dä heh Metmaacher eine bei donn udder eruß nämme kann.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "Donn alle Enschtällonge opleßte, di dä heh Metmaacher jesaz hät.",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "Donn heh däm Metmaacher sing Aanzahl Ännderonge derbeij.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Donn alle Mängebeschrängkonge opleßte, di heh dä Metmaacer hät.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Deiht däm Metmaacher singe reeschtejje Nahme derbei.",
+       "apihelp-query+userinfo-paramvalue-prop-email": "Donn de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun heh däm Metmaacer opleßte, un et Dattom, wann di et läz beschtähtesch woode es.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Donn et Dattom vun dämm Metmaacher singe eetze Aanmäldong derbei.",
        "apihelp-query+userinfo-example-simple": "Holl Aanjahbe övver dä aktoälle Metmaacher.",
        "apihelp-query+userinfo-example-data": "Holl zohsäzlejje Aanjahbe övver dä aktoälle Metmaacher.",
        "apihelp-query+users-description": "Holl Aanjahbe övver en Leß vun Metmaacher.",
+       "apihelp-query+users-param-prop": "Wat för en Aanjahbe med enzschlehße:",
+       "apihelp-query+users-paramvalue-prop-rights": "Donn alle Rääschte opleßte, di alle Metmaacher han.",
+       "apihelp-query+users-paramvalue-prop-editcount": "Donn däm Metmaacher sing Aanzahl Ännderonge derbeij.",
+       "apihelp-query+users-paramvalue-prop-registration": "Donn et Dattom vun dämm Metmaacher singe eetze Aanmäldong derbei.",
        "apihelp-query+users-param-users": "En Leß vun Metmaacher för Aanjahbe drövver ze holle.",
+       "apihelp-query+users-param-token": "Nemm „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>“ schtatt dämm.",
        "apihelp-query+users-example-simple": "Holl Aanjahbe för dä Metmaacher <kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Example</kbd>.",
        "apihelp-query+watchlist-param-start": "Et Dattom un de Zigg vun woh aff opjezallt wähde sull.",
        "apihelp-query+watchlist-param-end": "Et Dattum un Uhrzigg, bes wann opzälle.",
        "apihelp-query+watchlist-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle:",
        "apihelp-query+watchlist-paramvalue-prop-ids": "Donn de Kännong vun de Väsohne un de Sigge derbei,",
        "apihelp-query+watchlist-paramvalue-prop-title": "Mähd en Övverschhreff övver di Sigg.",
+       "apihelp-query+watchlist-paramvalue-prop-flags": "Deihd de Makkehronge vun dä Änderong derbei.",
        "apihelp-query+watchlist-paramvalue-prop-user": "Deiht dä Metmaacher derbei, dä di Änderong jemaat hät.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Deiht de kännong vn äm Metmaacher derbei, dä di Änderong jemaat hät.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Deihd et Dattom un de Uhrzigg vun dä Änderong derbei.",
        "apihelp-query+watchlist-paramvalue-type-categorize": "Änderonge aan de Zohjehüreshkeit zoh Saachjroppe.",
        "apihelp-query+watchlistraw-description": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß holle.",
        "apihelp-query+watchlistraw-param-namespace": "Donn blohß Sigge en heh däm Appachtemang opleßte.",
+       "apihelp-query+watchlistraw-param-limit": "Wi vell Äjehbneße ennsjesammp pro Oprohv ußjejovve wähde sulle.",
+       "apihelp-query+watchlistraw-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle:",
        "apihelp-query+watchlistraw-example-simple": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß opleßte.",
        "apihelp-revisiondelete-description": "Versione fottschmieße un widder zeröck holle.",
        "apihelp-revisiondelete-param-hide": "Wat för jehde Väsjohn ze veschteijsche.",
+       "apihelp-revisiondelete-param-show": "Wat för jehde Väsjohn zerökzeholle.",
        "apihelp-revisiondelete-param-suppress": "Ov dat och för de Wiki-Köbesse verschtoche wähde sull, wie för jede Andere.",
        "apihelp-rollback-param-title": "De Övverschreff vun dä Sigg för di_j_en vörrejje Väsjohn zeröckzeholle es. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1pageid</var>“ bruche.",
        "apihelp-rollback-param-pageid": "De Kännong vun dä Sigg för di_j_en vörrejje Väsjohn zeröckzeholle es. Kam_mer nit zersamme met „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">$1title</var>“ bruche.",
+       "apihelp-rollback-param-watchlist": "Donn di Sigg op däm aktoälle Metmaacher sing Oppaßleß udder nemm se druß fott, donn de Enschtällonge nämme, udder donn de Oppaßleß jaa nit verändere.",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "Donn alle Sigge beärbeide, di en Oppaßleßte dren sin.",
        "apihelp-stashedit-param-section": "Däm Affschnett sing Nommer. „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr>0</kbd>“ brängk der eezde Affschnett, dä keijn Övverschreff hät, „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr>new</kbd>“ brängg_ene neuje Affschnett.",
        "apihelp-stashedit-param-sectiontitle": "De Övverschreff för ene neuje Afschnett",
        "apihelp-stashedit-param-text": "Dä Sigg ehre Ennhalld.",
+       "apihelp-stashedit-param-contentmodel": "Et Enhalltsmodäll för dä neue Ennhalld.",
        "apihelp-tag-description": "Donn Makkehronge vun einzel Väsjohne udder Enndraähsch em Logbohch fott nämme udder se verjävve.",
        "apihelp-tag-param-rcid": "Ein udder mih Kännonge uß de neuste Ännderonge, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.",
        "apihelp-tag-param-revid": "Ein Kännong udder mih, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.",
        "apihelp-watch-description": "Donn di Sigg en däm aktoälle Metmaacher singe Oppaßless eren udder schmihß se erus.",
        "apihelp-watch-example-watch": "Don di Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ en de Oppaßleß.",
        "apihelp-watch-example-unwatch": "Schmiiß di Sigg „<kbd lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Main Page</kbd>“ uß dä Oppaßleß erus.",
+       "apihelp-watch-example-generator": "Donn op de eezte paa Sigge em Schtanndadd_Appachtemang oppaße.",
        "apihelp-format-example-generic": "Jiff wadd_erus kohm em Fommaht $1 us.",
+       "apihelp-json-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommahd ußjävve.",
        "apihelp-json-param-ascii": "Wann aanjejovve, deiht alle nit-<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"American Standard Code for Information Interchange\">ASCII</i>-Zeijsche met hexadezimahle !escape-Sequänze koddehre. Dadd es der Schtandatt, wann „<var lang=\"en\" xml:lang=\"en\" dir=\"ltr\">formatversion</var>“ <kbd>1</kbd> es.",
        "apihelp-jsonfm-description": "Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"JavaScript Object Notation\">JSON</i>-Fommaht ußjävve un för schöhn en et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> wandele.",
        "apihelp-none-description": "Donn nix ußjävve.",
        "apihelp-php-description": "Dahte em hengernader jeschrevve <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"PHP Hypertext Preprocessor\">PHP</i>-Fommaht ußjävve.",
+       "apihelp-phpfm-description": "Dahte em hengernannder jeschrevve <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"PHP Hypertext Preprocessor\">PHP</i>-Fommaht ußjävve un för schöhn en et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> wandele.",
+       "apihelp-rawfm-description": "Dahte, met de Aandeijle för et Fählersöhke, em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"JavaScript Object Notation\">JSON</i>-Fommaht ußjävve un för schöhn en et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> wandele.",
        "apihelp-xml-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommahd ußjävve.",
        "apihelp-xml-param-includexmlnamespace": "Wann aanjejovve, deihd en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Appachtemand derbei.",
-       "apihelp-yaml-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"YAML Ain't Markup Language\">YAML</i>-Fommahd ußjävve.",
-       "apihelp-yamlfm-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"YAML Ain't Markup Language\">YAML</i>-Fommahd schöhn met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ußjävve.",
+       "apihelp-xmlfm-description": "Donn de Dahte em <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Extensible Markup Language\">XML</i>-Fommahd schöhn jemaht met <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i> ußjävve.",
        "api-format-title": "Wat et <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Application Programming Interface\">API</i> ußjohv.",
        "api-format-prettyprint-header-only-html": "Dat heh es en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"HyperText Markup Language\">HTML</i>_Daaschtällong un för et Fähersöhke jedaach. Dadd is för Aanwändongsprojramme nit ze bruche.\n\nEn de [[mw:API|complete Dokkemäntazjohn]] un de [[Special:ApiHelp/main|API Hölp_Sigg]] kam_mer doh mih drövver lässe.",
        "api-pageset-param-titles": "En Leß vun Övverschreffte för ze beärbeide.",
index bc072d7..c334d38 100644 (file)
@@ -38,6 +38,9 @@
        "apihelp-feedrecentchanges-param-hideanons": "Ännerunge vun anonyme Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hideliu": "Ännerunge vu registréierte Benotzer verstoppen.",
        "apihelp-feedrecentchanges-param-hidemyself": "Ännerunge vum aktuelle Benotzer verstoppen.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Ännerunge vun der Memberschaft a Kategorie verstoppen.",
+       "apihelp-feedrecentchanges-param-categories": "Nëmmen Ännerunge vu Säiten aus all dëse Kategorië weisen.",
+       "apihelp-feedrecentchanges-param-categories_any": "Nëmmen Ännerunge vu Säiten aus enger vun dëse Kategorië weisen.",
        "apihelp-feedrecentchanges-example-simple": "Rezent Ännerunge weisen",
        "apihelp-help-example-main": "Hëllef fir den Haaptmodul.",
        "apihelp-help-example-recursive": "All Hëllef op enger Säit",
        "apihelp-query+watchlist-paramvalue-prop-user": "Setzt de Benotzer derbäi deen d'Ännerung gemaach huet.",
        "apihelp-query+watchlist-paramvalue-prop-comment": "Setzt d'Bemierkung vun der Ännerung derbäi.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Setzt den Zäitstempel vun der Ännerung derbäi.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Extern Ännerungen.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Ugeluecht Säiten.",
        "apihelp-query+watchlistraw-param-show": "Nëmmen Elementer opzielen déi dëse Critèren entspriechen.",
        "apihelp-query+watchlistraw-example-simple": "Säite vum aktuelle Benotzer senger Iwwerwaachungslëscht opzielen",
        "apihelp-revisiondelete-description": "Versioune läschen a restauréieren.",
diff --git a/includes/api/i18n/lki.json b/includes/api/i18n/lki.json
new file mode 100644 (file)
index 0000000..b2c230a
--- /dev/null
@@ -0,0 +1,25 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Hosseinblue",
+                       "Arash71",
+                       "Lakzon"
+               ]
+       },
+       "apihelp-main-param-action": "کام عملیات انجؤم بِ.",
+       "apihelp-main-param-format": "فرمت خروجی",
+       "apihelp-block-description": "بستن کاربر.",
+       "apihelp-createaccount-param-name": ":نؤم بهرۀگر-کاربر",
+       "apihelp-delete-description": "حةذف وةڵگة",
+       "apihelp-edit-description": "دؤرس کردن و دۀسکاری وۀلگۀ",
+       "apihelp-edit-param-sectiontitle": "نام سۀر وۀلگ تازۀ",
+       "apihelp-edit-example-edit": ".دةسکاری وةڵگة",
+       "apihelp-emailuser-param-subject": "موضوع سةر وةڵگ",
+       "apihelp-emailuser-param-text": "متن رایانه.",
+       "apihelp-login-param-name": "نام کاربری",
+       "apihelp-login-param-password": ".رمز",
+       "apihelp-login-example-login": "نؤم هۀتن.",
+       "apihelp-logout-description": "دۀرچئن و پاک کردن داده متن",
+       "apihelp-logout-example-logout": "خروج کاربر فعلی",
+       "apihelp-options-example-reset": "بازنشانی همه تنظیمات."
+}
index 14b1127..5ad108b 100644 (file)
@@ -5,6 +5,7 @@
                ]
        },
        "apihelp-query+alldeletedrevisions-example-user": "Sąrašas paskutinių 50 ištrintų indėlių pagal vartotoją\n<kbd>Pavyzdys</kbd>.",
+       "apihelp-query+allrevisions-param-namespace": "Rodyti puslapius tik šioje vardų srityje.",
        "apihelp-query+backlinks-example-simple": "Rodyti nuorodas <kbd>Pagrindinis puslapis</kbd>.",
        "apihelp-query+watchlist-paramvalue-type-external": "Išoriniai keitimai.",
        "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
index 1b62c5c..432d9c0 100644 (file)
@@ -9,9 +9,94 @@
        "apihelp-main-param-curtimestamp": "निकालात सद्य वेळठश्याचा अंतर्भाव करा.",
        "apihelp-block-description": "सदस्यास प्रतिबंधित करा.",
        "apihelp-block-param-user": "सदस्याचे नाव, अंक-पत्त्ता, किंवा प्रतिबंध करण्यासाठीचा आयपीचा आवाका.",
+       "apihelp-delete-description": "पान वगळा",
+       "apihelp-edit-param-minor": "छोटे संपादन",
+       "apihelp-edit-param-notminor": "छोटे नसलेले संपादन",
+       "apihelp-edit-example-edit": "पान संपादा",
+       "apihelp-feedrecentchanges-param-categories": "या सर्व वर्गात असलेल्या पानांमधील बदलच फक्त  दाखवा.",
+       "apihelp-feedrecentchanges-param-categories_any": "त्यापेक्षा,या कोणत्याही वर्गांमधील,पानांना झालेले बदलच फक्त दाखवा.",
+       "apihelp-login-param-name": "सदस्य नाव.",
+       "apihelp-login-param-password": "परवलीचा शब्द.",
+       "apihelp-login-example-login": "सनोंद-प्रवेश करा.",
+       "apihelp-move-description": "पृष्ठाचे स्थानांतरण करा.",
+       "apihelp-move-param-ignorewarnings": "सर्व सूचनांकडे दुर्लक्ष करा.",
+       "apihelp-options-example-reset": "पसंतीक्रमाची पुनर्स्थापना",
+       "apihelp-patrol-description": "पानावर किंवा आवृत्तीवर पहारा द्या.",
+       "apihelp-patrol-example-rcid": "अलीकडील बदलावर पहारा द्या.",
+       "apihelp-patrol-example-revid": "आवृत्तीवर पहारा द्या.",
+       "apihelp-protect-description": "पानाची सुरक्षापातळी बदला.",
+       "apihelp-protect-example-protect": "पानास सुरक्षित करा.",
+       "apihelp-query-param-list": "कोणती यादी मागवायची.",
+       "apihelp-query-param-meta": "कोणता मेटाडाटा हवा.",
+       "apihelp-query+allpages-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+allredirects-param-dir": "कोणत्या दिशेस यादी करावयाची.",
        "apihelp-query+allrevisions-description": "सर्व आवृत्त्यांची यादी",
        "apihelp-query+allrevisions-param-user": "फक्त या सदस्याच्याच आवृत्त्यांची यादी करा",
        "apihelp-query+allrevisions-param-excludeuser": "या सदस्याच्या आवृत्त्यांची यादी करु नका.",
+       "apihelp-query+allusers-paramvalue-prop-rights": "सदस्यास असलेल्या अधिकारांची यादी करते.",
+       "apihelp-query+allusers-paramvalue-prop-editcount": "सदस्याची संपादन मोजणी जोडते.",
+       "apihelp-query+allusers-paramvalue-prop-registration": "जर उपलब्ध असेल तर,सदस्याने केंव्हा नोंदणी केली त्याचा वेळठसा(रिक्त असू शकतो)",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "सदस्याची केंद्रीय ओळखण्या व जुळल्याची स्थिती जोडते.",
+       "apihelp-query+allusers-param-witheditsonly": "फक्त संपादन केलेल्या सदस्यांचीच यादी करा.",
+       "apihelp-query+allusers-param-activeusers": "मागील $1 {{PLURAL:$1|दिवसात}} सक्रिय सदस्यांचीच यादी करा.",
+       "apihelp-query+allusers-param-attachedwiki": "<kbd>$1prop=centralids</kbd> याद्वारे असेही दर्शविण्यात येते कि सदस्य हा या विकिशी जुळलेला असून तो या ओळखणीद्वारे ओळखल्या जातो.",
+       "apihelp-query+allusers-example-Y": "<kbd>य</kbd> पासून सदस्यनाव सुरु होणाऱ्या सदस्यांचीच यादी करा.",
+       "apihelp-query+backlinks-description": "दिलेल्या पानास दुवे असणारी सर्व पाने शोधा.",
+       "apihelp-query+backlinks-param-title": "शोधावयाचे शीर्षक.<var>$1pageid</var>यासमवेत वापरु शकत नाही.",
+       "apihelp-query+backlinks-param-pageid": "शोधावयाची पान ओळखण.<var>$1title</var>यासमवेत वापरु शकत नाही.",
+       "apihelp-query+backlinks-param-namespace": "प्रगणन करावयाचे नामविश्व.",
+       "apihelp-query+backlinks-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+backlinks-param-filterredir": "पुनर्निर्देशनांची कशी गाळणी करावयाची. जर <var>$1redirect</var>सक्षम करुन <kbd>nonredirects</kbd>ला स्थापले तर, ते केवळ दुसऱ्या स्तरासच लागू होते.",
+       "apihelp-query+backlinks-param-redirect": "जर दुवा जोडणारे पान एक पुनर्निर्देशन असेल तर,त्या पुनर्निर्देशनास दुवे असलेली पानेही शोधा. महत्तम मर्यादा अर्धी केल्या जाते.",
+       "apihelp-query+backlinks-example-simple": "<kbd>मुखपृष्ठास</kbd> असणारे दुवे दाखवा.",
+       "apihelp-query+backlinks-example-generator": "<kbd>मुखपृष्ठास</kbd> दुवे असणाऱ्या पानांची माहिती घ्या.",
+       "apihelp-query+blocks-description": "सर्व प्रतिबंधित सदस्यांची व अंकपत्त्यांची यादी करा.",
+       "apihelp-query+blocks-param-start": "च्यापासून प्रगणना सुरु करावयाची त्याचा वेळठसा.",
+       "apihelp-query+blocks-param-end": "कुठपर्यंत प्रगणना संपवायची त्याचा वेळठसा.",
+       "apihelp-query+blocks-paramvalue-prop-user": "प्रतिबंधित सदस्याचे सदस्यनाव जोडते.",
+       "apihelp-query+blocks-paramvalue-prop-userid": "प्रतिबंधित सदस्याची सदस्यओळखण जोडते.",
+       "apihelp-query+blocks-paramvalue-prop-by": "प्रतिबंधन करणाऱ्या सदस्याचे सदस्यनाव जोडते.",
+       "apihelp-query+blocks-paramvalue-prop-byid": "प्रतिबंधन करणाऱ्या सदस्याची सदस्यओळखण जोडते.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "प्रतिबंधन केंव्हा केले त्याचा वेळठसा जोडते.",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "प्रतिबंधनाची मुदत केंव्हा संपते त्याचा वेळठसा.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "प्रतिबंधनाची दिलेली कारणे जोडते.",
+       "apihelp-query+blocks-paramvalue-prop-range": "प्रतिबंधनाने बाधित अंकपत्त्यांचा आवाका जोडते.",
+       "apihelp-query+blocks-example-simple": "प्रतिबंधनाची यादी करा.",
+       "apihelp-query+blocks-example-users": "सदस्य<kbd>अलिस</kbd> व <kbd>बॉब</kbd> या सदस्यांचे प्रतिबंधनाची यादी करा.",
+       "apihelp-query+categories-description": "ही पाने कोणकोणत्या वर्गात आहेत त्याची यादी करा.",
+       "apihelp-query+categories-param-show": "कोणत्या प्रकारचे वर्ग दाखवायचेत.",
+       "apihelp-query+categories-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+categories-example-simple": "<kbd>अल्बर्ट आईन्स्टाईन</kbd>हे पान कोणकोणत्या वर्गात आहे त्याची यादी करा.",
+       "apihelp-query+categories-example-generator": "<kbd>अल्बर्ट आईन्स्टाईन</kbd>या पानात वापरलेल्या सर्व वर्गांची माहिती द्या.",
+       "apihelp-query+categorymembers-description": "दिलेल्या वर्गात असलेल्या सर्व पानांची यादी करते.",
+       "apihelp-query+deletedrevs-param-end": "कुठपर्यंत प्रगणना संपवायची त्याचा वेळठसा.",
+       "apihelp-query+deletedrevs-param-from": "या शीर्षकापासून यादी करणे सुरु करा.",
+       "apihelp-query+deletedrevs-param-to": "या शीर्षकास यादी करणे थांबवा.",
+       "apihelp-query+deletedrevs-param-unique": "प्रत्येक पानाच्या फक्त एकाच आवृत्तीची यादी करा.",
+       "apihelp-query+deletedrevs-param-user": "या सदस्याच्या आवृत्तीचीच यादी करा.",
+       "apihelp-query+deletedrevs-param-excludeuser": "या सदस्याच्या आवृत्तीची यादी करु नका.",
+       "apihelp-query+deletedrevs-param-namespace": "या नामविश्वात असलेल्या पानांचीच यादी करा.",
+       "apihelp-query+deletedrevs-param-limit": "यादी करावयाच्या आवृत्त्यांचे महत्तम प्रमाण.",
+       "apihelp-query+duplicatefiles-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+embeddedin-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+filearchive-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+images-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+imageusage-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+iwlinks-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+langbacklinks-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+langlinks-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+links-param-dir": "कोणत्या दिशेस यादी करावयाची.",
+       "apihelp-query+recentchanges-param-end": "कुठपर्यंत प्रगणना संपवायची त्याचा वेळठसा.",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "सदस्याची केंद्रीय ओळखण्या व जुळल्याची स्थिती जोडते.",
+       "apihelp-query+userinfo-param-attachedwiki": "<kbd>$1prop=centralids</kbd> याद्वारे असे दर्शविण्यात येते कि सदस्य हा या विकिशी जुळलेला असून तो या ओळखणीद्वारे ओळखल्या जातो.",
+       "apihelp-query+users-paramvalue-prop-centralids": "सदस्याची केंद्रीय ओळखण्या व जुळल्याची स्थिती जोडते.",
+       "apihelp-query+users-param-attachedwiki": "<kbd>$1prop=centralids</kbd> याद्वारे असे दर्शविण्यात येते कि सदस्य हा या विकिशी जुळलेला असून तो या ओळखणीद्वारे ओळखल्या जातो.",
+       "apihelp-query+watchlist-param-type": "कोणत्या प्रकारचे बदल दाखवायचे:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "नित्याची पान संपादने.",
+       "apihelp-query+watchlist-paramvalue-type-external": "बाह्य बदल.",
+       "apihelp-query+watchlist-paramvalue-type-new": "पान तयार करणे.",
+       "apihelp-query+watchlist-paramvalue-type-log": "नोंद प्रविष्ट्या",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "वर्ग सदस्यता बदलते.",
        "apihelp-stashedit-param-title": "पानाच्या मथळ्याचे संपादन होत आहे.",
        "apihelp-stashedit-param-sectiontitle": "नविन विभागाचा मथळा"
 }
index e515646..e2d862f 100644 (file)
@@ -5,7 +5,12 @@
                        "C.R."
                ]
        },
+       "apihelp-main-param-servedby": "Include 'o risultato 'e nomme d' 'o host ca servette 'a richiesta.",
+       "apihelp-main-param-curtimestamp": "Include dint' 'o risultato 'o timestamp 'e mò.",
        "apihelp-block-description": "Blocca n'utente.",
+       "apihelp-block-param-user": "Nomme utente, indirizzo IP o range IP 'a bluccà.",
+       "apihelp-block-param-reason": "Mutive p' 'o blocco.",
+       "apihelp-block-param-nocreate": "Nun premmmettere 'a criazione 'e cunte",
        "apihelp-compare-param-fromtitle": "Primmo titolo 'a cunfruntà.",
        "apihelp-compare-param-fromid": "Primmo ID 'e paggena a cunfruntà.",
        "apihelp-compare-param-fromrev": "Primma verziona a cunfruntà.",
index f3d8fcd..949b4e7 100644 (file)
@@ -86,6 +86,7 @@
        "apihelp-feedcontributions-param-toponly": "Pokazuj tylko edycje będące ostatnią zmianą strony.",
        "apihelp-feedcontributions-param-newonly": "Pokazuj tylko edycje tworzące stronę.",
        "apihelp-feedcontributions-param-showsizediff": "Pokaż różnicę rozmiaru między wersjami.",
+       "apihelp-feedrecentchanges-param-feedformat": "Format danych wyjściowych.",
        "apihelp-feedrecentchanges-param-namespace": "Przestrzeń nazw, do której ograniczone są wyniki.",
        "apihelp-feedrecentchanges-param-invert": "Wszystkie przestrzenie nazw oprócz wybranej.",
        "apihelp-feedrecentchanges-param-days": "Dni, do których ograniczone są wyniki.",
        "apihelp-help-param-helpformat": "Format wyjściowy pomocy.",
        "apihelp-help-param-toc": "Dołącz spis treści do wyjściowego HTML.",
        "apihelp-help-example-main": "Pomoc dla modułu głównego",
+       "apihelp-help-example-submodules": "Pomoc dla <kbd>action=query</kbd> i wszystkich jej podmodułów.",
        "apihelp-help-example-recursive": "Cała pomoc na jednej stronie.",
        "apihelp-help-example-help": "Pomoc dla modułu pomocy",
        "apihelp-help-example-query": "Pomoc dla dwóch podmodułów zapytań.",
        "apihelp-upload-param-filename": "Nazwa pliku docelowego.",
        "apihelp-userrights-param-user": "Nazwa użytkownika.",
        "apihelp-userrights-param-reason": "Powód zmiany.",
-       "apihelp-dbg-description": "Dane wyjściowe w formacie <code>var_export()</code> (funkcji PHP).",
-       "apihelp-dbgfm-description": "Dane wyjściowe w formacie <code>var_export()</code> (funkcji PHP) (prawidłowo wyświetlane w HTML).",
        "apihelp-json-description": "Dane wyjściowe w formacie JSON.",
        "apihelp-jsonfm-description": "Dane wyjściowe w formacie JSON (prawidłowo wyświetlane w HTML).",
        "apihelp-php-description": "Dane wyjściowe w serializowany formacie PHP.",
        "apihelp-phpfm-description": "Dane wyjściowe w serializowanym formacie PHP (prawidłowo wyświetlane w HTML).",
-       "apihelp-txt-description": "Dane wyjściowe w formacie <code>print_r()</code> (funkcji PHP).",
-       "apihelp-txtfm-description": "Dane wyjściowe w formacie <code>print_r()</code> (funkcji PHP) (prawidłowo wyświetlane w HTML).",
        "apihelp-xml-description": "Dane wyjściowe w formacie XML.",
-       "apihelp-xml-param-xslt": "Jeśli określony, dodaje &lt;xslt&gt; jako arkusz styli. Powinna to być strona wiki w przestrzeni nazw MediaWiki, której nazwy stron kończą się na \".xsl\".",
+       "apihelp-xml-param-xslt": "Jeśli określony, dodaje podaną stronę jako arkusz styli XSL. Powinna to być strona wiki w przestrzeni nazw MediaWiki, której nazwa kończy się na <code>.xsl</code>.",
        "apihelp-xmlfm-description": "Dane wyjściowe w formacie XML (prawidłowo wyświetlane w HTML).",
-       "apihelp-yaml-description": "Dane wyjściowe w formacie YAML.",
-       "apihelp-yamlfm-description": "Dane wyjściowe w formacie YAML (prawidłowo wyświetlane w HTML).",
        "api-format-title": "Wynik MediaWiki API",
        "api-help-title": "Pomoc MediaWiki API",
        "api-help-lead": "To jest automatycznie wygenerowana strona dokumentacji MediaWiki API.\nDokumentacja i przykłady: https://www.mediawiki.org/wiki/API",
index 76d94e2..e94d13b 100644 (file)
@@ -5,14 +5,17 @@
                        "Macofe"
                ]
        },
+       "apihelp-main-param-action": "کومه کړنه ترسره کړم.",
        "apihelp-block-description": "په يو کارن بنديز لگول.",
        "apihelp-block-param-user": "کارن-نوم، IP پته، يا IP سيمې باندې بنديز لگول.",
        "apihelp-block-param-reason": "د بنديز سبب.",
        "apihelp-createaccount-param-name": "کارن-نوم.",
        "apihelp-delete-description": "يو مخ ړنگول.",
        "apihelp-edit-description": "مخونه جوړول او سمول.",
+       "apihelp-edit-param-sectiontitle": "د يوې نوې برخې سرليک.",
        "apihelp-edit-param-text": "مخ مېنځپانگه.",
        "apihelp-edit-param-minor": "وړوکی سمون.",
+       "apihelp-edit-param-bot": "دا سمون د روباټ په توگه په نښه کول.",
        "apihelp-edit-example-edit": "يو مخ سمول.",
        "apihelp-emailuser-description": "کارن ته برېښليک لېږل.",
        "apihelp-expandtemplates-param-title": "د مخ سرليک.",
        "apihelp-query+search-example-simple": "د <kbd>meaning</kbd> پلټل.",
        "apihelp-query+search-example-text": "د <kbd>مانا</kbd> لپاره متنونه پلټل.",
        "apihelp-query+watchlist-paramvalue-prop-title": "د يو مخ سرليک ورگډوي.",
+       "apihelp-query+watchlist-paramvalue-type-new": "مخ جوړونې.",
+       "apihelp-stashedit-param-sectiontitle": "د يوې نوې برخې سرليک.",
        "apihelp-tag-param-reason": "د بدلون سبب.",
        "apihelp-unblock-param-reason": "د بنديز ليرې کولو سبب.",
+       "apihelp-undelete-param-reason": "د بيازېرملو سبب.",
        "apihelp-upload-param-watch": "مخ کتل.",
        "apihelp-upload-param-file": "د دوتنې مېنځپانگه.",
        "apihelp-userrights-param-user": "کارن نوم.",
        "apihelp-userrights-param-userid": "کارن پېژند.",
        "apihelp-userrights-param-reason": "د بدلون سبب.",
+       "api-help-title": "د مېډياويکي API لارښود",
+       "api-help-main-header": "آر ماډيول",
        "api-help-source": "سرچينه: $1",
        "api-help-source-unknown": "سرچينه: <span class=\"apihelp-unknown\">ناجوت</span>",
        "api-help-license": "منښتليک: [[$1|$2]]",
        "api-help-license-noname": "منښتليک: [[$1|تړنه وڅارئ]]",
        "api-help-license-unknown": "منښتليک: <span class=\"apihelp-unknown\">ناجوت</span>",
+       "api-help-parameters": "{{PLURAL:$1|پاراميټر|پاراميټرونه}}:",
+       "api-help-param-required": "دې پاراميټر ته اړتيا ده.",
        "api-help-datatypes-header": "اومتوگ ډولونه",
        "api-help-param-default": "تلواليز: $1",
        "api-help-param-default-empty": "تلواليز: <span class=\"apihelp-empty\">(تش)</span>",
index 947c89b..0cd7596 100644 (file)
        "apihelp-feedrecentchanges-param-tagfilter": "{{doc-apihelp-param|feedrecentchanges|tagfilter}}",
        "apihelp-feedrecentchanges-param-target": "{{doc-apihelp-param|feedrecentchanges|target}}",
        "apihelp-feedrecentchanges-param-showlinkedto": "{{doc-apihelp-param|feedrecentchanges|showlinkedto}}",
+       "apihelp-feedrecentchanges-param-categories": "{{doc-apihelp-param|feedrecentchanges|categories}}",
+       "apihelp-feedrecentchanges-param-categories_any": "{{doc-apihelp-param|feedrecentchanges|categories_any}}",
        "apihelp-feedrecentchanges-example-simple": "{{doc-apihelp-example|feedrecentchanges}}",
        "apihelp-feedrecentchanges-example-30days": "{{doc-apihelp-example|feedrecentchanges}}",
        "apihelp-feedwatchlist-description": "{{doc-apihelp-description|feedwatchlist}}",
        "apihelp-help-param-wrap": "{{doc-apihelp-param|help|wrap}}",
        "apihelp-help-param-toc": "{{doc-apihelp-param|help|toc}}",
        "apihelp-help-example-main": "{{doc-apihelp-example|help}}",
+       "apihelp-help-example-submodules": "{{doc-apihelp-example|help}}",
        "apihelp-help-example-recursive": "{{doc-apihelp-example|help}}",
        "apihelp-help-example-help": "{{doc-apihelp-example|help}}",
        "apihelp-help-example-query": "{{doc-apihelp-example|help}}",
        "apihelp-query+allusers-paramvalue-prop-rights": "{{doc-apihelp-paramvalue|query+allusers|prop|rights}}",
        "apihelp-query+allusers-paramvalue-prop-editcount": "{{doc-apihelp-paramvalue|query+allusers|prop|editcount}}",
        "apihelp-query+allusers-paramvalue-prop-registration": "{{doc-apihelp-paramvalue|query+allusers|prop|registration}}",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "{{doc-apihelp-paramvalue|query+allusers|prop|centralids}}",
        "apihelp-query+allusers-param-limit": "{{doc-apihelp-param|query+allusers|limit}}",
        "apihelp-query+allusers-param-witheditsonly": "{{doc-apihelp-param|query+allusers|witheditsonly}}",
        "apihelp-query+allusers-param-activeusers": "{{doc-apihelp-param|query+allusers|activeusers|params=* $1 - Value of [[mw:Manual:$wgActiveUserDays]]|paramstart=2}}",
+       "apihelp-query+allusers-param-attachedwiki": "{{doc-apihelp-param|query+allusers|attachedwiki}}",
        "apihelp-query+allusers-example-Y": "{{doc-apihelp-example|query+allusers}}",
        "apihelp-query+backlinks-description": "{{doc-apihelp-description|query+backlinks}}",
        "apihelp-query+backlinks-param-title": "{{doc-apihelp-param|query+backlinks|title}}",
        "apihelp-query+userinfo-paramvalue-prop-acceptlang": "{{doc-apihelp-paramvalue|query+userinfo|prop|acceptlang}}",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "{{doc-apihelp-paramvalue|query+userinfo|prop|registrationdate}}",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "{{doc-apihelp-paramvalue|query+userinfo|prop|unreadcount|params=* $1 - Maximum value for the \"unreadcount\" property.\n* $2 - Return value when there are more unread pages.|paramstart=3}}",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "{{doc-apihelp-paramvalue|query+userinfo|prop|centralids}}",
+       "apihelp-query+userinfo-param-attachedwiki": "{{doc-apihelp-param|query+userinfo|attachedwiki}}",
        "apihelp-query+userinfo-example-simple": "{{doc-apihelp-example|query+userinfo}}",
        "apihelp-query+userinfo-example-data": "{{doc-apihelp-example|query+userinfo}}",
        "apihelp-query+users-description": "{{doc-apihelp-description|query+users}}",
        "apihelp-query+users-paramvalue-prop-registration": "{{doc-apihelp-paramvalue|query+users|prop|registration}}",
        "apihelp-query+users-paramvalue-prop-emailable": "{{doc-apihelp-paramvalue|query+users|prop|emailable}}",
        "apihelp-query+users-paramvalue-prop-gender": "{{doc-apihelp-paramvalue|query+users|prop|gender}}",
+       "apihelp-query+users-paramvalue-prop-centralids": "{{doc-apihelp-paramvalue|query+users|prop|centralids}}",
+       "apihelp-query+users-param-attachedwiki": "{{doc-apihelp-param|query+users|attachedwiki}}",
        "apihelp-query+users-param-users": "{{doc-apihelp-param|query+users|users}}",
        "apihelp-query+users-param-token": "{{doc-apihelp-param|query+users|token}}",
        "apihelp-query+users-example-simple": "{{doc-apihelp-example|query+users}}",
        "apihelp-watch-example-unwatch": "{{doc-apihelp-example|watch}}",
        "apihelp-watch-example-generator": "{{doc-apihelp-example|watch}}",
        "apihelp-format-example-generic": "{{doc-apihelp-example|format|params=* $1 - Format name|paramstart=2|noseealso=1}}",
-       "apihelp-dbg-description": "{{doc-apihelp-description|dbg|seealso=* {{msg-mw|apihelp-dbgfm-description}}}}",
-       "apihelp-dbgfm-description": "{{doc-apihelp-description|dbgfm|seealso=* {{msg-mw|apihelp-dbg-description}}}}",
        "apihelp-json-description": "{{doc-apihelp-description|json|seealso=* {{msg-mw|apihelp-jsonfm-description}}}}",
        "apihelp-json-param-callback": "{{doc-apihelp-param|json|callback}}",
        "apihelp-json-param-utf8": "{{doc-apihelp-param|json|utf8}}",
        "apihelp-php-param-formatversion": "{{doc-apihelp-param|json|formatversion}}",
        "apihelp-phpfm-description": "{{doc-apihelp-description|phpfm|seealso=* {{msg-mw|apihelp-php-description}}}}",
        "apihelp-rawfm-description": "{{doc-apihelp-description|rawfm|seealso=* {{msg-mw|apihelp-raw-description}}}}",
-       "apihelp-txt-description": "{{doc-apihelp-description|txt|seealso=* {{msg-mw|apihelp-txtfm-description}}}}",
-       "apihelp-txtfm-description": "{{doc-apihelp-description|txtfm|seealso=* {{msg-mw|apihelp-txt-description}}}}",
        "apihelp-xml-description": "{{doc-apihelp-description|xml|seealso=* {{msg-mw|apihelp-xmlfm-description}}}}",
        "apihelp-xml-param-xslt": "{{doc-apihelp-param|xml|xslt}}",
        "apihelp-xml-param-includexmlnamespace": "{{doc-apihelp-param|xml|includexmlnamespace}}",
        "apihelp-xmlfm-description": "{{doc-apihelp-description|xmlfm|seealso=* {{msg-mw|apihelp-xml-description}}}}",
-       "apihelp-yaml-description": "{{doc-apihelp-description|yaml|seealso=* {{msg-mw|apihelp-yamlfm-description}}}}",
-       "apihelp-yamlfm-description": "{{doc-apihelp-description|yamlfm|seealso=* {{msg-mw|apihelp-yaml-description}}}}",
        "api-format-title": "{{technical}}\nPage title when API output is pretty-printed in HTML.",
        "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
        "api-format-prettyprint-header-only-html": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but there is no non-html module.\n\nParameters:\n* $1 - Format name",
index 5ce21c5..766da01 100644 (file)
@@ -79,6 +79,8 @@
        "apihelp-edit-param-redirect": "Автоматически разрешать редиректы.",
        "apihelp-edit-param-contentformat": "Формат сериализации содержимого, используемый для ввода текста.",
        "apihelp-edit-example-edit": "Редактировать страницу",
+       "apihelp-edit-example-prepend": "Добавить магическое слово <kbd>_&#95;NOTOC_&#95;</kbd> в начало страницы.",
+       "apihelp-edit-example-undo": "Отменить изменения с 13579 по 13585 с добавлением автоматического описания правки.",
        "apihelp-emailuser-description": "Письмо участнику",
        "apihelp-emailuser-param-target": "Адресат электронного письма",
        "apihelp-emailuser-param-subject": "Заголовок темы.",
        "api-pageset-param-revids": "Список идентификаторов версий для работы.",
        "api-help-title": "Справка MediaWiki API",
        "api-help-main-header": "Главный модуль",
-       "api-help-flag-deprecated": "ЭÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ñ\83Ñ\81Ñ\82аÑ\80евÑ\88им.",
+       "api-help-flag-deprecated": "ЭÑ\82оÑ\82 Ð¼Ð¾Ð´Ñ\83лÑ\8c Ñ\83Ñ\81Ñ\82аÑ\80ел.",
        "api-help-flag-readrights": "Этот модуль требует прав на чтение.",
        "api-help-flag-writerights": "Этот модуль требует права на запись.",
        "api-help-flag-mustbeposted": "Этот модуль принимает только Post-запросы.",
index 86f2318..ad4bee4 100644 (file)
@@ -5,7 +5,9 @@
                        "Aursani"
                ]
        },
-       "apihelp-query+allrevisions-description": "سمورن مسودن جي فهرست پيش ڪريو.",
+       "apihelp-query+allrevisions-description": "سمورن ڀيرن جي فهرست پيش ڪريو.",
+       "apihelp-query+watchlist-param-type": "ڪهڙن قسمن جون تبديليون ڏيکارجن:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "قاعديوار صفحاتي ترميمون.",
        "apihelp-query+watchlist-paramvalue-type-external": "خارجي تبديليون.",
        "apihelp-query+watchlist-paramvalue-type-new": "صفحن جون تخليقون.",
        "apihelp-query+watchlist-paramvalue-type-log": "لاگ داخلائون."
index 15a9ef4..ab54698 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Susith Chandira Gts"
+                       "Susith Chandira Gts",
+                       "SusithCM"
                ]
        },
        "apihelp-main-param-action": "ඉටු කිරීමට ඇත්තේ කුමන ක්‍රියාවද.",
        "apihelp-help-example-main": "ප්‍රධාන ඒකකය සදහා උදවු කරන්න",
        "apihelp-help-example-recursive": "සියලුම උදවු එක පිටුවක් තුල",
        "apihelp-help-example-query": "සැකසහිත අනුඒකක සදහා උදවු කරන්න",
+       "apihelp-login-param-name": "පරිශීලක නාමය.",
        "apihelp-parse-paramvalue-prop-jsconfigvars": "මෙම පිටුව සඳහා වූ JavaScript වින්‍යාස විචල්‍යයන් ලබා දෙයි.",
        "apihelp-userrights-param-user": "පරිශීලක නාමය.",
        "apihelp-userrights-param-userid": "පරිශීලක අනන්‍යාංකය.",
        "apihelp-format-example-generic": "$1 ආකෘතියේ ඇති සැක සහිත ප්‍රථිපල පරිවර්තනය කරන්න",
-       "apihelp-dbg-description": "ප්‍රතිදාන දත්ත PHP හි var_export() ආකෘතියෙන් පවතී.",
-       "apihelp-dbgfm-description": "ප්‍රතිදාන දත්ත PHP හි var_export() ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
        "apihelp-json-description": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී.",
        "apihelp-jsonfm-description": "ප්‍රතිදාන දත්ත JSON ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
        "apihelp-none-description": "ප්‍රතිදානයේ කිසිවක් නොමැත.",
        "apihelp-php-description": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී.",
        "apihelp-phpfm-description": "ප්‍රතිදාන දත්ත serialized PHP ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
-       "apihelp-txt-description": "ප්‍රතිදාන දත්ත PHP හි print_r() ආකෘතියෙන් පවතී.",
-       "apihelp-txtfm-description": "ප්‍රතිදාන දත්ත PHP හි print_r() ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
        "apihelp-xml-description": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී.",
        "apihelp-xml-param-includexmlnamespace": "නිරූපණය කළා නම්, XML නාමාවකාශයක් එකතු කරන්න.",
        "apihelp-xmlfm-description": "ප්‍රතිදාන දත්ත XML ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
-       "apihelp-yaml-description": "ප්‍රතිදාන දත්ත YAML ආකෘතියෙන් පවතී.",
-       "apihelp-yamlfm-description": "ප්‍රතිදාන දත්ත YAML ආකෘතියෙන් පවතී (හොදම පිටපත HTML භාෂාවෙනි).",
        "api-format-title": "මාධ්‍යවිකි API ප්‍රථිපල",
        "api-help-title": "මාධ්‍යවිකි API උදවු",
        "api-help-lead": "මෙය ස්වයං-ජනිත මාධ්‍යවිකි API \tප්‍රලේඛන පිටුවකි.\n\nප්‍රලේඛනය සහ උදාහරණ:\nhttps://www.mediawiki.org/wiki/API",
index 3f4aa61..28e90de 100644 (file)
@@ -13,8 +13,8 @@
        "apihelp-edit-param-text": "Страница са садржајем.",
        "apihelp-edit-param-minor": "Мања измена.",
        "apihelp-edit-example-edit": "Уређивање странице.",
-       "apihelp-emailuser-description": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке ÐºÐ¾Ñ\80иÑ\81никÑ\83",
-       "apihelp-emailuser-param-target": "Ð\9aоÑ\80иÑ\81ник Ñ\98е Ð¿Ð¾Ñ\81лао Ðµ-поÑ\80Ñ\83кÑ\83.",
+       "apihelp-emailuser-description": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла ÐºÐ¾Ñ\80иÑ\81никÑ\83.",
+       "apihelp-emailuser-param-target": "Ð\9aоÑ\80иÑ\81ник Ñ\98е Ð¿Ð¾Ñ\81лао Ð¸Ð¼ÐµÑ\98л.",
        "apihelp-feedcontributions-param-year": "Од године (и раније).",
        "apihelp-filerevert-description": "Вратити датотеку у ранију верзију.",
        "apihelp-help-example-recursive": "Сва помоћ у једној страници.",
index 1366f5e..14e32ba 100644 (file)
        "api-help-parameters": "{{PLURAL:$1|Parameter|Parametrar}}:",
        "api-help-param-deprecated": "Föråldrad.",
        "api-help-param-required": "Denna parameter är obligatorisk.",
-       "api-help-param-list": "{{PLURAL:$1|1=Ett värde|2=Värden (separerade med <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Ett av följande värden|2=Värden (separerade med <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Måste vara tom|Kan vara tom, eller $2}}",
        "api-help-param-limit": "Inte mer än $1 tillåts.",
        "api-help-param-limit2": "Inte mer än $1 ($2 för robotar) tillåts."
diff --git a/includes/api/i18n/tcy.json b/includes/api/i18n/tcy.json
new file mode 100644 (file)
index 0000000..d776a06
--- /dev/null
@@ -0,0 +1,11 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Bharathesha Alasandemajalu",
+                       "Vishwanatha Badikana"
+               ]
+       },
+       "apihelp-query+watchlist-param-type": "ವಾ ನಮೂನೆದ ಬದಲಾವಣೆ ತೊಜವೋಡು",
+       "apihelp-query+watchlist-paramvalue-type-external": "ಪಿದಯೀದ ಬದಲಾವಣೇ",
+       "apihelp-query+watchlist-paramvalue-type-new": "ಪುಟೊ ಉಂಡುಮಾನ್ಪುನಾ"
+}
index 4f88d77..d8c5cfb 100644 (file)
@@ -5,6 +5,8 @@
                        "Macofe"
                ]
        },
+       "apihelp-feedrecentchanges-param-categories": "Ipakita lamang ang mga pagbababgo sa mga pahina sa lahat ng mga kategoriyang ito.",
+       "apihelp-feedrecentchanges-param-categories_any": "Ipakita na lang ang mga pagbabago sa mga pahina sa kahit na anong mga kategoriya.",
        "apihelp-feedrecentchanges-example-simple": "Ipakit ang mga kamakailangang pagbabago.",
        "apihelp-feedrecentchanges-example-30days": "Ipakita ang mga huling pagbabago sa loob para sa 30 araw.",
        "apihelp-help-example-main": "Tulong para sa pangunahing modulo.",
index 997c6ac..95eea7d 100644 (file)
@@ -4,11 +4,12 @@
                        "Sayginer",
                        "Sadrettin",
                        "Uğurkent",
-                       "Gorizon"
+                       "Gorizon",
+                       "HakanIST"
                ]
        },
-       "apihelp-block-description": "Kullanıcıyı engelle",
-       "apihelp-block-param-reason": "Engelleme sebebi",
+       "apihelp-block-description": "Bir kullanıcıyı engelle.",
+       "apihelp-block-param-reason": "Engelleme sebebi.",
        "apihelp-createaccount-param-name": "Kullanıcı adı.",
        "apihelp-createaccount-param-password": "Parola (ignored if <var>$1mailpassword</var> is set).",
        "apihelp-createaccount-param-email": "Kullanıcının e-posta adresi (isteğe bağlı).",
index e195520..ef69eda 100644 (file)
@@ -7,7 +7,8 @@
                        "Base",
                        "Dars",
                        "Umherirrender",
-                       "Macofe"
+                       "Macofe",
+                       "Mix Gerder"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документація]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Список розсилки]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Оголошення API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Баґи і запити]\n</div>\n<strong>Статус:</strong> Усі функції, вказані на цій сторінці, мають працювати, але API далі перебуває в активній розробці і може змінитися у будь-який момент. Підпишіться на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ список розсилки mediawiki-api-announce], щоб помічати оновлення.\n\n<strong>Хибні запити:</strong> Коли до API надсилаються хибні запити, буде відіслано HTTP-шапку з ключем «MediaWiki-API-Error», а тоді і значення шапки, і код помилки, надіслані назад, будуть встановлені з тим же значенням. Більше інформації див. на [[mw:API:Errors_and_warnings|API: Errors and warnings]].",
        "apihelp-feedrecentchanges-param-hideliu": "Приховати редагування зареєстрованих користувачів.",
        "apihelp-feedrecentchanges-param-hidepatrolled": "Приховати відпатрульовані редагування.",
        "apihelp-feedrecentchanges-param-hidemyself": "Приховати редагування поточного користувача.",
+       "apihelp-feedrecentchanges-param-hidecategorization": "Приховати зміни в членстві в категорії.",
        "apihelp-feedrecentchanges-param-tagfilter": "Фільтрувати за теґом.",
        "apihelp-feedrecentchanges-param-target": "Показати лише зміни на сторінках, на які посилається ця сторінка.",
        "apihelp-feedrecentchanges-param-showlinkedto": "Показати натомість лише зміни на сторінках, які посилаються на цю сторінку.",
+       "apihelp-feedrecentchanges-param-categories": "Показати лише зміни сторінок у всіх цих категоріях.",
+       "apihelp-feedrecentchanges-param-categories_any": "Показати натомість лише зміни на сторінках у будь-якій з цих категорій.",
        "apihelp-feedrecentchanges-example-simple": "Показати нещодавні зміни.",
        "apihelp-feedrecentchanges-example-30days": "Показати нещодавні зміни за 30 днів.",
        "apihelp-feedwatchlist-description": "Видає стрічку списку спостереження.",
        "apihelp-help-param-wrap": "Помістити результат у стандартну структуру API-відповіді.",
        "apihelp-help-param-toc": "Включити зміст у HTML-результат.",
        "apihelp-help-example-main": "Довідка для головного модуля.",
+       "apihelp-help-example-submodules": "Довідка для <kbd>action=query</kbd> та усіх її підмодулів.",
        "apihelp-help-example-recursive": "Уся довідка на одній сторінці.",
        "apihelp-help-example-help": "Довідка для самого модуля довідки.",
        "apihelp-help-example-query": "Довідка для двох підмодулів запитів.",
        "apihelp-parse-param-pst": "Зробіть трансформацію вхідних даних перед збереженням і аналізом. Дійсне лише при використанні з текстом.",
        "apihelp-parse-param-onlypst": "Зробіть трансформацію вхідних даних перед збереженням (PST), але не аналізуйте. Видає той самий вікітекст, після застосування PST. Дійсне лише у разі використання з <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Включає мовні посилання, додані розширеннями (для використання з <kbd>$1prop=langlinks</kbd>).",
-       "apihelp-parse-param-section": "Ð\92идаÑ\94 Ð²Ð¼Ñ\96Ñ\81Ñ\82 Ð»Ð¸Ñ\88е Ñ\80оздÑ\96лÑ\83 Ð· Ñ\86им Ð½Ð¾Ð¼ÐµÑ\80ом Ð°Ð±Ð¾ Ð¿Ñ\80и <kbd>new</kbd> Ñ\81Ñ\82воÑ\80еннÑ\96 Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñ\80оздÑ\96лÑ\83.\n\n<kbd>new</kbd> Ñ\80оздÑ\96л Ð²Ñ\96дзнаÑ\87аÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð»Ð¸Ñ\88е Ð¿Ñ\80и Ð²ÐºÐ°Ð·Ð°Ð½Ð½Ñ\96 Ñ\82екÑ\81Ñ\82у <var>text</var>.",
+       "apihelp-parse-param-section": "РозÑ\96бÑ\80аÑ\82и Ð²Ð¼Ñ\96Ñ\81Ñ\82 Ð»Ð¸Ñ\88е Ñ\80оздÑ\96лÑ\83 Ð· Ñ\86им Ð½Ð¾Ð¼ÐµÑ\80ом .\n\nЯкÑ\89о <kbd>new</kbd>, Ñ\80озÑ\96бÑ\80аÑ\82и <var>$1text</var> Ñ\82а <var>$1sectiontitle</var>, Ñ\8fк Ð½Ñ\96би Ð½Ð¾Ð²Ð¸Ð¹ Ñ\80оздÑ\96л Ð´Ð¾Ð´Ð°Ñ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83.\n\n<kbd>new</kbd> Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\8fÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð»Ð¸Ñ\88е Ð¿Ñ\80о Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð¼у <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "Заголовок нового розділу, коли <var>section</var> має значення <kbd>new</kbd>.\n\nНа відміну від редагування сторінки, це не повертається до <var>summary</var>, якщо пропустити чи лишити порожнім.",
        "apihelp-parse-param-disablelimitreport": "Пропустити звіт про ліміти («NewPP limit report») на виході аналізу.",
        "apihelp-parse-param-disablepp": "Використати натомість <var>$1disablelimitreport</var>.",
        "apihelp-query+revisions+base-param-section": "Витягнути вміст лише розділу з цим номером.",
        "apihelp-query+revisions+base-param-diffto": "ID версії, з якою порівняти кожну версію. Використайте <kbd>prev</kbd>, <kbd>next</kbd> і <kbd>cur</kbd> для попередньої, наступної та поточної версій відповідно.",
        "apihelp-query+revisions+base-param-difftotext": "Текст, з яким порівняти кожну версію. Порівнює лише обмежену кількість версій. Перевизначає <var>$1diffto</var>. Якщо вказано <var>$1section</var>, лише ця версія буде порівняна з цим текстом.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Виконати попередню трансформацію тексту перед виведенням дифу. Дійсне лише з використанням <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Формат серіалізації, використаний для <var>$1difftotext</var> й очікуваний для контенту-результату.",
        "apihelp-query+search-description": "Виконати повнотекстовий пошук.",
        "apihelp-query+search-param-search": "Шукати назви сторінок або вміст, що співпадає з цим значенням. Ви можете використати рядок пошуку для виклику спеціальних функцій пошуку, залежно від внутрішніх установок пошуку у вікі.",
        "apihelp-query+siteinfo-paramvalue-prop-usergroups": "Видає групи користувачів і пов'язані дозволи.",
        "apihelp-query+siteinfo-paramvalue-prop-libraries": "Видає бібліотеки, встановлені у вікі.",
        "apihelp-query+siteinfo-paramvalue-prop-extensions": "Видає розширення, встановлені у вікі.",
-       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Видає список розширень файлів, які дозволено завантажувати.",
+       "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "Видає список розширень файлів (типів файлів), які дозволено завантажувати.",
        "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "Видає інформацію щодо прав (ліцензії) вікі, якщо наявна.",
        "apihelp-query+siteinfo-paramvalue-prop-restrictions": "Видає інформацію про наявні типи обмежень (захисту).",
        "apihelp-query+siteinfo-paramvalue-prop-languages": "Видає список мов, які підтримує MediaWiki (за бажанням локалізовані через <var>$1inlanguagecode</var>).",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Додає мітку часу, коли користувач був востаннє сповіщений про редагування.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Додає інформацію журналу, де це доречно.",
        "apihelp-query+watchlist-param-show": "Показати лише елементи, що задовільняють ці критерії. Наприклад, для перегляду лише незначних змін, здійснених користувачами, що увійшли до системи, вкажіть $1show=minor|!anon.",
-       "apihelp-query+watchlist-param-type": "Які типи змін показувати:\n;edit:Звичайні редагування сторінки.\n;external:Зовнішні зміни.\n;new:Створення сторінок.\n;log:Записи журналу.",
+       "apihelp-query+watchlist-param-type": "Які типи змін показувати:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Регулярні сторінки правок.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Зовнішні зміни.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Сторінка створена.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Записи в журналі.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Зміни членства в категорії.",
        "apihelp-query+watchlist-param-owner": "Використовується разом з $1token для доступу до списку спостереження різних користувачів.",
        "apihelp-query+watchlist-param-token": "Токен безпеки (доступний у [[Special:Preferences#mw-prefsection-watchlist|налаштуваннях]] користувача) для отримання доступу до списку спостереження іншого користувача.",
        "apihelp-query+watchlist-example-simple": "Перелічити верхні версії для нещодавно змінених сторінок у списку спостереження поточного користувача.",
        "apihelp-watch-example-unwatch": "Вилучити сторінку <kbd>Головна сторінка</kbd> зі списку спостереження.",
        "apihelp-watch-example-generator": "Додати перші декілька сторінок основного простору назв до списку спостереження.",
        "apihelp-format-example-generic": "Повернути результат запиту у форматі $1.",
-       "apihelp-dbg-description": "Вивести дані у форматі PHP <code>var_export()</code>.",
-       "apihelp-dbgfm-description": "Вивести дані у форматі PHP <code>var_export()</code> (вивід відформатованого коду за допомогою HTML).",
        "apihelp-json-description": "Вивести дані у форматі JSON.",
        "apihelp-json-param-callback": "Якщо вказано, огортає вивід викликом даної функції. З міркувань безпеки, усі специфічні до користувача дані буде утримано.",
        "apihelp-json-param-utf8": "Якщо вказано, кодує більшість (але не всі) не-ASCII символів як UTF-8, замість заміни їх шістнадцятковими екрануючими послідовностями. За замовчуванням коли <var>formatversion</var> не є <kbd>1</kbd>.",
        "apihelp-php-description": "Виводити дані у форматі серіалізованого PHP.",
        "apihelp-php-param-formatversion": "Форматування виводу:\n;1:Формат зворотної сумісності (булеви XML-стилю, <samp>*</samp> ключі для вузлів вмісту тощо).\n;2:Експериментальний сучасний формат. Деталі можуть змінюватись.\n;latest:Використовувати найостанніший формат (наразі <kbd>2</kbd>). Може змінюватись без попередження.",
        "apihelp-phpfm-description": "Виводити дані у форматі серіалізованого PHP (вивід відформатованого коду за допомогою HTML).",
-       "apihelp-rawfm-description": "Виводити дані у форматі JSON разом з елементами налагодження (вивід відформатованого коду за допомогою HTML).",
-       "apihelp-txt-description": "Виводити дані у форматі PHP <code>print_r()</code>.",
-       "apihelp-txtfm-description": "Виводити дані у форматі PHP <code>print_r()</code> (вивід відформатованого коду за допомогою HTML).",
+       "apihelp-rawfm-description": "Виводити дані, включно з елементами налагодження, у форматі JSON (вивід відформатованого коду за допомогою HTML).",
        "apihelp-xml-description": "Виводити дані у форматі XML.",
        "apihelp-xml-param-xslt": "Якщо вказано, додає названу сторінку як таблицю стилів XSL. Це значення повинне бути назвою у просторі назв {{ns:mediawiki}}, що закінчується на <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Якщо вказано, додає простір назв XML.",
        "apihelp-xmlfm-description": "Вивести дані у форматі XML (вивід відформатованого коду за допомогою HTML).",
-       "apihelp-yaml-description": "Вивести дані у форматі YAML.",
-       "apihelp-yamlfm-description": "Вивести дані у форматі YAML (вивід відформатованого коду за допомогою HTML).",
        "api-format-title": "Результат запиту до API MediaWiki",
        "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметру <var>format</var>, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть <kbd>format=$2</kbd>.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
        "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
index 8e4f790..df7756d 100644 (file)
@@ -9,12 +9,12 @@
        },
        "apihelp-main-param-action": "Tác vụ để thực hiện.",
        "apihelp-main-param-format": "Định dạng của dữ liệu được cho ra.",
-       "apihelp-main-param-uselang": "Ngôn ngữ để sử dụng cho các phiên dịch thông điệp. Một danh sách các mã có thể được lấy từ <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> với <kbd>siprop=languages</kbd>, hoặc <kbd>user</kbd> cụ thể sử dụng ngôn ngữ tham khảo của người dùng hiện tại, hoặc <kbd>content</kbd> cụ thể để sử dụng ngôn ngữ nội dung của wiki này.",
+       "apihelp-main-param-uselang": "Ngôn ngữ để sử dụng cho các bản dịch thông điệp. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> với <kbd>siprop=languages</kbd> trả về một danh sách các mã ngôn ngữ, hoặc định rõ <kbd>user</kbd> để sử dụng ngôn ngữ của người dùng hiện tại, hoặc định rõ <kbd>content</kbd> để sử dụng ngôn ngữ nội dung của wiki này.",
        "apihelp-block-description": "Cấm người dùng.",
        "apihelp-block-param-user": "Tên truy nhập, địa chỉ IP hoặc dãi IP mà bạn muốn chặn.",
        "apihelp-block-param-reason": "Lý do cấm.",
        "apihelp-block-param-nocreate": "Cấm tạo tài khoản.",
-       "apihelp-block-param-reblock": "Nếu người dùng này đã bị khóa, ghi đè lên người này.",
+       "apihelp-block-param-reblock": "Nếu người dùng này đã bị cấm, ghi đè lên vụ cấm đã tồn tại.",
        "apihelp-checktoken-param-type": "Kiểu dấu hiệu được kiểm thử.",
        "apihelp-checktoken-param-token": "Dấu hiệu để kiểm thử.",
        "apihelp-checktoken-example-simple": "Kiểm thử dấu hiệu <kbd>csrf</kbd> có hợp lệ hay không.",
        "apihelp-createaccount-param-token": "Dấu hiệu mở tài khoản được lấy trong yêu cầu đầu tiên.",
        "apihelp-createaccount-param-email": "Địa chỉ thư điện tử của thành viên (tùy chọn).",
        "apihelp-createaccount-param-realname": "Tên thật của thành viên (tùy chọn).",
-       "apihelp-createaccount-param-mailpassword": "Nếu đặt bất kỳ giá trị nào, một mật khẩu ngẫu nhiên sẽ được email lại cho người dùng.",
+       "apihelp-createaccount-param-mailpassword": "Nếu đặt bất kỳ giá trị nào, một mật khẩu ngẫu nhiên sẽ được gửi lại cho người dùng qua thư điện tử.",
        "apihelp-createaccount-param-reason": "Lý do tùy chọn cho việc tạo tài khoản để đăng nhập.",
        "apihelp-createaccount-param-language": "Mã ngôn ngữ để thiết lập mặc định cho người dùng (tùy chọn, mặc định là ngôn ngữ nội dung).",
        "apihelp-createaccount-example-pass": "Tạo người dùng <kbd>người kiểm tra</kbd> với mật khẩu <kbd>test123</kbd>.",
-       "apihelp-createaccount-example-mail": "Tạo người dùng <kbd>người dùng kiểm tra email> và email một mật khẩu được tạo ra ngẫu nhiên.",
+       "apihelp-createaccount-example-mail": "Tạo người dùng <kbd>người dùng thử gửi</kbd> và gửi một mật khẩu được tạo ra ngẫu nhiên qua thư điện tử.",
        "apihelp-delete-description": "Xóa trang.",
        "apihelp-delete-param-title": "Xóa tiêu đề của trang. Không thể sử dụng cùng với <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Xóa ID của trang. Không thể sử dụng cùng với <var>$1title</var>.",
        "apihelp-query-param-list": "Các danh sách để lấy.",
        "apihelp-query-param-meta": "Siêu dữ liệu để lấy.",
        "apihelp-query+allcategories-param-dir": "Hướng xếp loại.",
-       "apihelp-rollback-description": "Hoàn tác chỉnh sửa cuối cùng của trang này.\n\nNếu người dùng cuối cùng đã cỉnh sửa trang này nhiều lần, tất cả chúng sẽ được hoàn tác lại như ban đầu.",
+       "apihelp-rollback-description": "Lùi lại sửa đổi cuối cùng của trang này.\n\nNếu người dùng cuối cùng đã sửa đổi trang này nhiều lần, tất cả chúng sẽ được lùi lại cùng một lúc.",
        "apihelp-format-example-generic": "Cho ra kết quả truy vấn dưới dạng $1.",
-       "apihelp-dbg-description": "Cho ra dữ liệu dưới dạng <code>var_export()</code> của PHP.",
-       "apihelp-dbgfm-description": "Cho ra dữ liệu dưới dạng <code>var_export()</code> của PHP (định dạng bằng HTML).",
        "apihelp-json-description": "Cho ra dữ liệu dưới dạng JSON.",
        "apihelp-jsonfm-description": "Cho ra dữ liệu dưới dạng JSON (định dạng bằng HTML).",
        "apihelp-none-description": "Không cho ra gì.",
        "apihelp-rawfm-description": "Cho ra dữ liệu với các phần tử gỡ lỗi dưới dạng JSON (định dạng bằng HTML).",
-       "apihelp-txt-description": "Cho ra dữ liệu dưới dạng <code>print_r()</code> của PHP.",
-       "apihelp-txtfm-description": "Cho ra dữ liệu dưới dạng <code>print_r()</code> của PHP (định dạng bằng HTML).",
        "apihelp-xml-description": "Cho ra dữ liệu dưới dạng XML.",
        "apihelp-xmlfm-description": "Cho ra dữ liệu dưới dạng XML (định dạng bằng HTML).",
-       "apihelp-yaml-description": "Cho ra dữ liệu dưới dạng YAML.",
-       "apihelp-yamlfm-description": "Cho ra dữ liệu dưới dạng YAML (định dạng bằng HTML).",
        "api-format-title": "Kết quả API MediaWiki",
        "api-help-title": "Trợ giúp về API MediaWiki",
        "api-help-main-header": "Mô đun chính",
        "api-help-parameters": "{{PLURAL:$1|Tham số|Các tham số}}:",
        "api-help-param-deprecated": "Bị phản đối.",
        "api-help-param-required": "Tham số này là bắt buộc.",
-       "api-help-param-list": "{{PLURAL:$1|1=Một giá trị|2=Các giá trị (phân tách bằng <kbd>{{!}}</kbd>)}}: $2",
+       "api-help-param-list": "{{PLURAL:$1|1=Một trong các giá trị|2=Các giá trị (phân tách bằng <kbd>{{!}}</kbd>)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Cần phải để trống|Cần phải để trống hoặc là $2}}",
        "api-help-param-limit": "Không cho phép hơn $1.",
        "api-help-param-limit2": "Không cho phép hơn $1 ($2 đối với các bot).",
index ffd3c01..338a670 100644 (file)
        "apihelp-edit-param-undo": "撤销此次修订。覆盖$1text、$1prependtext和$1appendtext。",
        "apihelp-edit-param-undoafter": "撤销从$1undo至此的所有修订。如果不设置就撤销一次修订。",
        "apihelp-edit-param-redirect": "自动解决重定向。",
-       "apihelp-edit-param-contentformat": "用于输入文本的内容串行化格式。",
+       "apihelp-edit-param-contentformat": "用于输入文本的内容序列化格式。",
        "apihelp-edit-param-contentmodel": "新内容的内容模型。",
        "apihelp-edit-param-token": "令牌应总是发送为最后参数,或至少在$1text参数之后。",
        "apihelp-edit-example-edit": "编辑一个页面。",
        "apihelp-expandtemplates-param-revid": "修订版本ID,用于<nowiki>{{REVISIONID}}</nowiki>和类似变体。",
        "apihelp-expandtemplates-param-prop": "要获取的那条信息。\n\n注意如果没有选定值,结果将包含wiki文本,但将以弃用的格式显示。",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "扩充的wiki文本。",
+       "apihelp-expandtemplates-paramvalue-prop-categories": "任何在输出中提供的,未在wiki文本输出中表现的分类。",
        "apihelp-expandtemplates-paramvalue-prop-properties": "由wiki文本中扩充的魔术字定义的页面属性。",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "无论输出是否常常变动,均不应被在页面中其他任何位置重用。",
        "apihelp-expandtemplates-paramvalue-prop-ttl": "结果缓存应无效化后的最长时间。",
        "apihelp-feedcontributions-param-newonly": "仅仅显示那些作为页面创建的编辑。",
        "apihelp-feedcontributions-param-showsizediff": "显示修订版本之间的大小差别。",
        "apihelp-feedcontributions-example-simple": "返回用户<kbd>Example</kbd>的贡献。",
-       "apihelp-feedrecentchanges-description": "返回最新变更纲要。",
+       "apihelp-feedrecentchanges-description": "返回最近更改的摘要。",
        "apihelp-feedrecentchanges-param-feedformat": "纲要的格式。",
        "apihelp-feedrecentchanges-param-namespace": "用于限制结果的命名空间。",
        "apihelp-feedrecentchanges-param-invert": "除所选定者外的所有命名空间。",
        "apihelp-feedrecentchanges-param-tagfilter": "按标签过滤。",
        "apihelp-feedrecentchanges-param-target": "仅仅显示从该页面链出的那些页面的变更。",
        "apihelp-feedrecentchanges-param-showlinkedto": "仅仅显示链入到该页面的那些页面的变更。",
+       "apihelp-feedrecentchanges-param-categories": "只显示所有这些分类中的页面上的更改。",
+       "apihelp-feedrecentchanges-param-categories_any": "只显示这些分类以外页面的更改。",
        "apihelp-feedrecentchanges-example-simple": "显示最近更改。",
        "apihelp-feedrecentchanges-example-30days": "显示最近30天的更改。",
        "apihelp-feedwatchlist-description": "返回监视列表纲要。",
        "apihelp-help-param-wrap": "在一个标准API响应结构中包裹输出。",
        "apihelp-help-param-toc": "在HTML输出中包括目录。",
        "apihelp-help-example-main": "主模块帮助。",
+       "apihelp-help-example-submodules": "用于<kbd>action=query</kbd>及其所有子模块的帮助。",
        "apihelp-help-example-recursive": "一个页面中的所有帮助。",
        "apihelp-help-example-help": "帮助模块本身的帮助。",
        "apihelp-help-example-query": "两个查询子模块的帮助。",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "提供限制报告的HTML版本。当<var>$1disablelimitreport</var>被设置时不会提供数据。",
        "apihelp-parse-paramvalue-prop-parsetree": "修订内容的XML解析树(需要内容模型<code>$1</code>)",
        "apihelp-parse-param-pst": "在解析输入前,对输入做一次保存前变换处理。仅当使用文本时有效。",
+       "apihelp-parse-param-onlypst": "在输入内容中执行预保存转换(PST),但不解析它。在PST被应用后返回相同的wiki文本。只当与<var>$1text</var>一起使用时有效。",
        "apihelp-parse-param-effectivelanglinks": "包含由扩展提供的语言链接(用于与<kbd>$1prop=langlinks</kbd>一起使用)。",
        "apihelp-parse-param-section": "只解析此段数的内容。\n\n当<kbd>new</kbd>时,将<var>$1text</var>和<var>$1sectiontitle</var>解析为添加新段落至页面。\n\n<kbd>new</kbd>段落只当指定<var>text</var>时允许。",
        "apihelp-parse-param-sectiontitle": "当<var>section</var>为<kbd>new</kbd>时新段落标题。\n\n不像页面编辑,当省略或为空时将不会备选为<var>summary</var>。",
        "apihelp-parse-param-sectionpreview": "在段落预览模式下解析(同时要启用预览模式)。",
        "apihelp-parse-param-disabletoc": "在输出中省略目录。",
        "apihelp-parse-param-contentformat": "用于输入文本的内容序列化格式。只当与$1text一起使用时有效。",
+       "apihelp-parse-param-contentmodel": "输入文本的内容模型。如果省略,$1title必须指定,并且默认将为指定标题的模型。只当与$1text一起使用时有效。",
        "apihelp-parse-example-page": "解析一个页面。",
        "apihelp-parse-example-text": "解析wiki文本。",
        "apihelp-parse-example-texttitle": "解析wiki文本,指定页面标题。",
        "apihelp-parse-example-summary": "解析一个摘要。",
        "apihelp-patrol-description": "巡查页面或修订版本。",
-       "apihelp-patrol-param-rcid": "所要巡查的最近变更 ID。",
+       "apihelp-patrol-param-rcid": "要巡查的最近更改 ID。",
        "apihelp-patrol-param-revid": "要巡查的修订版本ID。",
        "apihelp-patrol-example-rcid": "巡查一次最近更改。",
        "apihelp-patrol-example-revid": "巡查一次修订。",
        "apihelp-query+allmessages-description": "返回来自该网站的消息。",
        "apihelp-query+allmessages-param-messages": "要输出的消息。<kbd>*</kbd>(默认)表示所有消息。",
        "apihelp-query+allmessages-param-prop": "要获取的属性。",
+       "apihelp-query+allmessages-param-enableparser": "设置以启用解析器,将处理消息的wiki文本(替代魔术字、处理模板等)。",
        "apihelp-query+allmessages-param-nocontent": "如果设置,不要在输出中包含消息内容。",
        "apihelp-query+allmessages-param-args": "要替代进消息的参数。",
        "apihelp-query+allmessages-param-filter": "只返回名称包含此字符串的消息。",
        "apihelp-query+allmessages-param-lang": "返回这种语言的信息。",
        "apihelp-query+allmessages-param-from": "从此消息开始返回消息。",
        "apihelp-query+allmessages-param-to": "返回消息至此消息为止。",
+       "apihelp-query+allmessages-param-title": "当解析消息时,要用作环境的页面(用于$1enableparser选项)。",
        "apihelp-query+allmessages-param-prefix": "返回带有该前缀的消息。",
        "apihelp-query+allmessages-example-ipb": "显示以<kbd>ipb-</kbd>开始的消息。",
        "apihelp-query+allmessages-example-de": "显示德语版的<kbd>august</kbd>和<kbd>mainpage</kbd>消息。",
        "apihelp-query+allpages-param-minsize": "限于至少这么多字节的页面。",
        "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
        "apihelp-query+allpages-param-prtype": "仅限于受保护页面。",
+       "apihelp-query+allpages-param-prlevel": "过滤基于保护等级的保护(必须与$1prtype=参数一起使用)。",
        "apihelp-query+allpages-param-prfiltercascade": "过滤基于cascadingness的保护(当$1prtype未设置时忽略)。",
        "apihelp-query+allpages-param-limit": "返回的总计页面数。",
        "apihelp-query+allpages-param-dir": "罗列所采用的方向。",
        "apihelp-query+allredirects-example-unique-generator": "获取所有目标页面,标记丢失的。",
        "apihelp-query+allredirects-example-generator": "获取包含重定向的页面。",
        "apihelp-query+allrevisions-description": "列举所有修订。",
+       "apihelp-query+allrevisions-param-start": "枚举的起始时间戳。",
+       "apihelp-query+allrevisions-param-end": "枚举的结束时间戳。",
        "apihelp-query+allrevisions-param-user": "只列出此用户做出的修订。",
        "apihelp-query+allrevisions-param-excludeuser": "不要列出此用户做出的修订。",
        "apihelp-query+allrevisions-param-namespace": "只列出此名字空间的页面。",
        "apihelp-query+allrevisions-param-generatetitles": "当作为生成器使用时,生成标题而不是修订ID。",
        "apihelp-query+allrevisions-example-user": "列出由用户<kbd>Example</kbd>作出的最近50次贡献。",
+       "apihelp-query+allrevisions-example-ns-main": "列举主名字空间中的前50次修订。",
        "apihelp-query+alltransclusions-description": "列出所有嵌入页面(使用&#123;&#123;x&#125;&#125;嵌入的页面),包括不存在的。",
        "apihelp-query+alltransclusions-param-from": "要列举的起始嵌入标题。",
        "apihelp-query+alltransclusions-param-to": "要列举的最终嵌入标题。",
        "apihelp-query+allusers-paramvalue-prop-rights": "用户拥有的权限列表。",
        "apihelp-query+allusers-paramvalue-prop-editcount": "添加用户的编辑计数。",
        "apihelp-query+allusers-paramvalue-prop-registration": "如果可能,添加用户注册时的时间戳(可能为空白)。",
+       "apihelp-query+allusers-paramvalue-prop-centralids": "添加中心ID并为用户附加状态。",
        "apihelp-query+allusers-param-limit": "返回的总计用户数。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$1{{PLURAL:$1|天}}内活跃的用户。",
        "apihelp-query+blocks-param-end": "枚举的结束时间戳。",
        "apihelp-query+blocks-param-ids": "要列出的封禁ID列表(可选)。",
        "apihelp-query+blocks-param-users": "要搜索的用户列表(可选)。",
+       "apihelp-query+blocks-param-ip": "获取应用到此IP地址或者CIDR范围的所有封禁,包括范围封禁。不能与<var>$3users</var>一起使用。CIDR范围不允许比IPv4/$1或IPv6/$2更宽。",
        "apihelp-query+blocks-param-limit": "封禁列表的最大数量。",
        "apihelp-query+blocks-param-prop": "要获取的属性:",
        "apihelp-query+blocks-paramvalue-prop-id": "添加封禁ID。",
        "apihelp-query+blocks-paramvalue-prop-reason": "添加封禁原因。",
        "apihelp-query+blocks-paramvalue-prop-range": "添加受封禁影响的IP地址段。",
        "apihelp-query+blocks-paramvalue-prop-flags": "标记编辑禁止(自动封禁、仅限匿名用户等)。",
+       "apihelp-query+blocks-param-show": "只显示符合这些标准的项目。\n例如,要只查看IP地址的无限期封禁,设置<kbd>$1show=ip|!temp</kbd>。",
        "apihelp-query+blocks-example-simple": "封禁列表。",
        "apihelp-query+blocks-example-users": "列出用户<kbd>Alice</kbd>和<kbd>Bob</kbd>的封禁。",
        "apihelp-query+categories-description": "页面属于的所有分类列表。",
        "apihelp-query+categories-paramvalue-prop-hidden": "标记由<code>_&#95;HIDDENCAT_&#95;</code>隐藏的分类。",
        "apihelp-query+categories-param-show": "显示何种分类。",
        "apihelp-query+categories-param-limit": "返回多少分类。",
+       "apihelp-query+categories-param-categories": "只列出这些分类。对于检查某一页面使用某一分类很有用。",
        "apihelp-query+categories-param-dir": "罗列所采用的方向。",
        "apihelp-query+categories-example-simple": "获取属于<kbd>Albert Einstein</kbd>的分类列表。",
        "apihelp-query+categories-example-generator": "获得有关用于<kbd>Albert Einstein</kbd>的分类的信息。",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "添加用于非最新版本的存档版本的文件名。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表。",
        "apihelp-query+filerepoinfo-description": "返回有关wiki配置的图片存储库的元信息。",
+       "apihelp-query+filerepoinfo-param-prop": "要获取的存储库属性(这在一些wiki上可能有更多可用选项):\n;apiurl:链接至API的URL - 对从主机获取图片信息有用。\n;name:The key of the repository - used in e.g. <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> and [[Special:ApiHelp/query+imageinfo|imageinfo]] return values.\n;displayname:The human-readable name of the repository wiki.\n;rooturl:Root URL for image paths.\n;local:Whether that repository is the local one or not.",
        "apihelp-query+filerepoinfo-example-simple": "获得有关文件存储库的信息。",
        "apihelp-query+fileusage-description": "查找所有使用指定文件的页面。",
        "apihelp-query+fileusage-param-prop": "要获取的属性:",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "Lists tags for the entry.",
        "apihelp-query+recentchanges-paramvalue-prop-sha1": "Adds the content checksum for entries associated with a revision.",
        "apihelp-query+recentchanges-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
+       "apihelp-query+recentchanges-param-show": "只显示满足这些标准的项目。例如,要只查看由登录用户做出的小编辑,设置$1show=minor|!anon。",
        "apihelp-query+recentchanges-param-limit": "返回总计更新数。",
        "apihelp-query+recentchanges-param-type": "显示的更改类型。",
+       "apihelp-query+recentchanges-param-generaterevisions": "当作为生成器使用时,生成修订ID而不是标题。不带关联修订ID的最近更改记录(例如大多数日志记录)将不会生成任何东西。",
        "apihelp-query+recentchanges-example-simple": "最近更改列表。",
        "apihelp-query+recentchanges-example-generator": "获取有关最近未巡查更改的页面信息。",
        "apihelp-query+redirects-description": "返回至指定页面的所有重定向。",
        "apihelp-query+redirects-example-generator": "获取所有重定向至[[Main Page]]的信息。",
        "apihelp-query+revisions-paraminfo-singlepageonly": "可能只能与单一页面使用(模式#2)。",
        "apihelp-query+revisions-param-end": "列举直至此时间戳。",
+       "apihelp-query+revisions-param-user": "只包含由用户做出的修订。",
+       "apihelp-query+revisions-param-excludeuser": "不包括由用户做出的修订。",
        "apihelp-query+revisions-param-tag": "只列出被此标签标记的修订。",
        "apihelp-query+revisions-example-content": "获取带内容的数据,用于标题<kbd>API</kbd>和<kbd>Main Page</kbd>的最近修订。",
        "apihelp-query+revisions-example-last5": "获取<kbd>Main Page</kbd>的最近5次修订。",
        "apihelp-query+revisions+base-param-section": "只检索此段落数的内容。",
        "apihelp-query+revisions+base-param-diffto": "要比较修订差异的修订ID。使用<kbd>prev</kbd>、<kbd>next</kbd>和<kbd>cur</kbd>分别用于上个、下个和当前修订。",
        "apihelp-query+revisions+base-param-difftotext": "要比较修订差异的文本。只有修订的有限数字内的差异。覆盖<var>$1diffto</var>。如果<var>$1section</var>被设置,只有那个段落将与此文本之间比较差异",
+       "apihelp-query+revisions+base-param-difftotextpst": "在编辑文本前对其执行预保存转换。只当与<var>$1difftotext</var>一起使用时有效。",
        "apihelp-query+revisions+base-param-contentformat": "序列化用于<var>$1difftotext</var>的格式并预估内容输出。",
        "apihelp-query+search-description": "执行一次全文本搜索。",
        "apihelp-query+search-param-search": "搜索所有匹配此值的页面标题或内容。根据wiki的搜索后端工具,您可以使用搜索字符串以调用特殊搜索功能。",
        "apihelp-query+siteinfo-example-interwiki": "取得本地跨wiki前缀列表。",
        "apihelp-query+siteinfo-example-replag": "检查当前的响应延迟。",
        "apihelp-query+stashimageinfo-description": "返回用于藏匿文件的文件信息。",
+       "apihelp-query+stashimageinfo-param-filekey": "用于识别一次临时藏匿的早前上传的关键字。",
        "apihelp-query+stashimageinfo-param-sessionkey": "$1filekey的别名,用于向后兼容。",
        "apihelp-query+stashimageinfo-example-simple": "返回藏匿文件的信息。",
        "apihelp-query+tags-description": "列出更改标签。",
        "apihelp-query+userinfo-param-prop": "要包含的信息束:",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "如果当前用户被封禁就标记,并注明是谁封禁,以何种原因封禁的。",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "如果当前用户有等待中的消息的话,添加标签<samp>messages</samp>。",
-       "apihelp-query+userinfo-paramvalue-prop-groups": "Lists all the groups the current user belongs to.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "列举当前用户隶属的所有群组。",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lists all the groups the current user is automatically a member of.",
        "apihelp-query+userinfo-paramvalue-prop-rights": "Lists all the rights the current user has.",
        "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lists the groups the current user can add to and remove from.",
        "apihelp-query+userinfo-paramvalue-prop-options": "Lists all preferences the current user has set.",
-       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Deprecated.</span> Get a token to change current user's preferences.",
-       "apihelp-query+userinfo-paramvalue-prop-editcount": "Adds the current user's edit count.",
+       "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">已弃用。</span>获取令牌以更改当前用户的参数设置。",
+       "apihelp-query+userinfo-paramvalue-prop-editcount": "添加当前用户的编辑计数。",
        "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lists all rate limits applying to the current user.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "添加用户的真实姓名。",
        "apihelp-query+userinfo-paramvalue-prop-email": "Adds the user's email address and email authentication date.",
        "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Echoes the <code>Accept-Language</code> header sent by the client in a structured format.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "添加用户的注册时间。",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Adds the count of unread pages on the user's watchlist (maximum $1; returns <samp>$2</samp> if more).",
+       "apihelp-query+userinfo-paramvalue-prop-centralids": "添加中心ID并为用户附加状态。",
        "apihelp-query+userinfo-example-simple": "获取有关当前用户的信息。",
        "apihelp-query+userinfo-example-data": "获取有关当前用户的额外信息。",
        "apihelp-query+users-description": "获取有关列出用户的信息。",
        "apihelp-query+users-paramvalue-prop-registration": "Adds the user's registration timestamp.",
        "apihelp-query+users-paramvalue-prop-emailable": "Tags if the user can and wants to receive email through [[Special:Emailuser]].",
        "apihelp-query+users-paramvalue-prop-gender": "Tags the gender of the user. Returns \"male\", \"female\", or \"unknown\".",
+       "apihelp-query+users-paramvalue-prop-centralids": "添加中心ID并为用户附加状态。",
        "apihelp-query+users-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+users-example-simple": "返回用户<kbd>Example</kbd>的信息。",
        "apihelp-query+watchlist-description": "在当前用户的监视列表中获取对页面的最近更改。",
+       "apihelp-query+watchlist-param-allrev": "将同一页面的多个修订包含于指定的时间表内。",
        "apihelp-query+watchlist-param-start": "枚举的起始时间戳。",
        "apihelp-query+watchlist-param-end": "枚举的结束时间戳。",
        "apihelp-query+watchlist-param-user": "只列出此用户的更改。",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "添加页面的旧有长度和新长度。",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "添加最近被通知有关编辑的用户的时间戳。",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "在适当位置添加日志信息。",
+       "apihelp-query+watchlist-param-show": "只显示满足这些标准的项目。例如,要只查看由登录用户做出的小编辑,设置$1show=minor|!anon。",
        "apihelp-query+watchlist-param-type": "要显示的更改类型:",
        "apihelp-query+watchlist-paramvalue-type-edit": "普通页面编辑。",
        "apihelp-query+watchlist-paramvalue-type-external": "外部更改。",
        "apihelp-query+watchlist-paramvalue-type-new": "页面创建。",
        "apihelp-query+watchlist-paramvalue-type-log": "日志记录。",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "分类成员组更改。",
+       "apihelp-query+watchlist-param-owner": "与$1token一起使用以访问不同用户的监视列表。",
        "apihelp-query+watchlist-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlist-example-simple": "在当前用户的监视列表中列出用于最近更改页面的最新修订。",
        "apihelp-query+watchlist-example-props": "在当前用户的监视列表中检索有关用于最近更改页面的最新修订的额外信息。",
        "apihelp-query+watchlistraw-param-prop": "要获取的额外属性:",
        "apihelp-query+watchlistraw-paramvalue-prop-changed": "添加最近被通知有关编辑的用户的时间戳。",
        "apihelp-query+watchlistraw-param-show": "只列出符合这些标准的项目。",
+       "apihelp-query+watchlistraw-param-owner": "与$1token一起使用以访问不同用户的监视列表。",
        "apihelp-query+watchlistraw-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。",
        "apihelp-query+watchlistraw-param-fromtitle": "要列举的起始标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。",
        "apihelp-query+watchlistraw-example-simple": "列出当前用户的监视列表中的页面。",
        "apihelp-revisiondelete-description": "删除和恢复修订版本。",
+       "apihelp-revisiondelete-param-type": "正在执行的修订版本删除类型。",
+       "apihelp-revisiondelete-param-target": "要进行修订版本删除的页面标题,如果对某一类型需要。",
        "apihelp-revisiondelete-param-ids": "用于将被删除的修订的标识符。",
        "apihelp-revisiondelete-param-hide": "每次修订要隐藏的东西。",
        "apihelp-revisiondelete-param-show": "每次修订要恢复显示的东西。",
+       "apihelp-revisiondelete-param-suppress": "是否对管理员及其他人禁止数据。",
        "apihelp-revisiondelete-param-reason": "删除或恢复的原因。",
        "apihelp-revisiondelete-example-revision": "隐藏<kbd>首页</kbd>的修订版本<kbd>12345</kbd>的内容。",
        "apihelp-revisiondelete-example-log": "隐藏日志记录<kbd>67890</kbd>上的所有数据,原因<kbd>BLP violation</kbd>。",
        "apihelp-rollback-description": "撤销对页面的最近编辑。\n\n如果最近编辑页面的用户在一行中进行多次编辑,所有编辑将被回退。",
        "apihelp-rollback-param-title": "要回退的页面标题。不能与<var>$1pageid</var>一起使用。",
        "apihelp-rollback-param-pageid": "要回退的页面的页面 ID。不能与<var>$1title</var>一起使用。",
+       "apihelp-rollback-param-user": "做出要回退的编辑的用户名称。",
+       "apihelp-rollback-param-summary": "自定义编辑摘要。如果为空,将使用默认摘要。",
+       "apihelp-rollback-param-markbot": "将被回退的编辑和回退操作标记为机器人编辑。",
        "apihelp-rollback-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-rollback-example-simple": "回退由用户<kbd>Example</kbd>对<kbd>Main Page</kbd>做出的最近编辑。",
        "apihelp-rollback-example-summary": "回退由IP用户<kbd>192.0.2.5</kbd>对页面<kbd>Main Page</kbd>做出的最近编辑,带编辑摘要<kbd>Reverting vandalism</kbd>,并将这些编辑和回退标记为机器人编辑。",
        "apihelp-stashedit-param-sectiontitle": "新段落的标题。",
        "apihelp-stashedit-param-text": "页面内容。",
        "apihelp-stashedit-param-contentmodel": "新内容的内容模型。",
+       "apihelp-stashedit-param-contentformat": "用于输入文本的内容序列化格式。",
        "apihelp-stashedit-param-baserevid": "基础修订的修订ID。",
        "apihelp-tag-description": "从个别修订或日志记录中添加或移除更改标签。",
        "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。",
        "apihelp-undelete-param-reason": "恢复的原因。",
        "apihelp-undelete-param-timestamps": "要回复的修订的时间戳。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
        "apihelp-undelete-param-fileids": "要恢复的文件修订ID。如果<var>$1timestamps</var>和<var>$1fileids</var>都为空,所有将被恢复。",
+       "apihelp-undelete-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-undelete-example-page": "恢复页面<kbd>Main Page</kbd>。",
        "apihelp-undelete-example-revisions": "恢复<kbd>Main Page</kbd>的两个修订。",
-       "apihelp-upload-description": "上传一个文件,或获取正在等待中的上传的状态。\n\n可以使用的几种方法:\n* 直接上传文件内容,使用<var>$1file</var>参数。\n* 成批上传文件,使用<var>$1filesize</var>、<var>$1chunk</var>和<var>$1offset</var>参数。\n* 有MediaWiki服务器从URL检索一个文件,使用<var>$1url</var>参数。\n* Complete an earlier upload that failed due to warnings, using the <var>$1filekey</var> parameter.\nNote that the HTTP POST must be done as a file upload (i.e. using <code>multipart/form-data</code>) when sending the <var>$1file</var>.",
+       "apihelp-upload-description": "上传一个文件,或获取正在等待中的上传的状态。\n\n可以使用的几种方法:\n* 直接上传文件内容,使用<var>$1file</var>参数。\n* 成批上传文件,使用<var>$1filesize</var>、<var>$1chunk</var>和<var>$1offset</var>参数。\n* 有MediaWiki服务器从URL检索一个文件,使用<var>$1url</var>参数。\n* 完成一次由于警告而失败的早前上传,使用<var>$1filekey</var>参数。\n需要注意,当发送<var>$1file</var>时,HTTP POST必须做为一次文件上传(也就是使用<code>multipart/form-data</code>)完成。",
        "apihelp-upload-param-filename": "目标文件名。",
        "apihelp-upload-param-comment": "上传注释。如果没有指定<var>$1text</var>,那么它也被用于新文件的初始页面文本。",
+       "apihelp-upload-param-text": "用于新文件的初始页面文本。",
        "apihelp-upload-param-watch": "监视页面。",
        "apihelp-upload-param-watchlist": "无条件地将页面加入至当前用户的监视列表或将其移除,使用设置或不更改监视。",
        "apihelp-upload-param-ignorewarnings": "忽略任何警告。",
        "apihelp-upload-param-file": "文件内容。",
        "apihelp-upload-param-url": "要检索文件来源的URL。",
+       "apihelp-upload-param-filekey": "用于识别一次临时藏匿的早前上传的关键字。",
+       "apihelp-upload-param-sessionkey": "与$1filekey相同,基于向后兼容而维护。",
        "apihelp-upload-param-stash": "如果设置,服务器将临时藏匿文件而不是加入存储库。",
        "apihelp-upload-param-filesize": "全部上传的文件大小。",
        "apihelp-upload-param-offset": "块的偏移量(字节)。",
        "apihelp-upload-param-chunk": "大块内容。",
        "apihelp-upload-param-leavemessage": "如果asyncdownload被使用,当完成时,在用户讨论页留下一条消息。",
+       "apihelp-upload-param-statuskey": "检索此文件密钥的上传状态(通过URL上传)。",
+       "apihelp-upload-param-checkstatus": "只检索指定文件密钥的上传状态。",
        "apihelp-upload-example-url": "从URL上传。",
        "apihelp-upload-example-filekey": "完成一次由于警告而失败的上传。",
        "apihelp-userrights-description": "更改一位用户的组成员。",
        "apihelp-watch-example-unwatch": "取消监视页面<kbd>Main Page</kbd>。",
        "apihelp-watch-example-generator": "监视主名字空间中的最少几个页面。",
        "apihelp-format-example-generic": "返回查询结果为$1格式。",
-       "apihelp-dbg-description": "输出数据为PHP的<code>var_export()</code>格式。",
-       "apihelp-dbgfm-description": "输出数据为PHP的<code>var_export()</code>格式(HTML优质打印效果)。",
        "apihelp-json-description": "输出数据为JSON格式。",
        "apihelp-json-param-callback": "如果指定,将输出内容包裹在一个指定的函数调用中。出于安全考虑,所有用户相关的数据将被限制。",
        "apihelp-json-param-utf8": "如果指定,使用十六进制转义序列将大多数(但不是全部)非ASCII的字符编码为UTF-8,而不是替换它们。默认当<var>formatversion</var>不是<kbd>1</kbd>时。",
        "apihelp-php-param-formatversion": "输出格式:\n;1:向后兼容格式(XML样式布尔值、用于内容节点的<samp>*</samp>键等)。\n;2:实验现代格式。细节可以更改!\n;latest:使用最新格式(当前为<kbd>2</kbd>),可以在没有警告的情况下更改。",
        "apihelp-phpfm-description": "输出数据为序列化PHP格式(HTML优质打印效果)。",
        "apihelp-rawfm-description": "输出数据为JSON格式,包含调试元素(HTML优质打印效果)。",
-       "apihelp-txt-description": "输出数据为PHP的<code>print_r()</code>格式。",
-       "apihelp-txtfm-description": "输出数据为PHP的<code>print_r()</code>格式(HTML优质打印效果)。",
        "apihelp-xml-description": "输出数据为XML格式。",
        "apihelp-xml-param-xslt": "如果指定,加入已命名的页面作为一个XSL样式表。值必须是在{{ns:mediawiki}}名字空间以<code>.xsl</code>为结尾的标题。",
        "apihelp-xml-param-includexmlnamespace": "如果指定,添加一个XML名字空间。",
        "apihelp-xmlfm-description": "输出数据为XML格式(HTML优质打印效果)。",
-       "apihelp-yaml-description": "输出数据为YAML格式。",
-       "apihelp-yamlfm-description": "输出数据为YAML格式(HTML优质打印效果)。",
        "api-format-title": "MediaWiki API 结果",
        "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML表示,设置<kbd>format=$2</kbd>。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。",
        "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
index 226d448..4b0a81c 100644 (file)
@@ -6,7 +6,8 @@
                        "LNDDYL",
                        "EagerLin",
                        "Zhxy 519",
-                       "Macofe"
+                       "Macofe",
+                       "Jasonzhuocn"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|文件]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 郵件清單]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug與請求]\n</div>\n<strong>狀態資訊:</strong>本頁所展示的所有功能都應正常工作,但是 API 仍在開發當中,將會隨時變化。請訂閱[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 郵件清單]以便得到更新通知。\n\n<strong>錯誤請求:</strong>當 API 收到錯誤請求時, HTTP header 將會返回一個包含「MediaWiki-API-Error」的值,隨後 header 的值與錯誤碼將會送回並設定為相同的值。詳細資訊請參閱[[mw:API:Errors_and_warnings|API: 錯誤與警告]]。",
@@ -92,7 +93,7 @@
        "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
        "apihelp-feedcontributions-param-showsizediff": "顯示修訂版本之間的差異大小。",
        "apihelp-feedcontributions-example-simple": "返回使用者<kbd>Example</kbd>的貢獻。",
-       "apihelp-feedrecentchanges-description": "返回近期邊更摘要。",
+       "apihelp-feedrecentchanges-description": "返回最近更改摘要。",
        "apihelp-feedrecentchanges-param-feedformat": "摘要格式。",
        "apihelp-feedrecentchanges-param-namespace": "用於限制結果的命名空間。",
        "apihelp-feedrecentchanges-param-invert": "除所選定者外的所有命名空間。",
        "apihelp-feedrecentchanges-param-hideanons": "隱藏匿名使用者做的變更。",
        "apihelp-feedrecentchanges-param-hideliu": "隱藏已註冊使用者做的變更。",
        "apihelp-feedrecentchanges-param-hidepatrolled": "隱藏已巡查的變更。",
-       "apihelp-feedrecentchanges-example-simple": "顯示近期變動",
+       "apihelp-feedrecentchanges-example-simple": "顯示最近變更。",
        "apihelp-feedrecentchanges-example-30days": "顯示近期30天內的變動",
        "apihelp-feedwatchlist-description": "返回監視清單 feed。",
        "apihelp-feedwatchlist-param-feedformat": "Feed 的格式。",
        "apihelp-parse-example-texttitle": "解析 wikitext,指定頁面標題。",
        "apihelp-parse-example-summary": "解析一個摘要。",
        "apihelp-patrol-description": "巡查一個頁面或修訂。",
-       "apihelp-patrol-param-rcid": "要巡查的近期變更 ID。",
+       "apihelp-patrol-param-rcid": "要巡查的最近更改 ID。",
        "apihelp-patrol-param-revid": "要巡查的修訂 ID。",
-       "apihelp-patrol-example-rcid": "巡查一個近期變更。",
+       "apihelp-patrol-example-rcid": "巡查一次最近更改。",
        "apihelp-patrol-example-revid": "巡查一個修訂。",
        "apihelp-protect-description": "變更頁面的保護層級。",
        "apihelp-protect-param-title": "要(解除)保護頁面的標題。 不能與 $1pageid 一起使用。",
        "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+contributors-param-limit": "要回傳的貢獻人員數量。",
        "apihelp-query+duplicatefiles-param-limit": "要回傳的重複檔案數量。",
+       "apihelp-query+embeddedin-param-filterredir": "如何過濾重定向。",
        "apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。",
        "apihelp-query+extlinks-description": "回傳所有指定頁面的外部 URL (非 interwiki)。",
        "apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
        "apihelp-query+prefixsearch-param-limit": "回傳的結果數量上限。",
        "apihelp-query+protectedtitles-param-limit": "要回傳的頁面總數。",
        "apihelp-query+querypage-param-limit": "回傳的結果數量。",
-       "apihelp-query+recentchanges-description": "列舉出近期變動。",
+       "apihelp-query+recentchanges-description": "列舉出最近變更。",
        "apihelp-query+recentchanges-param-limit": "要回傳變更總數。",
-       "apihelp-query+recentchanges-example-simple": "近期變動清單",
+       "apihelp-query+recentchanges-example-simple": "最近變更清單",
        "apihelp-query+redirects-description": "回傳連結至指定頁面的所有重新導向。",
        "apihelp-query+redirects-param-limit": "要回傳的重新導向數量。",
        "apihelp-query+search-param-limit": "要回傳的頁面總數。",
        "apihelp-query+stashimageinfo-example-simple": "回傳儲藏檔案的檔案資訊。",
        "apihelp-query+templates-description": "回傳指定頁面中所有引用的頁面。",
        "apihelp-query+templates-param-limit": "要回傳的模板數量。",
-       "apihelp-query+tokens-param-type": "è«\8bæ±\82ç\9a\84å¯\86é\91°類型。",
+       "apihelp-query+tokens-param-type": "è¦\81æ±\82ç\9a\84æ¬\8aæ\9d\96類型。",
        "apihelp-query+tokens-example-simple": "接收 csrf 密鑰 (預設)。",
        "apihelp-query+tokens-example-types": "接收監視密鑰以及巡邏密鑰。",
        "apihelp-query+transcludedin-param-limit": "回傳的數量。",
        "apihelp-userrights-param-remove": "從這些群組移除使用者。",
        "apihelp-userrights-param-reason": "變更的原因。",
        "apihelp-format-example-generic": "格式化查詢結果為 $1 格式",
-       "apihelp-dbg-description": "使用 PHP 的 <code>var_export()</code> 格式輸出資料。",
-       "apihelp-dbgfm-description": "使用 PHP 的 <code>var_export()</code> 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-json-description": "使用 JSON 格式輸出資料。",
        "apihelp-jsonfm-description": "使用 JSON 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-none-description": "不輸出。",
        "apihelp-php-description": "使用序列化 PHP 格式輸出資料。",
        "apihelp-phpfm-description": "使用序列化 PHP 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-rawfm-description": "使用 JSON 格式的除錯元素輸出資料 (使用 HTML 格式顯示)。",
-       "apihelp-txt-description": "使用 PHP 的 <code>print_r()</code> 格式輸出資料。",
-       "apihelp-txtfm-description": "使用 PHP 的 <code>print_r()</code> 格式輸出資料 (使用 HTML 格式顯示)。",
        "apihelp-xml-description": "使用 XML 格式輸出資料。",
        "apihelp-xmlfm-description": "使用 XML 格式輸出資料 (使用 HTML 格式顯示)。",
-       "apihelp-yaml-description": "使用 YAML 格式輸出資料。",
-       "apihelp-yamlfm-description": "使用 YAML 格式輸出資料 (使用 HTML 格式顯示)。",
        "api-format-title": "MediaWiki API 結果",
-       "api-orm-param-props": "要查詢的欄位。",
-       "api-orm-param-limit": "回傳的列數上限。",
        "api-pageset-param-titles": "要使用的標題清單。",
        "api-pageset-param-pageids": "要使用的頁面 ID 清單。",
        "api-pageset-param-revids": "要使用的修訂 ID 清單。",
index 3ba4f61..c04a22a 100644 (file)
@@ -40,8 +40,8 @@
  * Introduced by r47317
  */
 class BacklinkCache {
-       /** @var ProcessCacheLRU */
-       protected static $cache;
+       /** @var BacklinkCache */
+       protected static $instance;
 
        /**
         * Multi dimensions array representing batches. Keys are:
@@ -53,6 +53,7 @@ class BacklinkCache {
         * @see BacklinkCache::partitionResult()
         *
         * Cleared with BacklinkCache::clear()
+        * @var array[]
         */
        protected $partitionCache = array();
 
@@ -62,6 +63,7 @@ class BacklinkCache {
         *
         * Initialized with BacklinkCache::getLinks()
         * Cleared with BacklinkCache::clear()
+        * @var ResultWrapper[]
         */
        protected $fullResultCache = array();
 
@@ -99,15 +101,10 @@ class BacklinkCache {
         * @return BacklinkCache
         */
        public static function get( Title $title ) {
-               if ( !self::$cache ) { // init cache
-                       self::$cache = new ProcessCacheLRU( 1 );
+               if ( !self::$instance || !self::$instance->title->equals( $title ) ) {
+                       self::$instance = new self( $title );
                }
-               $dbKey = $title->getPrefixedDBkey();
-               if ( !self::$cache->has( $dbKey, 'obj', 3600 ) ) {
-                       self::$cache->set( $dbKey, 'obj', new self( $title ) );
-               }
-
-               return self::$cache->get( $dbKey, 'obj' );
+               return self::$instance;
        }
 
        /**
index 2abcabd..0a45b8e 100644 (file)
@@ -98,7 +98,7 @@ class DependencyWrapper {
         * it will be generated with the callback function (if present), and the newly
         * calculated value will be stored to the cache in a wrapper.
         *
-        * @param BagOStuff $cache A cache object such as $wgMemc
+        * @param BagOStuff $cache A cache object
         * @param string $key The cache key
         * @param int $expiry The expiry timestamp or interval in seconds
         * @param bool|callable $callback The callback for generating the value, or false
index 5632596..360420b 100644 (file)
@@ -235,8 +235,8 @@ abstract class FileCacheBase {
         * @return void
         */
        public function incrMissesRecent( WebRequest $request ) {
-               global $wgMemc;
                if ( mt_rand( 0, self::MISS_FACTOR - 1 ) == 0 ) {
+                       $cache = ObjectCache::getLocalClusterInstance();
                        # Get a large IP range that should include the user  even if that
                        # person's IP address changes
                        $ip = $request->getIP();
@@ -249,17 +249,17 @@ abstract class FileCacheBase {
 
                        # Bail out if a request already came from this range...
                        $key = wfMemcKey( get_class( $this ), 'attempt', $this->mType, $this->mKey, $ip );
-                       if ( $wgMemc->get( $key ) ) {
+                       if ( $cache->get( $key ) ) {
                                return; // possibly the same user
                        }
-                       $wgMemc->set( $key, 1, self::MISS_TTL_SEC );
+                       $cache->set( $key, 1, self::MISS_TTL_SEC );
 
                        # Increment the number of cache misses...
                        $key = $this->cacheMissKey();
-                       if ( $wgMemc->get( $key ) === false ) {
-                               $wgMemc->set( $key, 1, self::MISS_TTL_SEC );
+                       if ( $cache->get( $key ) === false ) {
+                               $cache->set( $key, 1, self::MISS_TTL_SEC );
                        } else {
-                               $wgMemc->incr( $key );
+                               $cache->incr( $key );
                        }
                }
        }
@@ -269,9 +269,9 @@ abstract class FileCacheBase {
         * @return int
         */
        public function getMissesRecent() {
-               global $wgMemc;
+               $cache = ObjectCache::getLocalClusterInstance();
 
-               return self::MISS_FACTOR * $wgMemc->get( $this->cacheMissKey() );
+               return self::MISS_FACTOR * $cache->get( $this->cacheMissKey() );
        }
 
        /**
index 483eaa5..298f6e2 100644 (file)
@@ -96,12 +96,12 @@ class HTMLFileCache extends FileCacheBase {
         * @return bool
         */
        public static function useFileCache( IContextSource $context ) {
-               global $wgUseFileCache, $wgShowIPinHeader, $wgDebugToolbar, $wgContLang;
+               global $wgUseFileCache, $wgDebugToolbar, $wgContLang;
                if ( !$wgUseFileCache ) {
                        return false;
                }
-               if ( $wgShowIPinHeader || $wgDebugToolbar ) {
-                       wfDebug( "HTML file cache skipped. Either \$wgShowIPinHeader and/or \$wgDebugToolbar on\n" );
+               if ( $wgDebugToolbar ) {
+                       wfDebug( "HTML file cache skipped. \$wgDebugToolbar on\n" );
 
                        return false;
                }
index 3db84a6..5ea926b 100644 (file)
  */
 class LinkCache {
        /**
-        * @var MapCacheLRU
+        * @var HashBagOStuff
         */
        private $mGoodLinks;
        /**
-        * @var MapCacheLRU
+        * @var HashBagOStuff
         */
        private $mBadLinks;
        private $mForUpdate = false;
@@ -49,8 +49,8 @@ class LinkCache {
        protected static $instance;
 
        public function __construct() {
-               $this->mGoodLinks = new MapCacheLRU( self::MAX_SIZE );
-               $this->mBadLinks = new MapCacheLRU( self::MAX_SIZE );
+               $this->mGoodLinks = new HashBagOStuff( array( 'maxKeys' => self::MAX_SIZE ) );
+               $this->mBadLinks = new HashBagOStuff( array( 'maxKeys' => self::MAX_SIZE ) );
        }
 
        /**
@@ -58,37 +58,44 @@ class LinkCache {
         *
         * @return LinkCache
         */
-       static function &singleton() {
-               if ( self::$instance ) {
-                       return self::$instance;
+       public static function &singleton() {
+               if ( !self::$instance ) {
+                       self::$instance = new LinkCache;
                }
-               self::$instance = new LinkCache;
 
                return self::$instance;
        }
 
        /**
-        * Destroy the singleton instance, a new one will be created next time
-        * singleton() is called.
+        * Destroy the singleton instance
+        *
+        * A new one will be created next time singleton() is called.
+        *
         * @since 1.22
         */
-       static function destroySingleton() {
+       public static function destroySingleton() {
                self::$instance = null;
        }
 
        /**
         * Set the singleton instance to a given object.
+        *
         * Since we do not have an interface for LinkCache, you have to be sure the
         * given object implements all the LinkCache public methods.
+        *
         * @param LinkCache $instance
         * @since 1.22
         */
-       static function setSingleton( LinkCache $instance ) {
+       public static function setSingleton( LinkCache $instance ) {
                self::$instance = $instance;
        }
 
        /**
-        * General accessor to get/set whether SELECT FOR UPDATE should be used
+        * General accessor to get/set whether the master DB should be used
+        *
+        * This used to also set the FOR UPDATE option (locking the rows read
+        * in order to avoid link table inconsistency), which was later removed
+        * for performance on wikis with a high edit rate.
         *
         * @param bool $update
         * @return bool
@@ -99,32 +106,30 @@ class LinkCache {
 
        /**
         * @param string $title
-        * @return int
+        * @return int Page ID or zero
         */
        public function getGoodLinkID( $title ) {
-               if ( $this->mGoodLinks->has( $title ) ) {
-                       $info = $this->mGoodLinks->get( $title );
-                       return $info['id'];
-               } else {
+               $info = $this->mGoodLinks->get( $title );
+               if ( !$info ) {
                        return 0;
                }
+               return $info['id'];
        }
 
        /**
         * Get a field of a title object from cache.
-        * If this link is not good, it will return NULL.
+        * If this link is not a cached good title, it will return NULL.
         * @param Title $title
         * @param string $field ('length','redirect','revision','model')
-        * @return string|null
+        * @return string|int|null
         */
        public function getGoodLinkFieldObj( $title, $field ) {
                $dbkey = $title->getPrefixedDBkey();
-               if ( $this->mGoodLinks->has( $dbkey ) ) {
-                       $info = $this->mGoodLinks->get( $dbkey );
-                       return $info[$field];
-               } else {
+               $info = $this->mGoodLinks->get( $dbkey );
+               if ( !$info ) {
                        return null;
                }
+               return $info[$field];
        }
 
        /**
@@ -132,8 +137,8 @@ class LinkCache {
         * @return bool
         */
        public function isBadLink( $title ) {
-               // We need to use get here since has will not call ping.
-               return $this->mBadLinks->get( $title ) !== null;
+               // Use get() to ensure it records as used for LRU.
+               return $this->mBadLinks->get( $title ) !== false;
        }
 
        /**
@@ -146,7 +151,7 @@ class LinkCache {
         * @param int $revision Latest revision's ID
         * @param string|null $model Latest revision's content model ID
         */
-       public function addGoodLinkObj( $id, $title, $len = -1, $redir = null,
+       public function addGoodLinkObj( $id, Title $title, $len = -1, $redir = null,
                $revision = 0, $model = null
        ) {
                $dbkey = $title->getPrefixedDBkey();
@@ -166,7 +171,7 @@ class LinkCache {
         * @param stdClass $row Object which has the fields page_id, page_is_redirect,
         *  page_latest and page_content_model
         */
-       public function addGoodLinkObjFromRow( $title, $row ) {
+       public function addGoodLinkObjFromRow( Title $title, $row ) {
                $dbkey = $title->getPrefixedDBkey();
                $this->mGoodLinks->set( $dbkey, array(
                        'id' => intval( $row->page_id ),
@@ -180,7 +185,7 @@ class LinkCache {
        /**
         * @param Title $title
         */
-       public function addBadLinkObj( $title ) {
+       public function addBadLinkObj( Title $title ) {
                $dbkey = $title->getPrefixedDBkey();
                if ( !$this->isBadLink( $dbkey ) ) {
                        $this->mBadLinks->set( $dbkey, 1 );
@@ -196,57 +201,31 @@ class LinkCache {
         */
        public function clearLink( $title ) {
                $dbkey = $title->getPrefixedDBkey();
-               $this->mBadLinks->clear( array( $dbkey ) );
-               $this->mGoodLinks->clear( array( $dbkey ) );
-       }
-
-
-       /**
-        * @deprecated since 1.26
-        * @return array
-        */
-       public function getGoodLinks() {
-               wfDeprecated( __METHOD__, '1.26' );
-               $links = array();
-               foreach ( $this->mGoodLinks->getAllKeys() as $key ) {
-                       $info = $this->mGoodLinks->get( $key );
-                       $links[$key] = $info['id'];
-               }
-
-               return $links;
-       }
-
-       /**
-        * @deprecated since 1.26
-        * @return array
-        */
-       public function getBadLinks() {
-               wfDeprecated( __METHOD__, '1.26' );
-               return $this->mBadLinks->getAllKeys();
+               $this->mBadLinks->delete( $dbkey );
+               $this->mGoodLinks->delete( $dbkey );
        }
 
        /**
         * Add a title to the link cache, return the page_id or zero if non-existent
         *
         * @param string $title Title to add
-        * @return int
+        * @return int Page ID or zero
         */
        public function addLink( $title ) {
                $nt = Title::newFromDBkey( $title );
-               if ( $nt ) {
-                       return $this->addLinkObj( $nt );
-               } else {
+               if ( !$nt ) {
                        return 0;
                }
+               return $this->addLinkObj( $nt );
        }
 
        /**
         * Add a title to the link cache, return the page_id or zero if non-existent
         *
         * @param Title $nt Title object to add
-        * @return int
+        * @return int Page ID or zero
         */
-       public function addLinkObj( $nt ) {
+       public function addLinkObj( Title $nt ) {
                global $wgContentHandlerUseDB;
 
                $key = $nt->getPrefixedDBkey();
@@ -262,25 +241,22 @@ class LinkCache {
                        return 0;
                }
 
-               # Some fields heavily used for linking...
-               if ( $this->mForUpdate ) {
-                       $db = wfGetDB( DB_MASTER );
-               } else {
-                       $db = wfGetDB( DB_SLAVE );
-               }
+               // Some fields heavily used for linking...
+               $db = $this->mForUpdate ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
 
-               $f = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
+               $fields = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
                if ( $wgContentHandlerUseDB ) {
-                       $f[] = 'page_content_model';
+                       $fields[] = 'page_content_model';
                }
 
-               $s = $db->selectRow( 'page', $f,
+               $row = $db->selectRow( 'page', $fields,
                        array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ),
-                       __METHOD__ );
-               # Set fields...
-               if ( $s !== false ) {
-                       $this->addGoodLinkObjFromRow( $nt, $s );
-                       $id = intval( $s->page_id );
+                       __METHOD__
+               );
+
+               if ( $row !== false ) {
+                       $this->addGoodLinkObjFromRow( $nt, $row );
+                       $id = intval( $row->page_id );
                } else {
                        $this->addBadLinkObj( $nt );
                        $id = 0;
index fa5e288..fad8ee8 100644 (file)
@@ -209,7 +209,17 @@ class LocalisationCache {
                                        $storeClass = 'LCStoreStaticArray';
                                        break;
                                case 'detect':
-                                       $storeClass = $wgCacheDirectory ? 'LCStoreCDB' : 'LCStoreDB';
+                                       if ( !empty( $conf['storeDirectory'] ) ) {
+                                               $storeClass = 'LCStoreCDB';
+                                       } else {
+                                               $cacheDir = $wgCacheDirectory ?: wfTempDir();
+                                               if ( $cacheDir ) {
+                                                       $storeConf['directory'] = $cacheDir;
+                                                       $storeClass = 'LCStoreCDB';
+                                               } else {
+                                                       $storeClass = 'LCStoreDB';
+                                               }
+                                       }
                                        break;
                                default:
                                        throw new MWException(
@@ -1137,29 +1147,32 @@ interface LCStore {
  * This will work on any MediaWiki installation.
  */
 class LCStoreDB implements LCStore {
+       /** @var string */
        private $currentLang;
+       /** @var bool */
        private $writesDone = false;
-
-       /** @var DatabaseBase */
+       /** @var IDatabase */
        private $dbw;
        /** @var array */
        private $batch = array();
-
+       /** @var bool */
        private $readOnly = false;
 
        public function get( $code, $key ) {
-               if ( $this->writesDone ) {
-                       $db = wfGetDB( DB_MASTER );
+               if ( $this->writesDone && $this->dbw ) {
+                       $db = $this->dbw; // see the changes in finishWrite()
                } else {
                        $db = wfGetDB( DB_SLAVE );
                }
-               $row = $db->selectRow( 'l10n_cache', array( 'lc_value' ),
-                       array( 'lc_lang' => $code, 'lc_key' => $key ), __METHOD__ );
-               if ( $row ) {
-                       return unserialize( $db->decodeBlob( $row->lc_value ) );
-               } else {
-                       return null;
-               }
+
+               $value = $db->selectField(
+                       'l10n_cache',
+                       'lc_value',
+                       array( 'lc_lang' => $code, 'lc_key' => $key ),
+                       __METHOD__
+               );
+
+               return ( $value !== false ) ? unserialize( $db->decodeBlob( $value ) ) : null;
        }
 
        public function startWrite( $code ) {
@@ -1170,6 +1183,7 @@ class LCStoreDB implements LCStore {
                }
 
                $this->dbw = wfGetDB( DB_MASTER );
+               $this->readOnly = $this->dbw->isReadOnly();
 
                $this->currentLang = $code;
                $this->batch = array();
@@ -1182,10 +1196,13 @@ class LCStoreDB implements LCStore {
                        throw new MWException( __CLASS__ . ': must call startWrite() before finishWrite()' );
                }
 
-               $this->dbw->begin( __METHOD__ );
+               $this->dbw->startAtomic( __METHOD__ );
                try {
-                       $this->dbw->delete( 'l10n_cache',
-                               array( 'lc_lang' => $this->currentLang ), __METHOD__ );
+                       $this->dbw->delete(
+                               'l10n_cache',
+                               array( 'lc_lang' => $this->currentLang ),
+                               __METHOD__
+                       );
                        foreach ( array_chunk( $this->batch, 500 ) as $rows ) {
                                $this->dbw->insert( 'l10n_cache', $rows, __METHOD__ );
                        }
@@ -1197,7 +1214,7 @@ class LCStoreDB implements LCStore {
                                throw $e;
                        }
                }
-               $this->dbw->commit( __METHOD__ );
+               $this->dbw->endAtomic( __METHOD__ );
 
                $this->currentLang = null;
                $this->batch = array();
@@ -1213,7 +1230,8 @@ class LCStoreDB implements LCStore {
                $this->batch[] = array(
                        'lc_lang' => $this->currentLang,
                        'lc_key' => $key,
-                       'lc_value' => $this->dbw->encodeBlob( serialize( $value ) ) );
+                       'lc_value' => $this->dbw->encodeBlob( serialize( $value ) )
+               );
        }
 }
 
index b7c70c1..a2e46d3 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource message blobs storage used by the resource loader.
+ * Message blobs storage used by ResourceLoader.
  *
  * This 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
  * @author Roan Kattouw
  * @author Trevor Parscal
+ * @author Timo Tijhof
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 /**
- * This class provides access to the resource message blobs storage used by
- * the ResourceLoader.
+ * This class generates message blobs for use by ResourceLoader modules.
  *
- * A message blob is a JSON object containing the interface messages for a
- * certain resource in a certain language. These message blobs are cached
- * in the msg_resource table and automatically invalidated when one of their
- * constituent messages or the resource itself is changed.
+ * A message blob is a JSON object containing the interface messages for a certain module in
+ * a certain language.
  */
-class MessageBlobStore {
+class MessageBlobStore implements LoggerAwareInterface {
+
+       /* @var ResourceLoader|null */
+       private $resourceloader;
+
        /**
-        * In-process cache for message blobs.
-        *
-        * Keyed by language code, then module name.
-        *
-        * @var array
+        * @var LoggerInterface
+        */
+       protected $logger;
+
+       /**
+        * @var WANObjectCache
+        */
+       protected $wanCache;
+
+       /**
+        * @param ResourceLoader $rl
+        * @param LoggerInterface $logger
+        */
+       public function __construct( ResourceLoader $rl = null, LoggerInterface $logger = null ) {
+               $this->resourceloader = $rl;
+               $this->logger = $logger ?: new NullLogger();
+               $this->wanCache = ObjectCache::getMainWANInstance();
+       }
+
+       /**
+        * @since 1.27
+        * @param LoggerInterface $logger
         */
-       protected $blobCache = array();
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
 
        /**
-        * Get the singleton instance
+        * Get the message blob for a module
         *
-        * @since 1.24
-        * @deprecated since 1.25
-        * @return MessageBlobStore
+        * @since 1.27
+        * @param ResourceLoaderModule $module
+        * @param string $lang Language code
+        * @return string JSON
         */
-       public static function getInstance() {
-               wfDeprecated( __METHOD__, '1.25' );
-               return new self;
+       public function getBlob( ResourceLoaderModule $module, $lang ) {
+               $blobs = $this->getBlobs( array( $module->getName() => $module ), $lang );
+               return $blobs[$module->getName()];
        }
 
        /**
         * Get the message blobs for a set of modules
         *
-        * @param ResourceLoader $resourceLoader
-        * @param array $modules Array of module objects keyed by module name
+        * @since 1.27
+        * @param ResourceLoaderModule[] $modules Array of module objects keyed by name
         * @param string $lang Language code
         * @return array An array mapping module names to message blobs
         */
-       public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
-               if ( !count( $modules ) ) {
-                       return array();
+       public function getBlobs( array $modules, $lang ) {
+               // Each cache key for a message blob by module name and language code also has a generic
+               // check key without language code. This is used to invalidate any and all language subkeys
+               // that exist for a module from the updateMessage() method.
+               $cache = $this->wanCache;
+               $checkKeys = array(
+                       // Global check key, see clear()
+                       $cache->makeKey( __CLASS__ )
+               );
+               $cacheKeys = array();
+               foreach ( $modules as $name => $module ) {
+                       $cacheKey = $this->makeCacheKey( $module, $lang );
+                       $cacheKeys[$name] = $cacheKey;
+                       // Per-module check key, see updateMessage()
+                       $checkKeys[$cacheKey][] = $cache->makeKey( __CLASS__, $name );
                }
+               $curTTLs = array();
+               $result = $cache->getMulti( array_values( $cacheKeys ), $curTTLs, $checkKeys );
 
                $blobs = array();
-
-               // Try in-process cache
-               $missingFromCache = array();
                foreach ( $modules as $name => $module ) {
-                       if ( isset( $this->blobCache[$lang][$name] ) ) {
-                               $blobs[$name] = $this->blobCache[$lang][$name];
+                       $key = $cacheKeys[$name];
+                       if ( !isset( $result[$key] ) || $curTTLs[$key] === null || $curTTLs[$key] < 0 ) {
+                               $this->logger->info( 'Message blob cache-miss for {module}',
+                                       array( 'module' => $name, 'cacheKey' => $key )
+                               );
+                               $blobs[$name] = $this->recacheMessageBlob( $key, $module, $lang );
                        } else {
-                               $missingFromCache[] = $name;
-                       }
-               }
-
-               // Try DB cache
-               if ( $missingFromCache ) {
-                       $blobs += $this->getFromDB( $resourceLoader, $missingFromCache, $lang );
-               }
-
-               // Generate new blobs for any remaining modules and store in DB
-               $missingFromDb = array_diff( array_keys( $modules ), array_keys( $blobs ) );
-               foreach ( $missingFromDb as $name ) {
-                       $blob = $this->insertMessageBlob( $name, $modules[$name], $lang );
-                       if ( $blob ) {
-                               $blobs[$name] = $blob;
+                               // Use unexpired cache
+                               $blobs[$name] = $result[$key];
                        }
                }
-
-               // Update in-process cache
-               if ( isset( $this->blobCache[$lang] ) ) {
-                       $this->blobCache[$lang] += $blobs;
-               } else {
-                       $this->blobCache[$lang] = $blobs;
-               }
-
                return $blobs;
        }
 
        /**
-        * Generate and insert a new message blob. If the blob was already
-        * present, it is not regenerated; instead, the preexisting blob
-        * is fetched and returned.
-        *
-        * @param string $name Module name
-        * @param ResourceLoaderModule $module
-        * @param string $lang Language code
-        * @return mixed Message blob or false if the module has no messages
+        * @deprecated since 1.27 Use getBlobs() instead
+        * @return array
         */
-       public function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
-               $blob = $this->generateMessageBlob( $module, $lang );
-
-               if ( !$blob ) {
-                       return false;
-               }
-
-               try {
-                       $dbw = wfGetDB( DB_MASTER );
-                       $success = $dbw->insert( 'msg_resource', array(
-                                       'mr_lang' => $lang,
-                                       'mr_resource' => $name,
-                                       'mr_blob' => $blob,
-                                       'mr_timestamp' => $dbw->timestamp()
-                               ),
-                               __METHOD__,
-                               array( 'IGNORE' )
-                       );
-
-                       if ( $success ) {
-                               if ( $dbw->affectedRows() == 0 ) {
-                                       // Blob was already present, fetch it
-                                       $blob = $dbw->selectField( 'msg_resource', 'mr_blob', array(
-                                                       'mr_resource' => $name,
-                                                       'mr_lang' => $lang,
-                                               ),
-                                               __METHOD__
-                                       );
-                               } else {
-                                       // Update msg_resource_links
-                                       $rows = array();
+       public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
+               return $this->getBlobs( $modules, $lang );
+       }
 
-                                       foreach ( $module->getMessages() as $key ) {
-                                               $rows[] = array(
-                                                       'mrl_resource' => $name,
-                                                       'mrl_message' => $key
-                                               );
-                                       }
-                                       $dbw->insert( 'msg_resource_links', $rows,
-                                               __METHOD__, array( 'IGNORE' )
-                                       );
-                               }
-                       }
-               } catch ( DBError $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
-               }
-               return $blob;
+       /**
+        * @deprecated since 1.27 Obsolete. Used to populate a cache table in the database.
+        * @return bool
+        */
+       public function insertMessageBlob( $name, ResourceLoaderModule $module, $lang ) {
+               return false;
        }
 
        /**
-        * Update the message blob for a given module in a given language
-        *
-        * @param string $name Module name
+        * @since 1.27
         * @param ResourceLoaderModule $module
-        * @param string $lang Language code
-        * @return string|null Regenerated message blob, or null if there was no blob for
-        *   the given module/language pair.
+        * @param string $lang
+        * @return string Cache key
         */
-       public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $row = $dbw->selectRow( 'msg_resource', 'mr_blob',
-                       array( 'mr_resource' => $name, 'mr_lang' => $lang ),
-                       __METHOD__
+       private function makeCacheKey( ResourceLoaderModule $module, $lang ) {
+               $messages = array_values( array_unique( $module->getMessages() ) );
+               sort( $messages );
+               return $this->wanCache->makeKey( __CLASS__, $module->getName(), $lang,
+                       md5( json_encode( $messages ) )
                );
-               if ( !$row ) {
-                       return null;
-               }
-
-               // Save the old and new blobs for later
-               $oldBlob = $row->mr_blob;
-               $newBlob = $this->generateMessageBlob( $module, $lang );
-
-               try {
-                       $newRow = array(
-                               'mr_resource' => $name,
-                               'mr_lang' => $lang,
-                               'mr_blob' => $newBlob,
-                               'mr_timestamp' => $dbw->timestamp()
-                       );
-
-                       $dbw->replace( 'msg_resource',
-                               array( array( 'mr_resource', 'mr_lang' ) ),
-                               $newRow, __METHOD__
-                       );
-
-                       // Figure out which messages were added and removed
-                       $oldMessages = array_keys( FormatJson::decode( $oldBlob, true ) );
-                       $newMessages = array_keys( FormatJson::decode( $newBlob, true ) );
-                       $added = array_diff( $newMessages, $oldMessages );
-                       $removed = array_diff( $oldMessages, $newMessages );
-
-                       // Delete removed messages, insert added ones
-                       if ( $removed ) {
-                               $dbw->delete( 'msg_resource_links', array(
-                                               'mrl_resource' => $name,
-                                               'mrl_message' => $removed
-                                       ), __METHOD__
-                               );
-                       }
-
-                       $newLinksRows = array();
-
-                       foreach ( $added as $message ) {
-                               $newLinksRows[] = array(
-                                       'mrl_resource' => $name,
-                                       'mrl_message' => $message
-                               );
-                       }
+       }
 
-                       if ( $newLinksRows ) {
-                               $dbw->insert( 'msg_resource_links', $newLinksRows, __METHOD__,
-                                       array( 'IGNORE' ) // just in case
-                               );
-                       }
-               } catch ( Exception $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
-               }
-               return $newBlob;
+       /**
+        * @since 1.27
+        * @param string $cacheKey
+        * @param ResourceLoaderModule $module
+        * @param string $lang
+        * @return string JSON blob
+        */
+       protected function recacheMessageBlob( $cacheKey, ResourceLoaderModule $module, $lang ) {
+               $blob = $this->generateMessageBlob( $module, $lang );
+               $cache = $this->wanCache;
+               $cache->set( $cacheKey, $blob,
+                       // Add part of a day to TTL to avoid all modules expiring at once
+                       $cache::TTL_WEEK + mt_rand( 0, $cache::TTL_DAY ),
+                       Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) )
+               );
+               return $blob;
        }
 
        /**
-        * Update a single message in all message blobs it occurs in.
+        * Invalidate cache keys for modules using this message key.
+        * Called by MessageCache when a message has changed.
         *
         * @param string $key Message key
         */
        public function updateMessage( $key ) {
-               try {
-                       $dbw = wfGetDB( DB_MASTER );
-
-                       // Keep running until the updates queue is empty.
-                       // Due to update conflicts, the queue might not be emptied
-                       // in one iteration.
-                       $updates = null;
-                       do {
-                               $updates = $this->getUpdatesForMessage( $key, $updates );
-
-                               foreach ( $updates as $k => $update ) {
-                                       // Update the row on the condition that it
-                                       // didn't change since we fetched it by putting
-                                       // the timestamp in the WHERE clause.
-                                       $success = $dbw->update( 'msg_resource',
-                                               array(
-                                                       'mr_blob' => $update['newBlob'],
-                                                       'mr_timestamp' => $dbw->timestamp() ),
-                                               array(
-                                                       'mr_resource' => $update['resource'],
-                                                       'mr_lang' => $update['lang'],
-                                                       'mr_timestamp' => $update['timestamp'] ),
-                                               __METHOD__
-                                       );
-
-                                       // Only requeue conflicted updates.
-                                       // If update() returned false, don't retry, for
-                                       // fear of getting into an infinite loop
-                                       if ( !( $success && $dbw->affectedRows() == 0 ) ) {
-                                               // Not conflicted
-                                               unset( $updates[$k] );
-                                       }
-                               }
-                       } while ( count( $updates ) );
-
-                       // No need to update msg_resource_links because we didn't add
-                       // or remove any messages, we just changed their contents.
-               } catch ( Exception $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
-               }
-       }
-
-       public function clear() {
-               // TODO: Give this some more thought
-               try {
-                       // Not using TRUNCATE, because that needs extra permissions,
-                       // which maybe not granted to the database user.
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->delete( 'msg_resource', '*', __METHOD__ );
-                       $dbw->delete( 'msg_resource_links', '*', __METHOD__ );
-               } catch ( Exception $e ) {
-                       wfDebug( __METHOD__ . " failed to update DB: $e\n" );
+               $moduleNames = $this->getResourceLoader()->getModulesByMessage( $key );
+               foreach ( $moduleNames as $moduleName ) {
+                       // Uses a holdoff to account for database slave lag (for MessageCache)
+                       $this->wanCache->touchCheckKey( $this->wanCache->makeKey( __CLASS__, $moduleName ) );
                }
        }
 
        /**
-        * Create an update queue for updateMessage()
-        *
-        * @param string $key Message key
-        * @param array $prevUpdates Updates queue to refresh or null to build a fresh update queue
-        * @return array Updates queue
+        * Invalidate cache keys for all known modules.
+        * Called by LocalisationCache after cache is regenerated.
         */
-       private function getUpdatesForMessage( $key, $prevUpdates = null ) {
-               $dbw = wfGetDB( DB_MASTER );
-
-               if ( is_null( $prevUpdates ) ) {
-                       // Fetch all blobs referencing $key
-                       $res = $dbw->select(
-                               array( 'msg_resource', 'msg_resource_links' ),
-                               array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ),
-                               array( 'mrl_message' => $key, 'mr_resource=mrl_resource' ),
-                               __METHOD__
-                       );
-               } else {
-                       // Refetch the blobs referenced by $prevUpdates
-
-                       // Reorganize the (resource, lang) pairs in the format
-                       // expected by makeWhereFrom2d()
-                       $twoD = array();
-
-                       foreach ( $prevUpdates as $update ) {
-                               $twoD[$update['resource']][$update['lang']] = true;
-                       }
-
-                       $res = $dbw->select( 'msg_resource',
-                               array( 'mr_resource', 'mr_lang', 'mr_blob', 'mr_timestamp' ),
-                               $dbw->makeWhereFrom2d( $twoD, 'mr_resource', 'mr_lang' ),
-                               __METHOD__
-                       );
-               }
-
-               // Build the new updates queue
-               $updates = array();
-
-               foreach ( $res as $row ) {
-                       $updates[] = array(
-                               'resource' => $row->mr_resource,
-                               'lang' => $row->mr_lang,
-                               'timestamp' => $row->mr_timestamp,
-                               'newBlob' => $this->reencodeBlob( $row->mr_blob, $key, $row->mr_lang )
-                       );
-               }
-
-               return $updates;
+       public function clear() {
+               $cache = $this->wanCache;
+               // Disable holdoff because this invalidates all modules and also not needed since
+               // LocalisationCache is stored outside the database and doesn't have lag.
+               $cache->touchCheckKey( $cache->makeKey( __CLASS__ ), $cache::HOLDOFF_NONE );
        }
 
        /**
-        * Reencode a message blob with the updated value for a message
-        *
-        * @param string $blob Message blob (JSON object)
-        * @param string $key Message key
-        * @param string $lang Language code
-        * @return string Message blob with $key replaced with its new value
+        * @since 1.27
+        * @return ResourceLoader
         */
-       private function reencodeBlob( $blob, $key, $lang ) {
-               $decoded = FormatJson::decode( $blob, true );
-               $decoded[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
-
-               return FormatJson::encode( (object)$decoded );
+       protected function getResourceLoader() {
+               // Back-compat: This class supports instantiation without a ResourceLoader object.
+               // Lazy-initialise this property because most callers don't need it.
+               if ( $this->resourceloader === null ) {
+                       $this->logger->warning( __CLASS__ . ' created without a ResourceLoader instance' );
+                       $this->resourceloader = new ResourceLoader();
+               }
+               return $this->resourceloader;
        }
 
        /**
-        * Get the message blobs for a set of modules from the database.
-        * Modules whose blobs are not in the database are silently dropped.
-        *
-        * @param ResourceLoader $resourceLoader
-        * @param array $modules Array of module names
+        * @since 1.27
+        * @param string $key Message key
         * @param string $lang Language code
-        * @throws MWException
-        * @return array Array mapping module names to blobs
+        * @return string
         */
-       private function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
-               if ( !count( $modules ) ) {
-                       return array();
-               }
-
-               $retval = array();
-               $dbr = wfGetDB( DB_SLAVE );
-               $res = $dbr->select( 'msg_resource',
-                       array( 'mr_blob', 'mr_resource', 'mr_timestamp' ),
-                       array( 'mr_resource' => $modules, 'mr_lang' => $lang ),
-                       __METHOD__
-               );
-
-               foreach ( $res as $row ) {
-                       $module = $resourceLoader->getModule( $row->mr_resource );
-                       if ( !$module ) {
-                               // This shouldn't be possible
-                               throw new MWException( __METHOD__ . ' passed an invalid module name' );
-                       }
-
-                       // Update the module's blob if the list of messages changed
-                       $blobKeys = array_keys( FormatJson::decode( $row->mr_blob, true ) );
-                       $moduleMsgs = array_values( array_unique( $module->getMessages() ) );
-                       if ( $blobKeys !== $moduleMsgs ) {
-                               $retval[$row->mr_resource] = $this->updateModule( $row->mr_resource, $module, $lang );
-                       } else {
-                               $retval[$row->mr_resource] = $row->mr_blob;
-                       }
-               }
-
-               return $retval;
+       protected function fetchMessage( $key, $lang ) {
+               $message = wfMessage( $key )->inLanguage( $lang );
+               $value = $message->plain();
+               if ( !$message->exists() ) {
+                       $this->logger->warning( 'Failed to find {messageKey} ({lang})', array(
+                               'messageKey' => $key,
+                               'lang' => $lang,
+                       ) );
+               }
+               return $value;
        }
 
        /**
@@ -407,15 +232,22 @@ class MessageBlobStore {
         *
         * @param ResourceLoaderModule $module
         * @param string $lang Language code
-        * @return string JSON object
+        * @return string JSON blob
         */
        private function generateMessageBlob( ResourceLoaderModule $module, $lang ) {
                $messages = array();
-
                foreach ( $module->getMessages() as $key ) {
-                       $messages[$key] = wfMessage( $key )->inLanguage( $lang )->plain();
+                       $messages[$key] = $this->fetchMessage( $key, $lang );
                }
 
-               return FormatJson::encode( (object)$messages );
+               $json = FormatJson::encode( (object)$messages );
+               if ( $json === false ) {
+                       $this->logger->warning( 'Failed to encode message blob for {module} ({lang})', array(
+                               'module' => $module->getName(),
+                               'lang' => $lang,
+                       ) );
+                       $json = '{}';
+               }
+               return $json;
        }
 }
index 09e9077..24df574 100644 (file)
@@ -98,7 +98,7 @@ class MessageCache {
         * @return MessageCache
         */
        public static function singleton() {
-               if ( is_null( self::$instance ) ) {
+               if ( self::$instance === null ) {
                        global $wgUseDatabaseMessages, $wgMsgCacheExpiry;
                        self::$instance = new self(
                                wfGetMessageCacheStorage(),
@@ -154,7 +154,7 @@ class MessageCache {
                $this->mExpiry = $expiry;
 
                if ( $wgUseLocalMessageCache ) {
-                       $this->localCache = ObjectCache::newAccelerator( CACHE_NONE );
+                       $this->localCache = ObjectCache::getLocalServerInstance( CACHE_NONE );
                } else {
                        $this->localCache = wfGetCache( CACHE_NONE );
                }
@@ -574,11 +574,12 @@ class MessageCache {
 
                foreach ( $codes as $code ) {
                        $sidebarKey = wfMemcKey( 'sidebar', $code );
-                       $this->wanCache->delete( $sidebarKey, 5 );
+                       $this->wanCache->delete( $sidebarKey );
                }
 
                // Update the message in the message blob store
-               $blobStore = new MessageBlobStore();
+               $resourceloader = RequestContext::getMain()->getOutput()->getResourceLoader();
+               $blobStore = $resourceloader->getMessageBlobStore();
                $blobStore->updateMessage( $wgContLang->lcfirst( $msg ) );
 
                Hooks::run( 'MessageCacheReplace', array( $title, $text ) );
@@ -723,8 +724,6 @@ class MessageCache {
         *   message (which can be empty)
         */
        function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
-               global $wgContLang;
-
                if ( is_int( $key ) ) {
                        // Fix numerical strings that somehow become ints
                        // on their way here
@@ -748,18 +747,11 @@ class MessageCache {
 
                Hooks::run( 'MessageCache::get', array( &$lckey ) );
 
-               if ( ord( $lckey ) < 128 ) {
-                       $uckey = ucfirst( $lckey );
-               } else {
-                       $uckey = $wgContLang->ucfirst( $lckey );
-               }
-
                // Loop through each language in the fallback list until we find something useful
                $lang = wfGetLangObj( $langcode );
                $message = $this->getMessageFromFallbackChain(
                        $lang,
                        $lckey,
-                       $uckey,
                        !$this->mDisable && $useDB
                );
 
@@ -801,21 +793,21 @@ class MessageCache {
        }
 
        /**
-        * Given a language, try and fetch a message from that language, then the
-        * fallbacks of that language, then the site language, then the fallbacks for the
-        * site language.
+        * Given a language, try and fetch messages from that language.
         *
-        * @param Language $lang Requested language
-        * @param string $lckey Lowercase key for the message
-        * @param string $uckey Uppercase key for the message
-        * @param bool $useDB Whether to use the database
+        * Will also consider fallbacks of that language, the site language, and fallbacks for
+        * the site language.
         *
         * @see MessageCache::get
+        * @param Language|StubObject $lang Preferred language
+        * @param string $lckey Lowercase key for the message (as for localisation cache)
+        * @param bool $useDB Whether to include messages from the wiki database
         * @return string|bool The message, or false if not found
         */
-       protected function getMessageFromFallbackChain( $lang, $lckey, $uckey, $useDB ) {
+       protected function getMessageFromFallbackChain( $lang, $lckey, $useDB ) {
                global $wgLanguageCode, $wgContLang;
 
+               $uckey = $wgContLang->ucfirst( $lckey );
                $langcode = $lang->getCode();
                $message = false;
 
@@ -903,7 +895,7 @@ class MessageCache {
         * @param string $code Code denoting the language to try.
         * @return string|bool The message, or false if it does not exist or on error
         */
-       function getMsgFromNamespace( $title, $code ) {
+       public function getMsgFromNamespace( $title, $code ) {
                $this->load( $code );
                if ( isset( $this->mCache[$code][$title] ) ) {
                        $entry = $this->mCache[$code][$title];
index b4086f9..af6f9d9 100644 (file)
@@ -178,6 +178,7 @@ class CategoryMembershipChange {
                        }
                }
 
+               /** @var RecentChange $rc */
                $rc = call_user_func_array(
                        $this->newForCategorizationCallback,
                        array(
index 28a1cca..dc58835 100644 (file)
@@ -83,7 +83,8 @@ class ChangesFeed {
                }
 
                $optionsHash = md5( serialize( $opts->getAllValues() ) ) . $wgRenderHashAppend;
-               $timekey = wfMemcKey( $this->type, $this->format, $wgLang->getCode(), $optionsHash, 'timestamp' );
+               $timekey = wfMemcKey(
+                       $this->type, $this->format, $wgLang->getCode(), $optionsHash, 'timestamp' );
                $key = wfMemcKey( $this->type, $this->format, $wgLang->getCode(), $optionsHash );
 
                FeedUtils::checkPurge( $timekey, $key );
@@ -110,21 +111,20 @@ class ChangesFeed {
        }
 
        /**
-        * Save to feed result to $messageMemc
+        * Save to feed result to cache
         *
         * @param string $feed Feed's content
         * @param string $timekey Memcached key of the last modification
         * @param string $key Memcached key of the content
         */
        public function saveToCache( $feed, $timekey, $key ) {
-               global $messageMemc;
-               $expire = 3600 * 24; # One day
-               $messageMemc->set( $key, $feed, $expire );
-               $messageMemc->set( $timekey, wfTimestamp( TS_MW ), $expire );
+               $cache = ObjectCache::getMainWANInstance();
+               $cache->set( $key, $feed, $cache::TTL_DAY );
+               $cache->set( $timekey, wfTimestamp( TS_MW ), $cache::TTL_DAY );
        }
 
        /**
-        * Try to load the feed result from $messageMemc
+        * Try to load the feed result from cache
         *
         * @param int $lastmod Timestamp of the last item in the recentchanges table
         * @param string $timekey Memcached key of the last modification
@@ -132,9 +132,10 @@ class ChangesFeed {
         * @return string|bool Feed's content on cache hit or false on cache miss
         */
        public function loadFromCache( $lastmod, $timekey, $key ) {
-               global $wgFeedCacheTimeout, $wgOut, $messageMemc;
+               global $wgFeedCacheTimeout, $wgOut;
 
-               $feedLastmod = $messageMemc->get( $timekey );
+               $cache = ObjectCache::getMainWANInstance();
+               $feedLastmod = $cache->get( $timekey );
 
                if ( ( $wgFeedCacheTimeout > 0 ) && $feedLastmod ) {
                        /**
@@ -153,7 +154,7 @@ class ChangesFeed {
                                if ( $feedLastmodUnix < $lastmodUnix ) {
                                        $wgOut->setLastModified( $feedLastmod ); // bug 21916
                                }
-                               return $messageMemc->get( $key );
+                               return $cache->get( $key );
                        } else {
                                wfDebug( "RC: cached feed timestamp check failed ($feedLastmod; $lastmod)\n" );
                        }
@@ -164,7 +165,7 @@ class ChangesFeed {
        /**
         * Generate the feed items given a row from the database, printing the feed.
         * @param object $rows DatabaseBase resource with recentchanges rows
-        * @param Feed $feed
+        * @param ChannelFeed $feed
         */
        public static function generateFeed( $rows, &$feed ) {
                $items = self::buildItems( $rows );
index 9ac6c32..2494ef1 100644 (file)
@@ -36,8 +36,8 @@ class ChangesList extends ContextSource {
        protected $rclistOpen;
        protected $rcMoveIndex;
 
-       /** @var MapCacheLRU */
-       protected $watchingCache;
+       /** @var BagOStuff */
+       protected $watchMsgCache;
 
        /**
         * Changeslist constructor
@@ -53,7 +53,7 @@ class ChangesList extends ContextSource {
                        $this->skin = $obj;
                }
                $this->preCacheMessages();
-               $this->watchingCache = new MapCacheLRU( 50 );
+               $this->watchMsgCache = new HashBagOStuff( array( 'maxKeys' => 50 ) );
        }
 
        /**
@@ -500,17 +500,17 @@ class ChangesList extends ContextSource {
         * @return string
         */
        protected function numberofWatchingusers( $count ) {
-               $cache = $this->watchingCache;
-               if ( $count > 0 ) {
-                       if ( !$cache->has( $count ) ) {
-                               $cache->set( $count, $this->msg( 'number_of_watching_users_RCview' )
-                                       ->numParams( $count )->escaped() );
-                       }
-
-                       return $cache->get( $count );
-               } else {
+               if ( $count <= 0 ) {
                        return '';
                }
+               $cache = $this->watchMsgCache;
+               $that = $this;
+               return $cache->getWithSetCallback( $count, $cache::TTL_INDEFINITE,
+                       function () use ( $that, $count ) {
+                               return $that->msg( 'number_of_watching_users_RCview' )
+                                       ->numParams( $count )->escaped();
+                       }
+               );
        }
 
        /**
index b59437e..ed374b0 100644 (file)
@@ -178,18 +178,24 @@ class EnhancedChangesList extends ChangesList {
                # Collate list of users
                $userlinks = array();
                # Other properties
-               $unpatrolled = false;
-               $isnew = false;
-               $allBots = true;
-               $allMinors = true;
                $curId = 0;
                # Some catalyst variables...
                $namehidden = true;
                $allLogs = true;
                $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' );
+               $collectedRcFlags = array(
+                       // All are by bots?
+                       'bot' => true,
+                       // Includes a new page?
+                       'newpage' => false,
+                       // All are minor edits?
+                       'minor' => true,
+                       // Contains an unpatrolled edit?
+                       'unpatrolled' => false,
+               );
                foreach ( $block as $rcObj ) {
                        if ( $rcObj->mAttribs['rc_type'] == RC_NEW ) {
-                               $isnew = true;
+                               $collectedRcFlags['newpage'] = true;
                        }
                        // If all log actions to this page were hidden, then don't
                        // give the name of the affected page for this block!
@@ -201,7 +207,7 @@ class EnhancedChangesList extends ChangesList {
                                $userlinks[$u] = 0;
                        }
                        if ( $rcObj->unpatrolled ) {
-                               $unpatrolled = true;
+                               $collectedRcFlags['unpatrolled'] = true;
                        }
                        if ( $rcObj->mAttribs['rc_type'] != RC_LOG ) {
                                $allLogs = false;
@@ -213,10 +219,10 @@ class EnhancedChangesList extends ChangesList {
                        }
 
                        if ( !$rcObj->mAttribs['rc_bot'] ) {
-                               $allBots = false;
+                               $collectedRcFlags['bot'] = false;
                        }
                        if ( !$rcObj->mAttribs['rc_minor'] ) {
-                               $allMinors = false;
+                               $collectedRcFlags['minor'] = false;
                        }
 
                        $userlinks[$u]++;
@@ -247,12 +253,9 @@ class EnhancedChangesList extends ChangesList {
                $r .= "<td>$tl</td>";
 
                # Main line
-               $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
-                       'newpage' => $isnew, # show, when one have this flag
-                       'minor' => $allMinors, # show only, when all have this flag
-                       'unpatrolled' => $unpatrolled, # show, when one have this flag
-                       'bot' => $allBots, # show only, when all have this flag
-               ) );
+               $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags(
+                       $collectedRcFlags
+               );
 
                # Timestamp
                $r .= '&#160;' . $block[0]->timestamp . '&#160;</td><td>';
@@ -289,7 +292,8 @@ class EnhancedChangesList extends ChangesList {
                        return '';
                }
 
-               $r .= $this->getLogText( $block, $queryParams, $allLogs, $isnew, $namehidden );
+               $r .= $this->getLogText( $block, $queryParams, $allLogs,
+                       $collectedRcFlags['newpage'], $namehidden );
 
                $r .= ' <span class="mw-changeslist-separator">. .</span> ';
 
@@ -608,7 +612,7 @@ class EnhancedChangesList extends ChangesList {
                }
 
                # Diff and hist links
-               if ( $type  == RC_LOG && $type != RC_CATEGORIZE ) {
+               if ( $type != RC_LOG && $type != RC_CATEGORIZE ) {
                        $query['action'] = 'history';
                        $data['historyLink'] = $this->getDiffHistLinks( $rcObj, $query );
                }
index 9025736..7c6fbb9 100644 (file)
@@ -800,7 +800,6 @@ class RecentChange {
                $ip = '',
                $deleted = 0
        ) {
-
                $rc = new RecentChange;
                $rc->mTitle = $categoryTitle;
                $rc->mPerformer = $user;
index 8a88fab..1b9f9b3 100644 (file)
@@ -79,11 +79,11 @@ class RedisConnectionPool implements LoggerAwareInterface {
 
        /**
         * @param array $options
-        * @throws MWException
+        * @throws Exception
         */
        protected function __construct( array $options ) {
                if ( !class_exists( 'Redis' ) ) {
-                       throw new MWException( __CLASS__ . ' requires a Redis client library. ' .
+                       throw new Exception( __CLASS__ . ' requires a Redis client library. ' .
                                'See https://www.mediawiki.org/wiki/Redis#Setup' );
                }
                if ( isset( $options['logger'] ) ) {
@@ -102,7 +102,7 @@ class RedisConnectionPool implements LoggerAwareInterface {
                } elseif ( $options['serializer'] === 'none' ) {
                        $this->serializer = Redis::SERIALIZER_NONE;
                } else {
-                       throw new MWException( "Invalid serializer specified." );
+                       throw new InvalidArgumentException( "Invalid serializer specified." );
                }
        }
 
@@ -166,6 +166,14 @@ class RedisConnectionPool implements LoggerAwareInterface {
                return self::$instances[$id];
        }
 
+       /**
+        * Destroy all singleton() instances
+        * @since 1.27
+        */
+       public static function destroySingletons() {
+               self::$instances = array();
+       }
+
        /**
         * Get a connection to a redis server. Based on code in RedisBagOStuff.php.
         *
@@ -219,7 +227,9 @@ class RedisConnectionPool implements LoggerAwareInterface {
                        // TCP connection
                        $hostPort = IP::splitHostAndPort( $server );
                        if ( !$server || !$hostPort ) {
-                               throw new MWException( __CLASS__ . ": invalid configured server \"$server\"" );
+                               throw new InvalidArgumentException(
+                                       __CLASS__ . ": invalid configured server \"$server\""
+                               );
                        }
                        list( $host, $port ) = $hostPort;
                        if ( $port === false ) {
index 91100e9..24b8b8e 100644 (file)
@@ -196,7 +196,7 @@ class SquidPurgeClient {
         */
        public function queuePurge( $url ) {
                global $wgSquidPurgeUseHostHeader;
-               $url = SquidUpdate::expand( str_replace( "\n", '', $url ) );
+               $url = CdnCacheUpdate::expand( str_replace( "\n", '', $url ) );
                $request = array();
                if ( $wgSquidPurgeUseHostHeader ) {
                        $url = wfParseUrl( $url );
diff --git a/includes/compat/MemcachedClientCompat.php b/includes/compat/MemcachedClientCompat.php
new file mode 100644 (file)
index 0000000..2304733
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Backward-compatibility alias for MemcachedClient
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, 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.27
+ * @file
+ */
+
+/**
+ * @deprecated since 1.27
+ */
+class MWMemcached extends MemcachedClient {
+}
+
+/**
+ * @deprecated since 1.27
+ */
+class MemCachedClientforWiki extends MWMemcached {
+}
diff --git a/includes/compat/RunningStatCompat.php b/includes/compat/RunningStatCompat.php
new file mode 100644 (file)
index 0000000..ac82f44
--- /dev/null
@@ -0,0 +1,28 @@
+<?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
+ */
+
+/**
+ * Backward-compatibility alias for RunningStat, which was moved out
+ * into an external library and namespaced.
+ *
+ * @deprecated since 1.27 use RunningStat\RunningStat directly
+ */
+class RunningStat extends RunningStat\RunningStat {
+}
index caf5afa..a8850fc 100644 (file)
@@ -152,6 +152,16 @@ abstract class ContextSource implements IContextSource {
                return $this->getContext()->getSkin();
        }
 
+       /**
+        * Get the Timing object
+        *
+        * @since 1.27
+        * @return Timing
+        */
+       public function getTiming() {
+               return $this->getContext()->getTiming();
+       }
+
        /**
         * Get the Stats object
         *
index 09c3939..1b881e4 100644 (file)
@@ -72,6 +72,11 @@ class DerivativeContext extends ContextSource implements MutableContext {
         */
        private $stats;
 
+       /**
+        * @var Timing
+        */
+       private $timing;
+
        /**
         * Constructor
         * @param IContextSource $context Context to inherit from
@@ -115,6 +120,19 @@ class DerivativeContext extends ContextSource implements MutableContext {
                }
        }
 
+       /**
+        * Get the timing object
+        *
+        * @return Timing
+        */
+       public function getTiming() {
+               if ( !is_null( $this->timing ) ) {
+                       return $this->timing;
+               } else {
+                       return $this->getContext()->getTiming();
+               }
+       }
+
        /**
         * Set the WebRequest object
         *
index 58bf5d9..750389d 100644 (file)
@@ -131,6 +131,14 @@ interface IContextSource {
         */
        public function getStats();
 
+       /**
+        * Get the timing object
+        *
+        * @since 1.27
+        * @return Timing
+        */
+       public function getTiming();
+
        /**
         * Get a Message object with context set.  See wfMessage for parameters.
         *
index 42a2aee..9b6e1f3 100644 (file)
@@ -22,6 +22,8 @@
  * @file
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Group all the pieces relevant to the context of a request into one instance
  */
@@ -66,6 +68,11 @@ class RequestContext implements IContextSource, MutableContext {
         */
        private $stats;
 
+       /**
+        * @var Timing
+        */
+       private $timing;
+
        /**
         * @var Config
         */
@@ -130,15 +137,26 @@ class RequestContext implements IContextSource, MutableContext {
         */
        public function getStats() {
                if ( $this->stats === null ) {
-                       $config = $this->getConfig();
-                       $prefix = $config->get( 'StatsdMetricPrefix' )
-                               ? rtrim( $config->get( 'StatsdMetricPrefix' ), '.' )
-                               : 'MediaWiki';
+                       $prefix = rtrim( $this->getConfig()->get( 'StatsdMetricPrefix' ), '.' );
                        $this->stats = new BufferingStatsdDataFactory( $prefix );
                }
                return $this->stats;
        }
 
+       /**
+        * Get the timing object
+        *
+        * @return Timing
+        */
+       public function getTiming() {
+               if ( $this->timing === null ) {
+                       $this->timing = new Timing( array(
+                               'logger' => LoggerFactory::getInstance( 'Timing' )
+                       ) );
+               }
+               return $this->timing;
+       }
+
        /**
         * Set the Title object
         *
index 0c7b612..1ef26d2 100644 (file)
  * Kind of like Hawking's [[Chronology Protection Agency]].
  */
 class ChronologyProtector {
-       /** @var array (DB master name => position) */
-       protected $startupPositions = array();
+       /** @var BagOStuff */
+       protected $store;
 
-       /** @var array (DB master name => position) */
-       protected $shutdownPositions = array();
+       /** @var string Storage key name */
+       protected $key;
+       /** @var array Map of (ip: <IP>, agent: <user-agent>) */
+       protected $client;
+       /** @var bool Whether to no-op all method calls */
+       protected $enabled = true;
+       /** @var bool Whether to check and wait on positions */
+       protected $wait = true;
 
-       /** @var bool Whether the session data was loaded */
+       /** @var bool Whether the client data was loaded */
        protected $initialized = false;
+       /** @var DBMasterPos[] Map of (DB master name => position) */
+       protected $startupPositions = array();
+       /** @var DBMasterPos[] Map of (DB master name => position) */
+       protected $shutdownPositions = array();
+
+       /**
+        * @param BagOStuff $store
+        * @param array $client Map of (ip: <IP>, agent: <user-agent>)
+        * @since 1.27
+        */
+       public function __construct( BagOStuff $store, array $client ) {
+               $this->store = $store;
+               $this->client = $client;
+               $this->key = $store->makeGlobalKey(
+                       'ChronologyProtector',
+                       md5( $client['ip'] . "\n" . $client['agent'] )
+               );
+       }
+
+       /**
+        * @param bool $enabled Whether to no-op all method calls
+        * @since 1.27
+        */
+       public function setEnabled( $enabled ) {
+               $this->enabled = $enabled;
+       }
+
+       /**
+        * @param bool $enabled Whether to check and wait on positions
+        * @since 1.27
+        */
+       public function setWaitEnabled( $enabled ) {
+               $this->wait = $enabled;
+       }
 
        /**
         * Initialise a LoadBalancer to give it appropriate chronology protection.
         *
-        * If the session has a previous master position recorded, this will try to
+        * If the stash has a previous master position recorded, this will try to
         * make sure that the next query to a slave of that master will see changes up
         * to that position by delaying execution. The delay may timeout and allow stale
         * data if no non-lagged slaves are available.
@@ -47,20 +87,18 @@ class ChronologyProtector {
         * @return void
         */
        public function initLB( LoadBalancer $lb ) {
-               if ( $lb->getServerCount() <= 1 ) {
-                       return; // non-replicated setup
-               }
-               if ( !$this->initialized ) {
-                       $this->initialized = true;
-                       if ( isset( $_SESSION[__CLASS__] ) && is_array( $_SESSION[__CLASS__] ) ) {
-                               $this->startupPositions = $_SESSION[__CLASS__];
-                       }
+               if ( !$this->enabled || $lb->getServerCount() <= 1 ) {
+                       return; // non-replicated setup or disabled
                }
-               $masterName = $lb->getServerName( 0 );
+
+               $this->initPositions();
+
+               $masterName = $lb->getServerName( $lb->getWriterIndex() );
                if ( !empty( $this->startupPositions[$masterName] ) ) {
                        $info = $lb->parentInfo();
                        $pos = $this->startupPositions[$masterName];
-                       wfDebug( __METHOD__ . ": LB " . $info['id'] . " waiting for master pos $pos\n" );
+                       wfDebugLog( 'replication', __METHOD__ .
+                               ": LB '" . $info['id'] . "' waiting for master pos $pos\n" );
                        $lb->waitFor( $pos );
                }
        }
@@ -73,23 +111,23 @@ class ChronologyProtector {
         * @return void
         */
        public function shutdownLB( LoadBalancer $lb ) {
-               if ( session_id() == '' || $lb->getServerCount() <= 1 ) {
-                       return; // don't start a session; don't bother with non-replicated setups
-               }
-               $masterName = $lb->getServerName( 0 );
-               if ( isset( $this->shutdownPositions[$masterName] ) ) {
-                       return; // already done
+               if ( !$this->enabled || $lb->getServerCount() <= 1 ) {
+                       return; // non-replicated setup or disabled
                }
-               // Only save the position if writes have been done on the connection
-               $db = $lb->getAnyOpenConnection( 0 );
+
                $info = $lb->parentInfo();
+               $masterName = $lb->getServerName( $lb->getWriterIndex() );
+
+               // Only save the position if writes have been done on the connection
+               $db = $lb->getAnyOpenConnection( $lb->getWriterIndex() );
                if ( !$db || !$db->doneWrites() ) {
-                       wfDebug( __METHOD__ . ": LB {$info['id']}, no writes done\n" );
+                       wfDebugLog( 'replication', __METHOD__ . ": LB {$info['id']}, no writes done\n" );
 
-                       return;
+                       return; // nothing to do
                }
+
                $pos = $db->getMasterPos();
-               wfDebug( __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
+               wfDebugLog( 'replication', __METHOD__ . ": LB {$info['id']} has master pos $pos\n" );
                $this->shutdownPositions[$masterName] = $pos;
        }
 
@@ -97,13 +135,75 @@ class ChronologyProtector {
         * Notify the ChronologyProtector that the LBFactory is done calling shutdownLB() for now.
         * May commit chronology data to persistent storage.
         *
-        * @return void
+        * @return array Empty on success; returns the (db name => position) map on failure
         */
        public function shutdown() {
-               if ( session_id() != '' && count( $this->shutdownPositions ) ) {
-                       wfDebug( __METHOD__ . ": saving master pos for " .
-                               count( $this->shutdownPositions ) . " master(s)\n" );
-                       $_SESSION[__CLASS__] = $this->shutdownPositions;
+               if ( !$this->enabled || !count( $this->shutdownPositions ) ) {
+                       return true; // nothing to save
+               }
+
+               wfDebugLog( 'replication',
+                       __METHOD__ . ": saving master pos for " .
+                       implode( ', ', array_keys( $this->shutdownPositions ) ) . "\n"
+               );
+
+               $shutdownPositions = $this->shutdownPositions;
+               $ok = $this->store->merge(
+                       $this->key,
+                       function ( $store, $key, $curValue ) use ( $shutdownPositions ) {
+                               /** @var $curPositions DBMasterPos[] */
+                               if ( $curValue === false ) {
+                                       $curPositions = $shutdownPositions;
+                               } else {
+                                       $curPositions = $curValue['positions'];
+                                       // Use the newest positions for each DB master
+                                       foreach ( $shutdownPositions as $db => $pos ) {
+                                               if ( !isset( $curPositions[$db] )
+                                                       || $pos->asOfTime() > $curPositions[$db]->asOfTime()
+                                               ) {
+                                                       $curPositions[$db] = $pos;
+                                               }
+                                       }
+                               }
+
+                               return array( 'positions' => $curPositions );
+                       },
+                       BagOStuff::TTL_MINUTE,
+                       10,
+                       BagOStuff::WRITE_SYNC // visible in all datacenters
+               );
+
+               if ( !$ok ) {
+                       // Raced out too many times or stash is down
+                       wfDebugLog( 'replication',
+                               __METHOD__ . ": failed to save master pos for " .
+                               implode( ', ', array_keys( $this->shutdownPositions ) ) . "\n"
+                       );
+
+                       return $this->shutdownPositions;
+               }
+
+               return array();
+       }
+
+       /**
+        * Load in previous master positions for the client
+        */
+       protected function initPositions() {
+               if ( $this->initialized ) {
+                       return;
+               }
+
+               $this->initialized = true;
+               if ( $this->wait ) {
+                       $data = $this->store->get( $this->key );
+                       $this->startupPositions = $data ? $data['positions'] : array();
+
+                       wfDebugLog( 'replication', __METHOD__ . ": key is {$this->key} (read)\n" );
+               } else {
+                       $this->startupPositions = array();
+
+                       wfDebugLog( 'replication', __METHOD__ . ": key is {$this->key} (unread)\n" );
                }
        }
 }
index 53e9a50..5443eeb 100644 (file)
@@ -91,6 +91,10 @@ class DBConnRef implements IDatabase {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
 
+       public function writesPending() {
+               return $this->__call( __FUNCTION__, func_get_args() );
+       }
+
        public function writesOrCallbacksPending() {
                return $this->__call( __FUNCTION__, func_get_args() );
        }
index 2f135a4..dea4a59 100644 (file)
@@ -441,6 +441,14 @@ abstract class DatabaseBase implements IDatabase {
                return $this->mDoneWrites ?: false;
        }
 
+       /**
+        * @return bool Whether there is a transaction open with possible write queries
+        * @since 1.27
+        */
+       public function writesPending() {
+               return $this->mTrxLevel && $this->mTrxDoneWrites;
+       }
+
        /**
         * Returns true if there is a transaction open with possible write
         * queries or transaction pre-commit/idle callbacks waiting on it to finish.
@@ -607,8 +615,7 @@ abstract class DatabaseBase implements IDatabase {
        function __construct( array $params ) {
                global $wgDBprefix, $wgDBmwschema, $wgCommandLineMode;
 
-               $this->mTrxAtomicLevels = new SplStack;
-               $this->srvCache = ObjectCache::newAccelerator( 'hash' );
+               $this->srvCache = ObjectCache::getLocalServerInstance( 'hash' );
 
                $server = $params['host'];
                $user = $params['user'];
@@ -982,7 +989,7 @@ abstract class DatabaseBase implements IDatabase {
                }
 
                if ( $this->debug() ) {
-                       wfDebugLog( 'queries', sprintf( "%s: %s", $this->mDBname, $sql ) );
+                       wfDebugLog( 'queries', sprintf( "%s: %s", $this->mDBname, $commentedSql ) );
                }
 
                $queryId = MWDebug::query( $sql, $fname, $isMaster );
@@ -3301,12 +3308,21 @@ abstract class DatabaseBase implements IDatabase {
                                        list( $phpCallback ) = $callback;
                                        $this->clearFlag( DBO_TRX ); // make each query its own transaction
                                        call_user_func( $phpCallback );
-                                       $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
+                                       if ( $autoTrx ) {
+                                               $this->setFlag( DBO_TRX ); // restore automatic begin()
+                                       } else {
+                                               $this->clearFlag( DBO_TRX ); // restore auto-commit
+                                       }
                                } catch ( Exception $e ) {
                                        if ( $ePrior ) {
                                                MWExceptionHandler::logException( $ePrior );
                                        }
                                        $ePrior = $e;
+                                       // Some callbacks may use startAtomic/endAtomic, so make sure
+                                       // their transactions are ended so other callbacks don't fail
+                                       if ( $this->trxLevel() ) {
+                                               $this->rollback( __METHOD__ );
+                                       }
                                }
                        }
                } while ( count( $this->mTrxIdleCallbacks ) );
@@ -3431,7 +3447,7 @@ abstract class DatabaseBase implements IDatabase {
                                $levels = implode( ', ', $this->mTrxAtomicLevels );
                                throw new DBUnexpectedError(
                                        $this,
-                                       "Got explicit BEGIN while atomic sections $levels are still open."
+                                       "Got explicit BEGIN from $fname while atomic section(s) $levels are open."
                                );
                        } elseif ( !$this->mTrxAutomatic ) {
                                // We want to warn about inadvertently nested begin/commit pairs, but not about
@@ -3761,19 +3777,6 @@ abstract class DatabaseBase implements IDatabase {
                return true;
        }
 
-       /**
-        * Get the slave lag when the current transaction started
-        * or a general lag estimate if not transaction is active
-        *
-        * This is useful when transactions might use snapshot isolation
-        * (e.g. REPEATABLE-READ in innodb), so the "real" lag of that data
-        * is this lag plus transaction duration. If they don't, it is still
-        * safe to be pessimistic. In AUTO-COMMIT mode, this still gives an
-        * indication of the staleness of subsequent reads.
-        *
-        * @return array ('lag': seconds, 'since': UNIX timestamp of BEGIN)
-        * @since 1.27
-        */
        public function getSessionLagStatus() {
                return $this->getTransactionLagStatus() ?: $this->getApproximateLagStatus();
        }
@@ -3786,7 +3789,7 @@ abstract class DatabaseBase implements IDatabase {
         * is this lag plus transaction duration. If they don't, it is still
         * safe to be pessimistic. This returns null if there is no transaction.
         *
-        * @return array|null ('lag': seconds, 'since': UNIX timestamp of BEGIN)
+        * @return array|null ('lag': seconds or false on error, 'since': UNIX timestamp of BEGIN)
         * @since 1.27
         */
        public function getTransactionLagStatus() {
@@ -3798,7 +3801,7 @@ abstract class DatabaseBase implements IDatabase {
        /**
         * Get a slave lag estimate for this server
         *
-        * @return array ('lag': seconds, 'since': UNIX timestamp of estimate)
+        * @return array ('lag': seconds or false on error, 'since': UNIX timestamp of estimate)
         * @since 1.27
         */
        public function getApproximateLagStatus() {
@@ -3820,30 +3823,29 @@ abstract class DatabaseBase implements IDatabase {
         *
         * @param IDatabase $db1
         * @param IDatabase ...
-        * @return array ('lag': highest lag, 'since': lowest estimate UNIX timestamp)
+        * @return array Map of values:
+        *   - lag: highest lag of any of the DBs or false on error (e.g. replication stopped)
+        *   - since: oldest UNIX timestamp of any of the DB lag estimates
+        *   - pending: whether any of the DBs have uncommitted changes
         * @since 1.27
         */
        public static function getCacheSetOptions( IDatabase $db1 ) {
-               $res = array( 'lag' => 0, 'since' => INF );
+               $res = array( 'lag' => 0, 'since' => INF, 'pending' => false );
                foreach ( func_get_args() as $db ) {
                        /** @var IDatabase $db */
                        $status = $db->getSessionLagStatus();
-                       $res['lag'] = max( $res['lag'], $status['lag'] );
+                       if ( $status['lag'] === false ) {
+                               $res['lag'] = false;
+                       } elseif ( $res['lag'] !== false ) {
+                               $res['lag'] = max( $res['lag'], $status['lag'] );
+                       }
                        $res['since'] = min( $res['since'], $status['since'] );
+                       $res['pending'] = $res['pending'] ?: $db->writesPending();
                }
 
                return $res;
        }
 
-       /**
-        * Get slave lag. Currently supported only by MySQL.
-        *
-        * Note that this function will generate a fatal error on many
-        * installations. Most callers should use LoadBalancer::safeGetLag()
-        * instead.
-        *
-        * @return int Database replication lag in seconds
-        */
        public function getLag() {
                return 0;
        }
index 6453854..4993eac 100644 (file)
@@ -78,6 +78,10 @@ class DBExpectedError extends DBError {
                return $s;
        }
 
+       function getPageTitle() {
+               return $this->msg( 'databaseerror', 'Database error' );
+       }
+
        /**
         * @return string
         */
@@ -455,5 +459,14 @@ class DBUnexpectedError extends DBError {
 /**
  * @ingroup Database
  */
-class DBReadOnlyError extends DBError {
+class DBReadOnlyError extends DBExpectedError {
+       function getPageTitle() {
+               return $this->msg( 'readonly', 'Database is locked' );
+       }
+}
+
+/**
+ * @ingroup Database
+ */
+class DBTransactionError extends DBExpectedError {
 }
index 907cdbf..b36de98 100644 (file)
@@ -620,13 +620,6 @@ abstract class DatabaseMysqlBase extends Database {
         */
        abstract protected function mysqlPing();
 
-       /**
-        * Returns slave lag.
-        *
-        * This will do a SHOW SLAVE STATUS
-        *
-        * @return int
-        */
        function getLag() {
                if ( $this->lagDetectionMethod === 'pt-heartbeat' ) {
                        return $this->getLagFromPtHeartbeat();
@@ -687,7 +680,7 @@ abstract class DatabaseMysqlBase extends Database {
                        return parent::getApproximateLagStatus();
                }
 
-               $key = wfGlobalCacheKey( 'mysql-lag', $this->getServer() );
+               $key = $this->srvCache->makeGlobalKey( 'mysql-lag', $this->getServer() );
                $approxLag = $this->srvCache->get( $key );
                if ( !$approxLag ) {
                        $approxLag = parent::getApproximateLagStatus();
@@ -722,10 +715,13 @@ abstract class DatabaseMysqlBase extends Database {
                $res = $this->doQuery( $sql );
 
                $status = false;
-               if ( $res && $row = $this->fetchRow( $res ) ) {
-                       $status = $row[0]; // can be NULL, -1, or 0+ per the MySQL manual
-                       if ( ctype_digit( $status ) ) { // success
-                               $this->lastKnownSlavePos = $pos;
+               if ( $res ) {
+                       $row = $this->fetchRow( $res );
+                       if ( $row ) {
+                               $status = $row[0]; // can be NULL, -1, or 0+ per the MySQL manual
+                               if ( ctype_digit( $status ) ) { // success
+                                       $this->lastKnownSlavePos = $pos;
+                               }
                        }
                }
 
@@ -849,7 +845,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @since 1.20
         */
        public function lockIsFree( $lockName, $method ) {
-               $lockName = $this->addQuotes( $lockName );
+               $lockName = $this->addQuotes( $this->makeLockName( $lockName ) );
                $result = $this->query( "SELECT IS_FREE_LOCK($lockName) AS lockstatus", $method );
                $row = $this->fetchObject( $result );
 
@@ -863,7 +859,7 @@ abstract class DatabaseMysqlBase extends Database {
         * @return bool
         */
        public function lock( $lockName, $method, $timeout = 5 ) {
-               $lockName = $this->addQuotes( $lockName );
+               $lockName = $this->addQuotes( $this->makeLockName( $lockName ) );
                $result = $this->query( "SELECT GET_LOCK($lockName, $timeout) AS lockstatus", $method );
                $row = $this->fetchObject( $result );
 
@@ -884,13 +880,19 @@ abstract class DatabaseMysqlBase extends Database {
         * @return bool
         */
        public function unlock( $lockName, $method ) {
-               $lockName = $this->addQuotes( $lockName );
+               $lockName = $this->addQuotes( $this->makeLockName( $lockName ) );
                $result = $this->query( "SELECT RELEASE_LOCK($lockName) as lockstatus", $method );
                $row = $this->fetchObject( $result );
 
                return ( $row->lockstatus == 1 );
        }
 
+       private function makeLockName( $lockName ) {
+               // http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock
+               // Newer version enforce a 64 char length limit.
+               return ( strlen( $lockName ) > 64 ) ? sha1( $lockName ) : $lockName;
+       }
+
        public function namedLocksEnqueue() {
                return true;
        }
@@ -1354,6 +1356,21 @@ class MySQLMasterPos implements DBMasterPos {
                $this->asOfTime = microtime( true );
        }
 
+       function asOfTime() {
+               return $this->asOfTime;
+       }
+
+       function hasReached( DBMasterPos $pos ) {
+               if ( !( $pos instanceof self ) ) {
+                       throw new InvalidArgumentException( "Position not an instance of " . __CLASS__ );
+               }
+
+               $thisPos = $this->getCoordinates();
+               $thatPos = $pos->getCoordinates();
+
+               return ( $thisPos && $thatPos && $thisPos >= $thatPos );
+       }
+
        function __toString() {
                // e.g db1034-bin.000976/843431247
                return "{$this->file}/{$this->pos}";
@@ -1370,15 +1387,4 @@ class MySQLMasterPos implements DBMasterPos {
 
                return false;
        }
-
-       function hasReached( MySQLMasterPos $pos ) {
-               $thisPos = $this->getCoordinates();
-               $thatPos = $pos->getCoordinates();
-
-               return ( $thisPos && $thatPos && $thisPos >= $thatPos );
-       }
-
-       function asOfTime() {
-               return $this->asOfTime;
-       }
 }
index 66004ec..a3d7c1b 100644 (file)
@@ -395,7 +395,8 @@ class DatabaseOracle extends Database {
 
                MediaWiki\suppressWarnings();
 
-               if ( ( $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ) ) === false ) {
+               $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+               if ( $stmt === false ) {
                        $e = oci_error( $this->mConn );
                        $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
 
@@ -637,7 +638,8 @@ class DatabaseOracle extends Database {
                }
                $sql .= ')';
 
-               if ( ( $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ) ) === false ) {
+               $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+               if ( $stmt === false ) {
                        $e = oci_error( $this->mConn );
                        $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
 
@@ -668,7 +670,8 @@ class DatabaseOracle extends Database {
                                }
                        } else {
                                /** @var OCI_Lob[] $lob */
-                               if ( ( $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB ) ) === false ) {
+                               $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB );
+                               if ( $lob[$col] === false ) {
                                        $e = oci_error( $stmt );
                                        throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
                                }
@@ -731,7 +734,8 @@ class DatabaseOracle extends Database {
                        $srcTable = $this->tableName( $srcTable );
                }
 
-               if ( ( $sequenceData = $this->getSequenceData( $destTable ) ) !== false &&
+               $sequenceData = $this->getSequenceData( $destTable );
+               if ( $sequenceData !== false &&
                        !isset( $varMap[$sequenceData['column']] )
                ) {
                        $varMap[$sequenceData['column']] = 'GET_SEQUENCE_VALUE(\'' . $sequenceData['sequence'] . '\')';
@@ -987,7 +991,8 @@ class DatabaseOracle extends Database {
                        'SELECT version FROM product_component_version ' .
                                'WHERE UPPER(product) LIKE \'ORACLE DATABASE%\''
                );
-               if ( !( $row = $rset->fetchRow() ) ) {
+               $row = $rset->fetchRow();
+               if ( !$row ) {
                        return oci_server_version( $this->mConn );
                }
 
@@ -1428,7 +1433,8 @@ class DatabaseOracle extends Database {
                        $sql .= ' WHERE ' . $this->makeList( $conds, LIST_AND );
                }
 
-               if ( ( $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql ) ) === false ) {
+               $this->mLastResult = $stmt = oci_parse( $this->mConn, $sql );
+               if ( $stmt === false ) {
                        $e = oci_error( $this->mConn );
                        $this->reportQueryError( $e['message'], $e['code'], $sql, __METHOD__ );
 
@@ -1458,7 +1464,8 @@ class DatabaseOracle extends Database {
                                }
                        } else {
                                /** @var OCI_Lob[] $lob */
-                               if ( ( $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB ) ) === false ) {
+                               $lob[$col] = oci_new_descriptor( $this->mConn, OCI_D_LOB );
+                               if ( $lob[$col] === false ) {
                                        $e = oci_error( $stmt );
                                        throw new DBUnexpectedError( $this, "Cannot create LOB descriptor: " . $e['message'] );
                                }
index 9c5127f..4d9891e 100644 (file)
@@ -1611,7 +1611,7 @@ SQL;
         * @return string Integer
         */
        private function bigintFromLockName( $lockName ) {
-               return wfBaseConvert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
+               return Wikimedia\base_convert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
        }
 } // end DatabasePostgres class
 
index 969ed5e..7fcb68e 100644 (file)
@@ -113,11 +113,11 @@ class ResultWrapper implements Iterator {
        }
 
        /**
-        * Fetch the next row from the given result object, in object form.
-        * Fields can be retrieved with $row->fieldname, with fields acting like
-        * member variables.
+        * Fetch the next row from the given result object, in object form. Fields can be retrieved with
+        * $row->fieldname, with fields acting like member variables. If no more rows are available,
+        * false is returned.
         *
-        * @return stdClass
+        * @return stdClass|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
        function fetchObject() {
@@ -125,10 +125,10 @@ class ResultWrapper implements Iterator {
        }
 
        /**
-        * Fetch the next row from the given result object, in associative array
-        * form. Fields are retrieved with $row['fieldname'].
+        * Fetch the next row from the given result object, in associative array form. Fields are
+        * retrieved with $row['fieldname']. If no more rows are available, false is returned.
         *
-        * @return array
+        * @return array|bool
         * @throws DBUnexpectedError Thrown if the database returns an error
         */
        function fetchRow() {
@@ -321,6 +321,20 @@ class LikeMatch {
 interface DBMasterPos {
        /**
         * @return float UNIX timestamp
+        * @since 1.25
         */
        public function asOfTime();
+
+       /**
+        * @param DBMasterPos $pos
+        * @return bool Whether this position is at or higher than $pos
+        * @since 1.27
+        */
+       public function hasReached( DBMasterPos $pos );
+
+       /**
+        * @return string
+        * @since 1.27
+        */
+       public function __toString();
 }
index d110583..4674c17 100644 (file)
@@ -159,6 +159,12 @@ interface IDatabase {
         */
        public function lastDoneWrites();
 
+       /**
+        * @return bool Whether there is a transaction open with possible write queries
+        * @since 1.27
+        */
+       public function writesPending();
+
        /**
         * Returns true if there is a transaction open with possible write
         * queries or transaction pre-commit/idle callbacks waiting on it to finish.
@@ -1363,7 +1369,7 @@ interface IDatabase {
         * installations. Most callers should use LoadBalancer::safeGetLag()
         * instead.
         *
-        * @return int Database replication lag in seconds
+        * @return int|bool Database replication lag in seconds or false on error
         */
        public function getLag();
 
@@ -1377,7 +1383,7 @@ interface IDatabase {
         * safe to be pessimistic. In AUTO-COMMIT mode, this still gives an
         * indication of the staleness of subsequent reads.
         *
-        * @return array ('lag': seconds, 'since': UNIX timestamp of BEGIN)
+        * @return array ('lag': seconds or false on error, 'since': UNIX timestamp of BEGIN)
         * @since 1.27
         */
        public function getSessionLagStatus();
diff --git a/includes/db/IORMRow.php b/includes/db/IORMRow.php
deleted file mode 100644 (file)
index c66cddf..0000000
+++ /dev/null
@@ -1,270 +0,0 @@
-<?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.
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, 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
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-interface IORMRow {
-       /**
-        * Load the specified fields from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|null $fields
-        * @param bool $override
-        * @param bool $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
-        * @deprecated since 1.22
-        *
-        * @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 int|null
-        */
-       public function getId();
-
-       /**
-        * Sets the objects database id.
-        *
-        * @since 1.20
-        *
-        * @param int|null $id
-        */
-       public function setId( $id );
-
-       /**
-        * Gets if a certain field is set.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function hasField( $name );
-
-       /**
-        * Gets if the id field is set.
-        *
-        * @since 1.20
-        *
-        * @return bool
-        */
-       public function hasIdField();
-
-       /**
-        * Sets multiple fields.
-        *
-        * @since 1.20
-        *
-        * @param array $fields The fields to set
-        * @param bool $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 bool $incNullId
-        *
-        * @return array
-        */
-       public function toArray( $fields = null, $incNullId = false );
-
-       /**
-        * Load the default values, via getDefaults.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $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
-        * @deprecated since 1.22
-        *
-        * @return bool Success indicator
-        */
-       public function save( $functionName = null );
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return bool 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).
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool 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
-        * @deprecated since 1.22
-        *
-        * @param array|string|null $summaryFields
-        */
-       public function loadSummaryFields( $summaryFields = null );
-
-       /**
-        * Sets the value for the @see $updateSummaries field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $update
-        */
-       public function setUpdateSummaries( $update );
-
-       /**
-        * Sets the value for the @see $inSummaryMode field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $summaryMode
-        */
-       public function setSummaryMode( $summaryMode );
-
-       /**
-        * Returns the table this IORMRow is a row in.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return IORMTable
-        */
-       public function getTable();
-}
diff --git a/includes/db/IORMTable.php b/includes/db/IORMTable.php
deleted file mode 100644 (file)
index b2527f9..0000000
+++ /dev/null
@@ -1,520 +0,0 @@
-<?php
-/**
- * Interface for objects representing a single database table.
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, 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
- *
- * @license 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 specified fields of the records matching the provided
-        * conditions and returns them as DBDataObject. Field names get prefixed.
-        *
-        * @see DatabaseBase::select()
-        *
-        * @since 1.20
-        *
-        * @param array|string|null $fields
-        * @param array $conditions
-        * @param array $options
-        * @param string|null $functionName
-        *
-        * @return ORMResult The result set
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode)
-        */
-       public function select( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects 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 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
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode)
-        */
-       public function rawSelect( $fields = null, array $conditions = array(),
-               array $options = array(), $functionName = null );
-
-       /**
-        * Selects 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 bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return array Array of array
-        */
-       public function selectFields( $fields = null, array $conditions = array(),
-               array $options = array(), $collapse = true, $functionName = null );
-
-       /**
-        * Selects 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 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 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 bool $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 bool
-        */
-       public function has( array $conditions = array() );
-
-       /**
-        * Checks if the table exists
-        *
-        * @since 1.21
-        *
-        * @return bool
-        */
-       public function exists();
-
-       /**
-        * 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 int
-        */
-       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 bool Success indicator
-        */
-       public function delete( array $conditions, $functionName = null );
-
-       /**
-        * Get API parameters for the fields supported by this object.
-        *
-        * @since 1.20
-        *
-        * @param bool $requireParams
-        * @param bool $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 int DB_ enum
-        */
-       public function getReadDb();
-
-       /**
-        * Set the database type to use for read operations.
-        *
-        * @param int $db
-        *
-        * @since 1.20
-        */
-       public function setReadDb( $db );
-
-       /**
-        * Get the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @since 1.20
-        *
-        * @return string|bool The target wiki, in a form that LBFactory
-        *   understands (or false if the local wiki is used)
-        */
-       public function getTargetWiki();
-
-       /**
-        * Set the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @param string|bool $wiki The target wiki, in a form that LBFactory
-        *   understands (or false if the local wiki shall be used)
-        *
-        * @since 1.20
-        */
-       public function setTargetWiki( $wiki );
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getReadDbConnection();
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getWriteDbConnection();
-
-       /**
-        * Get the database type used for read operations.
-        *
-        * @see wfGetLB
-        *
-        * @since 1.20
-        *
-        * @return LoadBalancer The database load balancer object
-        */
-       public function getLoadBalancer();
-
-       /**
-        * Releases the lease on the given database connection. This is useful mainly
-        * for connections to a foreign wiki. It does nothing for connections to the local wiki.
-        *
-        * @see LoadBalancer::reuseConnection
-        *
-        * @param DatabaseBase $db The database
-        *
-        * @since 1.20
-        */
-       public function releaseConnection( DatabaseBase $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 bool 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 $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
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       public function unprefixFieldNames( array $fieldNames );
-
-       /**
-        * Takes a field name with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string $fieldName
-        *
-        * @return string
-        */
-       public function unprefixFieldName( $fieldName );
-
-       /**
-        * 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 newRowFromDBResult( stdClass $result );
-
-       /**
-        * Get a new instance of the class from an array.
-        *
-        * @since 1.20
-        *
-        * @param array $data
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newRow( 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 bool
-        */
-       public function canHaveField( $name );
-}
diff --git a/includes/db/ORMIterator.php b/includes/db/ORMIterator.php
deleted file mode 100644 (file)
index e8104b6..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?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
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-interface ORMIterator extends Iterator {
-}
diff --git a/includes/db/ORMResult.php b/includes/db/ORMResult.php
deleted file mode 100644 (file)
index 327d20d..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-/**
- * ORMIterator that takes a ResultWrapper object returned from
- * a select operation returning IORMRow objects (ie IORMTable::select).
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, 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
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-class ORMResult implements ORMIterator {
-       /**
-        * @var ResultWrapper
-        */
-       protected $res;
-
-       /**
-        * @var int
-        */
-       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 bool|object $row
-        */
-       protected function setCurrent( $row ) {
-               if ( $row === false ) {
-                       $this->current = false;
-               } else {
-                       $this->current = $this->table->newRowFromDBResult( $row );
-               }
-       }
-
-       /**
-        * @return int
-        */
-       public function count() {
-               return $this->res->numRows();
-       }
-
-       /**
-        * @return bool
-        */
-       public function isEmpty() {
-               return $this->res->numRows() === 0;
-       }
-
-       /**
-        * @return IORMRow
-        */
-       public function current() {
-               return $this->current;
-       }
-
-       /**
-        * @return int
-        */
-       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 bool
-        */
-       public function valid() {
-               return $this->current !== false;
-       }
-}
diff --git a/includes/db/ORMRow.php b/includes/db/ORMRow.php
deleted file mode 100644 (file)
index b0bade3..0000000
+++ /dev/null
@@ -1,593 +0,0 @@
-<?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.
- *
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, 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
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-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 );
-
-       /**
-        * 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.
-        *
-        * @deprecated since 1.22
-        * @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.
-        *
-        * @deprecated since 1.22
-        * @since 1.20
-        * @var bool
-        */
-       protected $inSummaryMode = false;
-
-       /**
-        * @deprecated since 1.22
-        * @since 1.20
-        * @var ORMTable|null
-        */
-       protected $table;
-
-       /**
-        * Constructor.
-        *
-        * @since 1.20
-        *
-        * @param IORMTable|null $table Deprecated since 1.22
-        * @param array|null $fields
-        * @param bool $loadDefaults Deprecated since 1.22
-        */
-       public function __construct( IORMTable $table = null, $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
-        * @deprecated since 1.22
-        *
-        * @param array|null $fields
-        * @param bool $override
-        * @param bool $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 ),
-                               __METHOD__
-                       );
-
-                       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 Field name
-        * @param mixed $default Default value to return when none is found
-        * (default: null)
-        *
-        * @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
-        * @deprecated since 1.22
-        *
-        * @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 int|null
-        */
-       public function getId() {
-               return $this->getField( 'id' );
-       }
-
-       /**
-        * Sets the objects database id.
-        *
-        * @since 1.20
-        *
-        * @param int|null $id
-        */
-       public function setId( $id ) {
-               $this->setField( 'id', $id );
-       }
-
-       /**
-        * Gets if a certain field is set.
-        *
-        * @since 1.20
-        *
-        * @param string $name
-        *
-        * @return bool
-        */
-       public function hasField( $name ) {
-               return array_key_exists( $name, $this->fields );
-       }
-
-       /**
-        * Gets if the id field is set.
-        *
-        * @since 1.20
-        *
-        * @return bool
-        */
-       public function hasIdField() {
-               return $this->hasField( 'id' ) && !is_null( $this->getField( 'id' ) );
-       }
-
-       /**
-        * Gets the fields => values to write to the table.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @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];
-
-                               // Skip null id fields so that the DBMS can set the default.
-                               if ( $name === 'id' && is_null( $value ) ) {
-                                       continue;
-                               }
-
-                               switch ( $type ) {
-                                       case 'array':
-                                               $value = (array)$value;
-                                       // fall-through!
-                                       case 'blob':
-                                               $value = serialize( $value );
-                                       // fall-through!
-                               }
-
-                               $values[$this->table->getPrefixedField( $name )] = $value;
-                       }
-               }
-
-               return $values;
-       }
-
-       /**
-        * Sets multiple fields.
-        *
-        * @since 1.20
-        *
-        * @param array $fields The fields to set
-        * @param bool $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 );
-                       }
-               }
-       }
-
-       /**
-        * 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 bool $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
-        * @deprecated since 1.22
-        *
-        * @param bool $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
-        * @deprecated since 1.22 Use IORMTable->updateRow or ->insertRow
-        *
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function save( $functionName = null ) {
-               if ( $this->hasIdField() ) {
-                       return $this->table->updateRow( $this, $functionName );
-               } else {
-                       return $this->table->insertRow( $this, $functionName );
-               }
-       }
-
-       /**
-        * Updates the object in the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       protected function saveExisting( $functionName = null ) {
-               $dbw = $this->table->getWriteDbConnection();
-
-               $success = $dbw->update(
-                       $this->table->getName(),
-                       $this->getWriteValues(),
-                       $this->table->getPrefixedValues( $this->getUpdateConditions() ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               );
-
-               $this->table->releaseConnection( $dbw );
-
-               // 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
-        * @deprecated since 1.22
-        *
-        * @param string|null $functionName
-        * @param array|null $options
-        *
-        * @return bool Success indicator
-        */
-       protected function insert( $functionName = null, array $options = null ) {
-               $dbw = $this->table->getWriteDbConnection();
-
-               $success = $dbw->insert(
-                       $this->table->getName(),
-                       $this->getWriteValues(),
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               // DatabaseBase::insert does not always return true for success as documented...
-               $success = $success !== false;
-
-               if ( $success ) {
-                       $this->setField( 'id', $dbw->insertId() );
-               }
-
-               $this->table->releaseConnection( $dbw );
-
-               return $success;
-       }
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22, use IORMTable->removeRow
-        *
-        * @return bool Success indicator
-        */
-       public function remove() {
-               $this->beforeRemove();
-
-               $success = $this->table->removeRow( $this, __METHOD__ );
-
-               if ( $success ) {
-                       $this->onRemoved();
-               }
-
-               return $success;
-       }
-
-       /**
-        * Gets called before an object is removed from the database.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        */
-       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 successful removal.
-        * Can be overridden to get rid of linked data.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        */
-       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 ) {
-               $this->fields[$name] = $value;
-       }
-
-       /**
-        * Add an amount (can be negative) to the specified field (needs to be numeric).
-        *
-        * @since 1.20
-        * @deprecated since 1.22, use IORMTable->addToField
-        *
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool Success indicator
-        */
-       public function addToField( $field, $amount ) {
-               return $this->table->addToField( $this->getUpdateConditions(), $field, $amount );
-       }
-
-       /**
-        * Return the names of the fields.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return array
-        */
-       public function getFieldNames() {
-               return array_keys( $this->table->getFields() );
-       }
-
-       /**
-        * Computes and updates the values of the summary fields.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param array|string|null $summaryFields
-        */
-       public function loadSummaryFields( $summaryFields = null ) {
-       }
-
-       /**
-        * Sets the value for the @see $updateSummaries field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $update
-        */
-       public function setUpdateSummaries( $update ) {
-               $this->updateSummaries = $update;
-       }
-
-       /**
-        * Sets the value for the @see $inSummaryMode field.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @param bool $summaryMode
-        */
-       public function setSummaryMode( $summaryMode ) {
-               $this->inSummaryMode = $summaryMode;
-       }
-
-       /**
-        * Returns the table this IORMRow is a row in.
-        *
-        * @since 1.20
-        * @deprecated since 1.22
-        *
-        * @return IORMTable
-        */
-       public function getTable() {
-               return $this->table;
-       }
-}
diff --git a/includes/db/ORMTable.php b/includes/db/ORMTable.php
deleted file mode 100644 (file)
index 562a810..0000000
+++ /dev/null
@@ -1,1144 +0,0 @@
-<?php
-/**
- * Abstract base class for representing a single database table.
- * Documentation inline and at https://www.mediawiki.org/wiki/Manual:ORMTable
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, 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
- * Non-abstract since 1.21
- *
- * @file ORMTable.php
- * @ingroup ORM
- *
- * @license GNU GPL v2 or later
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-class ORMTable extends DBAccessBase implements IORMTable {
-       /**
-        * Cache for instances, used by the singleton method.
-        *
-        * @since 1.20
-        * @deprecated since 1.21
-        *
-        * @var ORMTable[]
-        */
-       protected static $instanceCache = array();
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $tableName;
-
-       /**
-        * @since 1.21
-        *
-        * @var string[]
-        */
-       protected $fields = array();
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $fieldPrefix = '';
-
-       /**
-        * @since 1.21
-        *
-        * @var string
-        */
-       protected $rowClass = 'ORMRow';
-
-       /**
-        * @since 1.21
-        *
-        * @var array
-        */
-       protected $defaults = array();
-
-       /**
-        * ID of the database connection to use for read operations.
-        * Can be changed via @see setReadDb.
-        *
-        * @since 1.20
-        *
-        * @var int DB_ enum
-        */
-       protected $readDb = DB_SLAVE;
-
-       /**
-        * Constructor.
-        *
-        * @since 1.21
-        *
-        * @param string $tableName
-        * @param string[] $fields
-        * @param array $defaults
-        * @param string|null $rowClass
-        * @param string $fieldPrefix
-        */
-       public function __construct( $tableName = '', array $fields = array(),
-               array $defaults = array(), $rowClass = null, $fieldPrefix = ''
-       ) {
-               $this->tableName = $tableName;
-               $this->fields = $fields;
-               $this->defaults = $defaults;
-
-               if ( is_string( $rowClass ) ) {
-                       $this->rowClass = $rowClass;
-               }
-
-               $this->fieldPrefix = $fieldPrefix;
-       }
-
-       /**
-        * @see IORMTable::getName
-        *
-        * @since 1.21
-        *
-        * @return string
-        * @throws MWException
-        */
-       public function getName() {
-               if ( $this->tableName === '' ) {
-                       throw new MWException( 'The table name needs to be set' );
-               }
-
-               return $this->tableName;
-       }
-
-       /**
-        * Gets the db field prefix.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, use the $this->fieldPrefix property instead
-        *
-        * @return string
-        */
-       protected function getFieldPrefix() {
-               return $this->fieldPrefix;
-       }
-
-       /**
-        * @see IORMTable::getRowClass
-        *
-        * @since 1.21
-        *
-        * @return string
-        */
-       public function getRowClass() {
-               return $this->rowClass;
-       }
-
-       /**
-        * @see ORMTable::getFields
-        *
-        * @since 1.21
-        *
-        * @return array
-        * @throws MWException
-        */
-       public function getFields() {
-               if ( $this->fields === array() ) {
-                       throw new MWException( 'The table needs to have one or more fields' );
-               }
-
-               return $this->fields;
-       }
-
-       /**
-        * Returns a list of default field values.
-        * field name => field value
-        *
-        * @since 1.20
-        *
-        * @return array
-        */
-       public function getDefaults() {
-               return $this->defaults;
-       }
-
-       /**
-        * 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 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
-       ) {
-               $res = $this->rawSelect( $fields, $conditions, $options, $functionName );
-
-               return new ORMResult( $this, $res );
-       }
-
-       /**
-        * Selects 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 Array of row objects
-        * @throws DBQueryError If the query failed (even if the database was in ignoreErrors mode).
-        */
-       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->newRow( $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
-        * @throws Exception
-        * @throws MWException
-        */
-       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;
-               }
-
-               $dbr = $this->getReadDbConnection();
-               $result = $dbr->select(
-                       $this->getName(),
-                       $this->getPrefixedFields( $fields ),
-                       $this->getPrefixedValues( $conditions ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               /* @var Exception $error */
-               $error = null;
-
-               if ( $result === false ) {
-                       // Database connection was in "ignoreErrors" mode. We don't like that.
-                       // So, we emulate the DBQueryError that should have been thrown.
-                       $error = new DBQueryError(
-                               $dbr,
-                               $dbr->lastError(),
-                               $dbr->lastErrno(),
-                               $dbr->lastQuery(),
-                               is_null( $functionName ) ? __METHOD__ : $functionName
-                       );
-               }
-
-               $this->releaseConnection( $dbr );
-
-               if ( $error ) {
-                       // Note: construct the error before releasing the connection,
-                       // but throw it after.
-                       throw $error;
-               }
-
-               return $result;
-       }
-
-       /**
-        * Selects 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 bool $collapse Set to false to always return each result row as associative array.
-        * @param string|null $functionName
-        *
-        * @return array 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 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 || $objects->isEmpty() ) ? false : $objects->current();
-       }
-
-       /**
-        * Selects 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 stdClass
-        */
-       public function rawSelectRow( array $fields, array $conditions = array(),
-               array $options = array(), $functionName = null
-       ) {
-               $dbr = $this->getReadDbConnection();
-
-               $result = $dbr->selectRow(
-                       $this->getName(),
-                       $fields,
-                       $conditions,
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               $this->releaseConnection( $dbr );
-
-               return $result;
-       }
-
-       /**
-        * Selects 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 bool $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 bool
-        */
-       public function has( array $conditions = array() ) {
-               return $this->selectRow( array( 'id' ), $conditions ) !== false;
-       }
-
-       /**
-        * Checks if the table exists
-        *
-        * @since 1.21
-        *
-        * @return bool
-        */
-       public function exists() {
-               $dbr = $this->getReadDbConnection();
-               $exists = $dbr->tableExists( $this->getName() );
-               $this->releaseConnection( $dbr );
-
-               return $exists;
-       }
-
-       /**
-        * 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 int
-        */
-       public function count( array $conditions = array(), array $options = array() ) {
-               $res = $this->rawSelectRow(
-                       array( 'rowcount' => 'COUNT(*)' ),
-                       $this->getPrefixedValues( $conditions ),
-                       $options,
-                       __METHOD__
-               );
-
-               return $res->rowcount;
-       }
-
-       /**
-        * Removes the object from the database.
-        *
-        * @since 1.20
-        *
-        * @param array $conditions
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function delete( array $conditions, $functionName = null ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $result = $dbw->delete(
-                       $this->getName(),
-                       $conditions === array() ? '*' : $this->getPrefixedValues( $conditions ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               ) !== false; // DatabaseBase::delete does not always return true for success as documented...
-
-               $this->releaseConnection( $dbw );
-
-               return $result;
-       }
-
-       /**
-        * Get API parameters for the fields supported by this object.
-        *
-        * @since 1.20
-        *
-        * @param bool $requireParams
-        * @param bool $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 ID used for read operations.
-        *
-        * @since 1.20
-        *
-        * @return int DB_ enum
-        */
-       public function getReadDb() {
-               return $this->readDb;
-       }
-
-       /**
-        * Set the database ID to use for read operations, use DB_XXX constants or
-        *   an index to the load balancer setup.
-        *
-        * @param int $db
-        *
-        * @since 1.20
-        */
-       public function setReadDb( $db ) {
-               $this->readDb = $db;
-       }
-
-       /**
-        * Get the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @since 1.20
-        *
-        * @return string|bool The target wiki, in a form that LBFactory understands
-        *   (or false if the local wiki is used)
-        */
-       public function getTargetWiki() {
-               return $this->wiki;
-       }
-
-       /**
-        * Set the ID of the any foreign wiki to use as a target for database operations
-        *
-        * @param string|bool $wiki The target wiki, in a form that  LBFactory
-        *   understands (or false if the local wiki shall be used)
-        *
-        * @since 1.20
-        */
-       public function setTargetWiki( $wiki ) {
-               $this->wiki = $wiki;
-       }
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getReadDbConnection() {
-               return $this->getConnection( $this->getReadDb(), array() );
-       }
-
-       /**
-        * Get the database type used for read operations.
-        * This is to be used instead of wfGetDB.
-        *
-        * @see LoadBalancer::getConnection
-        *
-        * @since 1.20
-        *
-        * @return DatabaseBase The database object
-        */
-       public function getWriteDbConnection() {
-               return $this->getConnection( DB_MASTER, array() );
-       }
-
-       /**
-        * Releases the lease on the given database connection. This is useful mainly
-        * for connections to a foreign wiki. It does nothing for connections to the local wiki.
-        *
-        * @see LoadBalancer::reuseConnection
-        *
-        * @param DatabaseBase $db
-        *
-        * @since 1.20
-        */
-       // @codingStandardsIgnoreStart Suppress "useless method overriding" sniffer warning
-       public function releaseConnection( DatabaseBase $db ) {
-               parent::releaseConnection( $db ); // just make it public
-       }
-       // @codingStandardsIgnoreEnd
-
-       /**
-        * 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 bool Success indicator
-        */
-       public function update( array $values, array $conditions = array() ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $result = $dbw->update(
-                       $this->getName(),
-                       $this->getPrefixedValues( $values ),
-                       $this->getPrefixedValues( $conditions ),
-                       __METHOD__
-               ) !== false; // DatabaseBase::update does not always return true for success as documented...
-
-               $this->releaseConnection( $dbw );
-
-               return $result;
-       }
-
-       /**
-        * 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() ) {
-               $slave = $this->getReadDb();
-               $this->setReadDb( DB_MASTER );
-
-               /**
-                * @var IORMRow $item
-                */
-               foreach ( $this->select( null, $conditions ) as $item ) {
-                       $item->loadSummaryFields( $summaryFields );
-                       $item->setSummaryMode( true );
-                       $item->save();
-               }
-
-               $this->setReadDb( $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 $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->fieldPrefix . $field;
-       }
-
-       /**
-        * Takes an array of field names with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       public function unprefixFieldNames( array $fieldNames ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               return $this->stripFieldPrefix( $fieldNames );
-       }
-
-       /**
-        * Takes an array of field names with prefix and returns the unprefixed equivalent.
-        *
-        * @param string[] $fieldNames
-        *
-        * @return string[]
-        */
-       private function stripFieldPrefix( array $fieldNames ) {
-               $start = strlen( $this->fieldPrefix );
-
-               return array_map( function ( $fieldName ) use ( $start ) {
-                       return substr( $fieldName, $start );
-               }, $fieldNames );
-       }
-
-       /**
-        * Takes a field name with prefix and returns the unprefixed equivalent.
-        *
-        * @since 1.20
-        * @deprecated since 1.25, will be removed
-        *
-        * @param string $fieldName
-        *
-        * @return string
-        */
-       public function unprefixFieldName( $fieldName ) {
-               wfDeprecated( __METHOD__, '1.25' );
-
-               return substr( $fieldName, strlen( $this->fieldPrefix ) );
-       }
-
-       /**
-        * Get an instance of this class.
-        *
-        * @since 1.20
-        * @deprecated since 1.21
-        *
-        * @return IORMTable
-        */
-       public static function singleton() {
-               $class = get_called_class();
-
-               if ( !array_key_exists( $class, self::$instanceCache ) ) {
-                       self::$instanceCache[$class] = new $class;
-               }
-
-               return self::$instanceCache[$class];
-       }
-
-       /**
-        * 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
-        * @throws MWException
-        * @return array
-        */
-       public function getFieldsFromDBResult( stdClass $result ) {
-               $result = (array)$result;
-
-               $rawFields = array_combine(
-                       $this->stripFieldPrefix( array_keys( $result ) ),
-                       array_values( $result )
-               );
-
-               $fieldDefinitions = $this->getFields();
-               $fields = array();
-
-               foreach ( $rawFields as $name => $value ) {
-                       if ( array_key_exists( $name, $fieldDefinitions ) ) {
-                               switch ( $fieldDefinitions[$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;
-                               }
-
-                               $fields[$name] = $value;
-                       } else {
-                               throw new MWException( 'Attempted to set unknown field ' . $name );
-                       }
-               }
-
-               return $fields;
-       }
-
-       /**
-        * @see ORMTable::newRowFromFromDBResult
-        *
-        * @deprecated since 1.20 use newRowFromDBResult instead
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return IORMRow
-        */
-       public function newFromDBResult( stdClass $result ) {
-               return self::newRowFromDBResult( $result );
-       }
-
-       /**
-        * Get a new instance of the class from a database result.
-        *
-        * @since 1.20
-        *
-        * @param stdClass $result
-        *
-        * @return IORMRow
-        */
-       public function newRowFromDBResult( stdClass $result ) {
-               return $this->newRow( $this->getFieldsFromDBResult( $result ) );
-       }
-
-       /**
-        * @see ORMTable::newRow
-        *
-        * @deprecated since 1.20 use newRow instead
-        * @since 1.20
-        *
-        * @param array $data
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newFromArray( array $data, $loadDefaults = false ) {
-               return static::newRow( $data, $loadDefaults );
-       }
-
-       /**
-        * Get a new instance of the class from an array.
-        *
-        * @since 1.20
-        *
-        * @param array $fields
-        * @param bool $loadDefaults
-        *
-        * @return IORMRow
-        */
-       public function newRow( array $fields, $loadDefaults = false ) {
-               $class = $this->getRowClass();
-
-               return new $class( $this, $fields, $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 bool
-        */
-       public function canHaveField( $name ) {
-               return array_key_exists( $name, $this->getFields() );
-       }
-
-       /**
-        * Updates the provided row in the database.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row The row to save
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function updateRow( IORMRow $row, $functionName = null ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $success = $dbw->update(
-                       $this->getName(),
-                       $this->getWriteValues( $row ),
-                       $this->getPrefixedValues( array( 'id' => $row->getId() ) ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               );
-
-               $this->releaseConnection( $dbw );
-
-               // DatabaseBase::update does not always return true for success as documented...
-               return $success !== false;
-       }
-
-       /**
-        * Inserts the provided row into the database.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row
-        * @param string|null $functionName
-        * @param array|null $options
-        *
-        * @return bool Success indicator
-        */
-       public function insertRow( IORMRow $row, $functionName = null, array $options = null ) {
-               $dbw = $this->getWriteDbConnection();
-
-               $success = $dbw->insert(
-                       $this->getName(),
-                       $this->getWriteValues( $row ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName,
-                       $options
-               );
-
-               // DatabaseBase::insert does not always return true for success as documented...
-               $success = $success !== false;
-
-               if ( $success ) {
-                       $row->setField( 'id', $dbw->insertId() );
-               }
-
-               $this->releaseConnection( $dbw );
-
-               return $success;
-       }
-
-       /**
-        * Gets the fields => values to write to the table.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row
-        *
-        * @return array
-        */
-       protected function getWriteValues( IORMRow $row ) {
-               $values = array();
-
-               $rowFields = $row->getFields();
-
-               foreach ( $this->getFields() as $name => $type ) {
-                       if ( array_key_exists( $name, $rowFields ) ) {
-                               $value = $rowFields[$name];
-
-                               switch ( $type ) {
-                                       case 'array':
-                                               $value = (array)$value;
-                                       // fall-through!
-                                       case 'blob':
-                                               $value = serialize( $value );
-                                       // fall-through!
-                               }
-
-                               $values[$this->getPrefixedField( $name )] = $value;
-                       }
-               }
-
-               return $values;
-       }
-
-       /**
-        * Removes the provided row from the database.
-        *
-        * @since 1.22
-        *
-        * @param IORMRow $row
-        * @param string|null $functionName
-        *
-        * @return bool Success indicator
-        */
-       public function removeRow( IORMRow $row, $functionName = null ) {
-               $success = $this->delete(
-                       array( 'id' => $row->getId() ),
-                       is_null( $functionName ) ? __METHOD__ : $functionName
-               );
-
-               // DatabaseBase::delete does not always return true for success as documented...
-               return $success !== false;
-       }
-
-       /**
-        * Add an amount (can be negative) to the specified field (needs to be numeric).
-        *
-        * @since 1.22
-        *
-        * @param array $conditions
-        * @param string $field
-        * @param int $amount
-        *
-        * @return bool Success indicator
-        * @throws MWException
-        */
-       public function addToField( array $conditions, $field, $amount ) {
-               if ( !array_key_exists( $field, $this->fields ) ) {
-                       throw new MWException( 'Unknown field "' . $field . '" provided' );
-               }
-
-               if ( $amount == 0 ) {
-                       return true;
-               }
-
-               $absoluteAmount = abs( $amount );
-               $isNegative = $amount < 0;
-
-               $fullField = $this->getPrefixedField( $field );
-
-               $dbw = $this->getWriteDbConnection();
-
-               $success = $dbw->update(
-                       $this->getName(),
-                       array( "$fullField=$fullField" . ( $isNegative ? '-' : '+' ) . $absoluteAmount ),
-                       $this->getPrefixedValues( $conditions ),
-                       __METHOD__
-               ) !== false; // DatabaseBase::update does not always return true for success as documented...
-
-               $this->releaseConnection( $dbw );
-
-               return $success;
-       }
-}
index e7b7627..eeeca62 100644 (file)
  * @ingroup Database
  */
 abstract class LBFactory {
+       /** @var ChronologyProtector */
+       protected $chronProt;
+
        /** @var LBFactory */
        private static $instance;
 
        /** @var string|bool Reason all LBs are read-only or false if not */
        protected $readOnlyReason = false;
 
+       const SHUTDOWN_NO_CHRONPROT = 1; // don't save ChronologyProtector positions (for async code)
+
        /**
         * Construct a factory based on a configuration array (typically from $wgLBFactoryConf)
         * @param array $conf
@@ -40,6 +45,8 @@ abstract class LBFactory {
                if ( isset( $conf['readOnlyReason'] ) && is_string( $conf['readOnlyReason'] ) ) {
                        $this->readOnlyReason = $conf['readOnlyReason'];
                }
+
+               $this->chronProt = $this->newChronologyProtector();
        }
 
        /**
@@ -170,9 +177,10 @@ abstract class LBFactory {
 
        /**
         * Prepare all tracked load balancers for shutdown
+        * @param integer $flags Supports SHUTDOWN_* flags
         * STUB
         */
-       public function shutdown() {
+       public function shutdown( $flags = 0 ) {
        }
 
        /**
@@ -200,7 +208,10 @@ abstract class LBFactory {
         * Commit changes on all master connections
         */
        public function commitMasterChanges() {
+               $start = microtime( true );
                $this->forEachLBCallMethod( 'commitMasterChanges' );
+               $timeMs = 1000 * ( microtime( true ) - $start );
+               RequestContext::getMain()->getStats()->timing( "db.commit-masters", $timeMs );
        }
 
        /**
@@ -251,6 +262,62 @@ abstract class LBFactory {
                } );
                return $ret;
        }
+
+       /**
+        * Disable the ChronologyProtector for all load balancers
+        *
+        * This can be called at the start of special API entry points
+        *
+        * @since 1.27
+        */
+       public function disableChronologyProtection() {
+               $this->chronProt->setEnabled( false );
+       }
+
+       /**
+        * @return ChronologyProtector
+        */
+       protected function newChronologyProtector() {
+               $request = RequestContext::getMain()->getRequest();
+               $chronProt = new ChronologyProtector(
+                       ObjectCache::getMainStashInstance(),
+                       array(
+                               'ip' => $request->getIP(),
+                               'agent' => $request->getHeader( 'User-Agent' )
+                       )
+               );
+               if ( PHP_SAPI === 'cli' ) {
+                       $chronProt->setEnabled( false );
+               } elseif ( $request->getHeader( 'ChronologyProtection' ) === 'false' ) {
+                       // Request opted out of using position wait logic. This is useful for requests
+                       // done by the job queue or background ETL that do not have a meaningful session.
+                       $chronProt->setWaitEnabled( false );
+               }
+
+               return $chronProt;
+       }
+
+       /**
+        * @param ChronologyProtector $cp
+        */
+       protected function shutdownChronologyProtector( ChronologyProtector $cp ) {
+               // Get all the master positions needed
+               $this->forEachLB( function ( LoadBalancer $lb ) use ( $cp ) {
+                       $cp->shutdownLB( $lb );
+               } );
+               // Write them to the stash
+               $unsavedPositions = $cp->shutdown();
+               // If the positions failed to write to the stash, at least wait on local datacenter
+               // slaves to catch up before responding. Even if there are several DCs, this increases
+               // the chance that the user will see their own changes immediately afterwards. As long
+               // as the sticky DC cookie applies (same domain), this is not even an issue.
+               $this->forEachLB( function ( LoadBalancer $lb ) use ( $unsavedPositions ) {
+                       $masterName = $lb->getServerName( $lb->getWriterIndex() );
+                       if ( isset( $unsavedPositions[$masterName] ) ) {
+                               $lb->waitForAll( $unsavedPositions[$masterName] );
+                       }
+               } );
+       }
 }
 
 /**
index 089dfd3..e58aead 100644 (file)
@@ -76,8 +76,6 @@
  * @ingroup Database
  */
 class LBFactoryMulti extends LBFactory {
-       // Required settings
-
        /** @var array A map of database names to section names */
        private $sectionsByDB;
 
@@ -160,7 +158,6 @@ class LBFactoryMulti extends LBFactory {
        public function __construct( array $conf ) {
                parent::__construct( $conf );
 
-               $this->chronProt = new ChronologyProtector;
                $this->conf = $conf;
                $required = array( 'sectionsByDB', 'sectionLoads', 'serverTemplate' );
                $optional = array( 'groupLoadsBySection', 'groupLoadsByDB', 'hostsByName',
@@ -401,14 +398,10 @@ class LBFactoryMulti extends LBFactory {
                }
        }
 
-       public function shutdown() {
-               foreach ( $this->mainLBs as $lb ) {
-                       $this->chronProt->shutdownLB( $lb );
-               }
-               foreach ( $this->extLBs as $extLB ) {
-                       $this->chronProt->shutdownLB( $extLB );
+       public function shutdown( $flags = 0 ) {
+               if ( !( $flags & self::SHUTDOWN_NO_CHRONPROT ) ) {
+                       $this->shutdownChronologyProtector( $this->chronProt );
                }
-               $this->chronProt->shutdown();
-               $this->commitMasterChanges();
+               $this->commitMasterChanges(); // sanity
        }
 }
index 353c47a..1c9e094 100644 (file)
@@ -29,8 +29,6 @@ class LBFactorySimple extends LBFactory {
        private $mainLB;
        /** @var LoadBalancer[] */
        private $extLBs = array();
-       /** @var ChronologyProtector */
-       private $chronProt;
 
        /** @var string */
        private $loadMonitorClass;
@@ -38,7 +36,6 @@ class LBFactorySimple extends LBFactory {
        public function __construct( array $conf ) {
                parent::__construct( $conf );
 
-               $this->chronProt = new ChronologyProtector;
                $this->loadMonitorClass = isset( $conf['loadMonitorClass'] )
                        ? $conf['loadMonitorClass']
                        : null;
@@ -159,14 +156,10 @@ class LBFactorySimple extends LBFactory {
                }
        }
 
-       public function shutdown() {
-               if ( $this->mainLB ) {
-                       $this->chronProt->shutdownLB( $this->mainLB );
+       public function shutdown( $flags = 0 ) {
+               if ( !( $flags & self::SHUTDOWN_NO_CHRONPROT ) ) {
+                       $this->shutdownChronologyProtector( $this->chronProt );
                }
-               foreach ( $this->extLBs as $extLB ) {
-                       $this->chronProt->shutdownLB( $extLB );
-               }
-               $this->chronProt->shutdown();
-               $this->commitMasterChanges();
+               $this->commitMasterChanges(); // sanity
        }
 }
index bc9465b..19b2d1c 100644 (file)
@@ -47,6 +47,8 @@ class LoadBalancer {
        private $mLoadMonitorClass;
        /** @var LoadMonitor */
        private $mLoadMonitor;
+       /** @var BagOStuff */
+       private $srvCache;
 
        /** @var bool|DatabaseBase Database connection that caused a problem */
        private $mErrorConnection;
@@ -68,7 +70,9 @@ class LoadBalancer {
        /** @var integer Warn when this many connection are held */
        const CONN_HELD_WARN_THRESHOLD = 10;
        /** @var integer Default 'max lag' when unspecified */
-       const MAX_LAG = 30;
+       const MAX_LAG = 10;
+       /** @var integer Max time to wait for a slave to catch up (e.g. ChronologyProtector) */
+       const POS_WAIT_TIMEOUT = 10;
 
        /**
         * @param array $params Array with keys:
@@ -82,7 +86,7 @@ class LoadBalancer {
                        throw new MWException( __CLASS__ . ': missing servers parameter' );
                }
                $this->mServers = $params['servers'];
-               $this->mWaitTimeout = 10;
+               $this->mWaitTimeout = self::POS_WAIT_TIMEOUT;
 
                $this->mReadIndex = -1;
                $this->mWriteIndex = -1;
@@ -121,6 +125,8 @@ class LoadBalancer {
                                }
                        }
                }
+
+               $this->srvCache = ObjectCache::getLocalServerInstance();
        }
 
        /**
@@ -202,8 +208,6 @@ class LoadBalancer {
                        return false;
                }
 
-               # wfDebugLog( 'connect', var_export( $loads, true ) );
-
                # Return a random representative of the remainder
                return ArrayUtils::pickRandom( $loads );
        }
@@ -241,7 +245,7 @@ class LoadBalancer {
                                $nonErrorLoads = $this->mGroupLoads[$group];
                        } else {
                                # No loads for this group, return false and the caller can use some other group
-                               wfDebug( __METHOD__ . ": no loads for group $group\n" );
+                               wfDebugLog( 'connect', __METHOD__ . ": no loads for group $group\n" );
 
                                return false;
                        }
@@ -341,7 +345,8 @@ class LoadBalancer {
                                }
                        }
                        $serverName = $this->getServerName( $i );
-                       wfDebug( __METHOD__ . ": using server $serverName for group '$group'\n" );
+                       wfDebugLog( 'connect', __METHOD__ .
+                               ": using server $serverName for group '$group'\n" );
                }
 
                return $i;
@@ -443,17 +448,28 @@ class LoadBalancer {
        protected function doWait( $index, $open = false, $timeout = null ) {
                $close = false; // close the connection afterwards
 
-               # Find a connection to wait on, creating one if needed and allowed
+               // Check if we already know that the DB has reached this point
+               $server = $this->getServerName( $index );
+               $key = $this->srvCache->makeGlobalKey( __CLASS__, 'last-known-pos', $server );
+               /** @var DBMasterPos $knownReachedPos */
+               $knownReachedPos = $this->srvCache->get( $key );
+               if ( $knownReachedPos && $knownReachedPos->hasReached( $this->mWaitForPos ) ) {
+                       wfDebugLog( 'replication', __METHOD__ .
+                               ": slave $server known to be caught up (pos >= $knownReachedPos).\n" );
+                       return true;
+               }
+
+               // Find a connection to wait on, creating one if needed and allowed
                $conn = $this->getAnyOpenConnection( $index );
                if ( !$conn ) {
                        if ( !$open ) {
-                               wfDebug( __METHOD__ . ": no connection open\n" );
+                               wfDebugLog( 'replication', __METHOD__ . ": no connection open for $server\n" );
 
                                return false;
                        } else {
                                $conn = $this->openConnection( $index, '' );
                                if ( !$conn ) {
-                                       wfDebug( __METHOD__ . ": failed to open connection\n" );
+                                       wfDebugLog( 'replication', __METHOD__ . ": failed to connect to $server\n" );
 
                                        return false;
                                }
@@ -463,20 +479,21 @@ class LoadBalancer {
                        }
                }
 
-               wfDebug( __METHOD__ . ": Waiting for slave #$index to catch up...\n" );
+               wfDebugLog( 'replication', __METHOD__ . ": Waiting for slave $server to catch up...\n" );
                $timeout = $timeout ?: $this->mWaitTimeout;
                $result = $conn->masterPosWait( $this->mWaitForPos, $timeout );
 
                if ( $result == -1 || is_null( $result ) ) {
-                       # Timed out waiting for slave, use master instead
-                       $server = $server = $this->getServerName( $index );
+                       // Timed out waiting for slave, use master instead
                        $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
-                       wfDebug( "$msg\n" );
+                       wfDebugLog( 'replication', "$msg\n" );
                        wfDebugLog( 'DBPerformance', "$msg:\n" . wfBacktrace( true ) );
                        $ok = false;
                } else {
-                       wfDebug( __METHOD__ . ": Done\n" );
+                       wfDebugLog( 'replication', __METHOD__ . ": Done\n" );
                        $ok = true;
+                       // Remember that the DB reached this point
+                       $this->srvCache->set( $key, $this->mWaitForPos, BagOStuff::TTL_DAY );
                }
 
                if ( $close ) {
@@ -577,7 +594,6 @@ class LoadBalancer {
                $refCount = $conn->getLBInfo( 'foreignPoolRefCount' );
                if ( $serverIndex === null || $refCount === null ) {
                        wfDebug( __METHOD__ . ": this connection was not opened as a foreign connection\n" );
-
                        /**
                         * This can happen in code like:
                         *   foreach ( $dbs as $db ) {
@@ -588,7 +604,6 @@ class LoadBalancer {
                         * When a connection to the local DB is opened in this way, reuseConnection()
                         * should be ignored
                         */
-
                        return;
                }
 
@@ -670,10 +685,10 @@ class LoadBalancer {
                        $conn = $this->reallyOpenConnection( $server, false );
                        $serverName = $this->getServerName( $i );
                        if ( $conn->isOpen() ) {
-                               wfDebug( "Connected to database $i at $serverName\n" );
+                               wfDebugLog( 'connect', "Connected to database $i at $serverName\n" );
                                $this->mConns['local'][$i][0] = $conn;
                        } else {
-                               wfDebug( "Failed to connect to database $i at $serverName\n" );
+                               wfDebugLog( 'connect', "Failed to connect to database $i at $serverName\n" );
                                $this->mErrorConnection = $conn;
                                $conn = false;
                        }
@@ -948,14 +963,10 @@ class LoadBalancer {
                        for ( $i = 1; $i < $serverCount; $i++ ) {
                                $conn = $this->getAnyOpenConnection( $i );
                                if ( $conn ) {
-                                       wfDebug( "Master pos fetched from slave\n" );
-
                                        return $conn->getSlavePos();
                                }
                        }
                } else {
-                       wfDebug( "Master pos fetched from master\n" );
-
                        return $masterConn->getMasterPos();
                }
 
@@ -1156,7 +1167,8 @@ class LoadBalancer {
                if ( !$this->laggedSlaveMode && $this->getServerCount() > 1 ) {
                        try {
                                // See if laggedSlaveMode gets set
-                               $this->getConnection( DB_SLAVE, false, $wiki );
+                               $conn = $this->getConnection( DB_SLAVE, false, $wiki );
+                               $this->reuseConnection( $conn );
                        } catch ( DBConnectionError $e ) {
                                // Avoid expensive re-connect attempts and failures
                                $this->slavesDownMode = true;
index f49e965..31f6163 100644 (file)
@@ -36,7 +36,7 @@ class LoadMonitorMySQL implements LoadMonitor {
        public function __construct( $parent ) {
                $this->parent = $parent;
 
-               $this->srvCache = ObjectCache::newAccelerator( 'hash' );
+               $this->srvCache = ObjectCache::getLocalServerInstance( 'hash' );
                $this->mainCache = ObjectCache::getLocalClusterInstance();
        }
 
@@ -58,7 +58,7 @@ class LoadMonitorMySQL implements LoadMonitor {
                # (a) Check the local APC cache
                $value = $this->srvCache->get( $key );
                if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
-                       wfDebugLog( 'replication', __FUNCTION__ . ": got lag times ($key) from local cache" );
+                       wfDebugLog( 'replication', __METHOD__ . ": got lag times ($key) from local cache" );
                        return $value['lagTimes']; // cache hit
                }
                $staleValue = $value ?: false;
@@ -67,7 +67,7 @@ class LoadMonitorMySQL implements LoadMonitor {
                $value = $this->mainCache->get( $key );
                if ( $value && $value['timestamp'] > ( microtime( true ) - $ttl ) ) {
                        $this->srvCache->set( $key, $value, $staleTTL );
-                       wfDebugLog( 'replication', __FUNCTION__ . ": got lag times ($key) from main cache" );
+                       wfDebugLog( 'replication', __METHOD__ . ": got lag times ($key) from main cache" );
 
                        return $value['lagTimes']; // cache hit
                }
@@ -90,9 +90,15 @@ class LoadMonitorMySQL implements LoadMonitor {
                foreach ( $serverIndexes as $i ) {
                        if ( $i == 0 ) { # Master
                                $lagTimes[$i] = 0;
-                       } elseif ( false !== ( $conn = $this->parent->getAnyOpenConnection( $i ) ) ) {
+                               continue;
+                       }
+                       $conn = $this->parent->getAnyOpenConnection( $i );
+                       if ( $conn !== false ) {
                                $lagTimes[$i] = $conn->getLag();
-                       } elseif ( false !== ( $conn = $this->parent->openConnection( $i, $wiki ) ) ) {
+                               continue;
+                       }
+                       $conn = $this->parent->openConnection( $i, $wiki );
+                       if ( $conn !== false ) {
                                $lagTimes[$i] = $conn->getLag();
                                # Close the connection to avoid sleeper connections piling up.
                                # Note that the caller will pick one of these DBs and reconnect,
@@ -106,7 +112,7 @@ class LoadMonitorMySQL implements LoadMonitor {
                $value = array( 'lagTimes' => $lagTimes, 'timestamp' => microtime( true ) );
                $this->mainCache->set( $key, $value, $staleTTL );
                $this->srvCache->set( $key, $value, $staleTTL );
-               wfDebugLog( 'replication', __FUNCTION__ . ": re-calculated lag times ($key)" );
+               wfDebugLog( 'replication', __METHOD__ . ": re-calculated lag times ($key)" );
 
                return $value['lagTimes'];
        }
@@ -118,7 +124,7 @@ class LoadMonitorMySQL implements LoadMonitor {
        }
 
        private function getLagTimeCacheKey() {
-               # Lag is per-server, not per-DB, so key on the master DB name
-               return wfGlobalCacheKey( 'lag-times', $this->parent->getServerName( 0 ) );
+               // Lag is per-server, not per-DB, so key on the master DB name
+               return $this->srvCache->makeGlobalKey( 'lag-times', $this->parent->getServerName( 0 ) );
        }
 }
index bb3c7e1..65719fa 100644 (file)
@@ -41,7 +41,7 @@ use UDPTransport;
  * See documentation in DefaultSettings.php for detailed explanations of each
  * variable.
  *
- * @see \\MediaWiki\\Logger\\LoggerFactory
+ * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -54,7 +54,7 @@ class LegacyLogger extends AbstractLogger {
        protected $channel;
 
        /**
-        * Convert Psr\\Log\\LogLevel constants into int for sane comparisons
+        * Convert \Psr\Log\LogLevel constants into int for sane comparisons
         * These are the same values that Monlog uses
         *
         * @var array $levelMapping
@@ -101,7 +101,7 @@ class LegacyLogger extends AbstractLogger {
         *
         * @param string $channel
         * @param string $message
-        * @param string|int $level Psr\\Log\\LogEvent constant or Monlog level int
+        * @param string|int $level \Psr\Log\LogEvent constant or Monlog level int
         * @param array $context
         * @return bool True if message should be sent to disk/network, false
         * otherwise
index 6a7f1d0..1bf39e4 100644 (file)
@@ -30,7 +30,7 @@ namespace MediaWiki\Logger;
  * );
  * @endcode
  *
- * @see \\MediaWiki\\Logger\\LoggerFactory
+ * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -47,7 +47,7 @@ class LegacySpi implements Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \\Psr\\Log\\LoggerInterface Logger instance
+        * @return \Psr\Log\LoggerInterface Logger instance
         */
        public function getLogger( $channel ) {
                if ( !isset( $this->singletons[$channel] ) ) {
index f1b24e7..e0c4989 100644 (file)
@@ -25,7 +25,7 @@ use ObjectFactory;
 /**
  * PSR-3 logger instance factory.
  *
- * Creation of \\Psr\\Log\\LoggerInterface instances is managed via the
+ * Creation of \Psr\Log\LoggerInterface instances is managed via the
  * LoggerFactory::getInstance() static method which in turn delegates to the
  * currently registered service provider.
  *
@@ -38,7 +38,7 @@ use ObjectFactory;
  * $wgMWLoggerDefaultSpi is expected to be an array usable by
  * ObjectFactory::getObjectFromSpec() to create a class.
  *
- * @see \\MediaWiki\\Logger\\Spi
+ * @see \MediaWiki\Logger\Spi
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -47,16 +47,16 @@ class LoggerFactory {
 
        /**
         * Service provider.
-        * @var \\MediaWiki\\Logger\\Spi $spi
+        * @var \MediaWiki\Logger\Spi $spi
         */
        private static $spi;
 
 
        /**
-        * Register a service provider to create new \\Psr\\Log\\LoggerInterface
+        * Register a service provider to create new \Psr\Log\LoggerInterface
         * instances.
         *
-        * @param \\MediaWiki\\Logger\\Spi $provider Provider to register
+        * @param \MediaWiki\Logger\Spi $provider Provider to register
         */
        public static function registerProvider( Spi $provider ) {
                self::$spi = $provider;
@@ -71,7 +71,7 @@ class LoggerFactory {
         * Spi registration. $wgMWLoggerDefaultSpi is expected to be an
         * array usable by ObjectFactory::getObjectFromSpec() to create a class.
         *
-        * @return \\MediaWiki\\Logger\\Spi
+        * @return \MediaWiki\Logger\Spi
         * @see registerProvider()
         * @see ObjectFactory::getObjectFromSpec()
         */
@@ -91,23 +91,9 @@ class LoggerFactory {
         * Get a named logger instance from the currently configured logger factory.
         *
         * @param string $channel Logger channel (name)
-        * @return \\Psr\\Log\\LoggerInterface
+        * @return \Psr\Log\LoggerInterface
         */
        public static function getInstance( $channel ) {
-               if ( !interface_exists( '\Psr\Log\LoggerInterface' ) ) {
-                       $message = (
-                               'MediaWiki requires the <a href="https://github.com/php-fig/log">PSR-3 logging ' .
-                               "library</a> to be present. This library is not embedded directly in MediaWiki's " .
-                               "git repository and must be installed separately by the end user.\n\n" .
-                               'Please see <a href="https://www.mediawiki.org/wiki/Download_from_Git' .
-                               '#Fetch_external_libraries">mediawiki.org</a> for help on installing ' .
-                               'the required components.'
-                       );
-                       echo $message;
-                       trigger_error( $message, E_USER_ERROR );
-                       die( 1 );
-               }
-
                return self::getProvider()->getLogger( $channel );
        }
 
index 274e18e..eea9adc 100644 (file)
@@ -178,7 +178,7 @@ class MonologSpi implements Spi {
         * name will return the cached instance.
         *
         * @param string $channel Logging channel
-        * @return \\Psr\\Log\\LoggerInterface Logger instance
+        * @return \Psr\Log\LoggerInterface Logger instance
         */
        public function getLogger( $channel ) {
                if ( !isset( $this->singletons['loggers'][$channel] ) ) {
@@ -200,11 +200,17 @@ class MonologSpi implements Spi {
         * Create a logger.
         * @param string $channel Logger channel
         * @param array $spec Configuration
-        * @return \\Monolog\\Logger
+        * @return \Monolog\Logger
         */
        protected function createLogger( $channel, $spec ) {
                $obj = new Logger( $channel );
 
+               if ( isset( $spec['calls'] ) ) {
+                       foreach ( $spec['calls'] as $method => $margs ) {
+                               call_user_func_array( array( $obj, $method ), $margs );
+                       }
+               }
+
                if ( isset( $spec['processors'] ) ) {
                        foreach ( $spec['processors'] as $processor ) {
                                $obj->pushProcessor( $this->getProcessor( $processor ) );
@@ -238,7 +244,7 @@ class MonologSpi implements Spi {
        /**
         * Create or return cached handler.
         * @param string $name Processor name
-        * @return \\Monolog\\Handler\\HandlerInterface
+        * @return \Monolog\Handler\HandlerInterface
         */
        public function getHandler( $name ) {
                if ( !isset( $this->singletons['handlers'][$name] ) ) {
@@ -261,7 +267,7 @@ class MonologSpi implements Spi {
        /**
         * Create or return cached formatter.
         * @param string $name Formatter name
-        * @return \\Monolog\\Formatter\\FormatterInterface
+        * @return \Monolog\Formatter\FormatterInterface
         */
        public function getFormatter( $name ) {
                if ( !isset( $this->singletons['formatters'][$name] ) ) {
index c9c7482..8ae34e8 100644 (file)
@@ -23,17 +23,16 @@ namespace MediaWiki\Logger;
 use Psr\Log\NullLogger;
 
 /**
- * LoggerFactory service provider that creates \\Psr\\Log\\NullLogger
+ * LoggerFactory service provider that creates \Psr\Log\NullLogger
  * instances. A NullLogger silently discards all log events sent to it.
  *
  * Usage:
- * @code
- * $wgMWLoggerDefaultSpi = array(
- *   'class' => '\\MediaWiki\\Logger\\NullSpi',
- * );
- * @endcode
  *
- * @see \\MediaWiki\\Logger\\LoggerFactory
+ *     $wgMWLoggerDefaultSpi = array(
+ *         'class' => '\\MediaWiki\\Logger\\NullSpi',
+ *     );
+ *
+ * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -41,7 +40,7 @@ use Psr\Log\NullLogger;
 class NullSpi implements Spi {
 
        /**
-        * @var \\Psr\\Log\\NullLogger $singleton
+        * @var \Psr\Log\NullLogger $singleton
         */
        protected $singleton;
 
@@ -55,7 +54,7 @@ class NullSpi implements Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \\Psr\\Log\\NullLogger Logger instance
+        * @return \Psr\Log\NullLogger Logger instance
         */
        public function getLogger( $channel ) {
                return $this->singleton;
index 51818a3..044789f 100644 (file)
 namespace MediaWiki\Logger;
 
 /**
- * Service provider interface for \\Psr\\Log\\LoggerInterface implementation
+ * Service provider interface for \Psr\Log\LoggerInterface implementation
  * libraries.
  *
  * MediaWiki can be configured to use a class implementing this interface to
- * create new \\Psr\\Log\\LoggerInterface instances via either the
+ * create new \Psr\Log\LoggerInterface instances via either the
  * $wgMWLoggerDefaultSpi global variable or code that constructs an instance
  * and registers it via the LoggerFactory::registerProvider() static method.
  *
- * @see \\MediaWiki\\Logger\\LoggerFactory
+ * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
@@ -40,7 +40,7 @@ interface Spi {
         * Get a logger instance.
         *
         * @param string $channel Logging channel
-        * @return \\Psr\\Log\\LoggerInterface Logger instance
+        * @return \Psr\Log\LoggerInterface Logger instance
         */
        public function getLogger( $channel );
 
index 019d028..510d42a 100644 (file)
@@ -37,6 +37,10 @@ use Monolog\Formatter\FormatterInterface;
  * @copyright © 2015 Erik Bernhardson and Wikimedia Foundation.
  */
 class AvroFormatter implements FormatterInterface {
+       /**
+        * @var Magic byte to encode schema revision id.
+        */
+       const MAGIC = 0x0;
        /**
         * @var array Map from schema name to schema definition
         */
@@ -80,6 +84,7 @@ class AvroFormatter implements FormatterInterface {
        public function format( array $record ) {
                $this->io->truncate();
                $schema = $this->getSchema( $record['channel'] );
+               $revId = $this->getSchemaRevisionId( $record['channel'] );
                if ( $schema === null ) {
                        trigger_error( "The schema for channel '{$record['channel']}' is not available" );
                        return null;
@@ -92,6 +97,10 @@ class AvroFormatter implements FormatterInterface {
                        trigger_error( "Avro failed to serialize record for {$record['channel']} : {$json}" );
                        return null;
                }
+               if ( $revId !== null ) {
+                       return chr( self::MAGIC ) . $this->encode_long( $revId ) . $this->io->string();
+               }
+               // @todo: remove backward compat code and do not send messages without rev id.
                return $this->io->string();
        }
 
@@ -117,23 +126,61 @@ class AvroFormatter implements FormatterInterface {
         * Get the writer for the named channel
         *
         * @var string $channel Name of the schema to fetch
-        * @return \\AvroSchema|null
+        * @return \AvroSchema|null
         */
        protected function getSchema( $channel ) {
                if ( !isset( $this->schemas[$channel] ) ) {
                        return null;
                }
-               if ( !$this->schemas[$channel] instanceof AvroSchema ) {
-                       if ( is_string( $this->schemas[$channel] ) ) {
-                               $this->schemas[$channel] = AvroSchema::parse( $this->schemas[$channel] );
+               $schemaDetails = &$this->schemas[$channel];
+               $schema = null;
+               if ( isset( $schemaDetails['revision'] ) && isset( $schemaDetails['schema'] ) ) {
+                       $schema = &$schemaDetails['schema'];
+               } else {
+                       // @todo: Remove backward compat code
+                       $schema = &$schemaDetails;
+               }
+
+               if ( !$schema instanceof AvroSchema ) {
+                       if ( is_string( $schema ) ) {
+                               $schema = AvroSchema::parse( $schema );
                        } else {
-                               $this->schemas[$channel] = AvroSchema::real_parse(
+                               $schema = AvroSchema::real_parse(
                                        $this->schemas[$channel],
                                        null,
                                        new AvroNamedSchemata()
                                );
                        }
                }
-               return $this->schemas[$channel];
+               return $schema;
+       }
+
+       /**
+        * Get the writer for the named channel
+        *
+        * @var string $channel Name of the schema
+        * @return int|null
+        */
+       public function getSchemaRevisionId( $channel ) {
+               // @todo: remove backward compat code
+               if ( isset( $this->schemas[$channel] )
+                               && is_array( $this->schemas[$channel] )
+                               && isset( $this->schemas[$channel]['revision'] ) ) {
+                       return (int) $this->schemas[$channel]['revision'];
+               }
+               return null;
+       }
+
+
+       /**
+        * convert an integer to a 64bits big endian long (Java compatible)
+        * NOTE: certainly only compatible with PHP 64bits
+        * @param int $id
+        * @return string the binary representation of $id
+        */
+       private function encode_long( $id ) {
+               $high   = ( $id & 0xffffffff00000000 ) >> 32;
+               $low    = $id & 0x00000000ffffffff;
+               return pack( 'NN', $high, $low );
        }
 }
index 59f8ad4..5bcb7d5 100644 (file)
@@ -26,7 +26,7 @@ use DeferredUpdates;
 use Monolog\Handler\BufferHandler as BaseBufferHandler;
 
 /**
- * Updates \\Monolog\\Handler\\BufferHandler to use DeferredUpdates rather
+ * Updates \Monolog\Handler\BufferHandler to use DeferredUpdates rather
  * than register_shutdown_function. On supported platforms this will
  * use register_postsend_function or fastcgi_finish_request() to delay
  * until after the request has shutdown and we are no longer delaying
index 42e7cab..9ec15cb 100644 (file)
@@ -26,12 +26,12 @@ use Monolog\Formatter\NormalizerFormatter;
 /**
  * Log message formatter that mimics the legacy log message formatting of
  * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
- * delegating the formatting to \\MediaWiki\\Logger\\LegacyLogger.
+ * delegating the formatting to \MediaWiki\Logger\LegacyLogger.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
  * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
- * @see \\MediaWiki\\Logger\\LegacyLogger
+ * @see \MediaWiki\Logger\LegacyLogger
  */
 class LegacyFormatter extends NormalizerFormatter {
 
index 0079871..a4bb172 100644 (file)
@@ -41,7 +41,7 @@ use UnexpectedValueException;
  * channel as the prefix value.
  *
  * When not targeting a udp2log stream this class will act as a drop-in
- * replacement for \\Monolog\\Handler\\StreamHandler.
+ * replacement for \Monolog\Handler\StreamHandler.
  *
  * @since 1.25
  * @author Bryan Davis <bd808@wikimedia.org>
index 2e6dbe2..2614b16 100644 (file)
@@ -30,7 +30,7 @@ use Monolog\Logger;
  * Monolog's SyslogUdpHandler creates a partial RFC 5424 header (PRI and
  * VERSION) and relies on the associated formatter to complete the header and
  * message payload. This makes using it with a fixed format formatter like
- * \\Monolog\\Formatter\\LogstashFormatter impossible. Additionally, the
+ * \Monolog\Formatter\LogstashFormatter impossible. Additionally, the
  * direct syslog input for Logstash only handles RFC 3164 syslog packets.
  *
  * This Handler should work with any Formatter. The formatted message will be
diff --git a/includes/deferred/CdnCacheUpdate.php b/includes/deferred/CdnCacheUpdate.php
new file mode 100644 (file)
index 0000000..9f7d8ca
--- /dev/null
@@ -0,0 +1,275 @@
+<?php
+/**
+ * CDN 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
+ */
+
+use Wikimedia\Assert\Assert;
+
+/**
+ * Handles purging appropriate CDN URLs given a title (or titles)
+ * @ingroup Cache
+ */
+class CdnCacheUpdate implements DeferrableUpdate, MergeableUpdate {
+       /** @var string[] Collection of URLs to purge */
+       protected $urls = array();
+
+       /**
+        * @param string[] $urlArr Collection of URLs to purge
+        */
+       public function __construct( array $urlArr ) {
+               $this->urls = $urlArr;
+       }
+
+       public function merge( MergeableUpdate $update ) {
+               /** @var CdnCacheUpdate $update */
+               Assert::parameterType( __CLASS__, $update, '$update' );
+
+               $this->urls = array_merge( $this->urls, $update->urls );
+       }
+
+       /**
+        * Create an update object from an array of Title objects, or a TitleArray object
+        *
+        * @param Traversable|array $titles
+        * @param string[] $urlArr
+        * @return CdnCacheUpdate
+        */
+       public static function newFromTitles( $titles, $urlArr = array() ) {
+               /** @var Title $title */
+               foreach ( $titles as $title ) {
+                       $urlArr = array_merge( $urlArr, $title->getCdnUrls() );
+               }
+
+               return new CdnCacheUpdate( $urlArr );
+       }
+
+       /**
+        * @param Title $title
+        * @return CdnCacheUpdate
+        * @deprecated 1.27
+        */
+       public static function newSimplePurge( Title $title ) {
+               return new CdnCacheUpdate( $title->getCdnUrls() );
+       }
+
+       /**
+        * Purges the list of URLs passed to the constructor.
+        */
+       public function doUpdate() {
+               global $wgCdnReboundPurgeDelay;
+
+               self::purge( $this->urls );
+
+               if ( $wgCdnReboundPurgeDelay > 0 ) {
+                       JobQueueGroup::singleton()->lazyPush( new CdnPurgeJob(
+                               Title::makeTitle( NS_SPECIAL, 'Badtitle/' . __CLASS__ ),
+                               array(
+                                       'urls' => $this->urls,
+                                       'jobReleaseTimestamp' => time() + $wgCdnReboundPurgeDelay
+                               )
+                       ) );
+               }
+       }
+
+       /**
+        * Purges a list of CDN nodes defined in $wgSquidServers.
+        * $urlArr should contain the full URLs to purge as values
+        * (example: $urlArr[] = 'http://my.host/something')
+        *
+        * @param string[] $urlArr List of full URLs to purge
+        */
+       public static function purge( array $urlArr ) {
+               global $wgSquidServers, $wgHTCPRouting;
+
+               if ( !$urlArr ) {
+                       return;
+               }
+
+               // Remove duplicate URLs from list
+               $urlArr = array_unique( $urlArr );
+
+               wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
+
+               if ( $wgHTCPRouting ) {
+                       self::HTCPPurge( $urlArr );
+               }
+
+               if ( $wgSquidServers ) {
+                       // Maximum number of parallel connections per squid
+                       $maxSocketsPerSquid = 8;
+                       // Number of requests to send per socket
+                       // 400 seems to be a good tradeoff, opening a socket takes a while
+                       $urlsPerSocket = 400;
+                       $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
+                       if ( $socketsPerSquid > $maxSocketsPerSquid ) {
+                               $socketsPerSquid = $maxSocketsPerSquid;
+                       }
+
+                       $pool = new SquidPurgeClientPool;
+                       $chunks = array_chunk( $urlArr, ceil( count( $urlArr ) / $socketsPerSquid ) );
+                       foreach ( $wgSquidServers as $server ) {
+                               foreach ( $chunks as $chunk ) {
+                                       $client = new SquidPurgeClient( $server );
+                                       foreach ( $chunk as $url ) {
+                                               $client->queuePurge( $url );
+                                       }
+                                       $pool->addClient( $client );
+                               }
+                       }
+
+                       $pool->run();
+               }
+       }
+
+       /**
+        * Send Hyper Text Caching Protocol (HTCP) CLR requests.
+        *
+        * @throws MWException
+        * @param string[] $urlArr Collection of URLs to purge
+        */
+       private static function HTCPPurge( array $urlArr ) {
+               global $wgHTCPRouting, $wgHTCPMulticastTTL;
+
+               // HTCP CLR operation
+               $htcpOpCLR = 4;
+
+               // @todo FIXME: PHP doesn't support these socket constants (include/linux/in.h)
+               if ( !defined( "IPPROTO_IP" ) ) {
+                       define( "IPPROTO_IP", 0 );
+                       define( "IP_MULTICAST_LOOP", 34 );
+                       define( "IP_MULTICAST_TTL", 33 );
+               }
+
+               // pfsockopen doesn't work because we need set_sock_opt
+               $conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+               if ( !$conn ) {
+                       $errstr = socket_strerror( socket_last_error() );
+                       wfDebugLog( 'squid', __METHOD__ .
+                               ": Error opening UDP socket: $errstr" );
+
+                       return;
+               }
+
+               // Set socket options
+               socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
+               if ( $wgHTCPMulticastTTL != 1 ) {
+                       // Set multicast time to live (hop count) option on socket
+                       socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
+                               $wgHTCPMulticastTTL );
+               }
+
+               // Get sequential trx IDs for packet loss counting
+               $ids = UIDGenerator::newSequentialPerNodeIDs(
+                       'squidhtcppurge', 32, count( $urlArr ), UIDGenerator::QUICK_VOLATILE
+               );
+
+               foreach ( $urlArr as $url ) {
+                       if ( !is_string( $url ) ) {
+                               throw new MWException( 'Bad purge URL' );
+                       }
+                       $url = self::expand( $url );
+                       $conf = self::getRuleForURL( $url, $wgHTCPRouting );
+                       if ( !$conf ) {
+                               wfDebugLog( 'squid', __METHOD__ .
+                                       "No HTCP rule configured for URL {$url} , skipping" );
+                               continue;
+                       }
+
+                       if ( isset( $conf['host'] ) && isset( $conf['port'] ) ) {
+                               // Normalize single entries
+                               $conf = array( $conf );
+                       }
+                       foreach ( $conf as $subconf ) {
+                               if ( !isset( $subconf['host'] ) || !isset( $subconf['port'] ) ) {
+                                       throw new MWException( "Invalid HTCP rule for URL $url\n" );
+                               }
+                       }
+
+                       // Construct a minimal HTCP request diagram
+                       // as per RFC 2756
+                       // Opcode 'CLR', no response desired, no auth
+                       $htcpTransID = current( $ids );
+                       next( $ids );
+
+                       $htcpSpecifier = pack( 'na4na*na8n',
+                               4, 'HEAD', strlen( $url ), $url,
+                               8, 'HTTP/1.0', 0 );
+
+                       $htcpDataLen = 8 + 2 + strlen( $htcpSpecifier );
+                       $htcpLen = 4 + $htcpDataLen + 2;
+
+                       // Note! Squid gets the bit order of the first
+                       // word wrong, wrt the RFC. Apparently no other
+                       // implementation exists, so adapt to Squid
+                       $htcpPacket = pack( 'nxxnCxNxxa*n',
+                               $htcpLen, $htcpDataLen, $htcpOpCLR,
+                               $htcpTransID, $htcpSpecifier, 2 );
+
+                       wfDebugLog( 'squid', __METHOD__ .
+                               "Purging URL $url via HTCP" );
+                       foreach ( $conf as $subconf ) {
+                               socket_sendto( $conn, $htcpPacket, $htcpLen, 0,
+                                       $subconf['host'], $subconf['port'] );
+                       }
+               }
+       }
+
+       /**
+        * Expand local URLs to fully-qualified URLs using the internal protocol
+        * and host defined in $wgInternalServer. Input that's already fully-
+        * qualified will be passed through unchanged.
+        *
+        * This is used to generate purge URLs that may be either local to the
+        * main wiki or include a non-native host, such as images hosted on a
+        * second internal server.
+        *
+        * Client functions should not need to call this.
+        *
+        * @param string $url
+        * @return string
+        */
+       public static function expand( $url ) {
+               return wfExpandUrl( $url, PROTO_INTERNAL );
+       }
+
+       /**
+        * Find the HTCP routing rule to use for a given URL.
+        * @param string $url URL to match
+        * @param array $rules Array of rules, see $wgHTCPRouting for format and behavior
+        * @return mixed Element of $rules that matched, or false if nothing matched
+        */
+       private static function getRuleForURL( $url, $rules ) {
+               foreach ( $rules as $regex => $routing ) {
+                       if ( $regex === '' || preg_match( $regex, $url ) ) {
+                               return $routing;
+                       }
+               }
+
+               return false;
+       }
+}
+
+/**
+ * @deprecated since 1.27
+ */
+class SquidUpdate extends CdnCacheUpdate {
+       // Keep class name for b/c
+}
diff --git a/includes/deferred/DeferrableUpdate.php b/includes/deferred/DeferrableUpdate.php
new file mode 100644 (file)
index 0000000..5f4d821
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * Interface that deferrable updates should implement. Basically required so we
+ * can validate input on DeferredUpdates::addUpdate()
+ *
+ * @since 1.19
+ */
+interface DeferrableUpdate {
+       /**
+        * Perform the actual work
+        */
+       function doUpdate();
+}
index 0194a61..fb6ef13 100644 (file)
  * @file
  */
 
-/**
- * Interface that deferrable updates should implement. Basically required so we
- * can validate input on DeferredUpdates::addUpdate()
- *
- * @since 1.19
- */
-interface DeferrableUpdate {
-       /**
-        * Perform the actual work
-        */
-       function doUpdate();
-}
-
 /**
  * Class for managing the deferred updates
  *
- * Deferred updates can be run at the end of the request,
- * after the HTTP response has been sent. In CLI mode, updates
- * are only deferred until there is no local master DB transaction.
- * When updates are deferred, they go into a simple FIFO queue.
+ * In web request mode, deferred updates can be run at the end of the request, either before or
+ * after the HTTP response has been sent. In either case, they run after the DB commit step. If
+ * an update runs after the response is sent, it will not block clients. If sent before, it will
+ * run synchronously. If such an update works via queueing, it will be more likely to complete by
+ * the time the client makes their next request after this one.
+ *
+ * In CLI mode, updates are only deferred until the current wiki has no DB write transaction
+ * active within this request.
+ *
+ * When updates are deferred, they use a FIFO queue (one for pre-send and one for post-send).
  *
  * @since 1.19
  */
 class DeferredUpdates {
-       /** @var DeferrableUpdate[] Updates to be deferred until the end of the request */
-       private static $updates = array();
-       /** @var bool Defer updates fully even in CLI mode */
-       private static $forceDeferral = false;
+       /** @var DeferrableUpdate[] Updates to be deferred until before request end */
+       private static $preSendUpdates = array();
+       /** @var DeferrableUpdate[] Updates to be deferred until after request end */
+       private static $postSendUpdates = array();
+
+       const ALL = 0; // all updates
+       const PRESEND = 1; // for updates that should run before flushing output buffer
+       const POSTSEND = 2; // for updates that should run after flushing output buffer
 
        /**
         * Add an update to the deferred list
+        *
         * @param DeferrableUpdate $update Some object that implements doUpdate()
+        * @param integer $type DeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)
+        */
+       public static function addUpdate( DeferrableUpdate $update, $type = self::POSTSEND ) {
+               if ( $type === self::PRESEND ) {
+                       self::push( self::$preSendUpdates, $update );
+               } else {
+                       self::push( self::$postSendUpdates, $update );
+               }
+       }
+
+       /**
+        * Add a callable update.  In a lot of cases, we just need a callback/closure,
+        * defining a new DeferrableUpdate object is not necessary
+        *
+        * @see MWCallableUpdate::__construct()
+        *
+        * @param callable $callable
+        * @param integer $type DeferredUpdates constant (PRESEND or POSTSEND) (since 1.27)
+        */
+       public static function addCallableUpdate( $callable, $type = self::POSTSEND ) {
+               self::addUpdate( new MWCallableUpdate( $callable ), $type );
+       }
+
+       /**
+        * Do any deferred updates and clear the list
+        *
+        * @param string $mode Use "enqueue" to use the job queue when possible [Default: "run"]
+        * @param integer $type DeferredUpdates constant (PRESEND, POSTSEND, or ALL) (since 1.27)
         */
-       public static function addUpdate( DeferrableUpdate $update ) {
+       public static function doUpdates( $mode = 'run', $type = self::ALL ) {
+               if ( $type === self::ALL || $type == self::PRESEND ) {
+                       self::execute( self::$preSendUpdates, $mode );
+               }
+
+               if ( $type === self::ALL || $type == self::POSTSEND ) {
+                       self::execute( self::$postSendUpdates, $mode );
+               }
+       }
+
+       private static function push( array &$queue, DeferrableUpdate $update ) {
                global $wgCommandLineMode;
 
-               array_push( self::$updates, $update );
-               if ( self::$forceDeferral ) {
-                       return;
+               if ( $update instanceof MergeableUpdate ) {
+                       $class = get_class( $update ); // fully-qualified class
+                       if ( isset( $queue[$class] ) ) {
+                               /** @var $existingUpdate MergeableUpdate */
+                               $existingUpdate = $queue[$class];
+                               $existingUpdate->merge( $update );
+                       } else {
+                               $queue[$class] = $update;
+                       }
+               } else {
+                       $queue[] = $update;
                }
 
                // CLI scripts may forget to periodically flush these updates,
-               // so try to handle that rather than OOMing and losing them.
-               // Try to run the updates as soon as there is no local transaction.
+               // so try to handle that rather than OOMing and losing them entirely.
+               // Try to run the updates as soon as there is no current wiki transaction.
                static $waitingOnTrx = false; // de-duplicate callback
                if ( $wgCommandLineMode && !$waitingOnTrx ) {
                        $lb = wfGetLB();
@@ -81,34 +125,12 @@ class DeferredUpdates {
                }
        }
 
-       /**
-        * Add a callable update.  In a lot of cases, we just need a callback/closure,
-        * defining a new DeferrableUpdate object is not necessary
-        * @see MWCallableUpdate::__construct()
-        * @param callable $callable
-        */
-       public static function addCallableUpdate( $callable ) {
-               self::addUpdate( new MWCallableUpdate( $callable ) );
-       }
-
-       /**
-        * Do any deferred updates and clear the list
-        *
-        * @param string $mode Use "enqueue" to use the job queue when possible [Default: run]
-        *   prevent lock contention
-        * @param string $oldMode Unused
-        */
-       public static function doUpdates( $mode = 'run', $oldMode = '' ) {
-               // B/C for ( $commit, $mode ) args
-               $mode = $oldMode ?: $mode;
-               if ( $mode === 'commit' ) {
-                       $mode = 'run';
-               }
-
-               $updates = self::$updates;
+       public static function execute( array &$queue, $mode ) {
+               $updates = $queue; // snapshot of queue
 
+               // Keep doing rounds of updates until none get enqueued
                while ( count( $updates ) ) {
-                       self::clearPendingUpdates();
+                       $queue = array(); // clear the queue
                        /** @var DataUpdate[] $dataUpdates */
                        $dataUpdates = array();
                        /** @var DeferrableUpdate[] $otherUpdates */
@@ -130,15 +152,17 @@ class DeferredUpdates {
                                        wfGetLBFactory()->commitMasterChanges();
                                } catch ( Exception $e ) {
                                        // We don't want exceptions thrown during deferred updates to
-                                       // be reported to the user since the output is already sent.
-                                       // Instead we just log them.
+                                       // be reported to the user since the output is already sent
                                        if ( !$e instanceof ErrorPageError ) {
                                                MWExceptionHandler::logException( $e );
                                        }
+                                       // Make sure incomplete transactions are not committed and end any
+                                       // open atomic sections so that other DB updates have a chance to run
+                                       wfGetLBFactory()->rollbackMasterChanges();
                                }
                        }
 
-                       $updates = self::$updates;
+                       $updates = $queue; // new snapshot of queue (check for new entries)
                }
        }
 
@@ -147,15 +171,7 @@ class DeferredUpdates {
         * want or need to call this. Unit tests need it though.
         */
        public static function clearPendingUpdates() {
-               self::$updates = array();
-       }
-
-       /**
-        * @note This method is intended for testing purposes
-        * @param bool $value Whether to *always* defer updates, even in CLI mode
-        * @since 1.27
-        */
-       public static function forceDeferral( $value ) {
-               self::$forceDeferral = $value;
+               self::$preSendUpdates = array();
+               self::$postSendUpdates = array();
        }
 }
index a480aec..db3790f 100644 (file)
@@ -43,24 +43,8 @@ class HTMLCacheUpdate implements DeferrableUpdate {
        }
 
        public function doUpdate() {
-               $job = new HTMLCacheUpdateJob(
-                       $this->mTitle,
-                       array(
-                               'table' => $this->mTable,
-                               'recursive' => true
-                       ) + Job::newRootJobParams( // "overall" refresh links job info
-                               "htmlCacheUpdate:{$this->mTable}:{$this->mTitle->getPrefixedText()}"
-                       )
-               );
+               $job = HTMLCacheUpdateJob::newForBacklinks( $this->mTitle, $this->mTable );
 
-               $count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 100 );
-               if ( $count >= 100 ) { // many backlinks
-                       JobQueueGroup::singleton()->lazyPush( $job );
-               } else { // few backlinks ($count might be off even if 0)
-                       $dbw = wfGetDB( DB_MASTER );
-                       $dbw->onTransactionIdle( function () use ( $job ) {
-                               $job->run(); // just do the purge query now
-                       } );
-               }
+               JobQueueGroup::singleton()->lazyPush( $job );
        }
 }
index 242a1a5..3021af1 100644 (file)
@@ -61,9 +61,6 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        /** @var bool Whether to queue jobs for recursive updates */
        public $mRecursive;
 
-       /** @var bool Whether this job was triggered by a recursive update job */
-       private $mTriggeredRecursive;
-
        /** @var Revision Revision for which this update has been triggered */
        private $mRevision;
 
@@ -77,6 +74,11 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
         */
        private $linkDeletions = null;
 
+       /**
+        * @var User|null
+        */
+       private $user;
+
        /**
         * Constructor
         *
@@ -89,7 +91,7 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                parent::__construct( false ); // no implicit transaction
 
                $this->mTitle = $title;
-               $this->mId = $title->getArticleID();
+               $this->mId = $title->getArticleID( Title::GAID_FOR_UPDATE );
 
                if ( !$this->mId ) {
                        throw new InvalidArgumentException(
@@ -140,12 +142,14 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        public function doUpdate() {
                Hooks::run( 'LinksUpdate', array( &$this ) );
                $this->doIncrementalUpdate();
-               Hooks::run( 'LinksUpdateComplete', array( &$this ) );
+
+               $that = $this;
+               $this->mDb->onTransactionIdle( function() use ( $that ) {
+                       Hooks::run( 'LinksUpdateComplete', array( &$that ) );
+               } );
        }
 
        protected function doIncrementalUpdate() {
-               global $wgRCWatchCategoryMembership;
-
                # Page links
                $existing = $this->getExistingLinks();
                $this->linkDeletions = $this->getLinkDeletions( $existing );
@@ -197,14 +201,6 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                $this->invalidateCategories( $categoryUpdates );
                $this->updateCategoryCounts( $categoryInserts, $categoryDeletes );
 
-               # Category membership changes
-               if (
-                       $wgRCWatchCategoryMembership &&
-                       !$this->mTriggeredRecursive && ( $categoryInserts || $categoryDeletes )
-               ) {
-                       $this->triggerCategoryChanges( $categoryInserts, $categoryDeletes );
-               }
-
                # Page properties
                $existing = $this->getExistingProperties();
 
@@ -228,24 +224,6 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
 
        }
 
-       private function triggerCategoryChanges( $categoryInserts, $categoryDeletes ) {
-               $catMembChange = new CategoryMembershipChange( $this->mTitle, $this->mRevision );
-
-               if ( $this->mRecursive ) {
-                       $catMembChange->checkTemplateLinks();
-               }
-
-               foreach ( $categoryInserts as $categoryName => $value ) {
-                       $categoryTitle = Title::newFromText( $categoryName, NS_CATEGORY );
-                       $catMembChange->triggerCategoryAddedNotification( $categoryTitle );
-               }
-
-               foreach ( $categoryDeletes as $categoryName => $value ) {
-                       $categoryTitle = Title::newFromText( $categoryName, NS_CATEGORY );
-                       $catMembChange->triggerCategoryRemovedNotification( $categoryTitle );
-               }
-       }
-
        /**
         * Queue recursive jobs for this page
         *
@@ -267,7 +245,7 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                // Which ever runs first generally no-ops the other one.
                $jobs = array();
                foreach ( $bc->getCascadeProtectedLinks() as $title ) {
-                       $jobs[] = new RefreshLinksJob( $title, array( 'prioritize' => true ) );
+                       $jobs[] = RefreshLinksJob::newPrioritized( $title, array() );
                }
                JobQueueGroup::singleton()->push( $jobs );
        }
@@ -888,23 +866,32 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        }
 
        /**
-        * Set this object as being triggered by a recursive LinksUpdate
+        * Set the revision corresponding to this LinksUpdate
         *
         * @since 1.27
+        *
+        * @param Revision $revision
         */
-       public function setTriggeredRecursive() {
-               $this->mTriggeredRecursive = true;
+       public function setRevision( Revision $revision ) {
+               $this->mRevision = $revision;
        }
 
        /**
-        * Set the revision corresponding to this LinksUpdate
+        * Set the User who triggered this LinksUpdate
         *
         * @since 1.27
-        *
-        * @param Revision $revision
+        * @param User $user
         */
-       public function setRevision( Revision $revision ) {
-               $this->mRevision = $revision;
+       public function setTriggeringUser( User $user ) {
+               $this->user = $user;
+       }
+
+       /**
+        * @since 1.27
+        * @return null|User
+        */
+       public function getTriggeringUser() {
+               return $this->user;
        }
 
        /**
@@ -921,8 +908,7 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
                                        $inv = array( $inv );
                                }
                                foreach ( $inv as $table ) {
-                                       $update = new HTMLCacheUpdate( $this->mTitle, $table );
-                                       $update->doUpdate();
+                                       DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->mTitle, $table ) );
                                }
                        }
                }
@@ -980,15 +966,31 @@ class LinksUpdate extends SqlDataUpdate implements EnqueueableDataUpdate {
        }
 
        public function getAsJobSpecification() {
+               if ( $this->user ) {
+                       $userInfo = array(
+                               'userId' => $this->user->getId(),
+                               'userName' => $this->user->getName(),
+                       );
+               } else {
+                       $userInfo = false;
+               }
+
+               if ( $this->mRevision ) {
+                       $triggeringRevisionId = $this->mRevision->getId();
+               } else {
+                       $triggeringRevisionId = false;
+               }
+
                return array(
                        'wiki' => $this->mDb->getWikiID(),
                        'job'  => new JobSpecification(
                                'refreshLinksPrioritized',
                                array(
-                                       'prioritize' => true,
                                        // Reuse the parser cache if it was saved
                                        'rootJobTimestamp' => $this->mParserOutput->getCacheTime(),
-                                       'useRecursiveLinksUpdate' => $this->mRecursive
+                                       'useRecursiveLinksUpdate' => $this->mRecursive,
+                                       'triggeringUser' => $userInfo,
+                                       'triggeringRevisionId' => $triggeringRevisionId,
                                ),
                                array( 'removeDuplicates' => true ),
                                $this->getTitle()
diff --git a/includes/deferred/MergeableUpdate.php b/includes/deferred/MergeableUpdate.php
new file mode 100644 (file)
index 0000000..70760ce
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * Interface that deferrable updates can implement. DeferredUpdates uses this to merge
+ * all pending updates of PHP class into a single update by calling merge().
+ *
+ * @since 1.27
+ */
+interface MergeableUpdate {
+       /**
+        * Merge this update with $update
+        *
+        * @param MergeableUpdate $update Update of the same class type
+        */
+       function merge( MergeableUpdate $update );
+}
index 6ed1d00..2abf028 100644 (file)
@@ -38,6 +38,9 @@ class SearchUpdate implements DeferrableUpdate {
        /** @var Content|bool Content of the page (not text) */
        private $content;
 
+       /** @var WikiPage **/
+       private $page;
+
        /**
         * Constructor
         *
@@ -78,18 +81,15 @@ class SearchUpdate implements DeferrableUpdate {
                        return;
                }
 
-               $page = WikiPage::newFromID( $this->id, WikiPage::READ_LATEST );
-
                foreach ( SearchEngine::getSearchTypes() as $type ) {
                        $search = SearchEngine::create( $type );
-                       $indexTitle = $this->indexTitle( $search );
                        if ( !$search->supports( 'search-update' ) ) {
                                continue;
                        }
 
-                       $normalTitle = $search->normalizeText( $indexTitle );
+                       $normalTitle = $this->getNormalizedTitle( $search );
 
-                       if ( $page === null ) {
+                       if ( $this->getLatestPage() === null ) {
                                $search->delete( $this->id, $normalTitle );
                                continue;
                        } elseif ( $this->content === false ) {
@@ -174,13 +174,30 @@ class SearchUpdate implements DeferrableUpdate {
        }
 
        /**
-        * Get a string representation of a title suitable for
+        * Get WikiPage for the SearchUpdate $id using WikiPage::READ_LATEST
+        * and ensure using the same WikiPage object if there are multiple
+        * SearchEngine types.
+        *
+        * Returns null if a page has been deleted or is not found.
+        *
+        * @return WikiPage|null
+        */
+       private function getLatestPage() {
+               if ( !isset( $this->page ) ) {
+                       $this->page = WikiPage::newFromID( $this->id, WikiPage::READ_LATEST );
+               }
+
+               return $this->page;
+       }
+
+       /**
+        * Get a normalized string representation of a title suitable for
         * including in a search index
         *
         * @param SearchEngine $search
         * @return string A stripped-down title string ready for the search index
         */
-       private function indexTitle( SearchEngine $search ) {
+       private function getNormalizedTitle( SearchEngine $search ) {
                global $wgContLang;
 
                $ns = $this->title->getNamespace();
@@ -200,6 +217,7 @@ class SearchUpdate implements DeferrableUpdate {
                if ( $ns == NS_FILE ) {
                        $t = preg_replace( "/ (png|gif|jpg|jpeg|ogg)$/", "", $t );
                }
-               return trim( $t );
+
+               return $search->normalizeText( trim( $t ) );
        }
 }
index d135a80..73de755 100644 (file)
@@ -207,8 +207,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @param int $delta Delta (positive or negative)
         */
        protected function adjustPending( $type, $delta ) {
-               global $wgMemc;
-
+               $cache = ObjectCache::getMainStashInstance();
                if ( $delta < 0 ) { // decrement
                        $key = $this->getTypeCacheKey( $type, '-' );
                } else { // increment
@@ -216,11 +215,7 @@ class SiteStatsUpdate implements DeferrableUpdate {
                }
 
                $magnitude = abs( $delta );
-               if ( !$wgMemc->incr( $key, $magnitude ) ) { // not there?
-                       if ( !$wgMemc->add( $key, $magnitude ) ) { // race?
-                               $wgMemc->incr( $key, $magnitude );
-                       }
-               }
+               $cache->incrWithInit( $key, 0, $magnitude, $magnitude );
        }
 
        /**
@@ -228,15 +223,16 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @return array Positive and negative deltas for each type
         */
        protected function getPendingDeltas() {
-               global $wgMemc;
+               $cache = ObjectCache::getMainStashInstance();
 
                $pending = array();
                foreach ( array( '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, '-' ) );
+                       $flg = BagOStuff::READ_LATEST;
+                       $pending[$type]['+'] = (int)$cache->get( $this->getTypeCacheKey( $type, '+' ), $flg );
+                       $pending[$type]['-'] = (int)$cache->get( $this->getTypeCacheKey( $type, '-' ), $flg );
                }
 
                return $pending;
@@ -247,12 +243,12 @@ class SiteStatsUpdate implements DeferrableUpdate {
         * @param array $pd Result of getPendingDeltas(), used for DB update
         */
        protected function removePendingDeltas( array $pd ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainStashInstance();
 
                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 );
+                               $cache->decr( $this->getTypeCacheKey( $type, $sign ), $magnitude );
                        }
                }
        }
diff --git a/includes/deferred/SquidUpdate.php b/includes/deferred/SquidUpdate.php
deleted file mode 100644 (file)
index 0e4161c..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-/**
- * 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
- */
-
-/**
- * Handles purging appropriate Squid URLs given a title (or titles)
- * @ingroup Cache
- */
-class SquidUpdate implements DeferrableUpdate {
-       /** @var string[] Collection of URLs to purge */
-       protected $urls = array();
-
-       /**
-        * @param array $urlArr Collection of URLs to purge
-        */
-       public function __construct( array $urlArr ) {
-               // Remove duplicate URLs from list
-               $this->urls = array_unique( $urlArr );
-       }
-
-       /**
-        * Create a SquidUpdate from an array of Title objects, or a TitleArray object
-        *
-        * @param Traversable|array $titles
-        * @param array $urlArr
-        * @return SquidUpdate
-        */
-       public static function newFromTitles( $titles, $urlArr = array() ) {
-               /** @var Title $title */
-               foreach ( $titles as $title ) {
-                       $urlArr[] = $title->getInternalURL();
-               }
-
-               return new SquidUpdate( $urlArr );
-       }
-
-       /**
-        * @param Title $title
-        * @return SquidUpdate
-        * @deprecated 1.27
-        */
-       public static function newSimplePurge( Title $title ) {
-               $urlArr = $title->getSquidURLs();
-
-               return new SquidUpdate( $urlArr );
-       }
-
-       /**
-        * Purges the list of URLs passed to the constructor.
-        */
-       public function doUpdate() {
-               self::purge( $this->urls );
-       }
-
-       /**
-        * Purges a list of Squids defined in $wgSquidServers.
-        * $urlArr should contain the full URLs to purge as values
-        * (example: $urlArr[] = 'http://my.host/something')
-        * XXX report broken Squids per mail or log
-        *
-        * @param array $urlArr List of full URLs to purge
-        */
-       public static function purge( array $urlArr ) {
-               global $wgSquidServers, $wgHTCPRouting;
-
-               if ( !$urlArr ) {
-                       return;
-               }
-
-               wfDebugLog( 'squid', __METHOD__ . ': ' . implode( ' ', $urlArr ) );
-
-               if ( $wgHTCPRouting ) {
-                       self::HTCPPurge( $urlArr );
-               }
-
-               if ( $wgSquidServers ) {
-                       // Remove duplicate URLs
-                       $urlArr = array_unique( $urlArr );
-                       // Maximum number of parallel connections per squid
-                       $maxSocketsPerSquid = 8;
-                       // Number of requests to send per socket
-                       // 400 seems to be a good tradeoff, opening a socket takes a while
-                       $urlsPerSocket = 400;
-                       $socketsPerSquid = ceil( count( $urlArr ) / $urlsPerSocket );
-                       if ( $socketsPerSquid > $maxSocketsPerSquid ) {
-                               $socketsPerSquid = $maxSocketsPerSquid;
-                       }
-
-                       $pool = new SquidPurgeClientPool;
-                       $chunks = array_chunk( $urlArr, ceil( count( $urlArr ) / $socketsPerSquid ) );
-                       foreach ( $wgSquidServers as $server ) {
-                               foreach ( $chunks as $chunk ) {
-                                       $client = new SquidPurgeClient( $server );
-                                       foreach ( $chunk as $url ) {
-                                               $client->queuePurge( $url );
-                                       }
-                                       $pool->addClient( $client );
-                               }
-                       }
-
-                       $pool->run();
-               }
-       }
-
-       /**
-        * Send Hyper Text Caching Protocol (HTCP) CLR requests.
-        *
-        * @throws MWException
-        * @param array $urlArr Collection of URLs to purge
-        */
-       protected static function HTCPPurge( $urlArr ) {
-               global $wgHTCPRouting, $wgHTCPMulticastTTL;
-
-               // HTCP CLR operation
-               $htcpOpCLR = 4;
-
-               // @todo FIXME: PHP doesn't support these socket constants (include/linux/in.h)
-               if ( !defined( "IPPROTO_IP" ) ) {
-                       define( "IPPROTO_IP", 0 );
-                       define( "IP_MULTICAST_LOOP", 34 );
-                       define( "IP_MULTICAST_TTL", 33 );
-               }
-
-               // pfsockopen doesn't work because we need set_sock_opt
-               $conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-               if ( !$conn ) {
-                       $errstr = socket_strerror( socket_last_error() );
-                       wfDebugLog( 'squid', __METHOD__ .
-                               ": Error opening UDP socket: $errstr" );
-
-                       return;
-               }
-
-               // Set socket options
-               socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_LOOP, 0 );
-               if ( $wgHTCPMulticastTTL != 1 ) {
-                       // Set multicast time to live (hop count) option on socket
-                       socket_set_option( $conn, IPPROTO_IP, IP_MULTICAST_TTL,
-                               $wgHTCPMulticastTTL );
-               }
-
-               // Remove duplicate URLs from collection
-               $urlArr = array_unique( $urlArr );
-               // Get sequential trx IDs for packet loss counting
-               $ids = UIDGenerator::newSequentialPerNodeIDs(
-                       'squidhtcppurge', 32, count( $urlArr ), UIDGenerator::QUICK_VOLATILE
-               );
-
-               foreach ( $urlArr as $url ) {
-                       if ( !is_string( $url ) ) {
-                               throw new MWException( 'Bad purge URL' );
-                       }
-                       $url = self::expand( $url );
-                       $conf = self::getRuleForURL( $url, $wgHTCPRouting );
-                       if ( !$conf ) {
-                               wfDebugLog( 'squid', __METHOD__ .
-                                       "No HTCP rule configured for URL {$url} , skipping" );
-                               continue;
-                       }
-
-                       if ( isset( $conf['host'] ) && isset( $conf['port'] ) ) {
-                               // Normalize single entries
-                               $conf = array( $conf );
-                       }
-                       foreach ( $conf as $subconf ) {
-                               if ( !isset( $subconf['host'] ) || !isset( $subconf['port'] ) ) {
-                                       throw new MWException( "Invalid HTCP rule for URL $url\n" );
-                               }
-                       }
-
-                       // Construct a minimal HTCP request diagram
-                       // as per RFC 2756
-                       // Opcode 'CLR', no response desired, no auth
-                       $htcpTransID = current( $ids );
-                       next( $ids );
-
-                       $htcpSpecifier = pack( 'na4na*na8n',
-                               4, 'HEAD', strlen( $url ), $url,
-                               8, 'HTTP/1.0', 0 );
-
-                       $htcpDataLen = 8 + 2 + strlen( $htcpSpecifier );
-                       $htcpLen = 4 + $htcpDataLen + 2;
-
-                       // Note! Squid gets the bit order of the first
-                       // word wrong, wrt the RFC. Apparently no other
-                       // implementation exists, so adapt to Squid
-                       $htcpPacket = pack( 'nxxnCxNxxa*n',
-                               $htcpLen, $htcpDataLen, $htcpOpCLR,
-                               $htcpTransID, $htcpSpecifier, 2 );
-
-                       wfDebugLog( 'squid', __METHOD__ .
-                               "Purging URL $url via HTCP" );
-                       foreach ( $conf as $subconf ) {
-                               socket_sendto( $conn, $htcpPacket, $htcpLen, 0,
-                                       $subconf['host'], $subconf['port'] );
-                       }
-               }
-       }
-
-       /**
-        * Expand local URLs to fully-qualified URLs using the internal protocol
-        * and host defined in $wgInternalServer. Input that's already fully-
-        * qualified will be passed through unchanged.
-        *
-        * This is used to generate purge URLs that may be either local to the
-        * main wiki or include a non-native host, such as images hosted on a
-        * second internal server.
-        *
-        * Client functions should not need to call this.
-        *
-        * @param string $url
-        * @return string
-        */
-       public static function expand( $url ) {
-               return wfExpandUrl( $url, PROTO_INTERNAL );
-       }
-
-       /**
-        * Find the HTCP routing rule to use for a given URL.
-        * @param string $url URL to match
-        * @param array $rules Array of rules, see $wgHTCPRouting for format and behavior
-        * @return mixed Element of $rules that matched, or false if nothing matched
-        */
-       private static function getRuleForURL( $url, $rules ) {
-               foreach ( $rules as $regex => $routing ) {
-                       if ( $regex === '' || preg_match( $regex, $url ) ) {
-                               return $routing;
-                       }
-               }
-
-               return false;
-       }
-}
index 14810da..7401992 100644 (file)
@@ -296,9 +296,9 @@ class DiffEngine {
                        $this->xchanged = $this->ychanged = array();
                        $this->xv = $this->yv = array();
                        $this->xind = $this->yind = array();
-                       unset( $this->seq );
-                       unset( $this->in_seq );
-                       unset( $this->lcs );
+                       $this->seq = array();
+                       $this->in_seq = array();
+                       $this->lcs = 0;
 
                        // Skip leading common lines.
                        for ( $skip = 0; $skip < $n_from && $skip < $n_to; $skip++ ) {
@@ -324,7 +324,8 @@ class DiffEngine {
 
                        for ( $yi = $skip; $yi < $n_to - $endskip; $yi++ ) {
                                $line = $to_lines[$yi];
-                               if ( ( $this->ychanged[$yi] = empty( $xhash[$this->lineHash( $line )] ) ) ) {
+                               $this->ychanged[$yi] = empty( $xhash[$this->lineHash( $line )] );
+                               if ( $this->ychanged[$yi] ) {
                                        continue;
                                }
                                $yhash[$this->lineHash( $line )] = 1;
@@ -333,7 +334,8 @@ class DiffEngine {
                        }
                        for ( $xi = $skip; $xi < $n_from - $endskip; $xi++ ) {
                                $line = $from_lines[$xi];
-                               if ( ( $this->xchanged[$xi] = empty( $yhash[$this->lineHash( $line )] ) ) ) {
+                               $this->xchanged[$xi] = empty( $yhash[$this->lineHash( $line )] );
+                               if ( $this->xchanged[$xi] ) {
                                        continue;
                                }
                                $this->xv[] = $line;
index ae610fa..93f0f6c 100644 (file)
@@ -388,7 +388,8 @@ class DifferenceEngine extends ContextSource {
                $rdel = $this->revisionDeleteLink( $this->mNewRev );
 
                # Allow extensions to define their own revision tools
-               Hooks::run( 'DiffRevisionTools', array( $this->mNewRev, &$revisionTools, $this->mOldRev ) );
+               Hooks::run( 'DiffRevisionTools',
+                       array( $this->mNewRev, &$revisionTools, $this->mOldRev, $user ) );
                $formattedRevisionTools = array();
                // Put each one in parentheses (poor man's button)
                foreach ( $revisionTools as $key => $tool ) {
index 4737f08..be38e87 100644 (file)
@@ -204,10 +204,12 @@ class TableDiffFormatter extends DiffFormatter {
                # Notice that WordLevelDiff returns HTML-escaped output.
                # Hence, we will be calling addedLine/deletedLine without HTML-escaping.
 
-               while ( $line = array_shift( $del ) ) {
+               $line = array_shift( $del );
+               while ( $line ) {
                        $aline = array_shift( $add );
                        echo '<tr>' . $this->deletedLine( $line ) .
                                $this->addedLine( $aline ) . "</tr>\n";
+                       $line = array_shift( $del );
                }
                foreach ( $add as $line ) { # If any leftovers
                        echo '<tr>' . $this->emptyLine() .
index 3631a34..6366c74 100644 (file)
@@ -44,7 +44,7 @@ class ErrorPageError extends MWException {
                // passing to the parent constructor. Our overridden report() below
                // makes sure that the page shown to the user is not forced to English.
                if ( $msg instanceof Message ) {
-                       $enMsg = clone( $msg );
+                       $enMsg = clone $msg;
                } else {
                        $enMsg = wfMessage( $msg, $params );
                }
index 5734902..26960ff 100644 (file)
@@ -197,6 +197,7 @@ class MWExceptionHandler {
         * @param string $message
         * @param string $file
         * @param int $line
+        * @return bool
         *
         * @see logError()
         */
@@ -369,6 +370,7 @@ TXT;
        public static function prettyPrintTrace( array $trace, $pad = '' ) {
                $text = '';
 
+               $level = 0;
                foreach ( $trace as $level => $frame ) {
                        if ( isset( $frame['file'] ) && isset( $frame['line'] ) ) {
                                $text .= "{$pad}#{$level} {$frame['file']}({$frame['line']}): ";
index 89ac734..c3c5dcb 100644 (file)
@@ -78,7 +78,7 @@ class ExternalStoreMwstore extends ExternalStoreMedium {
                $be = FileBackendGroup::singleton()->get( $backend );
                if ( $be instanceof FileBackend ) {
                        // Get three random base 36 characters to act as shard directories
-                       $rand = wfBaseConvert( mt_rand( 0, 46655 ), 10, 36, 3 );
+                       $rand = Wikimedia\base_convert( mt_rand( 0, 46655 ), 10, 36, 3 );
                        // Make sure ID is roughly lexicographically increasing for performance
                        $id = str_pad( UIDGenerator::newTimestampedUID128( 32 ), 26, '0', STR_PAD_LEFT );
                        // Segregate items by wiki ID for the sake of bookkeeping
index 213bb87..2604c88 100644 (file)
@@ -208,7 +208,7 @@ class FSFile {
                MediaWiki\restoreWarnings();
 
                if ( $this->sha1Base36 !== false ) {
-                       $this->sha1Base36 = wfBaseConvert( $this->sha1Base36, 16, 36, 31 );
+                       $this->sha1Base36 = Wikimedia\base_convert( $this->sha1Base36, 16, 36, 31 );
                }
 
                return $this->sha1Base36;
index cd82ab1..8d76e96 100644 (file)
@@ -375,11 +375,6 @@ abstract class FileBackend {
                if ( empty( $opts['force'] ) ) { // sanity
                        unset( $opts['nonLocking'] );
                }
-               foreach ( $ops as &$op ) {
-                       if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
-                               $op['headers']['Content-Disposition'] = $op['disposition'];
-                       }
-               }
                /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
                return $this->doOperationsInternal( $ops, $opts );
@@ -611,9 +606,6 @@ abstract class FileBackend {
                }
                foreach ( $ops as &$op ) {
                        $op['overwrite'] = true; // avoids RTTs in key/value stores
-                       if ( isset( $op['disposition'] ) ) { // b/c (MW 1.20)
-                               $op['headers']['Content-Disposition'] = $op['disposition'];
-                       }
                }
                /** @noinspection PhpUnusedLocalVariableInspection */
                $scope = $this->getScopedPHPBehaviorForOps(); // try to ignore client aborts
index b6ddbad..c043106 100644 (file)
@@ -166,6 +166,7 @@ class FileBackendGroup {
                                ? FileJournal::factory( $config['fileJournal'], $name )
                                : FileJournal::factory( array( 'class' => 'NullFileJournal' ), $name );
                        $config['wanCache'] = ObjectCache::getMainWANInstance();
+                       $config['mimeCallback'] = array( $this, 'guessMimeInternal' );
 
                        $this->backends[$name]['instance'] = new $class( $config );
                }
@@ -203,4 +204,27 @@ class FileBackendGroup {
 
                return null;
        }
+
+       /**
+        * @param string $storagePath
+        * @param string|null $content
+        * @param string|null $fsPath
+        * @return string
+        * @since 1.27
+        */
+       public function guessMimeInternal( $storagePath, $content, $fsPath ) {
+               $magic = MimeMagic::singleton();
+               // Trust the extension of the storage path (caller must validate)
+               $ext = FileBackend::extensionFromPath( $storagePath );
+               $type = $magic->guessTypesForExtension( $ext );
+               // For files without a valid extension (or one at all), inspect the contents
+               if ( !$type && $fsPath ) {
+                       $type = $magic->guessMimeType( $fsPath, false );
+               } elseif ( !$type && strlen( $content ) ) {
+                       $tmpFile = TempFSFile::factory( 'mime_' );
+                       file_put_contents( $tmpFile->getPath(), $content );
+                       $type = $magic->guessMimeType( $tmpFile->getPath(), false );
+               }
+               return $type ?: 'unknown/unknown';
+       }
 }
index 9433964..e21aaea 100644 (file)
@@ -58,7 +58,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * @see FileBackend::__construct()
         * Additional $config params include:
-        *   - wanCache     : WANOBjectCache object to use for persistent caching.
+        *   - wanCache     : WANObjectCache object to use for persistent caching.
         *   - mimeCallback : Callback that takes (storage path, content, file system path) and
         *                    returns the MIME type of the file or 'unknown/unknown'. The file
         *                    system path parameter should be used if the content one is null.
@@ -69,10 +69,7 @@ abstract class FileBackendStore extends FileBackend {
                parent::__construct( $config );
                $this->mimeCallback = isset( $config['mimeCallback'] )
                        ? $config['mimeCallback']
-                       : function ( $storagePath, $content, $fsPath ) {
-                               // @todo handle the case of extension-less files using the contents
-                               return StreamFile::contentTypeFromPath( $storagePath ) ?: 'unknown/unknown';
-                       };
+                       : null;
                $this->memCache = WANObjectCache::newEmpty(); // disabled by default
                $this->cheapCache = new ProcessCacheLRU( self::CACHE_CHEAP_SIZE );
                $this->expensiveCache = new ProcessCacheLRU( self::CACHE_EXPENSIVE_SIZE );
@@ -1066,7 +1063,7 @@ abstract class FileBackendStore extends FileBackend {
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
-               $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+               $ops = array_map( array( $this, 'sanitizeOpHeaders' ), $ops );
 
                // Build up a list of FileOps...
                $performOps = $this->getOperationsInternal( $ops );
@@ -1133,7 +1130,7 @@ abstract class FileBackendStore extends FileBackend {
                $status = Status::newGood();
 
                // Fix up custom header name/value pairs...
-               $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+               $ops = array_map( array( $this, 'sanitizeOpHeaders' ), $ops );
 
                // Clear any file cache entries
                $this->clearCache();
@@ -1230,7 +1227,9 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        /**
-        * Strip long HTTP headers from a file operation.
+        * Normalize and filter HTTP headers from a file operation
+        *
+        * This normalizes and strips long HTTP headers from a file operation.
         * Most headers are just numbers, but some are allowed to be long.
         * This function is useful for cleaning up headers and avoiding backend
         * specific errors, especially in the middle of batch file operations.
@@ -1238,18 +1237,21 @@ abstract class FileBackendStore extends FileBackend {
         * @param array $op Same format as doOperation()
         * @return array
         */
-       protected function stripInvalidHeadersFromOp( array $op ) {
-               static $longs = array( 'Content-Disposition' );
+       protected function sanitizeOpHeaders( array $op ) {
+               static $longs = array( 'content-disposition' );
+
                if ( isset( $op['headers'] ) ) { // op sets HTTP headers
+                       $newHeaders = array();
                        foreach ( $op['headers'] as $name => $value ) {
+                               $name = strtolower( $name );
                                $maxHVLen = in_array( $name, $longs ) ? INF : 255;
                                if ( strlen( $name ) > 255 || strlen( $value ) > $maxHVLen ) {
                                        trigger_error( "Header '$name: $value' is too long." );
-                                       unset( $op['headers'][$name] );
-                               } elseif ( !strlen( $value ) ) {
-                                       $op['headers'][$name] = ''; // null/false => ""
+                               } else {
+                                       $newHeaders[$name] = strlen( $value ) ? $value : ''; // null/false => ""
                                }
                        }
+                       $op['headers'] = $newHeaders;
                }
 
                return $op;
@@ -1549,7 +1551,7 @@ abstract class FileBackendStore extends FileBackend {
                if ( $digits > 0 ) {
                        $numShards = pow( $base, $digits );
                        for ( $index = 0; $index < $numShards; $index++ ) {
-                               $shards[] = '.' . wfBaseConvert( $index, 10, $base, $digits );
+                               $shards[] = '.' . Wikimedia\base_convert( $index, 10, $base, $digits );
                        }
                }
 
@@ -1752,7 +1754,7 @@ abstract class FileBackendStore extends FileBackend {
                                $pathNames[$this->fileCacheKey( $path )] = $path;
                        }
                }
-               // Get all cache entries for these container cache keys...
+               // Get all cache entries for these file cache keys...
                $values = $this->memCache->getMulti( array_keys( $pathNames ) );
                foreach ( $values as $cacheKey => $val ) {
                        $path = $pathNames[$cacheKey];
@@ -1823,7 +1825,18 @@ abstract class FileBackendStore extends FileBackend {
         * @return string MIME type
         */
        protected function getContentType( $storagePath, $content, $fsPath ) {
-               return call_user_func_array( $this->mimeCallback, func_get_args() );
+               if ( $this->mimeCallback ) {
+                       return call_user_func_array( $this->mimeCallback, func_get_args() );
+               }
+
+               $mime = null;
+               if ( $fsPath !== null && function_exists( 'finfo_file' ) ) {
+                       $finfo = finfo_open( FILEINFO_MIME_TYPE );
+                       $mime = finfo_file( $finfo, $fsPath );
+                       finfo_close( $finfo );
+               }
+
+               return is_string( $mime ) ? $mime : 'unknown/unknown';
        }
 }
 
index 5d4e8e1..8359943 100644 (file)
@@ -513,7 +513,7 @@ class CreateFileOp extends FileOp {
        }
 
        protected function getSourceSha1Base36() {
-               return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
+               return Wikimedia\base_convert( sha1( $this->params['content'] ), 16, 36, 31 );
        }
 
        public function storagePathsChanged() {
@@ -581,7 +581,7 @@ class StoreFileOp extends FileOp {
                $hash = sha1_file( $this->params['src'] );
                MediaWiki\restoreWarnings();
                if ( $hash !== false ) {
-                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
+                       $hash = Wikimedia\base_convert( $hash, 16, 36, 31 );
                }
 
                return $hash;
index e72d026..93d8d07 100644 (file)
@@ -140,7 +140,7 @@ class SwiftFileBackend extends FileBackendStore {
                                $this->srvCache = ObjectCache::getLocalClusterInstance();
                        } else {
                                // Look for APC, XCache, WinCache, ect...
-                               $this->srvCache = ObjectCache::newAccelerator( CACHE_NONE );
+                               $this->srvCache = ObjectCache::getLocalServerInstance( CACHE_NONE );
                        }
                } else {
                        $this->srvCache = new EmptyBagOStuff();
@@ -261,8 +261,10 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $sha1Hash = wfBaseConvert( sha1( $params['content'] ), 16, 36, 31 );
-               $contentType = $this->getContentType( $params['dst'], $params['content'], null );
+               $sha1Hash = Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 );
+               $contentType = isset( $params['headers']['content-type'] )
+                       ? $params['headers']['content-type']
+                       : $this->getContentType( $params['dst'], $params['content'], null );
 
                $reqs = array( array(
                        'method' => 'PUT',
@@ -317,8 +319,10 @@ class SwiftFileBackend extends FileBackendStore {
 
                        return $status;
                }
-               $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
-               $contentType = $this->getContentType( $params['dst'], null, $params['src'] );
+               $sha1Hash = Wikimedia\base_convert( $sha1Hash, 16, 36, 31 );
+               $contentType = isset( $params['headers']['content-type'] )
+                       ? $params['headers']['content-type']
+                       : $this->getContentType( $params['dst'], null, $params['src'] );
 
                $handle = fopen( $params['src'], 'rb' );
                if ( $handle === false ) { // source doesn't exist?
@@ -857,7 +861,7 @@ class SwiftFileBackend extends FileBackendStore {
                if ( !empty( $params['topOnly'] ) ) {
                        $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix, '/' );
                        if ( !$status->isOk() ) {
-                               return $dirs; // error
+                               throw new FileBackendError( "Iterator page I/O error: {$status->getMessage()}" );
                        }
                        $objects = $status->value;
                        foreach ( $objects as $object ) { // files and directories
@@ -876,7 +880,7 @@ class SwiftFileBackend extends FileBackendStore {
                        $status = $this->objectListing( $fullCont, 'names', $limit, $after, $prefix );
 
                        if ( !$status->isOk() ) {
-                               return $dirs; // error
+                               throw new FileBackendError( "Iterator page I/O error: {$status->getMessage()}" );
                        }
 
                        $objects = $status->value;
@@ -952,7 +956,7 @@ class SwiftFileBackend extends FileBackendStore {
 
                // Reformat this list into a list of (name, stat array or null) entries
                if ( !$status->isOk() ) {
-                       return $files; // error
+                       throw new FileBackendError( "Iterator page I/O error: {$status->getMessage()}" );
                }
 
                $objects = $status->value;
index 4ee5222..2f39dad 100644 (file)
@@ -81,9 +81,9 @@ abstract class FileJournal {
                for ( $i = 0; $i < 5; $i++ ) {
                        $s .= mt_rand( 0, 2147483647 );
                }
-               $s = wfBaseConvert( sha1( $s ), 16, 36, 31 );
+               $s = Wikimedia\base_convert( sha1( $s ), 16, 36, 31 );
 
-               return substr( wfBaseConvert( wfTimestamp( TS_MW ), 10, 36, 9 ) . $s, 0, 31 );
+               return substr( Wikimedia\base_convert( wfTimestamp( TS_MW ), 10, 36, 9 ) . $s, 0, 31 );
        }
 
        /**
index 9d4f009..c93b4b4 100644 (file)
@@ -95,12 +95,7 @@ abstract class DBLockManager extends QuorumLockManager {
                        if ( count( $bucket ) > 1 ) { // multiple peers
                                // Tracks peers that couldn't be queried recently to avoid lengthy
                                // connection timeouts. This is useless if each bucket has one peer.
-                               try {
-                                       $this->statusCache = ObjectCache::newAccelerator();
-                               } catch ( Exception $e ) {
-                                       trigger_error( __CLASS__ .
-                                               " using multiple DB peers without apc, xcache, or wincache." );
-                               }
+                               $this->statusCache = ObjectCache::getLocalServerInstance();
                                break;
                        }
                }
@@ -381,7 +376,7 @@ class PostgreSqlLockManager extends DBLockManager {
                $db = $this->getConnection( $lockSrv ); // checked in isServerUp()
                $bigints = array_unique( array_map(
                        function ( $key ) {
-                               return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 );
+                               return Wikimedia\base_convert( substr( $key, 0, 15 ), 16, 10 );
                        },
                        array_map( array( $this, 'sha1Base16Absolute' ), $paths )
                ) );
@@ -394,7 +389,7 @@ class PostgreSqlLockManager extends DBLockManager {
                                : "pg_try_advisory_lock({$db->addQuotes( $bigint )}) AS K$bigint";
                }
                $res = $db->query( 'SELECT ' . implode( ', ', $fields ), __METHOD__ );
-               $row = (array)$res->fetchObject();
+               $row = $res->fetchRow();
 
                if ( in_array( 'f', $row ) ) {
                        // Release any acquired locks if some could not be acquired...
index 8115fd4..7605a9b 100644 (file)
@@ -152,7 +152,7 @@ abstract class LockManager {
         * @return string
         */
        final protected function sha1Base36Absolute( $path ) {
-               return wfBaseConvert( sha1( "{$this->domain}:{$path}" ), 16, 36, 31 );
+               return Wikimedia\base_convert( sha1( "{$this->domain}:{$path}" ), 16, 36, 31 );
        }
 
        /**
index e79c06b..15007af 100644 (file)
@@ -123,13 +123,13 @@ class FileRepo {
        /** @var bool Whether all zones should be private (e.g. private wiki repo) */
        protected $isPrivate;
 
-       /**
-        * Factory functions for creating new files
-        * Override these in the base class
-        */
+       /** @var array callable Override these in the base class */
        protected $fileFactory = array( 'UnregisteredLocalFile', 'newFromTitle' );
+       /** @var array callable|bool Override these in the base class */
        protected $oldFileFactory = false;
+       /** @var array callable|bool Override these in the base class */
        protected $fileFactoryKey = false;
+       /** @var array callable|bool Override these in the base class */
        protected $oldFileFactoryKey = false;
 
        /**
@@ -1031,8 +1031,10 @@ class FileRepo {
                                $headers = array( 'Content-Disposition' => $triple[2] );
                        } elseif ( is_array( $triple[2] ) && isset( $triple[2]['headers'] ) ) {
                                $headers = $triple[2]['headers'];
+                       } else {
+                               $headers = array();
                        }
-                       // @fixme: $headers might not be defined
+
                        $operations[] = array(
                                'op' => FileBackend::isStoragePath( $src ) ? 'copy' : 'store',
                                'src' => $src,
@@ -1595,13 +1597,26 @@ class FileRepo {
         *
         * @param string $virtualUrl
         * @param array $headers Additional HTTP headers to send on success
-        * @return bool Success
+        * @return Status
+        * @since 1.27
         */
-       public function streamFile( $virtualUrl, $headers = array() ) {
+       public function streamFileWithStatus( $virtualUrl, $headers = array() ) {
                $path = $this->resolveToStoragePath( $virtualUrl );
                $params = array( 'src' => $path, 'headers' => $headers );
 
-               return $this->backend->streamFile( $params )->isOK();
+               return $this->backend->streamFile( $params );
+       }
+
+       /**
+        * Attempt to stream a file with the given virtual URL/storage path
+        *
+        * @deprecated since 1.26, use streamFileWithStatus
+        * @param string $virtualUrl
+        * @param array $headers Additional HTTP headers to send on success
+        * @return bool Success
+        */
+       public function streamFile( $virtualUrl, $headers = array() ) {
+               return $this->streamFileWithStatus( $virtualUrl, $headers )->isOK();
        }
 
        /**
index 4ffbf4a..f898bb6 100644 (file)
@@ -55,11 +55,11 @@ class ForeignAPIRepo extends FileRepo {
        );
 
        protected $fileFactory = array( 'ForeignAPIFile', 'newFromTitle' );
-       /** @var int Check back with Commons after a day (24*60*60) */
-       protected $apiThumbCacheExpiry = 86400;
+       /** @var int Check back with Commons after this expiry */
+       protected $apiThumbCacheExpiry = 86400; // 1 day (24*3600)
 
-       /** @var int Redownload thumbnail files after a month (86400*30) */
-       protected $fileCacheExpiry = 2592000;
+       /** @var int Redownload thumbnail files after this expiry */
+       protected $fileCacheExpiry = 2592000; // 1 month (30*24*3600)
 
        /** @var array */
        protected $mFileExists = array();
@@ -329,7 +329,7 @@ class ForeignAPIRepo extends FileRepo {
         * @return bool|string
         */
        function getThumbUrlFromCache( $name, $width, $height, $params = "" ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainWANInstance();
                // 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
@@ -342,7 +342,7 @@ class ForeignAPIRepo extends FileRepo {
                $sizekey = "$width:$height:$params";
 
                /* Get the array of urls that we already know */
-               $knownThumbUrls = $wgMemc->get( $key );
+               $knownThumbUrls = $cache->get( $key );
                if ( !$knownThumbUrls ) {
                        /* No knownThumbUrls for this file */
                        $knownThumbUrls = array();
@@ -388,7 +388,7 @@ class ForeignAPIRepo extends FileRepo {
                        if ( $remoteModified < $modified && $diff < $this->fileCacheExpiry ) {
                                /* Use our current and already downloaded thumbnail */
                                $knownThumbUrls[$sizekey] = $localUrl;
-                               $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
+                               $cache->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
 
                                return $localUrl;
                        }
@@ -410,7 +410,7 @@ class ForeignAPIRepo extends FileRepo {
                        return $foreignUrl;
                }
                $knownThumbUrls[$sizekey] = $localUrl;
-               $wgMemc->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
+               $cache->set( $key, $knownThumbUrls, $this->apiThumbCacheExpiry );
                wfDebug( __METHOD__ . " got local thumb $localUrl, saving to cache \n" );
 
                return $localUrl;
@@ -552,19 +552,16 @@ class ForeignAPIRepo extends FileRepo {
                }
 
                if ( !isset( $this->mQueryCache[$url] ) ) {
-                       global $wgMemc;
-
-                       $key = $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) );
-                       $data = $wgMemc->get( $key );
-
-                       if ( !$data ) {
-                               $data = self::httpGet( $url );
-
-                               if ( !$data ) {
-                                       return null;
+                       $data = ObjectCache::getMainWANInstance()->getWithSetCallback(
+                               $this->getLocalCacheKey( get_class( $this ), $target, md5( $url ) ),
+                               $cacheTTL,
+                               function () use ( $url ) {
+                                       return ForeignAPIRepo::httpGet( $url );
                                }
+                       );
 
-                               $wgMemc->set( $key, $data, $cacheTTL );
+                       if ( !$data ) {
+                               return null;
                        }
 
                        if ( count( $this->mQueryCache ) > 100 ) {
index 588ae6b..72f12d1 100644 (file)
@@ -1137,6 +1137,7 @@ abstract class File implements IDBAccessObject {
                if ( !$thumb ) { // bad params?
                        $thumb = false;
                } elseif ( $thumb->isError() ) { // transform error
+                       /** @var $thumb MediaTransformError */
                        $this->lastError = $thumb->toText();
                        // Ignore errors if requested
                        if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
@@ -1175,8 +1176,13 @@ abstract class File implements IDBAccessObject {
                if ( !$this->repo
                        || !isset( $params['physicalWidth'] )
                        || !isset( $params['physicalHeight'] )
-                       || !( $bucket = $this->getThumbnailBucket( $params['physicalWidth'] ) )
-                       || $bucket == $params['physicalWidth'] ) {
+               ) {
+                       return false;
+               }
+
+               $bucket = $this->getThumbnailBucket( $params['physicalWidth'] );
+
+               if ( !$bucket || $bucket == $params['physicalWidth'] ) {
                        return false;
                }
 
@@ -1907,7 +1913,7 @@ abstract class File implements IDBAccessObject {
         * @param string $reason
         * @param bool $suppress Hide content from sysops?
         * @param User|null $user
-        * @return bool Boolean on success, false on some kind of failure
+        * @return FileRepoStatus
         * STUB
         * Overridden by LocalFile
         */
@@ -2019,15 +2025,19 @@ abstract class File implements IDBAccessObject {
         * @return string
         */
        function getDescriptionText( $lang = false ) {
-               global $wgMemc, $wgLang;
+               global $wgLang;
+
                if ( !$this->repo || !$this->repo->fetchDescription ) {
                        return false;
                }
-               if ( !$lang ) {
-                       $lang = $wgLang;
-               }
+
+               $lang = $lang ?: $wgLang;
+
                $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() );
                if ( $renderUrl ) {
+                       $cache = ObjectCache::getMainWANInstance();
+
+                       $key = null;
                        if ( $this->repo->descriptionCacheExpiry > 0 ) {
                                wfDebug( "Attempting to get the description from cache..." );
                                $key = $this->repo->getLocalCacheKey(
@@ -2036,7 +2046,7 @@ abstract class File implements IDBAccessObject {
                                        $lang->getCode(),
                                        $this->getName()
                                );
-                               $obj = $wgMemc->get( $key );
+                               $obj = $cache->get( $key );
                                if ( $obj ) {
                                        wfDebug( "success!\n" );
 
@@ -2046,8 +2056,8 @@ abstract class File implements IDBAccessObject {
                        }
                        wfDebug( "Fetching shared description from $renderUrl\n" );
                        $res = Http::get( $renderUrl, array(), __METHOD__ );
-                       if ( $res && $this->repo->descriptionCacheExpiry > 0 ) {
-                               $wgMemc->set( $key, $res, $this->repo->descriptionCacheExpiry );
+                       if ( $res && $key ) {
+                               $cache->set( $key, $res, $this->repo->descriptionCacheExpiry );
                        }
 
                        return $res;
index 3c78290..26ea38b 100644 (file)
@@ -244,7 +244,7 @@ class ForeignAPIFile extends File {
         */
        function getSha1() {
                return isset( $this->mInfo['sha1'] )
-                       ? wfBaseConvert( strval( $this->mInfo['sha1'] ), 16, 36, 31 )
+                       ? Wikimedia\base_convert( strval( $this->mInfo['sha1'] ), 16, 36, 31 )
                        : null;
        }
 
@@ -334,22 +334,20 @@ class ForeignAPIFile extends File {
        }
 
        function purgeDescriptionPage() {
-               global $wgMemc, $wgContLang;
+               global $wgContLang;
 
                $url = $this->repo->getDescriptionRenderUrl( $this->getName(), $wgContLang->getCode() );
                $key = $this->repo->getLocalCacheKey( 'RemoteFileDescription', 'url', md5( $url ) );
 
-               $wgMemc->delete( $key );
+               ObjectCache::getMainWANInstance()->delete( $key );
        }
 
        /**
         * @param array $options
         */
        function purgeThumbnails( $options = array() ) {
-               global $wgMemc;
-
                $key = $this->repo->getLocalCacheKey( 'ForeignAPIRepo', 'ThumbUrl', $this->getName() );
-               $wgMemc->delete( $key );
+               ObjectCache::getMainWANInstance()->delete( $key );
 
                $files = $this->getThumbnails();
                // Give media handler a chance to filter the purge list
index 390b7fe..0da1ae8 100644 (file)
@@ -256,7 +256,6 @@ class LocalFile extends File {
 
                // Check if the key existed and belongs to this version of MediaWiki
                if ( is_array( $cachedValues ) && $cachedValues['version'] == MW_FILE_VERSION ) {
-                       wfDebug( "Pulling file metadata from cache key $key\n" );
                        $this->fileExists = $cachedValues['fileExists'];
                        if ( $this->fileExists ) {
                                $this->setProps( $cachedValues );
@@ -316,7 +315,7 @@ class LocalFile extends File {
        /**
         * Purge the file object/metadata cache
         */
-       function invalidateCache() {
+       public function invalidateCache() {
                $key = $this->getCacheKey();
                if ( !$key ) {
                        return;
@@ -859,14 +858,14 @@ class LocalFile extends File {
        }
 
        /**
-        * Refresh metadata in memcached, but don't touch thumbnails or squid
+        * Refresh metadata in memcached, but don't touch thumbnails or CDN
         */
        function purgeMetadataCache() {
                $this->invalidateCache();
        }
 
        /**
-        * Delete all previously generated thumbnails, refresh metadata in memcached and purge the squid.
+        * Delete all previously generated thumbnails, refresh metadata in memcached and purge the CDN.
         *
         * @param array $options An array potentially with the key forThumbRefresh.
         *
@@ -879,8 +878,11 @@ class LocalFile extends File {
                // Delete thumbnails
                $this->purgeThumbnails( $options );
 
-               // Purge squid cache for this file
-               SquidUpdate::purge( array( $this->getURL() ) );
+               // Purge CDN cache for this file
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( array( $this->getUrl() ) ),
+                       DeferredUpdates::PRESEND
+               );
        }
 
        /**
@@ -888,8 +890,6 @@ class LocalFile extends File {
         * @param string $archiveName Name of the archived file
         */
        function purgeOldThumbnails( $archiveName ) {
-               global $wgUseSquid;
-
                // Get a list of old thumbnails and URLs
                $files = $this->getThumbnails( $archiveName );
 
@@ -899,15 +899,12 @@ class LocalFile extends File {
                $dir = array_shift( $files );
                $this->purgeThumbList( $dir, $files );
 
-               // Purge the squid
-               if ( $wgUseSquid ) {
-                       $urls = array();
-                       foreach ( $files as $file ) {
-                               $urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
-                       }
-                       SquidUpdate::purge( $urls );
+               // Purge the CDN
+               $urls = array();
+               foreach ( $files as $file ) {
+                       $urls[] = $this->getArchiveThumbUrl( $archiveName, $file );
                }
-
+               DeferredUpdates::addUpdate( new CdnCacheUpdate( $urls ), DeferredUpdates::PRESEND );
        }
 
        /**
@@ -915,18 +912,14 @@ class LocalFile extends File {
         * @param array $options
         */
        public function purgeThumbnails( $options = array() ) {
-               global $wgUseSquid;
-
                // Delete thumbnails
                $files = $this->getThumbnails();
-               // Always purge all files from squid regardless of handler filters
+               // Always purge all files from CDN regardless of handler filters
                $urls = array();
-               if ( $wgUseSquid ) {
-                       foreach ( $files as $file ) {
-                               $urls[] = $this->getThumbUrl( $file );
-                       }
-                       array_shift( $urls ); // don't purge directory
+               foreach ( $files as $file ) {
+                       $urls[] = $this->getThumbUrl( $file );
                }
+               array_shift( $urls ); // don't purge directory
 
                // Give media handler a chance to filter the file purge list
                if ( !empty( $options['forThumbRefresh'] ) ) {
@@ -942,11 +935,8 @@ class LocalFile extends File {
                $dir = array_shift( $files );
                $this->purgeThumbList( $dir, $files );
 
-               // Purge the squid
-               if ( $wgUseSquid ) {
-                       SquidUpdate::purge( $urls );
-               }
-
+               // Purge the CDN
+               DeferredUpdates::addUpdate( new CdnCacheUpdate( $urls ), DeferredUpdates::PRESEND );
        }
 
        /**
@@ -1209,21 +1199,15 @@ class LocalFile extends File {
         * @param null|User $user
         * @return bool
         */
-       function recordUpload2( $oldver, $comment, $pageText, $props = false, $timestamp = false,
-               $user = null
+       function recordUpload2(
+               $oldver, $comment, $pageText, $props = false, $timestamp = false, $user = null
        ) {
-
                if ( is_null( $user ) ) {
                        global $wgUser;
                        $user = $wgUser;
                }
 
                $dbw = $this->repo->getMasterDB();
-               $dbw->begin( __METHOD__ );
-
-               if ( !$props ) {
-                       $props = $this->repo->getFileProps( $this->getVirtualUrl() );
-               }
 
                # Imports or such might force a certain timestamp; otherwise we generate
                # it and can fudge it slightly to keep (name,timestamp) unique on re-upload.
@@ -1234,6 +1218,7 @@ class LocalFile extends File {
                        $allowTimeKludge = false;
                }
 
+               $props = $props ?: $this->repo->getFileProps( $this->getVirtualUrl() );
                $props['description'] = $comment;
                $props['user'] = $user->getId();
                $props['user_text'] = $user->getName();
@@ -1243,12 +1228,11 @@ class LocalFile extends File {
                # Fail now if the file isn't there
                if ( !$this->fileExists ) {
                        wfDebug( __METHOD__ . ": File " . $this->getRel() . " went missing!\n" );
-                       $dbw->rollback( __METHOD__ );
 
                        return false;
                }
 
-               $reupload = false;
+               $dbw->startAtomic( __METHOD__ );
 
                # Test to see if the row exists using INSERT IGNORE
                # This avoids race conditions by locking the row until the commit, and also
@@ -1273,13 +1257,18 @@ class LocalFile extends File {
                        __METHOD__,
                        'IGNORE'
                );
-               if ( $dbw->affectedRows() == 0 ) {
+
+               $reupload = ( $dbw->affectedRows() == 0 );
+               if ( $reupload ) {
                        if ( $allowTimeKludge ) {
                                # Use LOCK IN SHARE MODE to ignore any transaction snapshotting
-                               $ltimestamp = $dbw->selectField( 'image', 'img_timestamp',
+                               $ltimestamp = $dbw->selectField(
+                                       'image',
+                                       'img_timestamp',
                                        array( 'img_name' => $this->getName() ),
                                        __METHOD__,
-                                       array( 'LOCK IN SHARE MODE' ) );
+                                       array( 'LOCK IN SHARE MODE' )
+                               );
                                $lUnixtime = $ltimestamp ? wfTimestamp( TS_UNIX, $ltimestamp ) : false;
                                # Avoid a timestamp that is not newer than the last version
                                # TODO: the image/oldimage tables should be like page/revision with an ID field
@@ -1294,8 +1283,6 @@ class LocalFile extends File {
                        # version of the file was broken. Allow registration of the new
                        # version to continue anyway, because that's better than having
                        # an image that's not fixable by user operations.
-
-                       $reupload = true;
                        # Collision, this is an update of a file
                        # Insert previous contents into oldimage
                        $dbw->insertSelect( 'oldimage', 'image',
@@ -1322,7 +1309,7 @@ class LocalFile extends File {
 
                        # Update the current image row
                        $dbw->update( 'image',
-                               array( /* SET */
+                               array(
                                        'img_size' => $this->size,
                                        'img_width' => intval( $this->width ),
                                        'img_height' => intval( $this->height ),
@@ -1340,23 +1327,17 @@ class LocalFile extends File {
                                array( 'img_name' => $this->getName() ),
                                __METHOD__
                        );
-               } else {
-                       # This is a new file, so update the image count
-                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => 1 ) ) );
                }
 
                $descTitle = $this->getTitle();
                $wikiPage = new WikiFilePage( $descTitle );
                $wikiPage->setFile( $this );
 
-               # Add the log entry
-               $action = $reupload ? 'overwrite' : 'upload';
-
-               $logEntry = new ManualLogEntry( 'upload', $action );
+               // Add the log entry...
+               $logEntry = new ManualLogEntry( 'upload', $reupload ? 'overwrite' : 'upload' );
                $logEntry->setPerformer( $user );
                $logEntry->setComment( $comment );
                $logEntry->setTarget( $descTitle );
-
                // Allow people using the api to associate log entries with the upload.
                // Log has a timestamp, but sometimes different from upload timestamp.
                $logEntry->setParameters(
@@ -1373,15 +1354,7 @@ class LocalFile extends File {
                // now and wait until the page exists.
                $logId = $logEntry->insert();
 
-               $exists = $descTitle->exists();
-               if ( $exists ) {
-                       // Page exists, do RC entry now (otherwise we wait for later).
-                       $logEntry->publish( $logId );
-               }
-
-               if ( $exists ) {
-                       # Create a null revision
-                       $latest = $descTitle->getLatestRevID();
+               if ( $descTitle->exists() ) {
                        // Use own context to get the action text in content language
                        $formatter = LogFormatter::newFromEntry( $logEntry );
                        $formatter->setContext( RequestContext::newExtraneousContext( $descTitle ) );
@@ -1394,72 +1367,89 @@ class LocalFile extends File {
                                false,
                                $user
                        );
-                       if ( !is_null( $nullRevision ) ) {
+                       if ( $nullRevision ) {
                                $nullRevision->insertOn( $dbw );
-
-                               Hooks::run( 'NewRevisionFromEditComplete', array( $wikiPage, $nullRevision, $latest, $user ) );
+                               Hooks::run(
+                                       'NewRevisionFromEditComplete',
+                                       array( $wikiPage, $nullRevision, $nullRevision->getParentId(), $user )
+                               );
                                $wikiPage->updateRevisionOn( $dbw, $nullRevision );
                        }
-               }
-
-               # Commit the transaction now, in case something goes wrong later
-               # The most important thing is that files don't get lost, especially archives
-               # NOTE: once we have support for nested transactions, the commit may be moved
-               #       to after $wikiPage->doEdit has been called.
-               $dbw->commit( __METHOD__ );
 
-               # Update memcache after the commit
-               $this->invalidateCache();
-
-               if ( $exists ) {
-                       # Invalidate the cache for the description page
-                       $descTitle->invalidateCache();
-                       $descTitle->purgeSquid();
+                       $newPageContent = null;
                } else {
-                       # New file; create the description page.
-                       # There's already a log entry, so don't make a second RC entry
-                       # Squid and file cache for the description page are purged by doEditContent.
-                       $content = ContentHandler::makeContent( $pageText, $descTitle );
-                       $status = $wikiPage->doEditContent(
-                               $content,
-                               $comment,
-                               EDIT_NEW | EDIT_SUPPRESS_RC,
-                               false,
-                               $user
-                       );
-
-                       // Now that the page exists, make an RC entry.
-                       // This relies on the resetArticleID() call in WikiPage::insertOn(),
-                       // which is triggered on $descTitle by doEditContent() above.
-                       $logEntry->publish( $logId );
-                       if ( isset( $status->value['revision'] ) ) {
-                               $dbw->update( 'logging',
-                                       array( 'log_page' => $status->value['revision']->getPage() ),
-                                       array( 'log_id' => $logId ),
-                                       __METHOD__
-                               );
-                       }
+                       // Make the description page and RC log entry post-commit
+                       $newPageContent = ContentHandler::makeContent( $pageText, $descTitle );
                }
 
+               # Defer purges, page creation, and link updates in case they error out.
+               # The most important thing is that files and the DB registry stay synced.
+               $dbw->endAtomic( __METHOD__ );
+
                # Do some cache purges after final commit so that:
                # a) Changes are more likely to be seen post-purge
                # b) They won't cause rollback of the log publish/update above
                $that = $this;
-               $dbw->onTransactionIdle( function () use ( $that, $reupload, $descTitle ) {
+               $dbw->onTransactionIdle( function () use (
+                       $that, $reupload, $wikiPage, $newPageContent, $comment, $user, $logEntry, $logId
+               ) {
+                       # Update memcache after the commit
+                       $that->invalidateCache();
+
+                       if ( $newPageContent ) {
+                               # New file page; create the description page.
+                               # There's already a log entry, so don't make a second RC entry
+                               # CDN and file cache for the description page are purged by doEditContent.
+                               $status = $wikiPage->doEditContent(
+                                       $newPageContent,
+                                       $comment,
+                                       EDIT_NEW | EDIT_SUPPRESS_RC,
+                                       false,
+                                       $user
+                               );
+
+                               // This relies on the resetArticleID() call in WikiPage::insertOn(),
+                               // which is triggered on $descTitle by doEditContent() above.
+                               if ( isset( $status->value['revision'] ) ) {
+                                       /** @var $rev Revision */
+                                       $rev = $status->value['revision'];
+                                       $that->getRepo()->getMasterDB()->update(
+                                               'logging',
+                                               array( 'log_page' => $rev->getPage() ),
+                                               array( 'log_id' => $logId ),
+                                               __METHOD__
+                                       );
+                               }
+                       } else {
+                               # Existing file page: invalidate description page cache
+                               $wikiPage->getTitle()->invalidateCache();
+                               $wikiPage->getTitle()->purgeSquid();
+                       }
+
+                       # Now that the page exists, make an RC entry.
+                       $logEntry->publish( $logId );
                        # Run hook for other updates (typically more cache purging)
-                       Hooks::run( 'FileUpload', array( $that, $reupload, $descTitle->exists() ) );
+                       Hooks::run( 'FileUpload', array( $that, $reupload, !$newPageContent ) );
 
                        if ( $reupload ) {
                                # Delete old thumbnails
                                $that->purgeThumbnails();
-                               # Remove the old file from the squid cache
-                               SquidUpdate::purge( array( $that->getURL() ) );
+                               # Remove the old file from the CDN cache
+                               DeferredUpdates::addUpdate(
+                                       new CdnCacheUpdate( array( $that->getUrl() ) ),
+                                       DeferredUpdates::PRESEND
+                               );
                        } else {
                                # Update backlink pages pointing to this title if created
                                LinksUpdate::queueRecursiveJobsForTable( $that->getTitle(), 'imagelinks' );
                        }
                } );
 
+               if ( !$reupload ) {
+                       # This is a new file, so update the image count
+                       DeferredUpdates::addUpdate( SiteStatsUpdate::factory( array( 'images' => 1 ) ) );
+               }
+
                # Invalidate cache for all pages using this file
                DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->getTitle(), 'imagelinks' ) );
 
@@ -1635,24 +1625,20 @@ class LocalFile extends File {
                $that = $this;
                $this->getRepo()->getMasterDB()->onTransactionIdle(
                        function () use ( $that, $archiveNames ) {
-                               global $wgUseSquid;
-
                                $that->purgeEverything();
                                foreach ( $archiveNames as $archiveName ) {
                                        $that->purgeOldThumbnails( $archiveName );
                                }
-
-                               if ( $wgUseSquid ) {
-                                       // Purge the squid
-                                       $purgeUrls = array();
-                                       foreach ( $archiveNames as $archiveName ) {
-                                               $purgeUrls[] = $that->getArchiveUrl( $archiveName );
-                                       }
-                                       SquidUpdate::purge( $purgeUrls );
-                               }
                        }
                );
 
+               // Purge the CDN
+               $purgeUrls = array();
+               foreach ( $archiveNames as $archiveName ) {
+                       $purgeUrls[] = $this->getArchiveUrl( $archiveName );
+               }
+               DeferredUpdates::addUpdate( new CdnCacheUpdate( $purgeUrls ), DeferredUpdates::PRESEND );
+
                return $status;
        }
 
@@ -1672,7 +1658,6 @@ class LocalFile extends File {
         * @return FileRepoStatus
         */
        function deleteOld( $archiveName, $reason, $suppress = false, $user = null ) {
-               global $wgUseSquid;
                if ( $this->getRepo()->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
@@ -1689,10 +1674,10 @@ class LocalFile extends File {
                        $this->purgeDescription();
                }
 
-               if ( $wgUseSquid ) {
-                       // Purge the squid
-                       SquidUpdate::purge( array( $this->getArchiveUrl( $archiveName ) ) );
-               }
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( array( $this->getArchiveUrl( $archiveName ) ) ),
+                       DeferredUpdates::PRESEND
+               );
 
                return $status;
        }
index c89c6b6..9ea9702 100644 (file)
@@ -98,7 +98,8 @@ abstract class ImageGalleryBase extends ContextSource {
                $mode = $wgContLang->lc( $mode );
 
                if ( isset( self::$modeMapping[$mode] ) ) {
-                       return new self::$modeMapping[$mode]( $mode, $context );
+                       $class = self::$modeMapping[$mode];
+                       return new $class( $mode, $context );
                } else {
                        throw new MWException( "No gallery class registered for mode $mode" );
                }
index 0934f6a..d2f7417 100644 (file)
@@ -46,12 +46,13 @@ class TraditionalImageGallery extends ImageGalleryBase {
                        array( 'class' => 'gallery mw-gallery-' . $this->mMode ), $this->mAttribs );
 
                $modules = $this->getModules();
-               $modules[] = 'mediawiki.page.gallery.styles';
 
                if ( $this->mParser ) {
                        $this->mParser->getOutput()->addModules( $modules );
+                       $this->mParser->getOutput()->addModuleStyles( 'mediawiki.page.gallery.styles' );
                } else {
                        $this->getOutput()->addModules( $modules );
+                       $this->getOutput()->addModuleStyles( 'mediawiki.page.gallery.styles' );
                }
                $output = Xml::openElement( 'ul', $attribs );
                if ( $this->mCaption ) {
@@ -110,48 +111,51 @@ class TraditionalImageGallery extends ImageGalleryBase {
                                                htmlspecialchars( $nt->getText() )
                                        ) .
                                        '</div>';
-                       } elseif ( !( $thumb = $img->transform( $transformOptions ) ) ) {
-                               # Error generating thumbnail.
-                               $thumbhtml = "\n\t\t\t" . '<div class="thumb" style="height: '
-                                       . ( $this->getThumbPadding() + $this->mHeights ) . 'px;">'
-                                       . htmlspecialchars( $img->getLastError() ) . '</div>';
                        } else {
-                               /** @var MediaTransformOutput $thumb */
-                               $vpad = $this->getVPad( $this->mHeights, $thumb->getHeight() );
-
-                               $imageParameters = array(
-                                       '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 == '' ) {
-                                       $imageParameters['alt'] = $nt->getText();
-                               }
-
-                               $this->adjustImageParameters( $thumb, $imageParameters );
-
-                               Linker::processResponsiveImages( $img, $thumb, $transformOptions );
-
-                               # Set both fixed width and min-height.
-                               $thumbhtml = "\n\t\t\t"
-                                       . '<div class="thumb" style="width: '
-                                       . $this->getThumbDivWidth( $thumb->getWidth() ) . 'px;">'
-                                       # Auto-margin centering for block-level elements. Needed
-                                       # now that we have video handlers since they may emit block-
-                                       # level elements as opposed to simple <img> tags. ref
-                                       # http://css-discuss.incutio.com/?page=CenteringBlockElement
-                                       . '<div style="margin:' . $vpad . 'px auto;">'
-                                       . $thumb->toHtml( $imageParameters ) . '</div></div>';
-
-                               // Call parser transform hook
-                               /** @var MediaHandler $handler */
-                               $handler = $img->getHandler();
-                               if ( $this->mParser && $handler ) {
-                                       $handler->parserTransformHook( $this->mParser, $img );
+                               $thumb = $img->transform( $transformOptions );
+                               if ( !$thumb ) {
+                                       # Error generating thumbnail.
+                                       $thumbhtml = "\n\t\t\t" . '<div class="thumb" style="height: '
+                                               . ( $this->getThumbPadding() + $this->mHeights ) . 'px;">'
+                                               . htmlspecialchars( $img->getLastError() ) . '</div>';
+                               } else {
+                                       /** @var MediaTransformOutput $thumb */
+                                       $vpad = $this->getVPad( $this->mHeights, $thumb->getHeight() );
+
+                                       $imageParameters = array(
+                                               '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 == '' ) {
+                                               $imageParameters['alt'] = $nt->getText();
+                                       }
+
+                                       $this->adjustImageParameters( $thumb, $imageParameters );
+
+                                       Linker::processResponsiveImages( $img, $thumb, $transformOptions );
+
+                                       # Set both fixed width and min-height.
+                                       $thumbhtml = "\n\t\t\t"
+                                               . '<div class="thumb" style="width: '
+                                               . $this->getThumbDivWidth( $thumb->getWidth() ) . 'px;">'
+                                               # Auto-margin centering for block-level elements. Needed
+                                               # now that we have video handlers since they may emit block-
+                                               # level elements as opposed to simple <img> tags. ref
+                                               # http://css-discuss.incutio.com/?page=CenteringBlockElement
+                                               . '<div style="margin:' . $vpad . 'px auto;">'
+                                               . $thumb->toHtml( $imageParameters ) . '</div></div>';
+
+                                       // Call parser transform hook
+                                       /** @var MediaHandler $handler */
+                                       $handler = $img->getHandler();
+                                       if ( $this->mParser && $handler ) {
+                                               $handler->parserTransformHook( $this->mParser, $img );
+                                       }
                                }
                        }
 
index f988e62..24a253e 100644 (file)
@@ -16,4 +16,8 @@ class HTMLApiField extends HTMLFormField {
        public function getInputHTML( $value ) {
                return '';
        }
+
+       public function hasVisibleOutput() {
+               return false;
+       }
 }
index 55cd5d0..fc19d9a 100644 (file)
@@ -5,6 +5,9 @@
  * auto-completion and optionally with a select dropdown for selecting common
  * options.
  *
+ * HTMLComboboxField implements most of the same functionality and should be
+ * used instead, if possible.
+ *
  * If one of 'options-messages', 'options', or 'options-message' is provided
  * and non-empty, the select dropdown will be shown. An 'other' key will be
  * appended using message 'htmlform-selectorother-other' if not already
@@ -22,7 +25,6 @@
  *   other-message - Message to use instead of htmlform-selectorother-other for
  *      the 'other' message.
  *   other - Raw text to use for the 'other' message
- *
  */
 class HTMLAutoCompleteSelectField extends HTMLTextField {
        protected $autocomplete = array();
index 5a1006a..1d45e5f 100644 (file)
@@ -45,7 +45,7 @@ class HTMLButtonField extends HTMLFormField {
        /**
         * Get the OOUI widget for this field.
         * @param string $value
-        * @return OOUI\\ButtonInputWidget
+        * @return OOUI\ButtonInputWidget
         */
        public function getInputOOUI( $value ) {
                return new OOUI\ButtonInputWidget( array(
index b226854..5ef4f79 100644 (file)
@@ -45,7 +45,7 @@ class HTMLCheckField extends HTMLFormField {
         * Get the OOUI version of this field.
         * @since 1.26
         * @param string $value
-        * @return OOUI\\CheckboxInputWidget The checkbox widget.
+        * @return OOUI\CheckboxInputWidget The checkbox widget.
         */
        public function getInputOOUI( $value ) {
                if ( !empty( $this->mParams['invert'] ) ) {
diff --git a/includes/htmlform/HTMLComboboxField.php b/includes/htmlform/HTMLComboboxField.php
new file mode 100644 (file)
index 0000000..e5679bb
--- /dev/null
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * A combo box field.
+ *
+ * You can think of it as a dropdown select with the ability to add custom options,
+ * or as a text field with input suggestions (autocompletion).
+ *
+ * When JavaScript is not supported or enabled, it uses HTML5 `<datalist>` element.
+ *
+ * Besides the parameters recognized by HTMLTextField, the following are
+ * recognized:
+ *   options-messages - As for HTMLSelectField
+ *   options - As for HTMLSelectField
+ *   options-message - As for HTMLSelectField
+ */
+class HTMLComboboxField extends HTMLTextField {
+       // FIXME Ewww, this shouldn't be adding any attributes not requested in $list :(
+       public function getAttributes( array $list, array $mappings = null ) {
+               $attribs = array(
+                       'type' => 'text',
+                       'list' => $this->mName . '-datalist',
+               ) + parent::getAttributes( $list, $mappings );
+
+               return $attribs;
+       }
+
+       function getInputHTML( $value ) {
+               $datalist = new XmlSelect( false, $this->mName . '-datalist' );
+               $datalist->setTagName( 'datalist' );
+               $datalist->addOptions( $this->getOptions() );
+
+               return parent::getInputHTML( $value ) . $datalist->getHTML();
+       }
+
+       function getInputOOUI( $value ) {
+               $disabled = false;
+               $allowedParams = array( 'tabindex' );
+               $attribs = $this->getAttributes( $allowedParams, array( 'tabindex' => 'tabIndex' ) );
+
+               if ( $this->mClass !== '' ) {
+                       $attribs['classes'] = array( $this->mClass );
+               }
+
+               if ( !empty( $this->mParams['disabled'] ) ) {
+                       $disabled = true;
+               }
+
+               return new OOUI\ComboBoxInputWidget( array(
+                       'name' => $this->mName,
+                       'id' => $this->mID,
+                       'options' => $this->getOptionsOOUI(),
+                       'value' => strval( $value ),
+                       'disabled' => $disabled,
+               ) + $attribs );
+       }
+}
index e51620f..b0d90af 100644 (file)
@@ -128,6 +128,7 @@ class HTMLForm extends ContextSource {
                'textwithbutton' => 'HTMLTextFieldWithButton',
                'textarea' => 'HTMLTextAreaField',
                'select' => 'HTMLSelectField',
+               'combobox' => 'HTMLComboboxField',
                'radio' => 'HTMLRadioField',
                'multiselect' => 'HTMLMultiSelectField',
                'limitselect' => 'HTMLSelectLimitField',
@@ -1359,6 +1360,18 @@ class HTMLForm extends ContextSource {
                return $this->mMethod;
        }
 
+       /**
+        * Wraps the given $section into an user-visible fieldset.
+        *
+        * @param string $legend Legend text for the fieldset
+        * @param string $section The section content in plain Html
+        * @param array $attributes Additional attributes for the fieldset
+        * @return string The fieldset's Html
+        */
+       protected function wrapFieldSetSection( $legend, $section, $attributes ) {
+               return Xml::fieldset( $legend, $section, $attributes ) . "\n";
+       }
+
        /**
         * @todo Document
         *
@@ -1390,16 +1403,19 @@ class HTMLForm extends ContextSource {
                                $v = empty( $value->mParams['nodata'] )
                                        ? $this->mFieldData[$key]
                                        : $value->getDefault();
-                               $html[] = $value->$getFieldHtmlMethod( $v );
 
-                               $labelValue = trim( $value->getLabel() );
-                               if ( $labelValue != '&#160;' && $labelValue !== '' ) {
-                                       $hasLabel = true;
-                               }
+                               $retval = $value->$getFieldHtmlMethod( $v );
+
+                               // check, if the form field should be added to
+                               // the output.
+                               if ( $value->hasVisibleOutput() ) {
+                                       $html[] = $retval;
+
+                                       $labelValue = trim( $value->getLabel() );
+                                       if ( $labelValue != '&#160;' && $labelValue !== '' ) {
+                                               $hasLabel = true;
+                                       }
 
-                               if ( get_class( $value ) !== 'HTMLHiddenField' &&
-                                       get_class( $value ) !== 'HTMLApiField'
-                               ) {
                                        $hasUserVisibleFields = true;
                                }
                        } elseif ( is_array( $value ) ) {
@@ -1425,7 +1441,7 @@ class HTMLForm extends ContextSource {
                                        if ( $fieldsetIDPrefix ) {
                                                $attributes['id'] = Sanitizer::escapeId( "$fieldsetIDPrefix$key" );
                                        }
-                                       $subsectionHtml .= Xml::fieldset( $legend, $section, $attributes ) . "\n";
+                                       $subsectionHtml .= $this->wrapFieldSetSection( $legend, $section, $attributes );
                                } else {
                                        // Just return the inputs, nothing fancy.
                                        $subsectionHtml .= $section;
index 20d7250..d4a293e 100644 (file)
@@ -11,7 +11,7 @@ abstract class HTMLFormField {
        protected $mFilterCallback;
        protected $mName;
        protected $mDir;
-       protected $mLabel; # String label.  Set on construction
+       protected $mLabel; # String label, as HTML. Set on construction.
        protected $mID;
        protected $mClass = '';
        protected $mVFormClass = '';
@@ -49,7 +49,7 @@ abstract class HTMLFormField {
         * Defaults to false, which getOOUI will interpret as "use the HTML version"
         *
         * @param string $value
-        * @return OOUI\\Widget|false
+        * @return OOUI\Widget|false
         */
        function getInputOOUI( $value ) {
                return false;
@@ -86,6 +86,15 @@ abstract class HTMLFormField {
                return call_user_func_array( $callback, $args );
        }
 
+       /**
+        * If this field has a user-visible output or not. If not,
+        * it will not be rendered
+        *
+        * @return bool
+        */
+       public function hasVisibleOutput() {
+               return true;
+       }
 
        /**
         * Fetch a field value from $alldata for the closest field matching a given
@@ -567,7 +576,7 @@ abstract class HTMLFormField {
         *
         * @param string $value The value to set the input to.
         *
-        * @return OOUI\\FieldLayout|OOUI\\ActionFieldLayout
+        * @return OOUI\FieldLayout|OOUI\ActionFieldLayout
         */
        public function getOOUI( $value ) {
                $inputField = $this->getInputOOUI( $value );
@@ -601,7 +610,7 @@ abstract class HTMLFormField {
                $config = array(
                        'classes' => array( "mw-htmlform-field-$fieldType", $this->mClass ),
                        'align' => $this->getLabelAlignOOUI(),
-                       'label' => $this->getLabel(),
+                       'label' => new OOUI\HtmlSnippet( $this->getLabel() ),
                        'help' => $helpText !== null ? new OOUI\HtmlSnippet( $helpText ) : null,
                        'errors' => $errors,
                        'infusable' => $infusable,
@@ -620,7 +629,7 @@ abstract class HTMLFormField {
 
        /**
         * Get a FieldLayout (or subclass thereof) to wrap this field in when using OOUI output.
-        * @return OOUI\\FieldLayout|OOUI\\ActionFieldLayout
+        * @return OOUI\FieldLayout|OOUI\ActionFieldLayout
         */
        protected function getFieldLayoutOOUI( $inputField, $config ) {
                if ( isset( $this->mClassWithButton ) ) {
@@ -837,7 +846,7 @@ abstract class HTMLFormField {
        }
 
        /**
-        * @return string
+        * @return string HTML
         */
        function getLabel() {
                return is_null( $this->mLabel ) ? '' : $this->mLabel;
index e4695f7..00f7343 100644 (file)
@@ -59,4 +59,8 @@ class HTMLHiddenField extends HTMLFormField {
        public function canDisplayErrors() {
                return false;
        }
+
+       public function hasVisibleOutput() {
+               return false;
+       }
 }
index 19b45be..2d05704 100644 (file)
@@ -40,9 +40,9 @@ class HTMLRadioField extends HTMLFormField {
 
        function getInputOOUI( $value ) {
                $options = array();
-               foreach ( $this->getOptions() as $label => $value ) {
+               foreach ( $this->getOptions() as $label => $data ) {
                        $options[] = array(
-                               'data' => $value,
+                               'data' => $data,
                                'label' => $this->mOptionsLabelsNotFromMessage ? new OOUI\HtmlSnippet( $label ) : $label,
                        );
                }
index 4efdfbf..597c27a 100644 (file)
@@ -5,7 +5,11 @@
 class HTMLSelectNamespace extends HTMLFormField {
        public function __construct( $params ) {
                parent::__construct( $params );
-               $this->mAllValue = isset( $this->mParams['all'] ) ? $this->mParams['all'] : 'all';
+
+               $this->mAllValue = array_key_exists( 'all', $params )
+                       ? $params['all']
+                       : 'all';
+
        }
 
        function getInputHTML( $value ) {
index 3e7acdf..81a29d0 100644 (file)
@@ -2,6 +2,9 @@
 
 /**
  * Select dropdown field, with an additional "other" textbox.
+ *
+ * HTMLComboboxField implements the same functionality using a single form field
+ * and should be used instead.
  */
 class HTMLSelectOrOtherField extends HTMLTextField {
        function __construct( $params ) {
index 60f02a1..c11449a 100644 (file)
@@ -108,9 +108,32 @@ class OOUIHTMLForm extends HTMLForm {
                return $html;
        }
 
+       protected function wrapFieldSetSection( $legend, $section, $attributes ) {
+               // to get a user visible effect, wrap the fieldset into a framed panel layout
+               $layout = new OOUI\PanelLayout( array(
+                       'expanded' => false,
+                       'padded' => true,
+                       'framed' => true,
+                       'infusable' => false,
+               ) );
+
+               $layout->appendContent(
+                       new OOUI\FieldsetLayout( array(
+                               'label' => $legend,
+                               'infusable' => false,
+                               'items' => array(
+                                       new OOUI\Widget( array(
+                                               'content' => new OOUI\HtmlSnippet( $section )
+                                       ) ),
+                               ),
+                       ) + $attributes )
+               );
+               return $layout;
+       }
+
        /**
         * Put a form section together from the individual fields' HTML, merging it and wrapping.
-        * @param OOUI\\FieldLayout[] $fieldsHtml
+        * @param OOUI\FieldLayout[] $fieldsHtml
         * @param string $sectionName
         * @param bool $anyFieldHasLabel Unused
         * @return string HTML
@@ -160,7 +183,12 @@ class OOUIHTMLForm extends HTMLForm {
                                $msg = $error;
                                $error = array();
                        }
-                       $error = $this->msg( $msg, $error )->parse();
+                       // if the error is already a message object, don't use it as a message key
+                       if ( !$msg instanceof Message ) {
+                               $error = $this->msg( $msg, $error )->parse();
+                       } else {
+                               $error = $msg->parse();
+                       }
                        $error = new OOUI\HtmlSnippet( $error );
                }
 
index 57084cb..904fde8 100644 (file)
@@ -73,7 +73,8 @@ abstract class DatabaseUpdater {
                'PopulateImageSha1',
                'FixExtLinksProtocolRelative',
                'PopulateFilearchiveSha1',
-               'PopulateBacklinkNamespace'
+               'PopulateBacklinkNamespace',
+               'FixDefaultJsonContentPages'
        );
 
        /**
index 1841670..b863adc 100644 (file)
@@ -164,7 +164,6 @@ abstract class Installer {
                'wgRightsIcon',
                'wgRightsText',
                'wgRightsUrl',
-               'wgMainCacheType',
                'wgEnableEmail',
                'wgEnableUserEmail',
                'wgEnotifUserTalk',
@@ -691,17 +690,6 @@ abstract class Installer {
                return Status::newGood();
        }
 
-       /**
-        * Exports all wg* variables stored by the installer into global scope.
-        */
-       public function exportVars() {
-               foreach ( $this->settings as $name => $value ) {
-                       if ( substr( $name, 0, 2 ) == 'wg' ) {
-                               $GLOBALS[$name] = $value;
-                       }
-               }
-       }
-
        /**
         * Environment check for DB types.
         * @return bool
index 5a2dd1a..b742074 100644 (file)
@@ -62,8 +62,8 @@ class LocalSettingsGenerator {
                                'wgLanguageCode', 'wgEnableEmail', 'wgEnableUserEmail', 'wgDiff3',
                                'wgEnotifUserTalk', 'wgEnotifWatchlist', 'wgEmailAuthentication',
                                'wgDBtype', 'wgSecretKey', 'wgRightsUrl', 'wgSitename', 'wgRightsIcon',
-                               'wgRightsText', 'wgMainCacheType', 'wgEnableUploads',
-                               'wgMainCacheType', '_MemCachedServers', 'wgDBserver', 'wgDBuser',
+                               'wgRightsText', '_MainCacheType', 'wgEnableUploads',
+                               '_MemCachedServers', 'wgDBserver', 'wgDBuser',
                                'wgDBpassword', 'wgUseInstantCommons', 'wgUpgradeKey', 'wgDefaultSkin',
                                'wgMetaNamespace', 'wgLogo',
                        ),
@@ -287,15 +287,15 @@ class LocalSettingsGenerator {
                $serverSetting = "";
                if ( array_key_exists( 'wgServer', $this->values ) && $this->values['wgServer'] !== null ) {
                        $serverSetting = "\n## The protocol and server name to use in fully-qualified URLs\n";
-                       $serverSetting .= "\$wgServer = \"{$this->values['wgServer']}\";\n";
+                       $serverSetting .= "\$wgServer = \"{$this->values['wgServer']}\";";
                }
 
-               switch ( $this->values['wgMainCacheType'] ) {
+               switch ( $this->values['_MainCacheType'] ) {
                        case 'anything':
                        case 'db':
                        case 'memcached':
                        case 'accel':
-                               $cacheType = 'CACHE_' . strtoupper( $this->values['wgMainCacheType'] );
+                               $cacheType = 'CACHE_' . strtoupper( $this->values['_MainCacheType'] );
                                break;
                        case 'none':
                        default:
@@ -334,7 +334,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 \$wgScriptPath = \"{$this->values['wgScriptPath']}\";
 ${serverSetting}
 
-## The relative URL path to the logo.  Make sure you change this from the default,
+## The URL path to static resources (images, scripts, etc.)
+\$wgResourceBasePath = \$wgScriptPath;
+
+## The URL path to the logo.  Make sure you change this from the default,
 ## or else you'll overwrite your logo when you upgrade!
 \$wgLogo = \"{$this->values['wgLogo']}\";
 
index 164cfab..770f493 100644 (file)
@@ -64,6 +64,10 @@ class MssqlUpdater extends DatabaseUpdater {
                                'patch-oi_major_mime-chemical.sql' ),
                        array( 'modifyField', 'filearchive', 'fa_major_mime',
                                'patch-fa_major_mime-chemical.sql' ),
+
+                       // 1.27
+                       array( 'dropTable', 'msg_resource_links' ),
+                       array( 'dropTable', 'msg_resource' ),
                );
        }
 
index e5c1a1d..cbe51f5 100644 (file)
@@ -354,7 +354,7 @@ class MysqlInstaller extends DatabaseInstaller {
                $s .= Xml::closeElement( 'div' );
 
                if ( $this->getVar( '_MysqlEngine' ) != 'MyISAM' ) {
-                       $s .= Xml::openElement( 'script', array( 'type' => 'text/javascript' ) );
+                       $s .= Xml::openElement( 'script' );
                        $s .= '$(\'#dbMyisamWarning\').hide();';
                        $s .= Xml::closeElement( 'script' );
                }
index aa60c01..add600d 100644 (file)
@@ -183,7 +183,6 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
                        array( 'doClFieldsUpdate' ),
                        array( 'doCollationUpdate' ),
-                       array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
                        array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
                        array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ),
                        array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ),
@@ -275,6 +274,10 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'dropTable', 'hitcounter' ),
                        array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
                        array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
+
+                       // 1.27
+                       array( 'dropTable', 'msg_resource_links' ),
+                       array( 'dropTable', 'msg_resource' ),
                );
        }
 
index 03dbd1c..d3c2184 100644 (file)
@@ -108,6 +108,10 @@ class OracleUpdater extends DatabaseUpdater {
                        array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
                        array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
 
+                       // 1.27
+                       array( 'dropTable', 'msg_resource_links' ),
+                       array( 'dropTable', 'msg_resource' ),
+
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
 
index 7414d92..7880557 100644 (file)
@@ -85,8 +85,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addTable', 'log_search', 'patch-log_search.sql' ),
                        array( 'addTable', 'l10n_cache', 'patch-l10n_cache.sql' ),
                        array( 'addTable', 'iwlinks', 'patch-iwlinks.sql' ),
-                       array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
-                       array( 'addTable', 'msg_resource_links', 'patch-msg_resource_links.sql' ),
                        array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
                        array( 'addTable', 'uploadstash', 'patch-uploadstash.sql' ),
                        array( 'addTable', 'user_former_groups', 'patch-user_former_groups.sql' ),
@@ -424,7 +422,11 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'dropTable', 'hitcounter' ),
                        array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
                        array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
-                       array( 'dropFkey', 'recentchanges', 'rc_cur_id' )
+                       array( 'dropFkey', 'recentchanges', 'rc_cur_id' ),
+
+                       // 1.27
+                       array( 'dropTable', 'msg_resource_links' ),
+                       array( 'dropTable', 'msg_resource' ),
                );
        }
 
@@ -512,7 +514,8 @@ END;
                if ( !$res ) {
                        return null;
                }
-               if ( !( $r = $this->db->fetchRow( $res ) ) ) {
+               $r = $this->db->fetchRow( $res );
+               if ( !$r ) {
                        return null;
                }
 
@@ -532,7 +535,8 @@ END;
                        if ( !$r2 ) {
                                return null;
                        }
-                       if ( !( $row2 = $this->db->fetchRow( $r2 ) ) ) {
+                       $row2 = $this->db->fetchRow( $r2 );
+                       if ( !$row2 ) {
                                return null;
                        }
                        $colnames[] = $row2[0];
@@ -555,7 +559,8 @@ END;
                                $this->db->addQuotes( $fkey )
                        )
                );
-               if ( !( $row = $this->db->fetchRow( $r ) ) ) {
+               $row = $this->db->fetchRow( $r );
+               if ( !$row ) {
                        return null;
                }
 
index 0de1fd7..5279c2d 100644 (file)
@@ -66,7 +66,6 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'dropIndex', 'iwlinks', 'iwl_prefix', 'patch-kill-iwl_prefix.sql' ),
                        array( 'addField', 'categorylinks', 'cl_collation', 'patch-categorylinks-better-collation.sql' ),
                        array( 'doCollationUpdate' ),
-                       array( 'addTable', 'msg_resource', 'patch-msg_resource.sql' ),
                        array( 'addTable', 'module_deps', 'patch-module_deps.sql' ),
                        array( 'dropIndex', 'archive', 'ar_page_revid', 'patch-archive_kill_ar_page_revid.sql' ),
                        array( 'addIndex', 'archive', 'ar_revid', 'patch-archive_ar_revid.sql' ),
@@ -144,6 +143,10 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'dropField', 'site_stats', 'ss_total_views', 'patch-drop-ss_total_views.sql' ),
                        array( 'dropField', 'page', 'page_counter', 'patch-drop-page_counter.sql' ),
                        array( 'modifyField', 'filearchive', 'fa_deleted_reason', 'patch-editsummary-length.sql' ),
+
+                       // 1.27
+                       array( 'dropTable', 'msg_resource_links' ),
+                       array( 'dropTable', 'msg_resource' ),
                );
        }
 
index 67a4def..e8433f2 100644 (file)
@@ -159,7 +159,6 @@ class WebInstaller extends Installer {
                        $this->settings = $session['settings'] + $this->settings;
                }
 
-               $this->exportVars();
                $this->setupLanguage();
 
                if ( ( $this->getVar( '_InstallDone' ) || $this->getVar( '_UpgradeDone' ) )
@@ -387,15 +386,19 @@ class WebInstaller extends Installer {
        }
 
        /**
-        * Show an error message in a box. Parameters are like wfMessage().
-        * @param string $msg
+        * Show an error message in a box. Parameters are like wfMessage(), or
+        * alternatively, pass a Message object in.
+        * @param string|Message $msg
         */
        public function showError( $msg /*...*/ ) {
-               $args = func_get_args();
-               array_shift( $args );
-               $args = array_map( 'htmlspecialchars', $args );
-               $msg = wfMessage( $msg, $args )->useDatabase( false )->plain();
-               $this->output->addHTML( $this->getErrorBox( $msg ) );
+               if ( !( $msg instanceof Message ) ) {
+                       $args = func_get_args();
+                       array_shift( $args );
+                       $args = array_map( 'htmlspecialchars', $args );
+                       $msg = wfMessage( $msg, $args );
+               }
+               $text = $msg->useDatabase( false )->plain();
+               $this->output->addHTML( $this->getErrorBox( $text ) );
        }
 
        /**
index 0d11463..0fcda7d 100644 (file)
@@ -830,6 +830,8 @@ class WebInstallerName extends WebInstallerPage {
         * @return bool
         */
        public function submit() {
+               global $wgPasswordPolicy;
+
                $retVal = true;
                $this->parent->setVarsFromRequest( array( 'wgSitename', '_NamespaceType',
                        '_AdminName', '_AdminPassword', '_AdminPasswordConfirm', '_AdminEmail',
@@ -906,14 +908,21 @@ class WebInstallerName extends WebInstallerPage {
                $pwd = $this->getVar( '_AdminPassword' );
                $user = User::newFromName( $cname );
                if ( $user ) {
-                       $status = $user->checkPasswordValidity( $pwd, 'create' );
-                       $valid = $status->isGood() ? true : $status->getMessage()->escaped();
+                       $upp = new UserPasswordPolicy(
+                               $wgPasswordPolicy['policies'],
+                               $wgPasswordPolicy['checks']
+                       );
+                       $status = $upp->checkUserPasswordForGroups(
+                               $user,
+                               $pwd,
+                               array( 'bureaucrat', 'sysop' )  // per Installer::createSysop()
+                       );
+                       $valid = $status->isGood() ? true : $status->getMessage();
                } else {
                        $valid = 'config-admin-name-invalid';
                }
                if ( strval( $pwd ) === '' ) {
-                       # $user->getPasswordValidity just checks for $wgMinimalPasswordLength.
-                       # This message is more specific and helpful.
+                       // Provide a more specific and helpful message if password field is left blank
                        $msg = 'config-admin-password-blank';
                } elseif ( $pwd !== $this->getVar( '_AdminPasswordConfirm' ) ) {
                        $msg = 'config-admin-password-mismatch';
@@ -921,7 +930,7 @@ class WebInstallerName extends WebInstallerPage {
                        $msg = $valid;
                }
                if ( $msg !== false ) {
-                       call_user_func_array( array( $this->parent, 'showError' ), (array)$msg );
+                       call_user_func( array( $this->parent, 'showError' ), $msg );
                        $this->setVar( '_AdminPassword', '' );
                        $this->setVar( '_AdminPasswordConfirm', '' );
                        $retVal = false;
@@ -1131,7 +1140,7 @@ class WebInstallerOptions extends WebInstallerPage {
                $caches[] = 'memcached';
 
                // We'll hide/show this on demand when the value changes, see config.js.
-               $cacheval = $this->getVar( 'wgMainCacheType' );
+               $cacheval = $this->getVar( '_MainCacheType' );
                if ( !$cacheval ) {
                        // We need to set a default here; but don't hardcode it
                        // or we lose it every time we reload the page for validation
@@ -1147,7 +1156,7 @@ class WebInstallerOptions extends WebInstallerPage {
                        // For grep: The following messages are used as the item labels:
                        // config-cache-none, config-cache-accel, config-cache-memcached
                        $this->parent->getRadioSet( array(
-                               'var' => 'wgMainCacheType',
+                               'var' => '_MainCacheType',
                                'label' => 'config-cache-options',
                                'itemLabelPrefix' => 'config-cache-',
                                'values' => $caches,
@@ -1285,7 +1294,7 @@ class WebInstallerOptions extends WebInstallerPage {
                $this->parent->setVarsFromRequest( array( '_RightsProfile', '_LicenseCode',
                        'wgEnableEmail', 'wgPasswordSender', 'wgEnableUploads', 'wgLogo',
                        'wgEnableUserEmail', 'wgEnotifUserTalk', 'wgEnotifWatchlist',
-                       'wgEmailAuthentication', 'wgMainCacheType', '_MemCachedServers',
+                       'wgEmailAuthentication', '_MainCacheType', '_MemCachedServers',
                        'wgUseInstantCommons', 'wgDefaultSkin' ) );
 
                $retVal = true;
@@ -1351,7 +1360,7 @@ class WebInstallerOptions extends WebInstallerPage {
                }
                $this->parent->setVar( '_Extensions', $extsToInstall );
 
-               if ( $this->getVar( 'wgMainCacheType' ) == 'memcached' ) {
+               if ( $this->getVar( '_MainCacheType' ) == 'memcached' ) {
                        $memcServers = explode( "\n", $this->getVar( '_MemCachedServers' ) );
                        if ( !$memcServers ) {
                                $this->parent->showError( 'config-memcache-needservers' );
index 21a4fa3..eaa0537 100644 (file)
@@ -81,5 +81,5 @@
        "config-help": "Ayuda",
        "config-nofile": "Nun pudo atopase'l ficheru \"$1\". ¿Desaniciose?",
        "mainpagetext": "'''MediaWiki instalóse correchamente.'''",
-       "mainpagedocfooter": "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar esti software wiki.\n\n== Empecipiando ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de les opciones de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar el software wiki.\n\n== Primeros pasos ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de les opciones de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ EMF de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de llanzamientos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Depriende como combatir la puxarra na to wiki]"
 }
index ba0ad68..0e94a50 100644 (file)
        "config-page-name": "آد",
        "config-page-options": "سئچیملر",
        "config-page-install": "قور",
+       "config-page-complete": "قورتاردی!",
+       "config-page-restart": "قورماغی یئنی‌دن باشلات",
        "config-page-readme": "منی اوخو",
        "config-env-php": "PHP $1 قورولوبدور.",
        "config-env-hhvm": "HHVM $1 قورولوبدور.",
+       "config-using-server": "«<nowiki>$1</nowiki>» سِروِر آدی ایشلنیر.",
+       "config-using-uri": "«<nowiki>$1$2</nowiki>» سِروِر آدرسی ایشلنیر.",
+       "config-site-name": "ویکی آدی:",
+       "config-ns-generic": "پروژه",
+       "config-admin-box": "ایداره‌چی حسابی",
+       "config-admin-name": "ایشلدن آدینیز:",
+       "config-admin-password": "رمز:",
+       "config-admin-email": "ایمیل آدرسی:",
        "config-help": "کؤمک",
        "config-help-tooltip": "گئنیشلتمک اوچون کلیک ائدین",
        "config-nofile": "«$1» فایلی تاپیلانمادی. سیلینیبدیرمی؟"
index 95e2ec4..06e38d5 100644 (file)
        "config-db-install-account": "Імя карыстальніка для ўсталяваньня",
        "config-db-username": "Імя карыстальніка базы зьвестак:",
        "config-db-password": "Пароль базы зьвестак:",
-       "config-db-password-empty": "Калі ласка, увядзіце пароль для новага карыстальніка базы зьвестак: $1.\nМагчыма стварыць карыстальніка без паролю, але гэта небясьпечна.",
-       "config-db-username-empty": "Вы мусіце ўвесьці значэньне парамэтру «{{int:config-db-username}}»",
        "config-db-install-username": "Увядзіце імя карыстальніка, якое будзе выкарыстоўвацца для злучэньня з базай зьвестак падчас усталяваньня. Гэта не назва рахунку MediaWiki; гэта імя карыстальніка Вашай базы зьвестак.",
        "config-db-install-password": "Увядзіце пароль, які будзе выкарыстоўвацца для злучэньня з базай зьвестак падчас усталяваньня. Гэта не пароль рахунку MediaWiki; гэта пароль Вашай базы зьвестак.",
        "config-db-install-help": "Увядзіце імя карыстальніка і пароль, якія будуць выкарыстаныя для далучэньня да базы зьвестак падчас працэсу ўсталяваньня.",
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
        "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў].",
        "mainpagetext": "'''MediaWiki пасьпяхова ўсталяваная.'''",
-       "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]"
+       "mainpagedocfooter": "Глядзіце [//meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца з спамам у вашай вікі]"
 }
index 196f1c4..c1f641c 100644 (file)
@@ -5,6 +5,7 @@
                        "Ibrahim khashrowdi"
                ]
        },
+       "config-information": "مالومات",
        "config-your-language": "شمی زبان:",
        "config-your-language-help": "یک زبانی ئا په ایستیپاده ئی خاتیرا انتخاب بکنیت.",
        "config-wiki-language": "ویکی ئی زبان:",
        "config-page-options": "تنزیمات",
        "config-page-install": "لچینتین",
        "config-page-complete": "کامل!",
+       "config-page-readme": "نا بوان",
        "config-sidebar": "* [//www.mediawiki.org میڈیاویکی ئی بُنیادین تاکدیم]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents کار زوروکانی کومک و رهنمایی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents مدیر ئی رهنمایی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ رواجین سوج و سوالان]\n----\n* <doclink href=Readme>نا بووان</doclink>\n* <doclink href=ReleaseNotes>شینک بوته ئین یاداشتان</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
        "config-env-good": "محیط بررسی بوته.\nشما ئه توانیت میڈیاویکی ئا نصب کنیت.",
+       "config-apc": "[http://www.php.net/apc APC] نصب بوت.",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب بوت.",
        "config-ns-generic": "پروژه",
-       "config-ns-other-default": "نی ویکی"
+       "config-ns-other-default": "نی ویکی",
+       "config-admin-password": "چیهر گال یا پاسورد:",
+       "config-profile-wiki": "ویکی یی پاچ کورتین",
+       "config-help": "کومک"
 }
index f40bc3e..eba9807 100644 (file)
        "config-install-keys": "গোপন কি তৈরি",
        "config-help": "সাহায্য",
        "mainpagetext": "'''মিডিয়াউইকি সফলভাবে ইন্সটল করা হয়েছে।'''",
-       "mainpagedocfooter": "কী ভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [//meta.wikimedia.org/wiki/Help:Contents ব্যবহারকারী সহায়িকা] দেখুন।\n\n== কোথা থেকে শুরু করবেন ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]"
+       "mainpagedocfooter": "কীভাবে উইকি সফটওয়্যারটি ব্যবহারকার করবেন, তা জানতে [//meta.wikimedia.org/wiki/Help:Contents ব্যবহারকারী সহায়িকা] দেখুন।\n\n== কোথা থেকে শুরু করবেন ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings কনফিগারেশন সেটিংস তালিকা]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ প্রশ্নোত্তরে মিডিয়াউইকি]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি মুক্তির মেইলিং লিস্ট]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources আপনার ভাষার জন্য মিডিয়াউইকি স্থানীয়করণ করুন]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam আপনার উইকিতে স্প্যামের সাথে লড়াই করার উপায় সম্পর্কে জানুন]"
 }
index ee33109..4cbd0cc 100644 (file)
@@ -9,14 +9,15 @@
                        "Jmarchn",
                        "Alvaro Vidal-Abarca",
                        "ESM",
-                       "Xavier Dengra"
+                       "Xavier Dengra",
+                       "Jaumeortola"
                ]
        },
        "config-desc": "L'instal·lador del MediaWiki",
        "config-title": "Instal·lació del MediaWiki $1",
        "config-information": "Informació",
        "config-localsettings-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>. \nPer tal d'actualitzar la instal·lació, introduïu el valor de <code>$wgUpgradeKey</code> en el quadre a continuació. El trobareu a <code>LocalSettings.php</code>.",
-       "config-localsettings-cli-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>.\nPer tal d'actualitzar la instal·lació, executeu <code>update.php</code>.",
+       "config-localsettings-cli-upgrade": "S'ha detectat un fitxer <code>LocalSettings.php</code>.\nPer actualitzar la instal·lació, executeu <code>update.php</code>.",
        "config-localsettings-key": "Clau d'actualització:",
        "config-localsettings-badkey": "La clau que heu proporcionat no és correcta.",
        "config-upgrade-key-missing": "S'ha detectat una instal·lació ja existent del MediaWiki.\nPer actualitzar-la, poseu la línia següent al final de <code>LocalSettings.php</code>:\n\n$1",
@@ -87,7 +88,7 @@
        "config-db-wiki-account": "Compte d'usuari per al funcionament normal",
        "config-db-wiki-help": "Introduïu el nom d'usuari i la contrasenya que s'utilitzarà per connectar-se a la base de dades durant l'operació normal del wiki.\nSi el compte no existeix, i el compte d'instal·lació té prou privilegis, es crearà aquest compte d'usuari amb els privilegis mínims necessaris per operar el wiki.",
        "config-db-prefix": "Prefix de la base de dades:",
-       "config-db-prefix-help": "Si heu de compartir una base de dades entre diversos wikis, o entre el MediaWiki i una altra aplicació web, podeu afegir un prefix al tots els noms de taula per tal d'evitar conflictes.\nNo utilitzeu espais.\n\nAquest camp acostuma a quedar en blanc.",
+       "config-db-prefix-help": "Si heu de compartir una base de dades entre diversos wikis, o entre el MediaWiki i una altra aplicació web, podeu afegir un prefix al tots els noms de taula per evitar conflictes.\nNo utilitzeu espais.\n\nAquest camp acostuma a quedar en blanc.",
        "config-db-charset": "Joc de caràcters de la base de dades",
        "config-charset-mysql5-binary": "Binari de MySQL 4.1/5.0",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
        "config-missing-db-name": "Heu d'introduir un valor per a «{{int:config-db-name}}».",
        "config-missing-db-host": "Heu d'introduir un valor per a «{{int:config-db-host}}».",
        "config-missing-db-server-oracle": "Heu d’introduir un valor per a «{{int:config-db-host-oracle}}».",
+       "config-invalid-db-name": "El nom de la base de dades, «$1», no és vàlid.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
+       "config-invalid-db-prefix": "El prefix de la base de dades, «$1», no és vàlid.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
        "config-connection-error": "$1.\n\nComproveu el servidor central, el nom d'usuari i la contrasenya i torneu-ho a provar.",
+       "config-invalid-schema": "L’esquema «$1» no és vàlid per al MediaWiki.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
        "config-db-sys-create-oracle": "L'instal·lador només accepta emprar un compte SYSDBA per a la creació d'un nou compte.",
        "config-db-sys-user-exists-oracle": "El compte d’usuari «$1» ja existeix. SYSDBA només es pot fer servir per crear comptes nous.",
        "config-postgres-old": "Cal el PostgreSQL $1 o posterior. Teniu el $2.",
        "config-mssql-old": "Cal utilitzar el Microsoft SQL Server $1 o posterior. Teniu la versió $2.",
+       "config-sqlite-name-help": "Trieu un nom per identificar el wiki.\nNo feu servir espais ni guionets.\nAquest nom s’utilitzarà per a denominar el fitxer de les dades de l’SQLite.",
        "config-sqlite-mkdir-error": "S'ha produït un error en crear el directori de dades «$1».\nComproveu la ubicació i torneu-ho a provar.",
-       "config-sqlite-dir-unwritable": "No s'ha pogut escriure al directori «$1».\nCanvieu els seus permisos per tal que el servidor web pugui escriure-hi i torneu-ho a provar.",
+       "config-sqlite-dir-unwritable": "No s'ha pogut escriure al directori «$1».\nCanvieu els permisos perquè el servidor web pugui escriure-hi i torneu-ho a provar.",
        "config-sqlite-connection-error": "$1. \n\nComproveu el directori de dades i el nom de la base de dades a continuació i torneu-ho a provar.",
        "config-sqlite-readonly": "El fitxer <code>$1</code> no es pot escriure.",
        "config-sqlite-cant-create-db": "No s'ha pogut crear el fitxer de base de dades <code>$1</code>.",
+       "config-can-upgrade": "Hi ha taules del MediaWiki en aquesta base de dades.\nPer actualitzar-les al MediaWiki $1, feu clic a <strong>Continua</strong>.",
        "config-upgrade-done-no-regenerate": "S'ha completat l'actualització.\n\nJa podeu [$1 començar a utilitzar el wiki].",
        "config-regenerate": "Torna a generar el LocalSettings.php →",
        "config-show-table-status": "La consulta <code>SHOW TABLE STATUS</code> ha fallat!",
        "config-upload-settings": "Imatges i càrregues de fitxers",
        "config-upload-enable": "Habilita la càrrega de fitxers",
        "config-upload-deleted": "Directori pels arxius suprimits:",
-       "config-upload-deleted-help": "Trieu un directori on arxivar els fitxers suprimits.\nIdealment no hauria de ser accessible des del web.",
+       "config-upload-deleted-help": "Trieu un directori per a arxivar els fitxers suprimits.\nIdealment no hauria de ser accessible des del web.",
        "config-logo": "URL del logo:",
        "config-instantcommons": "Habilita Instant Commons",
        "config-cc-error": "El selector de llicència Creative Commons no ha donat cap resultat.\nIntroduïu la llicència manualment.",
        "config-skins-missing": "No s'ha trobat cap tema; MediaWiki utilitzarà el tema per defecte fins que hi instal·leu alguns adequats.",
        "config-skins-must-enable-some": "Heu de triar com a mínim un tema per habilitar.",
        "config-skins-must-enable-default": "Cal habilitar el tema triat per defecte.",
+       "config-install-begin": "En fer clic a «{{int:config-continue}}» s’iniciarà la instal·lació del MediaWiki. Si encara voleu fer canvis, feu clic a «{{int:config-back}}».",
        "config-install-step-done": "fet",
        "config-install-step-failed": "ha fallat",
        "config-install-extensions": "S'estan incloent les extensions",
index abcb333..9ddbfa4 100644 (file)
        "config-db-install-account": "Uživatelský účet pro instalaci",
        "config-db-username": "Databázové uživatelské jméno:",
        "config-db-password": "Databázové heslo:",
-       "config-db-password-empty": "Zadejte heslo pro nového databázového uživatele: $1.\nPřestože může jít zakládat nové uživatele i bez hesel, není to bezpečné.",
-       "config-db-username-empty": "Musíte zadat hodnotu pro „{{int:config-db-username}}“.",
        "config-db-install-username": "Zadejte uživatelské jméno, které se použije pro připojení k databázi v průběhu instalace.\nToto není jméno uživatelského účtu MediaWiki; toto je uživatelské jméno k vaší databázi.",
        "config-db-install-password": "Zadejte heslo, které se použije pro připojení k databázi v průběhu instalace.\nToto není heslo uživatelského účtu MediaWiki; toto je heslo k vaší databázi.",
        "config-db-install-help": "Zadejte uživatelské jméno a heslo, které se použijí pro připojení k databázi v průběhu instalace.",
        "config-nofile": "Soubor „$1“ nelze nalézt. Byl smazán?",
        "config-extension-link": "Věděli jste, že vaše wiki podporuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions rozšíření]?\n\nMůžete si prohlédnout [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category seznam rozšíření po kategoriích].",
        "mainpagetext": "'''MediaWiki byla úspěšně nainstalována.'''",
-       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]"
+       "mainpagedocfooter": "[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak používat MediaWiki.\n\n== Začínáme ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Nastavení konfigurace]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Často kladené otázky o MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce E-mailová konference oznámení MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Překlad MediaWiki do vašeho jazyka]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Naučte se bojovat se spamem na vaší wiki]"
 }
index ff7afaa..75fbbfc 100644 (file)
@@ -11,5 +11,5 @@
        "config-information": "Gwybodaeth",
        "config-localsettings-upgrade": "Rydym wedi canfod ffeil <code>LocalSettings.php</code>.\nI uwchraddio'r gosodiad yma, rhowch fanylion y<code>$wgUpgradeKey</code> yn y blwch isod.\nFe'i cewch yn <code>LocalSettings.php</code>.",
        "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.\n\n==Cychwyn arni==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Rhestr postio datganiadau MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Cyfieithu MediaWici i'ch iaith chi]"
+       "mainpagedocfooter": "\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Rhestr osodiadau wrth gyflunio]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Cwestiynau poblogaidd ar MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lleoleiddiwch MediaWiki ar gyfer eich iaith]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Dysgwch sut i ymladd sbam ar eich wici]"
 }
index 4840533..3a9bb82 100644 (file)
@@ -49,6 +49,7 @@
        "config-header-sqlite": "SQLite-indstillinger",
        "config-header-oracle": "Oracle-indstillinger",
        "config-invalid-db-type": "Ugyldig databasetype",
+       "config-email-usertalk": "Aktiver notifikationer for brugerdiskussionsside",
        "mainpagetext": "'''MediaWiki er nu installeret.'''",
        "mainpagedocfooter": "Se [//meta.wikimedia.org/wiki/Help:Contents brugervejledningen] for oplysninger om brugen af wikiprogrammellet.\n\n== At komme i gang ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listen over opsætningsmuligheder]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki ofte stillede spørgsmål]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Postliste angående udgivelser af MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Oversæt MediaWiki til dit sprog]"
 }
index 7c68382..c23a268 100644 (file)
        "config-db-install-account": "Benutzerkonto für die Installation",
        "config-db-username": "Name des Datenbankbenutzers:",
        "config-db-password": "Passwort des Datenbankbenutzers:",
-       "config-db-password-empty": "Bitte ein Passwort für den neuen Datenbankbenutzer angeben: $1.\nObwohl es möglich ist, Datenbankbenutzer ohne Passwort anzulegen, so ist dies nicht sicher.",
-       "config-db-username-empty": "Du musst einen Wert für „{{int:config-db-username}}“ eingeben",
        "config-db-install-username": "Den Benutzernamen angeben, der für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um den Benutzernamen für das MediaWiki-Konto, sondern um den Benutzernamen der vorgesehenen Datenbank.",
        "config-db-install-password": "Das Passwort angeben, das für die Verbindung mit der Datenbank während des Installationsvorgangs genutzt werden soll. Es handelt sich dabei nicht um das Passwort für das MediaWiki-Konto, sondern um das Passwort der vorgesehenen Datenbank.",
        "config-db-install-help": "Benutzername und Passwort, die während des Installationsvorgangs, für die Verbindung mit der Datenbank, genutzt werden sollen, sind nun anzugeben.",
        "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?",
        "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.",
        "mainpagetext": "'''MediaWiki wurde erfolgreich installiert.'''",
-       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]"
+       "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [//meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]"
 }
index 8109c2e..44c6b14 100644 (file)
        "config-desc": "Το πρόγραμμα εγκατάστασης για το MediaWiki",
        "config-title": "Εγκατάσταση MediaWiki $1",
        "config-information": "Πληροφορίες",
+       "config-localsettings-upgrade": "Εντοπίστηκε αρχείο <code>LocalSettings.php</code>.\nΓια να αναβαθμίσετε αυτή την εγκατάσταση, παρακαλούμε να εισαγάγετε την τιμή του <code>$wgUpgradeKey</code> στο παρακάτω πλαίσιο.\nΘα το βρείτε στο <code>LocalSettings.php</code>.",
+       "config-localsettings-cli-upgrade": "Ένα αρχείο <code>LocalSettings.php</code> έχει εντοπιστεί.\nΓια να αναβαθμίσετε αυτή την εγκατάσταση, εκτελέστε το <code>update.php</code> αντ' αυτού.",
        "config-localsettings-key": "Κλειδί αναβάθμισης:",
        "config-localsettings-badkey": "Το κλειδί που δώσατε είναι εσφαλμένο.",
        "config-upgrade-key-missing": "Έχει εντοπιστεί μια υπάρχουσα εγκατάσταση του MediaWiki.\nΓια να αναβαθμίσετε αυτήν την εγκατάσταση, παρακαλούμε να βάλετε την ακόλουθη γραμμή στο κάτω μέρος του <code>LocalSettings.php</code> σας:\n\n$1",
+       "config-localsettings-incomplete": "Το υπάρχον <code>LocalSettings.php</code> φαίνεται να είναι ελλιπές.\nΤο $1 μεταβλητή δεν έχει οριστεί.\nΠαρακαλούμε να αλλάξετε  το <code>LocalSettings.php</code> έτσι ώστε αυτή η μεταβλητή έχει οριστεί, και κάντε κλικ στο \"{{int:Config-continue}}\".",
        "config-session-error": "Σφάλμα κατά την εκκίνηση συνεδρίας: $1",
+       "config-session-expired": "Τα δεδομένα συνόδου φαίνεται να έχουν λήξει.\nΣυνεδρίες έχουν ρυθμιστεί για μια διάρκεια ζωής $1.\nΜπορείτε να αυξήσετε αυτό βάζοντας  <code>session.gc_maxlifetime</code> στο php.ini.\nΚάντε επανεκκίνηση της διαδικασίας εγκατάστασης.",
        "config-your-language": "Η γλώσσα σας:",
        "config-your-language-help": "Επιλέξτε μία γλώσσα για τη διαδικασία της εγκατάστασης.",
        "config-wiki-language": "Γλώσσα του wiki:",
        "config-env-hhvm": "Το HHVM $1 είναι εγκατεστημένο.",
        "config-unicode-using-intl": "Χρησιμοποιώντας την [http://pecl.php.net/intl επέκταση intl PECL] για κανονικοποίηση Unicode.",
        "config-unicode-pure-php-warning": "<strong>Προειδοποίηση:</strong> Η [http://pecl.php.net/intl επέκταση intl PECL] δεν είναι διαθέσιμη για να χειριστεί την κανονικοποίηση Unicode, επιστρέφουμε στην αργή αμιγώς PHP εφαρμογή.\nΕάν λειτουργείτε έναν ιστότοπο υψηλής επισκεψιμότητας, θα πρέπει να ρίξετε μια ματιά στην [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations κανονικοποίηση Unicode].",
+       "config-memory-raised": "Το  <code>memory_limit</code> της PHP είναι  $1 και αυξήθηκε σε  $2.",
+       "config-memory-bad": "<strong>Προειδοποίηση:</strong> η <code>memory_limit</code> της PHP είναι $1.\nΑυτό είναι πιθανώς πολύ χαμηλό.\n\nΗ εγκατάσταση ενδέχεται να αποτύχει!",
        "config-xcache": "[http://xcache.lighttpd.net/ Το XCache] είναι εγκατεστημένο",
        "config-apc": "Το [http://www.php.net/apc APC] είναι εγκατεστημένο",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp Το WinCache] είναι εγκατεστημένο",
        "config-diff3-bad": "Το GNU diff3 δεν βρέθηκε.",
+       "config-git": "Βρέθηκε η Git έκδοση λογισμικού ελέγχου: <code>$1</code>.",
+       "config-git-bad": "Η Git έκδοση του λογισμικού ελέγχου δε βρέθηκε.",
+       "config-no-uri": "<strong>Σφάλμα:</strong> Δεν μπόρεσε να καθορίσει το τρέχον URI.\nΗ εγκατάσταση ματαιώθηκε.",
+       "config-using-server": "Χρησιμοποιώντας το όνομα του διακομιστή \"<nowiki>$1</nowiki>\".",
+       "config-using-uri": "Χρησιμοποιώντας την διεύθυνση URL του διακομιστή \"<nowiki>$1$2</nowiki>\".",
+       "config-brokenlibxml": "Το σύστημά σας έχει ένα συνδυασμό εκδόσεων της PHP και libxml2 που είναι προβληματικές και μπορεί να προκαλέσει κρυμμένα στοιχεία διαφθοράς στο MediaWiki και άλλες εφαρμογές web.\nΑναβαθμίστε σε libxml2 2.7.3 ή μεταγενέστερο ([https://bugs.php.net/bug.php?id=45996 bug κατατεθεί με την PHP]).\nΗ εγκατάσταση ματαιώθηκε.",
        "config-db-type": "Τύπος βάσης δεδομένων:",
        "config-db-host": "Φιλοξενία βάσης δεδομένων:",
        "config-db-host-oracle": "Βάση δεδομένων TNS:",
        "config-db-install-account": "Λογαριασμός χρήστη για την εγκατάσταση",
        "config-db-username": "Όνομα χρήστη βάσης δεδομένων:",
        "config-db-password": "Κωδικός πρόσβασης βάσης δεδομένων:",
+       "config-db-account-lock": "Χρησιμοποιήστε το ίδιο όνομα χρήστη και κωδικό πρόσβασης στη διάρκεια της κανονικής λειτουργίας",
        "config-db-wiki-account": "Λογαριασμός χρήστη για κανονική λειτουργία",
        "config-db-prefix": "Πρόθεμα πίνακα βάσης δεδομένων:",
        "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": "UTF-8 συμβατό προς τα πίσω με MySQL 4.0",
+       "config-mysql-old": "Απαιτείται Microsoft SQL Server $1 ή νεότερο. Εσείς έχετε $2.",
        "config-db-port": "Θύρα βάσης δεδομένων:",
+       "config-db-schema": "Σχήμα για MediaWiki:",
+       "config-db-schema-help": "Αυτό το σχήμα συνήθως θα είναι εντάξει.\nΆλλαξε το μόνο αν ξέρεις ότι το χρειάζεσαι.",
+       "config-pg-test-error": "Δεν μπορεί να συνδεθεί στη βάση δεδομένων <strong>$1</strong>: $2",
+       "config-oracle-temp-ts": "Προσωρινό tablespace:",
        "config-type-mysql": "MySQL (ή συμβατό)",
+       "config-type-postgres": "PostgreSQL",
+       "config-type-sqlite": "SQLite",
+       "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
+       "config-support-info": "To MediaWiki υποστηρίζει τα ακόλουθα συστήματα βάσεων δεδομένων:\n\n$1\n\nΑν δε βλέπεις στο σύστημα βάσεων δεδομένων που θέλεις να χρησιμοποιήσεις να υπάρχει παρακάτω, τότε ακολούθησε τις οδηγίες που δίνονται παραπάνω για να ενεργοποιήσεις την υποστήριξη.",
        "config-header-mysql": "Ρυθμίσεις MySQL",
        "config-header-postgres": "Ρυθμίσεις PostgreSQL",
        "config-header-sqlite": "Ρυθμίσεις SQLite",
        "config-missing-db-host": "Πρέπει να εισαγάγετε μια τιμή για \"{{int:config-db-host}}\".",
        "config-missing-db-server-oracle": "Πρέπει να εισαγάγετε μια τιμή για \"{{int:config-db-host-oracle}}\".",
        "config-connection-error": "$1.\n\nΕλέγξτε τη διεύθυνση, το όνομα χρήστη και τον κωδικό πρόσβασης και προσπαθήστε ξανά.",
-       "config-mssql-old": "Απαιτείται Microsoft SQL Server $1 ή νεώτερο. Εσείς έχετε $2.",
+       "config-db-sys-user-exists-oracle": "Ο λογαριασμός χρήστη \"$1\" υπάρχει ήδη. Το SYSDBA μπορεί να χρησιμοποιηθεί μόνο για τη δημιουργία ενός νέου λογαριασμού!",
+       "config-postgres-old": "Απαιτείται PostgreSQL $1 ή νεότερο. Εσείς έχετε $2.",
+       "config-mssql-old": "Απαιτείται Microsoft SQL Server $1 ή νεότερο. Εσείς έχετε $2.",
        "config-sqlite-readonly": "Το αρχείο <code>$1</code> δεν είναι εγγράψιμο.",
        "config-sqlite-cant-create-db": "Δεν ήταν δυνατή η δημιουργία του αρχείου βάσης δεδομένων <code>$1</code>.",
+       "config-upgrade-done-no-regenerate": "Η αναβάθμιση ολοκληρώθηκε.\n\nΜπορείτε τώρα να [$1 ξεκινήσετε να χρησιμοποιείτε το wiki σας].",
        "config-regenerate": "Αναδημιουργία LocalSettings.php →",
        "config-db-web-account": "Λογαριασμός βάσης δεδομένων για πρόσβαση ιστού",
+       "config-db-web-account-same": "Χρήση του ίδιου λογαριασμού για την εγκατάσταση",
        "config-mysql-engine": "Μηχανή αποθήκευσης:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-admin-password": "Κωδικός πρόσβασης:",
        "config-admin-password-confirm": "Επανάληψη κωδικού πρόσβασης:",
        "config-admin-name-blank": "Εισαγάγετε όνομα χρήστη διαχειριστή.",
+       "config-admin-name-invalid": "Το συγκεκριμένο όνομα χρήστη  \"<nowiki>$1</nowiki>\" δεν είναι έγκυρο. Δώστε ένα διαφορετικό όνομα χρήστη.",
+       "config-admin-password-blank": "Εισαγάγετε κωδικό για το λογαριασμό διαχειριστή.",
        "config-admin-password-mismatch": "Οι δύο κωδικοί πρόσβασης που εισηγάγατε δεν ταιριάζουν.",
        "config-admin-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "config-admin-error-bademail": "Έχετε εισαγάγει μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου.",
index 1eb8e03..ac3178f 100644 (file)
        "config-nofile": "File \"$1\" could not be found. Has it been deleted?",
        "config-extension-link": "Did you know that your wiki supports [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYou can browse [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category] or the [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] to see the full list of extensions.",
        "mainpagetext": "<strong>MediaWiki has been successfully installed.</strong>",
-       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]"
+       "mainpagedocfooter": "Consult the [//meta.wikimedia.org/wiki/Help:Contents User's Guide] for information on using the wiki software.\n\n== Getting started ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 9f6f22c..bbab9a1 100644 (file)
        "config-nofile": "El archivo \"$1\" no se pudo encontrar. ¿Se ha eliminado?",
        "config-extension-link": "¿Sabías que tu wiki admite [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensiones]?\n\nPuedes navegar por las [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category categorías] o visitar el [//www.mediawiki.org/wiki/Extension_Matrix centro de extensiones] para ver una lista completa.",
        "mainpagetext": "<strong>MediaWiki se ha instalado con éxito.</strong>",
-       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Help:Contents/es guía del usuario] para obtener información sobre el uso del software wiki.\n\n== Primeros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de ajustes de configuración]\n* [//www.mediawiki.org/wiki/Manual:FAQ/es Preguntas frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de publicación de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Traducir MediaWiki en tu idioma]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprende cómo combatir el spam en tu wiki]"
 }
index 57140d3..75475ad 100644 (file)
@@ -10,6 +10,9 @@
        "config-desc": "MediaWiki instalatzailea",
        "config-title": "MediaWiki $1 instalazioa",
        "config-information": "Informazioa",
+       "config-localsettings-upgrade": "<code>LocalSettings.php</code> fitxategi bat detektatu da.\nInstalazioa eguneratzeko, mesedez, sar ezazu <code>$wgUpgradeKey</code> balioa beheko koadroan.\n<code>LocalSettings.php</code> fitxategian aurkituko duzu.",
+       "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code> fitxategi bat detektatu da.\nInstalazioa eguneratzeko, exekuta ezazu <code>update.php</code>, mesedez",
+       "config-localsettings-key": "Eguneratze-gakoa:",
        "config-session-error": "Saio hasierako errorea: $1",
        "config-your-language": "Zure hizkuntza:",
        "config-your-language-help": "Aukeratu instalazio prozesuan erabiliko den hizkuntza",
@@ -19,6 +22,7 @@
        "config-page-language": "Hizkuntza",
        "config-page-welcome": "Ongi etorri MediaWikira!",
        "config-page-dbconnect": "Datu-basera konektatu",
+       "config-page-upgrade": "Oraingo instalazioa eguneratu",
        "config-page-dbsettings": "Datu-basearen ezarpenak",
        "config-page-name": "Izena",
        "config-page-options": "Aukerak",
        "config-page-complete": "Bukatua!",
        "config-page-restart": "Instalazioa berriz hasi",
        "config-page-readme": "Irakur nazazu",
+       "config-page-releasenotes": "Bertsioko oharrak",
        "config-page-copying": "Kopiatzea",
        "config-page-upgradedoc": "Eguneratu",
+       "config-page-existingwiki": "Existitzen den wikia",
        "config-restart": "Bai, berriz hasi",
        "config-sidebar": "* [//www.mediawiki.org MediaWiki nagusia]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Erabiltzaileentzako Gida]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Administratzaileentzako Gida]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MEG]\n----\n* <doclink href=Readme>Irakur nazazu</doclink>\n* <doclink href=ReleaseNotes>Oharren argitalpena</doclink>\n* <doclink href=Copying>Kopiaketa</doclink>\n* <doclink href=UpgradeDoc>Eguneratzea</doclink>",
        "config-env-php": "PHP $1 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:",
+       "config-db-host-oracle": "Datu-baseko TNS:",
        "config-db-wiki-settings": "Wiki hau identifikatu",
        "config-db-name": "Datu-base izena:",
+       "config-db-name-oracle": "Datu-baseko eskema:",
        "config-db-username": "Datu-base lankide izena:",
        "config-db-password": "Datu-base pasahitza:",
        "config-charset-mysql5-binary": "MySQL 4.1/5.0 bitarra",
        "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-db-port": "Datu-basearen ataka:",
+       "config-db-schema": "MediaWikirako eskema:",
        "config-type-mysql": "MySQL (edo bateragarria)",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
@@ -52,6 +62,8 @@
        "config-header-postgres": "PostgreSQL hobespenak",
        "config-header-sqlite": "SQLite hobespenak",
        "config-header-oracle": "Oracle hobespenak",
+       "config-header-mssql": "Microsoft SQL Server-en ezarpenak",
+       "config-invalid-db-type": "Datu-base mota baliogabea.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-binary": "Bitarra",
        "config-admin-password-confirm": "Pasahitza berriz:",
        "config-admin-password-mismatch": "Sartutako bi pasahitzak ez datoz bat.",
        "config-admin-email": "E-posta helbidea:",
+       "config-admin-error-bademail": "Helbide elektroniko okerra idatzi duzu.",
+       "config-optional-continue": "Galdera gehiago egin.",
+       "config-optional-skip": "Aspertuta nago, wikia instalatu bakarrik.",
        "config-profile-wiki": "Wikia ireki",
+       "config-profile-no-anon": "Kontua sortzea beharrezkoa da",
+       "config-profile-fishbowl": "Baimendutako editoreak bakarrik",
        "config-profile-private": "Wiki pribatua",
        "config-license": "Copyright eta lizentzia:",
+       "config-license-cc-by": "Creative Commons Aitorpena",
        "config-license-cc-0": "Creative Commons Zero (Jabari Publikoa)",
        "config-license-pd": "Domeinu Askea",
+       "config-license-cc-choose": "Aukeratu Creative Commons lizentzia pertsonalizatua",
        "config-email-settings": "E-posta hobespenak",
+       "config-upload-settings": "Irudi eta fitxategi igoerak",
+       "config-upload-enable": "Fitxategi igoera gaitu",
        "config-logo": "Logo URL:",
+       "config-instantcommons": "Instant Commons gaitu",
+       "config-cc-again": "Berriz aukeratu...",
+       "config-advanced-settings": "Konfigurazio aurreratua",
        "config-extensions": "Luzapenak",
        "config-skins": "Itxurak",
        "config-install-step-done": "egina",
+       "config-install-extensions": "Luzapenak barne",
+       "config-install-database": "Datu-basea konfiguratu",
+       "config-install-schema": "Eskema sortu",
+       "config-install-user-alreadyexists": "\"$1\" erabiltzailea badago.",
+       "config-install-tables": "Taulak sortzen",
+       "config-install-interwiki-list": "Ezin izan da <code>interwiki.list</code> fitxategia irakurri.",
+       "config-install-stats": "Estatistikak hasten",
+       "config-install-keys": "Gako sekretuak sortzen",
+       "config-install-sysop": "Administratzaile kontua sortzen",
+       "config-download-localsettings": "Jaitsi <code>LocalSettings.php</code>",
        "config-help": "Laguntza",
+       "config-help-tooltip": "sakatu zabaltzeko",
        "mainpagetext": "'''MediaWiki arrakastaz instalatu da.'''",
        "mainpagedocfooter": "Ikus [//meta.wikimedia.org/wiki/Help:Contents Erabiltzaile Gida] wiki softwarea erabiltzen hasteko informazio gehiagorako.\n\n== Nola hasi ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigurazio balioen zerrenda]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ (Maiz egindako galderak)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]"
 }
index de26499..9b81d4b 100644 (file)
@@ -9,7 +9,8 @@
                        "Reza1615",
                        "Alirezaaa",
                        "Danialbehzadi",
-                       "Leyth"
+                       "Leyth",
+                       "Huji"
                ]
        },
        "config-desc": "نصب کنندهٔ ویکی‌مدیا",
        "config-db-install-account": "حساب کاربری برای نصب",
        "config-db-username": "نام کاربری پایگاه اطلاعات:",
        "config-db-password": "گذرواژه پایگاه داده‌ها:",
-       "config-db-password-empty": "لطفاً یک رمز عبور برای کاربر تازه پایگاه اطلا‌عاتی وارد کنید: $1\nدر صورتی که ممکن است کاربران بدون رمز عبور به وجود آیند،امن نیست.",
-       "config-db-username-empty": "شما باید یک مقدار برای \"نام کاربری {{int:config-db-username}}\" وارد کنید",
        "config-db-install-username": "نام کاربری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین نام کاربری حساب مدیاویکی نیست; نام کاربری برای پایگاه اطلاعاتی شما است.",
        "config-db-install-password": "رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌شد.\nاین رمز عبور برای حساب مدیاویکی نیست;رمز عبور برای پایگاه اطلاعاتی شما است.",
        "config-db-install-help": "نام کاربری و رمز عبوری را وارد کنید که برای اتصال به پایگاه اطلاعاتی در طول روند نصب استفاده خواهد‌ٰشد.",
        "config-nofile": "پروندهٔ «$1» یافت نشد. آیا حذف شده‌است؟",
        "config-extension-link": "آیا می‌دانستید که ویکی شما [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions] را پشتیبانی می‌کند؟\nشما می‌توانید [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions by category]",
        "mainpagetext": "'''نرم‌افزار ویکی با موفقیت نصب شد.'''",
-       "mainpagedocfooter": "از [//meta.wikimedia.org/wiki/Help:Contents راهنمای کاربران]\nبرای استفاده از نرم‌افزار ویکی کمک بگیرید.\n\n== آغاز به کار ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings تنظیم پیکربندی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki پرسش‌های متداول]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ارسال نسخه‌های مدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise مدیاویکی برای زبان شما]"
+       "mainpagedocfooter": "از [//meta.wikimedia.org/wiki/Help:Contents راهنمای کاربران]\nبرای استفاده از نرم‌افزار ویکی کمک بگیرید.\n\n== آغاز به کار ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings تنظیم پیکربندی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki پرسش‌های متداول]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce فهرست ارسال نسخه‌های مدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise مدیاویکی برای زبان شما]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam آموزش مقابله به هرزنگاری در ویکی شما]"
 }
index 87f3374..370874b 100644 (file)
        "config-db-install-account": "Compte d'utilisateur pour l'installation",
        "config-db-username": "Nom d’utilisateur de la base de données :",
        "config-db-password": "Mot de passe de la base de données :",
-       "config-db-password-empty": "Veuillez entrer un mot de passe pour le nouveau compte de la base de données : $1.\nBien qu'il soit possible de créer un compte sans mot de passe, ce n'est pas recommandé pour des questions de sécurité.",
-       "config-db-username-empty": "Vous devez entrer une valeur pour « {{int:config-db-username}} ».",
        "config-db-install-username": "Entrez le nom d’utilisateur qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du nom d’utilisateur du compte MediaWiki, mais du nom d’utilisateur pour votre base de données.",
        "config-db-install-password": "Entrez le mot de passe qui sera utilisé pour se connecter à la base de données pendant le processus d'installation. Il ne s’agit pas du mot de passe du compte MediaWiki, mais du mot de passe pour votre base de données.",
        "config-db-install-help": "Entrez le nom d'utilisateur et le mot de passe qui seront utilisés pour se connecter à la base de données pendant le processus d'installation.",
        "config-nofile": "Le fichier « $1 » est introuvable. A-t-il été supprimé ?",
        "config-extension-link": "Saviez-vous que votre wiki supporte [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions des extensions] ?\n\nVous pouvez consulter les [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions par catégorie].",
        "mainpagetext": "<strong>MediaWiki a été installé avec succès.</strong>",
-       "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]"
+       "mainpagedocfooter": "Consultez le [//meta.wikimedia.org/wiki/Help:Contents/fr Guide de l’utilisateur] pour plus d’informations sur l’utilisation de ce logiciel de wiki.\n\n== Pour démarrer ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste des paramètres de configuration]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/fr Questions courantes sur MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptez MediaWiki dans votre langue]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Apprendre comment lutter contre le pourriel dans votre wiki]"
 }
index ac60dea..c78c15e 100644 (file)
@@ -4,21 +4,80 @@
                        "Hangmanwa7id"
                ]
        },
+       "config-information": "Informations",
+       "config-localsettings-key": "Clef de mise à jour:",
+       "config-localsettings-badkey": "La clef que vous avez fournie est incorrecte.",
        "config-your-language": "Ton langue:",
+       "config-wiki-language": "Langue du wiki:",
+       "config-back": "← Retour",
+       "config-continue": "Continuer →",
+       "config-page-language": "Langue",
+       "config-page-welcome": "Bienvenue en MediaWiki!",
+       "config-page-dbconnect": "Connexion à la base de données",
+       "config-page-upgrade": "Mettre à jour l’installation existante",
+       "config-page-dbsettings": "Paramètres de la base de données",
        "config-page-name": "Nom",
        "config-page-options": "Options",
        "config-page-install": "Installer",
        "config-page-complete": "Terminé!",
+       "config-page-readme": "Lisez-moi",
+       "config-page-releasenotes": "Notes de version",
+       "config-page-copying": "Copie",
+       "config-page-upgradedoc": "Mise à jour",
+       "config-page-existingwiki": "Wiki existant",
+       "config-restart": "Oui, le relancer",
+       "config-env-php": "PHP $1 est installé.",
+       "config-env-hhvm": "HHVM $1 est installé.",
+       "config-unicode-using-intl": "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.",
+       "config-diff3-bad": "GNU diff3 introuvable.",
+       "config-db-username": "Nom d’useur de la base de données:",
+       "config-db-password": "Mot de passe de la base de données:",
+       "config-db-install-username": "Entrez le nom d’useur qui sera usé pour se connecter à la base de données pendant le processus d'installation. Il s’agit pas du nom d’useur du compte MediaWiki, mais du nom d’useur pour votre base de données.",
+       "config-db-install-password": "Entrez le mot de passe qui sera usé pour se connecter à la base de données pendant le processus d'installation. Il s’agit pas du mot de passe du compte MediaWiki, mais du mot de passe pour votre base de données.",
+       "config-db-wiki-account": "Compte d'useur pour le fonctionnement normal",
+       "config-db-wiki-help": "Entrez le nom d'useur et le mot de passe qui seront usés pour se connecter à la base de données pendant le fonctionnement normal du wiki.\nSi le compte existe pas, et le compte d'installation dispose de privilèges suffisants, ce compte d'useur sera créé avec les privilèges minimum requis pour faire fonctionner le wiki.",
+       "config-db-prefix": "Préfixe des tables de la base de données:",
+       "config-db-charset": "Ensemble de caractères de la base de données",
+       "config-charset-mysql5-binary": "binaire MySQL 4.1/5.0",
+       "config-charset-mysql5": "MySQL 4.1/5.0 UTF-8",
+       "config-charset-mysql4": "MySQL 4.0 rétrocompatible UTF-8",
+       "config-oracle-def-ts": "Espace de stockage (''tablespace'') par défaut:",
+       "config-oracle-temp-ts": "Espace de stockage (''tablespace'') temporaire:",
+       "config-type-mysql": "MySQL (ou compatible)",
+       "config-type-mssql": "Microsoft SQL Server",
+       "config-header-mysql": "Paramètres de MySQL",
+       "config-header-postgres": "Paramètres de PostgreSQL",
+       "config-header-sqlite": "Paramètres de SQLite",
+       "config-header-oracle": "Paramètres d’Oracle",
+       "config-header-mssql": "Paramètres de Microsoft SQL Server",
+       "config-invalid-db-type": "Type de base de données non valide",
        "config-sqlite-name-help": "Choisir un nom qui identifie ton wiki.\nFait user pas ni d'espaces ni des traits d'union\nIl va user pour fichier de données SQLite.",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-binary": "Binaire",
        "config-mysql-utf8": "UTF-8",
+       "config-site-name": "Nom du wiki:",
        "config-ns-generic": "Projet",
        "config-ns-other-default": "MonWiki",
        "config-admin-name": "Ton nom d'useur:",
        "config-admin-password": "Mot de passe:",
        "config-admin-email": "Adresse d'email:",
+       "config-profile-wiki": "Wiki ouvert",
+       "config-email-settings": "Paramètres d'email",
+       "config-enable-email": "Activer les emails sortants",
+       "config-email-user": "Activer les emails d'useur à useur",
+       "config-email-watchlist": "Activer la notification de la liste de suivi",
+       "config-cc-again": "Choisissez à nouveau...",
+       "config-install-step-done": "fait",
+       "config-install-step-failed": "échoué",
+       "config-install-extensions": "Inclusion des extensions",
+       "config-install-database": "Création de la base de données",
+       "config-install-schema": "Création de schéma",
+       "config-install-pg-schema-not-exist": "Le schéma PostgreSQL existe pas",
+       "config-install-pg-schema-failed": "Échoué lors de la création des tables.\nAssurez-vous que l'useur \"$1\" peut écrire selon le schéma \"$2\".",
+       "config-install-pg-commit": "Validation des modifications",
+       "config-help": "aide",
+       "config-help-tooltip": "cliquer pour agrandir",
        "mainpagetext": "'''Vous avez bien installé MediaWiki.'''",
        "mainpagedocfooter": "Lisez la [//meta.wikimedia.org/wiki/Help:Contents Guide des Useurs] pour apprendre à user le wiki software.\n\n== Pour Commencer ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Réglage]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki: Questions Souvent Posées]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki Liste à Malle]"
 }
index 544b852..643a370 100644 (file)
        "config-nofile": "Non se puido atopar o ficheiro \"$1\". Se cadra, foi borrado.",
        "config-extension-link": "Sabía que o seu wiki soporta [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensións]?\n\nPode explorar as [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensións por categoría] ou a [//www.mediawiki.org/wiki/Extension_Matrix matriz de extensións] para ollar a lista completa de extensións.",
        "mainpagetext": "<strong>MediaWiki instalouse correctamente.</strong>",
-       "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]"
+       "mainpagedocfooter": "Consulte a [//meta.wikimedia.org/wiki/Help:Contents guía de usuario] para obter máis información sobre como usar o software wiki.\n\n== Primeiros pasos ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista das opcións de configuración]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Preguntas máis frecuentes sobre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localice MediaWiki á súa lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Aprenda como combater a publicidade na súa wiki]"
 }
index 9b5a322..09cfe6a 100644 (file)
@@ -6,7 +6,8 @@
                        "ערן",
                        "아라",
                        "Inkbug",
-                       "Yona b"
+                       "Yona b",
+                       "Rotemliss"
                ]
        },
        "config-desc": "תכנית ההתקנה של מדיה־ויקי",
        "config-db-install-account": "חשבון משתמש להתקנה",
        "config-db-username": "שם המשתמש במסד הנתונים:",
        "config-db-password": "הססמה במסד הנתונים:",
-       "config-db-password-empty": "נא להזין ססמה למשתמש מסד הנתונים החדש: $1.\nאף־על־פי שאפשר ליצור חשבונות ללא ססמה, זה לא מאובטח.",
-       "config-db-username-empty": "יש להזין ערך עבור \"{{int:config-db-username}}\".",
        "config-db-install-username": "יש להכניס שם משתמש שישמש לחיבור למסד נתונים במהלך ההתקנה.\nזהו לא שם משתמש לחשבון במדיה־ויקי; זהו שם משתמש בשרת מסד נתונים.",
        "config-db-install-password": "יש להקליד ססמה שתשמש אותך לצורך חיבור למסד נתונים במהלך ההתקנה.\nזוהי לא ססמה של חשבון במדיה־ויקי; זוהי ססמה לשרת מסד נתונים.",
        "config-db-install-help": "יש להקליד את שם המשתמש ואת הססמה להתחברות למסד הנתונים במהלך ההתקנה.",
        "config-nofile": "הקובץ \"$1\" לא נמצא. האם הוא נמחק?",
        "config-extension-link": "הידעת שמדיה־ויקי תומכת ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions הרחבות]?\n\nבאפשרותך לעיין ב־[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category הרחבות לפי קטגוריה].",
        "mainpagetext": "'''תוכנת מדיה־ויקי הותקנה בהצלחה.'''",
-       "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]"
+       "mainpagedocfooter": "היעזרו ב[//meta.wikimedia.org/wiki/Help:Contents מדריך למשתמש] למידע על שימוש בתוכנת הוויקי.\n\n== קישורים שימושיים ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימת ההגדרות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ שאלות ותשובות על מדיה־ויקי]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources תרגום מדיה־ויקי לשפה שלך]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam איך להיאבק נגד ספאם באתר הוויקי שלך]"
 }
index b9d0df5..16c7b3f 100644 (file)
@@ -10,7 +10,8 @@
                        "Seb35",
                        "Arifin.wijaya",
                        "Ilham151096",
-                       "Bennylin"
+                       "Bennylin",
+                       "WongKentir"
                ]
        },
        "config-desc": "Penginstal untuk MediaWiki",
        "config-memcache-badport": "Nomor porta Memcached harus antara $1 dan $2.",
        "config-extensions": "Ekstensi",
        "config-extensions-help": "Ekstensi yang tercantum di atas terdeteksi di direktori <code>./extensions</code>.\n\nEkstensi tersebut mungkin memerlukan konfigurasi tambahan, tetapi Anda dapat mengaktifkannya sekarang.",
-       "config-skins": "Kulit",
-       "config-skins-use-as-default": "Gunakan kulit ini secara baku",
+       "config-skins": "Tampilan",
+       "config-skins-use-as-default": "Gunakan tampilan ini secara baku",
        "config-install-alreadydone": "'''Peringatan:''' Anda tampaknya telah menginstal MediaWiki dan mencoba untuk menginstalnya lagi.\nLanjutkan ke halaman berikutnya.",
        "config-install-begin": "Dengan menekan \"{{int:config-continue}}\", Anda akan memulai instalasi MediaWiki.\nJika Anda masih ingin membuat perubahan, tekan \"{{int:config-back}}\".",
        "config-install-step-done": "selesai",
index ce15eac..17b5658 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Snævar"
+               ]
+       },
        "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.\n\n== Fyrir byrjendur ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listi yfir uppsetningarstillingar]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]"
+       "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.\n\n== Fyrir byrjendur ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Listi yfir uppsetningarstillingar]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Algengar spurningar MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Póstlisti MediaWiki-útgáfa]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Læra hvernig á að berjast við amapóst á þínum wiki]"
 }
index 96c9fd3..7ed7067 100644 (file)
        "config-upload-deleted": "Directory per i file cancellati:",
        "config-upload-deleted-help": "Scegli una directory in cui archiviare i file cancellati.\nIdealmente, questa non dovrebbe essere accessibile dal web.",
        "config-logo": "URL del logo:",
-       "config-logo-help": "La skin predefinita di MediaWiki include lo spazio per un logo di 135 x 160 pixel sopra il menu laterale.\nCarica un'immagine di dimensioni appropriate e inserisci l'URL qui.\n\nÈ possibile utilizzare <code>$wgStylePath</code> o <code>$wgScriptPath</code> se il logo è relativo a tali percorsi.\n\nSe non si desidera un logo, lascia vuota questa casella.",
+       "config-logo-help": "Il tema predefinito di MediaWiki include lo spazio per un logo di 135 x 160 pixel sopra il menu laterale.\nCarica un'immagine di dimensioni appropriate e inserisci l'URL qui.\n\nÈ possibile utilizzare <code>$wgStylePath</code> o <code>$wgScriptPath</code> se il logo è relativo a tali percorsi.\n\nSe non si desidera un logo, lascia vuota questa casella.",
        "config-instantcommons": "Abilita Instant Commons",
        "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] è una funzionalità che consente ai wiki di usare immagini, suoni e altri file multimediali che trovate sul sito [//commons.wikimedia.org/ Wikimedia Commons].\nPer fare questo, MediaWiki richiede l'accesso a Internet.\n\nPer ulteriori informazioni su questa funzionalità, incluse le istruzioni su come configurarlo per wiki diversi da Wikimedia Commons, consultare [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos il manuale].",
        "config-cc-error": "Il selettore di licenze Creative Commons non ha dato alcun risultato.\nInserisci manualmente il nome della licenza.",
        "config-memcache-badport": "I numeri di porta per memcached dovrebbero essere tra $1 e $2.",
        "config-extensions": "Estensioni",
        "config-extensions-help": "Le estensioni elencate sopra sono state rilevate nella tua directory <code>./extensions</code>.\n\nQueste potrebbero richiedere ulteriore configurazione, ma è possibile attivarle ora",
-       "config-skins": "Skin",
-       "config-skins-help": "Le skin elencate sopra sono state rilevate nella tua directory <code>./skins</code>. Devi attivarne almeno una e scegliere quella predefinita.",
-       "config-skins-use-as-default": "Usa questa skin come predefinita",
-       "config-skins-missing": "Non è stata trovata alcuna skin, MediaWiki userà una soluzione di ripiego finché non ne installerai una appropriata.",
-       "config-skins-must-enable-some": "Devi scegliere almeno una skin da attivare.",
-       "config-skins-must-enable-default": "La skin scelta come predefinita deve essere attivata.",
+       "config-skins": "Temi",
+       "config-skins-help": "I temi elencati sopra sono stati rilevati nella tua directory <code>./skins</code>. Devi attivarne almeno uno e scegliere quello predefinito.",
+       "config-skins-use-as-default": "Usa questo tema come predefinito",
+       "config-skins-missing": "Non è stato trovato alcun tema, MediaWiki userà una soluzione di ripiego finché non ne installerai uno appropriato.",
+       "config-skins-must-enable-some": "Devi scegliere almeno un tema da attivare.",
+       "config-skins-must-enable-default": "Il tema scelto come predefinito deve essere attivato.",
        "config-install-alreadydone": "'''Attenzione:''' sembra che hai già installato MediaWiki e stai tentando di installarlo nuovamente.\nProcedi alla pagina successiva.",
        "config-install-begin": "Premendo \"{{int:config-continue}}\", si avvierà l'installazione di MediaWiki.\nSe prima desideri apportare altre modifiche, premi \"{{int:config-back}}\".",
        "config-install-step-done": "fatto",
        "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?",
        "config-extension-link": "Sapevi che il tuo wiki supporta le  [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensioni per categoria].",
        "mainpagetext": "'''Installazione di MediaWiki completata correttamente.'''",
-       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]"
+       "mainpagedocfooter": "Consulta la [//meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]"
 }
index 6020bdc..8a11b09 100644 (file)
        "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。",
        "config-extension-link": "あなたのウィキは[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拡張機能]をサポートしていることをご存知ですか?\n\n[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category カテゴリ別で拡張機能を見る]か[//www.mediawiki.org/wiki/Extension_Matrix 拡張機能のマトリックス]で拡張機能すべてのリストをご覧になれます。",
        "mainpagetext": "<strong>MediaWiki のインストールに成功しました。</strong>",
-       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]"
+       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 4f53087..d33e03b 100644 (file)
@@ -1,5 +1,9 @@
 {
-       "@metadata": [],
+       "@metadata": {
+               "authors": [
+                       "Anggoro"
+               ]
+       },
        "mainpagetext": "'''Prangkat empuk wiki wis suksès dipasang.'''",
-       "mainpagedocfooter": "Mangga maca [//meta.wikimedia.org/wiki/Help:Contents User's Guide] kanggo katrangan luwih langkung prakara panggunan prangkat empuk wiki\n== Miwiti panggunan  ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Daftar pangaturan préférènsi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]"
+       "mainpagedocfooter": "Mangga maca [//meta.wikimedia.org/wiki/Help:Contents User's Guide] kanggo katrangan luwih langkung prakara panggunan prangkat empuk wiki\n== Miwiti panggunan  ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Daftar pangaturan préférènsi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 0c11be0..fd7dd5c 100644 (file)
        "config-nofile": "De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?",
        "config-extension-link": "Häs De jewoß, dat et Wiki [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Zohsazprojramme] hann kann?\n\nDo kanns [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [//www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.",
        "mainpagetext": "'''MehdijaWikki es jäz enschtalleht.'''",
-       "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki&nbsp;&hellip;]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndijonge övver neuje Aßjahbe vum MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!"
+       "mainpagedocfooter": "Luur en et (änglesche) [//meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki&nbsp;&hellip;]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndijonge övver neuje Ußjahbe vum MehdijaWikki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]\n\n=== Jrammatek ===\nJeh nohdämm, ovv_et „di {{SITENAME}}“, „dä {{SITENAME}}“ udder „dat {{SITENAME}}“ heiß, moß mer velleijsch en Datteij änndere. Wann „{{SITENAME}}“ med „wikki“ ov „wiki“ ophürt, moß mer nix donn. Bei „dä {{SITENAME}}“ och nit. Söns kütt en di Datteij <code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">languages/classes/LanguageKsh.php</code> vör udder henger dä Reihj met „<code lang=\"en\" xml:lang=\"en\" dir=\"ltr\">No need add neuter wikis having names ending in -wiki.</code>“ en neuje Reihj eren:\n* för „di {{SITENAME}}“ heijß di:\n*: <code>'{{SITENAME}}' => 'f',</code>\n* för „dat {{SITENAME}}“ heijs et:\n*: <code>'{{SITENAME}}' => 'n',</code>\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!"
 }
index ac54d87..bf7df55 100644 (file)
@@ -67,7 +67,6 @@
        "config-db-install-account": "Benotzerkont fir d'Installatioun",
        "config-db-username": "Datebank-Benotzernumm:",
        "config-db-password": "Passwuert vun der Datebank:",
-       "config-db-username-empty": "Dir musst e Wäert fir \"{{int:config-db-username}}\" aginn",
        "config-db-install-help": "Gitt de Benotzernumm an Passwuert an dat wàhrend der Installatioun benotzt gëtt fir sech mat der Datebank ze verbannen.",
        "config-db-account-lock": "De selwechte Benotzernumm a Passwuert fir déi normal Operatioune benotzen",
        "config-db-wiki-account": "Benotzerkont fir normal Operatiounen",
        "config-help-tooltip": "klickt fir opzeklappen",
        "config-nofile": "De Fichier \"$1\" gouf net fonnt. Gouf e geläscht?",
        "mainpagetext": "<strong>MediaWiki gouf installéiert.</strong>",
-       "mainpagedocfooter": "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.\n\n== Fir  unzefänken ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Hëllef bei der Konfiguratioun]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]"
+       "mainpagedocfooter": "Kuckt w.e.g. [//meta.wikimedia.org/wiki/Help:Contents d'Benotzerhandbuch] fir Informatiounen iwwer de Gebruach vun der Wiki Software.\n\n== Fir  unzefänken ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Hëllef bei der Konfiguratioun]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokaliséiert MediaWiki fir Är Sprooch]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Léiert wéi Spam op Ärer Wiki reduzéiert gi kann]"
 }
diff --git a/includes/installer/i18n/lki.json b/includes/installer/i18n/lki.json
new file mode 100644 (file)
index 0000000..e104137
--- /dev/null
@@ -0,0 +1,88 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Hosseinblue",
+                       "Arash71",
+                       "Lakzon"
+               ]
+       },
+       "config-desc": "نۀصب کۀر ویکی‌مدیا",
+       "config-title": "نۀصب ویکی‌مدیا $1",
+       "config-information": "اطلاعات",
+       "config-localsettings-upgrade": "یک پرونده <code>LocalSettings.php</code> شناسایی شده‌است.\nبرای ارتقاء این نصب لطفاً مقدار <code>$wgUpgradeKey</code> در جعبه زیر وارد کنید.\nشما می‌توانید آن را در <code>LocalSettings.php</code> پیدا کنید.",
+       "config-localsettings-cli-upgrade": "یک پرونده <code>LocalSettings.php</code> شناسایی شده است.\nبرای ارتقاء این نصب، لطفاً <code>update.php</code> را اجرا کنید.",
+       "config-localsettings-key": ":کلید ارتقا",
+       "config-localsettings-badkey": "کلیدی که شما ارائه کردید نادرست است.",
+       "config-upgrade-key-missing": "نصب موجود مدیاویکی شناسایی شده‌است.\nبرای بروزرسانی این نصب، لطفاً خط زیر را در آخر کد \nقرار دادن به نصب ارتقاء داده شده، به خط زیر لطفاً در پایین خود را <code>LocalSettings.php</code> قرار دهید:\n\n$1",
+       "config-localsettings-incomplete": "وجود <code>LocalSettings.php</code> به نظر ناقص می‌رسد.\nمتغیر $1 تنظیم نشده‌است.\nبرای اینکه این متغیر تنظیم شود لطفاً <code>LocalSettings.php</code> را تغییر دهید، و \"{{int:Config-continue}}\" را کلیک کنید.",
+       "config-localsettings-connection-error": "هنگام اتصال به پایگاه اطلاعاتی که ازتنظیمات مشخص شده در<code>LocalSettings.php</code> استفاده می‌کند، خطایی رخ داد. لطفاً این تنظیمات را نصب کنید و دوباره تلاش کنید.\n$1",
+       "config-session-error": "خطا در شروع جلسه: $1",
+       "config-session-expired": "به نظر می‌رسد اطلاعات جلسهٔ شما منقضی شده‌است.\nجلسات برای مادام العمر $1 پیکربندی شده‌اند.\nشما می‌توانید این پیکربندی را با تنظیم <code>session.gc_maxlifetime</code> در php.ini افزایش دهید.\nروند نصب را دوباره شروع کنید.",
+       "config-no-session": "اطلاعات دورهٔ شما از دست رفته‌ است!\nphp.ini خود را بررسی کنید و مطمئن شوید <code>session.save_path</code> برای یک فهرست مناسب تنظیم شده‌است.",
+       "config-your-language": "زوون هوومۀ",
+       "config-your-language-help": "زوونئ ئۀرا استفاده در طی کار نۀب انتخب کۀن.",
+       "config-wiki-language": "زوون ویکی:",
+       "config-wiki-language-help": "زوونئ انتخاب کۀن  گِ ویکی ویشتر وۀ ئۀؤۀ مۀنیوسِرئ.",
+       "config-back": "→ ئاهۀتن-بازگشت",
+       "config-continue": "ادامه-دؤم گرتن ←",
+       "config-page-language": "زوون",
+       "config-page-welcome": "خؤةش هةتینِ مدیا ویکی!",
+       "config-page-dbconnect": "اتصال به پایگاه داده",
+       "config-page-upgrade": "ارتقای نصب موجود",
+       "config-page-dbsettings": "تنظیمات پایگاه داده",
+       "config-page-name": "نؤم",
+       "config-page-options": "گزینۀل",
+       "config-page-install": "نۀصب",
+       "config-page-complete": "انجؤم دریا-انجؤم هنگت",
+       "config-page-restart": "راه‌اندازی دوواره نصب",
+       "config-page-readme": "بخؤۀن ئۀرانم",
+       "config-page-releasenotes": "یادداشت‌های انتشار",
+       "config-page-copying": "کپی",
+       "config-page-upgradedoc": "ارتقاء",
+       "config-page-existingwiki": "ویکی موجود",
+       "config-help-restart": "آیا می‌خواهید همهٔ اطلاعات ذخیره شده‌ای که وارد کرده‌اید را پاک کنید و دوباره روند نصب را شروع کنید؟",
+       "config-restart": "أرێ، دوواره راه‌اندازی کة",
+       "config-welcome": "===بررسی‌های محیطی===\nبرای فهمیدن اینکه این محیط برای نصب مدیاویکی مناسب است، اکنون بررسی‌های اساسی انجام خواهد‌شد.\nاگر به دنبال پشتیبانی در چگونگی تکمیل نصب هستید،به یاد داشته باشید این اطلاعات را بگنجانید.",
+       "config-copyright": "===حق چاپ و شرایط===\n$1\nاین برنامه، یک نرم‌افزاری آزاد است. شما می‌توانید آن را بازتوزیع کرده و/یا با شرایط نگارش ۲ یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده، تغییر دهید.\n\nاین برنامه با امید این که مفید واقع‌ شود توزیع شده‌است،اما '''بدون هیچ ضمانتی'''; حتی بدون اشارهٔ ضمانتی از '''قابلیت عرضه''' یا ''' صلاحیت برای یک هدف خاص'''.\nبرای جزئیات بیش‌تر پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید <doclink href=Copying> یک نگارش ازمجوز عمومی کلی </doclink> همراه این برنامه دریافت کرده باشید. در غیر این صورت با بنیاد نرم‌افزار آزاد، ایالات متحده امریکا، بوستون، خیابان فرانکلین، پلاک ۵۱، طبقه پنجم، صندوق پستی MA۰۲۱۱۰-۱۳۰ مکاتبه کنید، یا [http://www.gnu.org/copyleft/gpl.html در این‌جا به صورت برخط بخوانید].",
+       "config-sidebar": "* [//www.mediawiki.org وةڵگة اصلی مدیاویکی]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents راهنمای کاربر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents راهنمای مدیر]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ پرسش‌های رایج]\n----\n* <doclink href=Readme>مرا بخوان</doclink>\n* <doclink href=ReleaseNotes>یادداشت‌های انتشار</doclink>\n* <doclink href=Copying>نسخه برداری</doclink>\n* <doclink href=UpgradeDoc>ارتقا</doclink>",
+       "config-env-good": "محیط بررسی شده‌است.\nشما می‌توانید مدیاویکی را نصب کنید.",
+       "config-env-bad": "محیط بررسی شده‌است.\nشما نمی‌توانید مدیاویکی را نصب کنید.",
+       "config-env-php": "پی‌اچ‌پی $1 نصب شده‌است.",
+       "config-env-hhvm": "HHVM $1 نصب شده‌است.",
+       "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl intl PECL extension] استفاده کنید.",
+       "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.",
+       "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [//www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].",
+       "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی  برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|پرسش کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از <code>./configure --with-mysql</code> استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.",
+       "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.",
+       "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.",
+       "config-register-globals-error": "<strong>خطا:  پی‌اچ‌پی<code>[http://php.net/register_globals register_globals]</code> گزینه فعال است.\nبرای ادامه نصب باید غیر فعال باشد.</strong>\n[Https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] را برای کمک در مورد نحوه انجام این کار ببینید.",
+       "config-magic-quotes-gpc": "<strong>هشدار مهم: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] فعال شده‌است!</strong>\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
+       "config-magic-quotes-runtime": "'''مخرب: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] فعال است.\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
+       "config-magic-quotes-sybase": "<strong>هشدار مهم: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] فعال شده‌است!</strong>\nاین گزینه اطلاعات داده شده به رایانه را به طور غیر‌قابل پیش‌بینی از بین می‌برد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
+       "config-mbstring": "''' مخرب:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] فعال است.\nاین گزینه باعث ایجاد خطا می‌شود و ممکن است اطلاعات را به طور غیر‌قابل پیش‌بینی از بین ببرد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.",
+       "config-safe-mode": "'''هشدار:'''  PHP's [http://www.php.net/features.safe-mode safe mode] فعال است.\nممکن است باعث ایجاد مشکلاتی شود، مخصوصاً اگر از ارسال پرونده استفاده شود و <code>math</code> پشتیبانی شود.",
+       "config-xml-bad": "ماژول اکس‌ام‌ال پی‌اچ‌پی کار نمی‌کند.\nمدیاویکی نیازمند عملیاتی در این ماژول است و در این پیکربندی کار نخواهد‌کرد.\nشاید نیاز باشد که بستهٔ نرم افزاریِ آرپی‌ام پی‌اچ‌پی-ایکس‌ام‌ال را نصب کنید.",
+       "config-pcre-old": "''' خطای اساسی:'' ' PCRE  $1  یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE  $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].",
+       "config-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-۸ است.",
+       "config-memory-raised": "PHP's <code>memory_limit</code>, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.",
+       "config-memory-bad": "'''هشدار:''' PHP's <code>memory_limit</code> نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.",
+       "config-ctype": "'''مخرب:''' پی‌اچ‌پی باید با پشتیبانی برای [http://www.php.net/manual/en/ctype.installation.php Ctype extension] تهیه شده‌باشد.",
+       "config-db-type": "نوع پایگاه اطلاعات:",
+       "config-db-host": "میزبان پایگاه اطلاعات:",
+       "config-db-host-oracle": "ای ویکیۀ  شناسایی کۀ.",
+       "config-db-name": "نام پایگاه اطلاعات:",
+       "config-upgrade-done": "تکمیل ارتقاء.\nاکنون شما می‌توانید [$1 start using your wiki].\nاگر می‌خواهید پوشهٔ <code>LocalSettings.php</code> را احیا کنید،دکمهٔ زیر را کلیک کنید.\nاین ''' توصیه نمی‌شود ''' مگر اینکه با ویکی خود مشکل داشته باشید.",
+       "config-site-name-blank": "نام سایتئ وارد کۀن.",
+       "config-ns-generic": "پروژۀ",
+       "config-admin-box": "حساوو مدیر سامانه",
+       "config-admin-name": "نام کاربری هؤمۀ:",
+       "config-admin-password": ":رمز",
+       "config-admin-password-confirm": "رمز دووآرۀ:",
+       "config-admin-email": ":نیشانی رایانامۀ",
+       "config-optional-continue": "پرسشۀلی تریژ بپر إژ مِ",
+       "config-profile-wiki": "واز کردن ویکی",
+       "config-email-user-help": "به همهٔ کاربرانی که ارسال ایمیل را در ترجیحات خود فعال کرده‌اند، اجازه داده خواهد شد که به یکدیگر ایمیل ارسال کنند.",
+       "config-email-usertalk-help": "به همهٔ کاربرانی که دریافت اطلاعیه را در اولویت‌های خود فعال کرده‌اند،اجازه خواهد داده‌شد که اطلاعیه‌ها را در صفحهٔ تغییر گفت‌وگوی کاربر دریافت کنند.",
+       "config-email-watchlist-help": "به همهٔ کاربرانی که مشاهدهٔ صفحه را در اولویت‌های خود فعال کرده‌اند،اجازه خواهد داده‌شد که اطلاعیه‌های در رابطه با صفحات مشاهده شده را دریافت کنند.",
+       "config-install-step-done": "انجؤم بی"
+}
index a30aeae..6b732a9 100644 (file)
@@ -73,6 +73,8 @@
        "config-db-schema": "MediaWiki schema:",
        "config-pg-test-error": "Negalima prisijungti prie duomenų bazės <strong>$1</strong>: $2",
        "config-sqlite-dir": "SQLite duomenų katalogas:",
+       "config-oracle-def-ts": "Numatytoji lentelių sritis:",
+       "config-oracle-temp-ts": "Laikina lentelių sritis:",
        "config-type-mysql": "MySQL (arba suderinama)",
        "config-type-mssql": "Microsoft SQL serveris",
        "config-header-mysql": "MySQL nustatymai",
        "config-header-oracle": "Oracle nustatymai",
        "config-header-mssql": "„Microsoft“ SQL serverio nustatymai",
        "config-invalid-db-type": "Neteisingas duomenų bazės tipas",
+       "config-missing-db-host": "Privalote įvesti „{{int:config-db-host}}“ reikšmę.",
+       "config-missing-db-server-oracle": "Privalote įvesti „{{int:config-db-host-oracle}}“ reikšmę.",
        "config-postgres-old": "PostgreSQL $1 ar vėlesnė yra reikalinga. Jūs turite $2.",
+       "config-regenerate": "Pergeneruoti LocalSettings.php →",
+       "config-db-web-account-same": "Naudoti tą pačią paskyrą kaip ir įdiegimui",
+       "config-db-web-create": "Sukurti paskyrą, jeigu jos nėra",
+       "config-mysql-engine": "Saugojimo variklis:",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
+       "config-mysql-charset": "Duomenų bazės simbolių rinkinys:",
        "config-mysql-utf8": "UTF-8",
+       "config-mssql-auth": "Autentifikavimo tipas:",
+       "config-mssql-sqlauth": "SQL Serverio autentifikavimas",
        "config-mssql-windowsauth": "Windows autentifikavimas",
        "config-site-name": "Viki pavadinimas:",
        "config-site-name-blank": "Įveskite svetainės pavadinimą.",
        "config-license-pd": "Viešas domenas",
        "config-email-settings": "El. pašto nustatymai",
        "config-email-watchlist": "Įjungti stebimų pranešimą",
+       "config-email-auth": "Įjungti el. pašto autentifikavimą",
        "config-upload-settings": "Vaizdų ir failų įkėlimai",
        "config-upload-enable": "Įgalinti failų įkėlimus",
        "config-upload-deleted": "Katalogas ištrintiems failams:",
        "config-install-done": "'''Sveikiname!'''\nJūs sėkmingai įdiegėte MediaWiki.\n\nĮdiegimo programa sukūrė <code>LocalSettings.php</code> failą.\nJame yra visos jūsų konfigūracijos.\n\nJums reikės atsisiųsti ir įdėti jį į savo wiki įdiegimo bazę (pačiame kataloge, kaip index.php). Atsisiuntimas turėtų prasidėti automatiškai.\n\nJei atsisiuntimas nebuvo pasiūlytas, arba jį atšaukėte, galite iš naujo atsisiųsti paspaudę žemiau esančią nuorodą:\n\n$3\n\n'''Pastaba:''' Jei jūs to nepadarysite dabar, tada šis sukurtas konfigūracijos failas nebus galimas vėliau, jei išeisite iš įdiegimo be atsisiuntimo.\n\nKai baigsite, jūs galėsite '''[$2 įeiti į savo viki]'''.",
        "config-download-localsettings": "Atsisiųsti <code>LocalSettings.php</code>",
        "config-help": "pagalba",
+       "config-help-tooltip": "spustelėkite išplėtimui",
+       "config-nofile": "Failas \"$1\" nerastas. Ar jis buvo ištrintas?",
        "mainpagetext": "'''MediaWiki sėkmingai įdiegta.'''",
        "mainpagedocfooter": "Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].\n\n== Pradžiai ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki DUK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]"
 }
index 76bfc04..5d4c5d7 100644 (file)
        "config-upload-deleted": "Папка за избришаните податотеки:",
        "config-upload-deleted-help": "Одберете во која папка да се архивираат избришаните податотеки.\nНајдобро би било ако таа не е достапна преку семрежјето.",
        "config-logo": "URL за логото:",
-       "config-logo-help": "Ð\9cаÑ\82иÑ\87ноÑ\82о Ñ\80Ñ\83во Ð½Ð° Ð\9cедиÑ\98аÐ\92ики Ð¸Ð¼Ð° Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð·Ð° Ð»Ð¾Ð³Ð¾ Ð¾Ð´ 135x160 Ð¿Ð¸ÐºÑ\81ели Ð½Ð°Ð´ Ñ\81Ñ\82Ñ\80аниÑ\87наÑ\82а Ð»ÐµÐ½Ñ\82а.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
+       "config-logo-help": "Ð\9cаÑ\82иÑ\87ноÑ\82о Ñ\80Ñ\83во Ð½Ð° Ð\9cедиÑ\98аÐ\92ики Ð¸Ð¼Ð° Ð¿Ñ\80оÑ\81Ñ\82оÑ\80 Ð·Ð° Ð»Ð¾Ð³Ð¾ Ð¾Ð´ 135x160 Ð¿Ð¸ÐºÑ\81ели Ð½Ð°Ð´ Ñ\81Ñ\82Ñ\80аниÑ\87никоÑ\82.\n\nМожете да употребите <code>$wgStylePath</code> или <code>$wgScriptPath</code> ако вашето лого е релативно на тие патеки.\n\nАко не сакате да имате лого, тогаш оставете го ова поле празно.",
        "config-instantcommons": "Овозможи Instant Commons",
        "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] е функција која им овозможува на викијата да користат слики, звучни записи и други мултимедијални содржини од [//commons.wikimedia.org/ Ризницата].\nЗа да може ова да работи, МедијаВики бара пристап до семрежјето.\n\nЗа повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos прирачникот].",
        "config-cc-error": "Изборникот на лиценци од Криејтив комонс не даде резултати.\nВнесете го името на лиценцата рачно.",
        "config-install-tables": "Создавам табели",
        "config-install-tables-exist": "'''Предупредување''': Изгледа дека табелите за МедијаВики веќе постојат.\nГо прескокнувам создавањето.",
        "config-install-tables-failed": "'''Грешка''': Создавањето на табелата не успеа поради следнава грешка: $1",
-       "config-install-interwiki": "Ð\93и Ð¿Ð¾Ð¿Ð¾Ð»Ð½Ñ\83вам Ð¾Ñ\81новно Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ\82е Ð¼ÐµÑ\93Ñ\83вики-табели",
+       "config-install-interwiki": "Ð\93и Ð¿Ð¾Ð¿Ð¾Ð»Ð½Ñ\83вам Ð¾Ñ\81новно Ð·Ð°Ð´Ð°Ð´ÐµÐ½Ð¸Ñ\82е Ð¼ÐµÑ\93Ñ\83пÑ\80оекÑ\82ни табели",
        "config-install-interwiki-list": "Не можев да ја пронајдам податотеката <code>interwiki.list</code>.",
        "config-install-interwiki-exists": "'''Предупредување''': Табелата со интервикија веќе содржи ставки.\nГо прескокнувам основно-зададениот список.",
        "config-install-stats": "Ги подготвувам статистиките",
        "config-nofile": "Податотеката „$1“ не е пронајдена. Да не е избришана?",
        "config-extension-link": "Дали сте знаеле дека вашето вики поддржува [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions додатоци]?\n\nМожете да ги прелистате [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category по категории]",
        "mainpagetext": "'''МедијаВики е успешно воспоставен.'''",
-       "mainpagedocfooter": "Погледнете го [//meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [//meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [//meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]"
+       "mainpagedocfooter": "Погледнете го [//meta.wikimedia.org/wiki/Help:Contents Упатството за корисници] за подетални иформации како се користи вики-програмот.\n\n==Од каде да почнете==\n* [//meta.wikimedia.org/wiki/Manual:Configuration_settings Список на нагодувања]\n* [//meta.wikimedia.org/wiki/Manual:FAQ ЧПП (често поставувани прашања) за МедијаВики].\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Поштенски список на МедијаВики за нови верзии]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализирајте го МедијаВики на вашиот јазик]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Дознајте како да се борите против спам на вашето вики]"
 }
index 312f3ff..1157aa8 100644 (file)
@@ -5,40 +5,92 @@
                        "Suyog"
                ]
        },
+       "config-desc": "मिडियाविकि करीता उभारक(ईन्स्टॉलर)",
+       "config-title": "मिडियाविकि $1 उभारणी",
        "config-information": "माहिती",
+       "config-localsettings-upgrade": "<code>LocalSettings.php</code>ही संचिका संसुचित झाली.या उभारणीची दर्जोन्नती करण्यास,खालील पेटीत कृपया <code>$wgUpgradeKey</code> ची किंमत टाका. ती आपणास<code>LocalSettings.php</code>मध्ये सापडेल.",
+       "config-localsettings-cli-upgrade": "<code>LocalSettings.php</code>ही संचिका संसुचित झाली.या उभारणीची दर्जोन्नती करण्यास त्याऐवजी,कृपया<code>update.php</code>चालवा",
        "config-localsettings-key": "दर्जोन्नती कळ:",
        "config-localsettings-badkey": "आपण दिलेली कळ चुकीची आहे.",
-       "config-session-error": "सत्र सुरू करण्यात त्रूटी:$1",
+       "config-upgrade-key-missing": "मिडियाविकिचे अस्तित्वात असलेली उभारणी संसुचित झाली आहे.या उभारणीची दर्जोन्नती करण्यास,आपल्या <code>LocalSettings.php</code>च्या खाली असलेल्या ओळीत खालील टाका:\n\n$1",
+       "config-localsettings-incomplete": "अस्तित्वात असलेला <code>LocalSettings.php</code>अपूर्ण दिसत आहे.\n$1 हे चल स्थापिलेले नाही.<code>LocalSettings.php</code> कृपया बदला ज्याने,हे चल स्थापिले जाईल व त्यानंतर \"{{int:Config-continue}}\" टिचका.",
+       "config-localsettings-connection-error": "<code>LocalSettings.php</code> मधील नमूद मांडण्या वापरुन विदागाराशी अनुबंध करतांना एक त्रुटी उद्भवली.\nकृपया या मांडण्या सुधरवुन पुन्हा प्रयत्न करा.\n\n$1",
+       "config-session-error": "सत्र सुरू करण्यात त्रुटी:$1",
+       "config-session-expired": "आपला सत्र डाटा कालबाह्य झाला आहे असे दिसते.\n$1 या हयातवेळेशी सत्र रचित असते.\nphp.ini मधिल <code>session.gc_maxlifetime</code> द्वारे आपण त्या वेळेस वाढवु शकता.\nउभारणीची प्रक्रिया पुन्हा सुरू करा.",
+       "config-no-session": "आपला सत्र डाटा हरविला आहे!\nआपली php.ini तपासा व याची खात्री करा कि <code>session.save_path</code> हा योग्य डिरेक्टरीत स्थापिला आहे.",
        "config-your-language": "आपली भाषा:",
        "config-your-language-help": "उभारणी प्रक्रियेत वापरावयाची भाषा निवडा.",
        "config-wiki-language": "विकी भाषा:",
-       "config-wiki-language-help": "तà¥\81मà¤\9aà¥\80 à¤²à¥\87à¤\96न à¤­à¤¾à¤·à¤¾ à¤¨à¤¿à¤µà¤¡à¤¾",
+       "config-wiki-language-help": "à¤\9cà¥\8dयात à¤µà¤¿à¤\95ि à¤ªà¥\8dरबळरितà¥\8dया à¤²à¤¿à¤¹à¥\80ला à¤\9cाà¤\88ल à¤\85शà¥\80 à¤¤à¥\81मà¤\9aà¥\80 à¤²à¥\87à¤\96न à¤­à¤¾à¤·à¤¾ à¤¨à¤¿à¤µà¤¡à¤¾.",
        "config-back": "← परत",
        "config-continue": "चालू ठेवा →",
        "config-page-language": "भाषा",
        "config-page-welcome": "मिडियाविकीवर स्वागत आहे!",
+       "config-page-dbconnect": "डाटाबेसशी अनुबंध करा",
        "config-page-upgrade": "सध्याच्या उभारणीची(इन्स्टॉलेशन) दर्जोन्नती करा",
+       "config-page-dbsettings": "डाटाबेसच्या मांडण्या",
        "config-page-name": "नाव",
        "config-page-options": "पर्याय",
        "config-page-install": "स्थापित करा(इन्स्टॉल)",
        "config-page-complete": "पूर्ण!",
+       "config-page-restart": "उभारणीस पुन्हा सुरू करा",
        "config-page-readme": "हे वाचा",
        "config-page-releasenotes": "विमोचन टिप्पण्या",
-       "config-page-existingwiki": "साध्याचा विकि",
-       "config-restart": "हो, परत चालू करा",
+       "config-page-copying": "नकलवित आहे",
+       "config-page-upgradedoc": "दर्जोन्नती करीत आहे",
+       "config-page-existingwiki": "सध्याचा विकि",
+       "config-help-restart": "आपण टाकून जतन केलेला सर्व डाटा आपणास साफ करावयाचा व उभारणीची प्रक्रिया पुन्हा सुरू करावयाची आहे काय?",
+       "config-restart": "होय, परत चालू करा",
+       "config-welcome": "=== पारिसरीक तपासण्या ===\nमिडियाविकिच्या उभारणीस हा परिसर योग्य आहे काय याच्या मूळ तपासण्या आता केल्या जातील.\nजर आपणास पुढे याची उभारणी करण्याबद्दल साहाय्य लागल्यास, याचा अंतर्भाव करणे लक्षात ठेवा.",
+       "config-copyright": "=== प्रताधिकार व अटी ===\n\n$1\nहा कार्यसंच,हे एक मुक्त संचेतन आहे;आपण त्यास पुनर्वितरीत व/किंवा त्यास फ्री सॉफ्टवेअर फाऊंडेशन द्वारे प्रकाशित, GNU जनरल पब्लिक लायसन्स अंतर्गत बदलु शकता;या परवान्याची आवृत्ती २ किंवा (आपल्या इच्छेनुसार)त्यानंतरची आवृत्ती.\n\nहा कार्यसंचाचे वितरण,पण, <strong>कोणत्याही हमीशिवाय</strong>; याशिवाय <strong>व्यापारीकरणाच्या</strong> कोणत्याही अभिप्रेत आश्वासनाशिवाय किंवा <strong>एखाद्या विशिष्ट कार्यासाठीच्या अर्हतेशिवाय</strong>ही आशा ठेऊन केले आहे कि, तो उपयोगी असेल.\nअधिक माहितीसाठी GNU जनरल पब्लिक लायसन्स बघा.\nआपणास या कार्यसंचासमवेत <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-sidebar": "* [//www.mediawiki.org मिडियाविकि गृह]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents सदस्य मार्गदर्शिका]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents प्रशासकाची मार्गदर्शिका]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* <doclink href=Readme>Read me</doclink>\n* <doclink href=ReleaseNotes>विमोचन टिप्पण्या</doclink>\n* <doclink href=Copying>नकलविणे</doclink>\n* <doclink href=UpgradeDoc>दर्जोन्नती करणे</doclink>",
+       "config-env-good": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकता.",
+       "config-env-bad": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकत नाही.",
+       "config-env-php": "PHP $1 उभारल्या गेली.",
+       "config-env-hhvm": "HHVM $1 उभारल्या गेली.",
+       "config-unicode-using-intl": "यूनिकोड सामान्यिकरणासाठी [http://pecl.php.net/intl intl PECL विस्तारक] वापरत आहे.",
+       "config-outdated-sqlite": "<strong>इशारा:</strong> आपणापाशी SQLite $1 आहे, जी किमान आवश्यक आवृत्ती $2 पेक्षा, निम्न आहे. SQLite अनुपलब्ध राहील.",
+       "config-register-globals-error": "<strong>त्रुटी: PHP's <code>[http://php.net/register_globals वैश्विकांची नोंद करा]</code> पर्याय सक्षम केला आहे. उभारणी सुरू ठेवण्यास तो अक्षम केल्या जावयास हवा.</strong>ते कसे करावयाचे याच्या साहाय्यासाठी\n[https://www.mediawiki.org/wiki/register_globals https://www.mediawiki.org/wiki/register_globals] बघा.",
+       "config-magic-quotes-gpc": "<strong>घातक: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-gpc magic_quotes_gpc] सक्रिय आहे!</strong>\nहा पर्याय, अंदाज येऊ न देता, डाटा इनपुटला भ्रष्ट करते.\nआपण हा पर्यास अक्षम केल्याशिवाय मिडियाविकिची उभारणी किंवा वापर करु शकत नाही.",
+       "config-magic-quotes-runtime": "<strong>घातक: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime] सक्रिय आहे!</strong>\nहा पर्याय, अंदाज येऊ न देता, डाटा इनपुटला भ्रष्ट करते.\nआपण हा पर्यास अक्षम केल्याशिवाय मिडियाविकिची उभारणी किंवा वापर करु शकत नाही.",
+       "config-magic-quotes-sybase": "<strong>घातक: [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase] सक्रिय आहे!</strong>\nहा पर्याय, अंदाज येऊ न देता, डाटा इनपुटला भ्रष्ट करते.\nआपण हा पर्यास अक्षम केल्याशिवाय मिडियाविकिची उभारणी किंवा वापर करु शकत नाही.",
+       "config-memory-raised": "पीएचपीची <code>memory_limit</code> ही $1 आहे, त्यास $2 ला वाढविली.",
+       "config-memory-bad": "पीएचपीची <code>memory_limit</code> ही $1 आहे.\nही बरीच खालच्या स्तरावरची आहे.\nउभारणी अयशस्वी होऊ शकते!",
+       "config-ctype": "<strong>घातक:</strong> पीएचपीचे [http://www.php.net/manual/en/ctype.installation.php Ctype या विस्तारकाशी] साहाय्य करण्यास संकलन करावे लागेल.",
+       "config-iconv": "<strong>घातक:</strong> पीएचपीचे [http://www.php.net/manual/en/iconv.installation.php iconv या विस्तारकाशी]साहाय्य करण्यास संकलन करावे लागेल.",
+       "config-xcache": "[http://xcache.lighttpd.net/ XCache] उभारली",
+       "config-apc": "[http://www.php.net/apc APC] उभारली आहे",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] उभारली आहे",
+       "config-no-cache": "<strong>इशारा:</strong>  [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] किंवा [http://www.iis.net/download/WinCacheForPhp WinCache] सापडली नाही.\nउद्दीष्टाचे कॅश करणे सक्षम नाही.",
+       "config-diff3-bad": "GNU diff3 सापडली नाही.",
+       "config-git-bad": "गीट आवृत्ती नियमन संचेतन सापडली नाही.",
+       "config-db-type": "डाटाबेसचा प्रकार:",
+       "config-db-host": "डाटाबेसचा यजमान:",
+       "config-db-name": "डाटाबेसचे नाव:",
+       "config-db-name-oracle": "डाटाबेस आकृतीबंध:",
+       "config-db-install-account": "उभारणीसाठी सदस्य खाते",
+       "config-db-username": "डाटाबेसवरील सदस्यनाव:",
+       "config-db-password": "डाटाबेसवरील परवलीचा शब्द:",
+       "config-db-prefix": "डाटाबेस सारणी उपसर्ग:",
+       "config-db-port": "डाटाबेस द्वार:",
        "config-pg-test-error": "विदागाराशी अनुबंधन करता येत नाही <strong>$1</strong>: $2",
        "config-type-mssql": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर",
        "config-header-mssql": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर मांडणावळ",
+       "config-invalid-db-type": "डाटाबेसचा अवैध प्रकार.",
+       "config-connection-error": "$1.\n\nयजमान,सदस्यनाव व परवलीचा शब्द तपासा व पुन्हा प्रयत्न करा.",
        "config-mssql-old": "मायक्रोसॉफ्ट एसक्युएल सर्व्हर $1 किंवा त्यानंतरची आवृत्ती हवी. आपणापाशी $2 आहे.",
+       "config-upgrade-done-no-regenerate": "दर्जोन्नती पूर्ण.\n\nआपण आता [$1 आपला विकिचा वापर करु शकता].",
        "config-mssql-auth": "अधिप्रमाणन प्रकार:",
-       "config-mssql-install-auth": "उभारणीच्या(इन्स्टॉलेशन) प्रक्रियेदरम्यान,'अधिप्रमाणन प्रकार'( ऑथेंटीकेशन टाईप) निवडा, ज्याचा वापर डाटाबेसशी अनुबंधनात करण्यात येईल.जर आपण \"विंडोज ऑथेंटीकेशन\" निवडले तर,ज्याकोणत्याही सदस्याची अधिकारपत्रे(क्रेडेंटियल्स) वेबसर्व्हरवर सुरू असतील,तशीच वापरल्या जातील.",
-       "config-mssql-web-auth": "या विकिचे सामन्य चालनादरम्यान,'अधिप्रमाणन प्रकार'( ऑथेंटीकेशन टाईप) निवडा, ज्याचा वापर डाटाबेसशी अनुबंधनात करण्यात येईल.जर आपण \"विंडोज ऑथेंटीकेशन\" निवडले तर,ज्याकोणत्याही सदस्याची अधिकारपत्रे(क्रेडेंटियल्स) वेबसर्व्हरवर सुरू असतील,तशीच वापरल्या जातील.",
+       "config-mssql-install-auth": "उभारणीच्या(इन्स्टॉलेशन) प्रक्रियेदरम्यान,'अधिप्रमाणन प्रकार'( ऑथेंटीकेशन टाईप) निवडा, ज्याचा वापर डाटाबेसशी अनुबंधनात करण्यात येईल.जर आपण \"{{int:config-mssql-windowsauth}} निवडले तर,ज्याकोणत्याही सदस्याची अधिकारपत्रे(क्रेडेंटियल्स) वेबसर्व्हरवर सुरू असतील,तशीच वापरल्या जातील.",
+       "config-mssql-web-auth": "'अधिप्रमाणन प्रकार'( ऑथेंटीकेशन टाईप) निवडा, ज्यास,या विकिचे सामान्य चालनादरम्यान, वेब सर्व्हर हा डाटाबेसशी अनुबंधन करण्यास वापरेल.जर आपण\"{{int:config-mssql-windowsauth}}\" निवडले तर,ज्याकोणत्याही सदस्याची अधिकारपत्रे(क्रेडेंटियल्स) वेबसर्व्हरवर सुरू असतील,तशीच वापरल्या जातील.",
        "config-mssql-sqlauth": "एसक्युएल सर्व्हर अधिप्रमाणन",
        "config-mssql-windowsauth": "विंडोजचे अधिप्रमाणन",
        "config-site-name": "विकिचे नाव:",
+       "config-site-name-help": "हे न्याहाळकाच्या शीर्षक पट्टीत व इतर ठिकाणीही दिसेल .",
        "config-site-name-blank": "संकेतस्थळाचे नाव टाका.",
        "config-project-namespace": "प्रकल्प नामविश्व:",
        "config-ns-generic": "प्रकल्प",
+       "config-ns-site-name": "विकि नावाप्रमाणेच: $1",
        "config-admin-name": "आपले सदस्यनाव:",
        "config-admin-password": "परवलीचा शब्द:",
        "config-admin-password-confirm": "परवलीचा शब्द पुन्हा टाका:",
        "config-install-step-done": "झाले",
        "config-install-extensions": "विस्तारके अंतर्भूत करून",
        "config-install-tables": "सारण्या बनवित आहे",
-       "config-install-tables-failed": "<strong>तà¥\8dरà¥\82à¤\9fà¥\80:</strong>à¤\96ालà¥\80ल à¤¤à¥\8dरà¥\82टीमुळे सारणी बनविणे अयशस्वी:$1",
+       "config-install-tables-failed": "<strong>तà¥\8dरà¥\81à¤\9fà¥\80:</strong>à¤\96ालà¥\80ल à¤¤à¥\8dरà¥\81टीमुळे सारणी बनविणे अयशस्वी:$1",
        "config-help": "साहाय्य",
        "mainpagetext": "'''मीडियाविकीचे इन्स्टॉलेशन पूर्ण.'''",
-       "mainpagedocfooter": "विà¤\95à¥\80 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87à¤\85र à¤µà¤¾à¤ªà¤°à¤£à¥\8dयाà¤\95रिता [//meta.wikimedia.org/wiki/Help:Contents à¤¯à¥\82à¤\9cर à¤\97ाà¤\88ड] à¤ªà¤¹à¤¾.\n\n== à¤¸à¥\81रà¥\81वात ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings à¤\95à¥\89नà¥\8dफिà¤\97रà¥\87शन à¤¸à¥\87à¤\9fà¥\80à¤\82à¤\97à¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ à¤®à¥\80डियाविà¤\95à¥\80 à¤¨à¥\87हमà¥\80 à¤µà¤¿à¤\9aारलà¥\87 à¤\9cाणारà¥\87 à¤ªà¥\8dरशà¥\8dन]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce à¤®à¥\80डियाविà¤\95ि à¤®à¥\87लिà¤\82à¤\97 à¤²à¤¿à¤¸à¥\8dà¤\9f]"
+       "mainpagedocfooter": "विà¤\95à¥\80 à¤¸à¥\89फà¥\8dà¤\9fवà¥\87à¤\85र à¤µà¤¾à¤ªà¤°à¤£à¥\8dयाà¤\95रिता [//meta.wikimedia.org/wiki/Help:Contents à¤µà¤¾à¤ªà¤°à¤\95रà¥\8dता à¤®à¤¾à¤°à¥\8dà¤\97दरà¥\8dशिà¤\95ा] à¤ªà¤¹à¤¾.\n\n== à¤¸à¥\81रà¥\81वात à¤\95रा ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings à¤°à¤\9aित à¤®à¤¾à¤\82डणà¥\8dयाà¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95ि FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-मिडियाविà¤\95िà¤\9aà¥\80 à¤®à¥\87लिà¤\82à¤\97 à¤¯à¤¾à¤¦à¥\80à¤\9aà¥\87 à¤µà¤¿à¤®à¥\8bà¤\9aनाà¤\9aà¥\80 à¤\89दà¥\8dà¤\98à¥\8bषणा]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources à¤\86पलà¥\8dया à¤­à¤¾à¤·à¥\87साठà¥\80 à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95िà¤\9aà¥\87 à¤¸à¥\8dथानिà¤\95िà¤\95रण à¤\95रा]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam à¤\86पलà¥\8dया à¤µà¤¿à¤\95िवर à¤¸à¥\8dपà¥\85मशà¥\80 à¤¦à¥\8bन à¤¹à¤¾à¤¤ à¤\95सà¥\87 à¤\95रावà¥\87 à¤¤à¥\87 à¤¶à¤¿à¤\95ा]"
 }
index 35db182..561d097 100644 (file)
        "config-logo": "URL d\"o logo:",
        "config-logo-help": "'A skin predefinita 'e MediaWiki tene spazion p' 'o logo 'e 135 x 160 pixel ncopp' 'o menu laterale.\nCarreca n'immaggene 'e diminziuna apprupriata e azzecca l'URL ccà.\n\nFosse pussibbele ausà <code>$wgStylePath</code> o <code>$wgScriptPath</code> si 'o logo è relativo a sti percurze. Si nun vulite nu logo, lassate abbacante sta casciulella.",
        "config-instantcommons": "Appiccia Instant Commons",
+       "config-instantcommons-help": "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] è na funziunalita ca premmettesse 'e wiki 'ausà immaggene, suone e ati file multimediale ca ve truvate ncopp' 'o sito 'e [//commons.wikimedia.org/ Wikimedia Commons].\nSi chesto vulite fà, MediaWiki vulesse accieso a Internet.\n\nPe n'avé cchiù nfurmaziune ncopp'a sta funziunalità, ncludenno 'e struziune ncopp' 'a configuraziona pe' wiki divierze 'e Wikimedia Commons, fermateve nu poco a stureà [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 'o manuale].",
        "config-cc-error": "'O selettore 'e licienze Creative Commons nun mmustaje nisciuno risultato.\nNzertate manualmente 'o nomme d' 'a licienza.",
        "config-cc-again": "Selezziona n'ata vota...",
        "config-cc-not-chosen": "Sciglite quale licienza Creative Commons desiderate e cliccate ncopp' 'a \"prucede\".",
        "config-skins-missing": "Nisciuna skin s'è truvata, MediaWiki ausasse na soluzione 'e ripiego nfin'a quanno nun sarrà installata una buona.",
        "config-skins-must-enable-some": "Avit'a scegliere minimo na skin p' 'a puté appiccià.",
        "config-skins-must-enable-default": "'A skin scigliuta comme predefinita s'avess'appiccià.",
+       "config-install-alreadydone": "'''Attenziò:''' pare c'avite già installato MediaWiki e state tentanno 'e installà chesto n'ata vota.\nPrucedete 'a paggena aroppa.",
+       "config-install-begin": "Spremmènno \"{{int:config-continue}}\", s'abbiàsse l'installaziona 'e MediaWiki.\nSi primma vulite dà ati cagnamiente, spremmìte \"{{int:config-back}}\".",
        "config-install-step-done": "fatto",
        "config-install-step-failed": "fallito",
        "config-install-extensions": "Ncludenno 'estenziune",
        "config-install-database": "Configurazione database",
        "config-install-schema": "Crianno schema",
        "config-install-pg-schema-not-exist": "'O schema PostgreSQL nun esiste.",
+       "config-install-pg-schema-failed": "Criazione 'e tabbelle scassata.\nCuntrullate si l'utente \"$1\" può scrivere dint' 'o schema \"$2\".",
        "config-install-pg-commit": "Mannann' 'e cagnamiente",
        "config-install-pg-plpgsql": "Cuntrollo p' 'o lenguaggio PL/pgSQL",
        "config-pg-no-plpgsql": "Ce vulesse 'a installazione d' 'o linguagio PL/pgSQL dint' 'o database $1",
+       "config-pg-no-create-privs": "'O cunto innecato p' 'a installazione nun tene premmesse abbastanza pe' puté crià n'utenza.",
        "config-pg-not-in-role": "'O cunto c'avite nzegnato p' 'o utente web esiste già.\n'O cunto dato pe' ce fà 'installazione nun è n'utente avanzato e nun è nu membro d' 'o ruolo 'utente web, picciò nun è in grado 'e se crià oggette 'e pruprietà 'utente web.\n\nMediaWiki mo' addimanna ch' 'e tabbelle fossero pruprietà 'e ll'utente web. Putite nzegnà n'atu cunto web, o facite pure \"arreto\" e specificate n'utente pe' ce ffà 'installazione opportunamente privileggiato.",
        "config-install-user": "Crianno utente 'e database",
        "config-install-user-alreadyexists": "L'utente \"$1\" esiste già",
        "config-install-interwiki-exists": "'''Attenziò:''' 'a tabbella interwiki pare ca cuntenesse già elemente.\nZumpann' 'a lista predefinita.",
        "config-install-stats": "Inizializzaziona d' 'e statistiche",
        "config-install-keys": "Generaziona d' 'e chiave segrete",
+       "config-insecure-keys": "'''Attenziò:''' {{PLURAL:$2|Na chiave sicura|'E chiave sicure}} ($1) {{PLURAL:$2|generata|generate}} pe' tramente ca se fà l'installazione nun {{PLURAL:$2|è|songo}} completamente {{PLURAL:$2|sicura|sicure}}. Cunziderate d' {{PLURAL:$2|'a|'e}} cagnà manualmente.",
        "config-install-updates": "Mpiccià ll'agghiurnamiente ca nun fossero necessarie",
+       "config-install-updates-failed": "<strong>Errore:</strong> l'inserimento d' 'e chiave 'agghiurnamiento dint' 'e tabbelle nun è asciuto pecché se cunfermaje l'errore ccà annanze: $1",
        "config-install-sysop": "Crianno nu cunto utente ammenistratore",
        "config-install-subscribe-fail": "Nun se pò sottoscrivere mediawiki-announce: $1",
+       "config-install-subscribe-notpossible": "cURL nun è installato e <code>allow_url_fopen</code> nun è disponibbele.",
        "config-install-mainpage": "Crianno 'a paggena prencepale ch' 'e cuntenute predefinite",
        "config-install-extension-tables": "Crianno tabelle pe' estenziune appicciate",
        "config-install-mainpage-failed": "Nun se pò nzertà 'a paggena prencepale: $1",
+       "config-install-done": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki apposto.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto e 'o nzertà dint' 'a cartella bbase d' 'o wiki vuosto ('a stessa addò fosse prisente l' index.php). 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' 'o cullegamento 'e seguito:\n\n$3\n\n<strong>Nota:</strong> si ascite mò 'a ll'installazione senza manco scarrecà 'o file 'e configurazione che s'è criato, po chesto nun sarrà cchiù dispunibbele.\n\nQuanno fosse tutto fernuto allora <strong>[$2 trasite dint' 'o wiki vuosto]</strong>.",
        "config-download-localsettings": "Scarreca <code>LocalSettings.php</code>",
        "config-help": "ajùto",
        "config-help-tooltip": "cliccà pe' 'o spannere",
        "config-nofile": "'O file \"$1\" nun se trova. Forse è stato scancellato?",
-       "mainpagetext": "<strong>MediaWiki è stato nstallato.</strong>"
+       "config-extension-link": "'O sapevate ch' 'o wiki vuosto suppurtasse 'e [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensiune]?\n\nPutite navigà nfra chiste [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensiune pe' categurìa].",
+       "mainpagetext": "<strong>MediaWiki è stato nstallato.</strong>",
+       "mainpagedocfooter": "Iate a cunzultà [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe' n'avé nfurmaziune ncopp' 'o modo aùso d' 'o software wiki.\n\n== P'accummincià ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenco 'e mpustaziune pe' sta configuraziona]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ 'e Mediawiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenco 'e nutizie 'e Mediawiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione 'e MediaWiki p' 'a lengua vuosta]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Mparate a cumbattere 'o spammo dint' 'a wiki d' 'a vosta]"
 }
index 6a1d4a4..051fe92 100644 (file)
        "config-nofile": "Nie udało się odnaleźć pliku \"$1\". Czy nie został usunięty?",
        "config-extension-link": "Czy wiesz, że twoja wiki obsługuje [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions/pl rozszerzenia]?\n\nMożesz przejrzeć [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category rozszerzenia według kategorii] lub [//www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] aby zobaczyć pełną listę rozszerzeń.",
        "mainpagetext": "'''Instalacja MediaWiki powiodła się.'''",
-       "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika] w celu uzyskania informacji o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]"
+       "mainpagedocfooter": "Zobacz [//meta.wikimedia.org/wiki/Help:Contents przewodnik użytkownika], aby uzyskać informacje o działaniu oprogramowania wiki.\n\n== Na początek ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/pl Lista ustawień konfiguracyjnych]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/pl MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Komunikaty o nowych wersjach MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Przetłumacz MediaWiki na swój język]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam \nDowiedz się, jak walczyć ze spamem na swojej wiki]"
 }
index 8b82db0..bf8da76 100644 (file)
@@ -65,5 +65,5 @@
        "config-help": "ajute",
        "config-help-tooltip": "cazze pe spannere",
        "mainpagetext": "'''MediaUicchi ha state 'nstallete.'''",
-       "mainpagedocfooter": "Vè vide [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer wiki.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste pe le configuraziune]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]"
+       "mainpagedocfooter": "Vè 'ndruche [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pe l'mbormaziune sus a cumme s'ause 'u softuer uicchi.\n\n== Pe accumenzà ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenghe de le 'mbostaziune pa configurazione]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ de MediaUicchi]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenghe d'a poste de MediaUicchi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione de MediaUicchi pa lènga toje]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 'Mbare accume combattere condre a 'u rummate sus 'a uicchi toje]"
 }
index c4ccec6..c987980 100644 (file)
        "config-nofile": "Файл \"$1\" не удается найти. Он был удален?",
        "config-extension-link": "Знаете ли вы, что ваш вики-проект поддерживает [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions расширения]?\n\nВы можете просмотреть [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category расширения по категориям] или [//www.mediawiki.org/wiki/Extension_Matrix матрицу расширений], чтобы увидеть их полный список.",
        "mainpagetext": "'''Вики-движок «MediaWiki» успешно установлен.'''",
-       "mainpagedocfooter": "Информацию по работе с этой вики можно найти в [//meta.wikimedia.org/wiki/Help:Contents/ru справочном руководстве].\n\n== Некоторые полезные ресурсы ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];\n* [//www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]"
+       "mainpagedocfooter": "Информацию по работе с этой вики можно найти в [//meta.wikimedia.org/wiki/Help:Contents/ru справочном руководстве].\n\n== Некоторые полезные ресурсы ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];\n* [//www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка уведомлений о выходе новых версий MediaWiki].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Узнайте, как бороться со спамом в вашей вики]"
 }
index 6b3b8f2..33fa590 100644 (file)
@@ -13,7 +13,7 @@
        "config-continue": "اڳتي →",
        "config-page-language": "ٻولي",
        "config-page-welcome": "ذريعات‌وڪي تي ڀلي ڪري آيا!",
-       "config-page-dbconnect": "اعداد خاني سان جُڙو",
+       "config-page-dbconnect": "اعدادخاني سان جُڙو",
        "config-page-upgrade": "هاڻوڪي تنصيبڪاريءَ کي سڌاريو",
        "config-page-dbsettings": "اعدادخاني جون سيٽڱس",
        "config-page-name": "نالو",
index d7f435e..f5eb7fa 100644 (file)
@@ -48,7 +48,6 @@
        "config-env-bad": "Okolje je pregledano.\nNe morete namestiti MediaWiki.",
        "config-env-php": "Nameščen je PHP $1.",
        "config-env-hhvm": "HHVM $1 je nameščen.",
-       "config-unicode-using-utf8": "Uporaba utf8_normalize.so Briona Vibberja za normalizacijo unikoda.",
        "config-unicode-using-intl": "Uporaba [http://pecl.php.net/intl razširitve PECL intl] za normalizacijo unikoda.",
        "config-memory-raised": "PHP-jev <code>memory_limit</code> je $1, dvignjen na $2.",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] je nameščen",
@@ -66,8 +65,6 @@
        "config-db-install-account": "Uporabniški račun za namestitev",
        "config-db-username": "Uporabniško ime zbirke podatkov:",
        "config-db-password": "Geslo zbirke podatkov:",
-       "config-db-password-empty": "Prosimo, vnesite geslo za novega uporabnika podatkovne zbirke: $1. Morda je mogoče ustvarjati uporabnike brez gesel, ni pa varno.",
-       "config-db-username-empty": "Vnesti morate vrednost za \"{{int:config-db-username}}\".",
        "config-db-install-username": "Vnesite uporabniško ime za povezavo s podatkovno zbirko med postopkom nameščanja.\nTo ni uporabniško ime računa MediaWiki, pač pa uporabniško ime za vašo podatkovno zbirko.",
        "config-db-install-password": "Vnesite geslo za povezavo s podatkovno zbirko med postopkom nameščanja.\nTo ni geslo računa MediaWiki, pač pa geslo za vašo podatkovno zbirko.",
        "config-db-install-help": "Vnesite uporabniško ime in geslo za povezavo s podatkovno zbirko med postopkom nameščanja.",
        "config-download-localsettings": "Prenesi <code>LocalSettings.php</code>",
        "config-help": "pomoč",
        "mainpagetext": "'''Programje MediaWiki je bilo uspešno nameščeno.'''",
-       "mainpagedocfooter": "Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]"
+       "mainpagedocfooter": "Oglejte si [//meta.wikimedia.org/wiki/Help:Contents Uporabniški priročnik] za informacije o uporabi programja wiki.\n\n== Kako začeti ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Seznam konfiguracijskih nastavitev]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Poogsto zastavljena vprašanja MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Poštni seznam izdaj MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Prevedite MediaWiki v svoj jezik]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Izvedite, kako se boriti proti smetju na svojem wikiju]"
 }
index 95dad25..5ba505e 100644 (file)
@@ -64,7 +64,7 @@
        "config-site-name": "Име викија:",
        "config-admin-name": "Корисничко име:",
        "config-admin-password": "Лозинка:",
-       "config-admin-email": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е:",
+       "config-admin-email": "Ð\98меÑ\98л Ð°Ð´Ñ\80еÑ\81а:",
        "config-optional-skip": "Досадно ми је, хајде да инсталирамо вики.",
        "config-profile-no-anon": "Неопходно је отворити налог",
        "config-profile-fishbowl": "Само овлашћени корисници",
@@ -77,7 +77,7 @@
        "config-license-cc-0": "Creative Commons Zero (јавно власништво)",
        "config-license-gfdl": "ГНУ-ова лиценца за слободну документацију верзија 1.3 или новија верзија",
        "config-license-pd": "Јавно власништво",
-       "config-email-settings": "Ð\9fодеÑ\88аваÑ\9aа Ðµ-поÑ\88Ñ\82е",
+       "config-email-settings": "Ð\9fодеÑ\88аваÑ\9aа Ð¸Ð¼ÐµÑ\98ла",
        "config-cc-not-chosen": "Одаберите која Кријејтив комонс лиценца вам одговара и потврдите.",
        "config-skins": "Теме",
        "config-install-step-done": "готово",
@@ -85,5 +85,5 @@
        "config-help": "помоћ",
        "config-help-tooltip": "кликните да проширите",
        "mainpagetext": "'''Медијавики је успешно инсталиран.'''",
-       "mainpagedocfooter": "Погледајте [//meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]"
+       "mainpagedocfooter": "Погледајте [//meta.wikimedia.org/wiki/Help:Contents кориснички водич] за коришћење програма.\n\n== Увод ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Помоћ у вези са подешавањима]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Често постављена питања]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научите како да се борете против спама на Вашој вики]"
 }
index c3fb23b..20c8c38 100644 (file)
@@ -13,7 +13,9 @@
                        "Sadrettin",
                        "Captantrips",
                        "Stultiwikia",
-                       "Meelo"
+                       "Meelo",
+                       "HakanIST",
+                       "McAang"
                ]
        },
        "config-desc": "MediaWiki yükleyicisi",
@@ -96,8 +98,6 @@
        "config-db-install-account": "Yükleme için kullanıcı hesabı",
        "config-db-username": "Veritabanı kullanıcı adı:",
        "config-db-password": "Veritabanı parolası:",
-       "config-db-password-empty": "Şu yeni veritabanı kullanıcısı için bir parola belirleyin: $1\nParolası olmayan hesaplar yaratmak mümkün olabilirse de, güvenli değildir.",
-       "config-db-username-empty": "\"{{int:config-db-username}}\" için bir değer girmelisiniz.",
        "config-db-install-username": "Yükleme sırasında veritabanına bağlanmak için kullanılan kullanıcı adını girin.\nBu MediaWiki hesabının kullanıcı adı değildir; Bu veritabanın kullanıcı adıdır.",
        "config-db-install-password": "Kurulum işlemi boyunca veritabanına bağlanmak için kullanılacak şifreyi girin.\nBu şifre MediaWiki hesap şifresi değil, veritabanınızın şifresidir.",
        "config-db-install-help": "Kurulum işlemi boyunca veritabanına bağlanmak için kullanıcı adı ve şifre giriniz.",
        "config-nofile": "\"$1\" dosyası bulunamadı. Silindi mi?",
        "config-extension-link": "Vikinizin [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions eklentileri] desteklediğini biliyor musunuz?\n\n[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Eklentileri kategorilerine göre] inceleyebilir ya da tüm eklentilerin listesini görmek için [//www.mediawiki.org/wiki/Extension_Matrix Eklenti Matrisine] bakabilirsiniz.",
        "mainpagetext": "'''MediaWiki başarı ile kuruldu.'''",
-       "mainpagedocfooter": "Viki yazılımının kullanımı hakkında bilgi almak için [//meta.wikimedia.org/wiki/Help:Contents kullanıcı rehberine] bakınız.\n\n== Yeni Başlayanlar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Yapılandırma ayarlarının listesi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki SSS]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]"
+       "mainpagedocfooter": "Viki yazılımının kullanımı hakkında bilgi almak için [//meta.wikimedia.org/wiki/Help:Contents kullanıcı rehberine] bakınız.\n\n== Yeni Başlayanlar ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Yapılandırma ayarlarının listesi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki SSS]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-posta listesi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Kendi diliniz için MediaWiki yerelleştirmesi]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Kendi vikinizde spam ile nasıl savaşılacağını öğrennin]"
 }
index c4a230c..13cd520 100644 (file)
@@ -11,5 +11,5 @@
        "config-page-language": "Тел",
        "config-page-welcome": "MediaWiki проектына рәхим итегез!",
        "mainpagetext": "«MediaWiki» уңышлы куелды.",
-       "mainpagedocfooter": "Бу вики турында мәгълүматны [//meta.wikimedia.org/wiki/Help:Contents биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki турында еш бирелгән сораулар һәм җаваплар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]."
+       "mainpagedocfooter": "Бу вики турында мәгълүматны [//meta.wikimedia.org/wiki/Help:Contents биредә] табып була.\n\n== Кайбер файдалы ресурслар ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Көйләнмәләр исемлеге (инг.)];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki турында еш бирелгән сораулар һәм җаваплар (инг.)];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'ның яңа версияләре турында хәбәрләр яздырып алу];\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language].\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
 }
index 3923f7e..08c2ae9 100644 (file)
@@ -4,7 +4,8 @@
                        "පසිඳු කාවින්ද",
                        "Minh Nguyen",
                        "Withoutaname",
-                       "Dinhxuanduyet"
+                       "Dinhxuanduyet",
+                       "Nguyên Lê"
                ]
        },
        "config-desc": "Trình cài đặt MediaWiki",
@@ -22,7 +23,7 @@
        "config-no-session": "Đã mất dữ liệu phiên làm việc của bạn! Kiểm tra tập tin php.ini và đảm bảo rằng <code>session.save_path</code> đã được đặt thành một thư mục thích hợp.",
        "config-your-language": "Ngôn ngữ của bạn:",
        "config-your-language-help": "Chọn một ngôn ngữ để sử dụng trong quá trình cài đặt.",
-       "config-wiki-language": "Ngôn ngữ wiki:",
+       "config-wiki-language": "Ngôn ngữ của wiki:",
        "config-wiki-language-help": "Chọn ngôn ngữ chủ yếu của nội dung trong wiki này.",
        "config-back": "← Lùi",
        "config-continue": "Tiếp →",
        "config-mysql-utf8": "UTF-8",
        "config-mysql-charset-help": "Trong <strong>chế độ nhị phân</strong>, MediaWiki lưu văn bản UTF-8 vào cơ sở dữ liệu trong các trường nhị phân.\nĐiều này hiệu quả hơn so với chế độ UTF-8 của MySQL, và cho phép bạn sử dụng đầy đủ các ký tự Unicode.\n\nTrong <strong>chế độ UTF-8 </strong>, MySQL sẽ biết những ký tự nào thiết lập dữ liệu của bạn, và có thể trình bày và chuyển đổi nó một cách thích hợp, nhưng nó sẽ không cho phép bạn lưu trữ các ký tự nằm trên [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].",
        "config-mssql-auth": "Kiểu xác thực:",
-       "config-mssql-install-auth": "Chọn loại xác thực sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nNếu bạn chọn \"{{int:config-mssql-windowsauth}}\", thông tin của bất cứ người sử dụng nào mà máy chủ web đang chạy sẽ được sử dụng.",
-       "config-mssql-web-auth": "Chọn kiểu xác thực mà máy chủ web sẽ sử dụng để kết nối đến máy chủ cơ sở dữ liệu, trong quá trình hoạt động bình thường của wiki.\nNếu bạn chọn \"{{int:config-mssql-windowsauth}}\", thông tin của bất cứ người sử dụng nào mà máy chủ web đang hoạt động sẽ được sử dụng.",
+       "config-mssql-install-auth": "Chọn loại xác thực sẽ được sử dụng để kết nối với cơ sở dữ liệu trong quá trình cài đặt.\nNếu bạn chọn “{{int:config-mssql-windowsauth}}”, thông tin của bất cứ người sử dụng nào mà máy chủ web đang chạy sẽ được sử dụng.",
+       "config-mssql-web-auth": "Chọn kiểu xác thực mà máy chủ web sẽ sử dụng để kết nối đến máy chủ cơ sở dữ liệu, trong quá trình hoạt động bình thường của wiki.\nNếu bạn chọn “{{int:config-mssql-windowsauth}}”, thông tin của bất cứ người sử dụng nào mà máy chủ web đang hoạt động sẽ được sử dụng.",
        "config-mssql-sqlauth": "Xác thực SQL Server",
        "config-mssql-windowsauth": "Xác thực Windows",
        "config-site-name": "Tên wiki:",
        "config-admin-password-blank": "Nhập mật khẩu của tài khoản bảo quản viên.",
        "config-admin-password-mismatch": "Bạn đã nhập hai mật khẩu không khớp với nhau.",
        "config-admin-email": "Địa chỉ thư điện tử:",
-       "config-admin-email-help": "Nhập một địa chỉ email vào đây để cho phép bạn nhận được email từ những người dùng khác trên wiki, thiết lập lại mật khẩu của bạn, và sẽ được thông báo về những thay đổi trong các trang nằm trong danh sách theo dõi của bạn. Bạn có thể để trống trường này.",
+       "config-admin-email-help": "Nhập một địa chỉ thư điện tử vào đây để cho phép bạn nhận được thư điện tử từ những người dùng khác trên wiki, đặt lại mật khẩu của bạn, và được thông báo về những thay đổi trong các trang nằm trong danh sách theo dõi của bạn. Bạn có thể để trống trường này.",
        "config-admin-error-user": "Lỗi nội bộ khi tạo một admin với tên <nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Lỗi nội bộ khi thiết lập một mật khẩu cho admin \" <nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Bạn đã nhập một địa chỉ thư điện tử không hợp lệ.",
        "config-subscribe": "Theo dõi [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce danh sách thư thông báo phát hành].",
        "config-subscribe-help": "thông báo an ninh.\nBạn nên đồng ý với nó và cập nhật bản cài đặt MediaWiki của bạn khi phiên bản mới xuất hiện.",
-       "config-subscribe-noemail": "Bạn đã cố gắng để đăng ký vào danh sách nhận thư thông báo phát hành mà không cung cấp một địa chỉ email nào cả.\nVui lòng cung cấp một địa chỉ email nếu bạn muốn đăng ký vào danh sách nhận thư.",
+       "config-subscribe-noemail": "Bạn đã cố gắng để đăng ký vào danh sách thư thông báo phát hành mà không cung cấp một địa chỉ thư điện tử nào cả.\nVui lòng cung cấp một địa chỉ thư điện tử nếu bạn muốn đăng ký vào danh sách thư.",
        "config-almost-done": "Bạn gần như đã hoàn tất!\nBây giờ bạn có thể bỏ qua cấu hình còn lại và cài đặt wiki ngay bây giờ.",
        "config-optional-continue": "Hỏi tôi về thêm chi tiết.",
        "config-optional-skip": "Chán quá, cài đặt wiki rỗi.",
        "config-profile-no-anon": "Bắt buộc mở tài khoản",
        "config-profile-fishbowl": "Chỉ những người dùng được phép",
        "config-profile-private": "Wiki riêng tư",
-       "config-profile-help": "Wiki làm việc tốt nhất khi có càng nhiều người chỉnh sửa chúng nhất có thể.\nTrong MediaWiki, rất dễ dàng để xem lại các thay đổi gần đây, và quay trở lại tình trạng ban đầu trước bất kỳ thiệt hại nào được thực hiện bởi người dùng vô tình hoặc người dùng có dụng ý xấu.\n\nTuy nhiên, nhiều người thấy là MediaWiki rất hữu ích trong chừng mực nào đó, và đôi khi thật không phải dễ dàng để thuyết phục mọi người về những lợi ích theo cách thức mà wiki mang lại.\nVì vậy, bạn có sự lựa chọn của riêng bạn.\n\nMô hình <strong>{{int:config-profile-wiki}}</strong> cho phép bất cứ ai tham gia chỉnh sửa, thậm chí không cần đăng nhập.\nMột wiki với <strong>{{int:config-profile-no-anon}}</strong> cung cấp thêm trách nhiệm, nhưng có thể ngăn chặn những người đóng góp thông thường.\n\nKịch bản <strong>{{int:config-profile-fishbowl}}</strong>  cho phép người dùng được duyệt chỉnh sửa, nhưng công chúng có thể xem các trang web, bao gồm cả lịch sử.\nMột <strong>{{int:config-profile-private}}</strong> chỉ cho phép được duyệt xem các trang, với cùng nhóm được phép chỉnh sửa.\n\nNhiều cấu hình quyền sử dụng phức tạp có sẵn sau khi cài đặt, xin xem [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights relevant manual entry].",
+       "config-profile-help": "Wiki hoạt động tốt nhất khi có càng nhiều người sửa đổi nó nhất có thể.\nTrong MediaWiki, có thể rất dễ dàng xem lại các thay đổi gần đây và lùi lại bất kỳ thiệt hại nào được thực hiện bởi người dùng vô tình hoặc người dùng có dụng ý xấu.\n\nTuy nhiên, nhiều người thấy là MediaWiki rất hữu ích trong chừng mực nào đó, và đôi khi thật không phải dễ dàng để thuyết phục mọi người về những lợi ích theo cách thức mà wiki mang lại.\nVì vậy, bạn có sự lựa chọn của riêng bạn.\n\nMô hình <strong>{{int:config-profile-wiki}}</strong> cho phép bất cứ ai tham gia sửa đổi, thậm chí không cần đăng nhập.\nMột wiki với <strong>{{int:config-profile-no-anon}}</strong> cung cấp thêm trách nhiệm, nhưng có thể ngăn chặn những người đóng góp thông thường.\n\nTùy chọn <strong>{{int:config-profile-fishbowl}}</strong> cho phép người dùng được duyệt sửa đổi, nhưng công chúng có thể xem các trang, bao gồm cả lịch sử.\nMột <strong>{{int:config-profile-private}}</strong> chỉ cho phép được duyệt xem các trang, với cùng nhóm được phép sửa đổi.\n\nNhiều cấu hình quyền sử dụng phức tạp có sẵn sau khi cài đặt, xin xem [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights mục liên quan trong sách hướng dẫn].",
        "config-license": "Bản quyền và giấy phép:",
        "config-license-none": "Không hiển thị giấy phép ở chân trang",
        "config-license-cc-by-sa": "Creative Commons Ghi công–Chia sẻ tương tự",
        "config-license-help": "Nhiều wiki công khai phát hành tất cả các đóng góp theo một [http://freedomdefined.org/Definition/Vi?uselang=vi giấy phép tự do].\nĐiều này giúp tạo nên thái độ cộng đồng sở hữu và ủng hộ sự đóng góp lâu dài.\nNói chung, một wiki riêng tư hoặc của công ty không nhất thiết phải sử dụng một giấy phép tự do.\n\nNếu bạn muốn được phép sử dụng văn bản từ Wikipedia và muốn Wikipedia nhận được những văn bản được sao chép từ wiki của bạn, bạn nên chọn <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nWikipedia từng sử dụng Giấy phép Tài liệu Tự do GNU.\nGFDL là một giấy phép hợp lệ nhưng khó hiểu trên thực tế.\nNội dung được phát hành theo GFDL cũng khó tái sử dụng.",
        "config-email-settings": "Thiết lập thư điện tử",
        "config-enable-email": "Cho phép gửi thư điện tử đi",
-       "config-enable-email-help": "Nếu bạn muốn email để làm việc, [http://www.php.net/manual/en/mail.configuration.php thiết lập mail của PHP] cần phải được cấu hình đúng.\nNếu bạn không muốn sử dụng bất kỳ tính năng email nào, bạn có thể vô hiệu chúng ở đây.",
+       "config-enable-email-help": "Nếu bạn muốn khả năng gửi thư điện tử, [http://www.php.net/manual/en/mail.configuration.php thiết lập mail của PHP] cần phải được cấu hình đúng.\nNếu bạn không muốn sử dụng bất kỳ tính năng thư điện tử nào, bạn có thể vô hiệu chúng ở đây.",
        "config-email-user": "Cho phép người dùng gửi thư điện tử cho người dùng khác",
-       "config-email-user-help": "Cho phép tất cả người dùng gửi email cho nhau, nếu họ đã kích hoạt nó trong cài đặt tùy chọn của họ.",
+       "config-email-user-help": "Cho phép tất cả người dùng gửi thư điện tử cho nhau, nếu họ đã kích hoạt nó trong cài đặt tùy chọn của họ.",
        "config-email-usertalk": "Gửi thư thông báo về tin nhắn mới",
        "config-email-usertalk-help": "Cho phép người dùng nhận được thông báo về các thay đổi trong trang thảo luận người dùng, nếu họ đã kích hoạt nó trong cài đặt tùy chọn của họ.",
        "config-email-watchlist": "Gửi thư thông báo về bài theo dõi",
        "config-email-watchlist-help": "Cho phép người dùng nhận được thông báo về các trang theo dõi của họ nếu họ đã kích hoạt nó trong ưu tiên của họ.",
        "config-email-auth": "Xác minh qua thư điện tử",
-       "config-email-auth-help": "Nếu tùy chọn này được kích hoạt, người dùng phải xác nhận địa chỉ email của họ bằng cách sử dụng một liên kết được gửi tới cho họ bất cứ khi nào họ thiết lập hoặc thay đổi nó.\nChỉ có địa chỉ email được xác thực mới có thể nhận email từ những người dùng khác hoặc các email thông báo thay đổi.\nThiết lập tùy chọn này <strong>khuyến cáo sử dụng</strong> cho các wiki công cộng do khả năng các tính năng email dễ bị lạm dụng để gây hại.",
+       "config-email-auth-help": "Nếu tùy chọn này được kích hoạt, người dùng phải xác nhận địa chỉ thư điện tử của họ bằng cách sử dụng một liên kết được gửi tới cho họ bất cứ khi nào họ thiết lập hoặc thay đổi nó.\nChỉ có địa chỉ thư điện tử được xác thực mới có thể nhận thư điện tử từ những người dùng khác hoặc thay đổi địa chỉ thông báo.\nThiết lập tùy chọn này <strong>khuyến cáo sử dụng</strong> cho các wiki công cộng do khả năng các tính năng gửi thư điện tử dễ bị lạm dụng để gây hại.",
        "config-email-sender": "Địa chỉ thư điện tử trả lại:",
-       "config-email-sender-help": "Nhập địa chỉ email để làm địa chỉ trở về trong mail gửi đi.\nĐây là nơi mà thư từ chối sẽ được gửi đi.\nNhiều máy chủ mail yêu cầu phải có ít nhất là phần tên miền để đảm bảo tính hợp lệ.",
+       "config-email-sender-help": "Nhập địa chỉ thư điện tử để làm địa chỉ trở về trong thư gửi đi.\nĐây là nơi mà thư từ chối sẽ được gửi đi.\nNhiều máy chủ thư điện tử yêu cầu phải có ít nhất là phần tên miền để đảm bảo tính hợp lệ.",
        "config-upload-settings": "Hình ảnh và tập tin tải lên",
        "config-upload-enable": "Cho phép tải lên tập tin",
        "config-upload-help": "Tập tin tải lên có khả năng làm lộ các nguy cơ bảo mật của máy chủ của bạn.\nĐể biết thêm thông tin, xin đọc [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security phần bảo mật] trong tài liệu hướng dẫn.\n\nĐể kích hoạt tính năng tải tập tin lên, thay đổi chế độ trên thư mục con <code>hình ảnh</code> trong thư mục gốc (root) của MediaWiki để máy chủ web có thể lưu dữ liệu vào đó.\nSau đó kích hoạt tùy chọn này.",
        "config-skins-must-enable-some": "Phải chọn ít nhất một giao diện để kích hoạt.",
        "config-skins-must-enable-default": "Giao diện được chọn làm mặc định phải được kích hoạt.",
        "config-install-alreadydone": "<strong>Cảnh báo:</strong> Bạn dường như đã cài đặt MediaWiki và đang cố gắng để cài đặt nó lại một lần nữa.\nXin hãy chuyển sang trang tiếp theo.",
-       "config-install-begin": "Bằng cách nhấn \"{{int:config-continue}}\", bạn sẽ bắt đầu cài đặt MediaWiki của mình.\nNếu bạn vẫn muốn thay đổi, nhấn \"{{int:config-back}}\".",
+       "config-install-begin": "Bằng cách nhấn “{{int:config-continue}}”, bạn sẽ bắt đầu cài đặt MediaWiki của mình.\nNếu bạn vẫn muốn thay đổi, nhấn “{{int:config-back}}”.",
        "config-install-step-done": "hoàn tất",
        "config-install-step-failed": "thất bại",
        "config-install-extensions": "Đang bao gồm phần mở rộng",
        "config-install-interwiki-exists": "'''Cảnh báo:''' Hình như đã có mục trong bảng liên wiki.\nĐã bỏ qua danh sách mặc định.",
        "config-install-stats": "Đang khởi tạo các thống kê",
        "config-install-keys": "Tạo ra các chìa khóa bí mật",
-       "config-insecure-keys": "<strong>Cảnh báo:</strong>{{PLURAL:$2|Một khóa an toàn|Khóa an toàn}} ($1) được tạo ra trong quá trình cài đặt {{PLURAL:$2|là}} không hoàn toàn an toàn. Hãy cân nhắc việc thay đổi {{PLURAL: $2|nó|chúng}} bằng tay.",
+       "config-insecure-keys": "<strong>Cảnh báo:</strong> {{PLURAL:$2|Một khóa an toàn|Khóa an toàn}} ($1) được tạo ra trong quá trình cài đặt {{PLURAL:$2}}không phải an toàn hẳn. Hãy cân nhắc việc thay đổi {{PLURAL:$2|nó|chúng}} thủ công.",
        "config-install-updates": "Tránh các cập nhật không cần thiết",
        "config-install-updates-failed": "<strong>Lỗi:</strong> Chèn phím cập nhật vào các bảng không thành công với các lỗi sau:1$",
        "config-install-sysop": "Đang mở tài khoản người dùng bảo quản viên",
        "config-install-mainpage": "Đang tạo trang đầu với nội dung mặc định",
        "config-install-extension-tables": "Đang tạo bảng cho các phần mở rộng được kích hoạt",
        "config-install-mainpage-failed": "Không thể chèn trang đầu: $1",
-       "config-install-done": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt thành công MediaWiki.\n\nBộ cài đặt đã tạo ra một file <code>LocalSettings.php</code>.\nFile này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thư mục cài đặt wiki của bạn (cùng thư mục với index.php). Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu việc tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
+       "config-install-done": "<strong>Xin chúc mừng!</strong>\nBạn đã cài đặt thành công MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin <code>LocalSettings.php</code>.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thư mục cài đặt wiki của bạn (cùng thư mục với index.php). Việc tải về có lẽ sẽ được khởi động tự động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\n<strong>Lưu ý:</strong> Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể <strong>[$2 truy cập trang wiki của bạn]</strong>.",
        "config-download-localsettings": "Tải về <code>LocalSettings.php</code>",
        "config-help": "Trợ giúp",
        "config-help-tooltip": "nhấn chuột để mở rộng",
        "config-nofile": "Không tìm thấy tập tin “$1”. Nó có phải bị xóa không?",
        "config-extension-link": "Bạn có biết rằng wiki của bạn có hỗ trợ [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions mở rộng]?\n\nBạn có thể truy cập [//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category phần mở rộng theo thể loại] hoặc [//www.mediawiki.org/wiki/Extension_Matrix Ma trận Mở rộng] để xem danh sách đầy đủ các phần mở rộng.",
        "mainpagetext": "'''MediaWiki đã được cài đặt thành công.'''",
-       "mainpagedocfooter": "Xin đọc [//meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]"
+       "mainpagedocfooter": "Xin đọc [//meta.wikimedia.org/wiki/Help:Contents Hướng dẫn sử dụng] để biết thêm thông tin về cách sử dụng phần mềm wiki.\n\n== Để bắt đầu ==\n\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Danh sách các thiết lập cấu hình]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Các câu hỏi thường gặp MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Tìm hiểu cách chống spam tại wiki của bạn]"
 }
index e877280..f3cc63e 100644 (file)
@@ -70,5 +70,5 @@
        "config-help": "הילף",
        "config-nofile": "מ'האט נישט געקענט טרעפן די טעקע \"$1\". צי האט מען זי אויסגעמעקט?",
        "mainpagetext": "'''מעדיעוויקי אינסטאלירט מיט דערפאלג.'''",
-       "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]"
+       "mainpagedocfooter": "גיט זיך אן עצה מיט [//meta.wikimedia.org/wiki/Help:Contents באניצער'ס וועגווײַזער] פֿאר אינפֿארמאציע וויאזוי זיך באנוצן מיט וויקי ווייכוואַרג.\n\n== נוצליכע וועבלינקען פֿאַר אנהייבערס ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings רשימה פון קאנפֿיגוראציעס]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ אפֿט געפֿרעגטע שאלות]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce מעדיעוויקי באפֿרײַאונג פאסטליסטע]* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources איבערזעצן מעדיעוויקי אין אײַער שפראך]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam לערנט וויאזוי צו באקעמפן בפעם אויף אייער וויקי]"
 }
index 414b6e9..5e7ab06 100644 (file)
        "config-nofile": "找不到文件“$1”。它是否已被删除?",
        "config-extension-link": "您是否知道您的wiki支持[//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拓展]?\n您可浏览[//www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category 拓展分类]。",
        "mainpagetext": "'''已成功安装MediaWiki。'''",
-       "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]"
+       "mainpagedocfooter": "请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!\n\n== 入门 ==\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki配置设置列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/zh-hans MediaWiki常见问题]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 本地化MediaWiki到您的语言]\n* [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 了解如何在您的wiki上打击破坏]"
 }
index 1079be0..5ac6f1e 100644 (file)
        "config-license-cc-by-sa": "創作共用 姓名標示-相同方式分享",
        "config-license-cc-by": "創作共用 Attribution",
        "config-license-cc-by-nc-sa": "創作共用 Attribution-NonCommercial-ShareAlike",
-       "config-license-cc-0": "創作共用 Zero (公領域)",
+       "config-license-cc-0": "創作共用 Zero (公領域)",
        "config-license-gfdl": "GNU 自由文件授權條款 1.3 或更高版本",
-       "config-license-pd": "公領域",
+       "config-license-pd": "公領域",
        "config-license-cc-choose": "請選擇一個自訂的創作共用授權條款",
        "config-license-help": "許多開放式 Wiki 會以 [http://freedomdefined.org/Definition 自由授權條款] 的方式釋放出編者的所有貢獻,這有助於構建社群的所有權,並且能鼓勵長期貢獻。對於封閉式的 Wiki 或公司 Wiki 則是非必要的。\n\n如果您希望使用來自維基百科(Wikipedia)的內容,並希望維基百科能接受您的 Wiki 內容,請應選擇 <strong>{{int:config-license-cc-by-sa}}</strong> 授權條款。\n\n維基百科(Wikipedia)先前是使用 GNU 自由文件授權條款,\n但該授權條款的內容較難理解,因此較難再利用在該條款底下的內容。",
        "config-email-settings": "E-mail 設定",
        "config-install-schema": "建立 Schema",
        "config-install-pg-schema-not-exist": "PostgreSQL Schema 不存在",
        "config-install-pg-schema-failed": "資料表建立失敗。\n請確認使用者 \"$1\" 可以寫入 Schema \"$2\"。",
-       "config-install-pg-commit": "提交更改",
+       "config-install-pg-commit": "認可變更中",
        "config-install-pg-plpgsql": "正在檢查 PL/pgSQL 語言",
        "config-pg-no-plpgsql": "您需要安裝 PL/pgSQL 到資料庫 $1",
        "config-pg-no-create-privs": "您所指定用來給安裝程序使用的帳號沒有足夠的權限可以建立新帳號。",
index 3e23391..2d13c7e 100644 (file)
@@ -64,12 +64,17 @@ abstract class Job implements IJobSpecification {
         */
        public static function factory( $command, Title $title, $params = array() ) {
                global $wgJobClasses;
+
                if ( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
 
-                       return new $class( $title, $params );
+                       $job = new $class( $title, $params );
+                       $job->command = $command;
+
+                       return $job;
                }
-               throw new MWException( "Invalid job command `{$command}`" );
+
+               throw new InvalidArgumentException( "Invalid job command '{$command}'" );
        }
 
        /**
index 69a3def..89948f4 100644 (file)
@@ -688,17 +688,6 @@ abstract class JobQueue {
                $stats->updateCount( "jobqueue.{$key}.all", $delta );
                $stats->updateCount( "jobqueue.{$key}.{$type}", $delta );
        }
-
-       /**
-        * Namespace the queue with a key to isolate it for testing
-        *
-        * @param string $key
-        * @return void
-        * @throws MWException
-        */
-       public function setTestingPrefix( $key ) {
-               throw new MWException( "Queue namespacing not supported for this queue type." );
-       }
 }
 
 /**
index 7907614..f10866e 100644 (file)
@@ -33,7 +33,7 @@ class JobQueueDB extends JobQueue {
        const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
        const MAX_OFFSET = 255; // integer; maximum number of rows to skip
 
-       /** @var BagOStuff */
+       /** @var WANObjectCache */
        protected $cache;
 
        /** @var bool|string Name of an external DB cluster. False if not set */
@@ -48,13 +48,10 @@ class JobQueueDB extends JobQueue {
         * @param array $params
         */
        protected function __construct( array $params ) {
-               global $wgMemc;
-
                parent::__construct( $params );
 
                $this->cluster = isset( $params['cluster'] ) ? $params['cluster'] : false;
-               // Make sure that we don't use the SQL cache, which would be harmful
-               $this->cache = ( $wgMemc instanceof SqlBagOStuff ) ? new EmptyBagOStuff() : $wgMemc;
+               $this->cache = ObjectCache::getMainWANInstance();
        }
 
        protected function supportedOrders() {
@@ -144,15 +141,13 @@ class JobQueueDB extends JobQueue {
         * @throws MWException
         */
        protected function doGetAbandonedCount() {
-               global $wgMemc;
-
                if ( $this->claimTTL <= 0 ) {
                        return 0; // no acknowledgements
                }
 
                $key = $this->getCacheKey( 'abandonedcount' );
 
-               $count = $wgMemc->get( $key );
+               $count = $this->cache->get( $key );
                if ( is_int( $count ) ) {
                        return $count;
                }
@@ -170,7 +165,8 @@ class JobQueueDB extends JobQueue {
                } catch ( DBError $e ) {
                        $this->throwDBException( $e );
                }
-               $wgMemc->set( $key, $count, self::CACHE_TTL_SHORT );
+
+               $this->cache->set( $key, $count, self::CACHE_TTL_SHORT );
 
                return $count;
        }
@@ -731,7 +727,7 @@ class JobQueueDB extends JobQueue {
                        // Additional job metadata
                        'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
                        'job_timestamp' => $dbw->timestamp(),
-                       'job_sha1' => wfBaseConvert(
+                       'job_sha1' => Wikimedia\base_convert(
                                sha1( serialize( $job->getDeduplicationInfo() ) ),
                                16, 36, 31
                        ),
index 109ca01..07f2c93 100644 (file)
@@ -497,11 +497,4 @@ class JobQueueFederated extends JobQueue {
                        throw new JobQueueError( 'No queue partitions available.' );
                }
        }
-
-       public function setTestingPrefix( $key ) {
-               /** @var JobQueue $queue */
-               foreach ( $this->partitionQueues as $queue ) {
-                       $queue->setTestingPrefix( $key );
-               }
-       }
 }
index 5bd1cc9..d6247cb 100644 (file)
@@ -286,18 +286,17 @@ class JobQueueGroup {
         * @since 1.23
         */
        public function queuesHaveJobs( $type = self::TYPE_ANY ) {
-               global $wgMemc;
-
                $key = wfMemcKey( 'jobqueue', 'queueshavejobs', $type );
+               $cache = ObjectCache::getLocalClusterInstance();
 
-               $value = $wgMemc->get( $key );
+               $value = $cache->get( $key );
                if ( $value === false ) {
                        $queues = $this->getQueuesWithJobs();
                        if ( $type == self::TYPE_DEFAULT ) {
                                $queues = array_intersect( $queues, $this->getDefaultQueueTypes() );
                        }
                        $value = count( $queues ) ? 'true' : 'false';
-                       $wgMemc->add( $key, $value, 15 );
+                       $cache->add( $key, $value, 15 );
                }
 
                return ( $value === 'true' );
@@ -382,22 +381,24 @@ class JobQueueGroup {
         * @return mixed
         */
        private function getCachedConfigVar( $name ) {
-               global $wgConf, $wgMemc;
-
+               // @TODO: cleanup this whole method with a proper config system
                if ( $this->wiki === wfWikiID() ) {
                        return $GLOBALS[$name]; // common case
                } else {
-                       list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-                       $key = wfForeignMemcKey( $db, $prefix, 'configvalue', $name );
-                       $value = $wgMemc->get( $key ); // ('v' => ...) or false
-                       if ( is_array( $value ) ) {
-                               return $value['v'];
-                       } else {
-                               $value = $wgConf->getConfig( $this->wiki, $name );
-                               $wgMemc->set( $key, array( 'v' => $value ), 86400 + mt_rand( 0, 86400 ) );
-
-                               return $value;
-                       }
+                       $wiki = $this->wiki;
+                       $cache = ObjectCache::getMainWANInstance();
+                       $value = $cache->getWithSetCallback(
+                               $cache->makeGlobalKey( 'jobqueue', 'configvalue', $wiki, $name ),
+                               $cache::TTL_DAY + mt_rand( 0, $cache::TTL_DAY ),
+                               function () use ( $wiki, $name ) {
+                                       global $wgConf;
+
+                                       return array( 'v' => $wgConf->getConfig( $wiki, $name ) );
+                               },
+                               array( 'pcTTL' => 30 )
+                       );
+
+                       return $value['v'];
                }
        }
 
index 1e957c2..546093f 100644 (file)
@@ -26,8 +26,9 @@
  *
  * This is a faster and less resource-intensive job queue than JobQueueDB.
  * All data for a queue using this class is placed into one redis server.
+ * The mediawiki/services/jobrunner background service must be set up and running.
  *
- * There are eight main redis keys used to track jobs:
+ * There are eight main redis keys (per queue) used to track jobs:
  *   - l-unclaimed  : A list of job IDs used for ready unclaimed jobs
  *   - z-claimed    : A sorted set of (job ID, UNIX timestamp as score) used for job retries
  *   - z-abandoned  : A sorted set of (job ID, UNIX timestamp as score) used for broken jobs
  * entry and every h-sha1ById must refer to an ID that is l-unclaimed. If a job has its
  * ID in z-claimed or z-abandoned, then it must also have an h-attempts entry for its ID.
  *
+ * The following keys are used to track queue states:
+ *   - s-queuesWithJobs : A set of all queues with non-abandoned jobs
+ *
+ * The background service takes care of undelaying, recycling, and pruning jobs as well as
+ * removing s-queuesWithJobs entries as queues empty.
+ *
  * Additionally, "rootjob:* keys track "root jobs" used for additional de-duplication.
  * Aside from root job keys, all keys have no expiry, and are only removed when jobs are run.
  * All the keys are prefixed with the relevant wiki ID information.
@@ -219,7 +226,7 @@ class JobQueueRedis extends JobQueue {
                                }
                        }
                        JobQueue::incrStats( 'inserts', $this->type, count( $items ) );
-                       JobQueue::incrStats( 'inserts_actual', $pushed );
+                       JobQueue::incrStats( 'inserts_actual', $this->type, $pushed );
                        JobQueue::incrStats( 'dupe_inserts', $this->type,
                                count( $items ) - $failed - $pushed );
                        if ( $failed > 0 ) {
@@ -239,7 +246,8 @@ class JobQueueRedis extends JobQueue {
         * @throws RedisException
         */
        protected function pushBlobs( RedisConnRef $conn, array $items ) {
-               $args = array(); // ([id, sha1, rtime, blob [, id, sha1, rtime, blob ... ] ] )
+               $args = array( $this->encodeQueueName() );
+               // Next args come in 4s ([id, sha1, rtime, blob [, id, sha1, rtime, blob ... ] ] )
                foreach ( $items as $item ) {
                        $args[] = (string)$item['uuid'];
                        $args[] = (string)$item['sha1'];
@@ -248,10 +256,17 @@ class JobQueueRedis extends JobQueue {
                }
                static $script =
 <<<LUA
-               local kUnclaimed, kSha1ById, kIdBySha1, kDelayed, kData = unpack(KEYS)
-               if #ARGV % 4 ~= 0 then return redis.error_reply('Unmatched arguments') end
+               local kUnclaimed, kSha1ById, kIdBySha1, kDelayed, kData, kQwJobs = unpack(KEYS)
+               -- First argument is the queue ID
+               local queueId = ARGV[1]
+               -- Next arguments all come in 4s (one per job)
+               local variadicArgCount = #ARGV - 1
+               if variadicArgCount % 4 ~= 0 then
+                       return redis.error_reply('Unmatched arguments')
+               end
+               -- Insert each job into this queue as needed
                local pushed = 0
-               for i = 1,#ARGV,4 do
+               for i = 2,#ARGV,4 do
                        local id,sha1,rtimestamp,blob = ARGV[i],ARGV[i+1],ARGV[i+2],ARGV[i+3]
                        if sha1 == '' or redis.call('hExists',kIdBySha1,sha1) == 0 then
                                if 1*rtimestamp > 0 then
@@ -269,6 +284,8 @@ class JobQueueRedis extends JobQueue {
                                pushed = pushed + 1
                        end
                end
+               -- Mark this queue as having jobs
+               redis.call('sAdd',kQwJobs,queueId)
                return pushed
 LUA;
                return $conn->luaEval( $script,
@@ -279,10 +296,11 @@ LUA;
                                        $this->getQueueKey( 'h-idBySha1' ), # KEYS[3]
                                        $this->getQueueKey( 'z-delayed' ), # KEYS[4]
                                        $this->getQueueKey( 'h-data' ), # KEYS[5]
+                                       $this->getGlobalKey( 's-queuesWithJobs' ), # KEYS[6]
                                ),
                                $args
                        ),
-                       5 # number of first argument(s) that are keys
+                       6 # number of first argument(s) that are keys
                );
        }
 
@@ -328,15 +346,18 @@ LUA;
                static $script =
 <<<LUA
                local kUnclaimed, kSha1ById, kIdBySha1, kClaimed, kAttempts, kData = unpack(KEYS)
+               local rTime = unpack(ARGV)
                -- Pop an item off the queue
                local id = redis.call('rPop',kUnclaimed)
-               if not id then return false end
+               if not id then
+                       return false
+               end
                -- Allow new duplicates of this job
                local sha1 = redis.call('hGet',kSha1ById,id)
                if sha1 then redis.call('hDel',kIdBySha1,sha1) end
                redis.call('hDel',kSha1ById,id)
                -- Mark the jobs as claimed and return it
-               redis.call('zAdd',kClaimed,ARGV[1],id)
+               redis.call('zAdd',kClaimed,rTime,id)
                redis.call('hIncrBy',kAttempts,id,1)
                return redis.call('hGet',kData,id)
 LUA;
@@ -372,11 +393,12 @@ LUA;
                        static $script =
 <<<LUA
                        local kClaimed, kAttempts, kData = unpack(KEYS)
+                       local uuid = unpack(ARGV)
                        -- Unmark the job as claimed
-                       redis.call('zRem',kClaimed,ARGV[1])
-                       redis.call('hDel',kAttempts,ARGV[1])
+                       redis.call('zRem',kClaimed,uuid)
+                       redis.call('hDel',kAttempts,uuid)
                        -- Delete the job data itself
-                       return redis.call('hDel',kData,ARGV[1])
+                       return redis.call('hDel',kData,uuid)
 LUA;
                        $res = $conn->luaEval( $script,
                                array(
@@ -472,7 +494,10 @@ LUA;
                                $keys[] = $this->getQueueKey( $prop );
                        }
 
-                       return ( $conn->delete( $keys ) !== false );
+                       $ok = ( $conn->delete( $keys ) !== false );
+                       $conn->sRem( $this->getGlobalKey( 's-queuesWithJobs' ), $this->encodeQueueName() );
+
+                       return $ok;
                } catch ( RedisException $e ) {
                        $this->throwRedisException( $conn, $e );
                }
@@ -623,6 +648,27 @@ LUA;
                }
        }
 
+       /**
+        * @return array List of (wiki,type) tuples for queues with non-abandoned jobs
+        * @throws JobQueueConnectionError
+        * @throws JobQueueError
+        */
+       public function getServerQueuesWithJobs() {
+               $queues = array();
+
+               $conn = $this->getConnection();
+               try {
+                       $set = $conn->sMembers( $this->getGlobalKey( 's-queuesWithJobs' ) );
+                       foreach ( $set as $queue ) {
+                               $queues[] = $this->decodeQueueName( $queue );
+                       }
+               } catch ( RedisException $e ) {
+                       $this->throwRedisException( $conn, $e );
+               }
+
+               return $queues;
+       }
+
        /**
         * @param IJobSpecification $job
         * @return array
@@ -639,7 +685,7 @@ LUA;
                        // Additional job metadata
                        'uuid' => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
                        'sha1' => $job->ignoreDuplicates()
-                               ? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
+                               ? Wikimedia\base_convert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
                                : '',
                        'timestamp' => time() // UNIX timestamp
                );
@@ -703,7 +749,8 @@ LUA;
        protected function getConnection() {
                $conn = $this->redisPool->getConnection( $this->server );
                if ( !$conn ) {
-                       throw new JobQueueConnectionError( "Unable to connect to redis server." );
+                       throw new JobQueueConnectionError(
+                               "Unable to connect to redis server {$this->server}." );
                }
 
                return $conn;
@@ -720,25 +767,48 @@ LUA;
        }
 
        /**
-        * @param string $prop
-        * @param string|null $type
+        * @return string JSON
+        */
+       private function encodeQueueName() {
+               return json_encode( array( $this->type, $this->wiki ) );
+       }
+
+       /**
+        * @param string $name JSON
+        * @return array (type, wiki)
+        */
+       private function decodeQueueName( $name ) {
+               return json_decode( $name );
+       }
+
+       /**
+        * @param string $name
         * @return string
         */
-       private function getQueueKey( $prop, $type = null ) {
-               $type = is_string( $type ) ? $type : $this->type;
-               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
-               if ( strlen( $this->key ) ) { // namespaced queue (for testing)
-                       return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $this->key, $prop );
-               } else {
-                       return wfForeignMemcKey( $db, $prefix, 'jobqueue', $type, $prop );
+       private function getGlobalKey( $name ) {
+               $parts = array( 'global', 'jobqueue', $name );
+               foreach ( $parts as $part ) {
+                   if ( !preg_match( '/[a-zA-Z0-9_-]+/', $part ) ) {
+                       throw new InvalidArgumentException( "Key part characters are out of range." );
+                   }
                }
+
+               return implode( ':', $parts );
        }
 
        /**
-        * @param string $key
-        * @return void
+        * @param string $prop
+        * @param string|null $type Override this for sibling queues
+        * @return string
         */
-       public function setTestingPrefix( $key ) {
-               $this->key = $key;
+       private function getQueueKey( $prop, $type = null ) {
+               $type = is_string( $type ) ? $type : $this->type;
+               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+               $keyspace = $prefix ? "$db-$prefix" : $db;
+
+               $parts = array( $keyspace, 'jobqueue', $type, $prop );
+
+               // Parts are typically ASCII, but encode for sanity to escape ":"
+               return implode( ':', array_map( 'rawurlencode', $parts ) );
        }
 }
index 7ce731d..b121dfe 100644 (file)
@@ -191,7 +191,10 @@ class JobRunner implements LoggerAwareInterface {
                                }
                                // Commit all outstanding connections that are in a transaction
                                // to get a fresh repeatable read snapshot on every connection.
+                               // Note that jobs are still responsible for handling slave lag.
                                wfGetLBFactory()->commitAll();
+                               // Clear out title cache data from prior snapshots
+                               LinkCache::singleton()->clear();
                                $timeMs = intval( ( microtime( true ) - $jobStartTime ) * 1000 );
                                $timeMsTotal += $timeMs;
 
@@ -448,7 +451,7 @@ class JobRunner implements LoggerAwareInterface {
                global $wgJobSerialCommitThreshold;
 
                $lb = wfGetLB( wfWikiID() );
-               if ( $wgJobSerialCommitThreshold !== false ) {
+               if ( $wgJobSerialCommitThreshold !== false && $lb->getServerCount() > 1 ) {
                        // Generally, there is one master connection to the local DB
                        $dbwSerial = $lb->getAnyOpenConnection( $lb->getWriterIndex() );
                } else {
@@ -467,7 +470,7 @@ class JobRunner implements LoggerAwareInterface {
 
                $ms = intval( 1000 * $dbwSerial->pendingWriteQueryDuration() );
                $msg = $job->toString() . " COMMIT ENQUEUED [{$ms}ms of writes]";
-               $this->logger->info( $msg );
+               $this->logger->warning( $msg );
                $this->debugCallback( $msg );
 
                // Wait for an exclusive lock to commit
index c11d5a7..2073b0f 100644 (file)
@@ -11,7 +11,7 @@ The data model consist of the following main components:
   background. All jobs subclass the Job object and put the main logic in the
   function called run().
 * The JobQueue object represents a particular queue of jobs of a certain type.
-  For example there may be a queue for email jobs and a queue for squid purge
+  For example there may be a queue for email jobs and a queue for CDN purge
   jobs.
 
 \section jobqueue Job queues
@@ -45,7 +45,7 @@ In-memory queues may lose data when restarted depending on snapshot and journal
 settings (including journal fsync() frequency).  Some queue types may totally remove
 jobs when dequeued while leaving the ack() function as a no-op; if a job is
 dequeued by a job runner, which crashes before completion, the job will be
-lost. Some jobs, like purging squid caches after a template change, may not
+lost. Some jobs, like purging CDN caches after a template change, may not
 require durable queues, whereas other jobs might be more important.
 
 \section aggregator Job queue aggregator
@@ -61,7 +61,6 @@ large amounts of time polling empty queues, aggregators exists to keep track
 of which queues are ready.
 
 The following queue aggregator classes are available:
-* JobQueueAggregatorMemc (uses $wgMemc to track ready queues)
 * JobQueueAggregatorRedis (uses a redis server to track ready queues)
 
 Some aggregators cache data for a few minutes while others may be always up to date.
index 6c49646..9b4e7e9 100644 (file)
 class JobQueueAggregatorRedis extends JobQueueAggregator {
        /** @var RedisConnectionPool */
        protected $redisPool;
-
        /** @var array List of Redis server addresses */
        protected $servers;
+       /** @var bool */
+       protected $registeredQueue = false;
 
        /**
         * @param array $params Possible keys:
@@ -76,11 +77,16 @@ class JobQueueAggregatorRedis extends JobQueueAggregator {
                }
                try {
                        $conn->multi( Redis::PIPELINE );
-                       $conn->hSetNx( $this->getQueueTypesKey(), $type, 'enabled' );
-                       $conn->sAdd( $this->getWikiSetKey(), $wiki );
+                       if ( !$this->registeredQueue ) {
+                               // Make sure the queue is registered as existing
+                               $conn->hSetNx( $this->getQueueTypesKey(), $type, 'enabled' );
+                               $conn->sAdd( $this->getWikiSetKey(), $wiki );
+                       }
                        $conn->hSet( $this->getReadyQueueKey(), $this->encQueueName( $type, $wiki ), time() );
                        $conn->exec();
 
+                       $this->registeredQueue = true;
+
                        return true;
                } catch ( RedisException $e ) {
                        $this->handleException( $conn, $e );
diff --git a/includes/jobqueue/jobs/CategoryMembershipChangeJob.php b/includes/jobqueue/jobs/CategoryMembershipChangeJob.php
new file mode 100644 (file)
index 0000000..c9e20a9
--- /dev/null
@@ -0,0 +1,234 @@
+<?php
+/**
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * Job to add recent change entries mentioning category membership changes
+ *
+ * Parameters include:
+ *   - pageId : page ID
+ *   - revTimestamp : timestamp of the triggering revision
+ *
+ * Category changes will be mentioned for revisions at/after the timestamp for this page
+ *
+ * @since 1.27
+ */
+class CategoryMembershipChangeJob extends Job {
+       const ENQUEUE_FUDGE_SEC = 60;
+
+       public function __construct( Title $title, array $params ) {
+               parent::__construct( 'categoryMembershipChange', $title, $params );
+               // Only need one job per page. Note that ENQUEUE_FUDGE_SEC handles races where an
+               // older revision job gets inserted while the newer revision job is de-duplicated.
+               $this->removeDuplicates = true;
+       }
+
+       public function run() {
+               $page = WikiPage::newFromID( $this->params['pageId'], WikiPage::READ_LATEST );
+               if ( !$page ) {
+                       $this->setLastError( "Could not find page #{$this->params['pageId']}" );
+                       return false; // deleted?
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               // Use a named lock so that jobs for this page see each others' changes
+               $fname = __METHOD__;
+               $lockKey = "CategoryMembershipUpdates:{$page->getId()}";
+               if ( !$dbw->lock( $lockKey, $fname, 10 ) ) {
+                       $this->setLastError( "Could not acquire lock '$lockKey'" );
+                       return false;
+               }
+
+               $unlocker = new ScopedCallback( function () use ( $dbw, $lockKey, $fname ) {
+                       $dbw->unlock( $lockKey, $fname );
+               } );
+
+               // Sanity: clear any DB transaction snapshot
+               $dbw->commit( __METHOD__, 'flush' );
+
+               $cutoffUnix = wfTimestamp( TS_UNIX, $this->params['revTimestamp'] );
+               // Using ENQUEUE_FUDGE_SEC handles jobs inserted out of revision order due to the delay
+               // between COMMIT and actual enqueueing of the CategoryMembershipChangeJob job.
+               $cutoffUnix -= self::ENQUEUE_FUDGE_SEC;
+
+               // Get the newest revision that has a SRC_CATEGORIZE row...
+               $row = $dbw->selectRow(
+                       array( 'revision', 'recentchanges' ),
+                       array( 'rev_timestamp', 'rev_id' ),
+                       array(
+                               'rev_page' => $page->getId(),
+                               'rev_timestamp >= ' . $dbw->addQuotes( $dbw->timestamp( $cutoffUnix ) )
+                       ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'rev_timestamp DESC, rev_id DESC' ),
+                       array(
+                               'recentchanges' => array(
+                                       'INNER JOIN',
+                                       array(
+                                               'rc_this_oldid = rev_id',
+                                               'rc_source' => RecentChange::SRC_CATEGORIZE,
+                                               // Allow rc_cur_id or rc_timestamp index usage
+                                               'rc_cur_id = rev_page',
+                                               'rc_timestamp >= rev_timestamp'
+                                       )
+                               )
+                       )
+               );
+               // Only consider revisions newer than any such revision
+               if ( $row ) {
+                       $cutoffUnix = wfTimestamp( TS_UNIX, $row->rev_timestamp );
+                       $lastRevId = (int)$row->rev_id;
+               } else {
+                       $lastRevId = 0;
+               }
+
+               // Find revisions to this page made around and after this revision which lack category
+               // notifications in recent changes. This lets jobs pick up were the last one left off.
+               $encCutoff = $dbw->addQuotes( $dbw->timestamp( $cutoffUnix ) );
+               $res = $dbw->select(
+                       'revision',
+                       Revision::selectFields(),
+                       array(
+                               'rev_page' => $page->getId(),
+                               "rev_timestamp > $encCutoff" .
+                                       " OR (rev_timestamp = $encCutoff AND rev_id > $lastRevId)"
+                       ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'rev_timestamp ASC, rev_id ASC' )
+               );
+
+               // Apply all category updates in revision timestamp order
+               foreach ( $res as $row ) {
+                       $this->notifyUpdatesForRevision( $page, Revision::newFromRow( $row ) );
+               }
+
+               ScopedCallback::consume( $unlocker );
+
+               return true;
+       }
+
+       /**
+        * @param WikiPage $page
+        * @param Revision $newRev
+        * @throws MWException
+        */
+       protected function notifyUpdatesForRevision( WikiPage $page, Revision $newRev ) {
+               $config = RequestContext::getMain()->getConfig();
+               $title = $page->getTitle();
+
+               // Get the new revision
+               if ( !$newRev->getContent() ) {
+                       return; // deleted?
+               }
+
+               // Get the prior revision (the same for null edits)
+               if ( $newRev->getParentId() ) {
+                       $oldRev = Revision::newFromId( $newRev->getParentId(), Revision::READ_LATEST );
+                       if ( !$oldRev->getContent() ) {
+                               return; // deleted?
+                       }
+               } else {
+                       $oldRev = null;
+               }
+
+               // Parse the new revision and get the categories
+               $categoryChanges = $this->getExplicitCategoriesChanges( $title, $newRev, $oldRev );
+               list( $categoryInserts, $categoryDeletes ) = $categoryChanges;
+               if ( !$categoryInserts && !$categoryDeletes ) {
+                       return; // nothing to do
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $catMembChange = new CategoryMembershipChange( $title, $newRev );
+               $catMembChange->checkTemplateLinks();
+
+               $batchSize = $config->get( 'UpdateRowsPerQuery' );
+               $insertCount = 0;
+
+               foreach ( $categoryInserts as $categoryName ) {
+                       $categoryTitle = Title::makeTitle( NS_CATEGORY, $categoryName );
+                       $catMembChange->triggerCategoryAddedNotification( $categoryTitle );
+                       if ( $insertCount++ && ( $insertCount % $batchSize ) == 0 ) {
+                               $dbw->commit( __METHOD__, 'flush' );
+                               wfWaitForSlaves();
+                       }
+               }
+
+               foreach ( $categoryDeletes as $categoryName ) {
+                       $categoryTitle = Title::makeTitle( NS_CATEGORY, $categoryName );
+                       $catMembChange->triggerCategoryRemovedNotification( $categoryTitle );
+                       if ( $insertCount++ && ( $insertCount++ % $batchSize ) == 0 ) {
+                               $dbw->commit( __METHOD__, 'flush' );
+                               wfWaitForSlaves();
+                       }
+               }
+       }
+
+       private function getExplicitCategoriesChanges(
+               Title $title, Revision $newRev, Revision $oldRev = null
+       ) {
+               // Inject the same timestamp for both revision parses to avoid seeing category changes
+               // due to time-based parser functions. Inject the same page title for the parses too.
+               // Note that REPEATABLE-READ makes template/file pages appear unchanged between parses.
+               $parseTimestamp = $newRev->getTimestamp();
+               // Parse the old rev and get the categories. Do not use link tables as that
+               // assumes these updates are perfectly FIFO and that link tables are always
+               // up to date, neither of which are true.
+               $oldCategories = $oldRev
+                       ? $this->getCategoriesAtRev( $title, $oldRev, $parseTimestamp )
+                       : array();
+               // Parse the new revision and get the categories
+               $newCategories = $this->getCategoriesAtRev( $title, $newRev, $parseTimestamp );
+
+               $categoryInserts = array_values( array_diff( $newCategories, $oldCategories ) );
+               $categoryDeletes = array_values( array_diff( $oldCategories, $newCategories ) );
+
+               return array( $categoryInserts, $categoryDeletes );
+       }
+
+       /**
+        * @param Title $title
+        * @param Revision $rev
+        * @param string $parseTimestamp TS_MW
+        *
+        * @return string[] category names
+        */
+       private function getCategoriesAtRev( Title $title, Revision $rev, $parseTimestamp ) {
+               $content = $rev->getContent();
+               $options = $content->getContentHandler()->makeParserOptions( 'canonical' );
+               $options->setTimestamp( $parseTimestamp );
+               // This could possibly use the parser cache if it checked the revision ID,
+               // but that's more complicated than it's worth.
+               $output = $content->getParserOutput( $title, $rev->getId(), $options );
+
+               // array keys will cast numeric category names to ints
+               // so we need to cast them back to strings to avoid breaking things!
+               return array_map( 'strval', array_keys( $output->getCategories() ) );
+       }
+
+       public function getDeduplicationInfo() {
+               $info = parent::getDeduplicationInfo();
+               unset( $info['params']['revTimestamp'] ); // first job wins
+
+               return $info;
+       }
+}
diff --git a/includes/jobqueue/jobs/CdnPurgeJob.php b/includes/jobqueue/jobs/CdnPurgeJob.php
new file mode 100644 (file)
index 0000000..356eeba
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Job to purge a set of URLs from CDN
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to 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
+ */
+
+/**
+ * Job to purge a set of URLs from CDN
+ *
+ * @ingroup JobQueue
+ * @since 1.27
+ */
+class CdnPurgeJob extends Job {
+       /**
+        * @param Title $title
+        * @param array $params Job parameters (urls)
+        */
+       function __construct( Title $title, array $params ) {
+               parent::__construct( 'cdnPurge', $title, $params );
+               $this->removeDuplicates = false; // delay semantics are critical
+       }
+
+       public function run() {
+               // Use purge() directly to avoid infinite recursion
+               CdnCacheUpdate::purge( $this->params['urls'] );
+
+               return true;
+       }
+}
index ef9fec0..df0a66e 100644 (file)
@@ -29,7 +29,7 @@
  *   - a) Recursive jobs to purge caches for backlink pages for a given title.
  *        These jobs have (recursive:true,table:<table>) set.
  *   - b) Jobs to purge caches for a set of titles (the job title is ignored).
- *           These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
+ *        These jobs have (pages:(<page ID>:(<namespace>,<title>),...) set.
  *
  * @ingroup JobQueue
  */
@@ -40,6 +40,23 @@ class HTMLCacheUpdateJob extends Job {
                $this->removeDuplicates = ( !isset( $params['range'] ) && !isset( $params['pages'] ) );
        }
 
+       /**
+        * @param Title $title Title to purge backlink pages from
+        * @param string $table Backlink table name
+        * @return HTMLCacheUpdateJob
+        */
+       public static function newForBacklinks( Title $title, $table ) {
+               return new self(
+                       $title,
+                       array(
+                               'table' => $table,
+                               'recursive' => true
+                       ) + Job::newRootJobParams( // "overall" refresh links job info
+                               "htmlCacheUpdate:{$table}:{$title->getPrefixedText()}"
+                       )
+               );
+       }
+
        function run() {
                global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery;
 
@@ -77,7 +94,7 @@ class HTMLCacheUpdateJob extends Job {
         * @param array $pages Map of (page ID => (namespace, DB key)) entries
         */
        protected function invalidateTitles( array $pages ) {
-               global $wgUpdateRowsPerQuery, $wgUseFileCache, $wgUseSquid;
+               global $wgUpdateRowsPerQuery, $wgUseFileCache;
 
                // Get all page IDs in this query into an array
                $pageIds = array_keys( $pages );
@@ -103,6 +120,7 @@ class HTMLCacheUpdateJob extends Job {
                // Check $wgUpdateRowsPerQuery for sanity; batch jobs are sized by that already.
                foreach ( array_chunk( $pageIds, $wgUpdateRowsPerQuery ) as $batch ) {
                        $dbw->commit( __METHOD__, 'flush' );
+                       wfWaitForSlaves();
 
                        $dbw->update( 'page',
                                array( 'page_touched' => $dbw->timestamp( $touchTimestamp ) ),
@@ -121,11 +139,9 @@ class HTMLCacheUpdateJob extends Job {
                        __METHOD__
                ) );
 
-               // Update squid
-               if ( $wgUseSquid ) {
-                       $u = SquidUpdate::newFromTitles( $titleArray );
-                       $u->doUpdate();
-               }
+               // Update CDN
+               $u = CdnCacheUpdate::newFromTitles( $titleArray );
+               $u->doUpdate();
 
                // Update file cache
                if ( $wgUseFileCache ) {
index 1d59b32..183c1ee 100644 (file)
  * @ingroup JobQueue
  */
 class RefreshLinksJob extends Job {
+       /** @var float Cache parser output when it takes this long to render */
        const PARSE_THRESHOLD_SEC = 1.0;
-
+       /** @var integer Lag safety margin when comparing root job times to last-refresh times */
        const CLOCK_FUDGE = 10;
 
        function __construct( Title $title, array $params ) {
                parent::__construct( 'refreshLinks', $title, $params );
-               // A separate type is used just for cascade-protected backlinks
-               if ( !empty( $this->params['prioritize'] ) ) {
-                       $this->command .= 'Prioritized';
-               }
-               // Base backlink update jobs and per-title update jobs can be de-duplicated.
-               // If template A changes twice before any jobs run, a clean queue will have:
-               //              (A base, A base)
-               // The second job is ignored by the queue on insertion.
-               // Suppose, many pages use template A, and that template itself uses template B.
-               // An edit to both will first create two base jobs. A clean FIFO queue will have:
-               //              (A base, B base)
-               // When these jobs run, the queue will have per-title and remnant partition jobs:
-               //              (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
-               // Some these jobs will be the same, and will automatically be ignored by
-               // the queue upon insertion. Some title jobs will run before the duplicate is
-               // inserted, so the work will still be done twice in those cases. More titles
-               // can be de-duplicated as the remnant jobs continue to be broken down. This
-               // works best when $wgUpdateRowsPerJob, and either the pages have few backlinks
-               // and/or the backlink sets for pages A and B are almost identical.
-               $this->removeDuplicates = !isset( $params['range'] )
-                       && ( !isset( $params['pages'] ) || count( $params['pages'] ) == 1 );
+               // Avoid the overhead of de-duplication when it would be pointless
+               $this->removeDuplicates = (
+                       // Master positions won't match
+                       !isset( $params['masterPos'] ) &&
+                       // Ranges rarely will line up
+                       !isset( $params['range'] ) &&
+                       // Multiple pages per job make matches unlikely
+                       !( isset( $params['pages'] ) && count( $params['pages'] ) != 1 )
+               );
+       }
+
+       /**
+        * @param Title $title
+        * @param array $params
+        * @return RefreshLinksJob
+        */
+       public static function newPrioritized( Title $title, array $params ) {
+               $job = new self( $title, $params );
+               $job->command = 'refreshLinksPrioritized';
+
+               return $job;
+       }
+
+       /**
+        * @param Title $title
+        * @param array $params
+        * @return RefreshLinksJob
+        */
+       public static function newDynamic( Title $title, array $params ) {
+               $job = new self( $title, $params );
+               $job->command = 'refreshLinksDynamic';
+
+               return $job;
        }
 
        function run() {
@@ -95,45 +108,50 @@ class RefreshLinksJob extends Job {
                        JobQueueGroup::singleton()->push( $jobs );
                // Job to update link tables for a set of titles
                } elseif ( isset( $this->params['pages'] ) ) {
+                       $this->waitForMasterPosition();
                        foreach ( $this->params['pages'] as $pageId => $nsAndKey ) {
                                list( $ns, $dbKey ) = $nsAndKey;
                                $this->runForTitle( Title::makeTitleSafe( $ns, $dbKey ) );
                        }
                // Job to update link tables for a given title
                } else {
+                       $this->waitForMasterPosition();
                        $this->runForTitle( $this->title );
                }
 
                return true;
        }
 
+       protected function waitForMasterPosition() {
+               if ( !empty( $this->params['masterPos'] ) && wfGetLB()->getServerCount() > 1 ) {
+                       // Wait for the current/next slave DB handle to catch up to the master.
+                       // This way, we get the correct page_latest for templates or files that just
+                       // changed milliseconds ago, having triggered this job to begin with.
+                       wfGetLB()->waitFor( $this->params['masterPos'] );
+               }
+       }
+
        /**
         * @param Title $title
         * @return bool
         */
-       protected function runForTitle( Title $title = null ) {
-               if ( is_null( $title ) ) {
-                       $this->setLastError( "refreshLinks: Invalid title" );
-                       return false;
-               }
-
-               // Wait for the DB of the current/next slave DB handle to catch up to the master.
-               // This way, we get the correct page_latest for templates or files that just changed
-               // milliseconds ago, having triggered this job to begin with.
-               if ( isset( $this->params['masterPos'] ) && $this->params['masterPos'] !== false ) {
-                       wfGetLB()->waitFor( $this->params['masterPos'] );
+       protected function runForTitle( Title $title ) {
+               $page = WikiPage::factory( $title );
+               if ( !empty( $this->params['triggeringRevisionId'] ) ) {
+                       // Fetch the specified revision; lockAndGetLatest() below detects if the page
+                       // was edited since and aborts in order to avoid corrupting the link tables
+                       $revision = Revision::newFromId(
+                               $this->params['triggeringRevisionId'],
+                               Revision::READ_LATEST
+                       );
+               } else {
+                       // Fetch current revision; READ_LATEST reduces lockAndGetLatest() check failures
+                       $revision = Revision::newFromTitle( $title, false, Revision::READ_LATEST );
                }
 
-               // Clear out title cache data from prior job transaction snapshots
-               $linkCache = LinkCache::singleton();
-               $linkCache->clear();
-
-               // Fetch the current page and revision...
-               $page = WikiPage::factory( $title );
-               $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
                if ( !$revision ) {
-                       $this->setLastError( "refreshLinks: Article not found {$title->getPrefixedDBkey()}" );
-                       return false; // XXX: what if it was just deleted?
+                       $this->setLastError( "Revision not found for {$title->getPrefixedDBkey()}" );
+                       return false; // just deleted?
                }
 
                $content = $revision->getContent( Revision::RAW );
@@ -198,11 +216,20 @@ class RefreshLinksJob extends Job {
                }
 
                $updates = $content->getSecondaryDataUpdates(
-                       $title, null, !empty( $this->params['useRecursiveLinksUpdate'] ), $parserOutput );
-               foreach ( $updates as $key => $update ) {
-                       if ( $update instanceof LinksUpdate && isset( $this->params['triggeredRecursive'] ) ) {
-                               $update->setTriggeredRecursive();
-                       }
+                       $title,
+                       null,
+                       !empty( $this->params['useRecursiveLinksUpdate'] ),
+                       $parserOutput
+               );
+
+               $latestNow = $page->lockAndGetLatest();
+               if ( !$latestNow || $revision->getId() != $latestNow ) {
+                       // Do not clobber over newer updates with older ones. If all jobs where FIFO and
+                       // serialized, it would be OK to update links based on older revisions since it
+                       // would eventually get to the latest. Since that is not the case (by design),
+                       // only update the link tables to a state matching the current revision's output.
+                       $this->setLastError( "page_latest changed from {$revision->getId()} to $latestNow" );
+                       return false;
                }
 
                DataUpdate::runUpdates( $updates );
@@ -215,8 +242,6 @@ class RefreshLinksJob extends Job {
        public function getDeduplicationInfo() {
                $info = parent::getDeduplicationInfo();
                if ( is_array( $info['params'] ) ) {
-                       // Don't let highly unique "masterPos" values ruin duplicate detection
-                       unset( $info['params']['masterPos'] );
                        // For per-pages jobs, the job title is that of the template that changed
                        // (or similar), so remove that since it ruins duplicate detection
                        if ( isset( $info['pages'] ) ) {
index c8e5df6..1770ac7 100644 (file)
 /**
  * Class with Backlink related Job helper methods
  *
+ * When an asset changes, a base job can be inserted to update all assets that depend on it.
+ * The base job splits into per-title "leaf" jobs and a "remnant" job to handle the remaining
+ * range of backlinks. This recurs until the remnant job's backlink range is small enough that
+ * only leaf jobs are created from it.
+ *
+ * For example, if templates A and B are edited (at the same time) the queue will have:
+ *     (A base, B base)
+ * When these jobs run, the queue will have per-title and remnant partition jobs:
+ *        (titleX,titleY,titleZ,...,A remnant,titleM,titleN,titleO,...,B remnant)
+ *
+ * This works best when the queue is FIFO, for several reasons:
+ *   - a) Since the remnant jobs are enqueued after the leaf jobs, the slower leaf jobs have to
+ *        get popped prior to the fast remnant jobs. This avoids flooding the queue with leaf jobs
+ *        for every single backlink of widely used assets (which can be millions).
+ *   - b) Other jobs going in the queue still get a chance to run after a widely used asset changes.
+ *        This is due to the large remnant job pushing to the end of the queue with each division.
+ *
+ * The size of the queues used in this manner depend on the number of assets changes and the
+ * number of workers. Also, with FIFO-per-partition queues, the queue size can be somewhat larger,
+ * depending on the number of queue partitions.
+ *
  * @ingroup JobQueue
  * @since 1.23
  */
@@ -71,6 +92,7 @@ class BacklinkJobUtils {
 
                if ( isset( $params['pages'] ) || empty( $params['recursive'] ) ) {
                        $ranges = array(); // sanity; this is a leaf node
+                       $realBSize = 0;
                        wfWarn( __METHOD__ . " called on {$job->getType()} leaf job (explosive recursion)." );
                } elseif ( isset( $params['range'] ) ) {
                        // This is a range job to trigger the insertion of partitioned/title jobs...
@@ -88,8 +110,10 @@ class BacklinkJobUtils {
                // Combine the first range (of size $bSize) backlinks into leaf jobs
                if ( isset( $ranges[0] ) ) {
                        list( $start, $end ) = $ranges[0];
-                       $titles = $title->getBacklinkCache()->getLinks( $params['table'], $start, $end );
-                       foreach ( array_chunk( iterator_to_array( $titles ), $cSize ) as $titleBatch ) {
+                       $iter = $title->getBacklinkCache()->getLinks( $params['table'], $start, $end );
+                       $titles = iterator_to_array( $iter );
+                       /** @var Title[] $titleBatch */
+                       foreach ( array_chunk( $titles, $cSize ) as $titleBatch ) {
                                $pages = array();
                                foreach ( $titleBatch as $tl ) {
                                        $pages[$tl->getArticleId()] = array( $tl->getNamespace(), $tl->getDBKey() );
index 0b9aa7c..2ffc1d3 100644 (file)
@@ -35,13 +35,6 @@ class ObjectFactory {
         * an 'args' key that provides arguments to pass to the
         * constructor/callable.
         *
-        * Object construction using a specification having both 'class' and
-        * 'args' members will call the constructor of the class using
-        * ReflectionClass::newInstanceArgs. The use of ReflectionClass carries
-        * a performance penalty and should not be used to create large numbers of
-        * objects. If this is needed, consider introducing a factory method that
-        * can be called via call_user_func_array() instead.
-        *
         * Values in the arguments collection which are Closure instances will be
         * expanded by invoking them with no arguments before passing the
         * resulting value on to the constructor/callable. This can be used to
@@ -77,8 +70,7 @@ class ObjectFactory {
                        if ( !$args ) {
                                $obj = new $clazz();
                        } else {
-                               $ref = new ReflectionClass( $clazz );
-                               $obj = $ref->newInstanceArgs( $args );
+                               $obj = static::constructClassInstance( $clazz, $args );
                        }
                } elseif ( isset( $spec['factory'] ) ) {
                        $obj = call_user_func_array( $spec['factory'], $args );
@@ -117,4 +109,91 @@ class ObjectFactory {
                        }
                }, $list );
        }
+
+       /**
+        * Construct an instance of the given class using the given arguments.
+        *
+        * PHP's `call_user_func_array()` doesn't work with object construction so
+        * we have to use other measures. Starting with PHP 5.6.0 we could use the
+        * "splat" operator (`...`) to unpack the array into an argument list.
+        * Sadly there is no way to conditionally include a syntax construct like
+        * a new operator in a way that allows older versions of PHP to still
+        * parse the file. Instead, we will try a loop unrolling technique that
+        * works for 0-10 arguments. If we are passed 11 or more arguments we will
+        * take the performance penalty of using
+        * `ReflectionClass::newInstanceArgs()` to construct the desired object.
+        *
+        * @param string $clazz Class name
+        * @param array $args Constructor arguments
+        * @return mixed Constructed instance
+        */
+       public static function constructClassInstance( $clazz, $args ) {
+               // $args should be a non-associative array; show nice error if that's not the case
+               if ( $args && array_keys( $args ) !== range( 0, count( $args ) - 1 ) ) {
+                       throw new InvalidArgumentException( __METHOD__ . ': $args cannot be an associative array' );
+               }
+
+               // TODO: when PHP min version supported is >=5.6.0 replace this
+               // with `return new $clazz( ... $args );`.
+               $obj = null;
+               switch ( count( $args ) ) {
+                       case 0:
+                               $obj = new $clazz();
+                               break;
+                       case 1:
+                               $obj = new $clazz( $args[0] );
+                               break;
+                       case 2:
+                               $obj = new $clazz( $args[0], $args[1] );
+                               break;
+                       case 3:
+                               $obj = new $clazz( $args[0], $args[1], $args[2] );
+                               break;
+                       case 4:
+                               $obj = new $clazz( $args[0], $args[1], $args[2], $args[3] );
+                               break;
+                       case 5:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4]
+                               );
+                               break;
+                       case 6:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5]
+                               );
+                               break;
+                       case 7:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6]
+                               );
+                               break;
+                       case 8:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7]
+                               );
+                               break;
+                       case 9:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7], $args[8]
+                               );
+                               break;
+                       case 10:
+                               $obj = new $clazz(
+                                       $args[0], $args[1], $args[2], $args[3], $args[4],
+                                       $args[5], $args[6], $args[7], $args[8], $args[9]
+                               );
+                               break;
+                       default:
+                               // Fall back to using ReflectionClass and curse the developer
+                               // who decided that 11+ args was a reasonable method
+                               // signature.
+                               $ref = new ReflectionClass( $clazz );
+                               $obj = $ref->newInstanceArgs( $args );
+               }
+               return $obj;
+       }
 }
diff --git a/includes/libs/RunningStat.php b/includes/libs/RunningStat.php
deleted file mode 100644 (file)
index 8bd4656..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-<?php
-/**
- * Compute running mean, variance, and extrema of a stream of numbers.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to 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
- */
-
-// Needed due to PHP non-bug <https://bugs.php.net/bug.php?id=49828>.
-define( 'NEGATIVE_INF', -INF );
-
-/**
- * Represents a running summary of a stream of numbers.
- *
- * RunningStat instances are accumulator-like objects that provide a set of
- * continuously-updated summary statistics for a stream of numbers, without
- * requiring that each value be stored. The measures it provides are the
- * arithmetic mean, variance, standard deviation, and extrema (min and max);
- * together they describe the central tendency and statistical dispersion of a
- * set of values.
- *
- * One RunningStat instance can be merged into another; the resultant
- * RunningStat has the state it would have had if it had accumulated each
- * individual point. This allows data to be summarized in parallel and in
- * stages without loss of fidelity.
- *
- * Based on a C++ implementation by John D. Cook:
- *  <http://www.johndcook.com/standard_deviation.html>
- *  <http://www.johndcook.com/skewness_kurtosis.html>
- *
- * The in-line documentation for this class incorporates content from the
- * English Wikipedia articles "Variance", "Algorithms for calculating
- * variance", and "Standard deviation".
- *
- * @since 1.23
- */
-class RunningStat implements Countable {
-
-       /** @var int Number of samples. **/
-       public $n = 0;
-
-       /** @var float The first moment (or mean, or expected value). **/
-       public $m1 = 0.0;
-
-       /** @var float The second central moment (or variance). **/
-       public $m2 = 0.0;
-
-       /** @var float The least value in the set. **/
-       public $min = INF;
-
-       /** @var float The greatest value in the set. **/
-       public $max = NEGATIVE_INF;
-
-       /**
-        * Count the number of accumulated values.
-        * @return int Number of values
-        */
-       public function count() {
-               return $this->n;
-       }
-
-       /**
-        * Add a number to the data set.
-        * @param int|float $x Value to add
-        */
-       public function push( $x ) {
-               $x = (float) $x;
-
-               $this->min = min( $this->min, $x );
-               $this->max = max( $this->max, $x );
-
-               $n1 = $this->n;
-               $this->n += 1;
-               $delta = $x - $this->m1;
-               $delta_n = $delta / $this->n;
-               $this->m1 += $delta_n;
-               $this->m2 += $delta * $delta_n * $n1;
-       }
-
-       /**
-        * Get the mean, or expected value.
-        *
-        * The arithmetic mean is the sum of all measurements divided by the number
-        * of observations in the data set.
-        *
-        * @return float Mean
-        */
-       public function getMean() {
-               return $this->m1;
-       }
-
-       /**
-        * Get the estimated variance.
-        *
-        * Variance measures how far a set of numbers is spread out. A small
-        * variance indicates that the data points tend to be very close to the
-        * mean (and hence to each other), while a high variance indicates that the
-        * data points are very spread out from the mean and from each other.
-        *
-        * @return float Estimated variance
-        */
-       public function getVariance() {
-               if ( $this->n === 0 ) {
-                       // The variance of the empty set is undefined.
-                       return NAN;
-               } elseif ( $this->n === 1 ) {
-                       return 0.0;
-               } else {
-                       return $this->m2 / ( $this->n - 1.0 );
-               }
-       }
-
-       /**
-        * Get the estimated standard deviation.
-        *
-        * The standard deviation of a statistical population is the square root of
-        * its variance. It shows how much variation from the mean exists. In
-        * addition to expressing the variability of a population, the standard
-        * deviation is commonly used to measure confidence in statistical conclusions.
-        *
-        * @return float Estimated standard deviation
-        */
-       public function getStdDev() {
-               return sqrt( $this->getVariance() );
-       }
-
-       /**
-        * Merge another RunningStat instance into this instance.
-        *
-        * This instance then has the state it would have had if all the data had
-        * been accumulated by it alone.
-        *
-        * @param RunningStat RunningStat instance to merge into this one
-        */
-       public function merge( RunningStat $other ) {
-               // If the other RunningStat is empty, there's nothing to do.
-               if ( $other->n === 0 ) {
-                       return;
-               }
-
-               // If this RunningStat is empty, copy values from other RunningStat.
-               if ( $this->n === 0 ) {
-                       $this->n = $other->n;
-                       $this->m1 = $other->m1;
-                       $this->m2 = $other->m2;
-                       $this->min = $other->min;
-                       $this->max = $other->max;
-                       return;
-               }
-
-               $n = $this->n + $other->n;
-               $delta = $other->m1 - $this->m1;
-               $delta2 = $delta * $delta;
-
-               $this->m1 = ( ( $this->n * $this->m1 ) + ( $other->n * $other->m1 ) ) / $n;
-               $this->m2 = $this->m2 + $other->m2 + ( $delta2 * $this->n * $other->n / $n );
-               $this->min = min( $this->min, $other->min );
-               $this->max = max( $this->max, $other->max );
-               $this->n = $n;
-       }
-}
index a8477c9..f77b211 100644 (file)
@@ -49,10 +49,15 @@ class SamplingStatsdClient extends StatsdClient {
                return $data;
        }
 
-       /**
+       /*
+        * Send the metrics over UDP
         * Sample the metrics according to their sample rate and send the remaining ones.
         *
-        * {@inheritDoc}
+        * @param StatsdDataInterface|StatsdDataInterface[] $data message(s) to sent
+        *        strings are not allowed here as sampleData requires a StatsdDataInterface
+        * @param int $sampleRate
+        *
+        * @return integer the data sent in bytes
         */
        public function send( $data, $sampleRate = 1 ) {
                if ( !is_array( $data ) ) {
@@ -74,12 +79,13 @@ class SamplingStatsdClient extends StatsdClient {
                }
                $data = $this->sampleData( $data );
 
-               $messages = array_map( 'strval', $data );
+               $data = array_map( 'strval', $data );
 
                // reduce number of packets
                if ( $this->getReducePacket() ) {
                        $data = $this->reduceCount( $data );
                }
+
                // failures in any of this should be silently ignored if ..
                $written = 0;
                try {
@@ -87,7 +93,7 @@ class SamplingStatsdClient extends StatsdClient {
                        if ( !$fp ) {
                                return;
                        }
-                       foreach ( $messages as $message ) {
+                       foreach ( $data as $message ) {
                                $written += $this->getSender()->write( $fp, $message );
                        }
                        $this->getSender()->close( $fp );
@@ -101,7 +107,7 @@ class SamplingStatsdClient extends StatsdClient {
        /**
         * Throw away some of the data according to the sample rate.
         * @param StatsdDataInterface[] $data
-        * @return array
+        * @return StatsdDataInterface[]
         * @throws LogicException
         */
        protected function sampleData( $data ) {
index 3c2dd40..35de084 100644 (file)
@@ -181,7 +181,7 @@ class StatusValue {
        /**
         * Merge another status object into this one
         *
-        * @param Status $other Other Status object
+        * @param StatusValue $other Other StatusValue object
         * @param bool $overwriteValue Whether to override the "value" member
         */
        public function merge( $other, $overwriteValue = false ) {
index 11ae0b2..c56ed07 100644 (file)
@@ -36,16 +36,15 @@ class StringUtils {
         * true will skip the use of mb_check_encoding, this is mostly intended for
         * unit testing our internal implementation.
         *
-        * @since 1.21
         * @note In MediaWiki 1.21, this function did not provide proper UTF-8 validation.
         * In particular, the pure PHP code path did not in fact check for overlong forms.
         * Beware of this when backporting code to that version of MediaWiki.
         *
+        * @since 1.21
         * @param string $value String to check
         * @param bool $disableMbstring Whether to use the pure PHP
-        * implementation instead of trying mb_check_encoding. Intended for unit
-        * testing. Default: false
-        *
+        *  implementation instead of trying mb_check_encoding. Intended for unit
+        *  testing. Default: false
         * @return bool Whether the given $value is a valid UTF-8 encoded string
         */
        static function isUtf8( $value, $disableMbstring = false ) {
@@ -111,21 +110,20 @@ class StringUtils {
        }
 
        /**
-        * Perform an operation equivalent to
+        * Perform an operation equivalent to `preg_replace()`
         *
-        *     preg_replace( "!$startDelim(.*?)$endDelim!", $replace, $subject );
+        * Matches this code:
         *
-        * except that it's worst-case O(N) instead of O(N^2)
+        *     preg_replace( "!$startDelim(.*?)$endDelim!", $replace, $subject );
         *
-        * Compared to delimiterReplace(), this implementation is fast but memory-
-        * hungry and inflexible. The memory requirements are such that I don't
-        * recommend using it on anything but guaranteed small chunks of text.
+        * ..except that it's worst-case O(N) instead of O(N^2). Compared to delimiterReplace(), this
+        * implementation is fast but memory-hungry and inflexible. The memory requirements are such
+        * that I don't recommend using it on anything but guaranteed small chunks of text.
         *
         * @param string $startDelim
         * @param string $endDelim
         * @param string $replace
         * @param string $subject
-        *
         * @return string
         */
        static function hungryDelimiterReplace( $startDelim, $endDelim, $replace, $subject ) {
@@ -144,18 +142,20 @@ class StringUtils {
        }
 
        /**
-        * Perform an operation equivalent to
+        * Perform an operation equivalent to `preg_replace_callback()`
         *
-        *   preg_replace_callback( "!$startDelim(.*)$endDelim!s$flags", $callback, $subject )
+        * Matches this code:
         *
-        * This implementation is slower than hungryDelimiterReplace but uses far less
-        * memory. The delimiters are literal strings, not regular expressions.
+        *     preg_replace_callback( "!$startDelim(.*)$endDelim!s$flags", $callback, $subject );
         *
         * If the start delimiter ends with an initial substring of the end delimiter,
         * e.g. in the case of C-style comments, the behavior differs from the model
         * regex. In this implementation, the end must share no characters with the
-        * start, so e.g. /*\/ is not considered to be both the start and end of a
-        * comment. /*\/xy/*\/ is considered to be a single comment with contents /xy/.
+        * start, so e.g. `/*\/` is not considered to be both the start and end of a
+        * comment. `/*\/xy/*\/` is considered to be a single comment with contents `/xy/`.
+        *
+        * The implementation of delimiterReplaceCallback() is slower than hungryDelimiterReplace()
+        * but uses far less memory. The delimiters are literal strings, not regular expressions.
         *
         * @param string $startDelim Start delimiter
         * @param string $endDelim End delimiter
@@ -241,14 +241,16 @@ class StringUtils {
        }
 
        /**
-        * Perform an operation equivalent to
+        * Perform an operation equivalent to `preg_replace()` with flags.
+        *
+        * Matches this code:
         *
-        *   preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject )
+        *     preg_replace( "!$startDelim(.*)$endDelim!$flags", $replace, $subject );
         *
         * @param string $startDelim Start delimiter regular expression
         * @param string $endDelim End delimiter regular expression
         * @param string $replace Replacement string. May contain $1, which will be
-        *                 replaced by the text between the delimiters
+        *  replaced by the text between the delimiters
         * @param string $subject String to search
         * @param string $flags Regular expression flags
         * @return string The string with the matches replaced
@@ -262,7 +264,7 @@ class StringUtils {
 
        /**
         * More or less "markup-safe" explode()
-        * Ignores any instances of the separator inside <...>
+        * Ignores any instances of the separator inside `<...>`
         * @param string $separator
         * @param string $text
         * @return array
@@ -296,13 +298,12 @@ class StringUtils {
        static function escapeRegexReplacement( $string ) {
                $string = str_replace( '\\', '\\\\', $string );
                $string = str_replace( '$', '\\$', $string );
-
                return $string;
        }
 
        /**
         * Workalike for explode() with limited memory usage.
-        * Returns an Iterator
+        *
         * @param string $separator
         * @param string $subject
         * @return ArrayIterator|ExplodeIterator
diff --git a/includes/libs/Timing.php b/includes/libs/Timing.php
new file mode 100644 (file)
index 0000000..00ceda3
--- /dev/null
@@ -0,0 +1,195 @@
+<?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
+ */
+
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
+/**
+ * An interface to help developers measure the performance of their applications.
+ * This interface closely matches the W3C's User Timing specification.
+ * The key differences are:
+ *
+ * - The reference point for all measurements which do not explicitly specify
+ *   a start time is $_SERVER['REQUEST_TIME_FLOAT'], not navigationStart.
+ * - Successive calls to mark() and measure() with the same entry name cause
+ *   the previous entry to be overwritten. This ensures that there is a 1:1
+ *   mapping between names and entries.
+ * - Because there is a 1:1 mapping, instead of getEntriesByName(), we have
+ *   getEntryByName().
+ *
+ * The in-line documentation incorporates content from the User Timing Specification
+ * http://www.w3.org/TR/user-timing/
+ * Copyright © 2013 World Wide Web Consortium, (MIT, ERCIM, Keio, Beihang).
+ * http://www.w3.org/Consortium/Legal/2015/doc-license
+ *
+ * @since 1.27
+ */
+class Timing implements LoggerAwareInterface {
+
+       /** @var array[] */
+       private $entries = array();
+
+       /** @var LoggerInterface */
+       protected $logger;
+
+       public function __construct( array $params = array() ) {
+               $this->clearMarks();
+               $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
+       }
+
+       /**
+        * Sets a logger instance on the object.
+        *
+        * @param LoggerInterface $logger
+        * @return null
+        */
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       /**
+        * Store a timestamp with the associated name (a "mark")
+        *
+        * @param string $markName The name associated with the timestamp.
+        *  If there already exists an entry by that name, it is overwritten.
+        * @return array The mark that has been created.
+        */
+       public function mark( $markName ) {
+               $this->entries[$markName] = array(
+                       'name'      => $markName,
+                       'entryType' => 'mark',
+                       'startTime' => microtime( true ),
+                       'duration'  => 0,
+               );
+               return $this->entries[$markName];
+       }
+
+       /**
+        * @param string $markName The name of the mark that should
+        *  be cleared. If not specified, all marks will be cleared.
+        */
+       public function clearMarks( $markName = null ) {
+               if ( $markName !== null ) {
+                       unset( $this->entries[$markName] );
+               } else {
+                       $this->entries = array(
+                               'requestStart' => array(
+                                       'name'      => 'requestStart',
+                                       'entryType' => 'mark',
+                                       'startTime' => isset( $_SERVER['REQUEST_TIME_FLOAT'] )
+                                               ? $_SERVER['REQUEST_TIME_FLOAT']
+                                               : $_SERVER['REQUEST_TIME'],
+                                       'duration'  => 0,
+                               ),
+                       );
+               }
+       }
+
+       /**
+        * This method stores the duration between two marks along with
+        * the associated name (a "measure").
+        *
+        * If neither the startMark nor the endMark argument is specified,
+        * measure() will store the duration from $_SERVER['REQUEST_TIME_FLOAT'] to
+        * the current time.
+        * If the startMark argument is specified, but the endMark argument is not
+        * specified, measure() will store the duration from the most recent
+        * occurrence of the start mark to the current time.
+        * If both the startMark and endMark arguments are specified, measure()
+        * will store the duration from the most recent occurrence of the start
+        * mark to the most recent occurrence of the end mark.
+        *
+        * @param string $measureName
+        * @param string $startMark
+        * @param string $endMark
+        * @return array|bool The measure that has been created, or false if either
+        *  the start mark or the end mark do not exist.
+        */
+       public function measure( $measureName, $startMark = 'requestStart', $endMark = null ) {
+               $start = $this->getEntryByName( $startMark );
+               if ( $start === null ) {
+                       $this->logger->error( __METHOD__ . ": The mark '$startMark' does not exist" );
+                       return false;
+               }
+               $startTime = $start['startTime'];
+
+               if ( $endMark ) {
+                       $end = $this->getEntryByName( $endMark );
+                       if ( $end === null ) {
+                               $this->logger->error( __METHOD__ . ": The mark '$endMark' does not exist" );
+                               return false;
+                       }
+                       $endTime = $end['startTime'];
+               } else {
+                       $endTime = microtime( true );
+               }
+
+               $this->entries[$measureName] = array(
+                       'name'      => $measureName,
+                       'entryType' => 'measure',
+                       'startTime' => $startTime,
+                       'duration'  => $endTime - $startTime,
+               );
+
+               return $this->entries[$measureName];
+       }
+
+       /**
+        * Sort entries in chronological order with respect to startTime.
+        */
+       private function sortEntries() {
+               uasort( $this->entries, function ( $a, $b ) {
+                       return 10000 * ( $a['startTime'] - $b['startTime'] );
+               } );
+       }
+
+       /**
+        * @return array[] All entries in chronological order.
+        */
+       public function getEntries() {
+               $this->sortEntries();
+               return $this->entries;
+       }
+
+       /**
+        * @param string $entryType
+        * @return array[] Entries (in chronological order) that have the same value
+        *  for the entryType attribute as the $entryType parameter.
+        */
+       public function getEntriesByType( $entryType ) {
+               $this->sortEntries();
+               $entries = array();
+               foreach ( $this->entries as $entry ) {
+                       if ( $entry['entryType'] === $entryType ) {
+                               $entries[] = $entry;
+                       }
+               }
+               return $entries;
+       }
+
+       /**
+        * @param string $name
+        * @return array|null Entry named $name or null if it does not exist.
+        */
+       public function getEntryByName( $name ) {
+               return isset( $this->entries[$name] ) ? $this->entries[$name] : null;
+       }
+}
index 5ed67c7..d2cd0e4 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use RunningStat\RunningStat;
+
 /**
  * Convenience class for working with XHProf
  * <https://github.com/phacility/xhprof>. XHProf can be installed as a PECL
@@ -254,7 +256,7 @@ class Xhprof {
                                        }
 
                                        for ( $i = 0; $i < $stats['ct']; $i++ ) {
-                                               $this->inclusive[$child][$stat]->push(
+                                               $this->inclusive[$child][$stat]->addObservation(
                                                        $value / $stats['ct']
                                                );
                                        }
diff --git a/includes/libs/composer/ComposerInstalled.php b/includes/libs/composer/ComposerInstalled.php
new file mode 100644 (file)
index 0000000..5f87b54
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Reads an installed.json file and provides accessors to get what is
+ * installed
+ *
+ * @since 1.27
+ */
+class ComposerInstalled {
+
+       /**
+        * @param string $location
+        */
+       public function __construct( $location ) {
+               $this->contents = json_decode( file_get_contents( $location ), true );
+       }
+
+       /**
+        * Dependencies currently installed according to installed.json
+        *
+        * @return array
+        */
+       public function getInstalledDependencies() {
+               $deps = array();
+               foreach ( $this->contents as $installed ) {
+                       $deps[$installed['name']] = array(
+                               'version' => ComposerJson::normalizeVersion( $installed['version'] ),
+                               'type' => $installed['type'],
+                               'licenses' => isset( $installed['license'] ) ? $installed['license'] : array(),
+                               'authors' => isset( $installed['authors'] ) ? $installed['authors'] : array(),
+                               'description' => isset( $installed['description'] ) ? $installed['description']: '',
+                       );
+               }
+
+               ksort( $deps );
+               return $deps;
+       }
+}
index b5419b7..c7f9c57 100644 (file)
  * @ingroup Cache
  */
 class APCBagOStuff extends BagOStuff {
+
+       /**
+        * @var bool If true, trust the APC implementation to serialize and
+        * deserialize objects correctly. If false, (de-)serialize in PHP.
+        */
+       protected $nativeSerialize;
+
        /**
         * @var string String to append to each APC key. This may be changed
         *  whenever the handling of values is changed, to prevent existing code
         *  from encountering older values which it cannot handle.
-        **/
-       const KEY_SUFFIX = ':1';
+        */
+       const KEY_SUFFIX = ':2';
+
+       /**
+        * Constructor
+        *
+        * Available parameters are:
+        *   - nativeSerialize:     If true, pass objects to apc_store(), and trust it
+        *                          to serialize them correctly. If false, serialize
+        *                          all values in PHP.
+        *
+        * @param array $params
+        */
+       public function __construct( array $params = array() ) {
+               parent::__construct( $params );
+
+               if ( isset( $params['nativeSerialize'] ) ) {
+                       $this->nativeSerialize = $params['nativeSerialize'];
+               } elseif ( extension_loaded( 'apcu' ) && ini_get( 'apc.serializer' ) === 'default' ) {
+                       // APCu has a memory corruption bug when the serializer is set to 'default'.
+                       // See T120267, and upstream bug reports:
+                       //  - https://github.com/krakjoe/apcu/issues/38
+                       //  - https://github.com/krakjoe/apcu/issues/35
+                       //  - https://github.com/krakjoe/apcu/issues/111
+                       $this->logger->warning(
+                               'The APCu extension is loaded and the apc.serializer INI setting ' .
+                               'is set to "default". This can cause memory corruption! ' .
+                               'You should change apc.serializer to "php" instead. ' .
+                               'See <https://github.com/krakjoe/apcu/issues/38>.'
+                       );
+                       $this->nativeSerialize = false;
+               } else {
+                       $this->nativeSerialize = true;
+               }
+       }
 
        protected function doGet( $key, $flags = 0 ) {
                $val = apc_fetch( $key . self::KEY_SUFFIX );
 
+               if ( is_string( $val ) && !$this->nativeSerialize ) {
+                       $val = $this->isInteger( $val )
+                               ? intval( $val )
+                               : unserialize( $val );
+               }
+
                return $val;
        }
 
        public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               if ( !$this->nativeSerialize && !$this->isInteger( $value ) ) {
+                       $value = serialize( $value );
+               }
+
                apc_store( $key . self::KEY_SUFFIX, $value, $exptime );
 
                return true;
index c3c357f..703c195 100644 (file)
@@ -42,7 +42,7 @@ use Psr\Log\NullLogger;
  *
  * @ingroup Cache
  */
-abstract class BagOStuff implements LoggerAwareInterface {
+abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
        /** @var array[] Lock tracking */
        protected $locks = array();
 
@@ -220,7 +220,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
                do {
                        $this->clearLastError();
                        $casToken = null; // passed by reference
-                       $currentValue = $this->getWithToken( $key, $casToken, BagOStuff::READ_LATEST );
+                       $currentValue = $this->getWithToken( $key, $casToken, self::READ_LATEST );
                        if ( $this->getLastError() ) {
                                return false; // don't spam retries (retry only on races)
                        }
@@ -276,7 +276,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
                }
 
                $this->clearLastError();
-               $currentValue = $this->get( $key, BagOStuff::READ_LATEST );
+               $currentValue = $this->get( $key, self::READ_LATEST );
                if ( $this->getLastError() ) {
                        $success = false;
                } else {
@@ -319,7 +319,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
                        }
                }
 
-               $expiry = min( $expiry ?: INF, 86400 );
+               $expiry = min( $expiry ?: INF, self::TTL_DAY );
 
                $this->clearLastError();
                $timestamp = microtime( true ); // starting UNIX timestamp
@@ -389,7 +389,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @since 1.26
         */
        final public function getScopedLock( $key, $timeout = 6, $expiry = 30, $rclass = '' ) {
-               $expiry = min( $expiry ?: INF, 86400 );
+               $expiry = min( $expiry ?: INF, self::TTL_DAY );
 
                if ( !$this->lock( $key, $timeout, $expiry, $rclass ) ) {
                        return null;
@@ -582,7 +582,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @return int
         */
        protected function convertExpiry( $exptime ) {
-               if ( ( $exptime != 0 ) && ( $exptime < 86400 * 3650 /* 10 years */ ) ) {
+               if ( $exptime != 0 && $exptime < ( 10 * self::TTL_YEAR ) ) {
                        return time() + $exptime;
                } else {
                        return $exptime;
@@ -597,7 +597,7 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @return int
         */
        protected function convertToRelative( $exptime ) {
-               if ( $exptime >= 86400 * 3650 /* 10 years */ ) {
+               if ( $exptime >= ( 10 * self::TTL_YEAR ) ) {
                        $exptime -= time();
                        if ( $exptime <= 0 ) {
                                $exptime = 1;
@@ -627,7 +627,11 @@ abstract class BagOStuff implements LoggerAwareInterface {
         * @return string
         */
        public function makeKeyInternal( $keyspace, $args ) {
-               $key = $keyspace . ':' . implode( ':', $args );
+               $key = $keyspace;
+               foreach ( $args as $arg ) {
+                       $arg = str_replace( ':', '%3A', $arg );
+                       $key = $key . ':' . $arg;
+               }
                return strtr( $key, ' ', '_' );
        }
 
index 94bc95f..7b85d92 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Object caching using PHP arrays.
+ * Per-process memory cache for storing 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
  * @file
  * @ingroup Cache
  */
+use Wikimedia\Assert\Assert;
 
 /**
- * This is a test of the interface, mainly. It stores things in an associative
- * array, which is not going to persist between program runs.
+ * Simple store for keeping values in an associative array for the current process.
+ *
+ * Data will not persist and is not shared with other processes.
  *
  * @ingroup Cache
  */
 class HashBagOStuff extends BagOStuff {
-       /** @var array */
-       protected $bag;
+       /** @var mixed[] */
+       protected $bag = array();
+       /** @var integer Max entries allowed */
+       protected $maxCacheKeys;
+
+       const KEY_VAL = 0;
+       const KEY_EXP = 1;
 
+       /**
+        * @param array $params Additional parameters include:
+        *   - maxKeys : only allow this many keys (using oldest-first eviction)
+        */
        function __construct( $params = array() ) {
                parent::__construct( $params );
-               $this->bag = array();
+
+               $this->maxCacheKeys = isset( $params['maxKeys'] ) ? $params['maxKeys'] : INF;
+               Assert::parameter( $this->maxCacheKeys > 0, 'maxKeys', 'must be above zero' );
        }
 
        protected function expire( $key ) {
-               $et = $this->bag[$key][1];
-
-               if ( ( $et == 0 ) || ( $et > time() ) ) {
+               $et = $this->bag[$key][self::KEY_EXP];
+               if ( $et == self::TTL_INDEFINITE || $et > time() ) {
                        return false;
                }
 
@@ -57,17 +69,38 @@ class HashBagOStuff extends BagOStuff {
                        return false;
                }
 
-               return $this->bag[$key][0];
+               // Refresh key position for maxCacheKeys eviction
+               $temp = $this->bag[$key];
+               unset( $this->bag[$key] );
+               $this->bag[$key] = $temp;
+
+               return $this->bag[$key][self::KEY_VAL];
        }
 
        public function set( $key, $value, $exptime = 0, $flags = 0 ) {
-               $this->bag[$key] = array( $value, $this->convertExpiry( $exptime ) );
+               // Refresh key position for maxCacheKeys eviction
+               unset( $this->bag[$key] );
+               $this->bag[$key] = array(
+                       self::KEY_VAL => $value,
+                       self::KEY_EXP => $this->convertExpiry( $exptime )
+               );
+
+               if ( count( $this->bag ) > $this->maxCacheKeys ) {
+                       reset( $this->bag );
+                       $evictKey = key( $this->bag );
+                       unset( $this->bag[$evictKey] );
+               }
+
                return true;
        }
 
-       function delete( $key ) {
+       public function delete( $key ) {
                unset( $this->bag[$key] );
 
                return true;
        }
+
+       public function clear() {
+               $this->bag = array();
+       }
 }
diff --git a/includes/libs/objectcache/IExpiringStore.php b/includes/libs/objectcache/IExpiringStore.php
new file mode 100644 (file)
index 0000000..fa465c7
--- /dev/null
@@ -0,0 +1,42 @@
+<?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
+ * @author 2015 Timo Tijhof
+ */
+
+/**
+ * Generic base class for storage interfaces.
+ *
+ * Provides convenient TTL constants.
+ *
+ * @ingroup Cache
+ * @since 1.27
+ */
+interface IExpiringStore {
+
+       // Constants for TTL values, in seconds
+       const TTL_MINUTE = 60;
+       const TTL_HOUR = 3600;
+       const TTL_DAY = 86400; // 24 * 3600
+       const TTL_WEEK = 604800; // 7 * 24 * 3600
+       const TTL_MONTH = 2592000; // 30 * 24 * 3600
+       const TTL_YEAR = 31536000; // 365 * 24 * 3600
+
+       const TTL_INDEFINITE = 0;
+}
diff --git a/includes/libs/objectcache/MemcachedBagOStuff.php b/includes/libs/objectcache/MemcachedBagOStuff.php
new file mode 100644 (file)
index 0000000..7a36214
--- /dev/null
@@ -0,0 +1,187 @@
+<?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 {
+       /** @var MemcachedClient|Memcached */
+       protected $client;
+
+       /**
+        * Fill in some defaults for missing keys in $params.
+        *
+        * @param array $params
+        * @return array
+        */
+       protected function applyDefaultParams( $params ) {
+               if ( !isset( $params['compress_threshold'] ) ) {
+                       $params['compress_threshold'] = 1500;
+               }
+               if ( !isset( $params['connect_timeout'] ) ) {
+                       $params['connect_timeout'] = 0.5;
+               }
+               return $params;
+       }
+
+       protected function doGet( $key, $flags = 0 ) {
+               $casToken = null;
+
+               return $this->getWithToken( $key, $casToken, $flags );
+       }
+
+       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
+               return $this->client->get( $this->validateKeyEncoding( $key ), $casToken );
+       }
+
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               return $this->client->set( $this->validateKeyEncoding( $key ), $value,
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
+               return $this->client->cas( $casToken, $this->validateKeyEncoding( $key ),
+                       $value, $this->fixExpiry( $exptime ) );
+       }
+
+       public function delete( $key ) {
+               return $this->client->delete( $this->validateKeyEncoding( $key ) );
+       }
+
+       public function add( $key, $value, $exptime = 0 ) {
+               return $this->client->add( $this->validateKeyEncoding( $key ), $value,
+                       $this->fixExpiry( $exptime ) );
+       }
+
+       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
+               if ( !is_callable( $callback ) ) {
+                       throw new Exception( "Got invalid callback." );
+               }
+
+               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+       }
+
+       /**
+        * Get the underlying client object. This is provided for debugging
+        * purposes.
+        * @return MemcachedClient|Memcached
+        */
+       public function getClient() {
+               return $this->client;
+       }
+
+       /**
+        * Construct a cache key.
+        *
+        * @since 1.27
+        * @param string $keyspace
+        * @param array $args
+        * @return string
+        */
+       public function makeKeyInternal( $keyspace, $args ) {
+               // Memcached keys have a maximum length of 255 characters. From that,
+               // subtract the number of characters we need for the keyspace and for
+               // the separator character needed for each argument. To handle some
+               // custom prefixes used by thing like WANObjectCache, limit to 205.
+               $charsLeft = 205 - strlen( $keyspace ) - count( $args );
+
+               $args = array_map(
+                       function ( $arg ) use ( &$charsLeft ) {
+                               $arg = strtr( $arg, ' ', '_' );
+
+                               // Make sure %, #, and non-ASCII chars are escaped
+                               $arg = preg_replace_callback(
+                                       '/[^\x21-\x22\x24\x26-\x39\x3b-\x7e]+/',
+                                       function ( $m ) {
+                                               return rawurlencode( $m[0] );
+                                       },
+                                       $arg
+                               );
+
+                               // 33 = 32 characters for the MD5 + 1 for the '#' prefix.
+                               if ( $charsLeft > 33 && strlen( $arg ) > $charsLeft ) {
+                                       $arg = '#' . md5( $arg );
+                               }
+
+                               $charsLeft -= strlen( $arg );
+                               return $arg;
+                       },
+                       $args
+               );
+
+               if ( $charsLeft < 0 ) {
+                       return $keyspace . ':##' . md5( implode( ':', $args ) );
+               }
+
+               return $keyspace . ':' . implode( ':', $args );
+       }
+
+       /**
+        * Ensure that a key is safe to use (contains no control characters and no
+        * characters above the ASCII range.)
+        *
+        * @param string $key
+        * @return string
+        * @throws Exception
+        */
+       public function validateKeyEncoding( $key ) {
+               if ( preg_match( '/[^\x21-\x7e]+/', $key ) ) {
+                       throw new Exception( "Key contains invalid characters: $key" );
+               }
+               return $key;
+       }
+
+       /**
+        * 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 expires >30d at 30d, unless they're >=1e9 in which
+        * case they are likely to really be absolute (1e9 = 2011-09-09)
+        * @param int $expiry
+        * @return int
+        */
+       function fixExpiry( $expiry ) {
+               if ( $expiry > 2592000 && $expiry < 1000000000 ) {
+                       $expiry = 2592000;
+               }
+               return (int)$expiry;
+       }
+
+       /**
+        * Send a debug message to the log
+        * @param string $text
+        */
+       protected function debugLog( $text ) {
+               $this->logger->debug( $text );
+       }
+
+       public function modifySimpleRelayEvent( array $event ) {
+               if ( array_key_exists( 'val', $event ) ) {
+                       $event['flg'] = 0; // data is not serialized nor gzipped (for memcached driver)
+               }
+
+               return $event;
+       }
+}
diff --git a/includes/libs/objectcache/MemcachedClient.php b/includes/libs/objectcache/MemcachedClient.php
new file mode 100644 (file)
index 0000000..8007a53
--- /dev/null
@@ -0,0 +1,1270 @@
+<?php
+// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
+/**
+ * Memcached client for PHP.
+ *
+ * +---------------------------------------------------------------------------+
+ * | memcached client, PHP                                                     |
+ * +---------------------------------------------------------------------------+
+ * | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net>                 |
+ * | All rights reserved.                                                      |
+ * |                                                                           |
+ * | Redistribution and use in source and binary forms, with or without        |
+ * | modification, are permitted provided that the following conditions        |
+ * | are met:                                                                  |
+ * |                                                                           |
+ * | 1. Redistributions of source code must retain the above copyright         |
+ * |    notice, this list of conditions and the following disclaimer.          |
+ * | 2. Redistributions in binary form must reproduce the above copyright      |
+ * |    notice, this list of conditions and the following disclaimer in the    |
+ * |    documentation and/or other materials provided with the distribution.   |
+ * |                                                                           |
+ * | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      |
+ * | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
+ * | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   |
+ * | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          |
+ * | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  |
+ * | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
+ * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
+ * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  |
+ * | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         |
+ * +---------------------------------------------------------------------------+
+ * | Author: Ryan T. Dean <rtdean@cytherianage.net>                            |
+ * | Heavily influenced by the Perl memcached client by Brad Fitzpatrick.      |
+ * |   Permission granted by Brad Fitzpatrick for relicense of ported Perl     |
+ * |   client logic under 2-clause BSD license.                                |
+ * +---------------------------------------------------------------------------+
+ *
+ * @file
+ * $TCAnet$
+ */
+
+/**
+ * This is a PHP client for memcached - a distributed memory cache daemon.
+ *
+ * More information is available at http://www.danga.com/memcached/
+ *
+ * Usage example:
+ *
+ *     $mc = new MemcachedClient(array(
+ *         'servers' => array(
+ *             '127.0.0.1:10000',
+ *             array( '192.0.0.1:10010', 2 ),
+ *             '127.0.0.1:10020'
+ *         ),
+ *         'debug'   => false,
+ *         'compress_threshold' => 10240,
+ *         'persistent' => true
+ *     ));
+ *
+ *     $mc->add( 'key', array( 'some', 'array' ) );
+ *     $mc->replace( 'key', 'some random string' );
+ *     $val = $mc->get( 'key' );
+ *
+ * @author Ryan T. Dean <rtdean@cytherianage.net>
+ * @version 0.1.2
+ */
+
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
+// {{{ class MemcachedClient
+/**
+ * memcached client class implemented using (p)fsockopen()
+ *
+ * @author  Ryan T. Dean <rtdean@cytherianage.net>
+ * @ingroup Cache
+ */
+class MemcachedClient {
+       // {{{ properties
+       // {{{ public
+
+       // {{{ constants
+       // {{{ flags
+
+       /**
+        * Flag: indicates data is serialized
+        */
+       const SERIALIZED = 1;
+
+       /**
+        * Flag: indicates data is compressed
+        */
+       const COMPRESSED = 2;
+
+       /**
+        * Flag: indicates data is an integer
+        */
+       const INTVAL = 4;
+
+       // }}}
+
+       /**
+        * Minimum savings to store data compressed
+        */
+       const COMPRESSION_SAVINGS = 0.20;
+
+       // }}}
+
+       /**
+        * Command statistics
+        *
+        * @var array
+        * @access public
+        */
+       public $stats;
+
+       // }}}
+       // {{{ private
+
+       /**
+        * Cached Sockets that are connected
+        *
+        * @var array
+        * @access private
+        */
+       public $_cache_sock;
+
+       /**
+        * Current debug status; 0 - none to 9 - profiling
+        *
+        * @var bool
+        * @access private
+        */
+       public $_debug;
+
+       /**
+        * Dead hosts, assoc array, 'host'=>'unixtime when ok to check again'
+        *
+        * @var array
+        * @access private
+        */
+       public $_host_dead;
+
+       /**
+        * Is compression available?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_have_zlib;
+
+       /**
+        * Do we want to use compression?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_compress_enable;
+
+       /**
+        * At how many bytes should we compress?
+        *
+        * @var int
+        * @access private
+        */
+       public $_compress_threshold;
+
+       /**
+        * Are we using persistent links?
+        *
+        * @var bool
+        * @access private
+        */
+       public $_persistent;
+
+       /**
+        * If only using one server; contains ip:port to connect to
+        *
+        * @var string
+        * @access private
+        */
+       public $_single_sock;
+
+       /**
+        * Array containing ip:port or array(ip:port, weight)
+        *
+        * @var array
+        * @access private
+        */
+       public $_servers;
+
+       /**
+        * Our bit buckets
+        *
+        * @var array
+        * @access private
+        */
+       public $_buckets;
+
+       /**
+        * Total # of bit buckets we have
+        *
+        * @var int
+        * @access private
+        */
+       public $_bucketcount;
+
+       /**
+        * # of total servers we have
+        *
+        * @var int
+        * @access private
+        */
+       public $_active;
+
+       /**
+        * Stream timeout in seconds. Applies for example to fread()
+        *
+        * @var int
+        * @access private
+        */
+       public $_timeout_seconds;
+
+       /**
+        * Stream timeout in microseconds
+        *
+        * @var int
+        * @access private
+        */
+       public $_timeout_microseconds;
+
+       /**
+        * Connect timeout in seconds
+        */
+       public $_connect_timeout;
+
+       /**
+        * Number of connection attempts for each server
+        */
+       public $_connect_attempts;
+
+       /**
+        * @var LoggerInterface
+        */
+       private $_logger;
+
+       // }}}
+       // }}}
+       // {{{ methods
+       // {{{ public functions
+       // {{{ memcached()
+
+       /**
+        * Memcache initializer
+        *
+        * @param array $args Associative array of settings
+        *
+        * @return mixed
+        */
+       public function __construct( $args ) {
+               $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
+               $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
+               $this->stats = array();
+               $this->_compress_threshold = isset( $args['compress_threshold'] ) ? $args['compress_threshold'] : 0;
+               $this->_persistent = isset( $args['persistent'] ) ? $args['persistent'] : false;
+               $this->_compress_enable = true;
+               $this->_have_zlib = function_exists( 'gzcompress' );
+
+               $this->_cache_sock = array();
+               $this->_host_dead = array();
+
+               $this->_timeout_seconds = 0;
+               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
+
+               $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
+               $this->_connect_attempts = 2;
+
+               $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
+       }
+
+       // }}}
+       // {{{ add()
+
+       /**
+        * Adds a key/value to the memcache server if one isn't already set with
+        * that key
+        *
+        * @param string $key Key to set with data
+        * @param mixed $val Value to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of expiration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool
+        */
+       public function add( $key, $val, $exp = 0 ) {
+               return $this->_set( 'add', $key, $val, $exp );
+       }
+
+       // }}}
+       // {{{ decr()
+
+       /**
+        * Decrease a value stored on the memcache server
+        *
+        * @param string $key Key to decrease
+        * @param int $amt (optional) amount to decrease
+        *
+        * @return mixed False on failure, value on success
+        */
+       public function decr( $key, $amt = 1 ) {
+               return $this->_incrdecr( 'decr', $key, $amt );
+       }
+
+       // }}}
+       // {{{ delete()
+
+       /**
+        * Deletes a key from the server, optionally after $time
+        *
+        * @param string $key Key to delete
+        * @param int $time (optional) how long to wait before deleting
+        *
+        * @return bool True on success, false on failure
+        */
+       public function delete( $key, $time = 0 ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+
+               if ( isset( $this->stats['delete'] ) ) {
+                       $this->stats['delete']++;
+               } else {
+                       $this->stats['delete'] = 1;
+               }
+               $cmd = "delete $key $time\r\n";
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return false;
+               }
+               $res = $this->_fgets( $sock );
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
+               }
+
+               if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
+                       return true;
+               }
+
+               return false;
+       }
+
+       /**
+        * @param string $key
+        * @param int $timeout
+        * @return bool
+        */
+       public function lock( $key, $timeout = 0 ) {
+               /* stub */
+               return true;
+       }
+
+       /**
+        * @param string $key
+        * @return bool
+        */
+       public function unlock( $key ) {
+               /* stub */
+               return true;
+       }
+
+       // }}}
+       // {{{ disconnect_all()
+
+       /**
+        * Disconnects all connected sockets
+        */
+       public function disconnect_all() {
+               foreach ( $this->_cache_sock as $sock ) {
+                       fclose( $sock );
+               }
+
+               $this->_cache_sock = array();
+       }
+
+       // }}}
+       // {{{ enable_compress()
+
+       /**
+        * Enable / Disable compression
+        *
+        * @param bool $enable True to enable, false to disable
+        */
+       public function enable_compress( $enable ) {
+               $this->_compress_enable = $enable;
+       }
+
+       // }}}
+       // {{{ forget_dead_hosts()
+
+       /**
+        * Forget about all of the dead hosts
+        */
+       public function forget_dead_hosts() {
+               $this->_host_dead = array();
+       }
+
+       // }}}
+       // {{{ get()
+
+       /**
+        * Retrieves the value associated with the key from the memcache server
+        *
+        * @param array|string $key key to retrieve
+        * @param float $casToken [optional]
+        *
+        * @return mixed
+        */
+       public function get( $key, &$casToken = null ) {
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( "get($key)\n" );
+               }
+
+               if ( !is_array( $key ) && strval( $key ) === '' ) {
+                       $this->_debugprint( "Skipping key which equals to an empty string" );
+                       return false;
+               }
+
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+               if ( isset( $this->stats['get'] ) ) {
+                       $this->stats['get']++;
+               } else {
+                       $this->stats['get'] = 1;
+               }
+
+               $cmd = "gets $key\r\n";
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return false;
+               }
+
+               $val = array();
+               $this->_load_items( $sock, $val, $casToken );
+
+               if ( $this->_debug ) {
+                       foreach ( $val as $k => $v ) {
+                               $this->_debugprint( sprintf( "MemCache: sock %s got %s\n", serialize( $sock ), $k ) );
+                       }
+               }
+
+               $value = false;
+               if ( isset( $val[$key] ) ) {
+                       $value = $val[$key];
+               }
+               return $value;
+       }
+
+       // }}}
+       // {{{ get_multi()
+
+       /**
+        * Get multiple keys from the server(s)
+        *
+        * @param array $keys Keys to retrieve
+        *
+        * @return array
+        */
+       public function get_multi( $keys ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               if ( isset( $this->stats['get_multi'] ) ) {
+                       $this->stats['get_multi']++;
+               } else {
+                       $this->stats['get_multi'] = 1;
+               }
+               $sock_keys = array();
+               $socks = array();
+               foreach ( $keys as $key ) {
+                       $sock = $this->get_sock( $key );
+                       if ( !is_resource( $sock ) ) {
+                               continue;
+                       }
+                       $key = is_array( $key ) ? $key[1] : $key;
+                       if ( !isset( $sock_keys[$sock] ) ) {
+                               $sock_keys[intval( $sock )] = array();
+                               $socks[] = $sock;
+                       }
+                       $sock_keys[intval( $sock )][] = $key;
+               }
+
+               $gather = array();
+               // Send out the requests
+               foreach ( $socks as $sock ) {
+                       $cmd = 'gets';
+                       foreach ( $sock_keys[intval( $sock )] as $key ) {
+                               $cmd .= ' ' . $key;
+                       }
+                       $cmd .= "\r\n";
+
+                       if ( $this->_fwrite( $sock, $cmd ) ) {
+                               $gather[] = $sock;
+                       }
+               }
+
+               // Parse responses
+               $val = array();
+               foreach ( $gather as $sock ) {
+                       $this->_load_items( $sock, $val, $casToken );
+               }
+
+               if ( $this->_debug ) {
+                       foreach ( $val as $k => $v ) {
+                               $this->_debugprint( sprintf( "MemCache: got %s\n", $k ) );
+                       }
+               }
+
+               return $val;
+       }
+
+       // }}}
+       // {{{ incr()
+
+       /**
+        * Increments $key (optionally) by $amt
+        *
+        * @param string $key Key to increment
+        * @param int $amt (optional) amount to increment
+        *
+        * @return int|null Null if the key does not exist yet (this does NOT
+        * create new mappings if the key does not exist). If the key does
+        * exist, this returns the new value for that key.
+        */
+       public function incr( $key, $amt = 1 ) {
+               return $this->_incrdecr( 'incr', $key, $amt );
+       }
+
+       // }}}
+       // {{{ replace()
+
+       /**
+        * Overwrites an existing value for key; only works if key is already set
+        *
+        * @param string $key Key to set value as
+        * @param mixed $value Value to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool
+        */
+       public function replace( $key, $value, $exp = 0 ) {
+               return $this->_set( 'replace', $key, $value, $exp );
+       }
+
+       // }}}
+       // {{{ run_command()
+
+       /**
+        * Passes through $cmd to the memcache server connected by $sock; returns
+        * output as an array (null array if no output)
+        *
+        * @param Resource $sock Socket to send command on
+        * @param string $cmd Command to run
+        *
+        * @return array Output array
+        */
+       public function run_command( $sock, $cmd ) {
+               if ( !is_resource( $sock ) ) {
+                       return array();
+               }
+
+               if ( !$this->_fwrite( $sock, $cmd ) ) {
+                       return array();
+               }
+
+               $ret = array();
+               while ( true ) {
+                       $res = $this->_fgets( $sock );
+                       $ret[] = $res;
+                       if ( preg_match( '/^END/', $res ) ) {
+                               break;
+                       }
+                       if ( strlen( $res ) == 0 ) {
+                               break;
+                       }
+               }
+               return $ret;
+       }
+
+       // }}}
+       // {{{ set()
+
+       /**
+        * Unconditionally sets a key to a given value in the memcache.  Returns true
+        * if set successfully.
+        *
+        * @param string $key Key to set value as
+        * @param mixed $value Value to set
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool True on success
+        */
+       public function set( $key, $value, $exp = 0 ) {
+               return $this->_set( 'set', $key, $value, $exp );
+       }
+
+       // }}}
+       // {{{ cas()
+
+       /**
+        * Sets a key to a given value in the memcache if the current value still corresponds
+        * to a known, given value.  Returns true if set successfully.
+        *
+        * @param float $casToken Current known value
+        * @param string $key Key to set value as
+        * @param mixed $value Value to set
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        *
+        * @return bool True on success
+        */
+       public function cas( $casToken, $key, $value, $exp = 0 ) {
+               return $this->_set( 'cas', $key, $value, $exp, $casToken );
+       }
+
+       // }}}
+       // {{{ set_compress_threshold()
+
+       /**
+        * Set the compression threshold
+        *
+        * @param int $thresh Threshold to compress if larger than
+        */
+       public function set_compress_threshold( $thresh ) {
+               $this->_compress_threshold = $thresh;
+       }
+
+       // }}}
+       // {{{ set_debug()
+
+       /**
+        * Set the debug flag
+        *
+        * @see __construct()
+        * @param bool $dbg True for debugging, false otherwise
+        */
+       public function set_debug( $dbg ) {
+               $this->_debug = $dbg;
+       }
+
+       // }}}
+       // {{{ set_servers()
+
+       /**
+        * Set the server list to distribute key gets and puts between
+        *
+        * @see __construct()
+        * @param array $list Array of servers to connect to
+        */
+       public function set_servers( $list ) {
+               $this->_servers = $list;
+               $this->_active = count( $list );
+               $this->_buckets = null;
+               $this->_bucketcount = 0;
+
+               $this->_single_sock = null;
+               if ( $this->_active == 1 ) {
+                       $this->_single_sock = $this->_servers[0];
+               }
+       }
+
+       /**
+        * Sets the timeout for new connections
+        *
+        * @param int $seconds Number of seconds
+        * @param int $microseconds Number of microseconds
+        */
+       public function set_timeout( $seconds, $microseconds ) {
+               $this->_timeout_seconds = $seconds;
+               $this->_timeout_microseconds = $microseconds;
+       }
+
+       // }}}
+       // }}}
+       // {{{ private methods
+       // {{{ _close_sock()
+
+       /**
+        * Close the specified socket
+        *
+        * @param string $sock Socket to close
+        *
+        * @access private
+        */
+       function _close_sock( $sock ) {
+               $host = array_search( $sock, $this->_cache_sock );
+               fclose( $this->_cache_sock[$host] );
+               unset( $this->_cache_sock[$host] );
+       }
+
+       // }}}
+       // {{{ _connect_sock()
+
+       /**
+        * Connects $sock to $host, timing out after $timeout
+        *
+        * @param int $sock Socket to connect
+        * @param string $host Host:IP to connect to
+        *
+        * @return bool
+        * @access private
+        */
+       function _connect_sock( &$sock, $host ) {
+               list( $ip, $port ) = preg_split( '/:(?=\d)/', $host );
+               $sock = false;
+               $timeout = $this->_connect_timeout;
+               $errno = $errstr = null;
+               for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
+                       MediaWiki\suppressWarnings();
+                       if ( $this->_persistent == 1 ) {
+                               $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
+                       } else {
+                               $sock = fsockopen( $ip, $port, $errno, $errstr, $timeout );
+                       }
+                       MediaWiki\restoreWarnings();
+               }
+               if ( !$sock ) {
+                       $this->_error_log( "Error connecting to $host: $errstr\n" );
+                       $this->_dead_host( $host );
+                       return false;
+               }
+
+               // Initialise timeout
+               stream_set_timeout( $sock, $this->_timeout_seconds, $this->_timeout_microseconds );
+
+               // If the connection was persistent, flush the read buffer in case there
+               // was a previous incomplete request on this connection
+               if ( $this->_persistent ) {
+                       $this->_flush_read_buffer( $sock );
+               }
+               return true;
+       }
+
+       // }}}
+       // {{{ _dead_sock()
+
+       /**
+        * Marks a host as dead until 30-40 seconds in the future
+        *
+        * @param string $sock Socket to mark as dead
+        *
+        * @access private
+        */
+       function _dead_sock( $sock ) {
+               $host = array_search( $sock, $this->_cache_sock );
+               $this->_dead_host( $host );
+       }
+
+       /**
+        * @param string $host
+        */
+       function _dead_host( $host ) {
+               $parts = explode( ':', $host );
+               $ip = $parts[0];
+               $this->_host_dead[$ip] = time() + 30 + intval( rand( 0, 10 ) );
+               $this->_host_dead[$host] = $this->_host_dead[$ip];
+               unset( $this->_cache_sock[$host] );
+       }
+
+       // }}}
+       // {{{ get_sock()
+
+       /**
+        * get_sock
+        *
+        * @param string $key Key to retrieve value for;
+        *
+        * @return Resource|bool Resource on success, false on failure
+        * @access private
+        */
+       function get_sock( $key ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               if ( $this->_single_sock !== null ) {
+                       return $this->sock_to_host( $this->_single_sock );
+               }
+
+               $hv = is_array( $key ) ? intval( $key[0] ) : $this->_hashfunc( $key );
+               if ( $this->_buckets === null ) {
+                       $bu = array();
+                       foreach ( $this->_servers as $v ) {
+                               if ( is_array( $v ) ) {
+                                       for ( $i = 0; $i < $v[1]; $i++ ) {
+                                               $bu[] = $v[0];
+                                       }
+                               } else {
+                                       $bu[] = $v;
+                               }
+                       }
+                       $this->_buckets = $bu;
+                       $this->_bucketcount = count( $bu );
+               }
+
+               $realkey = is_array( $key ) ? $key[1] : $key;
+               for ( $tries = 0; $tries < 20; $tries++ ) {
+                       $host = $this->_buckets[$hv % $this->_bucketcount];
+                       $sock = $this->sock_to_host( $host );
+                       if ( is_resource( $sock ) ) {
+                               return $sock;
+                       }
+                       $hv = $this->_hashfunc( $hv . $realkey );
+               }
+
+               return false;
+       }
+
+       // }}}
+       // {{{ _hashfunc()
+
+       /**
+        * Creates a hash integer based on the $key
+        *
+        * @param string $key Key to hash
+        *
+        * @return int Hash value
+        * @access private
+        */
+       function _hashfunc( $key ) {
+               # 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;
+       }
+
+       // }}}
+       // {{{ _incrdecr()
+
+       /**
+        * Perform increment/decriment on $key
+        *
+        * @param string $cmd Command to perform
+        * @param string|array $key Key to perform it on
+        * @param int $amt Amount to adjust
+        *
+        * @return int New value of $key
+        * @access private
+        */
+       function _incrdecr( $cmd, $key, $amt = 1 ) {
+               if ( !$this->_active ) {
+                       return null;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return null;
+               }
+
+               $key = is_array( $key ) ? $key[1] : $key;
+               if ( isset( $this->stats[$cmd] ) ) {
+                       $this->stats[$cmd]++;
+               } else {
+                       $this->stats[$cmd] = 1;
+               }
+               if ( !$this->_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
+                       return null;
+               }
+
+               $line = $this->_fgets( $sock );
+               $match = array();
+               if ( !preg_match( '/^(\d+)/', $line, $match ) ) {
+                       return null;
+               }
+               return $match[1];
+       }
+
+       // }}}
+       // {{{ _load_items()
+
+       /**
+        * Load items into $ret from $sock
+        *
+        * @param Resource $sock Socket to read from
+        * @param array $ret returned values
+        * @param float $casToken [optional]
+        * @return bool True for success, false for failure
+        *
+        * @access private
+        */
+       function _load_items( $sock, &$ret, &$casToken = null ) {
+               $results = array();
+
+               while ( 1 ) {
+                       $decl = $this->_fgets( $sock );
+
+                       if ( $decl === false ) {
+                               /*
+                                * If nothing can be read, something is wrong because we know exactly when
+                                * to stop reading (right after "END") and we return right after that.
+                                */
+                               return false;
+                       } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
+                               /*
+                                * Read all data returned. This can be either one or multiple values.
+                                * Save all that data (in an array) to be processed later: we'll first
+                                * want to continue reading until "END" before doing anything else,
+                                * to make sure that we don't leave our client in a state where it's
+                                * output is not yet fully read.
+                                */
+                               $results[] = array(
+                                       $match[1], // rkey
+                                       $match[2], // flags
+                                       $match[3], // len
+                                       $match[4], // casToken
+                                       $this->_fread( $sock, $match[3] + 2 ), // data
+                               );
+                       } elseif ( $decl == "END" ) {
+                               if ( count( $results ) == 0 ) {
+                                       return false;
+                               }
+
+                               /**
+                                * All data has been read, time to process the data and build
+                                * meaningful return values.
+                                */
+                               foreach ( $results as $vars ) {
+                                       list( $rkey, $flags, $len, $casToken, $data ) = $vars;
+
+                                       if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
+                                               $this->_handle_error( $sock,
+                                                       'line ending missing from data block from $1' );
+                                               return false;
+                                       }
+                                       $data = substr( $data, 0, -2 );
+                                       $ret[$rkey] = $data;
+
+                                       if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
+                                               $ret[$rkey] = gzuncompress( $ret[$rkey] );
+                                       }
+
+                                       /*
+                                        * This unserialize is the exact reason that we only want to
+                                        * process data after having read until "END" (instead of doing
+                                        * this right away): "unserialize" can trigger outside code:
+                                        * in the event that $ret[$rkey] is a serialized object,
+                                        * unserializing it will trigger __wakeup() if present. If that
+                                        * function attempted to read from memcached (while we did not
+                                        * yet read "END"), these 2 calls would collide.
+                                        */
+                                       if ( $flags & self::SERIALIZED ) {
+                                               $ret[$rkey] = unserialize( $ret[$rkey] );
+                                       } elseif ( $flags & self::INTVAL ) {
+                                               $ret[$rkey] = intval( $ret[$rkey] );
+                                       }
+                               }
+
+                               return true;
+                       } else {
+                               $this->_handle_error( $sock, 'Error parsing response from $1' );
+                               return false;
+                       }
+               }
+       }
+
+       // }}}
+       // {{{ _set()
+
+       /**
+        * Performs the requested storage operation to the memcache server
+        *
+        * @param string $cmd Command to perform
+        * @param string $key Key to act on
+        * @param mixed $val What we need to store
+        * @param int $exp (optional) Expiration time. This can be a number of seconds
+        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
+        * longer must be the timestamp of the time at which the mapping should expire. It
+        * is safe to use timestamps in all cases, regardless of exipration
+        * eg: strtotime("+3 hour")
+        * @param float $casToken [optional]
+        *
+        * @return bool
+        * @access private
+        */
+       function _set( $cmd, $key, $val, $exp, $casToken = null ) {
+               if ( !$this->_active ) {
+                       return false;
+               }
+
+               $sock = $this->get_sock( $key );
+               if ( !is_resource( $sock ) ) {
+                       return false;
+               }
+
+               if ( isset( $this->stats[$cmd] ) ) {
+                       $this->stats[$cmd]++;
+               } else {
+                       $this->stats[$cmd] = 1;
+               }
+
+               $flags = 0;
+
+               if ( is_int( $val ) ) {
+                       $flags |= self::INTVAL;
+               } elseif ( !is_scalar( $val ) ) {
+                       $val = serialize( $val );
+                       $flags |= self::SERIALIZED;
+                       if ( $this->_debug ) {
+                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar\n" ) );
+                       }
+               }
+
+               $len = strlen( $val );
+
+               if ( $this->_have_zlib && $this->_compress_enable
+                       && $this->_compress_threshold && $len >= $this->_compress_threshold
+               ) {
+                       $c_val = gzcompress( $val, 9 );
+                       $c_len = strlen( $c_val );
+
+                       if ( $c_len < $len * ( 1 - self::COMPRESSION_SAVINGS ) ) {
+                               if ( $this->_debug ) {
+                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes\n", $len, $c_len ) );
+                               }
+                               $val = $c_val;
+                               $len = $c_len;
+                               $flags |= self::COMPRESSED;
+                       }
+               }
+
+               $command = "$cmd $key $flags $exp $len";
+               if ( $casToken ) {
+                       $command .= " $casToken";
+               }
+
+               if ( !$this->_fwrite( $sock, "$command\r\n$val\r\n" ) ) {
+                       return false;
+               }
+
+               $line = $this->_fgets( $sock );
+
+               if ( $this->_debug ) {
+                       $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
+               }
+               if ( $line == "STORED" ) {
+                       return true;
+               }
+               return false;
+       }
+
+       // }}}
+       // {{{ sock_to_host()
+
+       /**
+        * Returns the socket for the host
+        *
+        * @param string $host Host:IP to get socket for
+        *
+        * @return Resource|bool IO Stream or false
+        * @access private
+        */
+       function sock_to_host( $host ) {
+               if ( isset( $this->_cache_sock[$host] ) ) {
+                       return $this->_cache_sock[$host];
+               }
+
+               $sock = null;
+               $now = time();
+               list( $ip, /* $port */) = explode( ':', $host );
+               if ( isset( $this->_host_dead[$host] ) && $this->_host_dead[$host] > $now ||
+                       isset( $this->_host_dead[$ip] ) && $this->_host_dead[$ip] > $now
+               ) {
+                       return null;
+               }
+
+               if ( !$this->_connect_sock( $sock, $host ) ) {
+                       return null;
+               }
+
+               // Do not buffer writes
+               stream_set_write_buffer( $sock, 0 );
+
+               $this->_cache_sock[$host] = $sock;
+
+               return $this->_cache_sock[$host];
+       }
+
+       /**
+        * @param string $text
+        */
+       function _debugprint( $text ) {
+               $this->_logger->debug( $text );
+       }
+
+       /**
+        * @param string $text
+        */
+       function _error_log( $text ) {
+               $this->_logger->error( "Memcached error: $text" );
+       }
+
+       /**
+        * Write to a stream. If there is an error, mark the socket dead.
+        *
+        * @param Resource $sock The socket
+        * @param string $buf The string to write
+        * @return bool True on success, false on failure
+        */
+       function _fwrite( $sock, $buf ) {
+               $bytesWritten = 0;
+               $bufSize = strlen( $buf );
+               while ( $bytesWritten < $bufSize ) {
+                       $result = fwrite( $sock, $buf );
+                       $data = stream_get_meta_data( $sock );
+                       if ( $data['timed_out'] ) {
+                               $this->_handle_error( $sock, 'timeout writing to $1' );
+                               return false;
+                       }
+                       // Contrary to the documentation, fwrite() returns zero on error in PHP 5.3.
+                       if ( $result === false || $result === 0 ) {
+                               $this->_handle_error( $sock, 'error writing to $1' );
+                               return false;
+                       }
+                       $bytesWritten += $result;
+               }
+
+               return true;
+       }
+
+       /**
+        * Handle an I/O error. Mark the socket dead and log an error.
+        *
+        * @param Resource $sock
+        * @param string $msg
+        */
+       function _handle_error( $sock, $msg ) {
+               $peer = stream_socket_get_name( $sock, true /** remote **/ );
+               if ( strval( $peer ) === '' ) {
+                       $peer = array_search( $sock, $this->_cache_sock );
+                       if ( $peer === false ) {
+                               $peer = '[unknown host]';
+                       }
+               }
+               $msg = str_replace( '$1', $peer, $msg );
+               $this->_error_log( "$msg\n" );
+               $this->_dead_sock( $sock );
+       }
+
+       /**
+        * Read the specified number of bytes from a stream. If there is an error,
+        * mark the socket dead.
+        *
+        * @param Resource $sock The socket
+        * @param int $len The number of bytes to read
+        * @return string|bool The string on success, false on failure.
+        */
+       function _fread( $sock, $len ) {
+               $buf = '';
+               while ( $len > 0 ) {
+                       $result = fread( $sock, $len );
+                       $data = stream_get_meta_data( $sock );
+                       if ( $data['timed_out'] ) {
+                               $this->_handle_error( $sock, 'timeout reading from $1' );
+                               return false;
+                       }
+                       if ( $result === false ) {
+                               $this->_handle_error( $sock, 'error reading buffer from $1' );
+                               return false;
+                       }
+                       if ( $result === '' ) {
+                               // This will happen if the remote end of the socket is shut down
+                               $this->_handle_error( $sock, 'unexpected end of file reading from $1' );
+                               return false;
+                       }
+                       $len -= strlen( $result );
+                       $buf .= $result;
+               }
+               return $buf;
+       }
+
+       /**
+        * Read a line from a stream. If there is an error, mark the socket dead.
+        * The \r\n line ending is stripped from the response.
+        *
+        * @param Resource $sock The socket
+        * @return string|bool The string on success, false on failure
+        */
+       function _fgets( $sock ) {
+               $result = fgets( $sock );
+               // fgets() may return a partial line if there is a select timeout after
+               // a successful recv(), so we have to check for a timeout even if we
+               // got a string response.
+               $data = stream_get_meta_data( $sock );
+               if ( $data['timed_out'] ) {
+                       $this->_handle_error( $sock, 'timeout reading line from $1' );
+                       return false;
+               }
+               if ( $result === false ) {
+                       $this->_handle_error( $sock, 'error reading line from $1' );
+                       return false;
+               }
+               if ( substr( $result, -2 ) === "\r\n" ) {
+                       $result = substr( $result, 0, -2 );
+               } elseif ( substr( $result, -1 ) === "\n" ) {
+                       $result = substr( $result, 0, -1 );
+               } else {
+                       $this->_handle_error( $sock, 'line ending missing in response from $1' );
+                       return false;
+               }
+               return $result;
+       }
+
+       /**
+        * Flush the read buffer of a stream
+        * @param Resource $f
+        */
+       function _flush_read_buffer( $f ) {
+               if ( !is_resource( $f ) ) {
+                       return;
+               }
+               $r = array( $f );
+               $w = null;
+               $e = null;
+               $n = stream_select( $r, $w, $e, 0, 0 );
+               while ( $n == 1 && !feof( $f ) ) {
+                       fread( $f, 1024 );
+                       $r = array( $f );
+                       $w = null;
+                       $e = null;
+                       $n = stream_select( $r, $w, $e, 0, 0 );
+               }
+       }
+
+       // }}}
+       // }}}
+       // }}}
+}
+
+// }}}
diff --git a/includes/libs/objectcache/MemcachedPhpBagOStuff.php b/includes/libs/objectcache/MemcachedPhpBagOStuff.php
new file mode 100644 (file)
index 0000000..e2d9d93
--- /dev/null
@@ -0,0 +1,73 @@
+<?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 MemcachedBagOStuff {
+       /**
+        * Available parameters are:
+        *   - servers:             The list of IP:port combinations holding the memcached servers.
+        *   - debug:               Whether to set the debug flag in the underlying client.
+        *   - 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
+        *
+        * @param array $params
+        */
+       function __construct( $params ) {
+               parent::__construct( $params );
+               $params = $this->applyDefaultParams( $params );
+
+               $this->client = new MemcachedClient( $params );
+               $this->client->set_servers( $params['servers'] );
+               $this->client->set_debug( $params['debug'] );
+       }
+
+       public function setDebug( $debug ) {
+               $this->client->set_debug( $debug );
+       }
+
+       public function getMulti( array $keys, $flags = 0 ) {
+               foreach ( $keys as $key ) {
+                       $this->validateKeyEncoding( $key );
+               }
+
+               return $this->client->get_multi( $keys );
+       }
+
+       public function incr( $key, $value = 1 ) {
+               $this->validateKeyEncoding( $key );
+
+               return $this->client->incr( $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               $this->validateKeyEncoding( $key );
+
+               return $this->client->decr( $key, $value );
+       }
+}
diff --git a/includes/libs/objectcache/MultiWriteBagOStuff.php b/includes/libs/objectcache/MultiWriteBagOStuff.php
new file mode 100644 (file)
index 0000000..73bdabd
--- /dev/null
@@ -0,0 +1,235 @@
+<?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 BagOStuff[] */
+       protected $caches;
+       /** @var bool Use async secondary writes */
+       protected $asyncWrites = false;
+       /** @var callback|null */
+       protected $asyncHandler;
+
+       /** Idiom for "write to all backends" */
+       const ALL = INF;
+
+       const UPGRADE_TTL = 3600; // TTL when a key is copied to a higher cache tier
+
+       /**
+        * $params include:
+        *   - caches: A numbered array of either ObjectFactory::getObjectFromSpec
+        *      arrays yeilding BagOStuff objects or direct BagOStuff objects.
+        *      If using the former, the 'args' field *must* be set.
+        *      The first cache is the primary one, being the first to
+        *      be read in the fallback chain. Writes happen to all stores
+        *      in the order they are defined. However, lock()/unlock() calls
+        *      only use the primary store.
+        *   - replication: Either 'sync' or 'async'. This controls whether writes
+        *      to secondary stores are deferred when possible. Async writes
+        *      require setting 'asyncCallback'. HHVM register_postsend_function() function.
+        *      Async writes can increase the chance of some race conditions
+        *      or cause keys to expire seconds later than expected. It is
+        *      safe to use for modules when cached values: are immutable,
+        *      invalidation uses logical TTLs, invalidation uses etag/timestamp
+        *      validation against the DB, or merge() is used to handle races.
+        *   - asyncHandler: callable that takes a callback and runs it after the
+        *      current web request ends. In CLI mode, it should run it immediately.
+        * @param array $params
+        * @throws InvalidArgumentException
+        */
+       public function __construct( $params ) {
+               parent::__construct( $params );
+
+               if ( empty( $params['caches'] ) || !is_array( $params['caches'] ) ) {
+                       throw new InvalidArgumentException(
+                               __METHOD__ . ': "caches" parameter must be an array of caches'
+                       );
+               }
+
+               $this->caches = array();
+               foreach ( $params['caches'] as $cacheInfo ) {
+                       if ( $cacheInfo instanceof BagOStuff ) {
+                               $this->caches[] = $cacheInfo;
+                       } else {
+                               if ( !isset( $cacheInfo['args'] ) ) {
+                                       // B/C for when $cacheInfo was for ObjectCache::newFromParams().
+                                       // Callers intenting this to be for ObjectFactory::getObjectFromSpec
+                                       // should have set "args" per the docs above. Doings so avoids extra
+                                       // (likely harmless) params (factory/class/calls) ending up in "args".
+                                       $cacheInfo['args'] = array( $cacheInfo );
+                               }
+                               $this->caches[] = ObjectFactory::getObjectFromSpec( $cacheInfo );
+                       }
+               }
+
+               $this->asyncHandler = isset( $params['asyncHandler'] )
+                       ? $params['asyncHandler']
+                       : null;
+               $this->asyncWrites = (
+                       isset( $params['replication'] ) &&
+                       $params['replication'] === 'async' &&
+                       is_callable( $this->asyncHandler )
+               );
+       }
+
+       public function setDebug( $debug ) {
+               foreach ( $this->caches as $cache ) {
+                       $cache->setDebug( $debug );
+               }
+       }
+
+       protected function doGet( $key, $flags = 0 ) {
+               if ( ( $flags & self::READ_LATEST ) == self::READ_LATEST ) {
+                       // If the latest write was a delete(), we do NOT want to fallback
+                       // to the other tiers and possibly see the old value. Also, this
+                       // is used by mergeViaLock(), which only needs to hit the primary.
+                       return $this->caches[0]->get( $key, $flags );
+               }
+
+               $misses = 0; // number backends checked
+               $value = false;
+               foreach ( $this->caches as $cache ) {
+                       $value = $cache->get( $key, $flags );
+                       if ( $value !== false ) {
+                               break;
+                       }
+                       ++$misses;
+               }
+
+               if ( $value !== false
+                       && $misses > 0
+                       && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
+               ) {
+                       $this->doWrite( $misses, $this->asyncWrites, 'set', $key, $value, self::UPGRADE_TTL );
+               }
+
+               return $value;
+       }
+
+       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
+               $asyncWrites = ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC )
+                       ? false
+                       : $this->asyncWrites;
+
+               return $this->doWrite( self::ALL, $asyncWrites, 'set', $key, $value, $exptime );
+       }
+
+       public function delete( $key ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'delete', $key );
+       }
+
+       public function add( $key, $value, $exptime = 0 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'add', $key, $value, $exptime );
+       }
+
+       public function incr( $key, $value = 1 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'incr', $key, $value );
+       }
+
+       public function decr( $key, $value = 1 ) {
+               return $this->doWrite( self::ALL, $this->asyncWrites, 'decr', $key, $value );
+       }
+
+       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
+               // Only need to lock the first cache; also avoids deadlocks
+               return $this->caches[0]->lock( $key, $timeout, $expiry, $rclass );
+       }
+
+       public function unlock( $key ) {
+               // Only the first cache is locked
+               return $this->caches[0]->unlock( $key );
+       }
+
+       public function getLastError() {
+               return $this->caches[0]->getLastError();
+       }
+
+       public function clearLastError() {
+               $this->caches[0]->clearLastError();
+       }
+
+       /**
+        * Apply a write method to the first $count backing caches
+        *
+        * @param integer $count
+        * @param bool $asyncWrites
+        * @param string $method
+        * @param mixed ...
+        * @return bool
+        */
+       protected function doWrite( $count, $asyncWrites, $method /*, ... */ ) {
+               $ret = true;
+               $args = array_slice( func_get_args(), 3 );
+
+               foreach ( $this->caches as $i => $cache ) {
+                       if ( $i >= $count ) {
+                               break; // ignore the lower tiers
+                       }
+
+                       if ( $i == 0 || !$asyncWrites ) {
+                               // First store or in sync mode: write now and get result
+                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
+                                       $ret = false;
+                               }
+                       } else {
+                               // Secondary write in async mode: do not block this HTTP request
+                               $logger = $this->logger;
+                               call_user_func(
+                                       $this->asyncHandler,
+                                       function () use ( $cache, $method, $args, $logger ) {
+                                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
+                                                       $logger->warning( "Async $method op failed" );
+                                               }
+                                       }
+                               );
+                       }
+               }
+
+               return $ret;
+       }
+
+       /**
+        * Delete objects expiring before a certain date.
+        *
+        * Succeed if any of the child caches succeed.
+        * @param string $date
+        * @param bool|callable $progressCallback
+        * @return bool
+        */
+       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
+               $ret = false;
+               foreach ( $this->caches as $cache ) {
+                       if ( $cache->deleteObjectsExpiringBefore( $date, $progressCallback ) ) {
+                               $ret = true;
+                       }
+               }
+
+               return $ret;
+       }
+}
index 39eb792..01f8ccc 100644 (file)
  * @author Aaron Schulz
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 /**
  * Multi-datacenter aware caching interface
  *
@@ -60,7 +64,7 @@
  * @ingroup Cache
  * @since 1.26
  */
-class WANObjectCache {
+class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /** @var BagOStuff The local datacenter cache */
        protected $cache;
        /** @var HashBagOStuff Script instance PHP cache */
@@ -69,36 +73,39 @@ class WANObjectCache {
        protected $pool;
        /** @var EventRelayer Bus that handles purge broadcasts */
        protected $relayer;
+       /** @var LoggerInterface */
+       protected $logger;
 
        /** @var int ERR_* constant for the "last error" registry */
        protected $lastRelayError = self::ERR_NONE;
 
        /** Max time expected to pass between delete() and DB commit finishing */
        const MAX_COMMIT_DELAY = 3;
-       /** Max replication lag before applying TTL_LAGGED to set() */
-       const MAX_REPLICA_LAG = 5;
-       /** Max time since snapshot transaction start to avoid no-op of set() */
-       const MAX_SNAPSHOT_LAG = 5;
+       /** Max replication+snapshot lag before applying TTL_LAGGED or disallowing set() */
+       const MAX_READ_LAG = 7;
        /** Seconds to tombstone keys on delete() */
-       const HOLDOFF_TTL = 14; // MAX_COMMIT_DELAY + MAX_REPLICA_LAG + MAX_SNAPSHOT_LAG + 1
+       const HOLDOFF_TTL = 11; // MAX_COMMIT_DELAY + MAX_READ_LAG + 1
 
        /** Seconds to keep dependency purge keys around */
-       const CHECK_KEY_TTL = 31536000; // 1 year
+       const CHECK_KEY_TTL = self::TTL_YEAR;
        /** Seconds to keep lock keys around */
-       const LOCK_TTL = 5;
+       const LOCK_TTL = 10;
        /** Default remaining TTL at which to consider pre-emptive regeneration */
        const LOW_TTL = 30;
        /** Default time-since-expiry on a miss that makes a key "hot" */
        const LOCK_TSE = 1;
 
-       /** Idiom for set()/getWithSetCallback() TTL being "forever" */
-       const TTL_INDEFINITE = 0;
        /** Idiom for getWithSetCallback() callbacks to avoid calling set() */
        const TTL_UNCACHEABLE = -1;
        /** Idiom for getWithSetCallback() callbacks to 'lockTSE' logic */
        const TSE_NONE = -1;
        /** Max TTL to store keys when a data sourced is lagged */
        const TTL_LAGGED = 30;
+       /** Idiom for delete() for "no hold-off" */
+       const HOLDOFF_NONE = 0;
+
+       /** Tiny negative float to use when CTL comes up >= 0 due to clock skew */
+       const TINY_NEGATIVE = -0.000001;
 
        /** Cache format version number */
        const VERSION = 1;
@@ -107,6 +114,11 @@ class WANObjectCache {
        const FLD_VALUE = 1;
        const FLD_TTL = 2;
        const FLD_TIME = 3;
+       const FLD_FLAGS = 4;
+       const FLD_HOLDOFF = 5;
+
+       /** @var integer Treat this value as expired-on-arrival */
+       const FLG_STALE = 1;
 
        const ERR_NONE = 0; // no error
        const ERR_NO_RESPONSE = 1; // no response
@@ -120,17 +132,25 @@ class WANObjectCache {
 
        const PURGE_VAL_PREFIX = 'PURGED:';
 
+       const MAX_PC_KEYS = 1000; // max keys to keep in process cache
+
        /**
         * @param array $params
         *   - cache   : BagOStuff object
         *   - pool    : pool name
         *   - relayer : EventRelayer object
+        *   - logger  : LoggerInterface object
         */
        public function __construct( array $params ) {
                $this->cache = $params['cache'];
                $this->pool = $params['pool'];
                $this->relayer = $params['relayer'];
-               $this->procCache = new HashBagOStuff();
+               $this->procCache = new HashBagOStuff( array( 'maxKeys' => self::MAX_PC_KEYS ) );
+               $this->setLogger( isset( $params['logger'] ) ? $params['logger'] : new NullLogger() );
+       }
+
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
        }
 
        /**
@@ -149,11 +169,11 @@ class WANObjectCache {
        /**
         * Fetch the value of a key from cache
         *
-        * If passed in, $curTTL is set to the remaining TTL (current time left):
-        *   - a) INF; if the key exists, has no TTL, and is not expired by $checkKeys
-        *   - b) float (>=0); if the key exists, has a TTL, and is not expired by $checkKeys
-        *   - c) float (<0); if the key is tombstoned or existing but expired by $checkKeys
-        *   - d) null; if the key does not exist and is not tombstoned
+        * If supplied, $curTTL is set to the remaining TTL (current time left):
+        *   - a) INF; if $key exists, has no TTL, and is not expired by $checkKeys
+        *   - b) float (>=0); if $key exists, has a TTL, and is not expired by $checkKeys
+        *   - c) float (<0); if $key is tombstoned, stale, or existing but expired by $checkKeys
+        *   - d) null; if $key does not exist and is not tombstoned
         *
         * If a key is tombstoned, $curTTL will reflect the time since delete().
         *
@@ -200,7 +220,8 @@ class WANObjectCache {
         *
         * @param array $keys List of cache keys
         * @param array $curTTLs Map of (key => approximate TTL left) for existing keys [returned]
-        * @param array $checkKeys List of "check" keys to apply to all of $keys
+        * @param array $checkKeys List of check keys to apply to all $keys. May also apply "check"
+        *  keys to specific cache keys only by using cache keys as keys in the $checkKeys array.
         * @return array Map of (key => value) for keys that exist
         */
        final public function getMulti(
@@ -211,26 +232,34 @@ class WANObjectCache {
 
                $vPrefixLen = strlen( self::VALUE_KEY_PREFIX );
                $valueKeys = self::prefixCacheKeys( $keys, self::VALUE_KEY_PREFIX );
-               $checkKeys = self::prefixCacheKeys( $checkKeys, self::TIME_KEY_PREFIX );
+
+               $checkKeysForAll = array();
+               $checkKeysByKey = array();
+               $checkKeysFlat = array();
+               foreach ( $checkKeys as $i => $keys ) {
+                       $prefixed = self::prefixCacheKeys( (array)$keys, self::TIME_KEY_PREFIX );
+                       $checkKeysFlat = array_merge( $checkKeysFlat, $prefixed );
+                       // Is this check keys for a specific cache key, or for all keys being fetched?
+                       if ( is_int( $i ) ) {
+                               $checkKeysForAll = array_merge( $checkKeysForAll, $prefixed );
+                       } else {
+                               $checkKeysByKey[$i] = isset( $checkKeysByKey[$i] )
+                                       ? array_merge( $checkKeysByKey[$i], $prefixed )
+                                       : $prefixed;
+                       }
+               }
 
                // Fetch all of the raw values
-               $wrappedValues = $this->cache->getMulti( array_merge( $valueKeys, $checkKeys ) );
+               $wrappedValues = $this->cache->getMulti( array_merge( $valueKeys, $checkKeysFlat ) );
+               // Time used to compare/init "check" keys (derived after getMulti() to be pessimistic)
                $now = microtime( true );
 
-               // Get/initialize the timestamp of all the "check" keys
-               $checkKeyTimes = array();
-               foreach ( $checkKeys as $checkKey ) {
-                       $timestamp = isset( $wrappedValues[$checkKey] )
-                               ? self::parsePurgeValue( $wrappedValues[$checkKey] )
-                               : false;
-                       if ( !is_float( $timestamp ) ) {
-                               // Key is not set or invalid; regenerate
-                               $this->cache->add( $checkKey,
-                                       self::PURGE_VAL_PREFIX . $now, self::CHECK_KEY_TTL );
-                               $timestamp = $now;
-                       }
-
-                       $checkKeyTimes[] = $timestamp;
+               // Collect timestamps from all "check" keys
+               $purgeValuesForAll = $this->processCheckKeys( $checkKeysForAll, $wrappedValues, $now );
+               $purgeValuesByKey = array();
+               foreach ( $checkKeysByKey as $cacheKey => $checks ) {
+                       $purgeValuesByKey[$cacheKey] =
+                               $this->processCheckKeys( $checks, $wrappedValues, $now );
                }
 
                // Get the main cache value for each key and validate them
@@ -244,22 +273,53 @@ class WANObjectCache {
                        list( $value, $curTTL ) = $this->unwrap( $wrappedValues[$vKey], $now );
                        if ( $value !== false ) {
                                $result[$key] = $value;
-                               foreach ( $checkKeyTimes as $checkKeyTime ) {
-                                       // Force dependant keys to be invalid for a while after purging
-                                       // to reduce race conditions involving stale data getting cached
-                                       $safeTimestamp = $checkKeyTime + self::HOLDOFF_TTL;
+
+                               // Force dependant keys to be invalid for a while after purging
+                               // to reduce race conditions involving stale data getting cached
+                               $purgeValues = $purgeValuesForAll;
+                               if ( isset( $purgeValuesByKey[$key] ) ) {
+                                       $purgeValues = array_merge( $purgeValues, $purgeValuesByKey[$key] );
+                               }
+                               foreach ( $purgeValues as $purge ) {
+                                       $safeTimestamp = $purge[self::FLD_TIME] + $purge[self::FLD_HOLDOFF];
                                        if ( $safeTimestamp >= $wrappedValues[$vKey][self::FLD_TIME] ) {
-                                               $curTTL = min( $curTTL, $checkKeyTime - $now );
+                                               // How long ago this value was expired by *this* check key
+                                               $ago = min( $purge[self::FLD_TIME] - $now, self::TINY_NEGATIVE );
+                                               // How long ago this value was expired by *any* known check key
+                                               $curTTL = min( $curTTL, $ago );
                                        }
                                }
                        }
-
                        $curTTLs[$key] = $curTTL;
                }
 
                return $result;
        }
 
+       /**
+        * @since 1.27
+        * @param array $timeKeys List of prefixed time check keys
+        * @param array $wrappedValues
+        * @param float $now
+        * @return array List of purge value arrays
+        */
+       private function processCheckKeys( array $timeKeys, array $wrappedValues, $now ) {
+               $purgeValues = array();
+               foreach ( $timeKeys as $timeKey ) {
+                       $purge = isset( $wrappedValues[$timeKey] )
+                               ? self::parsePurgeValue( $wrappedValues[$timeKey] )
+                               : false;
+                       if ( $purge === false ) {
+                               // Key is not set or invalid; regenerate
+                               $newVal = $this->makePurgeValue( $now, self::HOLDOFF_TTL );
+                               $this->cache->add( $timeKey, $newVal, self::CHECK_KEY_TTL );
+                               $purge = self::parsePurgeValue( $newVal );
+                       }
+                       $purgeValues[] = $purge;
+               }
+               return $purgeValues;
+       }
+
        /**
         * Set the value of a key in cache
         *
@@ -284,7 +344,7 @@ class WANObjectCache {
         *     // Fetch the row from the DB
         *     $row = $dbr->selectRow( ... );
         *     $key = $cache->makeKey( 'building', $buildingId );
-        *     $cache->set( $key, $row, 86400, $setOpts );
+        *     $cache->set( $key, $row, $cache::TTL_DAY, $setOpts );
         * @endcode
         *
         * @param string $key Cache key
@@ -300,10 +360,13 @@ class WANObjectCache {
         *               the current time the data was read or (if applicable) the time when
         *               the snapshot-isolated transaction the data was read from started.
         *               Default: 0 seconds
-        *   - lockTSE : if excessive possible snapshot lag is detected,
-        *               then stash the value into a temporary location
-        *               with this TTL. This is only useful if the reads
-        *               use getWithSetCallback() with "lockTSE" set.
+        *   - pending : Whether this data is possibly from an uncommitted write transaction.
+        *               Generally, other threads should not see values from the future and
+        *               they certainly should not see ones that ended up getting rolled back.
+        *               Default: false
+        *   - lockTSE : if excessive replication/snapshot lag is detected, then store the value
+        *               with this TTL and flag it as stale. This is only useful if the reads for
+        *               this key use getWithSetCallback() with "lockTSE" set.
         *               Default: WANObjectCache::TSE_NONE
         * @return bool Success
         */
@@ -312,21 +375,39 @@ class WANObjectCache {
                $age = isset( $opts['since'] ) ? max( 0, microtime( true ) - $opts['since'] ) : 0;
                $lag = isset( $opts['lag'] ) ? $opts['lag'] : 0;
 
-               if ( $lag > self::MAX_REPLICA_LAG ) {
-                       // Too much lag detected; lower TTL so it converges faster
-                       $ttl = $ttl ? min( $ttl, self::TTL_LAGGED ) : self::TTL_LAGGED;
+               // Do not cache potentially uncommitted data as it might get rolled back
+               if ( !empty( $opts['pending'] ) ) {
+                       $this->logger->info( "Rejected set() for $key due to pending writes." );
+
+                       return true; // no-op the write for being unsafe
                }
 
-               if ( $age > self::MAX_SNAPSHOT_LAG ) {
+               $wrapExtra = array(); // additional wrapped value fields
+               // Check if there's a risk of writing stale data after the purge tombstone expired
+               if ( $lag === false || ( $lag + $age ) > self::MAX_READ_LAG ) {
+                       // Case A: read lag with "lockTSE"; save but record value as stale
                        if ( $lockTSE >= 0 ) {
-                               $tempTTL = max( 1, (int)$lockTSE ); // set() expects seconds
-                               $this->cache->set( self::STASH_KEY_PREFIX . $key, $value, $tempTTL );
-                       }
+                               $ttl = max( 1, (int)$lockTSE ); // set() expects seconds
+                               $wrapExtra[self::FLD_FLAGS] = self::FLG_STALE; // mark as stale
+                       // Case B: any long-running transaction; ignore this set()
+                       } elseif ( $age > self::MAX_READ_LAG ) {
+                               $this->logger->warning( "Rejected set() for $key due to snapshot lag." );
+
+                               return true; // no-op the write for being unsafe
+                       // Case C: high replication lag; lower TTL instead of ignoring all set()s
+                       } elseif ( $lag === false || $lag > self::MAX_READ_LAG ) {
+                               $ttl = $ttl ? min( $ttl, self::TTL_LAGGED ) : self::TTL_LAGGED;
+                               $this->logger->warning( "Lowered set() TTL for $key due to replication lag." );
+                       // Case D: medium length request with medium replication lag; ignore this set()
+                       } else {
+                               $this->logger->warning( "Rejected set() for $key due to high read lag." );
 
-                       return true; // no-op the write for being unsafe
+                               return true; // no-op the write for being unsafe
+                       }
                }
 
-               $wrapped = $this->wrap( $value, $ttl );
+               // Wrap that value with time/TTL/version metadata
+               $wrapped = $this->wrap( $value, $ttl ) + $wrapExtra;
 
                $func = function ( $cache, $key, $cWrapped ) use ( $wrapped ) {
                        return ( is_string( $cWrapped ) )
@@ -382,23 +463,37 @@ class WANObjectCache {
         *     $dbw->commit(); // end of request
         * @endcode
         *
-        * If called twice on the same key, then the last hold-off TTL takes
-        * precedence. For idempotence, the $ttl should not vary for different
-        * delete() calls on the same key. Also note that lowering $ttl reduces
-        * the effective range of the 'lockTSE' parameter to getWithSetCallback().
+        * The $ttl parameter can be used when purging values that have not actually changed
+        * recently. For example, a cleanup script to purge cache entries does not really need
+        * a hold-off period, so it can use HOLDOFF_NONE. Likewise for user-requested purge.
+        * Note that $ttl limits the effective range of 'lockTSE' for getWithSetCallback().
+        *
+        * If called twice on the same key, then the last hold-off TTL takes precedence. For
+        * idempotence, the $ttl should not vary for different delete() calls on the same key.
         *
         * @param string $key Cache key
-        * @param integer $ttl How long to block writes to the key [seconds]
+        * @param integer $ttl Tombstone TTL; Default: WANObjectCache::HOLDOFF_TTL
         * @return bool True if the item was purged or not found, false on failure
         */
        final public function delete( $key, $ttl = self::HOLDOFF_TTL ) {
                $key = self::VALUE_KEY_PREFIX . $key;
-               // Avoid indefinite key salting for sanity
-               $ttl = max( $ttl, 1 );
-               // Update the local datacenter immediately
-               $ok = $this->cache->set( $key, self::PURGE_VAL_PREFIX . microtime( true ), $ttl );
-               // Publish the purge to all datacenters
-               return $this->relayPurge( $key, $ttl ) && $ok;
+
+               if ( $ttl <= 0 ) {
+                       // Update the local datacenter immediately
+                       $ok = $this->cache->delete( $key );
+                       // Publish the purge to all datacenters
+                       $ok = $this->relayDelete( $key ) && $ok;
+               } else {
+                       // Update the local datacenter immediately
+                       $ok = $this->cache->set( $key,
+                               $this->makePurgeValue( microtime( true ), self::HOLDOFF_NONE ),
+                               $ttl
+                       );
+                       // Publish the purge to all datacenters
+                       $ok = $this->relayPurge( $key, $ttl, self::HOLDOFF_NONE ) && $ok;
+               }
+
+               return $ok;
        }
 
        /**
@@ -418,17 +513,22 @@ class WANObjectCache {
         * Note that "check" keys won't collide with other regular keys.
         *
         * @param string $key
-        * @return float UNIX timestamp of the key
+        * @return float UNIX timestamp of the check key
         */
        final public function getCheckKeyTime( $key ) {
                $key = self::TIME_KEY_PREFIX . $key;
 
-               $time = self::parsePurgeValue( $this->cache->get( $key ) );
-               if ( $time === false ) {
+               $purge = self::parsePurgeValue( $this->cache->get( $key ) );
+               if ( $purge !== false ) {
+                       $time = $purge[self::FLD_TIME];
+               } else {
                        // Casting assures identical floats for the next getCheckKeyTime() calls
-                       $time = (string)microtime( true );
-                       $this->cache->add( $key, self::PURGE_VAL_PREFIX . $time, self::CHECK_KEY_TTL );
-                       $time = (float)$time;
+                       $now = (string)microtime( true );
+                       $this->cache->add( $key,
+                               $this->makePurgeValue( $now, self::HOLDOFF_TTL ),
+                               self::CHECK_KEY_TTL
+                       );
+                       $time = (float)$now;
                }
 
                return $time;
@@ -462,15 +562,18 @@ class WANObjectCache {
         * @see WANObjectCache::resetCheckKey()
         *
         * @param string $key Cache key
+        * @param int $holdoff HOLDOFF_TTL or HOLDOFF_NONE constant
         * @return bool True if the item was purged or not found, false on failure
         */
-       final public function touchCheckKey( $key ) {
+       final public function touchCheckKey( $key, $holdoff = self::HOLDOFF_TTL ) {
                $key = self::TIME_KEY_PREFIX . $key;
                // Update the local datacenter immediately
                $ok = $this->cache->set( $key,
-                       self::PURGE_VAL_PREFIX . microtime( true ), self::CHECK_KEY_TTL );
+                       $this->makePurgeValue( microtime( true ), $holdoff ),
+                       self::CHECK_KEY_TTL
+               );
                // Publish the purge to all datacenters
-               return $this->relayPurge( $key, self::CHECK_KEY_TTL ) && $ok;
+               return $this->relayPurge( $key, self::CHECK_KEY_TTL, $holdoff ) && $ok;
        }
 
        /**
@@ -538,8 +641,8 @@ class WANObjectCache {
         *     $catInfo = $cache->getWithSetCallback(
         *         // Key to store the cached value under
         *         $cache->makeKey( 'cat-attributes', $catId ),
-        *         // Time-to-live (seconds)
-        *         60,
+        *         // Time-to-live (in seconds)
+        *         $cache::TTL_MINUTE,
         *         // Function that derives the new key value
         *         function ( $oldValue, &$ttl, array &$setOpts ) {
         *             $dbr = wfGetDB( DB_SLAVE );
@@ -556,8 +659,8 @@ class WANObjectCache {
         *     $catConfig = $cache->getWithSetCallback(
         *         // Key to store the cached value under
         *         $cache->makeKey( 'site-cat-config' ),
-        *         // Time-to-live (seconds)
-        *         86400,
+        *         // Time-to-live (in seconds)
+        *         $cache::TTL_DAY,
         *         // Function that derives the new key value
         *         function ( $oldValue, &$ttl, array &$setOpts ) {
         *             $dbr = wfGetDB( DB_SLAVE );
@@ -581,7 +684,7 @@ class WANObjectCache {
         *         // Key to store the cached value under
         *         $cache->makeKey( 'cat-state', $cat->getId() ),
         *         // Time-to-live (seconds)
-        *         900,
+        *         $cache::TTL_HOUR,
         *         // Function that derives the new key value
         *         function ( $oldValue, &$ttl, array &$setOpts ) {
         *             // Determine new value from the DB
@@ -608,7 +711,7 @@ class WANObjectCache {
         *     $lastCatActions = $cache->getWithSetCallback(
         *         // Key to store the cached value under
         *         $cache->makeKey( 'cat-last-actions', 100 ),
-        *         // Time-to-live (seconds)
+        *         // Time-to-live (in seconds)
         *         10,
         *         // Function that derives the new key value
         *         function ( $oldValue, &$ttl, array &$setOpts ) {
@@ -818,17 +921,18 @@ class WANObjectCache {
        /**
         * Do the actual async bus purge of a key
         *
-        * This must set the key to "PURGED:<UNIX timestamp>"
+        * This must set the key to "PURGED:<UNIX timestamp>:<holdoff>"
         *
         * @param string $key Cache key
         * @param integer $ttl How long to keep the tombstone [seconds]
+        * @param integer $holdoff HOLDOFF_* constant controlling how long to ignore sets for this key
         * @return bool Success
         */
-       protected function relayPurge( $key, $ttl ) {
+       protected function relayPurge( $key, $ttl, $holdoff ) {
                $event = $this->cache->modifySimpleRelayEvent( array(
                        'cmd' => 'set',
                        'key' => $key,
-                       'val' => 'PURGED:$UNIXTIME$',
+                       'val' => 'PURGED:$UNIXTIME$:' . (int)$holdoff,
                        'ttl' => max( $ttl, 1 ),
                        'sbt' => true, // substitute $UNIXTIME$ with actual microtime
                ) );
@@ -890,7 +994,7 @@ class WANObjectCache {
         *
         * @param mixed $value
         * @param integer $ttl [0=forever]
-        * @return string
+        * @return array
         */
        protected function wrap( $value, $ttl ) {
                return array(
@@ -910,10 +1014,10 @@ class WANObjectCache {
         */
        protected function unwrap( $wrapped, $now ) {
                // Check if the value is a tombstone
-               $purgeTimestamp = self::parsePurgeValue( $wrapped );
-               if ( is_float( $purgeTimestamp ) ) {
+               $purge = self::parsePurgeValue( $wrapped );
+               if ( $purge !== false ) {
                        // Purged values should always have a negative current $ttl
-                       $curTTL = min( -0.000001, $purgeTimestamp - $now );
+                       $curTTL = min( $purge[self::FLD_TIME] - $now, self::TINY_NEGATIVE );
                        return array( false, $curTTL );
                }
 
@@ -924,7 +1028,12 @@ class WANObjectCache {
                        return array( false, null );
                }
 
-               if ( $wrapped[self::FLD_TTL] > 0 ) {
+               $flags = isset( $wrapped[self::FLD_FLAGS] ) ? $wrapped[self::FLD_FLAGS] : 0;
+               if ( ( $flags & self::FLG_STALE ) == self::FLG_STALE ) {
+                       // Treat as expired, with the cache time as the expiration
+                       $age = $now - $wrapped[self::FLD_TIME];
+                       $curTTL = min( -$age, self::TINY_NEGATIVE );
+               } elseif ( $wrapped[self::FLD_TTL] > 0 ) {
                        // Get the approximate time left on the key
                        $age = $now - $wrapped[self::FLD_TIME];
                        $curTTL = max( $wrapped[self::FLD_TTL] - $age, 0.0 );
@@ -951,17 +1060,36 @@ class WANObjectCache {
        }
 
        /**
-        * @param string $value String like "PURGED:<timestamp>"
-        * @return float|bool UNIX timestamp or false on failure
+        * @param string $value Wrapped value like "PURGED:<timestamp>:<holdoff>"
+        * @return array|bool Array containing a UNIX timestamp (float) and holdoff period (integer),
+        *  or false if value isn't a valid purge value
         */
        protected static function parsePurgeValue( $value ) {
-               $m = array();
-               if ( is_string( $value ) &&
-                       preg_match( '/^' . self::PURGE_VAL_PREFIX . '([^:]+)$/', $value, $m )
+               if ( !is_string( $value ) ) {
+                       return false;
+               }
+               $segments = explode( ':', $value, 3 );
+               if ( !isset( $segments[0] ) || !isset( $segments[1] )
+                       || "{$segments[0]}:" !== self::PURGE_VAL_PREFIX
                ) {
-                       return (float)$m[1];
-               } else {
                        return false;
                }
+               if ( !isset( $segments[2] ) ) {
+                       // Back-compat with old purge values without holdoff
+                       $segments[2] = self::HOLDOFF_TTL;
+               }
+               return array(
+                       self::FLD_TIME => (float)$segments[1],
+                       self::FLD_HOLDOFF => (int)$segments[2],
+               );
+       }
+
+       /**
+        * @param float $timestamp
+        * @param int $holdoff In seconds
+        * @return string Wrapped purge value
+        */
+       protected function makePurgeValue( $timestamp, $holdoff ) {
+               return self::PURGE_VAL_PREFIX . (float)$timestamp . ':' . (int)$holdoff;
        }
 }
diff --git a/includes/logging/ImportLogFormatter.php b/includes/logging/ImportLogFormatter.php
new file mode 100644 (file)
index 0000000..a2a899b
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Formatter for import 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
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ * @since 1.27
+ */
+
+/**
+ * This class formats import log entries.
+ *
+ * @since 1.27
+ */
+class ImportLogFormatter extends LogFormatter {
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->extractParameters();
+               if ( isset( $params[3] ) ) {
+                       // New log items with more details
+                       // Messages: logentry-import-upload-details, logentry-import-interwiki-details
+                       $key .= '-details';
+               }
+
+               return $key;
+       }
+}
index 4c0bd8e..dcd7a45 100644 (file)
@@ -114,7 +114,7 @@ class LogEventsList extends ContextSource {
                }
 
                // Submit button
-               $html .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() );
+               $html .= Xml::submitButton( $this->msg( 'logeventslist-submit' )->text() );
 
                // Fieldset
                $html = Xml::fieldset( $this->msg( 'log' )->text(), $html );
@@ -233,7 +233,7 @@ class LogEventsList extends ContextSource {
                        array( 'class' => 'mw-autocomplete-user' )
                );
 
-               return '<span style="white-space: nowrap">' . $label . '</span>';
+               return '<span class="mw-input-with-label">' . $label . '</span>';
        }
 
        /**
@@ -249,7 +249,7 @@ class LogEventsList extends ContextSource {
                        $title
                );
 
-               return '<span style="white-space: nowrap">' . $label .  '</span>';
+               return '<span class="mw-input-with-label">' . $label .  '</span>';
        }
 
        /**
@@ -257,7 +257,7 @@ class LogEventsList extends ContextSource {
         * @return string Checkbox
         */
        private function getTitlePattern( $pattern ) {
-               return '<span style="white-space: nowrap">' .
+               return '<span class="mw-input-with-label">' .
                        Xml::checkLabel( $this->msg( 'log-title-wildcard' )->text(), 'pattern', 'pattern', $pattern ) .
                        '</span>';
        }
index 044bb53..f557c1a 100644 (file)
@@ -216,6 +216,7 @@ class EmailNotification {
        public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit,
                $oldid, $watchers, $pageStatus = 'changed' ) {
                # we use $wgPasswordSender as sender's address
+               global $wgUsersNotifiedOnAllChanges;
                global $wgEnotifWatchlist, $wgBlockDisablesLogin;
                global $wgEnotifMinorEdits, $wgEnotifUserTalk;
 
@@ -262,6 +263,7 @@ class EmailNotification {
                                                && ( !$minorEdit || $watchingUser->getOption( 'enotifminoredits' ) )
                                                && $watchingUser->isEmailConfirmed()
                                                && $watchingUser->getID() != $userTalkId
+                                               && !in_array( $watchingUser->getName(), $wgUsersNotifiedOnAllChanges )
                                                && !( $wgBlockDisablesLogin && $watchingUser->isBlocked() )
                                        ) {
                                                if ( Hooks::run( 'SendWatchlistEmailNotification', array( $watchingUser, $title, $this ) ) ) {
@@ -272,7 +274,6 @@ class EmailNotification {
                        }
                }
 
-               global $wgUsersNotifiedOnAllChanges;
                foreach ( $wgUsersNotifiedOnAllChanges as $name ) {
                        if ( $editor->getName() == $name ) {
                                // No point notifying the user that actually made the change!
index 49ce21c..85595f1 100644 (file)
@@ -64,7 +64,7 @@ class UserMailer {
         *
         * @return string
         */
-       static function arrayToHeaderString( $headers, $endl = "\n" ) {
+       static function arrayToHeaderString( $headers, $endl = PHP_EOL ) {
                $strings = array();
                foreach ( $headers as $name => $value ) {
                        // Prevent header injection by stripping newlines from value
@@ -292,11 +292,7 @@ class UserMailer {
 
                // Line endings need to be different on Unix and Windows due to
                // the bug described at http://trac.wordpress.org/ticket/2603
-               if ( wfIsWindows() ) {
-                       $endl = "\r\n";
-               } else {
-                       $endl = "\n";
-               }
+               $endl = PHP_EOL;
 
                if ( is_array( $body ) ) {
                        // we are sending a multipart message
index b422bfa..5cc05f2 100644 (file)
@@ -289,7 +289,7 @@ class DjVuHandler extends ImageHandler {
         * @param bool $gettext DOCUMENT (Default: false)
         * @return bool|SimpleXMLElement
         */
-       function getMetaTree( $image, $gettext = false ) {
+       public function getMetaTree( $image, $gettext = false ) {
                if ( $gettext && isset( $image->djvuTextTree ) ) {
                        return $image->djvuTextTree;
                }
@@ -309,7 +309,7 @@ class DjVuHandler extends ImageHandler {
                        // Set to false rather than null to avoid further attempts
                        $image->dejaMetaTree = false;
                        $image->djvuTextTree = false;
-                       $tree = new SimpleXMLElement( $metadata );
+                       $tree = new SimpleXMLElement( $metadata, LIBXML_PARSEHUGE );
                        if ( $tree->getName() == 'mw-djvu' ) {
                                /** @var SimpleXMLElement $b */
                                foreach ( $tree->children() as $b ) {
@@ -375,56 +375,52 @@ class DjVuHandler extends ImageHandler {
                return !empty( $metadata ) && $metadata != serialize( array() );
        }
 
-       function pageCount( $image ) {
-               global $wgMemc;
+       function pageCount( File $image ) {
+               $info = $this->getDimensionInfo( $image );
 
-               $key = wfMemcKey( 'file-djvu', 'pageCount', $image->getSha1() );
+               return $info ? $info['pageCount'] : false;
+       }
 
-               $count = $wgMemc->get( $key );
-               if ( $count === false ) {
-                       $tree = $this->getMetaTree( $image );
-                       if ( !$tree ) {
-                               return false;
-                       }
-                       $count = count( $tree->xpath( '//OBJECT' ) );
-                       $wgMemc->set( $key, $count );
+       function getPageDimensions( File $image, $page ) {
+               $index = $page - 1; // MW starts pages at 1
+
+               $info = $this->getDimensionInfo( $image );
+               if ( $info && isset( $info['dimensionsByPage'][$index] ) ) {
+                       return $info['dimensionsByPage'][$index];
                }
 
-               return $count;
+               return false;
        }
 
-       function getPageDimensions( $image, $page ) {
-               global $wgMemc;
-
-               $key = wfMemcKey( 'file-djvu', 'dimensions', $image->getSha1() );
-
-               $dimsByPage = $wgMemc->get( $key );
-               if ( !is_array( $dimsByPage ) ) {
-                       $tree = $this->getMetaTree( $image );
-                       if ( !$tree ) {
-                               return false;
-                       }
+       protected function getDimensionInfo( File $file ) {
+               $that = $this;
 
-                       $dimsByPage = array();
-                       $count = count( $tree->xpath( '//OBJECT' ) );
-                       for ( $i = 0; $i < $count; ++$i ) {
-                               $o = $tree->BODY[0]->OBJECT[$i];
-                               if ( $o ) {
-                                       $dimsByPage[$i] = array(
-                                               'width' => (int)$o['width'],
-                                               'height' => (int)$o['height']
-                                       );
-                               } else {
-                                       $dimsByPage[$i] = false;
+               return ObjectCache::getMainWANInstance()->getWithSetCallback(
+                       wfMemcKey( 'file-djvu', 'dimensions', $file->getSha1() ),
+                       WANObjectCache::TTL_INDEFINITE,
+                       function () use ( $that, $file ) {
+                               $tree = $that->getMetaTree( $file );
+                               if ( !$tree ) {
+                                       return false;
                                }
-                       }
-
-                       $wgMemc->set( $key, $dimsByPage );
-               }
 
-               $index = $page - 1; // MW starts pages at 1
+                               $dimsByPage = array();
+                               $count = count( $tree->xpath( '//OBJECT' ) );
+                               for ( $i = 0; $i < $count; ++$i ) {
+                                       $o = $tree->BODY[0]->OBJECT[$i];
+                                       if ( $o ) {
+                                               $dimsByPage[$i] = array(
+                                                       'width' => (int)$o['width'],
+                                                       'height' => (int)$o['height']
+                                               );
+                                       } else {
+                                               $dimsByPage[$i] = false;
+                                       }
+                               }
 
-               return isset( $dimsByPage[$index] ) ? $dimsByPage[$index] : false;
+                               return array( 'pageCount' => $count, 'dimensionsByPage' => $dimsByPage );
+                       }
+               );
        }
 
        /**
@@ -432,7 +428,7 @@ class DjVuHandler extends ImageHandler {
         * @param int $page Page number to get information for
         * @return bool|string Page text or false when no text found.
         */
-       function getPageText( $image, $page ) {
+       function getPageText( File $image, $page ) {
                $tree = $this->getMetaTree( $image, true );
                if ( !$tree ) {
                        return false;
index 5b57821..73eeba6 100644 (file)
@@ -190,8 +190,18 @@ class FormatMetadata extends ContextSource {
 
                                        case 'PhotometricInterpretation':
                                                switch ( $val ) {
+                                                       case 0:
+                                                       case 1:
                                                        case 2:
+                                                       case 3:
+                                                       case 4:
+                                                       case 5:
                                                        case 6:
+                                                       case 8:
+                                                       case 9:
+                                                       case 10:
+                                                       case 32803:
+                                                       case 34892:
                                                                $val = $this->exifMsg( $tag, $val );
                                                                break;
                                                        default:
@@ -1571,7 +1581,7 @@ class FormatMetadata extends ContextSource {
         * @since 1.23
         */
        public function fetchExtendedMetadata( File $file ) {
-               global $wgMemc;
+               $cache = ObjectCache::getMainWANInstance();
 
                // If revision deleted, exit immediately
                if ( $file->isDeleted( File::DELETED_FILE ) ) {
@@ -1585,7 +1595,7 @@ class FormatMetadata extends ContextSource {
                        $file->getSha1()
                );
 
-               $cachedValue = $wgMemc->get( $cacheKey );
+               $cachedValue = $cache->get( $cacheKey );
                if (
                        $cachedValue
                        && Hooks::run( 'ValidateExtendedMetadataCache', array( $cachedValue['timestamp'], $file ) )
@@ -1605,7 +1615,7 @@ class FormatMetadata extends ContextSource {
                        // computation on a cache hit.
                        $this->sanitizeArrayForAPI( $extendedMetadata );
                        $valueToCache = array( 'data' => $extendedMetadata, 'timestamp' => wfTimestampNow() );
-                       $wgMemc->set( $cacheKey, $valueToCache, $maxCacheTime );
+                       $cache->set( $cacheKey, $valueToCache, $maxCacheTime );
                }
 
                return $extendedMetadata;
index 015eb5a..bad1468 100644 (file)
@@ -373,7 +373,7 @@ abstract class MediaHandler {
         * @param File $file
         * @return bool
         */
-       function pageCount( $file ) {
+       function pageCount( File $file ) {
                return false;
        }
 
@@ -434,7 +434,7 @@ abstract class MediaHandler {
         * @param int $page What page to get dimensions of
         * @return array|bool
         */
-       function getPageDimensions( $image, $page ) {
+       function getPageDimensions( File $image, $page ) {
                $gis = $this->getImageSize( $image, $image->getLocalRefPath() );
                if ( $gis ) {
                        return array(
@@ -454,7 +454,7 @@ abstract class MediaHandler {
         * @return bool|string Page text or false when no text found or if
         *   unsupported.
         */
-       function getPageText( $image, $page ) {
+       function getPageText( File $image, $page ) {
                return false;
        }
 
index 1dd8519..0d51c47 100644 (file)
@@ -194,20 +194,32 @@ abstract class MediaTransformOutput {
         * Stream the file if there were no errors
         *
         * @param array $headers Additional HTTP headers to send on success
-        * @return bool Success
+        * @return Status
+        * @since 1.27
         */
-       public function streamFile( $headers = array() ) {
+       public function streamFileWithStatus( $headers = array() ) {
                if ( !$this->path ) {
-                       return false;
+                       return Status::newFatal( 'backend-fail-stream', '<no path>' );
                } elseif ( FileBackend::isStoragePath( $this->path ) ) {
                        $be = $this->file->getRepo()->getBackend();
-
-                       return $be->streamFile( array( 'src' => $this->path, 'headers' => $headers ) )->isOK();
+                       return $be->streamFile( array( 'src' => $this->path, 'headers' => $headers ) );
                } else { // FS-file
-                       return StreamFile::stream( $this->getLocalCopyPath(), $headers );
+                       $success = StreamFile::stream( $this->getLocalCopyPath(), $headers );
+                       return $success ? Status::newGood() : Status::newFatal( 'backend-fail-stream', $this->path );
                }
        }
 
+       /**
+        * Stream the file if there were no errors
+        *
+        * @deprecated since 1.26, use streamFileWithStatus
+        * @param array $headers Additional HTTP headers to send on success
+        * @return bool Success
+        */
+       public function streamFile( $headers = array() ) {
+               $this->streamFileWithStatus( $headers )->isOK();
+       }
+
        /**
         * Wrap some XHTML text in an anchor tag with the given attributes
         *
index 15753a9..f72df19 100644 (file)
@@ -505,30 +505,31 @@ abstract class TransformationalImageHandler extends ImageHandler {
         * Retrieve the version of the installed ImageMagick
         * You can use PHPs version_compare() to use this value
         * Value is cached for one hour.
-        * @return string Representing the IM version.
+        * @return string|bool Representing the IM version; false on error
         */
        protected function getMagickVersion() {
-               global $wgMemc;
-
-               $cache = $wgMemc->get( "imagemagick-version" );
-               if ( !$cache ) {
-                       global $wgImageMagickConvertCommand;
-                       $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
-                       wfDebug( __METHOD__ . ": Running convert -version\n" );
-                       $retval = '';
-                       $return = wfShellExec( $cmd, $retval );
-                       $x = preg_match( '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches );
-                       if ( $x != 1 ) {
-                               wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
-
-                               return null;
+               $cache = ObjectCache::getLocalServerInstance( CACHE_NONE );
+               return $cache->getWithSetCallback(
+                       'imagemagick-version',
+                       $cache::TTL_HOUR,
+                       function () {
+                               global $wgImageMagickConvertCommand;
+
+                               $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
+                               wfDebug( __METHOD__ . ": Running convert -version\n" );
+                               $retval = '';
+                               $return = wfShellExec( $cmd, $retval );
+                               $x = preg_match(
+                                       '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches
+                               );
+                               if ( $x != 1 ) {
+                                       wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
+                                       return false;
+                               }
+
+                               return $matches[1];
                        }
-                       $wgMemc->set( "imagemagick-version", $matches[1], 3600 );
-
-                       return $matches[1];
-               }
-
-               return $cache;
+               );
        }
 
        /**
index 3b9899f..c3b5190 100644 (file)
@@ -6,7 +6,7 @@ application/mathml+xml mathml
 application/msword doc dot
 application/octet-stream bin dms lha lzh exe class so dll
 application/oda oda
-application/ogg ogx ogg ogm ogv oga spx
+application/ogg ogx ogg ogm ogv oga spx opus
 application/pdf pdf
 application/postscript ai eps ps
 application/rdf+xml rdf
@@ -67,13 +67,13 @@ application/x-rar rar
 audio/basic au snd
 audio/midi mid midi kar
 audio/mpeg mpga mp2 mp3
-audio/ogg oga ogg spx
+audio/ogg oga ogg spx opus
 video/webm webm
 audio/webm webm
 audio/x-aiff aif aiff aifc
 audio/x-matroska mka mkv
 audio/x-mpegurl m3u
-audio/x-ogg oga ogg spx
+audio/x-ogg oga ogg spx opus
 audio/x-pn-realaudio ram rm
 audio/x-pn-realaudio-plugin rpm
 audio/x-realaudio ra
diff --git a/includes/objectcache/MemcachedBagOStuff.php b/includes/objectcache/MemcachedBagOStuff.php
deleted file mode 100644 (file)
index 95f5c8d..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-<?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 {
-       /** @var MWMemcached|Memcached */
-       protected $client;
-
-       /**
-        * Fill in the defaults for any parameters missing from $params, using the
-        * backwards-compatible global variables
-        * @param array $params
-        * @return array
-        */
-       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.5;
-               }
-               return $params;
-       }
-
-       protected function doGet( $key, $flags = 0 ) {
-               $casToken = null;
-
-               return $this->getWithToken( $key, $casToken, $flags );
-       }
-
-       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
-               return $this->client->get( $this->encodeKey( $key ), $casToken );
-       }
-
-       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
-               return $this->client->set( $this->encodeKey( $key ), $value,
-                       $this->fixExpiry( $exptime ) );
-       }
-
-       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
-               return $this->client->cas( $casToken, $this->encodeKey( $key ),
-                       $value, $this->fixExpiry( $exptime ) );
-       }
-
-       public function delete( $key ) {
-               return $this->client->delete( $this->encodeKey( $key ) );
-       }
-
-       public function add( $key, $value, $exptime = 0 ) {
-               return $this->client->add( $this->encodeKey( $key ), $value,
-                       $this->fixExpiry( $exptime ) );
-       }
-
-       public function merge( $key, $callback, $exptime = 0, $attempts = 10, $flags = 0 ) {
-               if ( !is_callable( $callback ) ) {
-                       throw new Exception( "Got invalid callback." );
-               }
-
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
-       }
-
-       /**
-        * Get the underlying client object. This is provided for debugging
-        * purposes.
-        * @return BagOStuff
-        */
-       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.
-        * @param string $key
-        * @return string
-        */
-       public function encodeKey( $key ) {
-               return preg_replace_callback( '/[\x00-\x20\x25\x7f]+/',
-                       array( $this, 'encodeKeyCallback' ), $key );
-       }
-
-       /**
-        * @param array $m
-        * @return string
-        */
-       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 expires >30d at 30d, unless they're >=1e9 in which
-        * case they are likely to really be absolute (1e9 = 2011-09-09)
-        * @param int $expiry
-        * @return int
-        */
-       function fixExpiry( $expiry ) {
-               if ( $expiry > 2592000 && $expiry < 1000000000 ) {
-                       $expiry = 2592000;
-               }
-               return (int)$expiry;
-       }
-
-       /**
-        * Decode a key encoded with encodeKey(). This is provided as a convenience
-        * function for debugging.
-        *
-        * @param string $key
-        *
-        * @return string
-        */
-       public function decodeKey( $key ) {
-               // matches %00-%20, %25, %7F (=decoded alternatives for those encoded in encodeKey)
-               return preg_replace_callback( '/%([0-1][0-9]|20|25|7F)/i', function ( $match ) {
-                       return urldecode( $match[0] );
-               }, $key );
-       }
-
-       /**
-        * Send a debug message to the log
-        * @param string $text
-        */
-       protected function debugLog( $text ) {
-               $this->logger->debug( $text );
-       }
-
-       public function modifySimpleRelayEvent( array $event ) {
-               if ( array_key_exists( 'val', $event ) ) {
-                       $event['flg'] = 0; // data is not serialized nor gzipped (for memcached driver)
-               }
-
-               return $event;
-       }
-}
diff --git a/includes/objectcache/MemcachedClient.php b/includes/objectcache/MemcachedClient.php
deleted file mode 100644 (file)
index 5010b89..0000000
+++ /dev/null
@@ -1,1276 +0,0 @@
-<?php
-// @codingStandardsIgnoreFile It's an external lib and it isn't. Let's not bother.
-/**
- * Memcached client for PHP.
- *
- * +---------------------------------------------------------------------------+
- * | memcached client, PHP                                                     |
- * +---------------------------------------------------------------------------+
- * | Copyright (c) 2003 Ryan T. Dean <rtdean@cytherianage.net>                 |
- * | All rights reserved.                                                      |
- * |                                                                           |
- * | Redistribution and use in source and binary forms, with or without        |
- * | modification, are permitted provided that the following conditions        |
- * | are met:                                                                  |
- * |                                                                           |
- * | 1. Redistributions of source code must retain the above copyright         |
- * |    notice, this list of conditions and the following disclaimer.          |
- * | 2. Redistributions in binary form must reproduce the above copyright      |
- * |    notice, this list of conditions and the following disclaimer in the    |
- * |    documentation and/or other materials provided with the distribution.   |
- * |                                                                           |
- * | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR      |
- * | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
- * | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.   |
- * | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,          |
- * | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT  |
- * | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
- * | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
- * | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF  |
- * | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.         |
- * +---------------------------------------------------------------------------+
- * | Author: Ryan T. Dean <rtdean@cytherianage.net>                            |
- * | Heavily influenced by the Perl memcached client by Brad Fitzpatrick.      |
- * |   Permission granted by Brad Fitzpatrick for relicense of ported Perl     |
- * |   client logic under 2-clause BSD license.                                |
- * +---------------------------------------------------------------------------+
- *
- * @file
- * $TCAnet$
- */
-
-/**
- * This is the PHP client for memcached - a distributed memory cache daemon.
- * More information is available at http://www.danga.com/memcached/
- *
- * Usage example:
- *
- * require_once 'memcached.php';
- *
- * $mc = new MWMemcached(array(
- *              'servers' => array('127.0.0.1:10000',
- *                                 array('192.0.0.1:10010', 2),
- *                                 '127.0.0.1:10020'),
- *              'debug'   => false,
- *              'compress_threshold' => 10240,
- *              'persistent' => true));
- *
- * $mc->add( 'key', array( 'some', 'array' ) );
- * $mc->replace( 'key', 'some random string' );
- * $val = $mc->get( 'key' );
- *
- * @author  Ryan T. Dean <rtdean@cytherianage.net>
- * @version 0.1.2
- */
-
-use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
-
-// {{{ requirements
-// }}}
-
-// {{{ class MWMemcached
-/**
- * memcached client class implemented using (p)fsockopen()
- *
- * @author  Ryan T. Dean <rtdean@cytherianage.net>
- * @ingroup Cache
- */
-class MWMemcached {
-       // {{{ properties
-       // {{{ public
-
-       // {{{ constants
-       // {{{ flags
-
-       /**
-        * Flag: indicates data is serialized
-        */
-       const SERIALIZED = 1;
-
-       /**
-        * Flag: indicates data is compressed
-        */
-       const COMPRESSED = 2;
-
-       /**
-        * Flag: indicates data is an integer
-        */
-       const INTVAL = 4;
-
-       // }}}
-
-       /**
-        * Minimum savings to store data compressed
-        */
-       const COMPRESSION_SAVINGS = 0.20;
-
-       // }}}
-
-       /**
-        * Command statistics
-        *
-        * @var array
-        * @access public
-        */
-       public $stats;
-
-       // }}}
-       // {{{ private
-
-       /**
-        * Cached Sockets that are connected
-        *
-        * @var array
-        * @access private
-        */
-       public $_cache_sock;
-
-       /**
-        * Current debug status; 0 - none to 9 - profiling
-        *
-        * @var bool
-        * @access private
-        */
-       public $_debug;
-
-       /**
-        * Dead hosts, assoc array, 'host'=>'unixtime when ok to check again'
-        *
-        * @var array
-        * @access private
-        */
-       public $_host_dead;
-
-       /**
-        * Is compression available?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_have_zlib;
-
-       /**
-        * Do we want to use compression?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_compress_enable;
-
-       /**
-        * At how many bytes should we compress?
-        *
-        * @var int
-        * @access private
-        */
-       public $_compress_threshold;
-
-       /**
-        * Are we using persistent links?
-        *
-        * @var bool
-        * @access private
-        */
-       public $_persistent;
-
-       /**
-        * If only using one server; contains ip:port to connect to
-        *
-        * @var string
-        * @access private
-        */
-       public $_single_sock;
-
-       /**
-        * Array containing ip:port or array(ip:port, weight)
-        *
-        * @var array
-        * @access private
-        */
-       public $_servers;
-
-       /**
-        * Our bit buckets
-        *
-        * @var array
-        * @access private
-        */
-       public $_buckets;
-
-       /**
-        * Total # of bit buckets we have
-        *
-        * @var int
-        * @access private
-        */
-       public $_bucketcount;
-
-       /**
-        * # of total servers we have
-        *
-        * @var int
-        * @access private
-        */
-       public $_active;
-
-       /**
-        * Stream timeout in seconds. Applies for example to fread()
-        *
-        * @var int
-        * @access private
-        */
-       public $_timeout_seconds;
-
-       /**
-        * Stream timeout in microseconds
-        *
-        * @var int
-        * @access private
-        */
-       public $_timeout_microseconds;
-
-       /**
-        * Connect timeout in seconds
-        */
-       public $_connect_timeout;
-
-       /**
-        * Number of connection attempts for each server
-        */
-       public $_connect_attempts;
-
-       /**
-        * @var LoggerInterface
-        */
-       private $_logger;
-
-       // }}}
-       // }}}
-       // {{{ methods
-       // {{{ public functions
-       // {{{ memcached()
-
-       /**
-        * Memcache initializer
-        *
-        * @param array $args Associative array of settings
-        *
-        * @return mixed
-        */
-       public function __construct( $args ) {
-               $this->set_servers( isset( $args['servers'] ) ? $args['servers'] : array() );
-               $this->_debug = isset( $args['debug'] ) ? $args['debug'] : false;
-               $this->stats = array();
-               $this->_compress_threshold = isset( $args['compress_threshold'] ) ? $args['compress_threshold'] : 0;
-               $this->_persistent = isset( $args['persistent'] ) ? $args['persistent'] : false;
-               $this->_compress_enable = true;
-               $this->_have_zlib = function_exists( 'gzcompress' );
-
-               $this->_cache_sock = array();
-               $this->_host_dead = array();
-
-               $this->_timeout_seconds = 0;
-               $this->_timeout_microseconds = isset( $args['timeout'] ) ? $args['timeout'] : 500000;
-
-               $this->_connect_timeout = isset( $args['connect_timeout'] ) ? $args['connect_timeout'] : 0.1;
-               $this->_connect_attempts = 2;
-
-               $this->_logger = isset( $args['logger'] ) ? $args['logger'] : new NullLogger();
-       }
-
-       // }}}
-       // {{{ add()
-
-       /**
-        * Adds a key/value to the memcache server if one isn't already set with
-        * that key
-        *
-        * @param string $key Key to set with data
-        * @param mixed $val Value to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of expiration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool
-        */
-       public function add( $key, $val, $exp = 0 ) {
-               return $this->_set( 'add', $key, $val, $exp );
-       }
-
-       // }}}
-       // {{{ decr()
-
-       /**
-        * Decrease a value stored on the memcache server
-        *
-        * @param string $key Key to decrease
-        * @param int $amt (optional) amount to decrease
-        *
-        * @return mixed False on failure, value on success
-        */
-       public function decr( $key, $amt = 1 ) {
-               return $this->_incrdecr( 'decr', $key, $amt );
-       }
-
-       // }}}
-       // {{{ delete()
-
-       /**
-        * Deletes a key from the server, optionally after $time
-        *
-        * @param string $key Key to delete
-        * @param int $time (optional) how long to wait before deleting
-        *
-        * @return bool True on success, false on failure
-        */
-       public function delete( $key, $time = 0 ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-
-               if ( isset( $this->stats['delete'] ) ) {
-                       $this->stats['delete']++;
-               } else {
-                       $this->stats['delete'] = 1;
-               }
-               $cmd = "delete $key $time\r\n";
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return false;
-               }
-               $res = $this->_fgets( $sock );
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "MemCache: delete %s (%s)\n", $key, $res ) );
-               }
-
-               if ( $res == "DELETED" || $res == "NOT_FOUND" ) {
-                       return true;
-               }
-
-               return false;
-       }
-
-       /**
-        * @param string $key
-        * @param int $timeout
-        * @return bool
-        */
-       public function lock( $key, $timeout = 0 ) {
-               /* stub */
-               return true;
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       public function unlock( $key ) {
-               /* stub */
-               return true;
-       }
-
-       // }}}
-       // {{{ disconnect_all()
-
-       /**
-        * Disconnects all connected sockets
-        */
-       public function disconnect_all() {
-               foreach ( $this->_cache_sock as $sock ) {
-                       fclose( $sock );
-               }
-
-               $this->_cache_sock = array();
-       }
-
-       // }}}
-       // {{{ enable_compress()
-
-       /**
-        * Enable / Disable compression
-        *
-        * @param bool $enable True to enable, false to disable
-        */
-       public function enable_compress( $enable ) {
-               $this->_compress_enable = $enable;
-       }
-
-       // }}}
-       // {{{ forget_dead_hosts()
-
-       /**
-        * Forget about all of the dead hosts
-        */
-       public function forget_dead_hosts() {
-               $this->_host_dead = array();
-       }
-
-       // }}}
-       // {{{ get()
-
-       /**
-        * Retrieves the value associated with the key from the memcache server
-        *
-        * @param array|string $key key to retrieve
-        * @param float $casToken [optional]
-        *
-        * @return mixed
-        */
-       public function get( $key, &$casToken = null ) {
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( "get($key)\n" );
-               }
-
-               if ( !is_array( $key ) && strval( $key ) === '' ) {
-                       $this->_debugprint( "Skipping key which equals to an empty string" );
-                       return false;
-               }
-
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-               if ( isset( $this->stats['get'] ) ) {
-                       $this->stats['get']++;
-               } else {
-                       $this->stats['get'] = 1;
-               }
-
-               $cmd = "gets $key\r\n";
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return false;
-               }
-
-               $val = array();
-               $this->_load_items( $sock, $val, $casToken );
-
-               if ( $this->_debug ) {
-                       foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: sock %s got %s\n", serialize( $sock ), $k ) );
-                       }
-               }
-
-               $value = false;
-               if ( isset( $val[$key] ) ) {
-                       $value = $val[$key];
-               }
-               return $value;
-       }
-
-       // }}}
-       // {{{ get_multi()
-
-       /**
-        * Get multiple keys from the server(s)
-        *
-        * @param array $keys Keys to retrieve
-        *
-        * @return array
-        */
-       public function get_multi( $keys ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               if ( isset( $this->stats['get_multi'] ) ) {
-                       $this->stats['get_multi']++;
-               } else {
-                       $this->stats['get_multi'] = 1;
-               }
-               $sock_keys = array();
-               $socks = array();
-               foreach ( $keys as $key ) {
-                       $sock = $this->get_sock( $key );
-                       if ( !is_resource( $sock ) ) {
-                               continue;
-                       }
-                       $key = is_array( $key ) ? $key[1] : $key;
-                       if ( !isset( $sock_keys[$sock] ) ) {
-                               $sock_keys[intval( $sock )] = array();
-                               $socks[] = $sock;
-                       }
-                       $sock_keys[intval( $sock )][] = $key;
-               }
-
-               $gather = array();
-               // Send out the requests
-               foreach ( $socks as $sock ) {
-                       $cmd = 'gets';
-                       foreach ( $sock_keys[intval( $sock )] as $key ) {
-                               $cmd .= ' ' . $key;
-                       }
-                       $cmd .= "\r\n";
-
-                       if ( $this->_fwrite( $sock, $cmd ) ) {
-                               $gather[] = $sock;
-                       }
-               }
-
-               // Parse responses
-               $val = array();
-               foreach ( $gather as $sock ) {
-                       $this->_load_items( $sock, $val, $casToken );
-               }
-
-               if ( $this->_debug ) {
-                       foreach ( $val as $k => $v ) {
-                               $this->_debugprint( sprintf( "MemCache: got %s\n", $k ) );
-                       }
-               }
-
-               return $val;
-       }
-
-       // }}}
-       // {{{ incr()
-
-       /**
-        * Increments $key (optionally) by $amt
-        *
-        * @param string $key Key to increment
-        * @param int $amt (optional) amount to increment
-        *
-        * @return int|null Null if the key does not exist yet (this does NOT
-        * create new mappings if the key does not exist). If the key does
-        * exist, this returns the new value for that key.
-        */
-       public function incr( $key, $amt = 1 ) {
-               return $this->_incrdecr( 'incr', $key, $amt );
-       }
-
-       // }}}
-       // {{{ replace()
-
-       /**
-        * Overwrites an existing value for key; only works if key is already set
-        *
-        * @param string $key Key to set value as
-        * @param mixed $value Value to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool
-        */
-       public function replace( $key, $value, $exp = 0 ) {
-               return $this->_set( 'replace', $key, $value, $exp );
-       }
-
-       // }}}
-       // {{{ run_command()
-
-       /**
-        * Passes through $cmd to the memcache server connected by $sock; returns
-        * output as an array (null array if no output)
-        *
-        * @param Resource $sock Socket to send command on
-        * @param string $cmd Command to run
-        *
-        * @return array Output array
-        */
-       public function run_command( $sock, $cmd ) {
-               if ( !is_resource( $sock ) ) {
-                       return array();
-               }
-
-               if ( !$this->_fwrite( $sock, $cmd ) ) {
-                       return array();
-               }
-
-               $ret = array();
-               while ( true ) {
-                       $res = $this->_fgets( $sock );
-                       $ret[] = $res;
-                       if ( preg_match( '/^END/', $res ) ) {
-                               break;
-                       }
-                       if ( strlen( $res ) == 0 ) {
-                               break;
-                       }
-               }
-               return $ret;
-       }
-
-       // }}}
-       // {{{ set()
-
-       /**
-        * Unconditionally sets a key to a given value in the memcache.  Returns true
-        * if set successfully.
-        *
-        * @param string $key Key to set value as
-        * @param mixed $value Value to set
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool True on success
-        */
-       public function set( $key, $value, $exp = 0 ) {
-               return $this->_set( 'set', $key, $value, $exp );
-       }
-
-       // }}}
-       // {{{ cas()
-
-       /**
-        * Sets a key to a given value in the memcache if the current value still corresponds
-        * to a known, given value.  Returns true if set successfully.
-        *
-        * @param float $casToken Current known value
-        * @param string $key Key to set value as
-        * @param mixed $value Value to set
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        *
-        * @return bool True on success
-        */
-       public function cas( $casToken, $key, $value, $exp = 0 ) {
-               return $this->_set( 'cas', $key, $value, $exp, $casToken );
-       }
-
-       // }}}
-       // {{{ set_compress_threshold()
-
-       /**
-        * Sets the compression threshold
-        *
-        * @param int $thresh Threshold to compress if larger than
-        */
-       public function set_compress_threshold( $thresh ) {
-               $this->_compress_threshold = $thresh;
-       }
-
-       // }}}
-       // {{{ set_debug()
-
-       /**
-        * Sets the debug flag
-        *
-        * @param bool $dbg True for debugging, false otherwise
-        *
-        * @see MWMemcached::__construct
-        */
-       public function set_debug( $dbg ) {
-               $this->_debug = $dbg;
-       }
-
-       // }}}
-       // {{{ set_servers()
-
-       /**
-        * Sets the server list to distribute key gets and puts between
-        *
-        * @param array $list Array of servers to connect to
-        *
-        * @see MWMemcached::__construct()
-        */
-       public function set_servers( $list ) {
-               $this->_servers = $list;
-               $this->_active = count( $list );
-               $this->_buckets = null;
-               $this->_bucketcount = 0;
-
-               $this->_single_sock = null;
-               if ( $this->_active == 1 ) {
-                       $this->_single_sock = $this->_servers[0];
-               }
-       }
-
-       /**
-        * Sets the timeout for new connections
-        *
-        * @param int $seconds Number of seconds
-        * @param int $microseconds Number of microseconds
-        */
-       public function set_timeout( $seconds, $microseconds ) {
-               $this->_timeout_seconds = $seconds;
-               $this->_timeout_microseconds = $microseconds;
-       }
-
-       // }}}
-       // }}}
-       // {{{ private methods
-       // {{{ _close_sock()
-
-       /**
-        * Close the specified socket
-        *
-        * @param string $sock Socket to close
-        *
-        * @access private
-        */
-       function _close_sock( $sock ) {
-               $host = array_search( $sock, $this->_cache_sock );
-               fclose( $this->_cache_sock[$host] );
-               unset( $this->_cache_sock[$host] );
-       }
-
-       // }}}
-       // {{{ _connect_sock()
-
-       /**
-        * Connects $sock to $host, timing out after $timeout
-        *
-        * @param int $sock Socket to connect
-        * @param string $host Host:IP to connect to
-        *
-        * @return bool
-        * @access private
-        */
-       function _connect_sock( &$sock, $host ) {
-               list( $ip, $port ) = preg_split( '/:(?=\d)/', $host );
-               $sock = false;
-               $timeout = $this->_connect_timeout;
-               $errno = $errstr = null;
-               for ( $i = 0; !$sock && $i < $this->_connect_attempts; $i++ ) {
-                       MediaWiki\suppressWarnings();
-                       if ( $this->_persistent == 1 ) {
-                               $sock = pfsockopen( $ip, $port, $errno, $errstr, $timeout );
-                       } else {
-                               $sock = fsockopen( $ip, $port, $errno, $errstr, $timeout );
-                       }
-                       MediaWiki\restoreWarnings();
-               }
-               if ( !$sock ) {
-                       $this->_error_log( "Error connecting to $host: $errstr\n" );
-                       $this->_dead_host( $host );
-                       return false;
-               }
-
-               // Initialise timeout
-               stream_set_timeout( $sock, $this->_timeout_seconds, $this->_timeout_microseconds );
-
-               // If the connection was persistent, flush the read buffer in case there
-               // was a previous incomplete request on this connection
-               if ( $this->_persistent ) {
-                       $this->_flush_read_buffer( $sock );
-               }
-               return true;
-       }
-
-       // }}}
-       // {{{ _dead_sock()
-
-       /**
-        * Marks a host as dead until 30-40 seconds in the future
-        *
-        * @param string $sock Socket to mark as dead
-        *
-        * @access private
-        */
-       function _dead_sock( $sock ) {
-               $host = array_search( $sock, $this->_cache_sock );
-               $this->_dead_host( $host );
-       }
-
-       /**
-        * @param string $host
-        */
-       function _dead_host( $host ) {
-               $parts = explode( ':', $host );
-               $ip = $parts[0];
-               $this->_host_dead[$ip] = time() + 30 + intval( rand( 0, 10 ) );
-               $this->_host_dead[$host] = $this->_host_dead[$ip];
-               unset( $this->_cache_sock[$host] );
-       }
-
-       // }}}
-       // {{{ get_sock()
-
-       /**
-        * get_sock
-        *
-        * @param string $key Key to retrieve value for;
-        *
-        * @return Resource|bool Resource on success, false on failure
-        * @access private
-        */
-       function get_sock( $key ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               if ( $this->_single_sock !== null ) {
-                       return $this->sock_to_host( $this->_single_sock );
-               }
-
-               $hv = is_array( $key ) ? intval( $key[0] ) : $this->_hashfunc( $key );
-               if ( $this->_buckets === null ) {
-                       $bu = array();
-                       foreach ( $this->_servers as $v ) {
-                               if ( is_array( $v ) ) {
-                                       for ( $i = 0; $i < $v[1]; $i++ ) {
-                                               $bu[] = $v[0];
-                                       }
-                               } else {
-                                       $bu[] = $v;
-                               }
-                       }
-                       $this->_buckets = $bu;
-                       $this->_bucketcount = count( $bu );
-               }
-
-               $realkey = is_array( $key ) ? $key[1] : $key;
-               for ( $tries = 0; $tries < 20; $tries++ ) {
-                       $host = $this->_buckets[$hv % $this->_bucketcount];
-                       $sock = $this->sock_to_host( $host );
-                       if ( is_resource( $sock ) ) {
-                               return $sock;
-                       }
-                       $hv = $this->_hashfunc( $hv . $realkey );
-               }
-
-               return false;
-       }
-
-       // }}}
-       // {{{ _hashfunc()
-
-       /**
-        * Creates a hash integer based on the $key
-        *
-        * @param string $key Key to hash
-        *
-        * @return int Hash value
-        * @access private
-        */
-       function _hashfunc( $key ) {
-               # 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;
-       }
-
-       // }}}
-       // {{{ _incrdecr()
-
-       /**
-        * Perform increment/decriment on $key
-        *
-        * @param string $cmd Command to perform
-        * @param string|array $key Key to perform it on
-        * @param int $amt Amount to adjust
-        *
-        * @return int New value of $key
-        * @access private
-        */
-       function _incrdecr( $cmd, $key, $amt = 1 ) {
-               if ( !$this->_active ) {
-                       return null;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return null;
-               }
-
-               $key = is_array( $key ) ? $key[1] : $key;
-               if ( isset( $this->stats[$cmd] ) ) {
-                       $this->stats[$cmd]++;
-               } else {
-                       $this->stats[$cmd] = 1;
-               }
-               if ( !$this->_fwrite( $sock, "$cmd $key $amt\r\n" ) ) {
-                       return null;
-               }
-
-               $line = $this->_fgets( $sock );
-               $match = array();
-               if ( !preg_match( '/^(\d+)/', $line, $match ) ) {
-                       return null;
-               }
-               return $match[1];
-       }
-
-       // }}}
-       // {{{ _load_items()
-
-       /**
-        * Load items into $ret from $sock
-        *
-        * @param Resource $sock Socket to read from
-        * @param array $ret returned values
-        * @param float $casToken [optional]
-        * @return bool True for success, false for failure
-        *
-        * @access private
-        */
-       function _load_items( $sock, &$ret, &$casToken = null ) {
-               $results = array();
-
-               while ( 1 ) {
-                       $decl = $this->_fgets( $sock );
-
-                       if ( $decl === false ) {
-                               /*
-                                * If nothing can be read, something is wrong because we know exactly when
-                                * to stop reading (right after "END") and we return right after that.
-                                */
-                               return false;
-                       } elseif ( preg_match( '/^VALUE (\S+) (\d+) (\d+) (\d+)$/', $decl, $match ) ) {
-                               /*
-                                * Read all data returned. This can be either one or multiple values.
-                                * Save all that data (in an array) to be processed later: we'll first
-                                * want to continue reading until "END" before doing anything else,
-                                * to make sure that we don't leave our client in a state where it's
-                                * output is not yet fully read.
-                                */
-                               $results[] = array(
-                                       $match[1], // rkey
-                                       $match[2], // flags
-                                       $match[3], // len
-                                       $match[4], // casToken
-                                       $this->_fread( $sock, $match[3] + 2 ), // data
-                               );
-                       } elseif ( $decl == "END" ) {
-                               if ( count( $results ) == 0 ) {
-                                       return false;
-                               }
-
-                               /**
-                                * All data has been read, time to process the data and build
-                                * meaningful return values.
-                                */
-                               foreach ( $results as $vars ) {
-                                       list( $rkey, $flags, $len, $casToken, $data ) = $vars;
-
-                                       if ( $data === false || substr( $data, -2 ) !== "\r\n" ) {
-                                               $this->_handle_error( $sock,
-                                                       'line ending missing from data block from $1' );
-                                               return false;
-                                       }
-                                       $data = substr( $data, 0, -2 );
-                                       $ret[$rkey] = $data;
-
-                                       if ( $this->_have_zlib && $flags & self::COMPRESSED ) {
-                                               $ret[$rkey] = gzuncompress( $ret[$rkey] );
-                                       }
-
-                                       /*
-                                        * This unserialize is the exact reason that we only want to
-                                        * process data after having read until "END" (instead of doing
-                                        * this right away): "unserialize" can trigger outside code:
-                                        * in the event that $ret[$rkey] is a serialized object,
-                                        * unserializing it will trigger __wakeup() if present. If that
-                                        * function attempted to read from memcached (while we did not
-                                        * yet read "END"), these 2 calls would collide.
-                                        */
-                                       if ( $flags & self::SERIALIZED ) {
-                                               $ret[$rkey] = unserialize( $ret[$rkey] );
-                                       } elseif ( $flags & self::INTVAL ) {
-                                               $ret[$rkey] = intval( $ret[$rkey] );
-                                       }
-                               }
-
-                               return true;
-                       } else {
-                               $this->_handle_error( $sock, 'Error parsing response from $1' );
-                               return false;
-                       }
-               }
-       }
-
-       // }}}
-       // {{{ _set()
-
-       /**
-        * Performs the requested storage operation to the memcache server
-        *
-        * @param string $cmd Command to perform
-        * @param string $key Key to act on
-        * @param mixed $val What we need to store
-        * @param int $exp (optional) Expiration time. This can be a number of seconds
-        * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
-        * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
-        * eg: strtotime("+3 hour")
-        * @param float $casToken [optional]
-        *
-        * @return bool
-        * @access private
-        */
-       function _set( $cmd, $key, $val, $exp, $casToken = null ) {
-               if ( !$this->_active ) {
-                       return false;
-               }
-
-               $sock = $this->get_sock( $key );
-               if ( !is_resource( $sock ) ) {
-                       return false;
-               }
-
-               if ( isset( $this->stats[$cmd] ) ) {
-                       $this->stats[$cmd]++;
-               } else {
-                       $this->stats[$cmd] = 1;
-               }
-
-               $flags = 0;
-
-               if ( is_int( $val ) ) {
-                       $flags |= self::INTVAL;
-               } elseif ( !is_scalar( $val ) ) {
-                       $val = serialize( $val );
-                       $flags |= self::SERIALIZED;
-                       if ( $this->_debug ) {
-                               $this->_debugprint( sprintf( "client: serializing data as it is not scalar\n" ) );
-                       }
-               }
-
-               $len = strlen( $val );
-
-               if ( $this->_have_zlib && $this->_compress_enable
-                       && $this->_compress_threshold && $len >= $this->_compress_threshold
-               ) {
-                       $c_val = gzcompress( $val, 9 );
-                       $c_len = strlen( $c_val );
-
-                       if ( $c_len < $len * ( 1 - self::COMPRESSION_SAVINGS ) ) {
-                               if ( $this->_debug ) {
-                                       $this->_debugprint( sprintf( "client: compressing data; was %d bytes is now %d bytes\n", $len, $c_len ) );
-                               }
-                               $val = $c_val;
-                               $len = $c_len;
-                               $flags |= self::COMPRESSED;
-                       }
-               }
-
-               $command = "$cmd $key $flags $exp $len";
-               if ( $casToken ) {
-                       $command .= " $casToken";
-               }
-
-               if ( !$this->_fwrite( $sock, "$command\r\n$val\r\n" ) ) {
-                       return false;
-               }
-
-               $line = $this->_fgets( $sock );
-
-               if ( $this->_debug ) {
-                       $this->_debugprint( sprintf( "%s %s (%s)\n", $cmd, $key, $line ) );
-               }
-               if ( $line == "STORED" ) {
-                       return true;
-               }
-               return false;
-       }
-
-       // }}}
-       // {{{ sock_to_host()
-
-       /**
-        * Returns the socket for the host
-        *
-        * @param string $host Host:IP to get socket for
-        *
-        * @return Resource|bool IO Stream or false
-        * @access private
-        */
-       function sock_to_host( $host ) {
-               if ( isset( $this->_cache_sock[$host] ) ) {
-                       return $this->_cache_sock[$host];
-               }
-
-               $sock = null;
-               $now = time();
-               list( $ip, /* $port */) = explode( ':', $host );
-               if ( isset( $this->_host_dead[$host] ) && $this->_host_dead[$host] > $now ||
-                       isset( $this->_host_dead[$ip] ) && $this->_host_dead[$ip] > $now
-               ) {
-                       return null;
-               }
-
-               if ( !$this->_connect_sock( $sock, $host ) ) {
-                       return null;
-               }
-
-               // Do not buffer writes
-               stream_set_write_buffer( $sock, 0 );
-
-               $this->_cache_sock[$host] = $sock;
-
-               return $this->_cache_sock[$host];
-       }
-
-       /**
-        * @param string $text
-        */
-       function _debugprint( $text ) {
-               $this->_logger->debug( $text );
-       }
-
-       /**
-        * @param string $text
-        */
-       function _error_log( $text ) {
-               $this->_logger->error( "Memcached error: $text" );
-       }
-
-       /**
-        * Write to a stream. If there is an error, mark the socket dead.
-        *
-        * @param Resource $sock The socket
-        * @param string $buf The string to write
-        * @return bool True on success, false on failure
-        */
-       function _fwrite( $sock, $buf ) {
-               $bytesWritten = 0;
-               $bufSize = strlen( $buf );
-               while ( $bytesWritten < $bufSize ) {
-                       $result = fwrite( $sock, $buf );
-                       $data = stream_get_meta_data( $sock );
-                       if ( $data['timed_out'] ) {
-                               $this->_handle_error( $sock, 'timeout writing to $1' );
-                               return false;
-                       }
-                       // Contrary to the documentation, fwrite() returns zero on error in PHP 5.3.
-                       if ( $result === false || $result === 0 ) {
-                               $this->_handle_error( $sock, 'error writing to $1' );
-                               return false;
-                       }
-                       $bytesWritten += $result;
-               }
-
-               return true;
-       }
-
-       /**
-        * Handle an I/O error. Mark the socket dead and log an error.
-        *
-        * @param Resource $sock
-        * @param string $msg
-        */
-       function _handle_error( $sock, $msg ) {
-               $peer = stream_socket_get_name( $sock, true /** remote **/ );
-               if ( strval( $peer ) === '' ) {
-                       $peer = array_search( $sock, $this->_cache_sock );
-                       if ( $peer === false ) {
-                               $peer = '[unknown host]';
-                       }
-               }
-               $msg = str_replace( '$1', $peer, $msg );
-               $this->_error_log( "$msg\n" );
-               $this->_dead_sock( $sock );
-       }
-
-       /**
-        * Read the specified number of bytes from a stream. If there is an error,
-        * mark the socket dead.
-        *
-        * @param Resource $sock The socket
-        * @param int $len The number of bytes to read
-        * @return string|bool The string on success, false on failure.
-        */
-       function _fread( $sock, $len ) {
-               $buf = '';
-               while ( $len > 0 ) {
-                       $result = fread( $sock, $len );
-                       $data = stream_get_meta_data( $sock );
-                       if ( $data['timed_out'] ) {
-                               $this->_handle_error( $sock, 'timeout reading from $1' );
-                               return false;
-                       }
-                       if ( $result === false ) {
-                               $this->_handle_error( $sock, 'error reading buffer from $1' );
-                               return false;
-                       }
-                       if ( $result === '' ) {
-                               // This will happen if the remote end of the socket is shut down
-                               $this->_handle_error( $sock, 'unexpected end of file reading from $1' );
-                               return false;
-                       }
-                       $len -= strlen( $result );
-                       $buf .= $result;
-               }
-               return $buf;
-       }
-
-       /**
-        * Read a line from a stream. If there is an error, mark the socket dead.
-        * The \r\n line ending is stripped from the response.
-        *
-        * @param Resource $sock The socket
-        * @return string|bool The string on success, false on failure
-        */
-       function _fgets( $sock ) {
-               $result = fgets( $sock );
-               // fgets() may return a partial line if there is a select timeout after
-               // a successful recv(), so we have to check for a timeout even if we
-               // got a string response.
-               $data = stream_get_meta_data( $sock );
-               if ( $data['timed_out'] ) {
-                       $this->_handle_error( $sock, 'timeout reading line from $1' );
-                       return false;
-               }
-               if ( $result === false ) {
-                       $this->_handle_error( $sock, 'error reading line from $1' );
-                       return false;
-               }
-               if ( substr( $result, -2 ) === "\r\n" ) {
-                       $result = substr( $result, 0, -2 );
-               } elseif ( substr( $result, -1 ) === "\n" ) {
-                       $result = substr( $result, 0, -1 );
-               } else {
-                       $this->_handle_error( $sock, 'line ending missing in response from $1' );
-                       return false;
-               }
-               return $result;
-       }
-
-       /**
-        * Flush the read buffer of a stream
-        * @param Resource $f
-        */
-       function _flush_read_buffer( $f ) {
-               if ( !is_resource( $f ) ) {
-                       return;
-               }
-               $r = array( $f );
-               $w = null;
-               $e = null;
-               $n = stream_select( $r, $w, $e, 0, 0 );
-               while ( $n == 1 && !feof( $f ) ) {
-                       fread( $f, 1024 );
-                       $r = array( $f );
-                       $w = null;
-                       $e = null;
-                       $n = stream_select( $r, $w, $e, 0, 0 );
-               }
-       }
-
-       // }}}
-       // }}}
-       // }}}
-}
-
-// }}}
-
-class MemCachedClientforWiki extends MWMemcached {
-}
index 365236d..aa21cbb 100644 (file)
@@ -43,7 +43,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         *                          values, but serialization is much slower unless the php.ini option
         *                          igbinary.compact_strings is off.
         * @param array $params
-        * @throws MWException
+        * @throws InvalidArgumentException
         */
        function __construct( $params ) {
                parent::__construct( $params );
@@ -89,7 +89,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                // 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
+               // forwards compatibility would require MemcachedClient::get_sock() to be
                // rewritten.
                $this->client->setOption( Memcached::OPT_LIBKETAMA_COMPATIBLE, true );
 
@@ -100,13 +100,17 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
                                break;
                        case 'igbinary':
                                if ( !Memcached::HAVE_IGBINARY ) {
-                                       throw new MWException( __CLASS__ . ': the igbinary extension is not available ' .
-                                               'but igbinary serialization was requested.' );
+                                       throw new InvalidArgumentException(
+                                               __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' );
+                               throw new InvalidArgumentException(
+                                       __CLASS__ . ': invalid value for serializer parameter'
+                               );
                }
                $servers = array();
                foreach ( $params['servers'] as $host ) {
@@ -117,7 +121,7 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                $this->debugLog( "get($key)" );
-               $result = $this->client->get( $this->encodeKey( $key ), null, $casToken );
+               $result = $this->client->get( $this->validateKeyEncoding( $key ), null, $casToken );
                $result = $this->checkResult( $key, $result );
                return $result;
        }
@@ -202,14 +206,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
 
        public function getMulti( array $keys, $flags = 0 ) {
                $this->debugLog( 'getMulti(' . implode( ', ', $keys ) . ')' );
-               $callback = array( $this, 'encodeKey' );
-               $encodedResult = $this->client->getMulti( array_map( $callback, $keys ) );
-               $encodedResult = $encodedResult ?: array(); // must be an array
-               $result = array();
-               foreach ( $encodedResult as $key => $value ) {
-                       $key = $this->decodeKey( $key );
-                       $result[$key] = $value;
+               foreach ( $keys as $key ) {
+                       $this->validateKeyEncoding( $key );
                }
+               $result = $this->client->getMulti( $keys ) ?: array();
                return $this->checkResult( false, $result );
        }
 
@@ -219,14 +219,10 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @return bool
         */
        public function setMulti( array $data, $exptime = 0 ) {
-               foreach ( $data as $key => $value ) {
-                       $encKey = $this->encodeKey( $key );
-                       if ( $encKey !== $key ) {
-                               $data[$encKey] = $value;
-                               unset( $data[$key] );
-                       }
-               }
                $this->debugLog( 'setMulti(' . implode( ', ', array_keys( $data ) ) . ')' );
+               foreach ( array_keys( $data ) as $key ) {
+                       $this->validateKeyEncoding( $key );
+               }
                $result = $this->client->setMulti( $data, $this->fixExpiry( $exptime ) );
                return $this->checkResult( false, $result );
        }
diff --git a/includes/objectcache/MemcachedPhpBagOStuff.php b/includes/objectcache/MemcachedPhpBagOStuff.php
deleted file mode 100644 (file)
index 6f0ba58..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-<?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 MemcachedBagOStuff {
-
-       /**
-        * Constructor.
-        *
-        * Available parameters are:
-        *   - servers:             The list of IP:port combinations holding the memcached servers.
-        *   - debug:               Whether to set the debug flag in the underlying client.
-        *   - 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
-        *
-        * @param array $params
-        */
-       function __construct( $params ) {
-               parent::__construct( $params );
-               $params = $this->applyDefaultParams( $params );
-
-               $this->client = new MemCachedClientforWiki( $params );
-               $this->client->set_servers( $params['servers'] );
-               $this->client->set_debug( $params['debug'] );
-       }
-
-       /**
-        * @param bool $debug
-        */
-       public function setDebug( $debug ) {
-               $this->client->set_debug( $debug );
-       }
-
-       public function getMulti( array $keys, $flags = 0 ) {
-               $callback = array( $this, 'encodeKey' );
-               $encodedResult = $this->client->get_multi( array_map( $callback, $keys ) );
-               $result = array();
-               foreach ( $encodedResult as $key => $value ) {
-                       $key = $this->decodeKey( $key );
-                       $result[$key] = $value;
-               }
-               return $result;
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
-       public function incr( $key, $value = 1 ) {
-               return $this->client->incr( $this->encodeKey( $key ), $value );
-       }
-
-       /**
-        * @param string $key
-        * @param int $value
-        * @return mixed
-        */
-       public function decr( $key, $value = 1 ) {
-               return $this->client->decr( $this->encodeKey( $key ), $value );
-       }
-}
diff --git a/includes/objectcache/MultiWriteBagOStuff.php b/includes/objectcache/MultiWriteBagOStuff.php
deleted file mode 100644 (file)
index 73bdabd..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-<?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 BagOStuff[] */
-       protected $caches;
-       /** @var bool Use async secondary writes */
-       protected $asyncWrites = false;
-       /** @var callback|null */
-       protected $asyncHandler;
-
-       /** Idiom for "write to all backends" */
-       const ALL = INF;
-
-       const UPGRADE_TTL = 3600; // TTL when a key is copied to a higher cache tier
-
-       /**
-        * $params include:
-        *   - caches: A numbered array of either ObjectFactory::getObjectFromSpec
-        *      arrays yeilding BagOStuff objects or direct BagOStuff objects.
-        *      If using the former, the 'args' field *must* be set.
-        *      The first cache is the primary one, being the first to
-        *      be read in the fallback chain. Writes happen to all stores
-        *      in the order they are defined. However, lock()/unlock() calls
-        *      only use the primary store.
-        *   - replication: Either 'sync' or 'async'. This controls whether writes
-        *      to secondary stores are deferred when possible. Async writes
-        *      require setting 'asyncCallback'. HHVM register_postsend_function() function.
-        *      Async writes can increase the chance of some race conditions
-        *      or cause keys to expire seconds later than expected. It is
-        *      safe to use for modules when cached values: are immutable,
-        *      invalidation uses logical TTLs, invalidation uses etag/timestamp
-        *      validation against the DB, or merge() is used to handle races.
-        *   - asyncHandler: callable that takes a callback and runs it after the
-        *      current web request ends. In CLI mode, it should run it immediately.
-        * @param array $params
-        * @throws InvalidArgumentException
-        */
-       public function __construct( $params ) {
-               parent::__construct( $params );
-
-               if ( empty( $params['caches'] ) || !is_array( $params['caches'] ) ) {
-                       throw new InvalidArgumentException(
-                               __METHOD__ . ': "caches" parameter must be an array of caches'
-                       );
-               }
-
-               $this->caches = array();
-               foreach ( $params['caches'] as $cacheInfo ) {
-                       if ( $cacheInfo instanceof BagOStuff ) {
-                               $this->caches[] = $cacheInfo;
-                       } else {
-                               if ( !isset( $cacheInfo['args'] ) ) {
-                                       // B/C for when $cacheInfo was for ObjectCache::newFromParams().
-                                       // Callers intenting this to be for ObjectFactory::getObjectFromSpec
-                                       // should have set "args" per the docs above. Doings so avoids extra
-                                       // (likely harmless) params (factory/class/calls) ending up in "args".
-                                       $cacheInfo['args'] = array( $cacheInfo );
-                               }
-                               $this->caches[] = ObjectFactory::getObjectFromSpec( $cacheInfo );
-                       }
-               }
-
-               $this->asyncHandler = isset( $params['asyncHandler'] )
-                       ? $params['asyncHandler']
-                       : null;
-               $this->asyncWrites = (
-                       isset( $params['replication'] ) &&
-                       $params['replication'] === 'async' &&
-                       is_callable( $this->asyncHandler )
-               );
-       }
-
-       public function setDebug( $debug ) {
-               foreach ( $this->caches as $cache ) {
-                       $cache->setDebug( $debug );
-               }
-       }
-
-       protected function doGet( $key, $flags = 0 ) {
-               if ( ( $flags & self::READ_LATEST ) == self::READ_LATEST ) {
-                       // If the latest write was a delete(), we do NOT want to fallback
-                       // to the other tiers and possibly see the old value. Also, this
-                       // is used by mergeViaLock(), which only needs to hit the primary.
-                       return $this->caches[0]->get( $key, $flags );
-               }
-
-               $misses = 0; // number backends checked
-               $value = false;
-               foreach ( $this->caches as $cache ) {
-                       $value = $cache->get( $key, $flags );
-                       if ( $value !== false ) {
-                               break;
-                       }
-                       ++$misses;
-               }
-
-               if ( $value !== false
-                       && $misses > 0
-                       && ( $flags & self::READ_VERIFIED ) == self::READ_VERIFIED
-               ) {
-                       $this->doWrite( $misses, $this->asyncWrites, 'set', $key, $value, self::UPGRADE_TTL );
-               }
-
-               return $value;
-       }
-
-       public function set( $key, $value, $exptime = 0, $flags = 0 ) {
-               $asyncWrites = ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC )
-                       ? false
-                       : $this->asyncWrites;
-
-               return $this->doWrite( self::ALL, $asyncWrites, 'set', $key, $value, $exptime );
-       }
-
-       public function delete( $key ) {
-               return $this->doWrite( self::ALL, $this->asyncWrites, 'delete', $key );
-       }
-
-       public function add( $key, $value, $exptime = 0 ) {
-               return $this->doWrite( self::ALL, $this->asyncWrites, 'add', $key, $value, $exptime );
-       }
-
-       public function incr( $key, $value = 1 ) {
-               return $this->doWrite( self::ALL, $this->asyncWrites, 'incr', $key, $value );
-       }
-
-       public function decr( $key, $value = 1 ) {
-               return $this->doWrite( self::ALL, $this->asyncWrites, 'decr', $key, $value );
-       }
-
-       public function lock( $key, $timeout = 6, $expiry = 6, $rclass = '' ) {
-               // Only need to lock the first cache; also avoids deadlocks
-               return $this->caches[0]->lock( $key, $timeout, $expiry, $rclass );
-       }
-
-       public function unlock( $key ) {
-               // Only the first cache is locked
-               return $this->caches[0]->unlock( $key );
-       }
-
-       public function getLastError() {
-               return $this->caches[0]->getLastError();
-       }
-
-       public function clearLastError() {
-               $this->caches[0]->clearLastError();
-       }
-
-       /**
-        * Apply a write method to the first $count backing caches
-        *
-        * @param integer $count
-        * @param bool $asyncWrites
-        * @param string $method
-        * @param mixed ...
-        * @return bool
-        */
-       protected function doWrite( $count, $asyncWrites, $method /*, ... */ ) {
-               $ret = true;
-               $args = array_slice( func_get_args(), 3 );
-
-               foreach ( $this->caches as $i => $cache ) {
-                       if ( $i >= $count ) {
-                               break; // ignore the lower tiers
-                       }
-
-                       if ( $i == 0 || !$asyncWrites ) {
-                               // First store or in sync mode: write now and get result
-                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
-                                       $ret = false;
-                               }
-                       } else {
-                               // Secondary write in async mode: do not block this HTTP request
-                               $logger = $this->logger;
-                               call_user_func(
-                                       $this->asyncHandler,
-                                       function () use ( $cache, $method, $args, $logger ) {
-                                               if ( !call_user_func_array( array( $cache, $method ), $args ) ) {
-                                                       $logger->warning( "Async $method op failed" );
-                                               }
-                                       }
-                               );
-                       }
-               }
-
-               return $ret;
-       }
-
-       /**
-        * Delete objects expiring before a certain date.
-        *
-        * Succeed if any of the child caches succeed.
-        * @param string $date
-        * @param bool|callable $progressCallback
-        * @return bool
-        */
-       public function deleteObjectsExpiringBefore( $date, $progressCallback = false ) {
-               $ret = false;
-               foreach ( $this->caches as $cache ) {
-                       if ( $cache->deleteObjectsExpiringBefore( $date, $progressCallback ) ) {
-                               $ret = true;
-                       }
-               }
-
-               return $ret;
-       }
-}
index 151bb06..90a9f7c 100644 (file)
@@ -42,30 +42,32 @@ use MediaWiki\Logger\LoggerFactory;
  *
  * Primary entry points:
  *
- * - ObjectCache::newAccelerator( $fallbackType )
- *   Purpose: Cache for very hot keys.
- *   Stored only on the individual web server.
- *   Not associated with other servers.
- *
  * - ObjectCache::getMainWANInstance()
- *   Purpose: Cache.
- *   Stored in the local data-center's main cache (uses different cache keys).
- *   Delete events are broadcasted to other DCs. See WANObjectCache for details.
+ *   Purpose: Memory cache.
+ *   Stored in the local data-center's main cache (keyspace different from local-cluster cache).
+ *   Delete events are broadcasted to other DCs main cache. See WANObjectCache for details.
  *
- * - ObjectCache::getMainStashInstance()
- *   Purpose: Ephemeral storage.
- *   Stored centrally within the primary data-center.
- *   Changes are applied there first and replicated to other DCs (best-effort).
- *   To retrieve the latest value (e.g. not from a slave), use BagOStuff:READ_LATEST.
- *   This store may be subject to LRU style evictions.
+ * - ObjectCache::getLocalServerInstance( $fallbackType )
+ *   Purpose: Memory cache for very hot keys.
+ *   Stored only on the individual web server (typically APC for web requests,
+ *   and EmptyBagOStuff in CLI mode).
+ *   Not replicated to the other servers.
  *
  * - ObjectCache::getLocalClusterInstance()
  *   Purpose: Memory storage for per-cluster coordination and tracking.
  *   A typical use case would be a rate limit counter or cache regeneration mutex.
  *   Stored centrally within the local data-center. Not replicated to other DCs.
- *   Also known as $wgMemc. Configured by $wgMainCacheType.
+ *   Configured by $wgMainCacheType.
  *
- * - wfGetCache( $cacheType )
+ * - ObjectCache::getMainStashInstance()
+ *   Purpose: Ephemeral global storage.
+ *   Stored centrally within the primary data-center.
+ *   Changes are applied there first and replicated to other DCs (best-effort).
+ *   To retrieve the latest value (e.g. not from a slave), use BagOStuff::READ_LATEST.
+ *   This store may be subject to LRU style evictions.
+ *
+ * - ObjectCache::getInstance( $cacheType )
+ *   Purpose: Special cases (like tiered memory/disk caches).
  *   Get a specific cache type by key in $wgObjectCaches.
  *
  * All the above cache instances (BagOStuff and WANObjectCache) have their makeKey()
@@ -137,19 +139,14 @@ class ObjectCache {
         * @return string
         */
        public static function getDefaultKeyspace() {
-               global $wgCachePrefix, $wgDBname, $wgDBprefix;
+               global $wgCachePrefix;
 
                $keyspace = $wgCachePrefix;
                if ( is_string( $keyspace ) && $keyspace !== '' ) {
                        return $keyspace;
                }
 
-               $keyspace = $wgDBname;
-               if ( is_string( $wgDBprefix ) && $wgDBprefix !== '' ) {
-                       $keyspace .= '-' . $wgDBprefix;
-               }
-
-               return $keyspace;
+               return wfWikiID();
        }
 
        /**
@@ -167,8 +164,6 @@ class ObjectCache {
                if ( isset( $params['loggroup'] ) ) {
                        $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
                } else {
-                       // For backwards-compatability with custom parameters, lets not
-                       // have all logging suddenly disappear
                        $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
                }
                if ( !isset( $params['keyspace'] ) ) {
@@ -178,8 +173,26 @@ class ObjectCache {
                        return call_user_func( $params['factory'], $params );
                } elseif ( isset( $params['class'] ) ) {
                        $class = $params['class'];
-                       if ( $class === 'MultiWriteBagOStuff' && !isset( $params['asyncHandler'] ) ) {
-                               $params['asyncHandler'] = 'DeferredUpdates::addCallableUpdate';
+                       // Automatically set the 'async' update handler
+                       if ( $class === 'MultiWriteBagOStuff' ) {
+                               $params['asyncHandler'] = isset( $params['asyncHandler'] )
+                                       ? $params['asyncHandler']
+                                       : 'DeferredUpdates::addCallableUpdate';
+                       }
+                       // Do b/c logic for MemcachedBagOStuff
+                       if ( is_subclass_of( $class, 'MemcachedBagOStuff' ) ) {
+                               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['timeout'] ) ) {
+                                       $params['timeout'] = $GLOBALS['wgMemCachedTimeout'];
+                               }
                        }
                        return new $class( $params );
                } else {
@@ -220,26 +233,17 @@ class ObjectCache {
         * A fallback cache can be specified if none is found.
         *
         *     // Direct calls
-        *     ObjectCache::newAccelerator( $fallbackType );
+        *     ObjectCache::getLocalServerInstance( $fallbackType );
         *
         *     // From $wgObjectCaches via newFromParams()
-        *     ObjectCache::newAccelerator( array( 'fallback' => $fallbackType ) );
+        *     ObjectCache::getLocalServerInstance( array( 'fallback' => $fallbackType ) );
         *
-        * @param array $params [optional] Array key 'fallback' for $fallback.
-        * @param int|string $fallback Fallback cache, e.g. (CACHE_NONE, "hash") (since 1.24)
+        * @param int|string|array $fallback Fallback cache or parameter map with 'fallback'
         * @return BagOStuff
         * @throws MWException
+        * @since 1.27
         */
-       public static function newAccelerator( $params = array(), $fallback = null ) {
-               if ( $fallback === null ) {
-                       // The is_array check here is needed because in PHP 5.3:
-                       // $a = 'hash'; isset( $params['fallback'] ); yields true
-                       if ( is_array( $params ) && isset( $params['fallback'] ) ) {
-                               $fallback = $params['fallback'];
-                       } elseif ( !is_array( $params ) ) {
-                               $fallback = $params;
-                       }
-               }
+       public static function getLocalServerInstance( $fallback = CACHE_NONE ) {
                if ( function_exists( 'apc_fetch' ) ) {
                        $id = 'apc';
                } elseif ( function_exists( 'xcache_get' ) && wfIniGetBool( 'xcache.var_size' ) ) {
@@ -247,27 +251,34 @@ class ObjectCache {
                } elseif ( function_exists( 'wincache_ucache_get' ) ) {
                        $id = 'wincache';
                } else {
-                       if ( $fallback === null ) {
-                               throw new MWException( 'CACHE_ACCEL requested but no suitable object ' .
-                                       'cache is present. You may want to install APC.' );
+                       if ( is_array( $fallback ) ) {
+                               $id = isset( $fallback['fallback'] ) ? $fallback['fallback'] : CACHE_NONE;
+                       } else {
+                               $id = $fallback;
                        }
-                       $id = $fallback;
                }
-               return self::newFromId( $id );
+
+               return self::getInstance( $id );
        }
 
        /**
-        * Factory function that creates a memcached client object.
-        *
-        * 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 disastrous.
-        *
-        * @param array $params
-        * @return MemcachedPhpBagOStuff
+        * @param array $params [optional] Array key 'fallback' for $fallback.
+        * @param int|string $fallback Fallback cache, e.g. (CACHE_NONE, "hash") (since 1.24)
+        * @return BagOStuff
+        * @deprecated 1.27
         */
-       public static function newMemcached( $params ) {
-               return new MemcachedPhpBagOStuff( $params );
+       public static function newAccelerator( $params = array(), $fallback = null ) {
+               if ( $fallback === null ) {
+                       // The is_array check here is needed because in PHP 5.3:
+                       // $a = 'hash'; isset( $params['fallback'] ); yields true
+                       if ( is_array( $params ) && isset( $params['fallback'] ) ) {
+                               $fallback = $params['fallback'];
+                       } elseif ( !is_array( $params ) ) {
+                               $fallback = $params;
+                       }
+               }
+
+               return self::getLocalServerInstance( $fallback );
        }
 
        /**
@@ -290,6 +301,11 @@ class ObjectCache {
                $class = $params['relayerConfig']['class'];
                $params['relayer'] = new $class( $params['relayerConfig'] );
                $params['cache'] = self::newFromId( $params['cacheId'] );
+               if ( isset( $params['loggroup'] ) ) {
+                       $params['logger'] = LoggerFactory::getInstance( $params['loggroup'] );
+               } else {
+                       $params['logger'] = LoggerFactory::getInstance( 'objectcache' );
+               }
                $class = $params['class'];
 
                return new $class( $params );
index 2a5d695..cc85074 100644 (file)
@@ -47,7 +47,7 @@ class ObjectCacheSessionHandler {
 
                // It's necessary to register a shutdown function to call session_write_close(),
                // because by the time the request shutdown function for the session module is
-               // called, $wgMemc has already been destroyed. Shutdown functions registered
+               // called, the BagOStuff has already been destroyed. Shutdown functions registered
                // this way are called before object destruction.
                register_shutdown_function( array( __CLASS__, 'handleShutdown' ) );
        }
index 1f384c7..5776519 100644 (file)
  * @ingroup Cache
  */
 class SqlBagOStuff extends BagOStuff {
-       /** @var LoadBalancer */
-       protected $lb;
-
        /** @var array */
        protected $serverInfos;
-
        /** @var array */
        protected $serverNames;
-
        /** @var int */
        protected $numServers;
-
-       /** @var array */
-       protected $conns;
-
        /** @var int */
        protected $lastExpireAll = 0;
-
        /** @var int */
        protected $purgePeriod = 100;
-
        /** @var int */
        protected $shards = 1;
-
        /** @var string */
        protected $tableName = 'objectcache';
-
        /** @var bool */
        protected $slaveOnly = false;
+       /** @var int */
+       protected $syncTimeout = 3;
 
+       /** @var array */
+       protected $conns;
        /** @var array UNIX timestamps */
        protected $connFailureTimes = array();
-
        /** @var array Exceptions */
        protected $connFailureErrors = array();
 
@@ -92,6 +82,7 @@ class SqlBagOStuff extends BagOStuff {
         *                  garbage collection logic of expired items. This only
         *                  makes sense if the primary DB is used and only if get()
         *                  calls will be used. This is used by ReplicatedBagOStuff.
+        *   - syncTimeout: Max seconds to wait for slaves to catch up for WRITE_SYNC.
         *
         * @param array $params
         */
@@ -120,6 +111,9 @@ class SqlBagOStuff extends BagOStuff {
                if ( isset( $params['shards'] ) ) {
                        $this->shards = intval( $params['shards'] );
                }
+               if ( isset( $params['syncTimeout'] ) ) {
+                       $this->syncTimeout = $params['syncTimeout'];
+               }
                $this->slaveOnly = !empty( $params['slaveOnly'] );
        }
 
@@ -154,15 +148,13 @@ class SqlBagOStuff extends BagOStuff {
                                $db = DatabaseBase::factory( $type, $info );
                                $db->clearFlag( DBO_TRX );
                        } else {
-                               /*
-                                * We must keep a separate connection to MySQL in order to avoid deadlocks
-                                * However, SQLite has an opposite behavior. And PostgreSQL needs to know
-                                * if we are in transaction or no
-                                */
+                               // We must keep a separate connection to MySQL in order to avoid deadlocks
+                               // However, SQLite has an opposite behavior. And PostgreSQL needs to know
+                               // if we are in transaction or not (@TODO: find some work-around).
                                $index = $this->slaveOnly ? DB_SLAVE : DB_MASTER;
                                if ( wfGetDB( $index )->getType() == 'mysql' ) {
-                                       $this->lb = wfGetLBFactory()->newMainLB();
-                                       $db = $this->lb->getConnection( $index );
+                                       $lb = wfGetLBFactory()->newMainLB();
+                                       $db = $lb->getConnection( $index );
                                        $db->clearFlag( DBO_TRX ); // auto-commit mode
                                } else {
                                        $db = wfGetDB( $index );
@@ -349,7 +341,12 @@ class SqlBagOStuff extends BagOStuff {
        }
 
        public function set( $key, $value, $exptime = 0, $flags = 0 ) {
-               return $this->setMulti( array( $key => $value ), $exptime );
+               $ok = $this->setMulti( array( $key => $value ), $exptime );
+               if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+                       $ok = $ok && $this->waitForSlaves();
+               }
+
+               return $ok;
        }
 
        protected function cas( $casToken, $key, $value, $exptime = 0 ) {
@@ -457,7 +454,12 @@ class SqlBagOStuff extends BagOStuff {
                        throw new Exception( "Got invalid callback." );
                }
 
-               return $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+               $ok = $this->mergeViaCas( $key, $callback, $exptime, $attempts );
+               if ( ( $flags & self::WRITE_SYNC ) == self::WRITE_SYNC ) {
+                       $ok = $ok && $this->waitForSlaves();
+               }
+
+               return $ok;
        }
 
        /**
@@ -729,4 +731,14 @@ class SqlBagOStuff extends BagOStuff {
                        }
                }
        }
+
+       protected function waitForSlaves() {
+               if ( !$this->serverInfos ) {
+                       // Main LB is used; wait for any slaves to catch up
+                       return wfWaitForSlaves( null, false, false, $this->syncTimeout );
+               } else {
+                       // Custom DB server list; probably doesn't use replication
+                       return true;
+               }
+       }
 }
index 43b1a47..35621a4 100644 (file)
@@ -696,7 +696,7 @@ class Article implements Page {
 
                                        # Don't cache a dirty ParserOutput object
                                        if ( $poolArticleView->getIsDirty() ) {
-                                               $outputPage->setSquidMaxage( 0 );
+                                               $outputPage->setCdnMaxage( 0 );
                                                $outputPage->addHTML( "<!-- parser cache is expired, " .
                                                        "sending anyway due to pool overload-->\n" );
                                        }
@@ -2088,15 +2088,15 @@ class Article implements Page {
        /**
         * @param string $reason
         * @param bool $suppress
-        * @param int $id
-        * @param bool $commit
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
         * @param string $error
         * @return bool
         */
-       public function doDeleteArticle( $reason, $suppress = false, $id = 0,
-               $commit = true, &$error = ''
+       public function doDeleteArticle(
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = ''
        ) {
-               return $this->mPage->doDeleteArticle( $reason, $suppress, $id, $commit, $error );
+               return $this->mPage->doDeleteArticle( $reason, $suppress, $u1, $u2, $error );
        }
 
        /**
index 7957e65..3638aed 100644 (file)
@@ -1533,7 +1533,7 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        function __construct( $imagePage ) {
                parent::__construct( $imagePage->getContext() );
                $this->mImagePage = $imagePage;
-               $this->mTitle = clone ( $imagePage->getTitle() );
+               $this->mTitle = clone $imagePage->getTitle();
                $this->mTitle->setFragment( '#filehistory' );
                $this->mImg = null;
                $this->mHist = array();
index cdaab1a..f290db8 100644 (file)
@@ -881,7 +881,8 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $row && !is_null( $row->rd_fragment ) && !is_null( $row->rd_interwiki ) ) {
                        $this->mRedirectTarget = Title::makeTitle(
                                $row->rd_namespace, $row->rd_title,
-                               $row->rd_fragment, $row->rd_interwiki );
+                               $row->rd_fragment, $row->rd_interwiki
+                       );
                        return $this->mRedirectTarget;
                }
 
@@ -891,39 +892,54 @@ class WikiPage implements Page, IDBAccessObject {
        }
 
        /**
-        * Insert an entry for this page into the redirect table.
+        * Insert an entry for this page into the redirect table if the content is a redirect
+        *
+        * The database update will be deferred via DeferredUpdates
         *
         * Don't call this function directly unless you know what you're doing.
         * @return Title|null Title object or null if not a redirect
         */
        public function insertRedirect() {
-               // recurse through to only get the final target
                $content = $this->getContent();
                $retval = $content ? $content->getUltimateRedirectTarget() : null;
                if ( !$retval ) {
                        return null;
                }
-               $this->insertRedirectEntry( $retval );
+
+               // Update the DB post-send if the page has not cached since now
+               $that = $this;
+               $latest = $this->getLatest();
+               DeferredUpdates::addCallableUpdate( function() use ( $that, $retval, $latest ) {
+                       $that->insertRedirectEntry( $retval, $latest );
+               } );
+
                return $retval;
        }
 
        /**
-        * Insert or update the redirect table entry for this page to indicate
-        * it redirects to $rt .
+        * Insert or update the redirect table entry for this page to indicate it redirects to $rt
         * @param Title $rt Redirect target
+        * @param int|null $oldLatest Prior page_latest for check and set
         */
-       public function insertRedirectEntry( $rt ) {
+       public function insertRedirectEntry( Title $rt, $oldLatest = null ) {
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace( 'redirect', array( 'rd_from' ),
-                       array(
-                               'rd_from' => $this->getId(),
-                               'rd_namespace' => $rt->getNamespace(),
-                               'rd_title' => $rt->getDBkey(),
-                               'rd_fragment' => $rt->getFragment(),
-                               'rd_interwiki' => $rt->getInterwiki(),
-                       ),
-                       __METHOD__
-               );
+               $dbw->startAtomic( __METHOD__ );
+
+               if ( !$oldLatest || $oldLatest == $this->lockAndGetLatest() ) {
+                       $dbw->replace( 'redirect',
+                               array( 'rd_from' ),
+                               array(
+                                       'rd_from' => $this->getId(),
+                                       'rd_namespace' => $rt->getNamespace(),
+                                       'rd_title' => $rt->getDBkey(),
+                                       'rd_fragment' => $rt->getFragment(),
+                                       'rd_interwiki' => $rt->getInterwiki(),
+                               ),
+                               __METHOD__
+                       );
+               }
+
+               $dbw->endAtomic( __METHOD__ );
        }
 
        /**
@@ -1027,55 +1043,6 @@ class WikiPage implements Page, IDBAccessObject {
                return new UserArrayFromResult( $res );
        }
 
-       /**
-        * Get the last N authors
-        * @param int $num Number of revisions to get
-        * @param int|string $revLatest The latest rev_id, selected from the master (optional)
-        * @return array Array of authors, duplicates not removed
-        */
-       public function getLastNAuthors( $num, $revLatest = 0 ) {
-               // First try the slave
-               // If that doesn't have the latest revision, try the master
-               $continue = 2;
-               $db = wfGetDB( DB_SLAVE );
-
-               do {
-                       $res = $db->select( array( 'page', 'revision' ),
-                               array( 'rev_id', 'rev_user_text' ),
-                               array(
-                                       'page_namespace' => $this->mTitle->getNamespace(),
-                                       'page_title' => $this->mTitle->getDBkey(),
-                                       'rev_page = page_id'
-                               ), __METHOD__,
-                               array(
-                                       'ORDER BY' => 'rev_timestamp DESC',
-                                       'LIMIT' => $num
-                               )
-                       );
-
-                       if ( !$res ) {
-                               return array();
-                       }
-
-                       $row = $db->fetchObject( $res );
-
-                       if ( $continue == 2 && $revLatest && $row->rev_id != $revLatest ) {
-                               $db = wfGetDB( DB_MASTER );
-                               $continue--;
-                       } else {
-                               $continue = 0;
-                       }
-               } while ( $continue );
-
-               $authors = array( $row->rev_user_text );
-
-               foreach ( $res as $row ) {
-                       $authors[] = $row->rev_user_text;
-               }
-
-               return $authors;
-       }
-
        /**
         * Should the parser cache be used?
         *
@@ -1092,7 +1059,9 @@ class WikiPage implements Page, IDBAccessObject {
 
        /**
         * Get a ParserOutput for the given ParserOptions and revision ID.
-        * The parser cache will be used if possible.
+        *
+        * The parser cache will be used if possible. Cache misses that result
+        * in parser runs are debounced with PoolCounter.
         *
         * @since 1.19
         * @param ParserOptions $parserOptions ParserOptions to use for the parse operation
@@ -1158,16 +1127,16 @@ class WikiPage implements Page, IDBAccessObject {
 
                $title = $this->mTitle;
                wfGetDB( DB_MASTER )->onTransactionIdle( function() use ( $title ) {
-                       global $wgUseSquid;
                        // Invalidate the cache in auto-commit mode
                        $title->invalidateCache();
-                       if ( $wgUseSquid ) {
-                               // Send purge now that page_touched update was committed above
-                               $update = new SquidUpdate( $title->getSquidURLs() );
-                               $update->doUpdate();
-                       }
                } );
 
+               // Send purge after above page_touched update was committed
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $title->getCdnUrls() ),
+                       DeferredUpdates::PRESEND
+               );
+
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
                        // @todo move this logic to MessageCache
                        if ( $this->exists() ) {
@@ -1240,7 +1209,7 @@ class WikiPage implements Page, IDBAccessObject {
         *   Giving 0 indicates the new page flag should be set on.
         * @param bool $lastRevIsRedirect If given, will optimize adding and
         *   removing rows in redirect table.
-        * @return bool True on success, false on failure
+        * @return bool Success; false if the page row was missing or page_latest changed
         */
        public function updateRevisionOn( $dbw, $revision, $lastRevision = null,
                $lastRevIsRedirect = null
@@ -1381,7 +1350,7 @@ class WikiPage implements Page, IDBAccessObject {
         * must exist and must not be deleted
         * @param Revision $undo
         * @param Revision $undoafter Must be an earlier revision than $undo
-        * @return mixed String on success, false on failure
+        * @return Content|bool Content on success, false on failure
         * @since 1.21
         * Before we had the Content object, this was done in getUndoText
         */
@@ -1694,247 +1663,208 @@ class WikiPage implements Page, IDBAccessObject {
         * @since 1.21
         * @throws MWException
         */
-       public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
+       public function doEditContent(
+               Content $content, $summary, $flags = 0, $baseRevId = false,
                User $user = null, $serialFormat = null
        ) {
-               global $wgUser, $wgUseAutomaticEditSummaries, $wgUseRCPatrol, $wgUseNPPatrol;
+               global $wgUser, $wgUseAutomaticEditSummaries;
 
                // Low-level sanity check
                if ( $this->mTitle->getText() === '' ) {
                        throw new MWException( 'Something is trying to edit an article with an empty title' );
                }
-
-               if ( !$content->getContentHandler()->canBeUsedOn( $this->getTitle() ) ) {
+               // Make sure the given content type is allowed for this page
+               if ( !$content->getContentHandler()->canBeUsedOn( $this->mTitle ) ) {
                        return Status::newFatal( 'content-not-allowed-here',
                                ContentHandler::getLocalizedName( $content->getModel() ),
-                               $this->getTitle()->getPrefixedText() );
+                               $this->mTitle->getPrefixedText()
+                       );
                }
 
-               $user = is_null( $user ) ? $wgUser : $user;
-               $status = Status::newGood( array() );
-
                // 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' );
 
+               $user = $user ?: $wgUser;
                $flags = $this->checkFlags( $flags );
 
-               // handle hook
+               // Trigger pre-save hook (using provided edit summary)
+               $hookStatus = Status::newGood( array() );
                $hook_args = array( &$this, &$user, &$content, &$summary,
-                                                       $flags & EDIT_MINOR, null, null, &$flags, &$status );
-
+                                                       $flags & EDIT_MINOR, null, null, &$flags, &$hookStatus );
+               // Check if the hook rejected the attempted save
                if ( !Hooks::run( 'PageContentSave', $hook_args )
-                       || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args ) ) {
-
-                       wfDebug( __METHOD__ . ": ArticleSave or ArticleSaveContent hook aborted save!\n" );
-
-                       if ( $status->isOK() ) {
-                               $status->fatal( 'edit-hook-aborted' );
+                       || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args )
+               ) {
+                       if ( $hookStatus->isOK() ) {
+                               // Hook returned false but didn't call fatal(); use generic message
+                               $hookStatus->fatal( 'edit-hook-aborted' );
                        }
 
-                       return $status;
+                       return $hookStatus;
                }
 
-               // Silently ignore EDIT_MINOR if not allowed
-               $isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
-               $bot = $flags & EDIT_FORCE_BOT;
-
+               $old_revision = $this->getRevision(); // current revision
                $old_content = $this->getContent( Revision::RAW ); // current revision's content
 
-               $oldsize = $old_content ? $old_content->getSize() : 0;
-               $oldid = $this->getLatest();
-               $oldIsRedirect = $this->isRedirect();
-               $oldcountable = $this->isCountable();
-
-               $handler = $content->getContentHandler();
-
-               // Provide autosummaries if one is not provided and autosummaries are enabled.
-               if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
-                       if ( !$old_content ) {
-                               $old_content = null;
-                       }
+               // Provide autosummaries if one is not provided and autosummaries are enabled
+               if ( $wgUseAutomaticEditSummaries && ( $flags & EDIT_AUTOSUMMARY ) && $summary == '' ) {
+                       $handler = $content->getContentHandler();
                        $summary = $handler->getAutosummary( $old_content, $content, $flags );
                }
 
+               // Get the pre-save transform content and final parser output
                $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialFormat );
-               $serialized = $editInfo->pst;
-
-               /**
-                * @var Content $content
-                */
-               $content = $editInfo->pstContent;
-               $newsize = $content->getSize();
-
-               $dbw = wfGetDB( DB_MASTER );
-               $now = wfTimestampNow();
+               $pstContent = $editInfo->pstContent; // Content object
+               $meta = array(
+                       'bot' => ( $flags & EDIT_FORCE_BOT ),
+                       'minor' => ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' ),
+                       'serialized' => $editInfo->pst,
+                       'serialFormat' => $serialFormat,
+                       'baseRevId' => $baseRevId,
+                       'oldRevision' => $old_revision,
+                       'oldContent' => $old_content,
+                       'oldId' => $this->getLatest(),
+                       'oldIsRedirect' => $this->isRedirect(),
+                       'oldCountable' => $this->isCountable()
+               );
 
+               // Actually create the revision and create/update the page
                if ( $flags & EDIT_UPDATE ) {
-                       // Update article, but only if changed.
-                       $status->value['new'] = false;
-
-                       if ( !$oldid ) {
-                               // Article gone missing
-                               wfDebug( __METHOD__ . ": EDIT_UPDATE specified but article doesn't exist\n" );
-                               $status->fatal( 'edit-gone-missing' );
-
-                               return $status;
-                       } elseif ( !$old_content ) {
-                               // Sanity check for bug 37225
-                               throw new MWException( "Could not find text for current revision {$oldid}." );
-                       }
-
-                       $revision = new Revision( array(
-                               'page'       => $this->getId(),
-                               'title'      => $this->getTitle(), // for determining the default content model
-                               'comment'    => $summary,
-                               'minor_edit' => $isminor,
-                               'text'       => $serialized,
-                               'len'        => $newsize,
-                               'parent_id'  => $oldid,
-                               'user'       => $user->getId(),
-                               'user_text'  => $user->getName(),
-                               'timestamp'  => $now,
-                               'content_model' => $content->getModel(),
-                               'content_format' => $serialFormat,
-                       ) ); // XXX: pass content object?!
-
-                       $changed = !$content->equals( $old_content );
-
-                       if ( $changed ) {
-                               $dbw->begin( __METHOD__ );
-
-                               $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
-                               $status->merge( $prepStatus );
-
-                               if ( !$status->isOK() ) {
-                                       $dbw->rollback( __METHOD__ );
-
-                                       return $status;
-                               }
-                               $revisionId = $revision->insertOn( $dbw );
-
-                               // Update page.
-                               // We check for conflicts by comparing $oldid with the current latest revision ID.
-                               $ok = $this->updateRevisionOn( $dbw, $revision, $oldid, $oldIsRedirect );
+                       $status = $this->doModify( $pstContent, $flags, $user, $summary, $meta );
+               } else {
+                       $status = $this->doCreate( $pstContent, $flags, $user, $summary, $meta );
+               }
 
-                               if ( !$ok ) {
-                                       // Belated edit conflict! Run away!!
-                                       $status->fatal( 'edit-conflict' );
+               // Trigger post-save hook
+               $revision = $status->value['revision']; // new revision
+               $hook_args = array( &$this, &$user, $pstContent, $summary,
+                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
+               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
+               Hooks::run( 'PageContentSaveComplete', $hook_args );
 
-                                       $dbw->rollback( __METHOD__ );
+               // Promote user to any groups they meet the criteria for
+               DeferredUpdates::addCallableUpdate( function () use ( $user ) {
+                       $user->addAutopromoteOnceGroups( 'onEdit' );
+                       $user->addAutopromoteOnceGroups( 'onView' ); // b/c
+               } );
 
-                                       return $status;
-                               }
+               return $status;
+       }
 
-                               Hooks::run( 'NewRevisionFromEditComplete',
-                                       array( $this, $revision, $baseRevId, $user ) );
+       /**
+        * @param Content $content Pre-save transform content
+        * @param integer $flags
+        * @param User $user
+        * @param string $summary
+        * @param array $meta
+        * @return Status
+        * @throws DBUnexpectedError
+        * @throws Exception
+        * @throws FatalError
+        * @throws MWException
+        */
+       private function doModify(
+               Content $content, $flags, User $user, $summary, array $meta
+       ) {
+               global $wgUseRCPatrol;
 
-                               // Update recentchanges
-                               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
-                                       // Mark as patrolled if the user can do so
-                                       $patrolled = $wgUseRCPatrol && !count(
-                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
-                                       // Add RC row to the DB
-                                       RecentChange::notifyEdit(
-                                               $now, $this->mTitle, $isminor, $user, $summary,
-                                               $oldid, $this->getTimestamp(), $bot, '', $oldsize, $newsize,
-                                               $revisionId, $patrolled
-                                       );
-                               }
+               // Update article, but only if changed.
+               $status = Status::newGood( array( 'new' => false, 'revision' => null ) );
 
-                               $user->incEditCount();
+               // Convenience variables
+               $now = wfTimestampNow();
+               $oldid = $meta['oldId'];
+               /** @var $oldContent Content|null */
+               $oldContent = $meta['oldContent'];
+               $newsize = $content->getSize();
 
-                               $dbw->commit( __METHOD__ );
-                               $this->mTimestamp = $now;
-                       } else {
-                               // Bug 32948: revision ID must be set to page {{REVISIONID}} and
-                               // related variables correctly
-                               $revision->setId( $this->getLatest() );
-                       }
+               if ( !$oldid ) {
+                       // Article gone missing
+                       $status->fatal( 'edit-gone-missing' );
 
-                       // Update links tables, site stats, etc.
-                       $this->doEditUpdates(
-                               $revision,
-                               $user,
-                               array(
-                                       'changed' => $changed,
-                                       'oldcountable' => $oldcountable
-                               )
-                       );
+                       return $status;
+               } elseif ( !$oldContent ) {
+                       // Sanity check for bug 37225
+                       throw new MWException( "Could not find text for current revision {$oldid}." );
+               }
 
-                       if ( !$changed ) {
-                               $status->warning( 'edit-no-change' );
-                               $revision = null;
-                               // Update page_touched, this is usually implicit in the page update
-                               // Other cache updates are done in onArticleEdit()
-                               $this->mTitle->invalidateCache( $now );
-                       }
-               } else {
-                       // Create new article
-                       $status->value['new'] = true;
+               // @TODO: pass content object?!
+               $revision = new Revision( array(
+                       'page'       => $this->getId(),
+                       'title'      => $this->mTitle, // for determining the default content model
+                       'comment'    => $summary,
+                       'minor_edit' => $meta['minor'],
+                       'text'       => $meta['serialized'],
+                       'len'        => $newsize,
+                       'parent_id'  => $oldid,
+                       'user'       => $user->getId(),
+                       'user_text'  => $user->getName(),
+                       'timestamp'  => $now,
+                       'content_model' => $content->getModel(),
+                       'content_format' => $meta['serialFormat'],
+               ) );
 
-                       $dbw->begin( __METHOD__ );
+               $changed = !$content->equals( $oldContent );
 
+               if ( $changed ) {
                        $prepStatus = $content->prepareSave( $this, $flags, $oldid, $user );
                        $status->merge( $prepStatus );
-
                        if ( !$status->isOK() ) {
-                               $dbw->rollback( __METHOD__ );
-
                                return $status;
                        }
 
-                       $status->merge( $prepStatus );
-
-                       // Add the page record; stake our claim on this title!
-                       // This will return false if the article already exists
-                       $newid = $this->insertOn( $dbw );
-
-                       if ( $newid === false ) {
-                               $dbw->rollback( __METHOD__ );
-                               $status->fatal( 'edit-already-exists' );
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->begin( __METHOD__ );
+                       // Get the latest page_latest value while locking it.
+                       // Do a CAS style check to see if it's the same as when this method
+                       // started. If it changed then bail out before touching the DB.
+                       $latestNow = $this->lockAndGetLatest();
+                       if ( $latestNow != $oldid ) {
+                               $dbw->commit( __METHOD__ );
+                               // Page updated or deleted in the mean time
+                               $status->fatal( 'edit-conflict' );
 
                                return $status;
                        }
 
-                       // Save the revision text...
-                       $revision = new Revision( array(
-                               'page'       => $newid,
-                               'title'      => $this->getTitle(), // for determining the default content model
-                               'comment'    => $summary,
-                               'minor_edit' => $isminor,
-                               'text'       => $serialized,
-                               'len'        => $newsize,
-                               'user'       => $user->getId(),
-                               'user_text'  => $user->getName(),
-                               'timestamp'  => $now,
-                               'content_model' => $content->getModel(),
-                               'content_format' => $serialFormat,
-                       ) );
-                       $revisionId = $revision->insertOn( $dbw );
-
-                       // Bug 37225: use accessor to get the text as Revision may trim it
-                       $content = $revision->getContent(); // sanity; get normalized version
+                       // At this point we are now comitted to returning an OK
+                       // status unless some DB query error or other exception comes up.
+                       // This way callers don't have to call rollback() if $status is bad
+                       // unless they actually try to catch exceptions (which is rare).
 
-                       if ( $content ) {
-                               $newsize = $content->getSize();
+                       // Save the revision text
+                       $revisionId = $revision->insertOn( $dbw );
+                       // Update page_latest and friends to reflect the new revision
+                       if ( !$this->updateRevisionOn( $dbw, $revision, null, $meta['oldIsRedirect'] ) ) {
+                               $dbw->rollback( __METHOD__ );
+                               throw new MWException( "Failed to update page row to use new revision." );
                        }
 
-                       // Update the page record with revision data
-                       $this->updateRevisionOn( $dbw, $revision, 0 );
-
-                       Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
+                       Hooks::run( 'NewRevisionFromEditComplete',
+                               array( $this, $revision, $meta['baseRevId'], $user ) );
 
                        // Update recentchanges
                        if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
                                // Mark as patrolled if the user can do so
-                               $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) && !count(
-                                       $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                               $patrolled = $wgUseRCPatrol && !count(
+                                               $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
                                // Add RC row to the DB
-                               RecentChange::notifyNew(
-                                       $now, $this->mTitle, $isminor, $user, $summary, $bot,
-                                       '', $newsize, $revisionId, $patrolled
+                               RecentChange::notifyEdit(
+                                       $now,
+                                       $this->mTitle,
+                                       $revision->isMinor(),
+                                       $user,
+                                       $summary,
+                                       $oldid,
+                                       $this->getTimestamp(),
+                                       $meta['bot'],
+                                       '',
+                                       $oldContent ? $oldContent->getSize() : 0,
+                                       $newsize,
+                                       $revisionId,
+                                       $patrolled
                                );
                        }
 
@@ -1942,31 +1872,140 @@ class WikiPage implements Page, IDBAccessObject {
 
                        $dbw->commit( __METHOD__ );
                        $this->mTimestamp = $now;
+               } else {
+                       // Bug 32948: revision ID must be set to page {{REVISIONID}} and
+                       // related variables correctly
+                       $revision->setId( $this->getLatest() );
+               }
+
+               // Update links tables, site stats, etc.
+               $this->doEditUpdates(
+                       $revision,
+                       $user,
+                       array(
+                               'changed' => $changed,
+                               'oldcountable' => $meta['oldCountable'],
+                               'oldrevision' => $meta['oldRevision']
+                       )
+               );
+
+               if ( $changed ) {
+                       // Return the new revision to the caller
+                       $status->value['revision'] = $revision;
+               } else {
+                       $status->warning( 'edit-no-change' );
+                       // Update page_touched as updateRevisionOn() was not called.
+                       // Other cache updates are managed in onArticleEdit() via doEditUpdates().
+                       $this->mTitle->invalidateCache( $now );
+               }
+
+               return $status;
+       }
+
+       /**
+        * @param Content $content Pre-save transform content
+        * @param integer $flags
+        * @param User $user
+        * @param string $summary
+        * @param array $meta
+        * @return Status
+        * @throws DBUnexpectedError
+        * @throws Exception
+        * @throws FatalError
+        * @throws MWException
+        */
+       private function doCreate(
+               Content $content, $flags, User $user, $summary, array $meta
+       ) {
+               global $wgUseRCPatrol, $wgUseNPPatrol;
+
+               $status = Status::newGood( array( 'new' => true, 'revision' => null ) );
 
-                       // Update links, etc.
-                       $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
+               $now = wfTimestampNow();
+               $newsize = $content->getSize();
+               $prepStatus = $content->prepareSave( $this, $flags, $meta['oldId'], $user );
+               $status->merge( $prepStatus );
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin( __METHOD__ );
 
-                       $hook_args = array( &$this, &$user, $content, $summary,
-                                                               $flags & EDIT_MINOR, null, null, &$flags, $revision );
+               // Add the page record unless one already exists for the title
+               $newid = $this->insertOn( $dbw );
+               if ( $newid === false ) {
+                       $dbw->commit( __METHOD__ ); // nothing inserted
+                       $status->fatal( 'edit-already-exists' );
 
-                       ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
-                       Hooks::run( 'PageContentInsertComplete', $hook_args );
+                       return $status; // nothing done
                }
 
-               // Return the new revision (or null) to the caller
-               $status->value['revision'] = $revision;
+               // At this point we are now comitted to returning an OK
+               // status unless some DB query error or other exception comes up.
+               // This way callers don't have to call rollback() if $status is bad
+               // unless they actually try to catch exceptions (which is rare).
 
-               $hook_args = array( &$this, &$user, $content, $summary,
-                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
+               // @TODO: pass content object?!
+               $revision = new Revision( array(
+                       'page'       => $newid,
+                       'title'      => $this->mTitle, // for determining the default content model
+                       'comment'    => $summary,
+                       'minor_edit' => $meta['minor'],
+                       'text'       => $meta['serialized'],
+                       'len'        => $newsize,
+                       'user'       => $user->getId(),
+                       'user_text'  => $user->getName(),
+                       'timestamp'  => $now,
+                       'content_model' => $content->getModel(),
+                       'content_format' => $meta['serialFormat'],
+               ) );
+
+               // Save the revision text...
+               $revisionId = $revision->insertOn( $dbw );
+               // Update the page record with revision data
+               if ( !$this->updateRevisionOn( $dbw, $revision, 0 ) ) {
+                       $dbw->rollback( __METHOD__ );
+                       throw new MWException( "Failed to update page row to use new revision." );
+               }
 
-               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
-               Hooks::run( 'PageContentSaveComplete', $hook_args );
+               Hooks::run( 'NewRevisionFromEditComplete', array( $this, $revision, false, $user ) );
 
-               // Promote user to any groups they meet the criteria for
-               DeferredUpdates::addCallableUpdate( function () use ( $user ) {
-                       $user->addAutopromoteOnceGroups( 'onEdit' );
-                       $user->addAutopromoteOnceGroups( 'onView' ); // b/c
-               } );
+               // Update recentchanges
+               if ( !( $flags & EDIT_SUPPRESS_RC ) ) {
+                       // Mark as patrolled if the user can do so
+                       $patrolled = ( $wgUseRCPatrol || $wgUseNPPatrol ) &&
+                               !count( $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
+                       // Add RC row to the DB
+                       RecentChange::notifyNew(
+                               $now,
+                               $this->mTitle,
+                               $revision->isMinor(),
+                               $user,
+                               $summary,
+                               $meta['bot'],
+                               '',
+                               $newsize,
+                               $revisionId,
+                               $patrolled
+                       );
+               }
+
+               $user->incEditCount();
+
+               $dbw->commit( __METHOD__ );
+               $this->mTimestamp = $now;
+
+               // Update links, etc.
+               $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
+
+               $hook_args = array( &$this, &$user, $content, $summary,
+                       $flags & EDIT_MINOR, null, null, &$flags, $revision );
+               ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
+               Hooks::run( 'PageContentInsertComplete', $hook_args );
+
+               // Return the new revision to the caller
+               $status->value['revision'] = $revision;
 
                return $status;
        }
@@ -2001,6 +2040,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Prepare text which is about to be saved.
         * Returns a stdClass with source, pst and output members
         *
+        * @param string $text
+        * @param int|null $revid
+        * @param User|null $user
         * @deprecated since 1.21: use prepareContentForEdit instead.
         * @return object
         */
@@ -2064,7 +2106,7 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // The edit may have already been prepared via api.php?action=stashedit
-               $cachedEdit = $useCache && $wgAjaxEditStash && !$user->isAllowed( 'bot' )
+               $cachedEdit = $useCache && $wgAjaxEditStash
                        ? ApiStashEdit::checkCache( $this->getTitle(), $content, $user )
                        : false;
 
@@ -2142,6 +2184,8 @@ class WikiPage implements Page, IDBAccessObject {
         * - changed: boolean, whether the revision changed the content (default true)
         * - created: boolean, whether the revision created the page (default false)
         * - moved: boolean, whether the page was moved (default false)
+        * - restored: boolean, whether the page was undeleted (default false)
+        * - oldrevision: Revision object for the pre-update revision (default null)
         * - oldcountable: boolean, null, or string 'no-change' (default null):
         *   - boolean: whether the page was counted as an article before that
         *     revision, only used in changed is true and created is false
@@ -2150,10 +2194,14 @@ class WikiPage implements Page, IDBAccessObject {
         *   - 'no-change': don't update the article count, ever
         */
        public function doEditUpdates( Revision $revision, User $user, array $options = array() ) {
+               global $wgRCWatchCategoryMembership;
+
                $options += array(
                        'changed' => true,
                        'created' => false,
                        'moved' => false,
+                       'restored' => false,
+                       'oldrevision' => null,
                        'oldcountable' => null
                );
                $content = $revision->getContent();
@@ -2180,13 +2228,30 @@ class WikiPage implements Page, IDBAccessObject {
                if ( $content ) {
                        $recursive = $options['changed']; // bug 50785
                        $updates = $content->getSecondaryDataUpdates(
-                               $this->getTitle(), null, $recursive, $editInfo->output );
+                               $this->getTitle(), null, $recursive, $editInfo->output
+                       );
                        foreach ( $updates as $update ) {
                                if ( $update instanceof LinksUpdate ) {
                                        $update->setRevision( $revision );
+                                       $update->setTriggeringUser( $user );
                                }
                                DeferredUpdates::addUpdate( $update );
                        }
+                       if ( $wgRCWatchCategoryMembership
+                               && ( $options['changed'] || $options['created'] )
+                               && !$options['restored']
+                       ) {
+                               // Note: jobs are pushed after deferred updates, so the job should be able to see
+                               // the recent change entry (also done via deferred updates) and carry over any
+                               // bot/deletion/IP flags, ect.
+                               JobQueueGroup::singleton()->lazyPush( new CategoryMembershipChangeJob(
+                                       $this->getTitle(),
+                                       array(
+                                               'pageId' => $this->getId(),
+                                               'revTimestamp' => $revision->getTimestamp()
+                                       )
+                               ) );
+                       }
                }
 
                Hooks::run( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
@@ -2267,25 +2332,6 @@ class WikiPage implements Page, IDBAccessObject {
                }
        }
 
-       /**
-        * Edit an article without doing all that other stuff
-        * The article must already exist; link tables etc
-        * are not updated, caches are not flushed.
-        *
-        * @param string $text Text submitted
-        * @param User $user The relevant user
-        * @param string $comment Comment submitted
-        * @param bool $minor Whereas it's a minor modification
-        *
-        * @deprecated since 1.21, use doEditContent() instead.
-        */
-       public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
-               ContentHandler::deprecated( __METHOD__, "1.21" );
-
-               $content = ContentHandler::makeContent( $text, $this->getTitle() );
-               $this->doQuickEditContent( $content, $user, $comment, $minor );
-       }
-
        /**
         * Edit an article without doing all that other stuff
         * The article must already exist; link tables etc
@@ -2736,16 +2782,16 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $reason Delete reason for deletion log
         * @param bool $suppress Suppress all revisions and log the deletion in
         *        the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
+        * @param array|string &$error Array of errors to append to
         * @param User $user The deleting user
         * @return bool True if successful
         */
        public function doDeleteArticle(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null
        ) {
-               $status = $this->doDeleteArticleReal( $reason, $suppress, $id, $commit, $error, $user );
+               $status = $this->doDeleteArticleReal( $reason, $suppress, $u1, $u2, $error, $user );
                return $status->isGood();
        }
 
@@ -2758,16 +2804,16 @@ class WikiPage implements Page, IDBAccessObject {
         * @param string $reason Delete reason for deletion log
         * @param bool $suppress Suppress all revisions and log the deletion in
         *   the suppression log instead of the deletion log
-        * @param int $id Article ID
-        * @param bool $commit Defaults to true, triggers transaction end
-        * @param array &$error Array of errors to append to
+        * @param int $u1 Unused
+        * @param bool $u2 Unused
+        * @param array|string &$error Array of errors to append to
         * @param User $user The deleting user
         * @return Status Status object; if successful, $status->value is the log_id of the
         *   deletion log entry. If the page couldn't be deleted because it wasn't
         *   found, $status is a non-fatal 'cannotdelete' error
         */
        public function doDeleteArticleReal(
-               $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
+               $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null
        ) {
                global $wgUser, $wgContentHandlerUseDB;
 
@@ -2793,25 +2839,28 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-
-               if ( $id == 0 ) {
-                       $this->loadPageData( self::READ_LATEST );
-                       $id = $this->getID();
-                       // T98706: lock the page from various other updates but avoid using
-                       // WikiPage::READ_LOCKING as that will carry over the FOR UPDATE to
-                       // the revisions queries (which also JOIN on user). Only lock the page
-                       // row and CAS check on page_latest to see if the trx snapshot matches.
-                       $lockedLatest = $this->lock();
-                       if ( $id == 0 || $this->getLatest() != $lockedLatest ) {
-                               // Page not there or trx snapshot is stale
-                               $dbw->rollback( __METHOD__ );
-                               $status->error( 'cannotdelete',
-                                       wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                               return $status;
-                       }
+               $dbw->startAtomic( __METHOD__ );
+
+               $this->loadPageData( self::READ_LATEST );
+               $id = $this->getID();
+               // T98706: lock the page from various other updates but avoid using
+               // WikiPage::READ_LOCKING as that will carry over the FOR UPDATE to
+               // the revisions queries (which also JOIN on user). Only lock the page
+               // row and CAS check on page_latest to see if the trx snapshot matches.
+               $lockedLatest = $this->lockAndGetLatest();
+               if ( $id == 0 || $this->getLatest() != $lockedLatest ) {
+                       $dbw->endAtomic( __METHOD__ );
+                       // Page not there or trx snapshot is stale
+                       $status->error( 'cannotdelete',
+                               wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
+                       return $status;
                }
 
+               // At this point we are now comitted to returning an OK
+               // status unless some DB query error or other exception comes up.
+               // This way callers don't have to call rollback() if $status is bad
+               // unless they actually try to catch exceptions (which is rare).
+
                // we need to remember the old content so we can use it to generate all deletion updates.
                $content = $this->getContent( Revision::RAW );
 
@@ -2864,24 +2913,20 @@ class WikiPage implements Page, IDBAccessObject {
                        $row['ar_content_format'] = 'rev_content_format';
                }
 
-               $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
+               // Copy all the page revisions into the archive table
+               $dbw->insertSelect(
+                       'archive',
+                       array( 'page', 'revision' ),
                        $row,
                        array(
                                'page_id' => $id,
                                'page_id = rev_page'
-                       ), __METHOD__
+                       ),
+                       __METHOD__
                );
 
                // Now that it's safely backed up, delete it
                $dbw->delete( 'page', array( 'page_id' => $id ), __METHOD__ );
-               $ok = ( $dbw->affectedRows() > 0 ); // $id could be laggy
-
-               if ( !$ok ) {
-                       $dbw->rollback( __METHOD__ );
-                       $status->error( 'cannotdelete',
-                               wfEscapeWikiText( $this->getTitle()->getPrefixedText() ) );
-                       return $status;
-               }
 
                if ( !$dbw->cascadingDeletes() ) {
                        $dbw->delete( 'revision', array( 'rev_page' => $id ), __METHOD__ );
@@ -2904,19 +2949,19 @@ class WikiPage implements Page, IDBAccessObject {
                        $logEntry->publish( $logid );
                } );
 
-               if ( $commit ) {
-                       $dbw->commit( __METHOD__ );
-               }
-
-               // Show log excerpt on 404 pages rather than just a link
-               $key = wfMemcKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) );
-               ObjectCache::getMainStashInstance()->set( $key, 1, 86400 );
+               $dbw->endAtomic( __METHOD__ );
 
                $this->doDeleteUpdates( $id, $content );
 
                Hooks::run( 'ArticleDeleteComplete',
                        array( &$this, &$user, $reason, $id, $content, $logEntry ) );
                $status->value = $logid;
+
+               // Show log excerpt on 404 pages rather than just a link
+               $cache = ObjectCache::getMainStashInstance();
+               $key = wfMemcKey( 'page-recent-delete', md5( $logTitle->getPrefixedText() ) );
+               $cache->set( $key, 1, $cache::TTL_DAY );
+
                return $status;
        }
 
@@ -2924,8 +2969,9 @@ class WikiPage implements Page, IDBAccessObject {
         * Lock the page row for this title+id and return page_latest (or 0)
         *
         * @return integer Returns 0 if no row was found with this title+id
+        * @since 1.27
         */
-       protected function lock() {
+       public function lockAndGetLatest() {
                return (int)wfGetDB( DB_MASTER )->selectField(
                        'page',
                        'page_latest',
@@ -3271,7 +3317,7 @@ class WikiPage implements Page, IDBAccessObject {
                // Invalidate the caches of all pages which redirect here
                DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'redirect' ) );
 
-               // Purge squid for this page only
+               // Purge CDN for this page only
                $title->purgeSquid();
                // Clear file cache for this page only
                HTMLFileCache::clearFileCache( $title );
@@ -3477,22 +3523,34 @@ class WikiPage implements Page, IDBAccessObject {
                        return;
                }
 
+               $params = array(
+                       'isOpportunistic' => true,
+                       'rootJobTimestamp' => $parserOutput->getCacheTime()
+               );
+
                if ( $this->mTitle->areRestrictionsCascading() ) {
                        // If the page is cascade protecting, the links should really be up-to-date
-                       $params = array( 'prioritize' => true );
+                       JobQueueGroup::singleton()->lazyPush(
+                               RefreshLinksJob::newPrioritized( $this->mTitle, $params )
+                       );
                } elseif ( $parserOutput->hasDynamicContent() ) {
-                       // Assume the output contains time/random based magic words
-                       $params = array();
-               } else {
-                       // If the inclusions are deterministic, the edit-triggered link jobs are enough
-                       return;
-               }
-
-               // Check if the last link refresh was before page_touched
-               if ( $this->getLinksTimestamp() < $this->getTouched() ) {
-                       $params['isOpportunistic'] = true;
-                       $params['rootJobTimestamp'] = $parserOutput->getCacheTime();
-                       JobQueueGroup::singleton()->lazyPush( new RefreshLinksJob( $this->mTitle, $params ) );
+                       // Assume the output contains "dynamic" time/random based magic words.
+                       // Only update pages that expired due to dynamic content and NOT due to edits
+                       // to referenced templates/files. When the cache expires due to dynamic content,
+                       // page_touched is unchanged. We want to avoid triggering redundant jobs due to
+                       // views of pages that were just purged via HTMLCacheUpdateJob. In that case, the
+                       // template/file edit already triggered recursive RefreshLinksJob jobs.
+                       if ( $this->getLinksTimestamp() > $this->getTouched() ) {
+                               // If a page is uncacheable, do not keep spamming a job for it.
+                               // Although it would be de-duplicated, it would still waste I/O.
+                               $cache = ObjectCache::getLocalClusterInstance();
+                               $key = $cache->makeKey( 'dynamic-linksupdate', 'last', $this->getId() );
+                               if ( $cache->add( $key, time(), 60 ) ) {
+                                       JobQueueGroup::singleton()->lazyPush(
+                                               RefreshLinksJob::newDynamic( $this->mTitle, $params )
+                                       );
+                               }
+                       }
                }
        }
 
index 7acfe38..2451390 100644 (file)
@@ -93,11 +93,6 @@ class CacheTime {
                if ( $this->mCacheExpiry === null || $this->mCacheExpiry > $seconds ) {
                        $this->mCacheExpiry = $seconds;
                }
-
-               // hack: set old-style marker for uncacheable entries.
-               if ( $this->mCacheExpiry !== null && $this->mCacheExpiry <= 0 ) {
-                       $this->mCacheTime = -1;
-               }
        }
 
        /**
index 42091a0..d25d11a 100644 (file)
@@ -46,7 +46,7 @@ class CoreParserFunctions {
                        'numberofarticles', 'numberoffiles', 'numberofadmins',
                        'numberingroup', 'numberofedits', 'language',
                        'padleft', 'padright', 'anchorencode', 'defaultsort', 'filepath',
-                       'pagesincategory', 'pagesize', 'protectionlevel',
+                       'pagesincategory', 'pagesize', 'protectionlevel', 'protectionexpiry',
                        'namespacee', 'namespacenumber', 'talkspace', 'talkspacee',
                        'subjectspace', 'subjectspacee', 'pagename', 'pagenamee',
                        'fullpagename', 'fullpagenamee', 'rootpagename', 'rootpagenamee',
@@ -772,8 +772,8 @@ class CoreParserFunctions {
        /**
         * Returns the requested protection level for the current page. This
         * is an expensive parser function and can't be called too many times
-        * per page, unless the protection levels for the given title have
-        * already been retrieved
+        * per page, unless the protection levels/expiries for the given title
+        * have already been retrieved
         *
         * @param Parser $parser
         * @param string $type
@@ -795,6 +795,35 @@ class CoreParserFunctions {
                return '';
        }
 
+       /**
+        * Returns the requested protection expiry for the current page. This
+        * is an expensive parser function and can't be called too many times
+        * per page, unless the protection levels/expiries for the given title
+        * have already been retrieved
+        *
+        * @param Parser $parser
+        * @param string $type
+        * @param string $title
+        *
+        * @return string
+        */
+       public static function protectionexpiry( $parser, $type = '', $title = '' ) {
+               $titleObject = Title::newFromText( $title );
+               if ( !( $titleObject instanceof Title ) ) {
+                       $titleObject = $parser->mTitle;
+               }
+               if ( $titleObject->areRestrictionsLoaded() || $parser->incrementExpensiveFunctionCount() ) {
+                       $expiry = $parser->mTitle->getRestrictionExpiry( strtolower( $type ) );
+                       // getRestrictionExpiry() returns false on invalid type; trying to
+                       // match protectionlevel() function that returns empty string instead
+                       if ( $expiry === false ) {
+                               $expiry = '';
+                       }
+                       return $expiry;
+               }
+               return '';
+       }
+
        /**
         * Gives language names.
         * @param Parser $parser
index ef295ab..edb9ff1 100644 (file)
@@ -124,18 +124,23 @@ class DateFormatter {
         *              Defaults to the site content language
         * @return DateFormatter
         */
-       public static function &getInstance( $lang = null ) {
-               global $wgMemc, $wgContLang;
-               static $dateFormatter = false;
+       public static function getInstance( $lang = null ) {
+               global $wgContLang, $wgMainCacheType;
+
                $lang = $lang ? wfGetLangObj( $lang ) : $wgContLang;
-               $key = wfMemcKey( 'dateformatter', $lang->getCode() );
+               $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType );
+
+               static $dateFormatter = false;
                if ( !$dateFormatter ) {
-                       $dateFormatter = $wgMemc->get( $key );
-                       if ( !$dateFormatter ) {
-                               $dateFormatter = new DateFormatter( $lang );
-                               $wgMemc->set( $key, $dateFormatter, 3600 );
-                       }
+                       $dateFormatter = $cache->getWithSetCallback(
+                               $cache->makeKey( 'dateformatter', $lang->getCode() ),
+                               $cache::TTL_HOUR,
+                               function () use ( $lang ) {
+                                       return new DateFormatter( $lang );
+                               }
+                       );
                }
+
                return $dateFormatter;
        }
 
index 41b5dec..6329fd7 100644 (file)
@@ -315,15 +315,18 @@ class LinkHolderArray {
                                        $colours[$pdbk] = '';
                                } elseif ( $ns == NS_SPECIAL ) {
                                        $colours[$pdbk] = 'new';
-                               } elseif ( ( $id = $linkCache->getGoodLinkID( $pdbk ) ) != 0 ) {
-                                       $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
-                                       $output->addLink( $title, $id );
-                                       $linkcolour_ids[$id] = $pdbk;
-                               } elseif ( $linkCache->isBadLink( $pdbk ) ) {
-                                       $colours[$pdbk] = 'new';
                                } else {
-                                       # Not in the link cache, add it to the query
-                                       $queries[$ns][] = $title->getDBkey();
+                                       $id = $linkCache->getGoodLinkID( $pdbk );
+                                       if ( $id != 0 ) {
+                                               $colours[$pdbk] = Linker::getLinkColour( $title, $threshold );
+                                               $output->addLink( $title, $id );
+                                               $linkcolour_ids[$id] = $pdbk;
+                                       } elseif ( $linkCache->isBadLink( $pdbk ) ) {
+                                               $colours[$pdbk] = 'new';
+                                       } else {
+                                               # Not in the link cache, add it to the query
+                                               $queries[$ns][] = $title->getDBkey();
+                                       }
                                }
                        }
                }
index 3a2bb17..746e15b 100644 (file)
@@ -51,6 +51,24 @@ class MWTidy {
                return $driver->tidy( $text );
        }
 
+       /**
+        * Get CSS modules needed if HTML from the current driver is to be displayed.
+        *
+        * This is just a migration tool to allow some changes expected as part of
+        * Tidy replacement (T89331) to be exposed on the client side via user
+        * scripts, without actually replacing tidy. See T49673.
+        *
+        * @return array
+        */
+       public static function getModuleStyles() {
+               $driver = self::singleton();
+               if ( $driver && $driver instanceof MediaWiki\Tidy\RaggettBase ) {
+                       return array( 'mediawiki.raggett' );
+               } else {
+                       return array();
+               }
+       }
+
        /**
         * Check HTML for errors, used if $wgValidateAllHtml = true.
         *
index efad151..cfbf0b4 100644 (file)
@@ -1340,6 +1340,7 @@ class Parser {
 
                if ( MWTidy::isEnabled() && $this->mOptions->getTidy() ) {
                        $text = MWTidy::tidy( $text );
+                       $this->mOutput->addModuleStyles( MWTidy::getModuleStyles() );
                } else {
                        # attempt to sanitize at least some nesting problems
                        # (bug #2702 and quite a few others)
@@ -5763,7 +5764,6 @@ class Parser {
                        throw new MWException( __METHOD__ .
                                " can only be called when actually parsing something" );
                }
-               $this->mOutput->setCacheTime( -1 ); // old style, for compatibility
                $this->mOutput->updateCacheExpiry( 0 ); // new style, for consistency
        }
 
index 37b45a6..e4c287a 100644 (file)
@@ -108,19 +108,17 @@ class ParserOutput extends CacheTime {
        public $mHeadItems = array();
 
        /**
-        * @var array $mModules Modules to be loaded by the resource loader
+        * @var array $mModules Modules to be loaded by ResourceLoader
         */
        public $mModules = array();
 
        /**
-        * @var array $mModuleScripts Modules of which only the JS will be loaded by
-        *  the resource loader.
+        * @var array $mModuleScripts Modules of which only the JS will be loaded by ResourceLoader.
         */
        public $mModuleScripts = array();
 
        /**
-        * @var array $mModuleStyles Modules of which only the CSSS will be loaded by
-        *  the resource loader.
+        * @var array $mModuleStyles Modules of which only the CSSS will be loaded by ResourceLoader.
         */
        public $mModuleStyles = array();
 
index b32593c..df5d499 100644 (file)
  * @ingroup Parser
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * @ingroup Parser
  */
-interface Preprocessor {
+abstract class Preprocessor {
+
+       const CACHE_VERSION = 1;
+
        /**
-        * Create a new preprocessor object based on an initialised Parser object
+        * @var array Brace matching rules.
+        */
+       protected $rules = array(
+               '{' => array(
+                       'end' => '}',
+                       'names' => array(
+                               2 => 'template',
+                               3 => 'tplarg',
+                       ),
+                       'min' => 2,
+                       'max' => 3,
+               ),
+               '[' => array(
+                       'end' => ']',
+                       'names' => array( 2 => null ),
+                       'min' => 2,
+                       'max' => 2,
+               )
+       );
+
+       /**
+        * Store a document tree in the cache.
         *
-        * @param Parser $parser
+        * @param string $text
+        * @param int $flags
         */
-       public function __construct( $parser );
+       protected function cacheSetTree( $text, $flags, $tree ) {
+               $config = RequestContext::getMain()->getConfig();
+
+               $length = strlen( $text );
+               $threshold = $config->get( 'PreprocessorCacheThreshold' );
+               if ( $threshold === false || $length < $threshold || $length > 1e6 ) {
+                       return false;
+               }
+
+               $key = wfMemcKey(
+                       // TODO: Once we require PHP 5.5, use static::class instead of
+                       // get_called_class() or get_class( $this ).
+                       defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : get_called_class(),
+                       md5( $text ), $flags );
+               $value = sprintf( "%08d", static::CACHE_VERSION ) . $tree;
+
+               $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) );
+               $cache->set( $key, $value, 86400 );
+
+               LoggerFactory::getInstance( 'Preprocessor' )
+                       ->info( "Cached preprocessor output (key: $key)" );
+       }
+
+       /**
+        * Attempt to load a precomputed document tree for some given wikitext
+        * from the cache.
+        *
+        * @param string $text
+        * @param int $flags
+        * @return PPNode_Hash_Tree|bool
+        */
+       protected function cacheGetTree( $text, $flags ) {
+               $config = RequestContext::getMain()->getConfig();
+
+               $length = strlen( $text );
+               $threshold = $config->get( 'PreprocessorCacheThreshold' );
+               if ( $threshold === false || $length < $threshold || $length > 1e6 ) {
+                       return false;
+               }
+
+               $cache = ObjectCache::getInstance( $config->get( 'MainCacheType' ) );
+
+               $key = wfMemcKey(
+                       // TODO: Once we require PHP 5.5, use static::class instead of
+                       // get_called_class() or get_class( $this ).
+                       defined( 'static::CACHE_PREFIX' ) ? static::CACHE_PREFIX : get_called_class(),
+                       md5( $text ), $flags );
+
+               $value = $cache->get( $key );
+               if ( !$value ) {
+                       return false;
+               }
+
+               $version = intval( substr( $value, 0, 8 ) );
+               if ( $version !== static::CACHE_VERSION ) {
+                       return false;
+               }
+
+               LoggerFactory::getInstance( 'Preprocessor' )
+                       ->info( "Loaded preprocessor output from cache (key: $key)" );
+
+               return substr( $value, 8 );
+       }
 
        /**
         * Create a new top-level frame for expansion of a page
         *
         * @return PPFrame
         */
-       public function newFrame();
+       abstract public function newFrame();
 
        /**
         * Create a new custom frame for programmatic use of parameter replacement
@@ -47,7 +136,7 @@ interface Preprocessor {
         *
         * @return PPFrame
         */
-       public function newCustomFrame( $args );
+       abstract public function newCustomFrame( $args );
 
        /**
         * Create a new custom node for programmatic use of parameter replacement
@@ -55,7 +144,7 @@ interface Preprocessor {
         *
         * @param array $values
         */
-       public function newPartNodeArray( $values );
+       abstract public function newPartNodeArray( $values );
 
        /**
         * Preprocess text to a PPNode
@@ -65,7 +154,7 @@ interface Preprocessor {
         *
         * @return PPNode
         */
-       public function preprocessToObj( $text, $flags = 0 );
+       abstract public function preprocessToObj( $text, $flags = 0 );
 }
 
 /**
index c329689..4ca3a87 100644 (file)
@@ -25,7 +25,7 @@
  * @ingroup Parser
  */
 // @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
-class Preprocessor_DOM implements Preprocessor {
+class Preprocessor_DOM extends Preprocessor {
        // @codingStandardsIgnoreEnd
 
        /**
@@ -35,7 +35,7 @@ class Preprocessor_DOM implements Preprocessor {
 
        public $memoryLimit;
 
-       const CACHE_VERSION = 1;
+       const CACHE_PREFIX = 'preprocess-xml';
 
        public function __construct( $parser ) {
                $this->parser = $parser;
@@ -148,30 +148,11 @@ class Preprocessor_DOM implements Preprocessor {
         * @return PPNode_DOM
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-               global $wgMemc, $wgPreprocessorCacheThreshold;
-
-               $xml = false;
-               $cacheable = ( $wgPreprocessorCacheThreshold !== false
-                       && strlen( $text ) > $wgPreprocessorCacheThreshold );
-               if ( $cacheable ) {
-                       $cacheKey = wfMemcKey( 'preprocess-xml', md5( $text ), $flags );
-                       $cacheValue = $wgMemc->get( $cacheKey );
-                       if ( $cacheValue ) {
-                               $version = substr( $cacheValue, 0, 8 );
-                               if ( intval( $version ) == self::CACHE_VERSION ) {
-                                       $xml = substr( $cacheValue, 8 );
-                                       // From the cache
-                                       wfDebugLog( "Preprocessor", "Loaded preprocessor XML from memcached (key $cacheKey)" );
-                               }
-                       }
-                       if ( $xml === false ) {
-                               $xml = $this->preprocessToXml( $text, $flags );
-                               $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . $xml;
-                               $wgMemc->set( $cacheKey, $cacheValue, 86400 );
-                               wfDebugLog( "Preprocessor", "Saved preprocessor XML to memcached (key $cacheKey)" );
-                       }
-               } else {
+
+               $xml = $this->cacheGetTree( $text, $flags );
+               if ( $xml === false ) {
                        $xml = $this->preprocessToXml( $text, $flags );
+                       $this->cacheSetTree( $text, $flags, $xml );
                }
 
                // Fail if the number of elements exceeds acceptable limits
@@ -179,8 +160,7 @@ class Preprocessor_DOM implements Preprocessor {
                $this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
                $max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
                if ( $this->parser->mGeneratedPPNodeCount > $max ) {
-                       if ( $cacheable ) {
-                       }
+                       // if ( $cacheable ) { ... }
                        throw new MWException( __METHOD__ . ': generated node count limit exceeded' );
                }
 
@@ -199,8 +179,7 @@ class Preprocessor_DOM implements Preprocessor {
                        $obj = new PPNode_DOM( $dom->documentElement );
                }
 
-               if ( $cacheable ) {
-               }
+               // if ( $cacheable ) { ... }
 
                if ( !$result ) {
                        throw new MWException( __METHOD__ . ' generated invalid XML' );
@@ -214,24 +193,6 @@ class Preprocessor_DOM implements Preprocessor {
         * @return string
         */
        public function preprocessToXml( $text, $flags = 0 ) {
-               $rules = array(
-                       '{' => array(
-                               'end' => '}',
-                               'names' => array(
-                                       2 => 'template',
-                                       3 => 'tplarg',
-                               ),
-                               'min' => 2,
-                               'max' => 3,
-                       ),
-                       '[' => array(
-                               'end' => ']',
-                               'names' => array( 2 => null ),
-                               'min' => 2,
-                               'max' => 2,
-                       )
-               );
-
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
 
                $xmlishElements = $this->parser->getStripList();
@@ -349,9 +310,9 @@ class Preprocessor_DOM implements Preprocessor {
                                                }
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
-                                       } elseif ( isset( $rules[$curChar] ) ) {
+                                       } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
-                                               $rule = $rules[$curChar];
+                                               $rule = $this->rules[$curChar];
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -648,7 +609,7 @@ class Preprocessor_DOM implements Preprocessor {
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
-                               $rule = $rules[$piece->open];
+                               $rule = $this->rules[$piece->open];
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -717,7 +678,7 @@ class Preprocessor_DOM implements Preprocessor {
                                        $piece->parts = array( new PPDPart );
                                        $piece->count -= $matchingCount;
                                        # do we still qualify for any callback with remaining count?
-                                       $min = $rules[$piece->open]['min'];
+                                       $min = $this->rules[$piece->open]['min'];
                                        if ( $piece->count >= $min ) {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
index 49fa8a1..4f12414 100644 (file)
@@ -28,7 +28,7 @@
  * @ingroup Parser
  */
 // @codingStandardsIgnoreStart Squiz.Classes.ValidClassName.NotCamelCaps
-class Preprocessor_Hash implements Preprocessor {
+class Preprocessor_Hash extends Preprocessor {
        // @codingStandardsIgnoreEnd
 
        /**
@@ -36,7 +36,7 @@ class Preprocessor_Hash implements Preprocessor {
         */
        public $parser;
 
-       const CACHE_VERSION = 1;
+       const CACHE_PREFIX = 'preprocess-hash';
 
        public function __construct( $parser ) {
                $this->parser = $parser;
@@ -88,6 +88,7 @@ class Preprocessor_Hash implements Preprocessor {
                return $node;
        }
 
+
        /**
         * Preprocess some wikitext and return the document tree.
         * This is the ghost of Parser::replace_variables().
@@ -112,45 +113,11 @@ class Preprocessor_Hash implements Preprocessor {
         * @return PPNode_Hash_Tree
         */
        public function preprocessToObj( $text, $flags = 0 ) {
-               // Check cache.
-               global $wgMemc, $wgPreprocessorCacheThreshold;
-
-               $cacheable = $wgPreprocessorCacheThreshold !== false
-                       && strlen( $text ) > $wgPreprocessorCacheThreshold;
-
-               if ( $cacheable ) {
-                       $cacheKey = wfMemcKey( 'preprocess-hash', md5( $text ), $flags );
-                       $cacheValue = $wgMemc->get( $cacheKey );
-                       if ( $cacheValue ) {
-                               $version = substr( $cacheValue, 0, 8 );
-                               if ( intval( $version ) == self::CACHE_VERSION ) {
-                                       $hash = unserialize( substr( $cacheValue, 8 ) );
-                                       // From the cache
-                                       wfDebugLog( "Preprocessor",
-                                               "Loaded preprocessor hash from memcached (key $cacheKey)" );
-                                       return $hash;
-                               }
-                       }
+               $tree = $this->cacheGetTree( $text, $flags );
+               if ( $tree !== false ) {
+                       return unserialize( $tree );
                }
 
-               $rules = array(
-                       '{' => array(
-                               'end' => '}',
-                               'names' => array(
-                                       2 => 'template',
-                                       3 => 'tplarg',
-                               ),
-                               'min' => 2,
-                               'max' => 3,
-                       ),
-                       '[' => array(
-                               'end' => ']',
-                               'names' => array( 2 => null ),
-                               'min' => 2,
-                               'max' => 2,
-                       )
-               );
-
                $forInclusion = $flags & Parser::PTD_FOR_INCLUSION;
 
                $xmlishElements = $this->parser->getStripList();
@@ -267,9 +234,9 @@ class Preprocessor_Hash implements Preprocessor {
                                                }
                                        } elseif ( $curChar == $currentClosing ) {
                                                $found = 'close';
-                                       } elseif ( isset( $rules[$curChar] ) ) {
+                                       } elseif ( isset( $this->rules[$curChar] ) ) {
                                                $found = 'open';
-                                               $rule = $rules[$curChar];
+                                               $rule = $this->rules[$curChar];
                                        } else {
                                                # Some versions of PHP have a strcspn which stops on null characters
                                                # Ignore and continue
@@ -572,7 +539,7 @@ class Preprocessor_Hash implements Preprocessor {
 
                                # check for maximum matching characters (if there are 5 closing
                                # characters, we will probably need only 3 - depending on the rules)
-                               $rule = $rules[$piece->open];
+                               $rule = $this->rules[$piece->open];
                                if ( $count > $rule['max'] ) {
                                        # The specified maximum exists in the callback array, unless the caller
                                        # has made an error
@@ -629,13 +596,11 @@ class Preprocessor_Hash implements Preprocessor {
                                                                $lastNode = $node;
                                                        }
                                                        if ( !$node ) {
-                                                               if ( $cacheable ) {
-                                                               }
+                                                               // if ( $cacheable ) { ... }
                                                                throw new MWException( __METHOD__ . ': eqpos not found' );
                                                        }
                                                        if ( $node->name !== 'equals' ) {
-                                                               if ( $cacheable ) {
-                                                               }
+                                                               // if ( $cacheable ) { ... }
                                                                throw new MWException( __METHOD__ . ': eqpos is not equals' );
                                                        }
                                                        $equalsNode = $node;
@@ -685,7 +650,7 @@ class Preprocessor_Hash implements Preprocessor {
                                        $piece->parts = array( new PPDPart_Hash );
                                        $piece->count -= $matchingCount;
                                        # do we still qualify for any callback with remaining count?
-                                       $min = $rules[$piece->open]['min'];
+                                       $min = $this->rules[$piece->open]['min'];
                                        if ( $piece->count >= $min ) {
                                                $stack->push( $piece );
                                                $accum =& $stack->getAccum();
@@ -732,15 +697,7 @@ class Preprocessor_Hash implements Preprocessor {
                $rootNode->lastChild = $stack->rootAccum->lastNode;
 
                // Cache
-               if ( $cacheable ) {
-                       $cacheValue = sprintf( "%08d", self::CACHE_VERSION ) . serialize( $rootNode );
-
-                       // T111289: Cache values should not exceed 1 Mb, but they do.
-                       if ( strlen( $cacheValue ) <= 1e6 ) {
-                               $wgMemc->set( $cacheKey, $cacheValue, 86400 );
-                               wfDebugLog( "Preprocessor", "Saved preprocessor Hash to memcached (key $cacheKey)" );
-                       }
-               }
+               $this->cacheSetTree( $text, $flags, serialize( $rootNode ) );
 
                return $rootNode;
        }
index 6c6895a..f061f52 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Implements the BcryptPassword class for the MediaWiki software.
+ * Implements the MWSaltedPassword class for the MediaWiki software.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index e1f272b..6b634cb 100644 (file)
@@ -204,7 +204,7 @@ final class PasswordFactory {
                // Generate random hex chars
                $hex = MWCryptRand::generateHex( $length );
                // Convert from base 16 to base 32 to get a proper password like string
-               return wfBaseConvert( $hex, 16, 32 );
+               return Wikimedia\base_convert( $hex, 16, 32 );
        }
 
        /**
index eb4a958..b1098f5 100644 (file)
@@ -20,6 +20,8 @@
  * @file
  */
 
+use \Cdb\Reader as CdbReader;
+
 /**
  * Functions to check passwords against a policy requirement
  * @since 1.26
@@ -112,4 +114,50 @@ class PasswordPolicyChecks {
                return $status;
        }
 
+       /**
+        * Ensure that password isn't in top X most popular passwords
+        *
+        * @param $policyVal int Cut off to use. Will automatically shrink to the max
+        *   supported for error messages if set to more than max number of passwords on file,
+        *   so you can use the PHP_INT_MAX constant here safely.
+        * @param $user User
+        * @param $password String
+        * @since 1.27
+        * @return Status
+        */
+       public static function checkPopularPasswordBlacklist( $policyVal, User $user, $password ) {
+               global $wgPopularPasswordFile, $wgSitename;
+               $status = Status::newGood();
+               if ( $policyVal > 0 ) {
+                       $langEn = Language::factory( 'en' );
+                       $passwordKey = $langEn->lc( trim( $password ) );
+
+                       // People often use the name of the current site, which won't be
+                       // in the common password file. Also check '' for people who use
+                       // just whitespace.
+                       $sitename = $langEn->lc( trim( $wgSitename ) );
+                       $hardcodedCommonPasswords = array( '', 'wiki', 'mediawiki', $sitename );
+                       if ( in_array( $passwordKey, $hardcodedCommonPasswords ) ) {
+                               $status->error( 'passwordtoopopular' );
+                               return $status;
+                       }
+
+                       // This could throw an exception, but there's not a good way
+                       // of failing gracefully, if say the file is missing, so just
+                       // let the exception fall through.
+                       // Format of cdb file is mapping password => popularity rank.
+                       // See maintenance/createCommonPasswordCdb.php
+                       $db = CdbReader::open( $wgPopularPasswordFile );
+
+                       $res = $db->get( $passwordKey );
+                       if ( $res && (int)$res <= $policyVal ) {
+                               // Note: If you want to find the true number of common
+                               // passwords stored (for reporting the error), you have to take
+                               // the max of the policyVal and $db->get( '_TOTALENTRIES' ).
+                               $status->error( 'passwordtoopopular' );
+                       }
+               }
+               return $status;
+       }
+
 }
index 80dc669..d57adb8 100644 (file)
@@ -56,7 +56,7 @@ class UserPasswordPolicy {
                foreach ( $checks as $statement => $check ) {
                        if ( !is_callable( $check ) ) {
                                throw new InvalidArgumentException(
-                                       'Policy check functions must be callable'
+                                       "Policy check functions must be callable. '$statement' isn't callable."
                                );
                        }
                        $this->policyCheckFunctions[$statement] = $check;
@@ -105,11 +105,18 @@ class UserPasswordPolicy {
                );
        }
 
+       /**
+        * @param User $user
+        * @param string $password
+        * @param array $policies
+        * @param array $policyCheckFunctions
+        * @return Status
+        */
        private function checkPolicies( User $user, $password, $policies, $policyCheckFunctions ) {
                $status = Status::newGood();
                foreach ( $policies as $policy => $value ) {
                        if ( !isset( $policyCheckFunctions[$policy] ) ) {
-                               throw new DomainException( 'Invalid password policy config' );
+                               throw new DomainException( "Invalid password policy config. No check defined for '$policy'." );
                        }
                        $status->merge(
                                call_user_func(
index d601467..3c60ea9 100644 (file)
@@ -147,6 +147,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        $logger->info( '{time} {title}', array(
                                'time' => number_format( $time, 2 ),
                                'title' => $this->page->getTitle()->getPrefixedDBkey(),
+                               'trigger' => 'view',
                        ) );
                }
 
index 76d62d2..5efb3ab 100644 (file)
@@ -33,13 +33,10 @@ class ProfilerOutputDb extends ProfilerOutput {
 
        public function __construct( Profiler $collector, array $params ) {
                parent::__construct( $collector, $params );
-               global $wgProfilePerHost;
 
                // Initialize per-host profiling from config, back-compat if available
                if ( isset( $this->params['perHost'] ) ) {
                        $this->perHost = $this->params['perHost'];
-               } elseif ( $wgProfilePerHost ) {
-                       $this->perHost = $wgProfilePerHost;
                }
        }
 
index 59b9249..732b4a0 100644 (file)
@@ -86,7 +86,7 @@ class ExtensionRegistry {
                // we don't want to fail here if $wgObjectCaches is not configured
                // properly for APC setup
                try {
-                       $this->cache = ObjectCache::newAccelerator();
+                       $this->cache = ObjectCache::getLocalServerInstance();
                } catch ( MWException $e ) {
                        $this->cache = new EmptyBagOStuff();
                }
index 5967537..1db9ce5 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Derivative context for resource loader modules.
+ * Derivative context for ResourceLoader 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
index c9c60bc..1f3085a 100644 (file)
@@ -101,11 +101,11 @@ class ResourceLoader implements LoggerAwareInterface {
         * requests its own information. This sacrifice of modularity yields a substantial
         * performance improvement.
         *
-        * @param array $modules List of module names to preload information for
+        * @param array $moduleNames List of module names to preload information for
         * @param ResourceLoaderContext $context Context to load the information within
         */
-       public function preloadModuleInfo( array $modules, ResourceLoaderContext $context ) {
-               if ( !count( $modules ) ) {
+       public function preloadModuleInfo( array $moduleNames, ResourceLoaderContext $context ) {
+               if ( !$moduleNames ) {
                        // Or else Database*::select() will explode, plus it's cheaper!
                        return;
                }
@@ -116,11 +116,12 @@ class ResourceLoader implements LoggerAwareInterface {
                // Batched version of ResourceLoaderModule::getFileDependencies
                $vary = "$skin|$lang";
                $res = $dbr->select( 'module_deps', array( 'md_module', 'md_deps' ), array(
-                               'md_module' => $modules,
+                               'md_module' => $moduleNames,
                                'md_skin' => $vary,
                        ), __METHOD__
                );
-               // Prime in-object cache values for each module
+
+               // Prime in-object cache for file dependencies
                $modulesWithDeps = array();
                foreach ( $res as $row ) {
                        $module = $this->getModule( $row->md_module );
@@ -132,41 +133,25 @@ class ResourceLoader implements LoggerAwareInterface {
                        }
                }
                // Register the absence of a dependency row too
-               foreach ( array_diff( $modules, $modulesWithDeps ) as $name ) {
+               foreach ( array_diff( $moduleNames, $modulesWithDeps ) as $name ) {
                        $module = $this->getModule( $name );
                        if ( $module ) {
                                $this->getModule( $name )->setFileDependencies( $context, array() );
                        }
                }
 
-               // Get message blob mtimes. Only do this for modules with messages
-               $modulesWithMessages = array();
-               foreach ( $modules as $name ) {
+               // Prime in-object cache for message blobs for modules with messages
+               $modules = array();
+               foreach ( $moduleNames as $name ) {
                        $module = $this->getModule( $name );
-                       if ( $module && count( $module->getMessages() ) ) {
-                               $modulesWithMessages[] = $name;
-                       }
-               }
-               $modulesWithoutMessages = array_flip( $modules ); // Will be trimmed down by the loop below
-               if ( count( $modulesWithMessages ) ) {
-                       $res = $dbr->select( 'msg_resource', array( 'mr_resource', 'mr_timestamp' ), array(
-                                       'mr_resource' => $modulesWithMessages,
-                                       'mr_lang' => $lang
-                               ), __METHOD__
-                       );
-                       foreach ( $res as $row ) {
-                               $module = $this->getModule( $row->mr_resource );
-                               if ( $module ) {
-                                       $module->setMsgBlobMtime( $lang, wfTimestamp( TS_UNIX, $row->mr_timestamp ) );
-                                       unset( $modulesWithoutMessages[$row->mr_resource] );
-                               }
+                       if ( $module && $module->getMessages() ) {
+                               $modules[$name] = $module;
                        }
                }
-               foreach ( array_keys( $modulesWithoutMessages ) as $name ) {
-                       $module = $this->getModule( $name );
-                       if ( $module ) {
-                               $module->setMsgBlobMtime( $lang, 1 );
-                       }
+               $store = $this->getMessageBlobStore();
+               $blobs = $store->getBlobs( $modules, $lang );
+               foreach ( $blobs as $name => $blob ) {
+                       $modules[$name]->setMessageBlob( $blob, $lang );
                }
        }
 
@@ -197,7 +182,7 @@ class ResourceLoader implements LoggerAwareInterface {
                }
 
                $stats = RequestContext::getMain()->getStats();
-               $cache = ObjectCache::newAccelerator( CACHE_ANYTHING );
+               $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
 
                $key = $cache->makeGlobalKey(
                        'resourceloader',
@@ -241,15 +226,13 @@ class ResourceLoader implements LoggerAwareInterface {
 
        /**
         * Register core modules and runs registration hooks.
-        * @param Config|null $config
+        * @param Config $config [optional]
+        * @param LoggerInterface $logger [optional]
         */
        public function __construct( Config $config = null, LoggerInterface $logger = null ) {
                global $IP;
 
-               if ( !$logger ) {
-                       $logger = new NullLogger();
-               }
-               $this->setLogger( $logger );
+               $this->logger = $logger ?: new NullLogger();
 
                if ( !$config ) {
                        $this->logger->debug( __METHOD__ . ' was called without providing a Config instance' );
@@ -274,7 +257,7 @@ class ResourceLoader implements LoggerAwareInterface {
                        $this->registerTestModules();
                }
 
-               $this->setMessageBlobStore( new MessageBlobStore() );
+               $this->setMessageBlobStore( new MessageBlobStore( $this, $this->logger ) );
        }
 
        /**
@@ -284,10 +267,22 @@ class ResourceLoader implements LoggerAwareInterface {
                return $this->config;
        }
 
+       /**
+        * @since 1.26
+        * @param LoggerInterface $logger
+        */
        public function setLogger( LoggerInterface $logger ) {
                $this->logger = $logger;
        }
 
+       /**
+        * @since 1.27
+        * @return LoggerInterface
+        */
+       public function getLogger() {
+               return $this->logger;
+       }
+
        /**
         * @since 1.26
         * @return MessageBlobStore
@@ -322,11 +317,11 @@ class ResourceLoader implements LoggerAwareInterface {
                // Allow multiple modules to be registered in one call
                $registrations = is_array( $name ) ? $name : array( $name => $info );
                foreach ( $registrations as $name => $info ) {
-                       // Disallow duplicate registrations
+                       // Warn on duplicate registrations
                        if ( isset( $this->moduleInfos[$name] ) ) {
                                // A module has already been registered by this name
-                               throw new MWException(
-                                       'ResourceLoader duplicate registration error. ' .
+                               $this->logger->warning(
+                                       'ResourceLoader duplicate registration warning. ' .
                                        'Another module has already been registered as ' . $name
                                );
                        }
@@ -435,6 +430,8 @@ class ResourceLoader implements LoggerAwareInterface {
        /**
         * Add a foreign source of modules.
         *
+        * Source IDs are typically the same as the Wiki ID or database name (e.g. lowercase a-z).
+        *
         * @param array|string $id Source ID (string), or array( id1 => loadUrl, id2 => loadUrl, ... )
         * @param string|array $loadUrl load.php url (string), or array with loadUrl key for
         *  backwards-compatibility.
@@ -546,6 +543,7 @@ class ResourceLoader implements LoggerAwareInterface {
                                /** @var ResourceLoaderModule $object */
                                $object = new $class( $info );
                                $object->setConfig( $this->getConfig() );
+                               $object->setLogger( $this->logger );
                        }
                        $object->setName( $name );
                        $this->modules[$name] = $object;
@@ -664,7 +662,7 @@ class ResourceLoader implements LoggerAwareInterface {
                }
 
                try {
-                       // Preload for getCombinedVersion()
+                       // Preload for getCombinedVersion() and for batch makeModuleResponse()
                        $this->preloadModuleInfo( array_keys( $modules ), $context );
                } catch ( Exception $e ) {
                        MWExceptionHandler::logException( $e );
@@ -708,8 +706,11 @@ class ResourceLoader implements LoggerAwareInterface {
 
                // Capture any PHP warnings from the output buffer and append them to the
                // error list if we're in debug mode.
-               if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
-                       $this->errors[] = $warnings;
+               if ( $context->getDebug() ) {
+                       $warnings = ob_get_contents();
+                       if ( strlen( $warnings ) ) {
+                               $this->errors[] = $warnings;
+                       }
                }
 
                // Save response to file cache unless there are errors
@@ -799,11 +800,6 @@ class ResourceLoader implements LoggerAwareInterface {
                        $exp = min( $maxage, $smaxage );
                        header( 'Expires: ' . wfTimestamp( TS_RFC2822, $exp + time() ) );
                }
-
-               // Send the current time expressed as fractional seconds since epoch,
-               // with microsecond precision. This helps distinguish hits from misses
-               // in edge caches.
-               header( 'MediaWiki-Timestamp: ' . microtime( true ) );
        }
 
        /**
@@ -877,8 +873,11 @@ class ResourceLoader implements LoggerAwareInterface {
                        $response = $fileCache->fetchText();
                        // Capture any PHP warnings from the output buffer and append them to the
                        // response in a comment if we're in debug mode.
-                       if ( $context->getDebug() && strlen( $warnings = ob_get_contents() ) ) {
-                               $response = self::makeComment( $warnings ) . $response;
+                       if ( $context->getDebug() ) {
+                               $warnings = ob_get_contents();
+                               if ( strlen( $warnings ) ) {
+                                       $response = self::makeComment( $warnings ) . $response;
+                               }
                        }
                        // Remove the output buffer and output the response
                        ob_end_clean();
@@ -963,19 +962,6 @@ MESSAGE;
                        return $data;
                }
 
-               // Pre-fetch blobs
-               if ( $context->shouldIncludeMessages() ) {
-                       try {
-                               $this->blobStore->get( $this, $modules, $context->getLanguage() );
-                       } catch ( Exception $e ) {
-                               MWExceptionHandler::logException( $e );
-                               $this->logger->warning( 'Prefetching MessageBlobStore failed: {exception}', array(
-                                       'exception' => $e
-                               ) );
-                               $this->errors[] = self::formatExceptionNoComment( $e );
-                       }
-               }
-
                foreach ( $missing as $name ) {
                        $states[$name] = 'missing';
                }
@@ -1068,6 +1054,23 @@ MESSAGE;
                return $out;
        }
 
+       /**
+        * Get names of modules that use a certain message.
+        *
+        * @param string $messageKey
+        * @return array List of module names
+        */
+       public function getModulesByMessage( $messageKey ) {
+               $moduleNames = array();
+               foreach ( $this->getModuleNames() as $moduleName ) {
+                       $module = $this->getModule( $moduleName );
+                       if ( in_array( $messageKey, $module->getMessages() ) ) {
+                               $moduleNames[] = $moduleName;
+                       }
+               }
+               return $moduleNames;
+       }
+
        /* Static Methods */
 
        /**
index 2e1752a..78bf69d 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Context for resource loader modules.
+ * Context for ResourceLoader 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
@@ -29,28 +29,30 @@ use MediaWiki\Logger\LoggerFactory;
  * of a specific loader request
  */
 class ResourceLoaderContext {
-       /* Protected Members */
-
        protected $resourceLoader;
        protected $request;
-       protected $modules;
-       protected $language;
-       protected $direction;
+       protected $logger;
+
+       // Module content vary
        protected $skin;
-       protected $user;
+       protected $language;
        protected $debug;
+       protected $user;
+
+       // Request vary (in addition to cache vary)
+       protected $modules;
        protected $only;
        protected $version;
-       protected $hash;
        protected $raw;
        protected $image;
        protected $variant;
        protected $format;
+
+       protected $direction;
+       protected $hash;
        protected $userObj;
        protected $imageObj;
 
-       /* Methods */
-
        /**
         * @param ResourceLoader $resourceLoader
         * @param WebRequest $request
@@ -58,6 +60,7 @@ class ResourceLoaderContext {
        public function __construct( ResourceLoader $resourceLoader, WebRequest $request ) {
                $this->resourceLoader = $resourceLoader;
                $this->request = $request;
+               $this->logger = $resourceLoader->getLogger();
 
                // List of modules
                $modules = $request->getVal( 'modules' );
@@ -146,6 +149,14 @@ class ResourceLoaderContext {
                return $this->request;
        }
 
+       /**
+        * @since 1.27
+        * @return \Psr\Log\LoggerInterface
+        */
+       public function getLogger() {
+               return $this->logger;
+       }
+
        /**
         * @return array
         */
@@ -158,8 +169,16 @@ class ResourceLoaderContext {
         */
        public function getLanguage() {
                if ( $this->language === null ) {
-                       // Must be a valid language code after this point (bug 62849)
-                       $this->language = RequestContext::sanitizeLangCode( $this->getRequest()->getVal( 'lang' ) );
+                       // Must be a valid language code after this point (T64849)
+                       // Only support uselang values that follow built-in conventions (T102058)
+                       $lang = $this->getRequest()->getVal( 'lang', '' );
+                       // Stricter version of RequestContext::sanitizeLangCode()
+                       if ( !Language::isValidBuiltInCode( $lang ) ) {
+                               wfDebug( "Invalid user language code\n" );
+                               global $wgLanguageCode;
+                               $lang = $wgLanguageCode;
+                       }
+                       $this->language = $lang;
                }
                return $this->language;
        }
@@ -325,14 +344,31 @@ class ResourceLoaderContext {
        }
 
        /**
+        * All factors that uniquely identify this request, except 'modules'.
+        *
+        * The list of modules is excluded here for legacy reasons as most callers already
+        * split up handling of individual modules. Including it here would massively fragment
+        * the cache and decrease its usefulness.
+        *
+        * E.g. Used by RequestFileCache to form a cache key for storing the reponse output.
+        *
         * @return string
         */
        public function getHash() {
                if ( !isset( $this->hash ) ) {
                        $this->hash = implode( '|', array(
-                               $this->getLanguage(), $this->getDirection(), $this->getSkin(), $this->getUser(),
-                               $this->getImage(), $this->getVariant(), $this->getFormat(),
-                               $this->getDebug(), $this->getOnly(), $this->getVersion()
+                               // Module content vary
+                               $this->getLanguage(),
+                               $this->getSkin(),
+                               $this->getDebug(),
+                               $this->getUser(),
+                               // Request vary
+                               $this->getOnly(),
+                               $this->getVersion(),
+                               $this->getRaw(),
+                               $this->getImage(),
+                               $this->getVariant(),
+                               $this->getFormat(),
                        ) );
                }
                return $this->hash;
index b415bca..2a6af71 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for the edit toolbar.
+ * ResourceLoader module for the edit toolbar.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1b827db..f5b3bad 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module based on local JavaScript/CSS files.
+ * ResourceLoader 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
@@ -73,15 +73,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         */
        protected $debugScripts = array();
 
-       /**
-        * @var array List of paths to JavaScript files to include in the startup module
-        * @par Usage:
-        * @code
-        * array( [file-path], [file-path], ... )
-        * @endcode
-        */
-       protected $loaderScripts = array();
-
        /**
         * @var array List of paths to CSS files to always include
         * @par Usage:
@@ -195,8 +186,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         ),
         *         // Scripts to include in debug contexts
         *         'debugScripts' => [file path string or array of file path strings],
-        *         // Scripts to include in the startup module
-        *         'loaderScripts' => [file path string or array of file path strings],
         *         // Modules which must be loaded before this module
         *         'dependencies' => [module name string or array of module name strings],
         *         'templates' => array(
@@ -239,7 +228,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                // Lists of file paths
                                case 'scripts':
                                case 'debugScripts':
-                               case 'loaderScripts':
                                case 'styles':
                                        $this->{$member} = (array)$option;
                                        break;
@@ -279,7 +267,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                        break;
                                // Single strings
                                case 'position':
-                                       $this->isPositionDefined = true;
                                case 'group':
                                case 'skipFunction':
                                        $this->{$member} = (string)$option;
@@ -391,18 +378,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->debugRaw;
        }
 
-       /**
-        * Get loader script.
-        *
-        * @return string|bool JavaScript code to be added to startup module
-        */
-       public function getLoaderScript() {
-               if ( count( $this->loaderScripts ) === 0 ) {
-                       return false;
-               }
-               return $this->readScriptFiles( $this->loaderScripts );
-       }
-
        /**
         * Get all styles for a given context.
         *
@@ -470,7 +445,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
 
        /**
         * Gets list of names of modules this module depends on.
-        * @param ResourceLoaderContext context
+        * @param ResourceLoaderContext|null $context
         * @return array List of module names
         */
        public function getDependencies( ResourceLoaderContext $context = null ) {
@@ -552,8 +527,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        $this->templates,
                        $context->getDebug() ? $this->debugScripts : array(),
                        $this->getLanguageScripts( $context->getLanguage() ),
-                       self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' ),
-                       $this->loaderScripts
+                       self::tryForKey( $this->skinScripts, $context->getSkin(), 'default' )
                );
                if ( $this->skipFunction ) {
                        $files[] = $this->skipFunction;
@@ -593,7 +567,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        // - position (only used by OutputPage)
                        'scripts',
                        'debugScripts',
-                       'loaderScripts',
                        'styles',
                        'languageScripts',
                        'skinScripts',
@@ -610,7 +583,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                $summary[] = array(
                        'options' => $options,
                        'fileHashes' => $this->getFileHashes( $context ),
-                       'msgBlobMtime' => $this->getMsgBlobMtime( $context->getLanguage() ),
+                       'messageBlob' => $this->getMessageBlob( $context ),
                );
                return $summary;
        }
@@ -962,7 +935,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                static $cache;
 
                if ( !$cache ) {
-                       $cache = ObjectCache::newAccelerator( CACHE_ANYTHING );
+                       $cache = ObjectCache::getLocalServerInstance( CACHE_ANYTHING );
                }
 
                // Construct a cache key from the LESS file name and a hash digest
index 8de87f2..27e1201 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for generated and embedded images.
+ * ResourceLoader module for generated and embedded 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
@@ -22,7 +22,7 @@
  */
 
 /**
- * Resource loader module for generated and embedded images.
+ * ResourceLoader module for generated and embedded images.
  *
  * @since 1.25
  */
@@ -184,7 +184,6 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                        break;
 
                                case 'position':
-                                       $this->isPositionDefined = true;
                                case 'prefix':
                                case 'selectorWithoutVariant':
                                case 'selectorWithVariant':
@@ -372,8 +371,8 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
        protected function getCssDeclarations( $primary, $fallback ) {
                return array(
                        "background-image: url($fallback);",
-                       "background-image: -webkit-linear-gradient(transparent, transparent), url($primary);",
                        "background-image: linear-gradient(transparent, transparent), url($primary);",
+                       // Do not serve SVG to Opera 12, bad rendering with border-radius or background-size (T87504)
                        "background-image: -o-linear-gradient(transparent, transparent), url($fallback);",
                );
        }
@@ -456,9 +455,4 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                $this->loadFromDefinition();
                return $this->position;
        }
-
-       public function isPositionDefault() {
-               $this->loadFromDefinition();
-               return parent::isPositionDefault();
-       }
 }
index 27c74d7..83db567 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for populating language specific data.
+ * ResourceLoader 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
index 081c728..3c6e1fa 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for providing language names.
+ * ResourceLoader module for providing language names.
  *
  * By default these names will be autonyms however other extensions may
  * provided language names in the context language (e.g. cldr extension)
index 714a8ff..113fc84 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Abstraction for resource loader modules.
+ * Abstraction for ResourceLoader 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
  * @author Roan Kattouw
  */
 
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
 /**
- * Abstraction for resource loader modules, with name registration and maxage functionality.
+ * Abstraction for ResourceLoader modules, with name registration and maxage functionality.
  */
-abstract class ResourceLoaderModule {
+abstract class ResourceLoaderModule implements LoggerAwareInterface {
        # Type of resource
        const TYPE_SCRIPTS = 'scripts';
        const TYPE_STYLES = 'styles';
@@ -60,22 +64,23 @@ abstract class ResourceLoaderModule {
 
        // In-object cache for file dependencies
        protected $fileDeps = array();
-       // In-object cache for message blob mtime
-       protected $msgBlobMtime = array();
+       // In-object cache for message blob (keyed by language)
+       protected $msgBlobs = array();
        // In-object cache for version hash
        protected $versionHash = array();
        // In-object cache for module content
        protected $contents = array();
 
-       // Whether the position returned by getPosition() is defined in the module configuration
-       // and not a default value
-       protected $isPositionDefined = false;
-
        /**
         * @var Config
         */
        protected $config;
 
+       /**
+        * @var LoggerInterface
+        */
+       protected $logger;
+
        /* Methods */
 
        /**
@@ -172,6 +177,25 @@ abstract class ResourceLoaderModule {
                $this->config = $config;
        }
 
+       /**
+        * @since 1.27
+        * @param LoggerInterface $logger
+        */
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
+       }
+
+       /**
+        * @since 1.27
+        * @return LoggerInterface
+        */
+       protected function getLogger() {
+               if ( !$this->logger ) {
+                       $this->logger = new NullLogger();
+               }
+               return $this->logger;
+       }
+
        /**
         * Get the URL or URLs to load for this module's JS in debug mode.
         * The default behavior is to return a load.php?only=scripts URL for
@@ -291,19 +315,6 @@ abstract class ResourceLoaderModule {
                return 'bottom';
        }
 
-       /**
-        * Whether the position returned by getPosition() is a default value or comes from the module
-        * definition. This method is meant to be short-lived, and is only useful until classes added
-        * via addModuleStyles with a default value define an explicit position. See getModuleStyles()
-        * in OutputPage for the related migration warning.
-        *
-        * @return bool
-        * @since  1.26
-        */
-       public function isPositionDefault() {
-               return !$this->isPositionDefined;
-       }
-
        /**
         * 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
@@ -315,25 +326,12 @@ abstract class ResourceLoaderModule {
                return false;
        }
 
-       /**
-        * Get the loader JS for this module, if set.
-        *
-        * @return mixed JavaScript loader code as a string or boolean false if no custom loader set
-        */
-       public function getLoaderScript() {
-               // Stub, override expected
-               return false;
-       }
-
        /**
         * Get a list of modules this module depends on.
         *
         * Dependency information is taken into account when loading a module
         * on the client side.
         *
-        * To add dependencies dynamically on the client side, use a custom
-        * loader script, see getLoaderScript()
-        *
         * Note: It is expected that $context will be made non-optional in the near
         * future.
         *
@@ -483,45 +481,40 @@ abstract class ResourceLoaderModule {
        }
 
        /**
-        * Get the last modification timestamp of the messages in this module for a given language.
-        * @param string $lang Language code
-        * @return int UNIX timestamp
+        * Get the hash of the message blob.
+        *
+        * @since 1.27
+        * @param ResourceLoaderContext $context
+        * @return string|null JSON blob or null if module has no messages
         */
-       public function getMsgBlobMtime( $lang ) {
-               if ( !isset( $this->msgBlobMtime[$lang] ) ) {
-                       if ( !count( $this->getMessages() ) ) {
-                               return 1;
-                       }
-
-                       $dbr = wfGetDB( DB_SLAVE );
-                       $msgBlobMtime = $dbr->selectField( 'msg_resource',
-                               'mr_timestamp',
-                               array(
-                                       'mr_resource' => $this->getName(),
-                                       'mr_lang' => $lang
-                               ),
-                               __METHOD__
-                       );
-                       // If no blob was found, but the module does have messages, that means we need
-                       // to regenerate it. Return NOW
-                       if ( $msgBlobMtime === false ) {
-                               $msgBlobMtime = wfTimestampNow();
-                       }
-                       $this->msgBlobMtime[$lang] = wfTimestamp( TS_UNIX, $msgBlobMtime );
+       protected function getMessageBlob( ResourceLoaderContext $context ) {
+               if ( !$this->getMessages() ) {
+                       // Don't bother consulting MessageBlobStore
+                       return null;
+               }
+               // Message blobs may only vary language, not by context keys
+               $lang = $context->getLanguage();
+               if ( !isset( $this->msgBlobs[$lang] ) ) {
+                       $this->getLogger()->warning( 'Message blob for {module} should have been preloaded', array(
+                               'module' => $this->getName(),
+                       ) );
+                       $store = $context->getResourceLoader()->getMessageBlobStore();
+                       $this->msgBlobs[$lang] = $store->getBlob( $this, $lang );
                }
-               return $this->msgBlobMtime[$lang];
+               return $this->msgBlobs[$lang];
        }
 
        /**
-        * Set in-object cache for message blob time.
+        * Set in-object cache for message blobs.
         *
-        * This is used to retrieve data in batches. See ResourceLoader::preloadModuleInfo().
+        * Used to allow fetching of message blobs in batches. See ResourceLoader::preloadModuleInfo().
         *
+        * @since 1.27
+        * @param string|null $blob JSON blob or null
         * @param string $lang Language code
-        * @param int $mtime UNIX timestamp
         */
-       public function setMsgBlobMtime( $lang, $mtime ) {
-               $this->msgBlobMtime[$lang] = $mtime;
+       public function setMessageBlob( $blob, $lang ) {
+               $this->msgBlobs[$lang] = $blob;
        }
 
        /**
@@ -637,13 +630,9 @@ abstract class ResourceLoaderModule {
                }
 
                // Messages
-               $blobs = $rl->getMessageBlobStore()->get(
-                       $rl,
-                       array( $this->getName() => $this ),
-                       $context->getLanguage()
-               );
-               if ( isset( $blobs[$this->getName()] ) ) {
-                       $content['messagesBlob'] = $blobs[$this->getName()];
+               $blob = $this->getMessageBlob( $context );
+               if ( $blob ) {
+                       $content['messagesBlob'] = $blob;
                }
 
                $templates = $this->getTemplates();
@@ -776,7 +765,7 @@ abstract class ResourceLoaderModule {
         * A number of utility methods are available to help you gather data. These are not
         * called by default and must be included by the subclass' getDefinitionSummary().
         *
-        * - getMsgBlobMtime()
+        * - getMessageBlob()
         *
         * @since 1.23
         * @param ResourceLoaderContext $context
@@ -874,7 +863,7 @@ abstract class ResourceLoaderModule {
        protected function validateScriptFile( $fileName, $contents ) {
                if ( $this->getConfig()->get( 'ResourceLoaderValidateJS' ) ) {
                        // Try for cache hit
-                       $cache = ObjectCache::getLocalClusterInstance();
+                       $cache = ObjectCache::getMainWANInstance();
                        $key = $cache->makeKey(
                                'resourceloader',
                                'jsparse',
index 380b7a5..eba6815 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for site customizations.
+ * ResourceLoader 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
index 911d953..e1df6d9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for skin stylesheets.
+ * ResourceLoader module for skin stylesheets.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8170cb1..862f629 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for populating special characters data for some
+ * ResourceLoader module for populating special characters data for some
  * editing extensions to use.
  *
  * This program is free software; you can redistribute it and/or modify
@@ -22,7 +22,7 @@
  */
 
 /**
- * Resource loader module for populating special characters data for some
+ * ResourceLoader module for populating special characters data for some
  * editing extensions to use.
  */
 class ResourceLoaderSpecialCharacterDataModule extends ResourceLoaderModule {
index 4a672f2..fc128fb 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Module for resource loader initialization.
+ * Module for ResourceLoader 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
@@ -104,6 +104,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgResourceLoaderLegacyModules' => self::getLegacyModules(),
                        'wgForeignUploadTargets' => $conf->get( 'ForeignUploadTargets' ),
                        'wgEnableUploads' => $conf->get( 'EnableUploads' ),
+                       'wgForeignUploadTestEnabled' => $conf->get( 'ForeignUploadTestEnabled' ),
+                       'wgForeignUploadTestDefault' => $conf->get( 'ForeignUploadTestDefault' ),
                );
 
                Hooks::run( 'ResourceLoaderGetConfigVars', array( &$vars ) );
@@ -163,13 +165,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
         *  - array 'dependencies'
         *  - string|null 'group'
         *  - string 'source'
-        *  - string|false 'loader'
         */
        public static function compileUnresolvedDependencies( array &$registryData ) {
                foreach ( $registryData as $name => &$data ) {
-                       if ( $data['loader'] !== false ) {
-                               continue;
-                       }
                        $dependencies = $data['dependencies'];
                        foreach ( $data['dependencies'] as $dependency ) {
                                $implicitDependencies = self::getImplicitDependencies( $registryData, $dependency );
@@ -191,8 +189,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                $resourceLoader = $context->getResourceLoader();
                $target = $context->getRequest()->getVal( 'target', 'desktop' );
-               // Bypass target filter if this request is from a unit test context. To prevent misuse in
-               // production, this is only allowed if testing is enabled server-side.
+               // Bypass target filter if this request is Special:JavaScriptTest.
+               // To prevent misuse in production, this is only allowed if testing is enabled server-side.
                $byPassTargetFilter = $this->getConfig()->get( 'EnableJavaScriptTest' ) && $target === 'test';
 
                $out = '';
@@ -215,6 +213,13 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                        $versionHash = $module->getVersionHash( $context );
                        if ( strlen( $versionHash ) !== 8 ) {
+                               $context->getLogger()->warning(
+                                       "Module '{module}' produced an invalid version hash: '{version}'.",
+                                       array(
+                                               'module' => $name,
+                                               'version' => $versionHash,
+                                       )
+                               );
                                // Module implementation either broken or deviated from ResourceLoader::makeHash
                                // Asserted by tests/phpunit/structure/ResourcesTest.
                                $versionHash = ResourceLoader::makeHash( $versionHash );
@@ -230,7 +235,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                'dependencies' => $module->getDependencies( $context ),
                                'group' => $module->getGroup(),
                                'source' => $module->getSource(),
-                               'loader' => $module->getLoaderScript(),
                                'skip' => $skipFunction,
                        );
                }
@@ -240,22 +244,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register sources
                $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
 
-               // Concatenate module loader scripts and figure out the different call
-               // signatures for mw.loader.register
+               // Figure out the different call signatures for mw.loader.register
                $registrations = array();
                foreach ( $registryData as $name => $data ) {
-                       if ( $data['loader'] !== false ) {
-                               $out .= ResourceLoader::makeCustomLoaderScript(
-                                       $name,
-                                       $data['version'],
-                                       $data['dependencies'],
-                                       $data['group'],
-                                       $data['source'],
-                                       $data['loader']
-                               );
-                               continue;
-                       }
-
                        // Call mw.loader.register(name, version, dependencies, group, source, skip)
                        $registrations[] = array(
                                $name,
index 65d770e..6705336 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user preference customizations.
+ * ResourceLoader 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
index eba61ed..abcf9c6 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for default user preferences.
+ * ResourceLoader module for default user preferences.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 417cfce..dd4dd5c 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user customizations.
+ * ResourceLoader 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
index a097844..d45e281 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user customizations.
+ * ResourceLoader 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
index 0847109..94f1e68 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user preference customizations.
+ * ResourceLoader 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
index 28f1b9a..78fec50 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Resource loader module for user tokens.
+ * ResourceLoader 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
@@ -47,6 +47,7 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
                        'editToken' => $user->getEditToken(),
                        'patrolToken' => $user->getEditToken( 'patrol' ),
                        'watchToken' => $user->getEditToken( 'watch' ),
+                       'csrfToken' => $user->getEditToken(),
                );
        }
 
index 156ff4e..52eb2d8 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Abstraction for resource loader modules which pull from wiki pages.
+ * Abstraction for ResourceLoader modules that 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
@@ -23,7 +23,7 @@
  */
 
 /**
- * Abstraction for resource loader modules which pull from wiki pages
+ * Abstraction for ResourceLoader modules which pull from wiki pages
  *
  * This can only be used for wiki pages in the MediaWiki and User namespaces,
  * because of its dependence on the functionality of Title::isCssJsSubpage.
@@ -72,8 +72,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                foreach ( $options as $member => $option ) {
                        switch ( $member ) {
                                case 'position':
-                                       $this->isPositionDefined = true;
-                                       // Don't break since we need the member set as well
                                case 'styles':
                                case 'scripts':
                                case 'group':
index 2295eaa..c8276fc 100644 (file)
@@ -108,16 +108,18 @@ class RevDelFileList extends RevDelList {
                $file = wfLocalFile( $this->title );
                $file->purgeCache();
                $file->purgeDescription();
+
+               // Purge full images from cache
                $purgeUrls = array();
                foreach ( $this->ids as $timestamp ) {
                        $archiveName = $timestamp . '!' . $this->title->getDBkey();
                        $file->purgeOldThumbnails( $archiveName );
                        $purgeUrls[] = $file->getArchiveUrl( $archiveName );
                }
-               if ( $this->getConfig()->get( 'UseSquid' ) ) {
-                       // purge full images from cache
-                       SquidUpdate::purge( $purgeUrls );
-               }
+               DeferredUpdates::addUpdate(
+                       new CdnCacheUpdate( $purgeUrls ),
+                       DeferredUpdates::PRESEND
+               );
 
                return Status::newGood();
        }
index db2bc6a..d68ef45 100644 (file)
@@ -85,7 +85,8 @@ class RevisionDeleter {
                if ( !$typeName ) {
                        throw new MWException( __METHOD__ . ": Unknown RevDel type '$typeName'" );
                }
-               return new self::$allowedTypes[$typeName]( $context, $title, $ids );
+               $class = self::$allowedTypes[$typeName];
+               return new $class( $context, $title, $ids );
        }
 
        /**
diff --git a/includes/search/SearchExactMatchRescorer.php b/includes/search/SearchExactMatchRescorer.php
new file mode 100644 (file)
index 0000000..0ff628d
--- /dev/null
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Rescores results from a prefix search/opensearch to make sure the
+ * exact match is the first 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
+ */
+
+/**
+ * An utility class to rescore search results by looking for an exact match
+ * in the db and add the page found to the first position.
+ *
+ * NOTE: extracted from TitlePrefixSearch
+ * @ingroup Search
+ */
+class SearchExactMatchRescorer {
+       /**
+        * Default search backend does proper prefix searching, but custom backends
+        * may sort based on other algorithms that may cause the exact title match
+        * to not be in the results or be lower down the list.
+        * @param string $search the query
+        * @param int[] $namespaces the namespaces
+        * @param int $limit the max number of results to return
+        * @param string[] $srchres results
+        * @return string[] munged results
+        */
+       public function rescore( $search, $namespaces, $srchres, $limit ) {
+               // Pick namespace (based on PrefixSearch::defaultSearchBackend)
+               $ns = in_array( NS_MAIN, $namespaces ) ? NS_MAIN : $namespaces[0];
+               $t = Title::newFromText( $search, $ns );
+               if ( !$t || !$t->exists() ) {
+                       // No exact match so just return the search results
+                       return $srchres;
+               }
+               $string = $t->getPrefixedText();
+               $key = array_search( $string, $srchres );
+               if ( $key !== false ) {
+                       // Exact match was in the results so just move it to the front
+                       return $this->pullFront( $key, $srchres );
+               }
+               // Exact match not in the search results so check for some redirect handling cases
+               if ( $t->isRedirect() ) {
+                       $target = $this->getRedirectTarget( $t );
+                       $key = array_search( $target, $srchres );
+                       if ( $key !== false ) {
+                               // Exact match is a redirect to one of the returned matches so pull the
+                               // returned match to the front.  This might look odd but the alternative
+                               // is to put the redirect in front and drop the match.  The name of the
+                               // found match is often more descriptive/better formed than the name of
+                               // the redirect AND by definition they share a prefix.  Hopefully this
+                               // choice is less confusing and more helpful.  But it might not be.  But
+                               // it is the choice we're going with for now.
+                               return $this->pullFront( $key, $srchres );
+                       }
+                       $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
+                       if ( isset( $redirectTargetsToRedirect[$target] ) ) {
+                               // The exact match and something in the results list are both redirects
+                               // to the same thing!  In this case we'll pull the returned match to the
+                               // top following the same logic above.  Again, it might not be a perfect
+                               // choice but it'll do.
+                               return $this->pullFront( $redirectTargetsToRedirect[$target], $srchres );
+                       }
+               } else {
+                       $redirectTargetsToRedirect = $this->redirectTargetsToRedirect( $srchres );
+                       if ( isset( $redirectTargetsToRedirect[$string] ) ) {
+                               // The exact match is the target of a redirect already in the results list so remove
+                               // the redirect from the results list and push the exact match to the front
+                               array_splice( $srchres, $redirectTargetsToRedirect[$string], 1 );
+                               array_unshift( $srchres, $string );
+                               return $srchres;
+                       }
+               }
+
+               // Exact match is totally unique from the other results so just add it to the front
+               array_unshift( $srchres, $string );
+               // And roll one off the end if the results are too long
+               if ( count( $srchres ) > $limit ) {
+                       array_pop( $srchres );
+               }
+               return $srchres;
+       }
+
+       /**
+        * @param string[] $titles as strings
+        * @return array redirect target prefixedText to index of title in titles
+        *   that is a redirect to it.
+        */
+       private function redirectTargetsToRedirect( $titles ) {
+               $result = array();
+               foreach ( $titles as $key => $titleText ) {
+                       $title = Title::newFromText( $titleText );
+                       if ( !$title || !$title->isRedirect() ) {
+                               continue;
+                       }
+                       $target = $this->getRedirectTarget( $title );
+                       if ( !$target ) {
+                               continue;
+                       }
+                       $result[$target] = $key;
+               }
+               return $result;
+       }
+
+       /**
+        * Returns an array where the element of $array at index $key becomes
+        * the first element.
+        * @param int $key key to pull to the front
+        * @return array $array with the item at $key pulled to the front
+        */
+       private function pullFront( $key, $array ) {
+               $cut = array_splice( $array, $key, 1 );
+               array_unshift( $array, $cut[0] );
+               return $array;
+       }
+
+       /**
+        * Get a redirect's destination from a title
+        * @param Title $title A title to redirect. It may not redirect or even exist
+        * @return null|string If title exists and redirects, get the destination's prefixed name
+        */
+       private function getRedirectTarget( $title ) {
+               $page = WikiPage::factory( $title );
+               if ( !$page->exists() ) {
+                       return null;
+               }
+               $redir = $page->getRedirectTarget();
+               return $redir ? $redir->getPrefixedText() : null;
+       }
+}
index 5821148..6dad342 100644 (file)
@@ -191,8 +191,7 @@ class SearchOracle extends SearchDatabase {
                                        foreach ( $temp_terms as $t ) {
                                                $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $t );
                                        }
-                               }
-                               else {
+                               } else {
                                        $searchon .= ( $terms[1] == '-' ? ' ~' : ' & ' ) . $this->escapeTerm( $terms[2] );
                                }
                                if ( !empty( $terms[3] ) ) {
index 60c4249..649ef4f 100644 (file)
@@ -84,14 +84,11 @@ class SearchPostgres extends SearchDatabase {
                                }
                                if ( strtolower( $terms[2] ) === 'and' ) {
                                        $searchstring .= ' & ';
-                               }
-                               elseif ( strtolower( $terms[2] ) === 'or' || $terms[2] === '|' ) {
+                               } elseif ( strtolower( $terms[2] ) === 'or' || $terms[2] === '|' ) {
                                        $searchstring .= ' | ';
-                               }
-                               elseif ( strtolower( $terms[2] ) === 'not' ) {
+                               } elseif ( strtolower( $terms[2] ) === 'not' ) {
                                        $searchstring .= ' & !';
-                               }
-                               else {
+                               } else {
                                        $searchstring .= " & $terms[2]";
                                }
                        }
@@ -147,8 +144,7 @@ class SearchPostgres extends SearchDatabase {
                        $query = "SELECT page_id, page_namespace, page_title, 0 AS score " .
                                "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
                                "AND r.rev_text_id = c.old_id AND 1=0";
-               }
-               else {
+               } else {
                        $m = array();
                        if ( preg_match_all( "/'([^']+)'/", $top, $m, PREG_SET_ORDER ) ) {
                                foreach ( $m as $terms ) {
@@ -157,9 +153,9 @@ class SearchPostgres extends SearchDatabase {
                        }
 
                        $query = "SELECT page_id, page_namespace, page_title, " .
-                       "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score " .
-                       "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
-                       "AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
+                               "ts_rank($fulltext, to_tsquery($searchstring), 5) AS score " .
+                               "FROM page p, revision r, pagecontent c WHERE p.page_latest = r.rev_id " .
+                               "AND r.rev_text_id = c.old_id AND $fulltext @@ to_tsquery($searchstring)";
                }
 
                # # Namespaces - defaults to 0
index 6178756..8fb04e4 100644 (file)
  * @ingroup Search
  */
 class SearchResultSet {
+
+       /**
+        * Types of interwiki results
+        */
+       /**
+        * Results that are displayed only together with existing main wiki results
+        * @var int
+        */
+       const SECONDARY_RESULTS = 0;
+       /**
+        * Results that can displayed even if no existing main wiki results exist
+        * @var int
+        */
+       const INLINE_RESULTS = 1;
+
        protected $containedSyntax = false;
 
        public function __construct( $containedSyntax = false ) {
@@ -116,7 +131,7 @@ class SearchResultSet {
         *
         * @return SearchResultSet
         */
-       function getInterwikiResults() {
+       function getInterwikiResults( $type = self::SECONDARY_RESULTS ) {
                return null;
        }
 
@@ -125,8 +140,8 @@ class SearchResultSet {
         *
         * @return bool
         */
-       function hasInterwikiResults() {
-               return $this->getInterwikiResults() != null;
+       function hasInterwikiResults( $type = self::SECONDARY_RESULTS ) {
+               return false;
        }
 
        /**
index 5aa39c7..c0246bc 100644 (file)
@@ -698,9 +698,3 @@ class Site implements Serializable {
                $this->setInternalId( $fields['internalid'] );
        }
 }
-
-/**
- * @deprecated since 1.21
- */
-class SiteObject extends Site {
-}
index da883d9..691e24b 100644 (file)
@@ -350,9 +350,3 @@ class SiteList extends GenericArrayObject {
                return $serializationData;
        }
 }
-
-/**
- * @deprecated since 1.21
- */
-class SiteArray extends SiteList {
-}
index 12ebb54..dbb7c7f 100644 (file)
@@ -232,7 +232,7 @@ abstract class Skin extends ContextSource {
                $title = $this->getRelevantTitle();
 
                // User/talk link
-               if ( $user->isLoggedIn() || $this->showIPinHeader() ) {
+               if ( $user->isLoggedIn() ) {
                        $titles[] = $user->getUserPage();
                        $titles[] = $user->getTalkPage();
                }
@@ -725,12 +725,12 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Returns true if the IP should be shown in the header
-        * @return bool
+        * @deprecated since 1.27, feature removed
+        * @return bool Always false
         */
        function showIPinHeader() {
-               global $wgShowIPinHeader;
-               return $wgShowIPinHeader && session_id() != '';
+               wfDeprecated( __METHOD__, '1.27' );
+               return false;
        }
 
        /**
@@ -1225,29 +1225,31 @@ abstract class Skin extends ContextSource {
        function buildSidebar() {
                global $wgEnableSidebarCache, $wgSidebarCacheExpiry;
 
-               $cache = ObjectCache::getMainWANInstance();
-               $key = wfMemcKey( 'sidebar', $this->getLanguage()->getCode() );
-
-               if ( $wgEnableSidebarCache ) {
-                       $cachedsidebar = $cache->get( $key );
-                       if ( $cachedsidebar ) {
-                               Hooks::run( 'SidebarBeforeOutput', array( $this, &$cachedsidebar ) );
-
-                               return $cachedsidebar;
-                       }
-               }
+               $that = $this;
+               $callback = function () use ( $that ) {
+                       $bar = array();
+                       $that->addToSidebar( $bar, 'sidebar' );
+                       Hooks::run( 'SkinBuildSidebar', array( $that, &$bar ) );
 
-               $bar = array();
-               $this->addToSidebar( $bar, 'sidebar' );
+                       return $bar;
+               };
 
-               Hooks::run( 'SkinBuildSidebar', array( $this, &$bar ) );
                if ( $wgEnableSidebarCache ) {
-                       $cache->set( $key, $bar, $wgSidebarCacheExpiry );
+                       $cache = ObjectCache::getMainWANInstance();
+                       $sidebar = $cache->getWithSetCallback(
+                               $cache->makeKey( 'sidebar', $this->getLanguage()->getCode() ),
+                               $wgSidebarCacheExpiry,
+                               $callback,
+                               array( 'lockTSE' => 30 )
+                       );
+               } else {
+                       $sidebar = $callback();
                }
 
-               Hooks::run( 'SidebarBeforeOutput', array( $this, &$bar ) );
+               // Apply post-processing to the cached value
+               Hooks::run( 'SidebarBeforeOutput', array( $this, &$sidebar ) );
 
-               return $bar;
+               return $sidebar;
        }
 
        /**
@@ -1259,7 +1261,7 @@ abstract class Skin extends ContextSource {
         * @param array $bar
         * @param string $message
         */
-       function addToSidebar( &$bar, $message ) {
+       public function addToSidebar( &$bar, $message ) {
                $this->addToSidebarPlain( $bar, wfMessage( $message )->inContentLanguage()->plain() );
        }
 
@@ -1443,8 +1445,8 @@ abstract class Skin extends ContextSource {
                                )->numParams( $plural );
                        }
                        $newMessagesAlert = $newMessagesAlert->text();
-                       # Disable Squid cache
-                       $out->setSquidMaxage( 0 );
+                       # Disable CDN cache
+                       $out->setCdnMaxage( 0 );
                } elseif ( count( $newtalks ) ) {
                        $sep = $this->msg( 'newtalkseparator' )->escaped();
                        $msgs = array();
@@ -1457,7 +1459,7 @@ abstract class Skin extends ContextSource {
                        }
                        $parts = implode( $sep, $msgs );
                        $newMessagesAlert = $this->msg( 'youhavenewmessagesmulti' )->rawParams( $parts )->escaped();
-                       $out->setSquidMaxage( 0 );
+                       $out->setCdnMaxage( 0 );
                }
 
                return $newMessagesAlert;
@@ -1516,24 +1518,6 @@ abstract class Skin extends ContextSource {
                return $notice;
        }
 
-       /**
-        * Get a notice based on page's namespace
-        *
-        * @return string HTML fragment
-        */
-       function getNamespaceNotice() {
-
-               $key = 'namespacenotice-' . $this->getTitle()->getNsText();
-               $namespaceNotice = $this->getCachedNotice( $key );
-               if ( $namespaceNotice && substr( $namespaceNotice, 0, 7 ) != '<p>&lt;' ) {
-                       $namespaceNotice = '<div id="namespacebanner">' . $namespaceNotice . '</div>';
-               } else {
-                       $namespaceNotice = '';
-               }
-
-               return $namespaceNotice;
-       }
-
        /**
         * Get the site notice
         *
index 4d7c03a..163f3d5 100644 (file)
@@ -207,7 +207,7 @@ class SkinTemplate extends Skin {
                $this->loggedin = $user->isLoggedIn();
                $this->username = $user->getName();
 
-               if ( $this->loggedin || $this->showIPinHeader() ) {
+               if ( $this->loggedin ) {
                        $this->userpageUrlDetails = self::makeUrlDetails( $this->userpage );
                } else {
                        # This won't be used in the standard skins, but we define it to preserve the interface
@@ -660,21 +660,28 @@ class SkinTemplate extends Skin {
                                'active' => $title->isSpecial( 'Userlogin' ) && $is_signup,
                        );
 
-                       if ( $this->showIPinHeader() ) {
-                               $href = &$this->userpageUrlDetails['href'];
+                       // No need to show Talk and Contributions to anons if they can't contribute!
+                       if ( User::groupHasPermission( '*', 'edit' ) ) {
+                               // Show the text "Not logged in"
                                $personal_urls['anonuserpage'] = array(
-                                       'text' => $this->username,
-                                       'href' => $href,
-                                       'class' => $this->userpageUrlDetails['exists'] ? false : 'new',
-                                       'active' => ( $pageurl == $href )
+                                       'text' => $this->msg( 'notloggedin' )->text()
                                );
-                               $usertalkUrlDetails = $this->makeTalkUrlDetails( $this->userpage );
-                               $href = &$usertalkUrlDetails['href'];
+
+                               // Because of caching, we can't link directly to the IP talk and
+                               // contributions pages. Instead we use the special page shortcuts
+                               // (which work correctly regardless of caching). This means we can't
+                               // determine whether these links are active or not, but since major
+                               // skins (MonoBook, Vector) don't use this information, it's not a
+                               // huge loss.
                                $personal_urls['anontalk'] = array(
                                        'text' => $this->msg( 'anontalk' )->text(),
-                                       'href' => $href,
-                                       'class' => $usertalkUrlDetails['exists'] ? false : 'new',
-                                       'active' => ( $pageurl == $href )
+                                       'href' => self::makeSpecialUrlSubpage( 'Mytalk', false ),
+                                       'active' => false
+                               );
+                               $personal_urls['anoncontribs'] = array(
+                                       'text' => $this->msg( 'anoncontribs' )->text(),
+                                       'href' => self::makeSpecialUrlSubpage( 'Mycontributions', false ),
+                                       'active' => false
                                );
                        }
 
index bfb29ae..9755e8e 100644 (file)
@@ -473,12 +473,37 @@ abstract class QueryPage extends SpecialPage {
         * Returns limit and offset, as returned by $this->getRequest()->getLimitOffset().
         * Subclasses may override this to further restrict or modify limit and offset.
         *
+        * @note Restricts the offset parameter, as most query pages have inefficient paging
         * @since 1.26
         *
         * @return int[] list( $limit, $offset )
         */
        protected function getLimitOffset() {
-               return $this->getRequest()->getLimitOffset();
+               list( $limit, $offset ) = $this->getRequest()->getLimitOffset();
+               if ( !$this->getConfig()->get( 'MiserMode' ) ) {
+                       $maxResults = $this->getMaxResults();
+                       // Can't display more than max results on a page
+                       $limit = min( $limit, $maxResults );
+                       // Can't skip over more than $maxResults
+                       $offset = min( $offset, $maxResults );
+                       // Can't let $offset + $limit > $maxResults
+                       $limit = min( $limit, $maxResults - $offset );
+               }
+               return array( $limit, $offset );
+       }
+
+       /**
+        * Get max number of results we can return in miser mode.
+        *
+        * Most QueryPage subclasses use inefficient paging, so limit the max amount we return
+        * This matters for uncached query pages that might otherwise accept an offset of 3 million
+        *
+        * @since 1.27
+        * @return int
+        */
+       protected function getMaxResults() {
+               // Max of 10000, unless we store more than 5000 in query cache.
+               return max( $this->getConfig()->get( 'QueryCacheLimit' ), 10000 );
        }
 
        /**
@@ -562,8 +587,10 @@ abstract class QueryPage extends SpecialPage {
                                        min( $this->numRows, $this->limit ), # do not show the one extra row, if exist
                                        $this->offset + 1, ( min( $this->numRows, $this->limit ) + $this->offset ) )->parseAsBlock() );
                                # Disable the "next" link when we reach the end
+                               $atEnd = ( $this->numRows <= $this->limit )
+                                       || ( $this->offset + $this-> limit  >= $this->getMaxResults() );
                                $paging = $this->getLanguage()->viewPrevNext( $this->getPageTitle( $par ), $this->offset,
-                                       $this->limit, $this->linkParameters(), ( $this->numRows <= $this->limit ) );
+                                       $this->limit, $this->linkParameters(), $atEnd );
                                $out->addHTML( '<p>' . $paging . '</p>' );
                        } else {
                                # No results to show, so don't bother with "showing X of Y" etc.
index 047e941..70c7a8b 100644 (file)
@@ -212,10 +212,20 @@ class ActiveUsersPager extends UsersPager {
                $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n";
                $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n";
 
-               # Username field
-               $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(),
-                       'username', 'offset', 20, $this->requestedUser,
-                       array( 'class' => 'mw-ui-input-inline', 'tabindex' => 1 ) ) . '<br />';
+               # Username field (with autocompletion support)
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
+               $out .= Xml::inputLabel(
+                       $this->msg( 'activeusers-from' )->text(),
+                       'username',
+                       'offset',
+                       20,
+                       $this->requestedUser,
+                       array(
+                               'class' => 'mw-ui-input-inline mw-autocomplete-user',
+                               'tabindex' => 1,
+                               'autofocus' => $this->requestedUser === '',
+                       )
+               ) . '<br />';
 
                $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(),
                        'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) );
@@ -230,7 +240,7 @@ class ActiveUsersPager extends UsersPager {
 
                # Submit button and form bottom
                $out .= Xml::submitButton(
-                       $this->msg( 'allpagessubmit' )->text(),
+                       $this->msg( 'activeusers-submit' )->text(),
                        array( 'tabindex' => 4 )
                ) . "\n";
                $out .= Xml::closeElement( 'fieldset' );
@@ -308,3 +318,5 @@ class SpecialActiveUsers extends SpecialPage {
                return 'users';
        }
 }
+
+
index ed1c903..8109cc9 100644 (file)
@@ -446,7 +446,7 @@ class AllMessagesTablePager extends TablePager {
                        return array( 'class' => $field );
                } else {
                        return array(
-                               'lang' => wfBCP47( $this->langcode ),
+                               'lang' => $this->lang->getHtmlCode(),
                                'dir' => $this->lang->getDir(),
                                'class' => $field
                        );
index 4348b14..9e75522 100644 (file)
@@ -71,7 +71,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                $namespace = $request->getInt( 'namespace' );
                $hideredirects = $request->getBool( 'hideredirects', false );
 
-               $namespaces = $this->getContext()->getLanguage()->getNamespaces();
+               $namespaces = $this->getLanguage()->getNamespaces();
 
                $out->setPageTitle(
                        ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) ) ?
@@ -90,66 +90,55 @@ class SpecialAllPages extends IncludableSpecialPage {
        }
 
        /**
-        * HTML for the top form
+        * Outputs the HTMLForm used on this page
         *
         * @param int $namespace A namespace constant (default NS_MAIN).
         * @param string $from DbKey we are starting listing at.
         * @param string $to DbKey we are ending listing at.
-        * @param bool $hideredirects Dont show redirects  (default false)
-        * @return string
+        * @param bool $hideRedirects Dont show redirects  (default false)
         */
-       function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '', $hideredirects = false ) {
-               $t = $this->getPageTitle();
-
-               $out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
-               $out .= Xml::openElement(
-                       'form',
-                       array( 'method' => 'get', 'action' => $this->getConfig()->get( 'Script' ) )
+       protected function outputHTMLForm( $namespace = NS_MAIN,
+               $from = '', $to = '', $hideRedirects = false
+       ) {
+               $fields = array(
+                       'from' => array(
+                               'type' => 'text',
+                               'name' => 'from',
+                               'id' => 'nsfrom',
+                               'size' => 30,
+                               'label-message' => 'allpagesfrom',
+                               'default' => str_replace( '_', ' ', $from ),
+                       ),
+                       'to' => array(
+                               'type' => 'text',
+                               'name' => 'to',
+                               'id' => 'nsto',
+                               'size' => 30,
+                               'label-message' => 'allpagesto',
+                               'default' => str_replace( '_', ' ', $to ),
+                       ),
+                       'namespace' => array(
+                               'type' => 'namespaceselect',
+                               'name' => 'namespace',
+                               'id' => 'namespace',
+                               'label-message' => 'namespace',
+                               'all' => null,
+                               'value' => $namespace,
+                       ),
+                       'hideredirects' => array(
+                               'type' => 'check',
+                               'name' => 'hideredirects',
+                               'id' => 'hidredirects',
+                               'label-message' => 'allpages-hide-redirects',
+                               'value' => $hideRedirects,
+                       ),
                );
-               $out .= Html::hidden( 'title', $t->getPrefixedText() );
-               $out .= Xml::openElement( 'fieldset' );
-               $out .= Xml::element( 'legend', null, $this->msg( 'allpages' )->text() );
-               $out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
-               $out .= "<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'allpagesfrom' )->text(), 'nsfrom' ) .
-                       "       </td>
-       <td class='mw-input'>" .
-                       Xml::input( 'from', 30, str_replace( '_', ' ', $from ), array( 'id' => 'nsfrom' ) ) .
-                       "       </td>
-</tr>
-<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'allpagesto' )->text(), 'nsto' ) .
-                       "       </td>
-                       <td class='mw-input'>" .
-                       Xml::input( 'to', 30, str_replace( '_', ' ', $to ), array( 'id' => 'nsto' ) ) .
-                       "               </td>
-</tr>
-<tr>
-       <td class='mw-label'>" .
-                       Xml::label( $this->msg( 'namespace' )->text(), 'namespace' ) .
-                       "       </td>
-                       <td class='mw-input'>" .
-                       Html::namespaceSelector(
-                               array( 'selected' => $namespace ),
-                               array( 'name' => 'namespace', 'id' => 'namespace' )
-                       ) . ' ' .
-                       Xml::checkLabel(
-                               $this->msg( 'allpages-hide-redirects' )->text(),
-                               'hideredirects',
-                               'hideredirects',
-                               $hideredirects
-                       ) . ' ' .
-                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
-                       "       </td>
-</tr>";
-               $out .= Xml::closeElement( 'table' );
-               $out .= Xml::closeElement( 'fieldset' );
-               $out .= Xml::closeElement( 'form' );
-               $out .= Xml::closeElement( 'div' );
-
-               return $out;
+               $form = HTMLForm::factory( 'table', $fields, $this->getContext() );
+               $form->setMethod( 'get' )
+                       ->setWrapperLegendMsg( 'allpages' )
+                       ->setSubmitTextMsg( 'allpagessubmit' )
+                       ->prepareForm()
+                       ->displayForm( false );
        }
 
        /**
@@ -216,8 +205,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                        );
 
                        if ( $res->numRows() > 0 ) {
-                               $out = Html::openElement( 'div', array( 'class' => 'mw-allpages-body' ) );
-                               $out .= Html::openElement( 'ul', array( 'class' => 'mw-allpages-chunk' ) );
+                               $out = Html::openElement( 'ul', array( 'class' => 'mw-allpages-chunk' ) );
 
                                while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
                                        $t = Title::newFromRow( $s );
@@ -233,7 +221,12 @@ class SpecialAllPages extends IncludableSpecialPage {
                                        $n++;
                                }
                                $out .= Html::closeElement( 'ul' );
-                               $out .= Html::closeElement( 'div' );
+
+                               if ( $res->numRows() > 2 ) {
+                                       // Only apply CSS column styles if there's more than 2 entries.
+                                       // Otherwise, rendering is broken as "mw-allpages-body"'s CSS column count is 3.
+                                       $out = Html::rawElement( 'div', array( 'class' => 'mw-allpages-body' ), $out );
+                               }
                        } else {
                                $out = '';
                        }
@@ -273,14 +266,10 @@ class SpecialAllPages extends IncludableSpecialPage {
                        return;
                }
 
+               $navLinks = array();
                $self = $this->getPageTitle();
 
-               $topLinks = array(
-                       Linker::link( $self, $this->msg( 'allpages' )->escaped() )
-               );
-               $bottomLinks = array();
-
-               # Do we put a previous link ?
+               // Generate a "previous page" link if needed
                if ( $prevTitle ) {
                        $query = array( 'from' => $prevTitle->getText() );
 
@@ -292,16 +281,16 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $prevLink = Linker::linkKnown(
+                       $navLinks[] = Linker::linkKnown(
                                $self,
                                $this->msg( 'prevpage', $prevTitle->getText() )->escaped(),
                                array(),
                                $query
                        );
-                       $topLinks[] = $prevLink;
-                       $bottomLinks[] = $prevLink;
+
                }
 
+               // Generate a "next page" link if needed
                if ( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
                        # $s is the first link of the next chunk
                        $t = Title::makeTitle( $namespace, $s->page_title );
@@ -315,36 +304,28 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $nextLink = Linker::linkKnown(
+                       $navLinks[] = Linker::linkKnown(
                                $self,
                                $this->msg( 'nextpage', $t->getText() )->escaped(),
                                array(),
                                $query
                        );
-                       $topLinks[] = $nextLink;
-                       $bottomLinks[] = $nextLink;
                }
 
-               $nsForm = $this->namespaceForm( $namespace, $from, $to, $hideredirects );
-               $out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ) .
-                       '<tr>
-                                               <td>' .
-                       $nsForm .
-                       '</td>
-                                               <td class="mw-allpages-nav">' .
-                       $this->getLanguage()->pipeList( $topLinks ) .
-                       '</td></tr></table>';
-
-               $output->addHTML( $out2 . $out );
-
-               if ( count( $bottomLinks ) ) {
-                       $output->addHTML(
-                               Html::element( 'hr' ) .
-                                       Html::rawElement( 'div', array( 'class' => 'mw-allpages-nav' ),
-                                               $this->getLanguage()->pipeList( $bottomLinks )
-                                       )
+               $this->outputHTMLForm( $namespace, $from, $to, $hideredirects );
+
+               if ( count( $navLinks ) ) {
+                       // Add pagination links
+                       $pagination = Html::rawElement( 'div',
+                               array( 'class' => 'mw-allpages-nav' ),
+                               $this->getLanguage()->pipeList( $navLinks )
                        );
+
+                       $output->addHTML( $pagination );
+                       $out .= Html::element( 'hr' ) . $pagination; // Footer
                }
+
+               $output->addHTML( $out );
        }
 
        /**
@@ -375,6 +356,26 @@ class SpecialAllPages extends IncludableSpecialPage {
                }
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || !$title->canExist() ) {
+                       // No prefix suggestion in special and media namespace
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search
+               $prefixSearcher = new StringPrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array(), $offset );
+               return $result;
+       }
+
        protected function getGroupName() {
                return 'pages';
        }
index 701f75f..9ea18da 100644 (file)
@@ -121,12 +121,20 @@ class BrokenRedirectsPage extends QueryPage {
                        array( 'redirect' => 'no' )
                );
                $links = array();
-               $links[] = Linker::linkKnown(
-                       $fromObj,
-                       $this->msg( 'brokenredirects-edit' )->escaped(),
-                       array(),
-                       array( 'action' => 'edit' )
-               );
+               // if the page is editable, add an edit link
+               if (
+                       // check user permissions
+                       $this->getUser()->isAllowed( 'edit' ) &&
+                       // check, if the content model is editable through action=edit
+                       ContentHandler::getForTitle( $fromObj )->supportsDirectEditing()
+               ) {
+                       $links[] = Linker::linkKnown(
+                               $fromObj,
+                               $this->msg( 'brokenredirects-edit' )->escaped(),
+                               array(),
+                               array( 'action' => 'edit' )
+                       );
+               }
                $to = Linker::link(
                        $toObj,
                        null,
@@ -147,13 +155,37 @@ class BrokenRedirectsPage extends QueryPage {
                        );
                }
 
-               $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()
-                       ->pipeList( $links ) )->escaped();
+               if ( $links ) {
+                       $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()
+                               ->pipeList( $links ) )->escaped();
+               }
                $out .= " {$arr} {$to}";
 
                return $out;
        }
 
+
+       /**
+        * Cache page content model for performance
+        *
+        * @param IDatabase $db
+        * @param ResultWrapper $res
+        */
+       function preprocessResults( $db, $res ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch;
+               foreach ( $res as $row ) {
+                       $batch->add( $row->namespace, $row->title );
+               }
+               $batch->execute();
+
+               // Back to start for display
+               $res->seek( 0 );
+       }
+
        protected function getGroupName() {
                return 'maintenance';
        }
index cea6ceb..564579a 100644 (file)
@@ -191,7 +191,7 @@ class CategoryPager extends AlphabeticPager {
                                                'from', 'from', 20, $from, array( 'class' => 'mw-ui-input-inline' ) ) .
                                                ' ' .
                                                Html::submitButton(
-                                                       $this->msg( 'allpagessubmit' )->text(),
+                                                       $this->msg( 'categories-submit' )->text(),
                                                        array(), array( 'mw-ui-progressive' )
                                                )
                                )
index b0def59..4812c9d 100644 (file)
@@ -220,4 +220,28 @@ class SpecialChangeContentModel extends FormSpecialPage {
                $out->setPageTitle( $this->msg( 'changecontentmodel-success-title' ) );
                $out->addWikiMsg( 'changecontentmodel-success-text', $this->title );
        }
+
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || !$title->canExist() ) {
+                       // No prefix suggestion in special and media namespace
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search
+               $prefixSearcher = new StringPrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array(), $offset );
+               return $result;
+       }
+
+       protected function getGroupName() {
+               return 'pagetools';
+       }
 }
index 361b7b1..51b08f9 100644 (file)
@@ -52,7 +52,6 @@ class SpecialChangeEmail extends FormSpecialPage {
        function execute( $par ) {
                $out = $this->getOutput();
                $out->disallowUserJs();
-               $out->addModules( 'mediawiki.special.changeemail' );
 
                parent::execute( $par );
        }
index df68b12..91ac4e0 100644 (file)
@@ -190,20 +190,16 @@ class SpecialChangePassword extends FormSpecialPage {
                        return true;
                }
 
-               try {
-                       $this->mUserName = $request->getVal( 'wpName', $this->getUser()->getName() );
-                       $this->mDomain = $wgAuth->getDomain();
+               $this->mUserName = $request->getVal( 'wpName', $this->getUser()->getName() );
+               $this->mDomain = $wgAuth->getDomain();
 
-                       if ( !$wgAuth->allowPasswordChange() ) {
-                               throw new ErrorPageError( 'changepassword', 'resetpass_forbidden' );
-                       }
+               if ( !$wgAuth->allowPasswordChange() ) {
+                       throw new ErrorPageError( 'changepassword', 'resetpass_forbidden' );
+               }
 
-                       $this->attemptReset( $data['Password'], $data['NewPassword'], $data['Retype'] );
+               $status = $this->attemptReset( $data['Password'], $data['NewPassword'], $data['Retype'] );
 
-                       return true;
-               } catch ( PasswordError $e ) {
-                       return $e->getMessage();
-               }
+               return $status;
        }
 
        public function onSuccess() {
@@ -231,10 +227,14 @@ class SpecialChangePassword extends FormSpecialPage {
        }
 
        /**
-        * @param string $oldpass
-        * @param string $newpass
-        * @param string $retype
-        * @throws PasswordError When cannot set the new password because requirements not met.
+        * Checks the new password if it meets the requirements for passwords and set
+        * it as a current password, otherwise set the passed Status object to fatal
+        * and doesn't change anything
+        *
+        * @param string $oldpass The current (temporary) password.
+        * @param string $newpass The password to set.
+        * @param string $retype The string of the retype password field to check with newpass
+        * @return Status
         */
        protected function attemptReset( $oldpass, $newpass, $retype ) {
                $isSelf = ( $this->mUserName === $this->getUser()->getName() );
@@ -245,33 +245,32 @@ class SpecialChangePassword extends FormSpecialPage {
                }
 
                if ( !$user || $user->isAnon() ) {
-                       throw new PasswordError( $this->msg( 'nosuchusershort', $this->mUserName )->text() );
+                       return Status::newFatal( $this->msg( 'nosuchusershort', $this->mUserName ) );
                }
 
                if ( $newpass !== $retype ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'badretype' ) );
-                       throw new PasswordError( $this->msg( 'badretype' )->text() );
+                       return Status::newFatal( $this->msg( 'badretype' ) );
                }
 
                $throttleCount = LoginForm::incLoginThrottle( $this->mUserName );
                if ( $throttleCount === true ) {
                        $lang = $this->getLanguage();
                        $throttleInfo = $this->getConfig()->get( 'PasswordAttemptThrottle' );
-                       throw new PasswordError( $this->msg( 'changepassword-throttled' )
+                       return Status::newFatal( $this->msg( 'changepassword-throttled' )
                                ->params( $lang->formatDuration( $throttleInfo['seconds'] ) )
-                               ->text()
                        );
                }
 
                // @todo Make these separate messages, since the message is written for both cases
                if ( !$user->checkTemporaryPassword( $oldpass ) && !$user->checkPassword( $oldpass ) ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'wrongpassword' ) );
-                       throw new PasswordError( $this->msg( 'resetpass-wrong-oldpass' )->text() );
+                       return Status::newFatal( $this->msg( 'resetpass-wrong-oldpass' ) );
                }
 
                // User is resetting their password to their old password
                if ( $oldpass === $newpass ) {
-                       throw new PasswordError( $this->msg( 'resetpass-recycled' )->text() );
+                       return Status::newFatal( $this->msg( 'resetpass-recycled' ) );
                }
 
                // Do AbortChangePassword after checking mOldpass, so we don't leak information
@@ -279,7 +278,7 @@ class SpecialChangePassword extends FormSpecialPage {
                $abortMsg = 'resetpass-abort-generic';
                if ( !Hooks::run( 'AbortChangePassword', array( $user, $oldpass, $newpass, &$abortMsg ) ) ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'abortreset' ) );
-                       throw new PasswordError( $this->msg( $abortMsg )->text() );
+                       return Status::newFatal( $this->msg( $abortMsg ) );
                }
 
                // Please reset throttle for successful logins, thanks!
@@ -292,7 +291,7 @@ class SpecialChangePassword extends FormSpecialPage {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
                } catch ( PasswordError $e ) {
                        Hooks::run( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
-                       throw new PasswordError( $e->getMessage() );
+                       return Status::newFatal( new RawMessage( $e->getMessage() ) );
                }
 
                if ( $isSelf ) {
@@ -303,6 +302,7 @@ class SpecialChangePassword extends FormSpecialPage {
                }
                $user->saveSettings();
                $this->resetPasswordExpiration( $user );
+               return Status::newGood();
        }
 
        public function requiresUnblock() {
@@ -336,4 +336,8 @@ class SpecialChangePassword extends FormSpecialPage {
                        __METHOD__
                );
        }
+
+       protected function getDisplayFormat() {
+               return 'ooui';
+       }
 }
index 9672580..fc9f750 100644 (file)
@@ -107,7 +107,8 @@ class SpecialContributions extends IncludableSpecialPage {
                        )->inContentLanguage() );
                }
 
-               if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
+               $ns = $request->getVal( 'namespace', null );
+               if ( $ns !== null && $ns !== '' ) {
                        $this->opts['namespace'] = intval( $ns );
                } else {
                        $this->opts['namespace'] = '';
@@ -464,7 +465,8 @@ class SpecialContributions extends IncludableSpecialPage {
                        'month',
                        'topOnly',
                        'newOnly',
-                       'associated'
+                       'associated',
+                       'tagfilter'
                );
 
                foreach ( $this->opts as $name => $value ) {
@@ -480,7 +482,7 @@ class SpecialContributions extends IncludableSpecialPage {
                        $filterSelection = Html::rawElement(
                                'td',
                                array(),
-                               array_shift( $tagFilter ) . implode( '&#160', $tagFilter )
+                               implode( '&#160;', $tagFilter )
                        );
                } else {
                        $filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
@@ -516,8 +518,13 @@ class SpecialContributions extends IncludableSpecialPage {
                                        'mw-ui-input-inline',
                                        'mw-autocomplete-user', // used by mediawiki.userSuggest
                                ),
-                       ) + ( $this->opts['target'] ? array() : array( 'autofocus' ) )
+                       ) + (
+                               // Only autofocus if target hasn't been specified or in non-newbies mode
+                               ( $this->opts['contribs'] === 'newbie' || $this->opts['target'] )
+                                       ? array() : array( 'autofocus' => true )
+                               )
                );
+
                $targetSelection = Html::rawElement(
                        'td',
                        array( 'colspan' => 2 ),
@@ -542,7 +549,7 @@ class SpecialContributions extends IncludableSpecialPage {
                        ) . '&#160;' .
                                Html::rawElement(
                                        'span',
-                                       array( 'style' => 'white-space: nowrap' ),
+                                       array( 'class' => 'mw-input-with-label' ),
                                        Xml::checkLabel(
                                                $this->msg( 'invert' )->text(),
                                                'nsInvert',
@@ -554,7 +561,7 @@ class SpecialContributions extends IncludableSpecialPage {
                                                )
                                        ) . '&#160;'
                                ) .
-                               Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+                               Html::rawElement( 'span', array( 'class' => 'mw-input-with-label' ),
                                        Xml::checkLabel(
                                                $this->msg( 'namespace_association' )->text(),
                                                'associated',
@@ -571,7 +578,7 @@ class SpecialContributions extends IncludableSpecialPage {
                if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
                        $deletedOnlyCheck = Html::rawElement(
                                'span',
-                               array( 'style' => 'white-space: nowrap' ),
+                               array( 'class' => 'mw-input-with-label' ),
                                Xml::checkLabel(
                                        $this->msg( 'history-show-deleted' )->text(),
                                        'deletedOnly',
@@ -586,7 +593,7 @@ class SpecialContributions extends IncludableSpecialPage {
 
                $checkLabelTopOnly = Html::rawElement(
                        'span',
-                       array( 'style' => 'white-space: nowrap' ),
+                       array( 'class' => 'mw-input-with-label' ),
                        Xml::checkLabel(
                                $this->msg( 'sp-contributions-toponly' )->text(),
                                'topOnly',
@@ -597,7 +604,7 @@ class SpecialContributions extends IncludableSpecialPage {
                );
                $checkLabelNewOnly = Html::rawElement(
                        'span',
-                       array( 'style' => 'white-space: nowrap' ),
+                       array( 'class' => 'mw-input-with-label' ),
                        Xml::checkLabel(
                                $this->msg( 'sp-contributions-newonly' )->text(),
                                'newOnly',
index 44352a7..6f8e786 100644 (file)
@@ -413,7 +413,8 @@ class DeletedContributionsPage extends SpecialPage {
                $target = $userObj->getName();
                $out->addSubtitle( $this->getSubTitle( $userObj ) );
 
-               if ( ( $ns = $request->getVal( 'namespace', null ) ) !== null && $ns !== '' ) {
+               $ns = $request->getVal( 'namespace', null );
+               if ( $ns !== null && $ns !== '' ) {
                        $options['namespace'] = intval( $ns );
                } else {
                        $options['namespace'] = '';
index 6d40985..c04582e 100644 (file)
@@ -151,14 +151,24 @@ class DoubleRedirectsPage extends QueryPage {
                        array( 'redirect' => 'no' )
                );
 
-               $edit = Linker::linkKnown(
-                       $titleA,
-                       $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
-                       array(),
-                       array(
-                               'action' => 'edit'
-                       )
-               );
+               // if the page is editable, add an edit link
+               if (
+                       // check user permissions
+                       $this->getUser()->isAllowed( 'edit' ) &&
+                       // check, if the content model is editable through action=edit
+                       ContentHandler::getForTitle( $titleA )->supportsDirectEditing()
+               ) {
+                       $edit = Linker::linkKnown(
+                               $titleA,
+                               $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
+                               array(),
+                               array(
+                                       'action' => 'edit'
+                               )
+                       );
+               } else {
+                       $edit = '';
+               }
 
                $linkB = Linker::linkKnown(
                        $titleB,
@@ -175,6 +185,35 @@ class DoubleRedirectsPage extends QueryPage {
                return ( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
        }
 
+       /**
+        * Cache page content model and gender distinction for performance
+        *
+        * @param IDatabase $db
+        * @param ResultWrapper $res
+        */
+       function preprocessResults( $db, $res ) {
+               if ( !$res->numRows() ) {
+                       return;
+               }
+
+               $batch = new LinkBatch;
+               foreach ( $res as $row ) {
+                       $batch->add( $row->namespace, $row->title );
+                       if ( isset( $row->nsb ) ) {
+                               // lazy loaded when using cached results
+                               $batch->add( $row->nsb, $row->tb );
+                       }
+                       if ( isset( $row->iwc ) && !$row->iwc ) {
+                               // lazy loaded when using cached result, not added when interwiki link
+                               $batch->add( $row->nsc, $row->tc );
+                       }
+               }
+               $batch->execute();
+
+               // Back to start for display
+               $res->seek( 0 );
+       }
+
        protected function getGroupName() {
                return 'maintenance';
        }
index d2b2e70..6545541 100644 (file)
@@ -275,6 +275,7 @@ class SpecialEditTags extends UnlistedSpecialPage {
        protected function buildCheckBoxes() {
                // If there is just one item, provide the user with a multi-select field
                $list = $this->getList();
+               $tags = array();
                if ( $list->length() == 1 ) {
                        $list->reset();
                        $tags = $list->current()->getTags();
@@ -295,14 +296,9 @@ class SpecialEditTags extends UnlistedSpecialPage {
                        $html .= '</td></tr>';
                        $tagSelect = $this->getTagSelect( $tags, $this->msg( 'tags-edit-new-tags' )->plain() );
                        $html .= '<tr><td>' . $tagSelect[0] . '</td><td>' . $tagSelect[1];
-                       // also output the tags currently applied as a hidden form field, so we
-                       // know what to remove from the revision/log entry when the form is submitted
-                       $html .= Html::hidden( 'wpExistingTags', implode( ',', $tags ) );
-                       $html .= '</td></tr></table>';
                } else {
                        // Otherwise, use a multi-select field for adding tags, and a list of
                        // checkboxes for removing them
-                       $tags = array();
 
                        // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed
                        for ( $list->reset(); $list->current(); $list->next() ) {
@@ -328,9 +324,13 @@ class SpecialEditTags extends UnlistedSpecialPage {
                                                'class' => 'mw-edittags-remove-checkbox',
                                        ) );
                        }
-                       $html .= '</td></tr></table>';
                }
 
+               // also output the tags currently applied as a hidden form field, so we
+               // know what to remove from the revision/log entry when the form is submitted
+               $html .= Html::hidden( 'wpExistingTags', implode( ',', $tags ) );
+               $html .= '</td></tr></table>';
+
                return $html;
        }
 
index 6b0d1ec..3b31530 100644 (file)
@@ -260,6 +260,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
         * @return string Form asking for user name.
         */
        protected function userForm( $name ) {
+               $this->getOutput()->addModules( 'mediawiki.userSuggest' );
                $string = Xml::openElement(
                        'form',
                        array( 'method' => 'get', 'action' => wfScript(), 'id' => 'askusername' )
@@ -272,7 +273,11 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                                'target',
                                'emailusertarget',
                                30,
-                               $name
+                               $name,
+                               array(
+                                       'class' => 'mw-autocomplete-user',  // used by mediawiki.userSuggest
+                                       'autofocus' => true,
+                               )
                        ) .
                        ' ' .
                        Xml::submitButton( $this->msg( 'emailusernamesubmit' )->text() ) .
index 642ea69..91fef03 100644 (file)
@@ -65,7 +65,10 @@ class SpecialExport extends SpecialPage {
                                         */
                                        $catpages = $this->getPagesFromCategory( $t );
                                        if ( $catpages ) {
-                                               $page .= "\n" . implode( "\n", $catpages );
+                                               if ( $page !== '' ) {
+                                                       $page .= "\n";
+                                               }
+                                               $page .= implode( "\n", $catpages );
                                        }
                                }
                        }
index 8c9a76b..bb57ee0 100644 (file)
@@ -232,6 +232,30 @@ class FileDuplicateSearchPage extends QueryPage {
                return "$plink . . $user . . $time";
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || $title->getNamespace() !== NS_FILE ) {
+                       // No prefix suggestion outside of file namespace
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search, but just for files
+               $prefixSearcher = new TitlePrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array( NS_FILE ), $offset );
+
+               return array_map( function ( Title $t ) {
+                       // Remove namespace in search suggestion
+                       return $t->getText();
+               }, $result );
+       }
+
        protected function getGroupName() {
                return 'media';
        }
index e2bc629..5ca90ed 100644 (file)
@@ -596,30 +596,29 @@ class ImportReporter extends ContextSource {
                                        "</li>\n"
                        );
 
+                       $logParams = array( '4:number:count' => $successCount );
                        if ( $this->mIsUpload ) {
                                $detail = $this->msg( 'import-logentry-upload-detail' )->numParams(
                                        $successCount )->inContentLanguage()->text();
-                               if ( $this->reason ) {
-                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
-                                               . $this->reason;
-                               }
                                $action = 'upload';
                        } else {
-                               $interwiki = '[[:' . $this->mInterwiki . ':' .
-                                       $foreignTitle->getFullText() . ']]';
+                               $interwikiTitleStr = $this->mInterwiki . ':' . $foreignTitle->getFullText();
+                               $interwiki = '[[:' . $interwikiTitleStr . ']]';
                                $detail = $this->msg( 'import-logentry-interwiki-detail' )->numParams(
                                        $successCount )->params( $interwiki )->inContentLanguage()->text();
-                               if ( $this->reason ) {
-                                       $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
-                                               . $this->reason;
-                               }
                                $action = 'interwiki';
+                               $logParams['5:title-link:interwiki'] = $interwikiTitleStr;
+                       }
+                       if ( $this->reason ) {
+                               $detail .= $this->msg( 'colon-separator' )->inContentLanguage()->text()
+                                       . $this->reason;
                        }
 
                        $logEntry = new ManualLogEntry( 'import', $action );
                        $logEntry->setTarget( $title );
-                       $logEntry->setComment( $detail );
+                       $logEntry->setComment( $this->reason );
                        $logEntry->setPerformer( $this->getUser() );
+                       $logEntry->setParameters( $logParams );
                        $logid = $logEntry->insert();
                        $logEntry->publish( $logid );
 
index f474867..ca89776 100644 (file)
@@ -68,10 +68,9 @@ class LinkSearchPage extends QueryPage {
         * This allows for dependency injection even though we don't control object creation.
         */
        private function initServices() {
-               global $wgLanguageCode;
+               global $wgContLang;
                if ( !$this->linkRenderer ) {
-                       $lang = Language::factory( $wgLanguageCode );
-                       $titleFormatter = new MediaWikiTitleCodec( $lang, GenderCache::singleton() );
+                       $titleFormatter = new MediaWikiTitleCodec( $wgContLang, GenderCache::singleton() );
                        $this->linkRenderer = new MediaWikiPageLinkRenderer( $titleFormatter );
                }
        }
index 3ea56c6..8de4e2f 100644 (file)
@@ -108,7 +108,7 @@ class ImageListPager extends TablePager {
 
                if ( $search !== '' && !$this->getConfig()->get( 'MiserMode' ) ) {
                        $this->mSearch = $search;
-                       $nt = Title::newFromURL( $this->mSearch );
+                       $nt = Title::newFromText( $this->mSearch );
 
                        if ( $nt ) {
                                $dbr = wfGetDB( DB_SLAVE );
@@ -147,7 +147,7 @@ class ImageListPager extends TablePager {
                }
 
                if ( $this->mSearch !== '' ) {
-                       $nt = Title::newFromURL( $this->mSearch );
+                       $nt = Title::newFromText( $this->mSearch );
                        if ( $nt ) {
                                $dbr = wfGetDB( DB_SLAVE );
                                $conds[] = 'LOWER(' . $prefix . '_name)' .
index 274a95a..d43a263 100644 (file)
@@ -322,7 +322,7 @@ class UsersPager extends AlphabeticPager {
 
                # Submit button and form bottom
                $out .= Html::hidden( 'limit', $this->mLimit );
-               $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() );
+               $out .= Xml::submitButton( $this->msg( 'listusers-submit' )->text() );
                Hooks::run( 'SpecialListusersHeader', array( $this, &$out ) );
                $out .= Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' );
index ef1fd73..f11ed9a 100644 (file)
@@ -91,8 +91,8 @@ class SpecialMergeHistory extends SpecialPage {
 
                // target page
                if ( $this->mSubmitted ) {
-                       $this->mTargetObj = Title::newFromURL( $this->mTarget );
-                       $this->mDestObj = Title::newFromURL( $this->mDest );
+                       $this->mTargetObj = Title::newFromText( $this->mTarget );
+                       $this->mDestObj = Title::newFromText( $this->mDest );
                } else {
                        $this->mTargetObj = null;
                        $this->mDestObj = null;
index 589c39f..a1bd2fa 100644 (file)
@@ -77,11 +77,9 @@ class MovePageForm extends UnlistedSpecialPage {
                // Yes, the use of getVal() and getText() is wanted, see bug 20365
 
                $oldTitleText = $request->getVal( 'wpOldTitle', $target );
-               if ( is_string( $oldTitleText ) ) {
-                       $this->oldTitle = Title::newFromText( $oldTitleText );
-               }
+               $this->oldTitle = Title::newFromText( $oldTitleText );
 
-               if ( $this->oldTitle === null ) {
+               if ( !$this->oldTitle ) {
                        // Either oldTitle wasn't passed, or newFromText returned null
                        throw new ErrorPageError( 'notargettitle', 'notargettext' );
                }
@@ -148,6 +146,25 @@ class MovePageForm extends UnlistedSpecialPage {
                $out->addModuleStyles( 'mediawiki.special.movePage.styles' );
                $this->addHelpLink( 'Help:Moving a page' );
 
+               if ( $this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
+                       $out->wrapWikiMsg(
+                               "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>",
+                               'moveuserpage-warning'
+                       );
+               } elseif ( $this->oldTitle->getNamespace() == NS_CATEGORY ) {
+                       $out->wrapWikiMsg(
+                               "<div class=\"error mw-movecategorypage-warning\">\n$1\n</div>",
+                               'movecategorypage-warning'
+                       );
+               }
+
+               $out->addWikiMsg( $this->getConfig()->get( 'FixDoubleRedirects' ) ?
+                       'movepagetext' :
+                       'movepagetext-noredirectfixer'
+               );
+               $submitVar = 'wpMove';
+               $confirm = false;
+
                $newTitle = $this->newTitle;
 
                if ( !$newTitle ) {
@@ -170,30 +187,9 @@ class MovePageForm extends UnlistedSpecialPage {
                        && $newTitle->quickUserCan( 'delete', $user )
                ) {
                        $out->addWikiMsg( 'delete_and_move_text', $newTitle->getPrefixedText() );
-                       $movepagebtn = $this->msg( 'delete_and_move' )->text();
                        $submitVar = 'wpDeleteAndMove';
                        $confirm = true;
                        $err = array();
-               } else {
-                       if ( $this->oldTitle->getNamespace() == NS_USER && !$this->oldTitle->isSubpage() ) {
-                               $out->wrapWikiMsg(
-                                       "<div class=\"error mw-moveuserpage-warning\">\n$1\n</div>",
-                                       'moveuserpage-warning'
-                               );
-                       } elseif ( $this->oldTitle->getNamespace() == NS_CATEGORY ) {
-                               $out->wrapWikiMsg(
-                                       "<div class=\"error mw-movecategorypage-warning\">\n$1\n</div>",
-                                       'movecategorypage-warning'
-                               );
-                       }
-
-                       $out->addWikiMsg( $this->getConfig()->get( 'FixDoubleRedirects' ) ?
-                               'movepagetext' :
-                               'movepagetext-noredirectfixer'
-                       );
-                       $movepagebtn = $this->msg( 'movepagebtn' )->text();
-                       $submitVar = 'wpMove';
-                       $confirm = false;
                }
 
                if ( count( $err ) == 1 && isset( $err[0][0] ) && $err[0][0] == 'file-exists-sharedrepo'
@@ -448,8 +444,8 @@ class MovePageForm extends UnlistedSpecialPage {
                $fields[] = new OOUI\FieldLayout(
                        new OOUI\ButtonInputWidget( array(
                                'name' => $submitVar,
-                               'value' => $movepagebtn,
-                               'label' => $movepagebtn,
+                               'value' => $this->msg( 'movepagebtn' )->text(),
+                               'label' => $this->msg( 'movepagebtn' )->text(),
                                'flags' => array( 'constructive', 'primary' ),
                                'type' => 'submit',
                        ) ),
@@ -634,9 +630,6 @@ class MovePageForm extends UnlistedSpecialPage {
                 * than a more direct method, but this is not a highly performance-cri-
                 * tical code path and readable code is more important here.
                 *
-                * Note: this query works nicely on MySQL 5, but the optimizer in MySQL
-                * 4 might get confused.  If so, consider rewriting as a UNION.
-                *
                 * If the target namespace doesn't allow subpages, moving with subpages
                 * would mean that you couldn't move them back in one operation, which
                 * is bad.
@@ -800,6 +793,26 @@ class MovePageForm extends UnlistedSpecialPage {
                $out->addHTML( "</ul>\n" );
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || !$title->canExist() ) {
+                       // No prefix suggestion in special and media namespace
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search
+               $prefixSearcher = new StringPrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array(), $offset );
+               return $result;
+       }
+
        protected function getGroupName() {
                return 'pagetools';
        }
index 00c8e05..6b7c038 100644 (file)
@@ -113,7 +113,7 @@ class NewFilesPager extends ReverseChronologicalPager {
 
                if ( !$this->getConfig()->get( 'MiserMode' ) && $this->like !== null ) {
                        $dbr = wfGetDB( DB_SLAVE );
-                       $likeObj = Title::newFromURL( $this->like );
+                       $likeObj = Title::newFromText( $this->like );
                        if ( $likeObj instanceof Title ) {
                                $like = $dbr->buildLike(
                                        $dbr->anyString(),
index 0fa4857..5d3700d 100644 (file)
@@ -254,7 +254,7 @@ class SpecialNewpages extends IncludableSpecialPage {
 
                $htmlForm = new HTMLForm( $form, $this->getContext() );
 
-               $htmlForm->setSubmitText( $this->msg( 'allpagessubmit' )->text() );
+               $htmlForm->setSubmitText( $this->msg( 'newpages-submit' )->text() );
                $htmlForm->setSubmitProgressive();
                // The form should be visible on each request (inclusive requests with submitted forms), so
                // return always false here.
index 177c19b..02fca3a 100644 (file)
@@ -198,6 +198,26 @@ class SpecialPageLanguage extends FormSpecialPage {
                return $out1 . $out2;
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || !$title->canExist() ) {
+                       // No prefix suggestion in special and media namespace
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search
+               $prefixSearcher = new StringPrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array(), $offset );
+               return $result;
+       }
+
        protected function getGroupName() {
                return 'pagetools';
        }
index f211ec9..374f156 100644 (file)
@@ -50,9 +50,9 @@ class SpecialPagesWithProp extends QueryPage {
 
                $propnames = $this->getExistingPropNames();
 
-               $form = new HTMLForm( array(
+               $form = HTMLForm::factory( 'ooui', array(
                        'propname' => array(
-                               'type' => 'selectorother',
+                               'type' => 'combobox',
                                'name' => 'propname',
                                'options' => $propnames,
                                'default' => $propname,
index 53e1d1b..292b575 100644 (file)
@@ -42,6 +42,11 @@ class SpecialPasswordReset extends FormSpecialPage {
         */
        private $result;
 
+       /**
+        * @var string $method Identifies which password reset field was specified by the user.
+        */
+       private $method;
+
        public function __construct() {
                parent::__construct( 'PasswordReset', 'editmyprivateinfo' );
        }
@@ -196,6 +201,8 @@ class SpecialPasswordReset extends FormSpecialPage {
                        return array( $error );
                }
 
+               $this->method = $method;
+
                if ( count( $users ) == 0 ) {
                        if ( $method == 'email' ) {
                                // Don't reveal whether or not an email address is in use
@@ -310,7 +317,12 @@ class SpecialPasswordReset extends FormSpecialPage {
                        $this->getOutput()->addHTML( Html::rawElement( 'pre', array(), $this->email->escaped() ) );
                }
 
-               $this->getOutput()->addWikiMsg( 'passwordreset-emailsent' );
+               if ( $this->method === 'email' ) {
+                       $this->getOutput()->addWikiMsg( 'passwordreset-emailsentemail' );
+               } else {
+                       $this->getOutput()->addWikiMsg( 'passwordreset-emailsentusername' );
+               }
+
                $this->getOutput()->returnToMain();
        }
 
index 4b75e5f..49ab6d5 100644 (file)
@@ -47,6 +47,7 @@ class SpecialPreferences extends SpecialPage {
                }
 
                $out->addModules( 'mediawiki.special.preferences' );
+               $out->addModuleStyles( 'mediawiki.special.preferences.styles' );
 
                if ( $this->getRequest()->getCheck( 'success' ) ) {
                        $out->wrapWikiMsg(
@@ -64,9 +65,42 @@ class SpecialPreferences extends SpecialPage {
 
                $this->addHelpLink( 'Help:Preferences' );
 
-               $htmlForm = Preferences::getFormObject( $this->getUser(), $this->getContext() );
+               // Load the user from the master to reduce CAS errors on double post (T95839)
+               $user = $this->getUser()->getInstanceForUpdate() ?: $this->getUser();
+
+               $htmlForm = Preferences::getFormObject( $user, $this->getContext() );
                $htmlForm->setSubmitCallback( array( 'Preferences', 'tryUISubmit' ) );
+               $sectionTitles = $htmlForm->getPreferenceSections();
+
+               $prefTabs = '';
+               foreach ( $sectionTitles as $key ) {
+                       $prefTabs .= Html::rawElement( 'li',
+                               array(
+                                       'role' => 'presentation',
+                                       'class' => ( $key === 'personal' ) ? 'selected' : null
+                               ),
+                               Html::rawElement( 'a',
+                                       array(
+                                               'id' => 'preftab-' . $key,
+                                               'role' => 'tab',
+                                               'href' => '#mw-prefsection-' . $key,
+                                               'aria-controls' => 'mw-prefsection-' . $key,
+                                               'aria-selected' => ( $key === 'personal' ) ? 'true' : 'false',
+                                               'tabIndex' => ( $key === 'personal' ) ? 0 : -1,
+                                       ),
+                                       $htmlForm->getLegend( $key )
+                               )
+                       );
+               }
 
+               $out->addHTML(
+                       Html::rawElement( 'ul',
+                               array(
+                                       'id' => 'preftoc',
+                                       'role' => 'tablist'
+                               ),
+                               $prefTabs )
+               );
                $htmlForm->show();
        }
 
index bc5dfd0..a6c0423 100644 (file)
@@ -138,7 +138,7 @@ class SpecialPrefixindex extends SpecialAllPages {
                                'stripprefix',
                                $this->stripPrefix
                        ) . ' ' .
-                       Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) .
+                       Xml::submitButton( $this->msg( 'prefixindex-submit' )->text() ) .
                        "</td>
                        </tr>";
                $out .= Xml::closeElement( 'table' );
@@ -201,12 +201,11 @@ class SpecialPrefixindex extends SpecialAllPages {
                                )
                        );
 
-                       # ## @todo FIXME: Side link to previous
+                       // @todo FIXME: Side link to previous
 
                        $n = 0;
                        if ( $res->numRows() > 0 ) {
-                               $out = Html::openElement( 'div', array( 'class' => 'mw-prefixindex-body' ) );
-                               $out .= Html::openElement( 'ul', array( 'class' => 'mw-prefixindex-list' ) );
+                               $out = Html::openElement( 'ul', array( 'class' => 'mw-prefixindex-list' ) );
 
                                $prefixLength = strlen( $prefix );
                                while ( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
@@ -228,65 +227,91 @@ class SpecialPrefixindex extends SpecialAllPages {
                                                $link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
                                        }
 
-                                       $out .= "<li> $link </li>\n";
+                                       $out .= "<li>$link</li>\n";
                                        $n++;
 
                                }
                                $out .= Html::closeElement( 'ul' );
-                               $out .= Html::closeElement( 'div' );
+
+                               if ( $res->numRows() > 2 ) {
+                                       // Only apply CSS column styles if there's more than 2 entries.
+                                       // Otherwise rendering is broken as "mw-prefixindex-body"'s CSS column count is 3.
+                                       $out = Html::rawElement( 'div', array( 'class' => 'mw-prefixindex-body' ), $out );
+                               }
                        } else {
                                $out = '';
                        }
                }
 
-               $footer = '';
-               if ( $this->including() ) {
-                       $out2 = '';
-               } else {
-                       $nsForm = $this->namespacePrefixForm( $namespace, $prefix );
-                       $self = $this->getPageTitle();
-                       $out2 = Xml::openElement( 'table', array( 'id' => 'mw-prefixindex-nav-table' ) ) .
-                               '<tr>
-                                       <td>' .
-                               $nsForm .
-                               '</td>
-                               <td id="mw-prefixindex-nav-form" class="mw-prefixindex-nav">';
-
-                       if ( $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
-                               $query = array(
-                                       'from' => $s->page_title,
-                                       'prefix' => $prefix,
-                                       'hideredirects' => $this->hideRedirects,
-                                       'stripprefix' => $this->stripPrefix,
-                               );
+               $output = $this->getOutput();
 
-                               if ( $namespace || $prefix == '' ) {
-                                       // Keep the namespace even if it's 0 for empty prefixes.
-                                       // This tells us we're not just a holdover from old links.
-                                       $query['namespace'] = $namespace;
-                               }
+               if ( $this->including() ) {
+                       // We don't show the nav-links and the form when included into other
+                       // pages so let's just finish here.
+                       $output->addHTML( $out );
+                       return;
+               }
 
-                               $nextLink = Linker::linkKnown(
-                                       $self,
-                                       $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
-                                       array(),
-                                       $query
-                               );
+               $topOut = $this->namespacePrefixForm( $namespace, $prefix );
 
-                               $out2 .= $nextLink;
+               if ( $res && ( $n == $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
+                       $query = array(
+                               'from' => $s->page_title,
+                               'prefix' => $prefix,
+                               'hideredirects' => $this->hideRedirects,
+                               'stripprefix' => $this->stripPrefix,
+                       );
 
-                               $footer = "\n" . Html::element( 'hr' ) .
-                                       Html::rawElement(
-                                               'div',
-                                               array( 'class' => 'mw-prefixindex-nav' ),
-                                               $nextLink
-                                       );
+                       if ( $namespace || $prefix == '' ) {
+                               // Keep the namespace even if it's 0 for empty prefixes.
+                               // This tells us we're not just a holdover from old links.
+                               $query['namespace'] = $namespace;
                        }
-                       $out2 .= "</td></tr>" .
-                               Xml::closeElement( 'table' );
+
+                       $nextLink = Linker::linkKnown(
+                               $this->getPageTitle(),
+                               $this->msg( 'nextpage', str_replace( '_', ' ', $s->page_title ) )->escaped(),
+                               array(),
+                               $query
+                       );
+
+                       // Link shown at the top of the page below the form
+                       $topOut .= Html::rawElement( 'div',
+                               array( 'class' => 'mw-prefixindex-nav' ),
+                               $nextLink
+                       );
+
+                       // Link shown at the footer
+                       $out .= "\n" . Html::element( 'hr' ) .
+                               Html::rawElement(
+                                       'div',
+                                       array( 'class' => 'mw-prefixindex-nav' ),
+                                       $nextLink
+                               );
+
                }
 
-               $this->getOutput()->addHTML( $out2 . $out . $footer );
+               $output->addHTML( $topOut . $out );
+       }
+
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || !$title->canExist() ) {
+                       // No prefix suggestion in special and media namespace
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search
+               $prefixSearcher = new StringPrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array(), $offset );
+               return $result;
        }
 
        protected function getGroupName() {
index 00e56c1..7a82cd8 100644 (file)
@@ -100,17 +100,16 @@ class SpecialProtectedpages extends SpecialPage {
                        Xml::openElement( 'fieldset' ) .
                        Xml::element( 'legend', array(), $this->msg( 'protectedpages' )->text() ) .
                        Html::hidden( 'title', $title->getPrefixedDBkey() ) . "\n" .
-                       $this->getNamespaceMenu( $namespace ) . "&#160;\n" .
-                       $this->getTypeMenu( $type ) . "&#160;\n" .
-                       $this->getLevelMenu( $level ) . "&#160;\n" .
-                       "<br /><span style='white-space: nowrap'>" .
-                       $this->getExpiryCheck( $indefOnly ) . "&#160;\n" .
-                       $this->getCascadeCheck( $cascadeOnly ) . "&#160;\n" .
-                       $this->getRedirectCheck( $noRedirect ) . "&#160;\n" .
-                       "</span><br /><span style='white-space: nowrap'>" .
-                       $this->getSizeLimit( $sizetype, $size ) . "&#160;\n" .
-                       "</span>" .
-                       "&#160;" . Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" .
+                       $this->getNamespaceMenu( $namespace ) . "\n" .
+                       $this->getTypeMenu( $type ) . "\n" .
+                       $this->getLevelMenu( $level ) . "\n" .
+                       "<br />\n" .
+                       $this->getExpiryCheck( $indefOnly ) . "\n" .
+                       $this->getCascadeCheck( $cascadeOnly ) . "\n" .
+                       $this->getRedirectCheck( $noRedirect ) . "\n" .
+                       "<br />\n" .
+                       $this->getSizeLimit( $sizetype, $size ) . "\n" .
+                       Xml::submitButton( $this->msg( 'protectedpages-submit' )->text() ) . "\n" .
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' );
        }
@@ -123,7 +122,7 @@ class SpecialProtectedpages extends SpecialPage {
         * @return string
         */
        protected function getNamespaceMenu( $namespace = null ) {
-               return Html::rawElement( 'span', array( 'style' => 'white-space: nowrap;' ),
+               return Html::rawElement( 'span', array( 'class' => 'mw-input-with-label' ),
                        Html::namespaceSelector(
                                array(
                                        'selected' => $namespace,
@@ -143,12 +142,12 @@ class SpecialProtectedpages extends SpecialPage {
         * @return string Formatted HTML
         */
        protected function getExpiryCheck( $indefOnly ) {
-               return Xml::checkLabel(
+               return '<span class="mw-input-with-label">' . Xml::checkLabel(
                        $this->msg( 'protectedpages-indef' )->text(),
                        'indefonly',
                        'indefonly',
                        $indefOnly
-               ) . "\n";
+               ) . "</span>\n";
        }
 
        /**
@@ -156,12 +155,12 @@ class SpecialProtectedpages extends SpecialPage {
         * @return string Formatted HTML
         */
        protected function getCascadeCheck( $cascadeOnly ) {
-               return Xml::checkLabel(
+               return '<span class="mw-input-with-label">' . Xml::checkLabel(
                        $this->msg( 'protectedpages-cascade' )->text(),
                        'cascadeonly',
                        'cascadeonly',
                        $cascadeOnly
-               ) . "\n";
+               ) . "</span>\n";
        }
 
        /**
@@ -169,12 +168,12 @@ class SpecialProtectedpages extends SpecialPage {
         * @return string Formatted HTML
         */
        protected function getRedirectCheck( $noRedirect ) {
-               return Xml::checkLabel(
+               return '<span class="mw-input-with-label">' . Xml::checkLabel(
                        $this->msg( 'protectedpages-noredirect' )->text(),
                        'noredirect',
                        'noredirect',
                        $noRedirect
-               ) . "\n";
+               ) . "</span>\n";
        }
 
        /**
@@ -185,14 +184,14 @@ class SpecialProtectedpages extends SpecialPage {
        protected function getSizeLimit( $sizetype, $size ) {
                $max = $sizetype === 'max';
 
-               return Xml::radioLabel(
+               return '<span class="mw-input-with-label">' . Xml::radioLabel(
                        $this->msg( 'minimum-size' )->text(),
                        'sizetype',
                        'min',
                        'wpmin',
                        !$max
                ) .
-                       '&#160;' .
+                       ' ' .
                        Xml::radioLabel(
                                $this->msg( 'maximum-size' )->text(),
                                'sizetype',
@@ -200,10 +199,10 @@ class SpecialProtectedpages extends SpecialPage {
                                'wpmax',
                                $max
                        ) .
-                       '&#160;' .
+                       ' ' .
                        Xml::input( 'size', 9, $size, array( 'id' => 'wpsize' ) ) .
-                       '&#160;' .
-                       Xml::label( $this->msg( 'pagesize' )->text(), 'wpsize' );
+                       ' ' .
+                       Xml::label( $this->msg( 'pagesize' )->text(), 'wpsize' ) . "</span>\n";
        }
 
        /**
@@ -228,8 +227,8 @@ class SpecialProtectedpages extends SpecialPage {
                        $options[] = Xml::option( $text, $type, $selected ) . "\n";
                }
 
-               return "<span style='white-space: nowrap'>" .
-                       Xml::label( $this->msg( 'restriction-type' )->text(), $this->IdType ) . '&#160;' .
+               return '<span class="mw-input-with-label">' .
+                       Xml::label( $this->msg( 'restriction-type' )->text(), $this->IdType ) . ' ' .
                        Xml::tags( 'select',
                                array( 'id' => $this->IdType, 'name' => $this->IdType ),
                                implode( "\n", $options ) ) . "</span>";
@@ -260,7 +259,7 @@ class SpecialProtectedpages extends SpecialPage {
                        $options[] = Xml::option( $text, $type, $selected );
                }
 
-               return "<span style='white-space: nowrap'>" .
+               return '<span class="mw-input-with-label">' .
                        Xml::label( $this->msg( 'restriction-level' )->text(), $this->IdLevel ) . ' ' .
                        Xml::tags( 'select',
                                array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ),
index 85ce78f..2c79fec 100644 (file)
@@ -126,7 +126,7 @@ class SpecialProtectedtitles extends SpecialPage {
                        Html::hidden( 'title', $special ) . "&#160;\n" .
                        $this->getNamespaceMenu( $namespace ) . "&#160;\n" .
                        $this->getLevelMenu( $level ) . "&#160;\n" .
-                       "&#160;" . Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "\n" .
+                       "&#160;" . Xml::submitButton( $this->msg( 'protectedtitles-submit' )->text() ) . "\n" .
                        "</fieldset></form>";
        }
 
index da84a9e..4848d01 100644 (file)
@@ -50,7 +50,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
 
                // 10 seconds server-side caching max
-               $this->getOutput()->setSquidMaxage( 10 );
+               $this->getOutput()->setCdnMaxage( 10 );
                // Check if the client has a cached version
                $lastmod = $this->checkLastModified();
                if ( $lastmod === false ) {
@@ -295,7 +295,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
         *
         * @return array
         */
-       private function getFeedQuery() {
+       protected function getFeedQuery() {
                $query = array_filter( $this->getOptions()->getAllValues(), function ( $value ) {
                        // API handles empty parameters in a different way
                        return $value !== '';
@@ -403,7 +403,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $extraOpts = $this->getExtraOptions( $opts );
                $extraOptsCount = count( $extraOpts );
                $count = 0;
-               $submit = ' ' . Xml::submitbutton( $this->msg( 'allpagessubmit' )->text() );
+               $submit = ' ' . Xml::submitbutton( $this->msg( 'recentchanges-submit' )->text() );
 
                $out = Xml::openElement( 'table', array( 'class' => 'mw-recentchanges-table' ) );
                foreach ( $extraOpts as $name => $optionRow ) {
index 3c403fe..8db8f24 100644 (file)
@@ -55,7 +55,7 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
                        return false;
                }
                $outputPage = $this->getOutput();
-               $title = Title::newFromURL( $target );
+               $title = Title::newFromText( $target );
                if ( !$title || $title->isExternal() ) {
                        $outputPage->addHtml( '<div class="errorbox">' . $this->msg( 'allpagesbadtitle' )
                                        ->parse() . '</div>' );
@@ -263,4 +263,24 @@ class SpecialRecentChangesLinked extends SpecialRecentChanges {
 
                return $this->rclTargetTitle;
        }
+
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || !$title->canExist() ) {
+                       // No prefix suggestion in special and media namespace
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search
+               $prefixSearcher = new StringPrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array(), $offset );
+               return $result;
+       }
 }
index 65cb8e5..5ed0483 100644 (file)
@@ -329,10 +329,10 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                        return;
                }
                $this->getOutput()->disable();
-               # We mustn't allow the output to be Squid cached, otherwise
+               # We mustn't allow the output to be CDN cached, otherwise
                # if an admin previews a deleted image, and it's cached, then
                # a user without appropriate permissions can toddle off and
-               # nab the image, and Squid will serve it
+               # nab the image, and CDN will serve it
                $this->getRequest()->response()->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
                $this->getRequest()->response()->header(
                        'Cache-Control: no-cache, no-store, max-age=0, must-revalidate'
index 286a745..4217553 100644 (file)
@@ -86,6 +86,13 @@ class SpecialRunJobs extends UnlistedSpecialPage {
                        ob_flush();
                        flush();
                        // Once the client receives this response, it can disconnect
+                       set_error_handler( function ( $errno, $errstr ) {
+                               if ( strpos( $errstr, 'Cannot modify header information' ) !== false ) {
+                                       return true; // bug T115413
+                               }
+                               // Delegate unhandled errors to the default handlers
+                               return false;
+                       } );
                }
 
                // Do all of the specified tasks...
index fc7eeb1..8809900 100644 (file)
@@ -73,6 +73,12 @@ class SpecialSearch extends SpecialPage {
         */
        protected $runSuggestion = true;
 
+       /**
+        * Names of the wikis, in format: Interwiki prefix -> caption
+        * @var array
+        */
+       protected $customCaptions;
+
        const NAMESPACES_CURRENT = 'sense';
 
        public function __construct() {
@@ -93,6 +99,7 @@ class SpecialSearch extends SpecialPage {
                        'mediawiki.special', 'mediawiki.special.search', 'mediawiki.ui', 'mediawiki.ui.button',
                        'mediawiki.ui.input',
                ) );
+               $this->addHelpLink( 'Help:Searching' );
 
                // Strip underscores from title parameter; most of the time we'll want
                // text form here. But don't strip underscores from actual text params!
@@ -371,25 +378,48 @@ class SpecialSearch extends SpecialPage {
                        if ( $numTextMatches > 0 ) {
                                $out->addHTML( $this->showMatches( $textMatches ) );
                        }
-                       // show interwiki results if any
-                       if ( $textMatches->hasInterwikiResults() ) {
-                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
-                       }
 
-                       $textMatches->free();
+                       // show secondary interwiki results if any
+                       if ( $textMatches->hasInterwikiResults( SearchResultSet::SECONDARY_RESULTS ) ) {
+                               $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(
+                                               SearchResultSet::SECONDARY_RESULTS ), $term ) );
+                       }
                }
+
+               $hasOtherResults = $textMatches &&
+                       $textMatches->hasInterwikiResults( SearchResultSet::INLINE_RESULTS );
+
                if ( $num === 0 ) {
                        if ( $textStatus ) {
                                $out->addHTML( '<div class="error">' .
                                        $textStatus->getMessage( 'search-error' ) . '</div>' );
                        } else {
-                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
-                                       array( 'search-nonefound', wfEscapeWikiText( $term ) ) );
                                $this->showCreateLink( $title, $num, $titleMatches, $textMatches );
+                               $out->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>",
+                                       array( $hasOtherResults ? 'search-nonefound-thiswiki' : 'search-nonefound',
+                                                       wfEscapeWikiText( $term )
+                                       ) );
+                       }
+               }
+
+               if ( $hasOtherResults ) {
+                       foreach ( $textMatches->getInterwikiResults( SearchResultSet::INLINE_RESULTS )
+                                               as $interwiki => $interwikiResult ) {
+                               if ( $interwikiResult instanceof Status || $interwikiResult->numRows() == 0 ) {
+                                       // ignore bad interwikis for now
+                                       continue;
+                               }
+                               // TODO: wiki header
+                               $out->addHTML( $this->showMatches( $interwikiResult, $interwiki ) );
                        }
                }
 
+               if ( $textMatches ) {
+                       $textMatches->free();
+               }
+
                $out->addHTML( '<div class="visualClear"></div>' );
+
                if ( $prevnext ) {
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
@@ -400,6 +430,18 @@ class SpecialSearch extends SpecialPage {
 
        }
 
+       /**
+        * Produce wiki header for interwiki results
+        * @param string $interwiki Interwiki name
+        * @param SearchResultSet $interwikiResult The result set
+        * @return string
+        */
+       protected function interwikiHeader( $interwiki, $interwikiResult ) {
+               // TODO: we need to figure out how to name wikis correctly
+               $wikiMsg = $this->msg( 'search-interwiki-results-' . $interwiki )->parse();
+               return "<p class=\"mw-search-interwiki-header\">\n$wikiMsg</p>";
+       }
+
        /**
         * Decide if the suggested query should be run, and it's results returned
         * instead of the provided $textMatches
@@ -636,17 +678,23 @@ class SpecialSearch extends SpecialPage {
         * Show whole set of results
         *
         * @param SearchResultSet $matches
+        * @param string $interwiki Interwiki name
         *
         * @return string
         */
-       protected function showMatches( &$matches ) {
+       protected function showMatches( &$matches, $interwiki = null ) {
                global $wgContLang;
 
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
-
-               $out = "<ul class='mw-search-results'>\n";
+               $out = '';
                $result = $matches->next();
                $pos = $this->offset;
+
+               if ( $result && $interwiki ) {
+                       $out .= $this->interwikiHeader( $interwiki, $result );
+               }
+
+               $out .= "<ul class='mw-search-results'>\n";
                while ( $result ) {
                        $out .= $this->showHit( $result, $terms, ++$pos );
                        $result = $matches->next();
@@ -683,14 +731,16 @@ class SpecialSearch extends SpecialPage {
                }
 
                $link_t = clone $title;
+               $query = array();
 
                Hooks::run( 'ShowSearchHitTitle',
-                       array( &$link_t, &$titleSnippet, $result, $terms, $this ) );
+                       array( &$link_t, &$titleSnippet, $result, $terms, $this, &$query ) );
 
                $link = Linker::linkKnown(
                        $link_t,
                        $titleSnippet,
-                       array( 'data-serp-pos' => $position ) // HTML attributes
+                       array( 'data-serp-pos' => $position ), // HTML attributes
+                       $query
                );
 
                // If page content is not readable, just return the title.
@@ -803,6 +853,7 @@ class SpecialSearch extends SpecialPage {
                $html = null;
 
                $score = '';
+               $related = '';
                if ( Hooks::run( 'ShowSearchHit', array(
                        $this, $result, $terms,
                        &$link, &$redirect, &$section, &$extract,
@@ -818,6 +869,23 @@ class SpecialSearch extends SpecialPage {
                return $html;
        }
 
+       /**
+        * Extract custom captions from search-interwiki-custom message
+        */
+       protected function getCustomCaptions() {
+               if ( is_null( $this->customCaptions ) ) {
+                       $this->customCaptions = array();
+                       // format per line <iwprefix>:<caption>
+                       $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
+                       foreach ( $customLines as $line ) {
+                               $parts = explode( ":", $line, 2 );
+                               if ( count( $parts ) == 2 ) { // validate line
+                                       $this->customCaptions[$parts[0]] = $parts[1];
+                               }
+                       }
+               }
+       }
+
        /**
         * Show results from other wikis
         *
@@ -834,15 +902,7 @@ class SpecialSearch extends SpecialPage {
                $out .= "<ul class='mw-search-iwresults'>\n";
 
                // work out custom project captions
-               $customCaptions = array();
-               // format per line <iwprefix>:<caption>
-               $customLines = explode( "\n", $this->msg( 'search-interwiki-custom' )->text() );
-               foreach ( $customLines as $line ) {
-                       $parts = explode( ":", $line, 2 );
-                       if ( count( $parts ) == 2 ) { // validate line
-                               $customCaptions[$parts[0]] = $parts[1];
-                       }
-               }
+               $this->getCustomCaptions();
 
                if ( !is_array( $matches ) ) {
                        $matches = array( $matches );
@@ -852,7 +912,7 @@ class SpecialSearch extends SpecialPage {
                        $prev = null;
                        $result = $set->next();
                        while ( $result ) {
-                               $out .= $this->showInterwikiHit( $result, $prev, $query, $customCaptions );
+                               $out .= $this->showInterwikiHit( $result, $prev, $query );
                                $prev = $result->getInterwikiPrefix();
                                $result = $set->next();
                        }
@@ -873,11 +933,10 @@ class SpecialSearch extends SpecialPage {
         * @param SearchResult $result
         * @param string $lastInterwiki
         * @param string $query
-        * @param array $customCaptions Interwiki prefix -> caption
         *
         * @return string
         */
-       protected function showInterwikiHit( $result, $lastInterwiki, $query, $customCaptions ) {
+       protected function showInterwikiHit( $result, $lastInterwiki, $query ) {
 
                if ( $result->isBrokenTitle() ) {
                        return '';
@@ -914,9 +973,9 @@ class SpecialSearch extends SpecialPage {
                $out = "";
                // display project name
                if ( is_null( $lastInterwiki ) || $lastInterwiki != $title->getInterwiki() ) {
-                       if ( array_key_exists( $title->getInterwiki(), $customCaptions ) ) {
+                       if ( array_key_exists( $title->getInterwiki(), $this->customCaptions ) ) {
                                // captions from 'search-interwiki-custom'
-                               $caption = $customCaptions[$title->getInterwiki()];
+                               $caption = $this->customCaptions[$title->getInterwiki()];
                        } else {
                                // default is to show the hostname of the other wiki which might suck
                                // if there are many wikis on one hostname
index e06bae0..a989aac 100644 (file)
@@ -114,16 +114,18 @@ class SpecialStatistics extends SpecialPage {
         * @return string
         */
        private function getPageStats() {
+               $specialAllPagesTitle = SpecialPage::getTitleFor( 'Allpages' );
                $pageStatsHtml = Xml::openElement( 'tr' ) .
                        Xml::tags( 'th', array( 'colspan' => '2' ), $this->msg( 'statistics-header-pages' )
                                ->parse() ) .
                        Xml::closeElement( 'tr' ) .
-                               $this->formatRow( Linker::linkKnown( SpecialPage::getTitleFor( 'Allpages' ),
-                                       $this->msg( 'statistics-articles' )->parse() ),
+                               $this->formatRow( Linker::linkKnown( $specialAllPagesTitle,
+                                       $this->msg( 'statistics-articles' )->parse(), array(), array( 'hideredirects' => 1 ) ),
                                        $this->getLanguage()->formatNum( $this->good ),
                                        array( 'class' => 'mw-statistics-articles' ),
                                        'statistics-articles-desc' ) .
-                               $this->formatRow( $this->msg( 'statistics-pages' )->parse(),
+                               $this->formatRow( Linker::linkKnown( $specialAllPagesTitle,
+                                       $this->msg( 'statistics-pages' )->parse() ),
                                        $this->getLanguage()->formatNum( $this->total ),
                                        array( 'class' => 'mw-statistics-pages' ),
                                        'statistics-pages-desc' );
index 70eee9f..c03f811 100644 (file)
@@ -100,7 +100,7 @@ class SpecialTags extends SpecialPage {
                        $form = new HTMLForm( $fields, $this->getContext() );
                        $form->setAction( $this->getPageTitle( 'create' )->getLocalURL() );
                        $form->setWrapperLegendMsg( 'tags-create-heading' );
-                       $form->setHeaderText( $this->msg( 'tags-create-explanation' )->plain() );
+                       $form->setHeaderText( $this->msg( 'tags-create-explanation' )->parseAsBlock() );
                        $form->setSubmitCallback( array( $this, 'processCreateTagForm' ) );
                        $form->setSubmitTextMsg( 'tags-create-submit' );
                        $form->show();
@@ -392,7 +392,7 @@ class SpecialTags extends SpecialPage {
                $func = $activate ? 'canActivateTag' : 'canDeactivateTag';
                $result = ChangeTags::$func( $tag, $user );
                if ( !$result->isGood() ) {
-                       $out->wrapWikiMsg( "<div class=\"error\">\n$1" . $result->getWikiText() .
+                       $out->addWikiText( "<div class=\"error\">\n" . $result->getWikiText() .
                                "\n</div>" );
                        if ( !$result->isOK() ) {
                                return;
@@ -451,6 +451,21 @@ class SpecialTags extends SpecialPage {
                }
        }
 
+       /**
+        * Return an array of subpages that this special page will accept.
+        *
+        * @return string[] subpages
+        */
+       public function getSubpagesForPrefixSearch() {
+               // The subpages does not have an own form, so not listing it at the moment
+               return array(
+                       // 'delete',
+                       // 'activate',
+                       // 'deactivate',
+                       // 'create',
+               );
+       }
+
        protected function getGroupName() {
                return 'changes';
        }
index 447c3ef..aada064 100644 (file)
@@ -625,19 +625,21 @@ class PageArchive {
                $wasnew = $article->updateIfNewerOn( $dbw, $revision, $previousRevId );
                if ( $created || $wasnew ) {
                        // Update site stats, link tables, etc
-                       $user = User::newFromName( $revision->getUserText( Revision::RAW ), false );
                        $article->doEditUpdates(
                                $revision,
-                               $user,
-                               array( 'created' => $created, 'oldcountable' => $oldcountable )
+                               User::newFromName( $revision->getUserText( Revision::RAW ), false ),
+                               array(
+                                       'created' => $created,
+                                       'oldcountable' => $oldcountable,
+                                       'restored' => true
+                               )
                        );
                }
 
                Hooks::run( 'ArticleUndelete', array( &$this->title, $created, $comment, $oldPageId ) );
 
                if ( $this->title->getNamespace() == NS_FILE ) {
-                       $update = new HTMLCacheUpdate( $this->title, 'imagelinks' );
-                       $update->doUpdate();
+                       DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this->title, 'imagelinks' ) );
                }
 
                return Status::newGood( $restored );
@@ -698,7 +700,7 @@ class SpecialUndelete extends SpecialPage {
                $this->mTargetObj = null;
 
                if ( $this->mTarget !== null && $this->mTarget !== '' ) {
-                       $this->mTargetObj = Title::newFromURL( $this->mTarget );
+                       $this->mTargetObj = Title::newFromText( $this->mTarget );
                }
 
                $this->mSearchPrefix = $request->getText( 'prefix' );
@@ -1195,10 +1197,10 @@ class SpecialUndelete extends SpecialPage {
        private function showFile( $key ) {
                $this->getOutput()->disable();
 
-               # We mustn't allow the output to be Squid cached, otherwise
+               # We mustn't allow the output to be CDN cached, otherwise
                # if an admin previews a deleted image, and it's cached, then
                # a user without appropriate permissions can toddle off and
-               # nab the image, and Squid will serve it
+               # nab the image, and CDN will serve it
                $response = $this->getRequest()->response();
                $response->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' );
                $response->header( 'Cache-Control: no-cache, no-store, max-age=0, must-revalidate' );
@@ -1690,6 +1692,26 @@ class SpecialUndelete extends SpecialPage {
                }
        }
 
+       /**
+        * Return an array of subpages beginning with $search that this special page will accept.
+        *
+        * @param string $search Prefix to search for
+        * @param int $limit Maximum number of results to return (usually 10)
+        * @param int $offset Number of results to skip (usually 0)
+        * @return string[] Matching subpages
+        */
+       public function prefixSearchSubpages( $search, $limit, $offset ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || !$title->canExist() ) {
+                       // No prefix suggestion in special and media namespace
+                       return array();
+               }
+               // Autocomplete subpage the same as a normal search
+               $prefixSearcher = new StringPrefixSearch;
+               $result = $prefixSearcher->search( $search, $limit, array(), $offset );
+               return $result;
+       }
+
        protected function getGroupName() {
                return 'pagetools';
        }
index 6692bb6..c8c4642 100644 (file)
@@ -890,15 +890,10 @@ class UploadForm extends HTMLForm {
                        );
                }
 
-               $this->mMaxUploadSize['file'] = UploadBase::getMaxUploadSize( 'file' );
-               # Limit to upload_max_filesize unless we are running under HipHop and
-               # that setting doesn't exist
-               if ( !wfIsHHVM() ) {
-                       $this->mMaxUploadSize['file'] = min( $this->mMaxUploadSize['file'],
-                               wfShorthandToInteger( ini_get( 'upload_max_filesize' ) ),
-                               wfShorthandToInteger( ini_get( 'post_max_size' ) )
-                       );
-               }
+               $this->mMaxUploadSize['file'] = min(
+                       UploadBase::getMaxUploadSize( 'file' ),
+                       UploadBase::getMaxPhpUploadSize()
+               );
 
                $help = $this->msg( 'upload-maxfilesize',
                                $this->getContext()->getLanguage()->formatSize( $this->mMaxUploadSize['file'] )
index 0da598b..fec1e3a 100644 (file)
@@ -372,6 +372,7 @@ class LoginForm extends SpecialPage {
                        return;
                }
 
+               /** @var User $u */
                $u = $status->getValue();
 
                // Wipe the initial password and mail a temporary one
@@ -485,7 +486,7 @@ class LoginForm extends SpecialPage {
         * @return Status
         */
        public function addNewAccountInternal() {
-               global $wgAuth, $wgMemc, $wgAccountCreationThrottle, $wgEmailConfirmToEdit;
+               global $wgAuth, $wgAccountCreationThrottle, $wgEmailConfirmToEdit;
 
                // If the user passes an invalid domain, something is fishy
                if ( !$wgAuth->validDomain( $this->mDomain ) ) {
@@ -565,8 +566,9 @@ class LoginForm extends SpecialPage {
                        return Status::newFatal( 'noname' );
                }
 
+               $cache = ObjectCache::getLocalClusterInstance();
                # Make sure the user does not exist already
-               $lock = $wgMemc->getScopedLock( wfGlobalCacheKey( 'account', md5( $this->mUsername ) ) );
+               $lock = $cache->getScopedLock( $cache->makeGlobalKey( 'account', md5( $this->mUsername ) ) );
                if ( !$lock ) {
                        return Status::newFatal( 'usernameinprogress' );
                } elseif ( $u->idForName( User::READ_LOCKING ) ) {
@@ -633,14 +635,14 @@ class LoginForm extends SpecialPage {
                } else {
                        if ( ( $wgAccountCreationThrottle && $currentUser->isPingLimitable() ) ) {
                                $key = wfMemcKey( 'acctcreate', 'ip', $ip );
-                               $value = $wgMemc->get( $key );
+                               $value = $cache->get( $key );
                                if ( !$value ) {
-                                       $wgMemc->set( $key, 0, 86400 );
+                                       $cache->set( $key, 0, $cache::TTL_DAY );
                                }
                                if ( $value >= $wgAccountCreationThrottle ) {
                                        return Status::newFatal( 'acct_creation_throttle_hit', $wgAccountCreationThrottle );
                                }
-                               $wgMemc->incr( $key );
+                               $cache->incr( $key );
                        }
                }
 
@@ -783,8 +785,10 @@ class LoginForm extends SpecialPage {
                // Give general extensions, such as a captcha, a chance to abort logins
                $abort = self::ABORTED;
                if ( !Hooks::run( 'AbortLogin', array( $u, $this->mPassword, &$abort, &$msg ) ) ) {
+                       if ( !in_array( $abort, array_keys( self::$statusCodes ), true ) ) {
+                               throw new Exception( 'Invalid status code returned from AbortLogin hook: ' . $abort );
+                       }
                        $this->mAbortLoginErrorMsg = $msg;
-
                        return $abort;
                }
 
@@ -867,7 +871,7 @@ class LoginForm extends SpecialPage {
         * @return bool|int The integer hit count or True if it is already at the limit
         */
        public static function incLoginThrottle( $username ) {
-               global $wgPasswordAttemptThrottle, $wgMemc, $wgRequest;
+               global $wgPasswordAttemptThrottle, $wgRequest;
                $username = trim( $username ); // sanity
 
                $throttleCount = 0;
@@ -876,11 +880,12 @@ class LoginForm extends SpecialPage {
                        $count = $wgPasswordAttemptThrottle['count'];
                        $period = $wgPasswordAttemptThrottle['seconds'];
 
-                       $throttleCount = $wgMemc->get( $throttleKey );
+                       $cache = ObjectCache::getLocalClusterInstance();
+                       $throttleCount = $cache->get( $throttleKey );
                        if ( !$throttleCount ) {
-                               $wgMemc->add( $throttleKey, 1, $period ); // start counter
+                               $cache->add( $throttleKey, 1, $period ); // start counter
                        } elseif ( $throttleCount < $count ) {
-                               $wgMemc->incr( $throttleKey );
+                               $cache->incr( $throttleKey );
                        } elseif ( $throttleCount >= $count ) {
                                return true;
                        }
@@ -895,11 +900,11 @@ class LoginForm extends SpecialPage {
         * @return void
         */
        public static function clearLoginThrottle( $username ) {
-               global $wgMemc, $wgRequest;
+               global $wgRequest;
                $username = trim( $username ); // sanity
 
                $throttleKey = wfMemcKey( 'password-throttle', $wgRequest->getIP(), md5( $username ) );
-               $wgMemc->delete( $throttleKey );
+               ObjectCache::getLocalClusterInstance()->delete( $throttleKey );
        }
 
        /**
@@ -958,9 +963,9 @@ class LoginForm extends SpecialPage {
        }
 
        function processLogin() {
-               global $wgMemc, $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle,
-                       $wgInvalidPasswordReset;
+               global $wgLang, $wgSecureLogin, $wgPasswordAttemptThrottle, $wgInvalidPasswordReset;
 
+               $cache = ObjectCache::getLocalClusterInstance();
                $authRes = $this->authenticateUserData();
                switch ( $authRes ) {
                        case self::SUCCESS:
@@ -982,7 +987,7 @@ class LoginForm extends SpecialPage {
                                // Reset the throttle
                                $request = $this->getRequest();
                                $key = wfMemcKey( 'password-throttle', $request->getIP(), md5( $this->mUsername ) );
-                               $wgMemc->delete( $key );
+                               $cache->delete( $key );
 
                                if ( $this->hasSessionCookie() || $this->mSkipCookieCheck ) {
                                        /* Replace the language object to provide user interface in
@@ -1385,11 +1390,6 @@ class LoginForm extends SpecialPage {
                ) );
 
                if ( $this->mType == 'signup' ) {
-                       // XXX hack pending RL or JS parse() support for complex content messages
-                       // https://phabricator.wikimedia.org/T27349
-                       $out->addJsConfigVars( 'wgCreateacctImgcaptchaHelp',
-                               $this->msg( 'createacct-imgcaptcha-help' )->parse() );
-
                        // Additional styles and scripts for signup form
                        $out->addModules( array(
                                'mediawiki.special.userlogin.signup.js'
index a6fe1b5..ea22274 100644 (file)
@@ -117,6 +117,11 @@ class UserrightsPage extends SpecialPage {
                $fetchedStatus = $this->fetchUser( $this->mTarget );
                if ( $fetchedStatus->isOk() ) {
                        $this->mFetchedUser = $fetchedStatus->value;
+                       if ( $this->mFetchedUser instanceof User ) {
+                               // Set the 'relevant user' in the skin, so it displays links like Contributions,
+                               // User logs, UserRights, etc.
+                               $this->getSkin()->setRelevantUser( $this->mFetchedUser );
+                       }
                }
 
                if ( !$this->userCanChangeRights( $user, true ) ) {
@@ -458,8 +463,10 @@ class UserrightsPage extends SpecialPage {
                                30,
                                str_replace( '_', ' ', $this->mTarget ),
                                array(
-                                       'autofocus' => '',
                                        'class' => 'mw-autocomplete-user', // used by mediawiki.userSuggest
+                               ) + (
+                                       // Set autofocus on blank input and error input
+                                       $this->mFetchedUser === null ? array( 'autofocus' => '' ) : array()
                                )
                        ) . ' ' .
                        Xml::submitButton( $this->msg( 'editusergroup' )->text() ) .
index 38baf5b..80560be 100644 (file)
@@ -518,16 +518,12 @@ class SpecialVersion extends SpecialPage {
         */
        protected function getExternalLibraries() {
                global $IP;
-               $path = "$IP/composer.lock";
+               $path = "$IP/vendor/composer/installed.json";
                if ( !file_exists( $path ) ) {
-                       // Maybe they're using mediawiki/vendor?
-                       $path = "$IP/vendor/composer.lock";
-                       if ( !file_exists( $path ) ) {
-                               return '';
-                       }
+                       return '';
                }
 
-               $lock = new ComposerLock( $path );
+               $installed = new ComposerInstalled( $path );
                $out = Html::element(
                        'h2',
                        array( 'id' => 'mw-version-libraries' ),
@@ -545,7 +541,7 @@ class SpecialVersion extends SpecialPage {
                        . Html::element( 'th', array(), $this->msg( 'version-libraries-authors' )->text() )
                        . Html::closeElement( 'tr' );
 
-               foreach ( $lock->getInstalledDependencies() as $name => $info ) {
+               foreach ( $installed->getInstalledDependencies() as $name => $info ) {
                        if ( strpos( $info['type'], 'mediawiki-' ) === 0 ) {
                                // Skip any extensions or skins since they'll be listed
                                // in their proper section
@@ -1066,7 +1062,7 @@ class SpecialVersion extends SpecialPage {
 
                foreach ( scandir( $extDir ) as $file ) {
                        $fullPath = $extDir . DIRECTORY_SEPARATOR . $file;
-                       if ( preg_match( '/^((AUTHORS)|(CREDITS))(\.txt)?$/', $file ) &&
+                       if ( preg_match( '/^((AUTHORS)|(CREDITS))(\.txt|\.wiki|\.mediawiki)?$/', $file ) &&
                                is_readable( $fullPath ) &&
                                is_file( $fullPath )
                        ) {
index 02a1f73..ca26bb4 100644 (file)
@@ -40,13 +40,8 @@ class WantedPagesPage extends WantedQueryPage {
                $inc = $this->including();
 
                if ( $inc ) {
-                       $parts = explode( '/', $par, 2 );
-                       $this->limit = (int)$parts[0];
-                       // @todo FIXME: nlinks is ignored
-                       // $nlinks = isset( $parts[1] ) && $parts[1] === 'nlinks';
+                       $this->limit = (int)$par;
                        $this->offset = 0;
-               } else {
-                       // $nlinks = true;
                }
                $this->setListoutput( $inc );
                $this->shownavigation = !$inc;
index 962e0c3..68dc9ab 100644 (file)
@@ -44,6 +44,9 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $output = $this->getOutput();
                $request = $this->getRequest();
                $this->addHelpLink( 'Help:Watching pages' );
+               $output->addModules( array(
+                       'mediawiki.special.changeslist.visitedstatus',
+               ) );
 
                $mode = SpecialEditWatchlist::getMode( $request, $subpage );
                if ( $mode !== false ) {
@@ -103,6 +106,11 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $user = $this->getUser();
 
                $opts->add( 'days', $user->getOption( 'watchlistdays' ), FormOptions::FLOAT );
+               $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
+               if ( $this->getRequest()->getVal( 'action' ) == 'submit' ) {
+                       // The user has submitted the form, so we dont need the default values
+                       return $opts;
+               }
 
                $opts->add( 'hideminor', $user->getBoolOption( 'watchlisthideminor' ) );
                $opts->add( 'hidebots', $user->getBoolOption( 'watchlisthidebots' ) );
@@ -115,8 +123,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                        $opts->add( 'hidecategorization', $user->getBoolOption( 'watchlisthidecategorization' ) );
                }
 
-               $opts->add( 'extended', $user->getBoolOption( 'extendwatchlist' ) );
-
                return $opts;
        }
 
@@ -400,8 +406,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         */
        public function doHeader( $opts, $numRows ) {
                $user = $this->getUser();
+               $out = $this->getOutput();
 
-               $this->getOutput()->addSubtitle(
+               // if the user wishes, that the watchlist is reloaded, whenever a filter changes,
+               // add the module for that
+               if ( $user->getBoolOption( 'watchlistreloadautomatically' ) ) {
+                       $out->addModules( array( 'mediawiki.special.watchlist' ) );
+               }
+
+               $out->addSubtitle(
                        $this->msg( 'watchlistfor2', $user->getName() )
                                ->rawParams( SpecialEditWatchlist::buildTools( null ) )
                );
@@ -418,16 +431,16 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                }
 
                $nondefaults = $opts->getChangedValues();
-               $cutofflinks = $this->cutoffLinks( $opts['days'], $nondefaults ) . "<br />\n";
+               $cutofflinks = $this->msg( 'wlshowtime' ) . ' ' . $this->cutoffselector( $opts );
 
                # Spit out some control panel links
                $filters = array(
-                       'hideminor' => 'rcshowhideminor',
-                       'hidebots' => 'rcshowhidebots',
-                       'hideanons' => 'rcshowhideanons',
-                       'hideliu' => 'rcshowhideliu',
-                       'hidemyself' => 'rcshowhidemine',
-                       'hidepatrolled' => 'rcshowhidepatr'
+                       'hideminor' => 'wlshowhideminor',
+                       'hidebots' => 'wlshowhidebots',
+                       'hideanons' => 'wlshowhideanons',
+                       'hideliu' => 'wlshowhideliu',
+                       'hidemyself' => 'wlshowhidemine',
+                       'hidepatrolled' => 'wlshowhidepatr'
                );
 
                if ( $this->getConfig()->get( 'RCWatchCategoryMembership' ) ) {
@@ -444,13 +457,18 @@ class SpecialWatchlist extends ChangesListSpecialPage {
 
                $links = array();
                foreach ( $filters as $name => $msg ) {
-                       $links[] = $this->showHideLink( $nondefaults, $msg, $name, $opts[$name] );
+                       $links[] = $this->showHideCheck( $nondefaults, $msg, $name, $opts[$name] );
                }
 
                $hiddenFields = $nondefaults;
+               $hiddenFields['action'] = 'submit';
                unset( $hiddenFields['namespace'] );
                unset( $hiddenFields['invert'] );
                unset( $hiddenFields['associated'] );
+               unset( $hiddenFields['days'] );
+               foreach ( $filters as $key => $value ) {
+                       unset( $hiddenFields[$key] );
+               }
 
                # Create output
                $form = '';
@@ -458,8 +476,10 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                # Namespace filter and put the whole form together.
                $form .= $wlInfo;
                $form .= $cutofflinks;
-               $form .= $lang->pipeList( $links ) . "\n";
-               $form .= "<hr />\n<p>";
+               $form .= $this->msg( 'watchlist-hide' ) .
+                       $this->msg( 'colon-separator' )->escaped() .
+                       implode( ' ', $links );
+               $form .= "\n<br />\n";
                $form .= Html::namespaceSelector(
                        array(
                                'selected' => $opts['namespace'],
@@ -470,22 +490,22 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                'id' => 'namespace',
                                'class' => 'namespaceselector',
                        )
-               ) . '&#160;';
-               $form .= Xml::checkLabel(
+               ) . "\n";
+               $form .= '<span class="mw-input-with-label">' . Xml::checkLabel(
                        $this->msg( 'invert' )->text(),
                        'invert',
                        'nsinvert',
                        $opts['invert'],
                        array( 'title' => $this->msg( 'tooltip-invert' )->text() )
-               ) . '&#160;';
-               $form .= Xml::checkLabel(
+               ) . "</span>\n";
+               $form .= '<span class="mw-input-with-label">' . Xml::checkLabel(
                        $this->msg( 'namespace_association' )->text(),
                        'associated',
                        'nsassociated',
                        $opts['associated'],
                        array( 'title' => $this->msg( 'tooltip-namespace_association' )->text() )
-               ) . '&#160;';
-               $form .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() ) . "</p>\n";
+               ) . "</span>\n";
+               $form .= Xml::submitButton( $this->msg( 'watchlist-submit' )->text() ) . "\n";
                foreach ( $hiddenFields as $key => $value ) {
                        $form .= Html::hidden( $key, $value ) . "\n";
                }
@@ -496,6 +516,46 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $this->setBottomText( $opts );
        }
 
+       function cutoffselector( $options ) {
+               // Cast everything to strings immediately, so that we know all of the values have the same
+               // precision, and can be compared with '==='. 2/24 has a few more decimal places than its
+               // default string representation, for example, and would confuse comparisons.
+
+               // Misleadingly, the 'days' option supports hours too.
+               $days = array_map( 'strval', array( 1/24, 2/24, 6/24, 12/24, 1, 3, 7 ) );
+
+               $userWatchlistOption = (string)$this->getUser()->getOption( 'watchlistdays' );
+               // add the user preference, if it isn't available already
+               if ( !in_array( $userWatchlistOption, $days ) && $userWatchlistOption !== '0' ) {
+                       $days[] = $userWatchlistOption;
+               }
+
+               $selected = (string)$options['days'];
+               // add the currently selected value, if it isn't available already
+               if ( !in_array( $selected, $days ) && $selected !== '0' ) {
+                       $days[] = $selected;
+               }
+
+               $select = new XmlSelect( 'days', 'days', $selected );
+
+               asort( $days );
+               foreach ( $days as $value ) {
+                       if ( $value < 1 ) {
+                               $name = $this->msg( 'hours' )->numParams( $value * 24 )->text();
+                       } else {
+                               $name = $this->msg( 'days' )->numParams( $value )->text();
+                       }
+                       $select->addOption( $name, $value );
+               }
+
+               // 'all' option
+               $name = $this->msg( 'watchlistall2' )->text();
+               $value = '0';
+               $select->addOption( $name, $value );
+
+               return $select->getHTML() . "\n<br />\n";
+       }
+
        function setTopText( FormOptions $opts ) {
                $nondefaults = $opts->getChangedValues();
                $form = "";
@@ -535,7 +595,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                }
 
                $form .= Xml::openElement( 'form', array(
-                       'method' => 'post',
+                       'method' => 'get',
                        'action' => $this->getPageTitle()->getLocalURL(),
                        'id' => 'mw-watchlist-form'
                ) );
@@ -550,62 +610,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $this->getOutput()->addHTML( $form );
        }
 
-       protected function showHideLink( $options, $message, $name, $value ) {
-               $label = $this->msg( $value ? 'show' : 'hide' )->escaped();
+       protected function showHideCheck( $options, $message, $name, $value ) {
                $options[$name] = 1 - (int)$value;
 
-               return $this->msg( $message )
-                       ->rawParams( Linker::linkKnown( $this->getPageTitle(), $label, array(), $options ) )
-                       ->escaped();
-       }
-
-       protected function hoursLink( $h, $options = array() ) {
-               $options['days'] = ( $h / 24.0 );
-
-               return Linker::linkKnown(
-                       $this->getPageTitle(),
-                       $this->getLanguage()->formatNum( $h ),
-                       array(),
-                       $options
-               );
-       }
-
-       protected function daysLink( $d, $options = array() ) {
-               $options['days'] = $d;
-
-               return Linker::linkKnown(
-                       $this->getPageTitle(),
-                       $this->getLanguage()->formatNum( $d ),
-                       array(),
-                       $options
-               );
-       }
-
-       /**
-        * Returns html
-        *
-        * @param int $days This gets overwritten, so is not used
-        * @param array $options Query parameters for URL
-        * @return string
-        */
-       protected function cutoffLinks( $days, $options = array() ) {
-               global $wgRCMaxAge;
-               $watchlistMaxDays = ceil( $wgRCMaxAge / ( 3600 * 24 ) );
-
-               $hours = array( 1, 2, 6, 12 );
-               $days = array( 1, 3, 7, $watchlistMaxDays );
-               $i = 0;
-               foreach ( $hours as $h ) {
-                       $hours[$i++] = $this->hoursLink( $h, $options );
-               }
-               $i = 0;
-               foreach ( $days as $d ) {
-                       $days[$i++] = $this->daysLink( $d, $options );
-               }
-
-               return $this->msg( 'wlshowlast' )->rawParams(
-                       $this->getLanguage()->pipeList( $hours ),
-                       $this->getLanguage()->pipeList( $days ) )->parse();
+               return '<span class="mw-input-with-label">' . Xml::checkLabel(
+                       $this->msg( $message, '' )->text(),
+                       $name,
+                       $name,
+                       (int)$value
+               ) . '</span>';
        }
 
        /**
index 0e5ffce..47fd972 100644 (file)
@@ -72,7 +72,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                // Bind to member variable
                $this->opts = $opts;
 
-               $this->target = Title::newFromURL( $opts->getValue( 'target' ) );
+               $this->target = Title::newFromText( $opts->getValue( 'target' ) );
                if ( !$this->target ) {
                        if ( !$this->including() ) {
                                $out->addHTML( $this->whatlinkshereForm() );
@@ -496,7 +496,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
                $f .= ' ';
 
                # Submit
-               $f .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text() );
+               $f .= Xml::submitButton( $this->msg( 'whatlinkshere-submit' )->text() );
 
                # Close
                $f .= Xml::closeElement( 'fieldset' ) . Xml::closeElement( 'form' ) . "\n";
@@ -548,7 +548,9 @@ class SpecialWhatLinksHere extends IncludableSpecialPage {
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit, $offset ) {
-               if ( $search === '' ) {
+               $title = Title::newFromText( $search );
+               if ( !$title || !$title->canExist() ) {
+                       // No prefix suggestion in special and media namespace
                        return array();
                }
                // Autocomplete subpage the same as a normal search
index 3f549d0..4759023 100644 (file)
@@ -51,6 +51,11 @@ class RaggettWrapper {
                // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
                $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
 
+               // Preserve empty li elements (T49673) by abusing Tidy's datafld hack
+               // The whitespace class is as in TY_(InitMap)
+               $wrappedtext = preg_replace( "!<li>([ \r\n\t\f]*)</li>!",
+                       '<li datafld="" class="mw-empty-li">\1</li>', $wrappedtext );
+
                // Wrap the whole thing in a doctype and body for Tidy.
                $wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' .
                        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>' .
@@ -79,6 +84,9 @@ class RaggettWrapper {
                // Revert <html-{link,meta}> back to <{link,meta}>
                $text = preg_replace( '!<html-(link|meta)([^>]*?)(/{0,1}>)!', '<$1$2$3', $text );
 
+               // Remove datafld
+               $text = str_replace( '<li datafld=""', '<li', $text );
+
                // Restore the contents of placeholder tokens
                $text = $this->mTokens->replace( $text );
 
index 61fd3e4..06775ef 100644 (file)
@@ -33,8 +33,8 @@ abstract class TidyDriverBase {
        /**
         * Clean up HTML
         *
-        * @param string HTML document fragment to clean up
-        * @param string The corrected HTML output
+        * @param string $text HTML document fragment to clean up
+        * @return string The corrected HTML output
         */
        abstract public function tidy( $text );
 }
index 6b2e877..c497865 100644 (file)
@@ -198,7 +198,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @param int $defaultNamespace
         *
         * @throws MalformedTitleException If $text is not a valid title string.
-        * @return array A mapp with the fields 'interwiki', 'fragment', 'namespace',
+        * @return array A map with the fields 'interwiki', 'fragment', 'namespace',
         *         'user_case_dbkey', and 'dbkey'.
         */
        public function splitTitleString( $text, $defaultNamespace = NS_MAIN ) {
@@ -255,7 +255,8 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                        $m = array();
                        if ( preg_match( $prefixRegexp, $dbkey, $m ) ) {
                                $p = $m[1];
-                               if ( ( $ns = $this->language->getNsIndex( $p ) ) !== false ) {
+                               $ns = $this->language->getNsIndex( $p );
+                               if ( $ns !== false ) {
                                        # Ordinary namespace
                                        $dbkey = $m[2];
                                        $parts['namespace'] = $ns;
index f600e32..f8624d0 100644 (file)
@@ -1919,6 +1919,9 @@ abstract class UploadBase {
        }
 
        /**
+        * Get the MediaWiki maximum uploaded file size for given type of upload, based on
+        * $wgMaxUploadSize.
+        *
         * @param null|string $forType
         * @return int
         */
@@ -1936,6 +1939,25 @@ abstract class UploadBase {
                }
        }
 
+       /**
+        * Get the PHP maximum uploaded file size, based on ini settings. If there is no limit or the
+        * limit can't be guessed, returns a very large number (PHP_INT_MAX).
+        *
+        * @since 1.27
+        * @return int
+        */
+       public static function getMaxPhpUploadSize() {
+               $phpMaxFileSize = wfShorthandToInteger(
+                       ini_get( 'upload_max_filesize' ) ?: ini_get( 'hhvm.server.upload.upload_max_file_size' ),
+                       PHP_INT_MAX
+               );
+               $phpMaxPostSize = wfShorthandToInteger(
+                       ini_get( 'post_max_size' ) ?: ini_get( 'hhvm.server.max_post_size' ),
+                       PHP_INT_MAX
+               ) ?: PHP_INT_MAX;
+               return min( $phpMaxFileSize, $phpMaxPostSize );
+       }
+
        /**
         * Get the current status of a chunked upload (used for polling)
         *
@@ -1968,7 +1990,7 @@ abstract class UploadBase {
                if ( $value === false ) {
                        $cache->delete( $key );
                } else {
-                       $cache->set( $key, $value, 86400 );
+                       $cache->set( $key, $value, $cache::TTL_DAY );
                }
        }
 }
index 3a1e8bd..1607cb6 100644 (file)
@@ -86,8 +86,7 @@ class UploadFromFile extends UploadBase {
                                        'status' => UploadBase::FILE_TOO_LARGE,
                                        'max' => min(
                                                self::getMaxUploadSize( $this->getSourceType() ),
-                                               wfShorthandToInteger( ini_get( 'upload_max_filesize' ) ),
-                                               wfShorthandToInteger( ini_get( 'post_max_size' ) )
+                                               self::getMaxPhpUploadSize()
                                        ),
                                );
                        }
index b971c00..53f0cd2 100644 (file)
@@ -54,6 +54,7 @@
 class UploadStash {
        // Format of the key for files -- has to be suitable as a filename itself (e.g. ab12cd34ef.jpg)
        const KEY_FORMAT_REGEX = '/^[\w-\.]+\.\w*$/';
+       const MAX_US_PROPS_SIZE = 65535;
 
        /**
         * repository that this uses to store temp files
@@ -225,8 +226,8 @@ class UploadStash {
                // see: http://www.jwz.org/doc/mid.html
                list( $usec, $sec ) = explode( ' ', microtime() );
                $usec = substr( $usec, 2 );
-               $key = wfBaseConvert( $sec . $usec, 10, 36 ) . '.' .
-                       wfBaseConvert( mt_rand(), 10, 36 ) . '.' .
+               $key = Wikimedia\base_convert( $sec . $usec, 10, 36 ) . '.' .
+                       Wikimedia\base_convert( mt_rand(), 10, 36 ) . '.' .
                        $this->userId . '.' .
                        $extension;
 
@@ -277,13 +278,22 @@ class UploadStash {
                wfDebug( __METHOD__ . " inserting $stashPath under $key\n" );
                $dbw = $this->repo->getMasterDb();
 
+               $serializedFileProps = serialize( $fileProps );
+               if ( strlen( $serializedFileProps ) > self::MAX_US_PROPS_SIZE ) {
+                       // Database is going to truncate this and make the field invalid.
+                       // Prioritize important metadata over file handler metadata.
+                       // File handler should be prepared to regenerate invalid metadata if needed.
+                       $fileProps['metadata'] = false;
+                       $serializedFileProps = serialize( $fileProps );
+               }
+
                $this->fileMetadata[$key] = array(
                        'us_id' => $dbw->nextSequenceValue( 'uploadstash_us_id_seq' ),
                        'us_user' => $this->userId,
                        'us_key' => $key,
                        'us_orig_path' => $path,
                        'us_path' => $stashPath, // virtual URL
-                       'us_props' => $dbw->encodeBlob( serialize( $fileProps ) ),
+                       'us_props' => $dbw->encodeBlob( $serializedFileProps ),
                        'us_size' => $fileProps['size'],
                        'us_sha1' => $fileProps['sha1'],
                        'us_mime' => $fileProps['mime'],
diff --git a/includes/user/CentralIdLookup.php b/includes/user/CentralIdLookup.php
new file mode 100644 (file)
index 0000000..638a3e2
--- /dev/null
@@ -0,0 +1,208 @@
+<?php
+/**
+ * A central user id lookup 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
+ */
+
+/**
+ * The CentralIdLookup service allows for connecting local users with
+ * cluster-wide IDs.
+ */
+abstract class CentralIdLookup implements IDBAccessObject {
+       // Audience options for accessors
+       const AUDIENCE_PUBLIC = 1;
+       const AUDIENCE_RAW = 2;
+
+       /** @var CentralIdLookup[][] */
+       private static $instances = array();
+
+       /** @var string */
+       private $providerId;
+
+       /**
+        * Fetch a CentralIdLookup
+        * @param string|null $providerId Provider ID from $wgCentralIdLookupProviders
+        * @return CentralIdLookup|null
+        */
+       public static function factory( $providerId = null ) {
+               global $wgCentralIdLookupProviders, $wgCentralIdLookupProvider;
+
+               if ( $providerId === null ) {
+                       $providerId = $wgCentralIdLookupProvider;
+               }
+
+               if ( !array_key_exists( $providerId, self::$instances ) ) {
+                       self::$instances[$providerId] = null;
+
+                       if ( isset( $wgCentralIdLookupProviders[$providerId] ) ) {
+                               $provider = ObjectFactory::getObjectFromSpec( $wgCentralIdLookupProviders[$providerId] );
+                               if ( $provider instanceof CentralIdLookup ) {
+                                       $provider->providerId = $providerId;
+                                       self::$instances[$providerId] = $provider;
+                               }
+                       }
+               }
+
+               return self::$instances[$providerId];
+       }
+
+       final public function getProviderId() {
+               return $this->providerId;
+       }
+
+       /**
+        * Check that the "audience" parameter is valid
+        * @param int|User $audience One of the audience constants, or a specific user
+        * @return User|null User to check against, or null if no checks are needed
+        * @throws InvalidArgumentException
+        */
+       protected function checkAudience( $audience ) {
+               if ( $audience instanceof User ) {
+                       return $audience;
+               }
+               if ( $audience === self::AUDIENCE_PUBLIC ) {
+                       return new User;
+               }
+               if ( $audience === self::AUDIENCE_RAW ) {
+                       return null;
+               }
+               throw new InvalidArgumentException( 'Invalid audience' );
+       }
+
+       /**
+        * Check that a User is attached on the specified wiki.
+        *
+        * If unattached local accounts don't exist in your extension, this comes
+        * down to a check whether the central account exists at all and that
+        * $wikiId is using the same central database.
+        *
+        * @param User $user
+        * @param string|null $wikiId Wiki to check attachment status. If null, check the current wiki.
+        * @return bool
+        */
+       abstract public function isAttached( User $user, $wikiId = null );
+
+       /**
+        * Given central user IDs, return the (local) user names
+        * @note There's no requirement that the user names actually exist locally,
+        *  or if they do that they're actually attached to the central account.
+        * @param array $idToName Array with keys being central user IDs
+        * @param int|User $audience One of the audience constants, or a specific user
+        * @param int $flags IDBAccessObject read flags
+        * @return array Copy of $idToName with values set to user names (or
+        *  empty-string if the user exists but $audience lacks the rights needed
+        *  to see it). IDs not corresponding to a user are unchanged.
+        */
+       abstract public function lookupCentralIds(
+               array $idToName, $audience = self::AUDIENCE_PUBLIC, $flags = self::READ_NORMAL
+       );
+
+       /**
+        * Given (local) user names, return the central IDs
+        * @note There's no requirement that the user names actually exist locally,
+        *  or if they do that they're actually attached to the central account.
+        * @param array $nameToId Array with keys being canonicalized user names
+        * @param int|User $audience One of the audience constants, or a specific user
+        * @param int $flags IDBAccessObject read flags
+        * @return array Copy of $nameToId with values set to central IDs.
+        *  Names not corresponding to a user (or $audience lacks the rights needed
+        *  to see it) are unchanged.
+        */
+       abstract public function lookupUserNames(
+               array $nameToId, $audience = self::AUDIENCE_PUBLIC, $flags = self::READ_NORMAL
+       );
+
+       /**
+        * Given a central user ID, return the (local) user name
+        * @note There's no requirement that the user name actually exists locally,
+        *  or if it does that it's actually attached to the central account.
+        * @param int $id Central user ID
+        * @param int|User $audience One of the audience constants, or a specific user
+        * @param int $flags IDBAccessObject read flags
+        * @return string|null User name, or empty string if $audience lacks the
+        *  rights needed to see it, or null if $id doesn't correspond to a user
+        */
+       public function nameFromCentralId(
+               $id, $audience = self::AUDIENCE_PUBLIC, $flags = self::READ_NORMAL
+       ) {
+               $idToName = $this->lookupCentralIds( array( $id => null ), $audience, $flags );
+               return $idToName[$id];
+       }
+
+       /**
+        * Given a (local) user name, return the central ID
+        * @note There's no requirement that the user name actually exists locally,
+        *  or if it does that it's actually attached to the central account.
+        * @param string $name Canonicalized user name
+        * @param int|User $audience One of the audience constants, or a specific user
+        * @param int $flags IDBAccessObject read flags
+        * @return int User ID; 0 if the name does not correspond to a user or
+        *  $audience lacks the rights needed to see it.
+        */
+       public function centralIdFromName(
+               $name, $audience = self::AUDIENCE_PUBLIC, $flags = self::READ_NORMAL
+       ) {
+               $nameToId = $this->lookupUserNames( array( $name => 0 ), $audience, $flags );
+               return $nameToId[$name];
+       }
+
+       /**
+        * Given a central user ID, return a local User object
+        * @note Unlike nameFromCentralId(), this does guarantee that the local
+        *  user exists and is attached to the central account.
+        * @param int $id Central user ID
+        * @param int|User $audience One of the audience constants, or a specific user
+        * @param int $flags IDBAccessObject read flags
+        * @return User|null Local user, or null if: $id doesn't correspond to a
+        *  user, $audience lacks the rights needed to see the user, the user
+        *  doesn't exist locally, or the user isn't locally attached.
+        */
+       public function localUserFromCentralId(
+               $id, $audience = self::AUDIENCE_PUBLIC, $flags = self::READ_NORMAL
+       ) {
+               $name = $this->nameFromCentralId( $id, $audience, $flags );
+               if ( $name !== null && $name !== '' ) {
+                       $user = User::newFromName( $name );
+                       if ( $user && $user->getId() && $this->isAttached( $user ) ) {
+                               return $user;
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * Given a local User object, return the central ID
+        * @note Unlike centralIdFromName(), this does guarantee that the local
+        *  user is attached to the central account.
+        * @param User $user Local user
+        * @param int|User $audience One of the audience constants, or a specific user
+        * @param int $flags IDBAccessObject read flags
+        * @return int User ID; 0 if the local user does not correspond to a
+        *  central user, $audience lacks the rights needed to see it, or the
+        *  central user isn't locally attached.
+        */
+       public function centralIdFromLocalUser(
+               User $user, $audience = self::AUDIENCE_PUBLIC, $flags = self::READ_NORMAL
+       ) {
+               return $this->isAttached( $user )
+                       ? $this->centralIdFromName( $user->getName(), $audience, $flags )
+                       : 0;
+       }
+
+}
diff --git a/includes/user/LocalIdLookup.php b/includes/user/LocalIdLookup.php
new file mode 100644 (file)
index 0000000..58892ea
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+/**
+ * A central user id lookup service implementation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write 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 CentralIdLookup provider that just uses local IDs. Useful if the wiki
+ * isn't part of a cluster or you're using shared user tables.
+ *
+ * @note Shared user table support expects that all wikis involved have
+ *  $wgSharedDB and $wgSharedTables set, and that all wikis involved in the
+ *  sharing are listed in $wgLocalDatabases, and that no wikis not involved in
+ *  the sharing are listed in $wgLocalDatabases.
+ */
+class LocalIdLookup extends CentralIdLookup {
+
+       public function isAttached( User $user, $wikiId = null ) {
+               global $wgSharedDB, $wgSharedTables, $wgLocalDatabases;
+
+               // If the user has no ID, it can't be attached
+               if ( !$user->getId() ) {
+                       return false;
+               }
+
+               // Easy case, we're checking locally
+               if ( $wikiId === null || $wikiId === wfWikiID() ) {
+                       return true;
+               }
+
+               // Assume that shared user tables are set up as described above, if
+               // they're being used at all.
+               return $wgSharedDB !== null &&
+                       in_array( 'user', $wgSharedTables, true ) &&
+                       in_array( $wikiId, $wgLocalDatabases, true );
+       }
+
+       public function lookupCentralIds(
+               array $idToName, $audience = self::AUDIENCE_PUBLIC, $flags = self::READ_NORMAL
+       ) {
+               if ( !$idToName ) {
+                       return array();
+               }
+
+               $audience = $this->checkAudience( $audience );
+               $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE );
+               $options = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
+                       ? array( 'LOCK IN SHARE MODE' )
+                       : array();
+
+               $tables = array( 'user' );
+               $fields = array( 'user_id', 'user_name' );
+               $where = array(
+                       'user_id' => array_map( 'intval', array_keys( $idToName ) ),
+               );
+               $join = array();
+               if ( $audience && !$audience->isAllowed( 'hideuser' ) ) {
+                       $tables[] = 'ipblocks';
+                       $join['ipblocks'] = array( 'LEFT JOIN', 'ipb_user=user_id' );
+                       $fields[] = 'ipb_deleted';
+               }
+
+               $res = $db->select( $tables, $fields, $where, __METHOD__, $options, $join );
+               foreach ( $res as $row ) {
+                       $idToName[$row->user_id] = empty( $row->ipb_deleted ) ? $row->user_name : '';
+               }
+
+               return $idToName;
+       }
+
+       public function lookupUserNames(
+               array $nameToId, $audience = self::AUDIENCE_PUBLIC, $flags = self::READ_NORMAL
+       ) {
+               if ( !$nameToId ) {
+                       return array();
+               }
+
+               $audience = $this->checkAudience( $audience );
+               $db = wfGetDB( ( $flags & self::READ_LATEST ) ? DB_MASTER : DB_SLAVE );
+               $options = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
+                       ? array( 'LOCK IN SHARE MODE' )
+                       : array();
+
+               $tables = array( 'user' );
+               $fields = array( 'user_id', 'user_name' );
+               $where = array(
+                       'user_name' => array_map( 'strval', array_keys( $nameToId ) ),
+               );
+               $join = array();
+               if ( $audience && !$audience->isAllowed( 'hideuser' ) ) {
+                       $tables[] = 'ipblocks';
+                       $join['ipblocks'] = array( 'LEFT JOIN', 'ipb_user=user_id' );
+                       $where[] = 'ipb_deleted = 0 OR ipb_deleted IS NULL';
+               }
+
+               $res = $db->select( $tables, $fields, $where, __METHOD__, $options, $join );
+               foreach ( $res as $row ) {
+                       $nameToId[$row->user_name] = (int)$row->user_id;
+               }
+
+               return $nameToId;
+       }
+}
diff --git a/includes/user/User.php b/includes/user/User.php
new file mode 100644 (file)
index 0000000..c6d215d
--- /dev/null
@@ -0,0 +1,5356 @@
+<?php
+/**
+ * Implements the User class for the %MediaWiki software.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * String Some punctuation to prevent editing from broken text-mangling proxies.
+ * @ingroup Constants
+ */
+define( 'EDIT_TOKEN_SUFFIX', '+\\' );
+
+/**
+ * The User object encapsulates all of the user-specific settings (user_id,
+ * name, rights, email address, options, last login time). Client
+ * classes use the getXXX() functions to access these fields. These functions
+ * do all the work of determining whether the user is logged in,
+ * whether the requested option can be satisfied from cookies or
+ * whether a database query is needed. Most of the settings needed
+ * for rendering normal pages are set in the cookie to minimize use
+ * of the database.
+ */
+class User implements IDBAccessObject {
+       /**
+        * @const int Number of characters in user_token field.
+        */
+       const TOKEN_LENGTH = 32;
+
+       /**
+        * Global constant made accessible as class constants so that autoloader
+        * magic can be used.
+        */
+       const EDIT_TOKEN_SUFFIX = EDIT_TOKEN_SUFFIX;
+
+       /**
+        * @const int Serialized record version.
+        */
+       const VERSION = 10;
+
+       /**
+        * Maximum items in $mWatchedItems
+        */
+       const MAX_WATCHED_ITEMS_CACHE = 100;
+
+       /**
+        * Exclude user options that are set to their default value.
+        * @since 1.25
+        */
+       const GETOPTIONS_EXCLUDE_DEFAULTS = 1;
+
+       /**
+        * Array of Strings List of member variables which are saved to the
+        * shared cache (memcached). Any operation which changes the
+        * corresponding database fields must call a cache-clearing function.
+        * @showinitializer
+        */
+       protected static $mCacheVars = array(
+               // user table
+               'mId',
+               'mName',
+               'mRealName',
+               'mEmail',
+               'mTouched',
+               'mToken',
+               'mEmailAuthenticated',
+               'mEmailToken',
+               'mEmailTokenExpires',
+               'mRegistration',
+               'mEditCount',
+               // user_groups table
+               'mGroups',
+               // user_properties table
+               'mOptionOverrides',
+       );
+
+       /**
+        * Array of Strings Core rights.
+        * Each of these should have a corresponding message of the form
+        * "right-$right".
+        * @showinitializer
+        */
+       protected static $mCoreRights = array(
+               'apihighlimits',
+               'applychangetags',
+               'autoconfirmed',
+               'autopatrol',
+               'bigdelete',
+               'block',
+               'blockemail',
+               'bot',
+               'browsearchive',
+               'changetags',
+               'createaccount',
+               'createpage',
+               'createtalk',
+               'delete',
+               'deletedhistory',
+               'deletedtext',
+               'deletelogentry',
+               'deleterevision',
+               'edit',
+               'editcontentmodel',
+               'editinterface',
+               'editprotected',
+               'editmyoptions',
+               'editmyprivateinfo',
+               'editmyusercss',
+               'editmyuserjs',
+               'editmywatchlist',
+               'editsemiprotected',
+               'editusercssjs', # deprecated
+               'editusercss',
+               'edituserjs',
+               'hideuser',
+               'import',
+               'importupload',
+               'ipblock-exempt',
+               'managechangetags',
+               'markbotedits',
+               'mergehistory',
+               'minoredit',
+               'move',
+               'movefile',
+               'move-categorypages',
+               'move-rootuserpages',
+               'move-subpages',
+               'nominornewtalk',
+               'noratelimit',
+               'override-export-depth',
+               'pagelang',
+               'passwordreset',
+               'patrol',
+               'patrolmarks',
+               'protect',
+               'proxyunbannable',
+               'purge',
+               'read',
+               'reupload',
+               'reupload-own',
+               'reupload-shared',
+               'rollback',
+               'sendemail',
+               'siteadmin',
+               'suppressionlog',
+               'suppressredirect',
+               'suppressrevision',
+               'unblockself',
+               'undelete',
+               'unwatchedpages',
+               'upload',
+               'upload_by_url',
+               'userrights',
+               'userrights-interwiki',
+               'viewmyprivateinfo',
+               'viewmywatchlist',
+               'viewsuppressed',
+               'writeapi',
+       );
+
+       /**
+        * String Cached results of getAllRights()
+        */
+       protected static $mAllRights = false;
+
+       /** Cache variables */
+       // @{
+       public $mId;
+       /** @var string */
+       public $mName;
+       /** @var string */
+       public $mRealName;
+
+       /** @var string */
+       public $mEmail;
+       /** @var string TS_MW timestamp from the DB */
+       public $mTouched;
+       /** @var string TS_MW timestamp from cache */
+       protected $mQuickTouched;
+       /** @var string */
+       protected $mToken;
+       /** @var string */
+       public $mEmailAuthenticated;
+       /** @var string */
+       protected $mEmailToken;
+       /** @var string */
+       protected $mEmailTokenExpires;
+       /** @var string */
+       protected $mRegistration;
+       /** @var int */
+       protected $mEditCount;
+       /** @var array */
+       public $mGroups;
+       /** @var array */
+       protected $mOptionOverrides;
+       // @}
+
+       /**
+        * Bool Whether the cache variables have been loaded.
+        */
+       // @{
+       public $mOptionsLoaded;
+
+       /**
+        * Array with already loaded items or true if all items have been loaded.
+        */
+       protected $mLoadedItems = array();
+       // @}
+
+       /**
+        * String Initialization data source if mLoadedItems!==true. May be one of:
+        *  - 'defaults'   anonymous user initialised from class defaults
+        *  - 'name'       initialise from mName
+        *  - 'id'         initialise from mId
+        *  - 'session'    log in from cookies or session if possible
+        *
+        * Use the User::newFrom*() family of functions to set this.
+        */
+       public $mFrom;
+
+       /**
+        * Lazy-initialized variables, invalidated with clearInstanceCache
+        */
+       protected $mNewtalk;
+       /** @var string */
+       protected $mDatePreference;
+       /** @var string */
+       public $mBlockedby;
+       /** @var string */
+       protected $mHash;
+       /** @var array */
+       public $mRights;
+       /** @var string */
+       protected $mBlockreason;
+       /** @var array */
+       protected $mEffectiveGroups;
+       /** @var array */
+       protected $mImplicitGroups;
+       /** @var array */
+       protected $mFormerGroups;
+       /** @var bool */
+       protected $mBlockedGlobally;
+       /** @var bool */
+       protected $mLocked;
+       /** @var bool */
+       public $mHideName;
+       /** @var array */
+       public $mOptions;
+
+       /**
+        * @var WebRequest
+        */
+       private $mRequest;
+
+       /** @var Block */
+       public $mBlock;
+
+       /** @var bool */
+       protected $mAllowUsertalk;
+
+       /** @var Block */
+       private $mBlockedFromCreateAccount = false;
+
+       /** @var array */
+       private $mWatchedItems = array();
+
+       /** @var integer User::READ_* constant bitfield used to load data */
+       protected $queryFlagsUsed = self::READ_NORMAL;
+
+       public static $idCacheByName = array();
+
+       /**
+        * Lightweight constructor for an anonymous user.
+        * Use the User::newFrom* factory functions for other kinds of users.
+        *
+        * @see newFromName()
+        * @see newFromId()
+        * @see newFromConfirmationCode()
+        * @see newFromSession()
+        * @see newFromRow()
+        */
+       public function __construct() {
+               $this->clearInstanceCache( 'defaults' );
+       }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               return $this->getName();
+       }
+
+       /**
+        * Load the user table data for this object from the source given by mFrom.
+        *
+        * @param integer $flags User::READ_* constant bitfield
+        */
+       public function load( $flags = self::READ_NORMAL ) {
+               if ( $this->mLoadedItems === true ) {
+                       return;
+               }
+
+               // Set it now to avoid infinite recursion in accessors
+               $this->mLoadedItems = true;
+               $this->queryFlagsUsed = $flags;
+
+               switch ( $this->mFrom ) {
+                       case 'defaults':
+                               $this->loadDefaults();
+                               break;
+                       case 'name':
+                               // Make sure this thread sees its own changes
+                               if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
+                                       $flags |= self::READ_LATEST;
+                                       $this->queryFlagsUsed = $flags;
+                               }
+
+                               $this->mId = self::idFromName( $this->mName, $flags );
+                               if ( !$this->mId ) {
+                                       // Nonexistent user placeholder object
+                                       $this->loadDefaults( $this->mName );
+                               } else {
+                                       $this->loadFromId( $flags );
+                               }
+                               break;
+                       case 'id':
+                               $this->loadFromId( $flags );
+                               break;
+                       case 'session':
+                               if ( !$this->loadFromSession() ) {
+                                       // Loading from session failed. Load defaults.
+                                       $this->loadDefaults();
+                               }
+                               Hooks::run( 'UserLoadAfterLoadFromSession', array( $this ) );
+                               break;
+                       default:
+                               throw new UnexpectedValueException(
+                                       "Unrecognised value for User->mFrom: \"{$this->mFrom}\"" );
+               }
+       }
+
+       /**
+        * Load user table data, given mId has already been set.
+        * @param integer $flags User::READ_* constant bitfield
+        * @return bool False if the ID does not exist, true otherwise
+        */
+       public function loadFromId( $flags = self::READ_NORMAL ) {
+               if ( $this->mId == 0 ) {
+                       $this->loadDefaults();
+                       return false;
+               }
+
+               // Try cache (unless this needs data from the master DB).
+               // NOTE: if this thread called saveSettings(), the cache was cleared.
+               $latest = DBAccessObjectUtils::hasFlags( $flags, self::READ_LATEST );
+               if ( $latest || !$this->loadFromCache() ) {
+                       wfDebug( "User: cache miss for user {$this->mId}\n" );
+                       // Load from DB (make sure this thread sees its own changes)
+                       if ( wfGetLB()->hasOrMadeRecentMasterChanges() ) {
+                               $flags |= self::READ_LATEST;
+                       }
+                       if ( !$this->loadFromDatabase( $flags ) ) {
+                               // Can't load from ID, user is anonymous
+                               return false;
+                       }
+                       $this->saveToCache();
+               }
+
+               $this->mLoadedItems = true;
+               $this->queryFlagsUsed = $flags;
+
+               return true;
+       }
+
+       /**
+        * @since 1.27
+        * @param string $wikiId
+        * @param integer $userId
+        */
+       public static function purge( $wikiId, $userId ) {
+               $cache = ObjectCache::getMainWANInstance();
+               $cache->delete( $cache->makeGlobalKey( 'user', 'id', $wikiId, $userId ) );
+       }
+
+       /**
+        * @since 1.27
+        * @param WANObjectCache $cache
+        * @return string
+        */
+       protected function getCacheKey( WANObjectCache $cache ) {
+               return $cache->makeGlobalKey( 'user', 'id', wfWikiID(), $this->mId );
+       }
+
+       /**
+        * Load user data from shared cache, given mId has already been set.
+        *
+        * @return bool false if the ID does not exist or data is invalid, true otherwise
+        * @since 1.25
+        */
+       protected function loadFromCache() {
+               if ( $this->mId == 0 ) {
+                       $this->loadDefaults();
+                       return false;
+               }
+
+               $cache = ObjectCache::getMainWANInstance();
+               $data = $cache->get( $this->getCacheKey( $cache ) );
+               if ( !is_array( $data ) || $data['mVersion'] < self::VERSION ) {
+                       // Object is expired
+                       return false;
+               }
+
+               wfDebug( "User: got user {$this->mId} from cache\n" );
+
+               // Restore from cache
+               foreach ( self::$mCacheVars as $name ) {
+                       $this->$name = $data[$name];
+               }
+
+               return true;
+       }
+
+       /**
+        * Save user data to the shared cache
+        *
+        * This method should not be called outside the User class
+        */
+       public function saveToCache() {
+               $this->load();
+               $this->loadGroups();
+               $this->loadOptions();
+
+               if ( $this->isAnon() ) {
+                       // Anonymous users are uncached
+                       return;
+               }
+
+               $data = array();
+               foreach ( self::$mCacheVars as $name ) {
+                       $data[$name] = $this->$name;
+               }
+               $data['mVersion'] = self::VERSION;
+               $opts = Database::getCacheSetOptions( wfGetDB( DB_SLAVE ) );
+
+               $cache = ObjectCache::getMainWANInstance();
+               $key = $this->getCacheKey( $cache );
+               $cache->set( $key, $data, $cache::TTL_HOUR, $opts );
+       }
+
+       /** @name newFrom*() static factory methods */
+       // @{
+
+       /**
+        * Static factory method for creation from username.
+        *
+        * This is slightly less efficient than newFromId(), so use newFromId() if
+        * you have both an ID and a name handy.
+        *
+        * @param string $name Username, validated by Title::newFromText()
+        * @param string|bool $validate Validate username. Takes the same parameters as
+        *  User::getCanonicalName(), except that true is accepted as an alias
+        *  for 'valid', for BC.
+        *
+        * @return User|bool User object, or false if the username is invalid
+        *  (e.g. if it contains illegal characters or is an IP address). If the
+        *  username is not present in the database, the result will be a user object
+        *  with a name, zero user ID and default settings.
+        */
+       public static function newFromName( $name, $validate = 'valid' ) {
+               if ( $validate === true ) {
+                       $validate = 'valid';
+               }
+               $name = self::getCanonicalName( $name, $validate );
+               if ( $name === false ) {
+                       return false;
+               } else {
+                       // Create unloaded user object
+                       $u = new User;
+                       $u->mName = $name;
+                       $u->mFrom = 'name';
+                       $u->setItemLoaded( 'name' );
+                       return $u;
+               }
+       }
+
+       /**
+        * Static factory method for creation from a given user ID.
+        *
+        * @param int $id Valid user ID
+        * @return User The corresponding User object
+        */
+       public static function newFromId( $id ) {
+               $u = new User;
+               $u->mId = $id;
+               $u->mFrom = 'id';
+               $u->setItemLoaded( 'id' );
+               return $u;
+       }
+
+       /**
+        * Factory method to fetch whichever user has a given email confirmation code.
+        * This code is generated when an account is created or its e-mail address
+        * has changed.
+        *
+        * If the code is invalid or has expired, returns NULL.
+        *
+        * @param string $code Confirmation code
+        * @param int $flags User::READ_* bitfield
+        * @return User|null
+        */
+       public static function newFromConfirmationCode( $code, $flags = 0 ) {
+               $db = ( $flags & self::READ_LATEST ) == self::READ_LATEST
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               $id = $db->selectField(
+                       'user',
+                       'user_id',
+                       array(
+                               'user_email_token' => md5( $code ),
+                               'user_email_token_expires > ' . $db->addQuotes( $db->timestamp() ),
+                       )
+               );
+
+               return $id ? User::newFromId( $id ) : null;
+       }
+
+       /**
+        * Create a new user object using data from session or cookies. If the
+        * login credentials are invalid, the result is an anonymous user.
+        *
+        * @param WebRequest|null $request Object to use; $wgRequest will be used if omitted.
+        * @return User
+        */
+       public static function newFromSession( WebRequest $request = null ) {
+               $user = new User;
+               $user->mFrom = 'session';
+               $user->mRequest = $request;
+               return $user;
+       }
+
+       /**
+        * Create a new user object from a user row.
+        * The row should have the following fields from the user table in it:
+        * - either user_name or user_id to load further data if needed (or both)
+        * - user_real_name
+        * - all other fields (email, etc.)
+        * It is useless to provide the remaining fields if either user_id,
+        * user_name and user_real_name are not provided because the whole row
+        * will be loaded once more from the database when accessing them.
+        *
+        * @param stdClass $row A row from the user table
+        * @param array $data Further data to load into the object (see User::loadFromRow for valid keys)
+        * @return User
+        */
+       public static function newFromRow( $row, $data = null ) {
+               $user = new User;
+               $user->loadFromRow( $row, $data );
+               return $user;
+       }
+
+       /**
+        * Static factory method for creation of a "system" user from username.
+        *
+        * A "system" user is an account that's used to attribute logged actions
+        * taken by MediaWiki itself, as opposed to a bot or human user. Examples
+        * might include the 'Maintenance script' or 'Conversion script' accounts
+        * used by various scripts in the maintenance/ directory or accounts such
+        * as 'MediaWiki message delivery' used by the MassMessage extension.
+        *
+        * This can optionally create the user if it doesn't exist, and "steal" the
+        * account if it does exist.
+        *
+        * @param string $name Username
+        * @param array $options Options are:
+        *  - validate: As for User::getCanonicalName(), default 'valid'
+        *  - create: Whether to create the user if it doesn't already exist, default true
+        *  - steal: Whether to reset the account's password and email if it
+        *    already exists, default false
+        * @return User|null
+        */
+       public static function newSystemUser( $name, $options = array() ) {
+               $options += array(
+                       'validate' => 'valid',
+                       'create' => true,
+                       'steal' => false,
+               );
+
+               $name = self::getCanonicalName( $name, $options['validate'] );
+               if ( $name === false ) {
+                       return null;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $row = $dbw->selectRow(
+                       'user',
+                       array_merge(
+                               self::selectFields(),
+                               array( 'user_password', 'user_newpassword' )
+                       ),
+                       array( 'user_name' => $name ),
+                       __METHOD__
+               );
+               if ( !$row ) {
+                       // No user. Create it?
+                       return $options['create'] ? self::createNew( $name ) : null;
+               }
+               $user = self::newFromRow( $row );
+
+               // A user is considered to exist as a non-system user if it has a
+               // password set, or a temporary password set, or an email set.
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               try {
+                       $password = $passwordFactory->newFromCiphertext( $row->user_password );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $password = PasswordFactory::newInvalidPassword();
+               }
+               try {
+                       $newpassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $newpassword = PasswordFactory::newInvalidPassword();
+               }
+               if ( !$password instanceof InvalidPassword || !$newpassword instanceof InvalidPassword
+                       || $user->mEmail
+               ) {
+                       // User exists. Steal it?
+                       if ( !$options['steal'] ) {
+                               return null;
+                       }
+
+                       $nopass = PasswordFactory::newInvalidPassword()->toString();
+
+                       $dbw->update(
+                               'user',
+                               array(
+                                       'user_password' => $nopass,
+                                       'user_newpassword' => $nopass,
+                                       'user_newpass_time' => null,
+                               ),
+                               array( 'user_id' => $user->getId() ),
+                               __METHOD__
+                       );
+                       $user->invalidateEmail();
+                       $user->saveSettings();
+               }
+
+               return $user;
+       }
+
+       // @}
+
+       /**
+        * Get the username corresponding to a given user ID
+        * @param int $id User ID
+        * @return string|bool The corresponding username
+        */
+       public static function whoIs( $id ) {
+               return UserCache::singleton()->getProp( $id, 'name' );
+       }
+
+       /**
+        * Get the real name of a user given their user ID
+        *
+        * @param int $id User ID
+        * @return string|bool The corresponding user's real name
+        */
+       public static function whoIsReal( $id ) {
+               return UserCache::singleton()->getProp( $id, 'real_name' );
+       }
+
+       /**
+        * Get database id given a user name
+        * @param string $name Username
+        * @param integer $flags User::READ_* constant bitfield
+        * @return int|null The corresponding user's ID, or null if user is nonexistent
+        */
+       public static function idFromName( $name, $flags = self::READ_NORMAL ) {
+               $nt = Title::makeTitleSafe( NS_USER, $name );
+               if ( is_null( $nt ) ) {
+                       // Illegal name
+                       return null;
+               }
+
+               if ( !( $flags & self::READ_LATEST ) && isset( self::$idCacheByName[$name] ) ) {
+                       return self::$idCacheByName[$name];
+               }
+
+               $db = ( $flags & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               $s = $db->selectRow(
+                       'user',
+                       array( 'user_id' ),
+                       array( 'user_name' => $nt->getText() ),
+                       __METHOD__
+               );
+
+               if ( $s === false ) {
+                       $result = null;
+               } else {
+                       $result = $s->user_id;
+               }
+
+               self::$idCacheByName[$name] = $result;
+
+               if ( count( self::$idCacheByName ) > 1000 ) {
+                       self::$idCacheByName = array();
+               }
+
+               return $result;
+       }
+
+       /**
+        * Reset the cache used in idFromName(). For use in tests.
+        */
+       public static function resetIdByNameCache() {
+               self::$idCacheByName = array();
+       }
+
+       /**
+        * Does the string match an anonymous IPv4 address?
+        *
+        * This function exists for username validation, in order to reject
+        * usernames which are similar in form to IP addresses. Strings such
+        * as 300.300.300.300 will return true because it looks like an IP
+        * address, despite not being strictly valid.
+        *
+        * We match "\d{1,3}\.\d{1,3}\.\d{1,3}\.xxx" as an anonymous IP
+        * address because the usemod software would "cloak" anonymous IP
+        * addresses like this, if we allowed accounts like this to be created
+        * new users could get the old edits of these anonymous users.
+        *
+        * @param string $name Name to match
+        * @return bool
+        */
+       public static function isIP( $name ) {
+               return preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.(?:xxx|\d{1,3})$/', $name )
+                       || IP::isIPv6( $name );
+       }
+
+       /**
+        * Is the input a valid username?
+        *
+        * Checks if the input is a valid username, we don't want an empty string,
+        * an IP address, anything that contains slashes (would mess up subpages),
+        * is longer than the maximum allowed username size or doesn't begin with
+        * a capital letter.
+        *
+        * @param string $name Name to match
+        * @return bool
+        */
+       public static function isValidUserName( $name ) {
+               global $wgContLang, $wgMaxNameChars;
+
+               if ( $name == ''
+                       || User::isIP( $name )
+                       || strpos( $name, '/' ) !== false
+                       || strlen( $name ) > $wgMaxNameChars
+                       || $name != $wgContLang->ucfirst( $name )
+               ) {
+                       wfDebugLog( 'username', __METHOD__ .
+                               ": '$name' invalid due to empty, IP, slash, length, or lowercase" );
+                       return false;
+               }
+
+               // Ensure that the name can't be misresolved as a different title,
+               // such as with extra namespace keys at the start.
+               $parsed = Title::newFromText( $name );
+               if ( is_null( $parsed )
+                       || $parsed->getNamespace()
+                       || strcmp( $name, $parsed->getPrefixedText() ) ) {
+                       wfDebugLog( 'username', __METHOD__ .
+                               ": '$name' invalid due to ambiguous prefixes" );
+                       return false;
+               }
+
+               // Check an additional blacklist of troublemaker characters.
+               // Should these be merged into the title char list?
+               $unicodeBlacklist = '/[' .
+                       '\x{0080}-\x{009f}' . # iso-8859-1 control chars
+                       '\x{00a0}' .          # non-breaking space
+                       '\x{2000}-\x{200f}' . # various whitespace
+                       '\x{2028}-\x{202f}' . # breaks and control chars
+                       '\x{3000}' .          # ideographic space
+                       '\x{e000}-\x{f8ff}' . # private use
+                       ']/u';
+               if ( preg_match( $unicodeBlacklist, $name ) ) {
+                       wfDebugLog( 'username', __METHOD__ .
+                               ": '$name' invalid due to blacklisted characters" );
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * Usernames which fail to pass this function will be blocked
+        * from user login and new account registrations, but may be used
+        * internally by batch processes.
+        *
+        * If an account already exists in this form, login will be blocked
+        * by a failure to pass this function.
+        *
+        * @param string $name Name to match
+        * @return bool
+        */
+       public static function isUsableName( $name ) {
+               global $wgReservedUsernames;
+               // Must be a valid username, obviously ;)
+               if ( !self::isValidUserName( $name ) ) {
+                       return false;
+               }
+
+               static $reservedUsernames = false;
+               if ( !$reservedUsernames ) {
+                       $reservedUsernames = $wgReservedUsernames;
+                       Hooks::run( 'UserGetReservedNames', array( &$reservedUsernames ) );
+               }
+
+               // Certain names may be reserved for batch processes.
+               foreach ( $reservedUsernames as $reserved ) {
+                       if ( substr( $reserved, 0, 4 ) == 'msg:' ) {
+                               $reserved = wfMessage( substr( $reserved, 4 ) )->inContentLanguage()->text();
+                       }
+                       if ( $reserved == $name ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * Usernames which fail to pass this function will be blocked
+        * from new account registrations, but may be used internally
+        * either by batch processes or by user accounts which have
+        * already been created.
+        *
+        * Additional blacklisting may be added here rather than in
+        * isValidUserName() to avoid disrupting existing accounts.
+        *
+        * @param string $name String to match
+        * @return bool
+        */
+       public static function isCreatableName( $name ) {
+               global $wgInvalidUsernameCharacters;
+
+               // Ensure that the username isn't longer than 235 bytes, so that
+               // (at least for the builtin skins) user javascript and css files
+               // will work. (bug 23080)
+               if ( strlen( $name ) > 235 ) {
+                       wfDebugLog( 'username', __METHOD__ .
+                               ": '$name' invalid due to length" );
+                       return false;
+               }
+
+               // Preg yells if you try to give it an empty string
+               if ( $wgInvalidUsernameCharacters !== '' ) {
+                       if ( preg_match( '/[' . preg_quote( $wgInvalidUsernameCharacters, '/' ) . ']/', $name ) ) {
+                               wfDebugLog( 'username', __METHOD__ .
+                                       ": '$name' invalid due to wgInvalidUsernameCharacters" );
+                               return false;
+                       }
+               }
+
+               return self::isUsableName( $name );
+       }
+
+       /**
+        * Is the input a valid password for this user?
+        *
+        * @param string $password Desired password
+        * @return bool
+        */
+       public function isValidPassword( $password ) {
+               // simple boolean wrapper for getPasswordValidity
+               return $this->getPasswordValidity( $password ) === true;
+       }
+
+
+       /**
+        * Given unvalidated password input, return error message on failure.
+        *
+        * @param string $password Desired password
+        * @return bool|string|array True on success, string or array of error message on failure
+        */
+       public function getPasswordValidity( $password ) {
+               $result = $this->checkPasswordValidity( $password );
+               if ( $result->isGood() ) {
+                       return true;
+               } else {
+                       $messages = array();
+                       foreach ( $result->getErrorsByType( 'error' ) as $error ) {
+                               $messages[] = $error['message'];
+                       }
+                       foreach ( $result->getErrorsByType( 'warning' ) as $warning ) {
+                               $messages[] = $warning['message'];
+                       }
+                       if ( count( $messages ) === 1 ) {
+                               return $messages[0];
+                       }
+                       return $messages;
+               }
+       }
+
+       /**
+        * Check if this is a valid password for this user
+        *
+        * Create a Status object based on the password's validity.
+        * The Status should be set to fatal if the user should not
+        * be allowed to log in, and should have any errors that
+        * would block changing the password.
+        *
+        * If the return value of this is not OK, the password
+        * should not be checked. If the return value is not Good,
+        * the password can be checked, but the user should not be
+        * able to set their password to this.
+        *
+        * @param string $password Desired password
+        * @param string $purpose one of 'login', 'create', 'reset'
+        * @return Status
+        * @since 1.23
+        */
+       public function checkPasswordValidity( $password, $purpose = 'login' ) {
+               global $wgPasswordPolicy;
+
+               $upp = new UserPasswordPolicy(
+                       $wgPasswordPolicy['policies'],
+                       $wgPasswordPolicy['checks']
+               );
+
+               $status = Status::newGood();
+               $result = false; // init $result to false for the internal checks
+
+               if ( !Hooks::run( 'isValidPassword', array( $password, &$result, $this ) ) ) {
+                       $status->error( $result );
+                       return $status;
+               }
+
+               if ( $result === false ) {
+                       $status->merge( $upp->checkUserPassword( $this, $password, $purpose ) );
+                       return $status;
+               } elseif ( $result === true ) {
+                       return $status;
+               } else {
+                       $status->error( $result );
+                       return $status; // the isValidPassword hook set a string $result and returned true
+               }
+       }
+
+       /**
+        * Given unvalidated user input, return a canonical username, or false if
+        * the username is invalid.
+        * @param string $name User input
+        * @param string|bool $validate Type of validation to use:
+        *   - false        No validation
+        *   - 'valid'      Valid for batch processes
+        *   - 'usable'     Valid for batch processes and login
+        *   - 'creatable'  Valid for batch processes, login and account creation
+        *
+        * @throws InvalidArgumentException
+        * @return bool|string
+        */
+       public static function getCanonicalName( $name, $validate = 'valid' ) {
+               // Force usernames to capital
+               global $wgContLang;
+               $name = $wgContLang->ucfirst( $name );
+
+               # Reject names containing '#'; these will be cleaned up
+               # with title normalisation, but then it's too late to
+               # check elsewhere
+               if ( strpos( $name, '#' ) !== false ) {
+                       return false;
+               }
+
+               // Clean up name according to title rules,
+               // but only when validation is requested (bug 12654)
+               $t = ( $validate !== false ) ?
+                       Title::newFromText( $name ) : Title::makeTitle( NS_USER, $name );
+               // Check for invalid titles
+               if ( is_null( $t ) ) {
+                       return false;
+               }
+
+               // Reject various classes of invalid names
+               global $wgAuth;
+               $name = $wgAuth->getCanonicalName( $t->getText() );
+
+               switch ( $validate ) {
+                       case false:
+                               break;
+                       case 'valid':
+                               if ( !User::isValidUserName( $name ) ) {
+                                       $name = false;
+                               }
+                               break;
+                       case 'usable':
+                               if ( !User::isUsableName( $name ) ) {
+                                       $name = false;
+                               }
+                               break;
+                       case 'creatable':
+                               if ( !User::isCreatableName( $name ) ) {
+                                       $name = false;
+                               }
+                               break;
+                       default:
+                               throw new InvalidArgumentException(
+                                       'Invalid parameter value for $validate in ' . __METHOD__ );
+               }
+               return $name;
+       }
+
+       /**
+        * Count the number of edits of a user
+        *
+        * @param int $uid User ID to check
+        * @return int The user's edit count
+        *
+        * @deprecated since 1.21 in favour of User::getEditCount
+        */
+       public static function edits( $uid ) {
+               wfDeprecated( __METHOD__, '1.21' );
+               $user = self::newFromId( $uid );
+               return $user->getEditCount();
+       }
+
+       /**
+        * Return a random password.
+        *
+        * @deprecated since 1.27, use PasswordFactory::generateRandomPasswordString()
+        * @return string New random password
+        */
+       public static function randomPassword() {
+               global $wgMinimalPasswordLength;
+               return PasswordFactory::generateRandomPasswordString( $wgMinimalPasswordLength );
+       }
+
+       /**
+        * Set cached properties to default.
+        *
+        * @note This no longer clears uncached lazy-initialised properties;
+        *       the constructor does that instead.
+        *
+        * @param string|bool $name
+        */
+       public function loadDefaults( $name = false ) {
+               $this->mId = 0;
+               $this->mName = $name;
+               $this->mRealName = '';
+               $this->mEmail = '';
+               $this->mOptionOverrides = null;
+               $this->mOptionsLoaded = false;
+
+               $loggedOut = $this->getRequest()->getCookie( 'LoggedOut' );
+               if ( $loggedOut !== null ) {
+                       $this->mTouched = wfTimestamp( TS_MW, $loggedOut );
+               } else {
+                       $this->mTouched = '1'; # Allow any pages to be cached
+               }
+
+               $this->mToken = null; // Don't run cryptographic functions till we need a token
+               $this->mEmailAuthenticated = null;
+               $this->mEmailToken = '';
+               $this->mEmailTokenExpires = null;
+               $this->mRegistration = wfTimestamp( TS_MW );
+               $this->mGroups = array();
+
+               Hooks::run( 'UserLoadDefaults', array( $this, $name ) );
+       }
+
+       /**
+        * Return whether an item has been loaded.
+        *
+        * @param string $item Item to check. Current possibilities:
+        *   - id
+        *   - name
+        *   - realname
+        * @param string $all 'all' to check if the whole object has been loaded
+        *   or any other string to check if only the item is available (e.g.
+        *   for optimisation)
+        * @return bool
+        */
+       public function isItemLoaded( $item, $all = 'all' ) {
+               return ( $this->mLoadedItems === true && $all === 'all' ) ||
+                       ( isset( $this->mLoadedItems[$item] ) && $this->mLoadedItems[$item] === true );
+       }
+
+       /**
+        * Set that an item has been loaded
+        *
+        * @param string $item
+        */
+       protected function setItemLoaded( $item ) {
+               if ( is_array( $this->mLoadedItems ) ) {
+                       $this->mLoadedItems[$item] = true;
+               }
+       }
+
+       /**
+        * Load user data from the session or login cookie.
+        *
+        * @return bool True if the user is logged in, false otherwise.
+        */
+       private function loadFromSession() {
+               $result = null;
+               Hooks::run( 'UserLoadFromSession', array( $this, &$result ) );
+               if ( $result !== null ) {
+                       return $result;
+               }
+
+               $request = $this->getRequest();
+
+               $cookieId = $request->getCookie( 'UserID' );
+               $sessId = $request->getSessionData( 'wsUserID' );
+
+               if ( $cookieId !== null ) {
+                       $sId = intval( $cookieId );
+                       if ( $sessId !== null && $cookieId != $sessId ) {
+                               wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
+                                       cookie user ID ($sId) don't match!" );
+                               return false;
+                       }
+                       $request->setSessionData( 'wsUserID', $sId );
+               } elseif ( $sessId !== null && $sessId != 0 ) {
+                       $sId = $sessId;
+               } else {
+                       return false;
+               }
+
+               if ( $request->getSessionData( 'wsUserName' ) !== null ) {
+                       $sName = $request->getSessionData( 'wsUserName' );
+               } elseif ( $request->getCookie( 'UserName' ) !== null ) {
+                       $sName = $request->getCookie( 'UserName' );
+                       $request->setSessionData( 'wsUserName', $sName );
+               } else {
+                       return false;
+               }
+
+               $proposedUser = User::newFromId( $sId );
+               if ( !$proposedUser->isLoggedIn() ) {
+                       // Not a valid ID
+                       return false;
+               }
+
+               global $wgBlockDisablesLogin;
+               if ( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
+                       // User blocked and we've disabled blocked user logins
+                       return false;
+               }
+
+               if ( $request->getSessionData( 'wsToken' ) ) {
+                       $passwordCorrect =
+                               ( $proposedUser->getToken( false ) === $request->getSessionData( 'wsToken' ) );
+                       $from = 'session';
+               } elseif ( $request->getCookie( 'Token' ) ) {
+                       # Get the token from DB/cache and clean it up to remove garbage padding.
+                       # This deals with historical problems with bugs and the default column value.
+                       $token = rtrim( $proposedUser->getToken( false ) ); // correct token
+                       // Make comparison in constant time (bug 61346)
+                       $passwordCorrect = strlen( $token )
+                               && hash_equals( $token, $request->getCookie( 'Token' ) );
+                       $from = 'cookie';
+               } else {
+                       // No session or persistent login cookie
+                       return false;
+               }
+
+               if ( ( $sName === $proposedUser->getName() ) && $passwordCorrect ) {
+                       $this->loadFromUserObject( $proposedUser );
+                       $request->setSessionData( 'wsToken', $this->mToken );
+                       wfDebug( "User: logged in from $from\n" );
+                       return true;
+               } else {
+                       // Invalid credentials
+                       wfDebug( "User: can't log in from $from, invalid credentials\n" );
+                       return false;
+               }
+       }
+
+       /**
+        * Load user and user_group data from the database.
+        * $this->mId must be set, this is how the user is identified.
+        *
+        * @param integer $flags User::READ_* constant bitfield
+        * @return bool True if the user exists, false if the user is anonymous
+        */
+       public function loadFromDatabase( $flags = self::READ_LATEST ) {
+               // Paranoia
+               $this->mId = intval( $this->mId );
+
+               // Anonymous user
+               if ( !$this->mId ) {
+                       $this->loadDefaults();
+                       return false;
+               }
+
+               list( $index, $options ) = DBAccessObjectUtils::getDBOptions( $flags );
+               $db = wfGetDB( $index );
+
+               $s = $db->selectRow(
+                       'user',
+                       self::selectFields(),
+                       array( 'user_id' => $this->mId ),
+                       __METHOD__,
+                       $options
+               );
+
+               $this->queryFlagsUsed = $flags;
+               Hooks::run( 'UserLoadFromDatabase', array( $this, &$s ) );
+
+               if ( $s !== false ) {
+                       // Initialise user table data
+                       $this->loadFromRow( $s );
+                       $this->mGroups = null; // deferred
+                       $this->getEditCount(); // revalidation for nulls
+                       return true;
+               } else {
+                       // Invalid user_id
+                       $this->mId = 0;
+                       $this->loadDefaults();
+                       return false;
+               }
+       }
+
+       /**
+        * Initialize this object from a row from the user table.
+        *
+        * @param stdClass $row Row from the user table to load.
+        * @param array $data Further user data to load into the object
+        *
+        *      user_groups             Array with groups out of the user_groups table
+        *      user_properties         Array with properties out of the user_properties table
+        */
+       protected function loadFromRow( $row, $data = null ) {
+               $all = true;
+
+               $this->mGroups = null; // deferred
+
+               if ( isset( $row->user_name ) ) {
+                       $this->mName = $row->user_name;
+                       $this->mFrom = 'name';
+                       $this->setItemLoaded( 'name' );
+               } else {
+                       $all = false;
+               }
+
+               if ( isset( $row->user_real_name ) ) {
+                       $this->mRealName = $row->user_real_name;
+                       $this->setItemLoaded( 'realname' );
+               } else {
+                       $all = false;
+               }
+
+               if ( isset( $row->user_id ) ) {
+                       $this->mId = intval( $row->user_id );
+                       $this->mFrom = 'id';
+                       $this->setItemLoaded( 'id' );
+               } else {
+                       $all = false;
+               }
+
+               if ( isset( $row->user_id ) && isset( $row->user_name ) ) {
+                       self::$idCacheByName[$row->user_name] = $row->user_id;
+               }
+
+               if ( isset( $row->user_editcount ) ) {
+                       $this->mEditCount = $row->user_editcount;
+               } else {
+                       $all = false;
+               }
+
+               if ( isset( $row->user_email ) ) {
+                       $this->mEmail = $row->user_email;
+                       $this->mTouched = wfTimestamp( TS_MW, $row->user_touched );
+                       $this->mToken = $row->user_token;
+                       if ( $this->mToken == '' ) {
+                               $this->mToken = null;
+                       }
+                       $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $row->user_email_authenticated );
+                       $this->mEmailToken = $row->user_email_token;
+                       $this->mEmailTokenExpires = wfTimestampOrNull( TS_MW, $row->user_email_token_expires );
+                       $this->mRegistration = wfTimestampOrNull( TS_MW, $row->user_registration );
+               } else {
+                       $all = false;
+               }
+
+               if ( $all ) {
+                       $this->mLoadedItems = true;
+               }
+
+               if ( is_array( $data ) ) {
+                       if ( isset( $data['user_groups'] ) && is_array( $data['user_groups'] ) ) {
+                               $this->mGroups = $data['user_groups'];
+                       }
+                       if ( isset( $data['user_properties'] ) && is_array( $data['user_properties'] ) ) {
+                               $this->loadOptions( $data['user_properties'] );
+                       }
+               }
+       }
+
+       /**
+        * Load the data for this user object from another user object.
+        *
+        * @param User $user
+        */
+       protected function loadFromUserObject( $user ) {
+               $user->load();
+               $user->loadGroups();
+               $user->loadOptions();
+               foreach ( self::$mCacheVars as $var ) {
+                       $this->$var = $user->$var;
+               }
+       }
+
+       /**
+        * Load the groups from the database if they aren't already loaded.
+        */
+       private function loadGroups() {
+               if ( is_null( $this->mGroups ) ) {
+                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                               ? wfGetDB( DB_MASTER )
+                               : wfGetDB( DB_SLAVE );
+                       $res = $db->select( 'user_groups',
+                               array( 'ug_group' ),
+                               array( 'ug_user' => $this->mId ),
+                               __METHOD__ );
+                       $this->mGroups = array();
+                       foreach ( $res as $row ) {
+                               $this->mGroups[] = $row->ug_group;
+                       }
+               }
+       }
+
+       /**
+        * Add the user to the group if he/she meets given criteria.
+        *
+        * Contrary to autopromotion by \ref $wgAutopromote, the group will be
+        *   possible to remove manually via Special:UserRights. In such case it
+        *   will not be re-added automatically. The user will also not lose the
+        *   group if they no longer meet the criteria.
+        *
+        * @param string $event Key in $wgAutopromoteOnce (each one has groups/criteria)
+        *
+        * @return array Array of groups the user has been promoted to.
+        *
+        * @see $wgAutopromoteOnce
+        */
+       public function addAutopromoteOnceGroups( $event ) {
+               global $wgAutopromoteOnceLogInRC, $wgAuth;
+
+               if ( wfReadOnly() || !$this->getId() ) {
+                       return array();
+               }
+
+               $toPromote = Autopromote::getAutopromoteOnceGroups( $this, $event );
+               if ( !count( $toPromote ) ) {
+                       return array();
+               }
+
+               if ( !$this->checkAndSetTouched() ) {
+                       return array(); // raced out (bug T48834)
+               }
+
+               $oldGroups = $this->getGroups(); // previous groups
+               foreach ( $toPromote as $group ) {
+                       $this->addGroup( $group );
+               }
+               // update groups in external authentication database
+               Hooks::run( 'UserGroupsChanged', array( $this, $toPromote, array(), false ) );
+               $wgAuth->updateExternalDBGroups( $this, $toPromote );
+
+               $newGroups = array_merge( $oldGroups, $toPromote ); // all groups
+
+               $logEntry = new ManualLogEntry( 'rights', 'autopromote' );
+               $logEntry->setPerformer( $this );
+               $logEntry->setTarget( $this->getUserPage() );
+               $logEntry->setParameters( array(
+                       '4::oldgroups' => $oldGroups,
+                       '5::newgroups' => $newGroups,
+               ) );
+               $logid = $logEntry->insert();
+               if ( $wgAutopromoteOnceLogInRC ) {
+                       $logEntry->publish( $logid );
+               }
+
+               return $toPromote;
+       }
+
+       /**
+        * Bump user_touched if it didn't change since this object was loaded
+        *
+        * On success, the mTouched field is updated.
+        * The user serialization cache is always cleared.
+        *
+        * @return bool Whether user_touched was actually updated
+        * @since 1.26
+        */
+       protected function checkAndSetTouched() {
+               $this->load();
+
+               if ( !$this->mId ) {
+                       return false; // anon
+               }
+
+               // Get a new user_touched that is higher than the old one
+               $oldTouched = $this->mTouched;
+               $newTouched = $this->newTouchedTimestamp();
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update( 'user',
+                       array( 'user_touched' => $dbw->timestamp( $newTouched ) ),
+                       array(
+                               'user_id' => $this->mId,
+                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
+                       ),
+                       __METHOD__
+               );
+               $success = ( $dbw->affectedRows() > 0 );
+
+               if ( $success ) {
+                       $this->mTouched = $newTouched;
+                       $this->clearSharedCache();
+               } else {
+                       // Clears on failure too since that is desired if the cache is stale
+                       $this->clearSharedCache( 'refresh' );
+               }
+
+               return $success;
+       }
+
+       /**
+        * Clear various cached data stored in this object. The cache of the user table
+        * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
+        *
+        * @param bool|string $reloadFrom Reload user and user_groups table data from a
+        *   given source. May be "name", "id", "defaults", "session", or false for no reload.
+        */
+       public function clearInstanceCache( $reloadFrom = false ) {
+               $this->mNewtalk = -1;
+               $this->mDatePreference = null;
+               $this->mBlockedby = -1; # Unset
+               $this->mHash = false;
+               $this->mRights = null;
+               $this->mEffectiveGroups = null;
+               $this->mImplicitGroups = null;
+               $this->mGroups = null;
+               $this->mOptions = null;
+               $this->mOptionsLoaded = false;
+               $this->mEditCount = null;
+
+               if ( $reloadFrom ) {
+                       $this->mLoadedItems = array();
+                       $this->mFrom = $reloadFrom;
+               }
+       }
+
+       /**
+        * Combine the language default options with any site-specific options
+        * and add the default language variants.
+        *
+        * @return array Array of String options
+        */
+       public static function getDefaultOptions() {
+               global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
+
+               static $defOpt = null;
+               if ( !defined( 'MW_PHPUNIT_TEST' ) && $defOpt !== null ) {
+                       // Disabling this for the unit tests, as they rely on being able to change $wgContLang
+                       // mid-request and see that change reflected in the return value of this function.
+                       // Which is insane and would never happen during normal MW operation
+                       return $defOpt;
+               }
+
+               $defOpt = $wgDefaultUserOptions;
+               // Default language setting
+               $defOpt['language'] = $wgContLang->getCode();
+               foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
+                       $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
+               }
+               foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
+                       $defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
+               }
+               $defOpt['skin'] = Skin::normalizeKey( $wgDefaultSkin );
+
+               Hooks::run( 'UserGetDefaultOptions', array( &$defOpt ) );
+
+               return $defOpt;
+       }
+
+       /**
+        * Get a given default option value.
+        *
+        * @param string $opt Name of option to retrieve
+        * @return string Default option value
+        */
+       public static function getDefaultOption( $opt ) {
+               $defOpts = self::getDefaultOptions();
+               if ( isset( $defOpts[$opt] ) ) {
+                       return $defOpts[$opt];
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Get blocking information
+        * @param bool $bFromSlave Whether to check the slave database first.
+        *   To improve performance, non-critical checks are done against slaves.
+        *   Check when actually saving should be done against master.
+        */
+       private function getBlockedStatus( $bFromSlave = true ) {
+               global $wgProxyWhitelist, $wgUser, $wgApplyIpBlocksToXff;
+
+               if ( -1 != $this->mBlockedby ) {
+                       return;
+               }
+
+               wfDebug( __METHOD__ . ": checking...\n" );
+
+               // Initialize data...
+               // Otherwise something ends up stomping on $this->mBlockedby when
+               // things get lazy-loaded later, causing false positive block hits
+               // due to -1 !== 0. Probably session-related... Nothing should be
+               // overwriting mBlockedby, surely?
+               $this->load();
+
+               # We only need to worry about passing the IP address to the Block generator if the
+               # user is not immune to autoblocks/hardblocks, and they are the current user so we
+               # know which IP address they're actually coming from
+               if ( !$this->isAllowed( 'ipblock-exempt' ) && $this->equals( $wgUser ) ) {
+                       $ip = $this->getRequest()->getIP();
+               } else {
+                       $ip = null;
+               }
+
+               // User/IP blocking
+               $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
+
+               // Proxy blocking
+               if ( !$block instanceof Block && $ip !== null && !$this->isAllowed( 'proxyunbannable' )
+                       && !in_array( $ip, $wgProxyWhitelist )
+               ) {
+                       // Local list
+                       if ( self::isLocallyBlockedProxy( $ip ) ) {
+                               $block = new Block;
+                               $block->setBlocker( wfMessage( 'proxyblocker' )->text() );
+                               $block->mReason = wfMessage( 'proxyblockreason' )->text();
+                               $block->setTarget( $ip );
+                       } elseif ( $this->isAnon() && $this->isDnsBlacklisted( $ip ) ) {
+                               $block = new Block;
+                               $block->setBlocker( wfMessage( 'sorbs' )->text() );
+                               $block->mReason = wfMessage( 'sorbsreason' )->text();
+                               $block->setTarget( $ip );
+                       }
+               }
+
+               // (bug 23343) Apply IP blocks to the contents of XFF headers, if enabled
+               if ( !$block instanceof Block
+                       && $wgApplyIpBlocksToXff
+                       && $ip !== null
+                       && !$this->isAllowed( 'proxyunbannable' )
+                       && !in_array( $ip, $wgProxyWhitelist )
+               ) {
+                       $xff = $this->getRequest()->getHeader( 'X-Forwarded-For' );
+                       $xff = array_map( 'trim', explode( ',', $xff ) );
+                       $xff = array_diff( $xff, array( $ip ) );
+                       $xffblocks = Block::getBlocksForIPList( $xff, $this->isAnon(), !$bFromSlave );
+                       $block = Block::chooseBlock( $xffblocks, $xff );
+                       if ( $block instanceof Block ) {
+                               # Mangle the reason to alert the user that the block
+                               # originated from matching the X-Forwarded-For header.
+                               $block->mReason = wfMessage( 'xffblockreason', $block->mReason )->text();
+                       }
+               }
+
+               if ( $block instanceof Block ) {
+                       wfDebug( __METHOD__ . ": Found block.\n" );
+                       $this->mBlock = $block;
+                       $this->mBlockedby = $block->getByName();
+                       $this->mBlockreason = $block->mReason;
+                       $this->mHideName = $block->mHideName;
+                       $this->mAllowUsertalk = !$block->prevents( 'editownusertalk' );
+               } else {
+                       $this->mBlockedby = '';
+                       $this->mHideName = 0;
+                       $this->mAllowUsertalk = false;
+               }
+
+               // Extensions
+               Hooks::run( 'GetBlockedStatus', array( &$this ) );
+
+       }
+
+       /**
+        * Whether the given IP is in a DNS blacklist.
+        *
+        * @param string $ip IP to check
+        * @param bool $checkWhitelist Whether to check the whitelist first
+        * @return bool True if blacklisted.
+        */
+       public function isDnsBlacklisted( $ip, $checkWhitelist = false ) {
+               global $wgEnableDnsBlacklist, $wgDnsBlacklistUrls, $wgProxyWhitelist;
+
+               if ( !$wgEnableDnsBlacklist ) {
+                       return false;
+               }
+
+               if ( $checkWhitelist && in_array( $ip, $wgProxyWhitelist ) ) {
+                       return false;
+               }
+
+               return $this->inDnsBlacklist( $ip, $wgDnsBlacklistUrls );
+       }
+
+       /**
+        * Whether the given IP is in a given DNS blacklist.
+        *
+        * @param string $ip IP to check
+        * @param string|array $bases Array of Strings: URL of the DNS blacklist
+        * @return bool True if blacklisted.
+        */
+       public function inDnsBlacklist( $ip, $bases ) {
+
+               $found = false;
+               // @todo FIXME: IPv6 ???  (http://bugs.php.net/bug.php?id=33170)
+               if ( IP::isIPv4( $ip ) ) {
+                       // Reverse IP, bug 21255
+                       $ipReversed = implode( '.', array_reverse( explode( '.', $ip ) ) );
+
+                       foreach ( (array)$bases as $base ) {
+                               // Make hostname
+                               // If we have an access key, use that too (ProjectHoneypot, etc.)
+                               $basename = $base;
+                               if ( is_array( $base ) ) {
+                                       if ( count( $base ) >= 2 ) {
+                                               // Access key is 1, base URL is 0
+                                               $host = "{$base[1]}.$ipReversed.{$base[0]}";
+                                       } else {
+                                               $host = "$ipReversed.{$base[0]}";
+                                       }
+                                       $basename = $base[0];
+                               } else {
+                                       $host = "$ipReversed.$base";
+                               }
+
+                               // Send query
+                               $ipList = gethostbynamel( $host );
+
+                               if ( $ipList ) {
+                                       wfDebugLog( 'dnsblacklist', "Hostname $host is {$ipList[0]}, it's a proxy says $basename!" );
+                                       $found = true;
+                                       break;
+                               } else {
+                                       wfDebugLog( 'dnsblacklist', "Requested $host, not found in $basename." );
+                               }
+                       }
+               }
+
+               return $found;
+       }
+
+       /**
+        * Check if an IP address is in the local proxy list
+        *
+        * @param string $ip
+        *
+        * @return bool
+        */
+       public static function isLocallyBlockedProxy( $ip ) {
+               global $wgProxyList;
+
+               if ( !$wgProxyList ) {
+                       return false;
+               }
+
+               if ( !is_array( $wgProxyList ) ) {
+                       // Load from the specified file
+                       $wgProxyList = array_map( 'trim', file( $wgProxyList ) );
+               }
+
+               if ( !is_array( $wgProxyList ) ) {
+                       $ret = false;
+               } elseif ( array_search( $ip, $wgProxyList ) !== false ) {
+                       $ret = true;
+               } elseif ( array_key_exists( $ip, $wgProxyList ) ) {
+                       // Old-style flipped proxy list
+                       $ret = true;
+               } else {
+                       $ret = false;
+               }
+               return $ret;
+       }
+
+       /**
+        * Is this user subject to rate limiting?
+        *
+        * @return bool True if rate limited
+        */
+       public function isPingLimitable() {
+               global $wgRateLimitsExcludedIPs;
+               if ( in_array( $this->getRequest()->getIP(), $wgRateLimitsExcludedIPs ) ) {
+                       // No other good way currently to disable rate limits
+                       // for specific IPs. :P
+                       // But this is a crappy hack and should die.
+                       return false;
+               }
+               return !$this->isAllowed( 'noratelimit' );
+       }
+
+       /**
+        * Primitive rate limits: enforce maximum actions per time period
+        * to put a brake on flooding.
+        *
+        * The method generates both a generic profiling point and a per action one
+        * (suffix being "-$action".
+        *
+        * @note When using a shared cache like memcached, IP-address
+        * last-hit counters will be shared across wikis.
+        *
+        * @param string $action Action to enforce; 'edit' if unspecified
+        * @param int $incrBy Positive amount to increment counter by [defaults to 1]
+        * @return bool True if a rate limiter was tripped
+        */
+       public function pingLimiter( $action = 'edit', $incrBy = 1 ) {
+               // Call the 'PingLimiter' hook
+               $result = false;
+               if ( !Hooks::run( 'PingLimiter', array( &$this, $action, &$result, $incrBy ) ) ) {
+                       return $result;
+               }
+
+               global $wgRateLimits;
+               if ( !isset( $wgRateLimits[$action] ) ) {
+                       return false;
+               }
+
+               // Some groups shouldn't trigger the ping limiter, ever
+               if ( !$this->isPingLimitable() ) {
+                       return false;
+               }
+
+               $limits = $wgRateLimits[$action];
+               $keys = array();
+               $id = $this->getId();
+               $userLimit = false;
+
+               if ( isset( $limits['anon'] ) && $id == 0 ) {
+                       $keys[wfMemcKey( 'limiter', $action, 'anon' )] = $limits['anon'];
+               }
+
+               if ( isset( $limits['user'] ) && $id != 0 ) {
+                       $userLimit = $limits['user'];
+               }
+               if ( $this->isNewbie() ) {
+                       if ( isset( $limits['newbie'] ) && $id != 0 ) {
+                               $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
+                       }
+                       if ( isset( $limits['ip'] ) ) {
+                               $ip = $this->getRequest()->getIP();
+                               $keys["mediawiki:limiter:$action:ip:$ip"] = $limits['ip'];
+                       }
+                       if ( isset( $limits['subnet'] ) ) {
+                               $ip = $this->getRequest()->getIP();
+                               $matches = array();
+                               $subnet = false;
+                               if ( IP::isIPv6( $ip ) ) {
+                                       $parts = IP::parseRange( "$ip/64" );
+                                       $subnet = $parts[0];
+                               } elseif ( preg_match( '/^(\d+\.\d+\.\d+)\.\d+$/', $ip, $matches ) ) {
+                                       // IPv4
+                                       $subnet = $matches[1];
+                               }
+                               if ( $subnet !== false ) {
+                                       $keys["mediawiki:limiter:$action:subnet:$subnet"] = $limits['subnet'];
+                               }
+                       }
+               }
+               // Check for group-specific permissions
+               // If more than one group applies, use the group with the highest limit
+               foreach ( $this->getGroups() as $group ) {
+                       if ( isset( $limits[$group] ) ) {
+                               if ( $userLimit === false
+                                       || $limits[$group][0] / $limits[$group][1] > $userLimit[0] / $userLimit[1]
+                               ) {
+                                       $userLimit = $limits[$group];
+                               }
+                       }
+               }
+               // Set the user limit key
+               if ( $userLimit !== false ) {
+                       list( $max, $period ) = $userLimit;
+                       wfDebug( __METHOD__ . ": effective user limit: $max in {$period}s\n" );
+                       $keys[wfMemcKey( 'limiter', $action, 'user', $id )] = $userLimit;
+               }
+
+               $cache = ObjectCache::getLocalClusterInstance();
+
+               $triggered = false;
+               foreach ( $keys as $key => $limit ) {
+                       list( $max, $period ) = $limit;
+                       $summary = "(limit $max in {$period}s)";
+                       $count = $cache->get( $key );
+                       // Already pinged?
+                       if ( $count ) {
+                               if ( $count >= $max ) {
+                                       wfDebugLog( 'ratelimit', "User '{$this->getName()}' " .
+                                               "(IP {$this->getRequest()->getIP()}) tripped $key at $count $summary" );
+                                       $triggered = true;
+                               } else {
+                                       wfDebug( __METHOD__ . ": ok. $key at $count $summary\n" );
+                               }
+                       } else {
+                               wfDebug( __METHOD__ . ": adding record for $key $summary\n" );
+                               if ( $incrBy > 0 ) {
+                                       $cache->add( $key, 0, intval( $period ) ); // first ping
+                               }
+                       }
+                       if ( $incrBy > 0 ) {
+                               $cache->incr( $key, $incrBy );
+                       }
+               }
+
+               return $triggered;
+       }
+
+       /**
+        * Check if user is blocked
+        *
+        * @param bool $bFromSlave Whether to check the slave database instead of
+        *   the master. Hacked from false due to horrible probs on site.
+        * @return bool True if blocked, false otherwise
+        */
+       public function isBlocked( $bFromSlave = true ) {
+               return $this->getBlock( $bFromSlave ) instanceof Block && $this->getBlock()->prevents( 'edit' );
+       }
+
+       /**
+        * Get the block affecting the user, or null if the user is not blocked
+        *
+        * @param bool $bFromSlave Whether to check the slave database instead of the master
+        * @return Block|null
+        */
+       public function getBlock( $bFromSlave = true ) {
+               $this->getBlockedStatus( $bFromSlave );
+               return $this->mBlock instanceof Block ? $this->mBlock : null;
+       }
+
+       /**
+        * Check if user is blocked from editing a particular article
+        *
+        * @param Title $title Title to check
+        * @param bool $bFromSlave Whether to check the slave database instead of the master
+        * @return bool
+        */
+       public function isBlockedFrom( $title, $bFromSlave = false ) {
+               global $wgBlockAllowsUTEdit;
+
+               $blocked = $this->isBlocked( $bFromSlave );
+               $allowUsertalk = ( $wgBlockAllowsUTEdit ? $this->mAllowUsertalk : false );
+               // If a user's name is suppressed, they cannot make edits anywhere
+               if ( !$this->mHideName && $allowUsertalk && $title->getText() === $this->getName()
+                       && $title->getNamespace() == NS_USER_TALK ) {
+                       $blocked = false;
+                       wfDebug( __METHOD__ . ": self-talk page, ignoring any blocks\n" );
+               }
+
+               Hooks::run( 'UserIsBlockedFrom', array( $this, $title, &$blocked, &$allowUsertalk ) );
+
+               return $blocked;
+       }
+
+       /**
+        * If user is blocked, return the name of the user who placed the block
+        * @return string Name of blocker
+        */
+       public function blockedBy() {
+               $this->getBlockedStatus();
+               return $this->mBlockedby;
+       }
+
+       /**
+        * If user is blocked, return the specified reason for the block
+        * @return string Blocking reason
+        */
+       public function blockedFor() {
+               $this->getBlockedStatus();
+               return $this->mBlockreason;
+       }
+
+       /**
+        * If user is blocked, return the ID for the block
+        * @return int Block ID
+        */
+       public function getBlockId() {
+               $this->getBlockedStatus();
+               return ( $this->mBlock ? $this->mBlock->getId() : false );
+       }
+
+       /**
+        * Check if user is blocked on all wikis.
+        * Do not use for actual edit permission checks!
+        * This is intended for quick UI checks.
+        *
+        * @param string $ip IP address, uses current client if none given
+        * @return bool True if blocked, false otherwise
+        */
+       public function isBlockedGlobally( $ip = '' ) {
+               if ( $this->mBlockedGlobally !== null ) {
+                       return $this->mBlockedGlobally;
+               }
+               // User is already an IP?
+               if ( IP::isIPAddress( $this->getName() ) ) {
+                       $ip = $this->getName();
+               } elseif ( !$ip ) {
+                       $ip = $this->getRequest()->getIP();
+               }
+               $blocked = false;
+               Hooks::run( 'UserIsBlockedGlobally', array( &$this, $ip, &$blocked ) );
+               $this->mBlockedGlobally = (bool)$blocked;
+               return $this->mBlockedGlobally;
+       }
+
+       /**
+        * Check if user account is locked
+        *
+        * @return bool True if locked, false otherwise
+        */
+       public function isLocked() {
+               if ( $this->mLocked !== null ) {
+                       return $this->mLocked;
+               }
+               global $wgAuth;
+               $authUser = $wgAuth->getUserInstance( $this );
+               $this->mLocked = (bool)$authUser->isLocked();
+               Hooks::run( 'UserIsLocked', array( $this, &$this->mLocked ) );
+               return $this->mLocked;
+       }
+
+       /**
+        * Check if user account is hidden
+        *
+        * @return bool True if hidden, false otherwise
+        */
+       public function isHidden() {
+               if ( $this->mHideName !== null ) {
+                       return $this->mHideName;
+               }
+               $this->getBlockedStatus();
+               if ( !$this->mHideName ) {
+                       global $wgAuth;
+                       $authUser = $wgAuth->getUserInstance( $this );
+                       $this->mHideName = (bool)$authUser->isHidden();
+                       Hooks::run( 'UserIsHidden', array( $this, &$this->mHideName ) );
+               }
+               return $this->mHideName;
+       }
+
+       /**
+        * Get the user's ID.
+        * @return int The user's ID; 0 if the user is anonymous or nonexistent
+        */
+       public function getId() {
+               if ( $this->mId === null && $this->mName !== null && User::isIP( $this->mName ) ) {
+                       // Special case, we know the user is anonymous
+                       return 0;
+               } elseif ( !$this->isItemLoaded( 'id' ) ) {
+                       // Don't load if this was initialized from an ID
+                       $this->load();
+               }
+               return $this->mId;
+       }
+
+       /**
+        * Set the user and reload all fields according to a given ID
+        * @param int $v User ID to reload
+        */
+       public function setId( $v ) {
+               $this->mId = $v;
+               $this->clearInstanceCache( 'id' );
+       }
+
+       /**
+        * Get the user name, or the IP of an anonymous user
+        * @return string User's name or IP address
+        */
+       public function getName() {
+               if ( $this->isItemLoaded( 'name', 'only' ) ) {
+                       // Special case optimisation
+                       return $this->mName;
+               } else {
+                       $this->load();
+                       if ( $this->mName === false ) {
+                               // Clean up IPs
+                               $this->mName = IP::sanitizeIP( $this->getRequest()->getIP() );
+                       }
+                       return $this->mName;
+               }
+       }
+
+       /**
+        * Set the user name.
+        *
+        * This does not reload fields from the database according to the given
+        * name. Rather, it is used to create a temporary "nonexistent user" for
+        * later addition to the database. It can also be used to set the IP
+        * address for an anonymous user to something other than the current
+        * remote IP.
+        *
+        * @note User::newFromName() has roughly the same function, when the named user
+        * does not exist.
+        * @param string $str New user name to set
+        */
+       public function setName( $str ) {
+               $this->load();
+               $this->mName = $str;
+       }
+
+       /**
+        * Get the user's name escaped by underscores.
+        * @return string Username escaped by underscores.
+        */
+       public function getTitleKey() {
+               return str_replace( ' ', '_', $this->getName() );
+       }
+
+       /**
+        * Check if the user has new messages.
+        * @return bool True if the user has new messages
+        */
+       public function getNewtalk() {
+               $this->load();
+
+               // Load the newtalk status if it is unloaded (mNewtalk=-1)
+               if ( $this->mNewtalk === -1 ) {
+                       $this->mNewtalk = false; # reset talk page status
+
+                       // Check memcached separately for anons, who have no
+                       // entire User object stored in there.
+                       if ( !$this->mId ) {
+                               global $wgDisableAnonTalk;
+                               if ( $wgDisableAnonTalk ) {
+                                       // Anon newtalk disabled by configuration.
+                                       $this->mNewtalk = false;
+                               } else {
+                                       $this->mNewtalk = $this->checkNewtalk( 'user_ip', $this->getName() );
+                               }
+                       } else {
+                               $this->mNewtalk = $this->checkNewtalk( 'user_id', $this->mId );
+                       }
+               }
+
+               return (bool)$this->mNewtalk;
+       }
+
+       /**
+        * Return the data needed to construct links for new talk page message
+        * alerts. If there are new messages, this will return an associative array
+        * with the following data:
+        *     wiki: The database name of the wiki
+        *     link: Root-relative link to the user's talk page
+        *     rev: The last talk page revision that the user has seen or null. This
+        *         is useful for building diff links.
+        * If there are no new messages, it returns an empty array.
+        * @note This function was designed to accomodate multiple talk pages, but
+        * currently only returns a single link and revision.
+        * @return array
+        */
+       public function getNewMessageLinks() {
+               $talks = array();
+               if ( !Hooks::run( 'UserRetrieveNewTalks', array( &$this, &$talks ) ) ) {
+                       return $talks;
+               } elseif ( !$this->getNewtalk() ) {
+                       return array();
+               }
+               $utp = $this->getTalkPage();
+               $dbr = wfGetDB( DB_SLAVE );
+               // Get the "last viewed rev" timestamp from the oldest message notification
+               $timestamp = $dbr->selectField( 'user_newtalk',
+                       'MIN(user_last_timestamp)',
+                       $this->isAnon() ? array( 'user_ip' => $this->getName() ) : array( 'user_id' => $this->getID() ),
+                       __METHOD__ );
+               $rev = $timestamp ? Revision::loadFromTimestamp( $dbr, $utp, $timestamp ) : null;
+               return array( array( 'wiki' => wfWikiID(), 'link' => $utp->getLocalURL(), 'rev' => $rev ) );
+       }
+
+       /**
+        * Get the revision ID for the last talk page revision viewed by the talk
+        * page owner.
+        * @return int|null Revision ID or null
+        */
+       public function getNewMessageRevisionId() {
+               $newMessageRevisionId = null;
+               $newMessageLinks = $this->getNewMessageLinks();
+               if ( $newMessageLinks ) {
+                       // Note: getNewMessageLinks() never returns more than a single link
+                       // and it is always for the same wiki, but we double-check here in
+                       // case that changes some time in the future.
+                       if ( count( $newMessageLinks ) === 1
+                               && $newMessageLinks[0]['wiki'] === wfWikiID()
+                               && $newMessageLinks[0]['rev']
+                       ) {
+                               /** @var Revision $newMessageRevision */
+                               $newMessageRevision = $newMessageLinks[0]['rev'];
+                               $newMessageRevisionId = $newMessageRevision->getId();
+                       }
+               }
+               return $newMessageRevisionId;
+       }
+
+       /**
+        * Internal uncached check for new messages
+        *
+        * @see getNewtalk()
+        * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
+        * @param string|int $id User's IP address for anonymous users, User ID otherwise
+        * @return bool True if the user has new messages
+        */
+       protected function checkNewtalk( $field, $id ) {
+               $dbr = wfGetDB( DB_SLAVE );
+
+               $ok = $dbr->selectField( 'user_newtalk', $field, array( $field => $id ), __METHOD__ );
+
+               return $ok !== false;
+       }
+
+       /**
+        * Add or update the new messages flag
+        * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
+        * @param string|int $id User's IP address for anonymous users, User ID otherwise
+        * @param Revision|null $curRev New, as yet unseen revision of the user talk page. Ignored if null.
+        * @return bool True if successful, false otherwise
+        */
+       protected function updateNewtalk( $field, $id, $curRev = null ) {
+               // Get timestamp of the talk page revision prior to the current one
+               $prevRev = $curRev ? $curRev->getPrevious() : false;
+               $ts = $prevRev ? $prevRev->getTimestamp() : null;
+               // Mark the user as having new messages since this revision
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->insert( 'user_newtalk',
+                       array( $field => $id, 'user_last_timestamp' => $dbw->timestampOrNull( $ts ) ),
+                       __METHOD__,
+                       'IGNORE' );
+               if ( $dbw->affectedRows() ) {
+                       wfDebug( __METHOD__ . ": set on ($field, $id)\n" );
+                       return true;
+               } else {
+                       wfDebug( __METHOD__ . " already set ($field, $id)\n" );
+                       return false;
+               }
+       }
+
+       /**
+        * Clear the new messages flag for the given user
+        * @param string $field 'user_ip' for anonymous users, 'user_id' otherwise
+        * @param string|int $id User's IP address for anonymous users, User ID otherwise
+        * @return bool True if successful, false otherwise
+        */
+       protected function deleteNewtalk( $field, $id ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'user_newtalk',
+                       array( $field => $id ),
+                       __METHOD__ );
+               if ( $dbw->affectedRows() ) {
+                       wfDebug( __METHOD__ . ": killed on ($field, $id)\n" );
+                       return true;
+               } else {
+                       wfDebug( __METHOD__ . ": already gone ($field, $id)\n" );
+                       return false;
+               }
+       }
+
+       /**
+        * Update the 'You have new messages!' status.
+        * @param bool $val Whether the user has new messages
+        * @param Revision $curRev New, as yet unseen revision of the user talk
+        *   page. Ignored if null or !$val.
+        */
+       public function setNewtalk( $val, $curRev = null ) {
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               $this->load();
+               $this->mNewtalk = $val;
+
+               if ( $this->isAnon() ) {
+                       $field = 'user_ip';
+                       $id = $this->getName();
+               } else {
+                       $field = 'user_id';
+                       $id = $this->getId();
+               }
+
+               if ( $val ) {
+                       $changed = $this->updateNewtalk( $field, $id, $curRev );
+               } else {
+                       $changed = $this->deleteNewtalk( $field, $id );
+               }
+
+               if ( $changed ) {
+                       $this->invalidateCache();
+               }
+       }
+
+       /**
+        * Generate a current or new-future timestamp to be stored in the
+        * user_touched field when we update things.
+        * @return string Timestamp in TS_MW format
+        */
+       private function newTouchedTimestamp() {
+               global $wgClockSkewFudge;
+
+               $time = wfTimestamp( TS_MW, time() + $wgClockSkewFudge );
+               if ( $this->mTouched && $time <= $this->mTouched ) {
+                       $time = wfTimestamp( TS_MW, wfTimestamp( TS_UNIX, $this->mTouched ) + 1 );
+               }
+
+               return $time;
+       }
+
+       /**
+        * Clear user data from memcached
+        *
+        * Use after applying updates to the database; caller's
+        * responsibility to update user_touched if appropriate.
+        *
+        * Called implicitly from invalidateCache() and saveSettings().
+        *
+        * @param string $mode Use 'refresh' to clear now; otherwise before DB commit
+        */
+       public function clearSharedCache( $mode = 'changed' ) {
+               if ( !$this->getId() ) {
+                       return;
+               }
+
+               $cache = ObjectCache::getMainWANInstance();
+               $key = $this->getCacheKey( $cache );
+               if ( $mode === 'refresh' ) {
+                       $cache->delete( $key, 1 );
+               } else {
+                       wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $cache, $key ) {
+                               $cache->delete( $key );
+                       } );
+               }
+       }
+
+       /**
+        * Immediately touch the user data cache for this account
+        *
+        * Calls touch() and removes account data from memcached
+        */
+       public function invalidateCache() {
+               $this->touch();
+               $this->clearSharedCache();
+       }
+
+       /**
+        * Update the "touched" timestamp for the user
+        *
+        * This is useful on various login/logout events when making sure that
+        * a browser or proxy that has multiple tenants does not suffer cache
+        * pollution where the new user sees the old users content. The value
+        * of getTouched() is checked when determining 304 vs 200 responses.
+        * Unlike invalidateCache(), this preserves the User object cache and
+        * avoids database writes.
+        *
+        * @since 1.25
+        */
+       public function touch() {
+               $id = $this->getId();
+               if ( $id ) {
+                       $key = wfMemcKey( 'user-quicktouched', 'id', $id );
+                       ObjectCache::getMainWANInstance()->touchCheckKey( $key );
+                       $this->mQuickTouched = null;
+               }
+       }
+
+       /**
+        * Validate the cache for this account.
+        * @param string $timestamp A timestamp in TS_MW format
+        * @return bool
+        */
+       public function validateCache( $timestamp ) {
+               return ( $timestamp >= $this->getTouched() );
+       }
+
+       /**
+        * Get the user touched timestamp
+        *
+        * Use this value only to validate caches via inequalities
+        * such as in the case of HTTP If-Modified-Since response logic
+        *
+        * @return string TS_MW Timestamp
+        */
+       public function getTouched() {
+               $this->load();
+
+               if ( $this->mId ) {
+                       if ( $this->mQuickTouched === null ) {
+                               $key = wfMemcKey( 'user-quicktouched', 'id', $this->mId );
+                               $cache = ObjectCache::getMainWANInstance();
+
+                               $this->mQuickTouched = wfTimestamp( TS_MW, $cache->getCheckKeyTime( $key ) );
+                       }
+
+                       return max( $this->mTouched, $this->mQuickTouched );
+               }
+
+               return $this->mTouched;
+       }
+
+       /**
+        * Get the user_touched timestamp field (time of last DB updates)
+        * @return string TS_MW Timestamp
+        * @since 1.26
+        */
+       public function getDBTouched() {
+               $this->load();
+
+               return $this->mTouched;
+       }
+
+       /**
+        * @deprecated Removed in 1.27.
+        * @return Password
+        * @since 1.24
+        */
+       public function getPassword() {
+               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
+       }
+
+       /**
+        * @deprecated Removed in 1.27.
+        * @return Password
+        * @since 1.24
+        */
+       public function getTemporaryPassword() {
+               throw new BadMethodCallException( __METHOD__ . ' has been removed in 1.27' );
+       }
+
+       /**
+        * Set the password and reset the random token.
+        * Calls through to authentication plugin if necessary;
+        * will have no effect if the auth plugin refuses to
+        * pass the change through or if the legal password
+        * checks fail.
+        *
+        * As a special case, setting the password to null
+        * wipes it, so the account cannot be logged in until
+        * a new password is set, for instance via e-mail.
+        *
+        * @deprecated since 1.27. AuthManager is coming.
+        * @param string $str New password to set
+        * @throws PasswordError On failure
+        * @return bool
+        */
+       public function setPassword( $str ) {
+               global $wgAuth;
+
+               if ( $str !== null ) {
+                       if ( !$wgAuth->allowPasswordChange() ) {
+                               throw new PasswordError( wfMessage( 'password-change-forbidden' )->text() );
+                       }
+
+                       $status = $this->checkPasswordValidity( $str );
+                       if ( !$status->isGood() ) {
+                               throw new PasswordError( $status->getMessage()->text() );
+                       }
+               }
+
+               if ( !$wgAuth->setPassword( $this, $str ) ) {
+                       throw new PasswordError( wfMessage( 'externaldberror' )->text() );
+               }
+
+               $this->setToken();
+               $this->setOption( 'watchlisttoken', false );
+               $this->setPasswordInternal( $str );
+
+               return true;
+       }
+
+       /**
+        * Set the password and reset the random token unconditionally.
+        *
+        * @deprecated since 1.27. AuthManager is coming.
+        * @param string|null $str New password to set or null to set an invalid
+        *  password hash meaning that the user will not be able to log in
+        *  through the web interface.
+        */
+       public function setInternalPassword( $str ) {
+               global $wgAuth;
+
+               if ( $wgAuth->allowSetLocalPassword() ) {
+                       $this->setToken();
+                       $this->setOption( 'watchlisttoken', false );
+                       $this->setPasswordInternal( $str );
+               }
+       }
+
+       /**
+        * Actually set the password and such
+        * @since 1.27 cannot set a password for a user not in the database
+        * @param string|null $str New password to set or null to set an invalid
+        *  password hash meaning that the user will not be able to log in
+        *  through the web interface.
+        */
+       private function setPasswordInternal( $str ) {
+               $id = self::idFromName( $this->getName(), self::READ_LATEST );
+               if ( $id == 0 ) {
+                       throw new LogicException( 'Cannot set a password for a user that is not in the database.' );
+               }
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'user',
+                       array(
+                               'user_password' => $passwordFactory->newFromPlaintext( $str )->toString(),
+                               'user_newpassword' => PasswordFactory::newInvalidPassword()->toString(),
+                               'user_newpass_time' => $dbw->timestampOrNull( null ),
+                       ),
+                       array(
+                               'user_id' => $id,
+                       ),
+                       __METHOD__
+               );
+       }
+
+       /**
+        * Get the user's current token.
+        * @param bool $forceCreation Force the generation of a new token if the
+        *   user doesn't have one (default=true for backwards compatibility).
+        * @return string Token
+        */
+       public function getToken( $forceCreation = true ) {
+               $this->load();
+               if ( !$this->mToken && $forceCreation ) {
+                       $this->setToken();
+               }
+               return $this->mToken;
+       }
+
+       /**
+        * Set the random token (used for persistent authentication)
+        * Called from loadDefaults() among other places.
+        *
+        * @param string|bool $token If specified, set the token to this value
+        */
+       public function setToken( $token = false ) {
+               $this->load();
+               if ( !$token ) {
+                       $this->mToken = MWCryptRand::generateHex( self::TOKEN_LENGTH );
+               } else {
+                       $this->mToken = $token;
+               }
+       }
+
+       /**
+        * Set the password for a password reminder or new account email
+        *
+        * @deprecated since 1.27, AuthManager is coming
+        * @param string $str New password to set or null to set an invalid
+        *  password hash meaning that the user will not be able to use it
+        * @param bool $throttle If true, reset the throttle timestamp to the present
+        */
+       public function setNewpassword( $str, $throttle = true ) {
+               $id = $this->getId();
+               if ( $id == 0 ) {
+                       throw new LogicException( 'Cannot set new password for a user that is not in the database.' );
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $update = array(
+                       'user_newpassword' => $passwordFactory->newFromPlaintext( $str )->toString(),
+               );
+
+               if ( $str === null ) {
+                       $update['user_newpass_time'] = null;
+               } elseif ( $throttle ) {
+                       $update['user_newpass_time'] = $dbw->timestamp();
+               }
+
+               $dbw->update( 'user', $update, array( 'user_id' => $id ), __METHOD__ );
+       }
+
+       /**
+        * Has password reminder email been sent within the last
+        * $wgPasswordReminderResendTime hours?
+        * @return bool
+        */
+       public function isPasswordReminderThrottled() {
+               global $wgPasswordReminderResendTime;
+
+               if ( !$wgPasswordReminderResendTime ) {
+                       return false;
+               }
+
+               $this->load();
+
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+               $newpassTime = $db->selectField(
+                       'user',
+                       'user_newpass_time',
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+
+               if ( $newpassTime === null ) {
+                       return false;
+               }
+               $expiry = wfTimestamp( TS_UNIX, $newpassTime ) + $wgPasswordReminderResendTime * 3600;
+               return time() < $expiry;
+       }
+
+       /**
+        * Get the user's e-mail address
+        * @return string User's email address
+        */
+       public function getEmail() {
+               $this->load();
+               Hooks::run( 'UserGetEmail', array( $this, &$this->mEmail ) );
+               return $this->mEmail;
+       }
+
+       /**
+        * Get the timestamp of the user's e-mail authentication
+        * @return string TS_MW timestamp
+        */
+       public function getEmailAuthenticationTimestamp() {
+               $this->load();
+               Hooks::run( 'UserGetEmailAuthenticationTimestamp', array( $this, &$this->mEmailAuthenticated ) );
+               return $this->mEmailAuthenticated;
+       }
+
+       /**
+        * Set the user's e-mail address
+        * @param string $str New e-mail address
+        */
+       public function setEmail( $str ) {
+               $this->load();
+               if ( $str == $this->mEmail ) {
+                       return;
+               }
+               $this->invalidateEmail();
+               $this->mEmail = $str;
+               Hooks::run( 'UserSetEmail', array( $this, &$this->mEmail ) );
+       }
+
+       /**
+        * Set the user's e-mail address and a confirmation mail if needed.
+        *
+        * @since 1.20
+        * @param string $str New e-mail address
+        * @return Status
+        */
+       public function setEmailWithConfirmation( $str ) {
+               global $wgEnableEmail, $wgEmailAuthentication;
+
+               if ( !$wgEnableEmail ) {
+                       return Status::newFatal( 'emaildisabled' );
+               }
+
+               $oldaddr = $this->getEmail();
+               if ( $str === $oldaddr ) {
+                       return Status::newGood( true );
+               }
+
+               $this->setEmail( $str );
+
+               if ( $str !== '' && $wgEmailAuthentication ) {
+                       // Send a confirmation request to the new address if needed
+                       $type = $oldaddr != '' ? 'changed' : 'set';
+                       $result = $this->sendConfirmationMail( $type );
+                       if ( $result->isGood() ) {
+                               // Say to the caller that a confirmation mail has been sent
+                               $result->value = 'eauth';
+                       }
+               } else {
+                       $result = Status::newGood( true );
+               }
+
+               return $result;
+       }
+
+       /**
+        * Get the user's real name
+        * @return string User's real name
+        */
+       public function getRealName() {
+               if ( !$this->isItemLoaded( 'realname' ) ) {
+                       $this->load();
+               }
+
+               return $this->mRealName;
+       }
+
+       /**
+        * Set the user's real name
+        * @param string $str New real name
+        */
+       public function setRealName( $str ) {
+               $this->load();
+               $this->mRealName = $str;
+       }
+
+       /**
+        * Get the user's current setting for a given option.
+        *
+        * @param string $oname The option to check
+        * @param string $defaultOverride A default value returned if the option does not exist
+        * @param bool $ignoreHidden Whether to ignore the effects of $wgHiddenPrefs
+        * @return string User's current value for the option
+        * @see getBoolOption()
+        * @see getIntOption()
+        */
+       public function getOption( $oname, $defaultOverride = null, $ignoreHidden = false ) {
+               global $wgHiddenPrefs;
+               $this->loadOptions();
+
+               # We want 'disabled' preferences to always behave as the default value for
+               # users, even if they have set the option explicitly in their settings (ie they
+               # set it, and then it was disabled removing their ability to change it).  But
+               # we don't want to erase the preferences in the database in case the preference
+               # is re-enabled again.  So don't touch $mOptions, just override the returned value
+               if ( !$ignoreHidden && in_array( $oname, $wgHiddenPrefs ) ) {
+                       return self::getDefaultOption( $oname );
+               }
+
+               if ( array_key_exists( $oname, $this->mOptions ) ) {
+                       return $this->mOptions[$oname];
+               } else {
+                       return $defaultOverride;
+               }
+       }
+
+       /**
+        * Get all user's options
+        *
+        * @param int $flags Bitwise combination of:
+        *   User::GETOPTIONS_EXCLUDE_DEFAULTS  Exclude user options that are set
+        *                                      to the default value. (Since 1.25)
+        * @return array
+        */
+       public function getOptions( $flags = 0 ) {
+               global $wgHiddenPrefs;
+               $this->loadOptions();
+               $options = $this->mOptions;
+
+               # We want 'disabled' preferences to always behave as the default value for
+               # users, even if they have set the option explicitly in their settings (ie they
+               # set it, and then it was disabled removing their ability to change it).  But
+               # we don't want to erase the preferences in the database in case the preference
+               # is re-enabled again.  So don't touch $mOptions, just override the returned value
+               foreach ( $wgHiddenPrefs as $pref ) {
+                       $default = self::getDefaultOption( $pref );
+                       if ( $default !== null ) {
+                               $options[$pref] = $default;
+                       }
+               }
+
+               if ( $flags & self::GETOPTIONS_EXCLUDE_DEFAULTS ) {
+                       $options = array_diff_assoc( $options, self::getDefaultOptions() );
+               }
+
+               return $options;
+       }
+
+       /**
+        * Get the user's current setting for a given option, as a boolean value.
+        *
+        * @param string $oname The option to check
+        * @return bool User's current value for the option
+        * @see getOption()
+        */
+       public function getBoolOption( $oname ) {
+               return (bool)$this->getOption( $oname );
+       }
+
+       /**
+        * Get the user's current setting for a given option, as an integer value.
+        *
+        * @param string $oname The option to check
+        * @param int $defaultOverride A default value returned if the option does not exist
+        * @return int User's current value for the option
+        * @see getOption()
+        */
+       public function getIntOption( $oname, $defaultOverride = 0 ) {
+               $val = $this->getOption( $oname );
+               if ( $val == '' ) {
+                       $val = $defaultOverride;
+               }
+               return intval( $val );
+       }
+
+       /**
+        * Set the given option for a user.
+        *
+        * You need to call saveSettings() to actually write to the database.
+        *
+        * @param string $oname The option to set
+        * @param mixed $val New value to set
+        */
+       public function setOption( $oname, $val ) {
+               $this->loadOptions();
+
+               // Explicitly NULL values should refer to defaults
+               if ( is_null( $val ) ) {
+                       $val = self::getDefaultOption( $oname );
+               }
+
+               $this->mOptions[$oname] = $val;
+       }
+
+       /**
+        * Get a token stored in the preferences (like the watchlist one),
+        * resetting it if it's empty (and saving changes).
+        *
+        * @param string $oname The option name to retrieve the token from
+        * @return string|bool User's current value for the option, or false if this option is disabled.
+        * @see resetTokenFromOption()
+        * @see getOption()
+        * @deprecated 1.26 Applications should use the OAuth extension
+        */
+       public function getTokenFromOption( $oname ) {
+               global $wgHiddenPrefs;
+
+               $id = $this->getId();
+               if ( !$id || in_array( $oname, $wgHiddenPrefs ) ) {
+                       return false;
+               }
+
+               $token = $this->getOption( $oname );
+               if ( !$token ) {
+                       // Default to a value based on the user token to avoid space
+                       // wasted on storing tokens for all users. When this option
+                       // is set manually by the user, only then is it stored.
+                       $token = hash_hmac( 'sha1', "$oname:$id", $this->getToken() );
+               }
+
+               return $token;
+       }
+
+       /**
+        * Reset a token stored in the preferences (like the watchlist one).
+        * *Does not* save user's preferences (similarly to setOption()).
+        *
+        * @param string $oname The option name to reset the token in
+        * @return string|bool New token value, or false if this option is disabled.
+        * @see getTokenFromOption()
+        * @see setOption()
+        */
+       public function resetTokenFromOption( $oname ) {
+               global $wgHiddenPrefs;
+               if ( in_array( $oname, $wgHiddenPrefs ) ) {
+                       return false;
+               }
+
+               $token = MWCryptRand::generateHex( 40 );
+               $this->setOption( $oname, $token );
+               return $token;
+       }
+
+       /**
+        * Return a list of the types of user options currently returned by
+        * User::getOptionKinds().
+        *
+        * Currently, the option kinds are:
+        * - 'registered' - preferences which are registered in core MediaWiki or
+        *                  by extensions using the UserGetDefaultOptions hook.
+        * - 'registered-multiselect' - as above, using the 'multiselect' type.
+        * - 'registered-checkmatrix' - as above, using the 'checkmatrix' type.
+        * - 'userjs' - preferences with names starting with 'userjs-', intended to
+        *              be used by user scripts.
+        * - 'special' - "preferences" that are not accessible via User::getOptions
+        *               or User::setOptions.
+        * - 'unused' - preferences about which MediaWiki doesn't know anything.
+        *              These are usually legacy options, removed in newer versions.
+        *
+        * The API (and possibly others) use this function to determine the possible
+        * option types for validation purposes, so make sure to update this when a
+        * new option kind is added.
+        *
+        * @see User::getOptionKinds
+        * @return array Option kinds
+        */
+       public static function listOptionKinds() {
+               return array(
+                       'registered',
+                       'registered-multiselect',
+                       'registered-checkmatrix',
+                       'userjs',
+                       'special',
+                       'unused'
+               );
+       }
+
+       /**
+        * Return an associative array mapping preferences keys to the kind of a preference they're
+        * used for. Different kinds are handled differently when setting or reading preferences.
+        *
+        * See User::listOptionKinds for the list of valid option types that can be provided.
+        *
+        * @see User::listOptionKinds
+        * @param IContextSource $context
+        * @param array $options Assoc. array with options keys to check as keys.
+        *   Defaults to $this->mOptions.
+        * @return array The key => kind mapping data
+        */
+       public function getOptionKinds( IContextSource $context, $options = null ) {
+               $this->loadOptions();
+               if ( $options === null ) {
+                       $options = $this->mOptions;
+               }
+
+               $prefs = Preferences::getPreferences( $this, $context );
+               $mapping = array();
+
+               // Pull out the "special" options, so they don't get converted as
+               // multiselect or checkmatrix.
+               $specialOptions = array_fill_keys( Preferences::getSaveBlacklist(), true );
+               foreach ( $specialOptions as $name => $value ) {
+                       unset( $prefs[$name] );
+               }
+
+               // Multiselect and checkmatrix options are stored in the database with
+               // one key per option, each having a boolean value. Extract those keys.
+               $multiselectOptions = array();
+               foreach ( $prefs as $name => $info ) {
+                       if ( ( isset( $info['type'] ) && $info['type'] == 'multiselect' ) ||
+                                       ( isset( $info['class'] ) && $info['class'] == 'HTMLMultiSelectField' ) ) {
+                               $opts = HTMLFormField::flattenOptions( $info['options'] );
+                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+
+                               foreach ( $opts as $value ) {
+                                       $multiselectOptions["$prefix$value"] = true;
+                               }
+
+                               unset( $prefs[$name] );
+                       }
+               }
+               $checkmatrixOptions = array();
+               foreach ( $prefs as $name => $info ) {
+                       if ( ( isset( $info['type'] ) && $info['type'] == 'checkmatrix' ) ||
+                                       ( isset( $info['class'] ) && $info['class'] == 'HTMLCheckMatrix' ) ) {
+                               $columns = HTMLFormField::flattenOptions( $info['columns'] );
+                               $rows = HTMLFormField::flattenOptions( $info['rows'] );
+                               $prefix = isset( $info['prefix'] ) ? $info['prefix'] : $name;
+
+                               foreach ( $columns as $column ) {
+                                       foreach ( $rows as $row ) {
+                                               $checkmatrixOptions["$prefix$column-$row"] = true;
+                                       }
+                               }
+
+                               unset( $prefs[$name] );
+                       }
+               }
+
+               // $value is ignored
+               foreach ( $options as $key => $value ) {
+                       if ( isset( $prefs[$key] ) ) {
+                               $mapping[$key] = 'registered';
+                       } elseif ( isset( $multiselectOptions[$key] ) ) {
+                               $mapping[$key] = 'registered-multiselect';
+                       } elseif ( isset( $checkmatrixOptions[$key] ) ) {
+                               $mapping[$key] = 'registered-checkmatrix';
+                       } elseif ( isset( $specialOptions[$key] ) ) {
+                               $mapping[$key] = 'special';
+                       } elseif ( substr( $key, 0, 7 ) === 'userjs-' ) {
+                               $mapping[$key] = 'userjs';
+                       } else {
+                               $mapping[$key] = 'unused';
+                       }
+               }
+
+               return $mapping;
+       }
+
+       /**
+        * Reset certain (or all) options to the site defaults
+        *
+        * The optional parameter determines which kinds of preferences will be reset.
+        * Supported values are everything that can be reported by getOptionKinds()
+        * and 'all', which forces a reset of *all* preferences and overrides everything else.
+        *
+        * @param array|string $resetKinds Which kinds of preferences to reset. Defaults to
+        *  array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' )
+        *  for backwards-compatibility.
+        * @param IContextSource|null $context Context source used when $resetKinds
+        *  does not contain 'all', passed to getOptionKinds().
+        *  Defaults to RequestContext::getMain() when null.
+        */
+       public function resetOptions(
+               $resetKinds = array( 'registered', 'registered-multiselect', 'registered-checkmatrix', 'unused' ),
+               IContextSource $context = null
+       ) {
+               $this->load();
+               $defaultOptions = self::getDefaultOptions();
+
+               if ( !is_array( $resetKinds ) ) {
+                       $resetKinds = array( $resetKinds );
+               }
+
+               if ( in_array( 'all', $resetKinds ) ) {
+                       $newOptions = $defaultOptions;
+               } else {
+                       if ( $context === null ) {
+                               $context = RequestContext::getMain();
+                       }
+
+                       $optionKinds = $this->getOptionKinds( $context );
+                       $resetKinds = array_intersect( $resetKinds, self::listOptionKinds() );
+                       $newOptions = array();
+
+                       // Use default values for the options that should be deleted, and
+                       // copy old values for the ones that shouldn't.
+                       foreach ( $this->mOptions as $key => $value ) {
+                               if ( in_array( $optionKinds[$key], $resetKinds ) ) {
+                                       if ( array_key_exists( $key, $defaultOptions ) ) {
+                                               $newOptions[$key] = $defaultOptions[$key];
+                                       }
+                               } else {
+                                       $newOptions[$key] = $value;
+                               }
+                       }
+               }
+
+               Hooks::run( 'UserResetAllOptions', array( $this, &$newOptions, $this->mOptions, $resetKinds ) );
+
+               $this->mOptions = $newOptions;
+               $this->mOptionsLoaded = true;
+       }
+
+       /**
+        * Get the user's preferred date format.
+        * @return string User's preferred date format
+        */
+       public function getDatePreference() {
+               // Important migration for old data rows
+               if ( is_null( $this->mDatePreference ) ) {
+                       global $wgLang;
+                       $value = $this->getOption( 'date' );
+                       $map = $wgLang->getDatePreferenceMigrationMap();
+                       if ( isset( $map[$value] ) ) {
+                               $value = $map[$value];
+                       }
+                       $this->mDatePreference = $value;
+               }
+               return $this->mDatePreference;
+       }
+
+       /**
+        * Determine based on the wiki configuration and the user's options,
+        * whether this user must be over HTTPS no matter what.
+        *
+        * @return bool
+        */
+       public function requiresHTTPS() {
+               global $wgSecureLogin;
+               if ( !$wgSecureLogin ) {
+                       return false;
+               } else {
+                       $https = $this->getBoolOption( 'prefershttps' );
+                       Hooks::run( 'UserRequiresHTTPS', array( $this, &$https ) );
+                       if ( $https ) {
+                               $https = wfCanIPUseHTTPS( $this->getRequest()->getIP() );
+                       }
+                       return $https;
+               }
+       }
+
+       /**
+        * Get the user preferred stub threshold
+        *
+        * @return int
+        */
+       public function getStubThreshold() {
+               global $wgMaxArticleSize; # Maximum article size, in Kb
+               $threshold = $this->getIntOption( 'stubthreshold' );
+               if ( $threshold > $wgMaxArticleSize * 1024 ) {
+                       // If they have set an impossible value, disable the preference
+                       // so we can use the parser cache again.
+                       $threshold = 0;
+               }
+               return $threshold;
+       }
+
+       /**
+        * Get the permissions this user has.
+        * @return array Array of String permission names
+        */
+       public function getRights() {
+               if ( is_null( $this->mRights ) ) {
+                       $this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
+                       Hooks::run( 'UserGetRights', array( $this, &$this->mRights ) );
+                       // Force reindexation of rights when a hook has unset one of them
+                       $this->mRights = array_values( array_unique( $this->mRights ) );
+               }
+               return $this->mRights;
+       }
+
+       /**
+        * Get the list of explicit group memberships this user has.
+        * The implicit * and user groups are not included.
+        * @return array Array of String internal group names
+        */
+       public function getGroups() {
+               $this->load();
+               $this->loadGroups();
+               return $this->mGroups;
+       }
+
+       /**
+        * Get the list of implicit group memberships this user has.
+        * This includes all explicit groups, plus 'user' if logged in,
+        * '*' for all accounts, and autopromoted groups
+        * @param bool $recache Whether to avoid the cache
+        * @return array Array of String internal group names
+        */
+       public function getEffectiveGroups( $recache = false ) {
+               if ( $recache || is_null( $this->mEffectiveGroups ) ) {
+                       $this->mEffectiveGroups = array_unique( array_merge(
+                               $this->getGroups(), // explicit groups
+                               $this->getAutomaticGroups( $recache ) // implicit groups
+                       ) );
+                       // Hook for additional groups
+                       Hooks::run( 'UserEffectiveGroups', array( &$this, &$this->mEffectiveGroups ) );
+                       // Force reindexation of groups when a hook has unset one of them
+                       $this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
+               }
+               return $this->mEffectiveGroups;
+       }
+
+       /**
+        * Get the list of implicit group memberships this user has.
+        * This includes 'user' if logged in, '*' for all accounts,
+        * and autopromoted groups
+        * @param bool $recache Whether to avoid the cache
+        * @return array Array of String internal group names
+        */
+       public function getAutomaticGroups( $recache = false ) {
+               if ( $recache || is_null( $this->mImplicitGroups ) ) {
+                       $this->mImplicitGroups = array( '*' );
+                       if ( $this->getId() ) {
+                               $this->mImplicitGroups[] = 'user';
+
+                               $this->mImplicitGroups = array_unique( array_merge(
+                                       $this->mImplicitGroups,
+                                       Autopromote::getAutopromoteGroups( $this )
+                               ) );
+                       }
+                       if ( $recache ) {
+                               // Assure data consistency with rights/groups,
+                               // as getEffectiveGroups() depends on this function
+                               $this->mEffectiveGroups = null;
+                       }
+               }
+               return $this->mImplicitGroups;
+       }
+
+       /**
+        * Returns the groups the user has belonged to.
+        *
+        * The user may still belong to the returned groups. Compare with getGroups().
+        *
+        * The function will not return groups the user had belonged to before MW 1.17
+        *
+        * @return array Names of the groups the user has belonged to.
+        */
+       public function getFormerGroups() {
+               $this->load();
+
+               if ( is_null( $this->mFormerGroups ) ) {
+                       $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                               ? wfGetDB( DB_MASTER )
+                               : wfGetDB( DB_SLAVE );
+                       $res = $db->select( 'user_former_groups',
+                               array( 'ufg_group' ),
+                               array( 'ufg_user' => $this->mId ),
+                               __METHOD__ );
+                       $this->mFormerGroups = array();
+                       foreach ( $res as $row ) {
+                               $this->mFormerGroups[] = $row->ufg_group;
+                       }
+               }
+
+               return $this->mFormerGroups;
+       }
+
+       /**
+        * Get the user's edit count.
+        * @return int|null Null for anonymous users
+        */
+       public function getEditCount() {
+               if ( !$this->getId() ) {
+                       return null;
+               }
+
+               if ( $this->mEditCount === null ) {
+                       /* Populate the count, if it has not been populated yet */
+                       $dbr = wfGetDB( DB_SLAVE );
+                       // check if the user_editcount field has been initialized
+                       $count = $dbr->selectField(
+                               'user', 'user_editcount',
+                               array( 'user_id' => $this->mId ),
+                               __METHOD__
+                       );
+
+                       if ( $count === null ) {
+                               // it has not been initialized. do so.
+                               $count = $this->initEditCount();
+                       }
+                       $this->mEditCount = $count;
+               }
+               return (int)$this->mEditCount;
+       }
+
+       /**
+        * Add the user to the given group.
+        * This takes immediate effect.
+        * @param string $group Name of the group to add
+        * @return bool
+        */
+       public function addGroup( $group ) {
+               $this->load();
+
+               if ( !Hooks::run( 'UserAddGroup', array( $this, &$group ) ) ) {
+                       return false;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               if ( $this->getId() ) {
+                       $dbw->insert( 'user_groups',
+                               array(
+                                       'ug_user' => $this->getID(),
+                                       'ug_group' => $group,
+                               ),
+                               __METHOD__,
+                               array( 'IGNORE' ) );
+               }
+
+               $this->loadGroups();
+               $this->mGroups[] = $group;
+               // In case loadGroups was not called before, we now have the right twice.
+               // Get rid of the duplicate.
+               $this->mGroups = array_unique( $this->mGroups );
+
+               // Refresh the groups caches, and clear the rights cache so it will be
+               // refreshed on the next call to $this->getRights().
+               $this->getEffectiveGroups( true );
+               $this->mRights = null;
+
+               $this->invalidateCache();
+
+               return true;
+       }
+
+       /**
+        * Remove the user from the given group.
+        * This takes immediate effect.
+        * @param string $group Name of the group to remove
+        * @return bool
+        */
+       public function removeGroup( $group ) {
+               $this->load();
+               if ( !Hooks::run( 'UserRemoveGroup', array( $this, &$group ) ) ) {
+                       return false;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'user_groups',
+                       array(
+                               'ug_user' => $this->getID(),
+                               'ug_group' => $group,
+                       ), __METHOD__
+               );
+               // Remember that the user was in this group
+               $dbw->insert( 'user_former_groups',
+                       array(
+                               'ufg_user' => $this->getID(),
+                               'ufg_group' => $group,
+                       ),
+                       __METHOD__,
+                       array( 'IGNORE' )
+               );
+
+               $this->loadGroups();
+               $this->mGroups = array_diff( $this->mGroups, array( $group ) );
+
+               // Refresh the groups caches, and clear the rights cache so it will be
+               // refreshed on the next call to $this->getRights().
+               $this->getEffectiveGroups( true );
+               $this->mRights = null;
+
+               $this->invalidateCache();
+
+               return true;
+       }
+
+       /**
+        * Get whether the user is logged in
+        * @return bool
+        */
+       public function isLoggedIn() {
+               return $this->getID() != 0;
+       }
+
+       /**
+        * Get whether the user is anonymous
+        * @return bool
+        */
+       public function isAnon() {
+               return !$this->isLoggedIn();
+       }
+
+       /**
+        * Check if user is allowed to access a feature / make an action
+        *
+        * @param string ... Permissions to test
+        * @return bool True if user is allowed to perform *any* of the given actions
+        */
+       public function isAllowedAny() {
+               $permissions = func_get_args();
+               foreach ( $permissions as $permission ) {
+                       if ( $this->isAllowed( $permission ) ) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        *
+        * @param string ... Permissions to test
+        * @return bool True if the user is allowed to perform *all* of the given actions
+        */
+       public function isAllowedAll() {
+               $permissions = func_get_args();
+               foreach ( $permissions as $permission ) {
+                       if ( !$this->isAllowed( $permission ) ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * Internal mechanics of testing a permission
+        * @param string $action
+        * @return bool
+        */
+       public function isAllowed( $action = '' ) {
+               if ( $action === '' ) {
+                       return true; // In the spirit of DWIM
+               }
+               // Patrolling may not be enabled
+               if ( $action === 'patrol' || $action === 'autopatrol' ) {
+                       global $wgUseRCPatrol, $wgUseNPPatrol;
+                       if ( !$wgUseRCPatrol && !$wgUseNPPatrol ) {
+                               return false;
+                       }
+               }
+               // Use strict parameter to avoid matching numeric 0 accidentally inserted
+               // by misconfiguration: 0 == 'foo'
+               return in_array( $action, $this->getRights(), true );
+       }
+
+       /**
+        * Check whether to enable recent changes patrol features for this user
+        * @return bool True or false
+        */
+       public function useRCPatrol() {
+               global $wgUseRCPatrol;
+               return $wgUseRCPatrol && $this->isAllowedAny( 'patrol', 'patrolmarks' );
+       }
+
+       /**
+        * Check whether to enable new pages patrol features for this user
+        * @return bool True or false
+        */
+       public function useNPPatrol() {
+               global $wgUseRCPatrol, $wgUseNPPatrol;
+               return (
+                       ( $wgUseRCPatrol || $wgUseNPPatrol )
+                               && ( $this->isAllowedAny( 'patrol', 'patrolmarks' ) )
+               );
+       }
+
+       /**
+        * Get the WebRequest object to use with this object
+        *
+        * @return WebRequest
+        */
+       public function getRequest() {
+               if ( $this->mRequest ) {
+                       return $this->mRequest;
+               } else {
+                       global $wgRequest;
+                       return $wgRequest;
+               }
+       }
+
+       /**
+        * Get the current skin, loading it if required
+        * @return Skin The current skin
+        * @todo FIXME: Need to check the old failback system [AV]
+        * @deprecated since 1.18 Use ->getSkin() in the most relevant outputting context you have
+        */
+       public function getSkin() {
+               wfDeprecated( __METHOD__, '1.18' );
+               return RequestContext::getMain()->getSkin();
+       }
+
+       /**
+        * Get a WatchedItem for this user and $title.
+        *
+        * @since 1.22 $checkRights parameter added
+        * @param Title $title
+        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+        * @return WatchedItem
+        */
+       public function getWatchedItem( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               $key = $checkRights . ':' . $title->getNamespace() . ':' . $title->getDBkey();
+
+               if ( isset( $this->mWatchedItems[$key] ) ) {
+                       return $this->mWatchedItems[$key];
+               }
+
+               if ( count( $this->mWatchedItems ) >= self::MAX_WATCHED_ITEMS_CACHE ) {
+                       $this->mWatchedItems = array();
+               }
+
+               $this->mWatchedItems[$key] = WatchedItem::fromUserTitle( $this, $title, $checkRights );
+               return $this->mWatchedItems[$key];
+       }
+
+       /**
+        * Check the watched status of an article.
+        * @since 1.22 $checkRights parameter added
+        * @param Title $title Title of the article to look at
+        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+        * @return bool
+        */
+       public function isWatched( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               return $this->getWatchedItem( $title, $checkRights )->isWatched();
+       }
+
+       /**
+        * Watch an article.
+        * @since 1.22 $checkRights parameter added
+        * @param Title $title Title of the article to look at
+        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+        */
+       public function addWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               $this->getWatchedItem( $title, $checkRights )->addWatch();
+               $this->invalidateCache();
+       }
+
+       /**
+        * Stop watching an article.
+        * @since 1.22 $checkRights parameter added
+        * @param Title $title Title of the article to look at
+        * @param int $checkRights Whether to check 'viewmywatchlist'/'editmywatchlist' rights.
+        *     Pass WatchedItem::CHECK_USER_RIGHTS or WatchedItem::IGNORE_USER_RIGHTS.
+        */
+       public function removeWatch( $title, $checkRights = WatchedItem::CHECK_USER_RIGHTS ) {
+               $this->getWatchedItem( $title, $checkRights )->removeWatch();
+               $this->invalidateCache();
+       }
+
+       /**
+        * Clear the user's notification timestamp for the given title.
+        * If e-notif e-mails are on, they will receive notification mails on
+        * the next change of the page if it's watched etc.
+        * @note If the user doesn't have 'editmywatchlist', this will do nothing.
+        * @param Title $title Title of the article to look at
+        * @param int $oldid The revision id being viewed. If not given or 0, latest revision is assumed.
+        */
+       public function clearNotification( &$title, $oldid = 0 ) {
+               global $wgUseEnotif, $wgShowUpdatedMarker;
+
+               // Do nothing if the database is locked to writes
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               // Do nothing if not allowed to edit the watchlist
+               if ( !$this->isAllowed( 'editmywatchlist' ) ) {
+                       return;
+               }
+
+               // If we're working on user's talk page, we should update the talk page message indicator
+               if ( $title->getNamespace() == NS_USER_TALK && $title->getText() == $this->getName() ) {
+                       if ( !Hooks::run( 'UserClearNewTalkNotification', array( &$this, $oldid ) ) ) {
+                               return;
+                       }
+
+                       $that = $this;
+                       // Try to update the DB post-send and only if needed...
+                       DeferredUpdates::addCallableUpdate( function() use ( $that, $title, $oldid ) {
+                               if ( !$that->getNewtalk() ) {
+                                       return; // no notifications to clear
+                               }
+
+                               // Delete the last notifications (they stack up)
+                               $that->setNewtalk( false );
+
+                               // If there is a new, unseen, revision, use its timestamp
+                               $nextid = $oldid
+                                       ? $title->getNextRevisionID( $oldid, Title::GAID_FOR_UPDATE )
+                                       : null;
+                               if ( $nextid ) {
+                                       $that->setNewtalk( true, Revision::newFromId( $nextid ) );
+                               }
+                       } );
+               }
+
+               if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
+                       return;
+               }
+
+               if ( $this->isAnon() ) {
+                       // Nothing else to do...
+                       return;
+               }
+
+               // Only update the timestamp if the page is being watched.
+               // The query to find out if it is watched is cached both in memcached and per-invocation,
+               // and when it does have to be executed, it can be on a slave
+               // If this is the user's newtalk page, we always update the timestamp
+               $force = '';
+               if ( $title->getNamespace() == NS_USER_TALK && $title->getText() == $this->getName() ) {
+                       $force = 'force';
+               }
+
+               $this->getWatchedItem( $title )->resetNotificationTimestamp(
+                       $force, $oldid, WatchedItem::DEFERRED
+               );
+       }
+
+       /**
+        * Resets all of the given user's page-change notification timestamps.
+        * If e-notif e-mails are on, they will receive notification mails on
+        * the next change of any watched page.
+        * @note If the user doesn't have 'editmywatchlist', this will do nothing.
+        */
+       public function clearAllNotifications() {
+               if ( wfReadOnly() ) {
+                       return;
+               }
+
+               // Do nothing if not allowed to edit the watchlist
+               if ( !$this->isAllowed( 'editmywatchlist' ) ) {
+                       return;
+               }
+
+               global $wgUseEnotif, $wgShowUpdatedMarker;
+               if ( !$wgUseEnotif && !$wgShowUpdatedMarker ) {
+                       $this->setNewtalk( false );
+                       return;
+               }
+               $id = $this->getId();
+               if ( $id != 0 ) {
+                       $dbw = wfGetDB( DB_MASTER );
+                       $dbw->update( 'watchlist',
+                               array( /* SET */ 'wl_notificationtimestamp' => null ),
+                               array( /* WHERE */ 'wl_user' => $id, 'wl_notificationtimestamp IS NOT NULL' ),
+                               __METHOD__
+                       );
+                       // We also need to clear here the "you have new message" notification for the own user_talk page;
+                       // it's cleared one page view later in WikiPage::doViewUpdates().
+               }
+       }
+
+       /**
+        * Set a cookie on the user's client. Wrapper for
+        * WebResponse::setCookie
+        * @param string $name Name of the cookie to set
+        * @param string $value Value to set
+        * @param int $exp Expiration time, as a UNIX time value;
+        *                   if 0 or not specified, use the default $wgCookieExpiration
+        * @param bool $secure
+        *  true: Force setting the secure attribute when setting the cookie
+        *  false: Force NOT setting the secure attribute when setting the cookie
+        *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
+        * @param array $params Array of options sent passed to WebResponse::setcookie()
+        * @param WebRequest|null $request WebRequest object to use; $wgRequest will be used if null
+        *        is passed.
+        */
+       protected function setCookie(
+               $name, $value, $exp = 0, $secure = null, $params = array(), $request = null
+       ) {
+               if ( $request === null ) {
+                       $request = $this->getRequest();
+               }
+               $params['secure'] = $secure;
+               $request->response()->setCookie( $name, $value, $exp, $params );
+       }
+
+       /**
+        * Clear a cookie on the user's client
+        * @param string $name Name of the cookie to clear
+        * @param bool $secure
+        *  true: Force setting the secure attribute when setting the cookie
+        *  false: Force NOT setting the secure attribute when setting the cookie
+        *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
+        * @param array $params Array of options sent passed to WebResponse::setcookie()
+        */
+       protected function clearCookie( $name, $secure = null, $params = array() ) {
+               $this->setCookie( $name, '', time() - 86400, $secure, $params );
+       }
+
+       /**
+        * Set an extended login cookie on the user's client. The expiry of the cookie
+        * is controlled by the $wgExtendedLoginCookieExpiration configuration
+        * variable.
+        *
+        * @see User::setCookie
+        *
+        * @param string $name Name of the cookie to set
+        * @param string $value Value to set
+        * @param bool $secure
+        *  true: Force setting the secure attribute when setting the cookie
+        *  false: Force NOT setting the secure attribute when setting the cookie
+        *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
+        */
+       protected function setExtendedLoginCookie( $name, $value, $secure ) {
+               global $wgExtendedLoginCookieExpiration, $wgCookieExpiration;
+
+               $exp = time();
+               $exp += $wgExtendedLoginCookieExpiration !== null
+                       ? $wgExtendedLoginCookieExpiration
+                       : $wgCookieExpiration;
+
+               $this->setCookie( $name, $value, $exp, $secure );
+       }
+
+       /**
+        * Set the default cookies for this session on the user's client.
+        *
+        * @param WebRequest|null $request WebRequest object to use; $wgRequest will be used if null
+        *        is passed.
+        * @param bool $secure Whether to force secure/insecure cookies or use default
+        * @param bool $rememberMe Whether to add a Token cookie for elongated sessions
+        */
+       public function setCookies( $request = null, $secure = null, $rememberMe = false ) {
+               global $wgExtendedLoginCookies;
+
+               if ( $request === null ) {
+                       $request = $this->getRequest();
+               }
+
+               $this->load();
+               if ( 0 == $this->mId ) {
+                       return;
+               }
+               if ( !$this->mToken ) {
+                       // When token is empty or NULL generate a new one and then save it to the database
+                       // This allows a wiki to re-secure itself after a leak of it's user table or $wgSecretKey
+                       // Simply by setting every cell in the user_token column to NULL and letting them be
+                       // regenerated as users log back into the wiki.
+                       $this->setToken();
+                       if ( !wfReadOnly() ) {
+                               $this->saveSettings();
+                       }
+               }
+               $session = array(
+                       'wsUserID' => $this->mId,
+                       'wsToken' => $this->mToken,
+                       'wsUserName' => $this->getName()
+               );
+               $cookies = array(
+                       'UserID' => $this->mId,
+                       'UserName' => $this->getName(),
+               );
+               if ( $rememberMe ) {
+                       $cookies['Token'] = $this->mToken;
+               } else {
+                       $cookies['Token'] = false;
+               }
+
+               Hooks::run( 'UserSetCookies', array( $this, &$session, &$cookies ) );
+
+               foreach ( $session as $name => $value ) {
+                       $request->setSessionData( $name, $value );
+               }
+               foreach ( $cookies as $name => $value ) {
+                       if ( $value === false ) {
+                               $this->clearCookie( $name );
+                       } elseif ( $rememberMe && in_array( $name, $wgExtendedLoginCookies ) ) {
+                               $this->setExtendedLoginCookie( $name, $value, $secure );
+                       } else {
+                               $this->setCookie( $name, $value, 0, $secure, array(), $request );
+                       }
+               }
+
+               /**
+                * If wpStickHTTPS was selected, also set an insecure cookie that
+                * will cause the site to redirect the user to HTTPS, if they access
+                * it over HTTP. Bug 29898. Use an un-prefixed cookie, so it's the same
+                * as the one set by centralauth (bug 53538). Also set it to session, or
+                * standard time setting, based on if rememberme was set.
+                */
+               if ( $request->getCheck( 'wpStickHTTPS' ) || $this->requiresHTTPS() ) {
+                       $this->setCookie(
+                               'forceHTTPS',
+                               'true',
+                               $rememberMe ? 0 : null,
+                               false,
+                               array( 'prefix' => '' ) // no prefix
+                       );
+               }
+       }
+
+       /**
+        * Log this user out.
+        */
+       public function logout() {
+               if ( Hooks::run( 'UserLogout', array( &$this ) ) ) {
+                       $this->doLogout();
+               }
+       }
+
+       /**
+        * Clear the user's cookies and session, and reset the instance cache.
+        * @see logout()
+        */
+       public function doLogout() {
+               $this->clearInstanceCache( 'defaults' );
+
+               $this->getRequest()->setSessionData( 'wsUserID', 0 );
+
+               $this->clearCookie( 'UserID' );
+               $this->clearCookie( 'Token' );
+               $this->clearCookie( 'forceHTTPS', false, array( 'prefix' => '' ) );
+
+               // Remember when user logged out, to prevent seeing cached pages
+               $this->setCookie( 'LoggedOut', time(), time() + 86400 );
+       }
+
+       /**
+        * Save this user's settings into the database.
+        * @todo Only rarely do all these fields need to be set!
+        */
+       public function saveSettings() {
+               if ( wfReadOnly() ) {
+                       // @TODO: caller should deal with this instead!
+                       // This should really just be an exception.
+                       MWExceptionHandler::logException( new DBExpectedError(
+                               null,
+                               "Could not update user with ID '{$this->mId}'; DB is read-only."
+                       ) );
+                       return;
+               }
+
+               $this->load();
+               if ( 0 == $this->mId ) {
+                       return; // anon
+               }
+
+               // Get a new user_touched that is higher than the old one.
+               // This will be used for a CAS check as a last-resort safety
+               // check against race conditions and slave lag.
+               $oldTouched = $this->mTouched;
+               $newTouched = $this->newTouchedTimestamp();
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update( 'user',
+                       array( /* SET */
+                               'user_name' => $this->mName,
+                               'user_real_name' => $this->mRealName,
+                               'user_email' => $this->mEmail,
+                               'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
+                               'user_touched' => $dbw->timestamp( $newTouched ),
+                               'user_token' => strval( $this->mToken ),
+                               'user_email_token' => $this->mEmailToken,
+                               'user_email_token_expires' => $dbw->timestampOrNull( $this->mEmailTokenExpires ),
+                       ), array( /* WHERE */
+                               'user_id' => $this->mId,
+                               'user_touched' => $dbw->timestamp( $oldTouched ) // CAS check
+                       ), __METHOD__
+               );
+
+               if ( !$dbw->affectedRows() ) {
+                       // Maybe the problem was a missed cache update; clear it to be safe
+                       $this->clearSharedCache( 'refresh' );
+                       // User was changed in the meantime or loaded with stale data
+                       $from = ( $this->queryFlagsUsed & self::READ_LATEST ) ? 'master' : 'slave';
+                       throw new MWException(
+                               "CAS update failed on user_touched for user ID '{$this->mId}' (read from $from);" .
+                               " the version of the user to be saved is older than the current version."
+                       );
+               }
+
+               $this->mTouched = $newTouched;
+               $this->saveOptions();
+
+               Hooks::run( 'UserSaveSettings', array( $this ) );
+               $this->clearSharedCache();
+               $this->getUserPage()->invalidateCache();
+       }
+
+       /**
+        * If only this user's username is known, and it exists, return the user ID.
+        *
+        * @param int $flags Bitfield of User:READ_* constants; useful for existence checks
+        * @return int
+        */
+       public function idForName( $flags = 0 ) {
+               $s = trim( $this->getName() );
+               if ( $s === '' ) {
+                       return 0;
+               }
+
+               $db = ( ( $flags & self::READ_LATEST ) == self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               $options = ( ( $flags & self::READ_LOCKING ) == self::READ_LOCKING )
+                       ? array( 'LOCK IN SHARE MODE' )
+                       : array();
+
+               $id = $db->selectField( 'user',
+                       'user_id', array( 'user_name' => $s ), __METHOD__, $options );
+
+               return (int)$id;
+       }
+
+       /**
+        * Add a user to the database, return the user object
+        *
+        * @param string $name Username to add
+        * @param array $params Array of Strings Non-default parameters to save to
+        *   the database as user_* fields:
+        *   - email: The user's email address.
+        *   - email_authenticated: The email authentication timestamp.
+        *   - real_name: The user's real name.
+        *   - options: An associative array of non-default options.
+        *   - token: Random authentication token. Do not set.
+        *   - registration: Registration timestamp. Do not set.
+        *
+        * @return User|null User object, or null if the username already exists.
+        */
+       public static function createNew( $name, $params = array() ) {
+               foreach ( array( 'password', 'newpassword', 'newpass_time', 'password_expires' ) as $field ) {
+                       if ( isset( $params[$field] ) ) {
+                               wfDeprecated( __METHOD__ . " with param '$field'", '1.27' );
+                               unset( $params[$field] );
+                       }
+               }
+
+               $user = new User;
+               $user->load();
+               $user->setToken(); // init token
+               if ( isset( $params['options'] ) ) {
+                       $user->mOptions = $params['options'] + (array)$user->mOptions;
+                       unset( $params['options'] );
+               }
+               $dbw = wfGetDB( DB_MASTER );
+               $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
+
+               $noPass = PasswordFactory::newInvalidPassword()->toString();
+
+               $fields = array(
+                       'user_id' => $seqVal,
+                       'user_name' => $name,
+                       'user_password' => $noPass,
+                       'user_newpassword' => $noPass,
+                       'user_email' => $user->mEmail,
+                       'user_email_authenticated' => $dbw->timestampOrNull( $user->mEmailAuthenticated ),
+                       'user_real_name' => $user->mRealName,
+                       'user_token' => strval( $user->mToken ),
+                       'user_registration' => $dbw->timestamp( $user->mRegistration ),
+                       'user_editcount' => 0,
+                       'user_touched' => $dbw->timestamp( $user->newTouchedTimestamp() ),
+               );
+               foreach ( $params as $name => $value ) {
+                       $fields["user_$name"] = $value;
+               }
+               $dbw->insert( 'user', $fields, __METHOD__, array( 'IGNORE' ) );
+               if ( $dbw->affectedRows() ) {
+                       $newUser = User::newFromId( $dbw->insertId() );
+               } else {
+                       $newUser = null;
+               }
+               return $newUser;
+       }
+
+       /**
+        * Add this existing user object to the database. If the user already
+        * exists, a fatal status object is returned, and the user object is
+        * initialised with the data from the database.
+        *
+        * Previously, this function generated a DB error due to a key conflict
+        * if the user already existed. Many extension callers use this function
+        * in code along the lines of:
+        *
+        *   $user = User::newFromName( $name );
+        *   if ( !$user->isLoggedIn() ) {
+        *       $user->addToDatabase();
+        *   }
+        *   // do something with $user...
+        *
+        * However, this was vulnerable to a race condition (bug 16020). By
+        * initialising the user object if the user exists, we aim to support this
+        * calling sequence as far as possible.
+        *
+        * Note that if the user exists, this function will acquire a write lock,
+        * so it is still advisable to make the call conditional on isLoggedIn(),
+        * and to commit the transaction after calling.
+        *
+        * @throws MWException
+        * @return Status
+        */
+       public function addToDatabase() {
+               $this->load();
+               if ( !$this->mToken ) {
+                       $this->setToken(); // init token
+               }
+
+               $this->mTouched = $this->newTouchedTimestamp();
+
+               $noPass = PasswordFactory::newInvalidPassword()->toString();
+
+               $dbw = wfGetDB( DB_MASTER );
+               $inWrite = $dbw->writesOrCallbacksPending();
+               $seqVal = $dbw->nextSequenceValue( 'user_user_id_seq' );
+               $dbw->insert( 'user',
+                       array(
+                               'user_id' => $seqVal,
+                               'user_name' => $this->mName,
+                               'user_password' => $noPass,
+                               'user_newpassword' => $noPass,
+                               'user_email' => $this->mEmail,
+                               'user_email_authenticated' => $dbw->timestampOrNull( $this->mEmailAuthenticated ),
+                               'user_real_name' => $this->mRealName,
+                               'user_token' => strval( $this->mToken ),
+                               'user_registration' => $dbw->timestamp( $this->mRegistration ),
+                               'user_editcount' => 0,
+                               'user_touched' => $dbw->timestamp( $this->mTouched ),
+                       ), __METHOD__,
+                       array( 'IGNORE' )
+               );
+               if ( !$dbw->affectedRows() ) {
+                       // The queries below cannot happen in the same REPEATABLE-READ snapshot.
+                       // Handle this by COMMIT, if possible, or by LOCK IN SHARE MODE otherwise.
+                       if ( $inWrite ) {
+                               // Can't commit due to pending writes that may need atomicity.
+                               // This may cause some lock contention unlike the case below.
+                               $options = array( 'LOCK IN SHARE MODE' );
+                               $flags = self::READ_LOCKING;
+                       } else {
+                               // Often, this case happens early in views before any writes when
+                               // using CentralAuth. It's should be OK to commit and break the snapshot.
+                               $dbw->commit( __METHOD__, 'flush' );
+                               $options = array();
+                               $flags = self::READ_LATEST;
+                       }
+                       $this->mId = $dbw->selectField( 'user', 'user_id',
+                               array( 'user_name' => $this->mName ), __METHOD__, $options );
+                       $loaded = false;
+                       if ( $this->mId ) {
+                               if ( $this->loadFromDatabase( $flags ) ) {
+                                       $loaded = true;
+                               }
+                       }
+                       if ( !$loaded ) {
+                               throw new MWException( __METHOD__ . ": hit a key conflict attempting " .
+                                       "to insert user '{$this->mName}' row, but it was not present in select!" );
+                       }
+                       return Status::newFatal( 'userexists' );
+               }
+               $this->mId = $dbw->insertId();
+               self::$idCacheByName[$this->mName] = $this->mId;
+
+               // Clear instance cache other than user table data, which is already accurate
+               $this->clearInstanceCache();
+
+               $this->saveOptions();
+               return Status::newGood();
+       }
+
+       /**
+        * If this user is logged-in and blocked,
+        * block any IP address they've successfully logged in from.
+        * @return bool A block was spread
+        */
+       public function spreadAnyEditBlock() {
+               if ( $this->isLoggedIn() && $this->isBlocked() ) {
+                       return $this->spreadBlock();
+               }
+               return false;
+       }
+
+       /**
+        * If this (non-anonymous) user is blocked,
+        * block the IP address they've successfully logged in from.
+        * @return bool A block was spread
+        */
+       protected function spreadBlock() {
+               wfDebug( __METHOD__ . "()\n" );
+               $this->load();
+               if ( $this->mId == 0 ) {
+                       return false;
+               }
+
+               $userblock = Block::newFromTarget( $this->getName() );
+               if ( !$userblock ) {
+                       return false;
+               }
+
+               return (bool)$userblock->doAutoblock( $this->getRequest()->getIP() );
+       }
+
+       /**
+        * Get whether the user is explicitly blocked from account creation.
+        * @return bool|Block
+        */
+       public function isBlockedFromCreateAccount() {
+               $this->getBlockedStatus();
+               if ( $this->mBlock && $this->mBlock->prevents( 'createaccount' ) ) {
+                       return $this->mBlock;
+               }
+
+               # bug 13611: if the IP address the user is trying to create an account from is
+               # blocked with createaccount disabled, prevent new account creation there even
+               # when the user is logged in
+               if ( $this->mBlockedFromCreateAccount === false && !$this->isAllowed( 'ipblock-exempt' ) ) {
+                       $this->mBlockedFromCreateAccount = Block::newFromTarget( null, $this->getRequest()->getIP() );
+               }
+               return $this->mBlockedFromCreateAccount instanceof Block
+                       && $this->mBlockedFromCreateAccount->prevents( 'createaccount' )
+                       ? $this->mBlockedFromCreateAccount
+                       : false;
+       }
+
+       /**
+        * Get whether the user is blocked from using Special:Emailuser.
+        * @return bool
+        */
+       public function isBlockedFromEmailuser() {
+               $this->getBlockedStatus();
+               return $this->mBlock && $this->mBlock->prevents( 'sendemail' );
+       }
+
+       /**
+        * Get whether the user is allowed to create an account.
+        * @return bool
+        */
+       public function isAllowedToCreateAccount() {
+               return $this->isAllowed( 'createaccount' ) && !$this->isBlockedFromCreateAccount();
+       }
+
+       /**
+        * Get this user's personal page title.
+        *
+        * @return Title User's personal page title
+        */
+       public function getUserPage() {
+               return Title::makeTitle( NS_USER, $this->getName() );
+       }
+
+       /**
+        * Get this user's talk page title.
+        *
+        * @return Title User's talk page title
+        */
+       public function getTalkPage() {
+               $title = $this->getUserPage();
+               return $title->getTalkPage();
+       }
+
+       /**
+        * Determine whether the user is a newbie. Newbies are either
+        * anonymous IPs, or the most recently created accounts.
+        * @return bool
+        */
+       public function isNewbie() {
+               return !$this->isAllowed( 'autoconfirmed' );
+       }
+
+       /**
+        * Check to see if the given clear-text password is one of the accepted passwords
+        * @deprecated since 1.27. AuthManager is coming.
+        * @param string $password User password
+        * @return bool True if the given password is correct, otherwise False
+        */
+       public function checkPassword( $password ) {
+               global $wgAuth, $wgLegacyEncoding;
+
+               $this->load();
+
+               // Some passwords will give a fatal Status, which means there is
+               // some sort of technical or security reason for this password to
+               // be completely invalid and should never be checked (e.g., T64685)
+               if ( !$this->checkPasswordValidity( $password )->isOK() ) {
+                       return false;
+               }
+
+               // Certain authentication plugins do NOT want to save
+               // domain passwords in a mysql database, so we should
+               // check this (in case $wgAuth->strict() is false).
+               if ( $wgAuth->authenticate( $this->getName(), $password ) ) {
+                       return true;
+               } elseif ( $wgAuth->strict() ) {
+                       // Auth plugin doesn't allow local authentication
+                       return false;
+               } elseif ( $wgAuth->strictUserAuth( $this->getName() ) ) {
+                       // Auth plugin doesn't allow local authentication for this user name
+                       return false;
+               }
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               try {
+                       $mPassword = $passwordFactory->newFromCiphertext( $db->selectField(
+                               'user', 'user_password', array( 'user_id' => $this->getId() ), __METHOD__
+                       ) );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $mPassword = PasswordFactory::newInvalidPassword();
+               }
+
+               if ( !$mPassword->equals( $password ) ) {
+                       if ( $wgLegacyEncoding ) {
+                               // Some wikis were converted from ISO 8859-1 to UTF-8, the passwords can't be converted
+                               // Check for this with iconv
+                               $cp1252Password = iconv( 'UTF-8', 'WINDOWS-1252//TRANSLIT', $password );
+                               if ( $cp1252Password === $password || !$mPassword->equals( $cp1252Password ) ) {
+                                       return false;
+                               }
+                       } else {
+                               return false;
+                       }
+               }
+
+               if ( $passwordFactory->needsUpdate( $mPassword ) && !wfReadOnly() ) {
+                       $this->setPasswordInternal( $password );
+               }
+
+               return true;
+       }
+
+       /**
+        * Check if the given clear-text password matches the temporary password
+        * sent by e-mail for password reset operations.
+        *
+        * @deprecated since 1.27. AuthManager is coming.
+        * @param string $plaintext
+        * @return bool True if matches, false otherwise
+        */
+       public function checkTemporaryPassword( $plaintext ) {
+               global $wgNewPasswordExpiry;
+
+               $this->load();
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $db = ( $this->queryFlagsUsed & self::READ_LATEST )
+                       ? wfGetDB( DB_MASTER )
+                       : wfGetDB( DB_SLAVE );
+
+               $row = $db->selectRow(
+                       'user',
+                       array( 'user_newpassword', 'user_newpass_time' ),
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+               try {
+                       $newPassword = $passwordFactory->newFromCiphertext( $row->user_newpassword );
+               } catch ( PasswordError $e ) {
+                       wfDebug( 'Invalid password hash found in database.' );
+                       $newPassword = PasswordFactory::newInvalidPassword();
+               }
+
+               if ( $newPassword->equals( $plaintext ) ) {
+                       if ( is_null( $row->user_newpass_time ) ) {
+                               return true;
+                       }
+                       $expiry = wfTimestamp( TS_UNIX, $row->user_newpass_time ) + $wgNewPasswordExpiry;
+                       return ( time() < $expiry );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Alias for getEditToken.
+        * @deprecated since 1.19, use getEditToken instead.
+        *
+        * @param string|array $salt Array of Strings Optional function-specific data for hashing
+        * @param WebRequest|null $request WebRequest object to use or null to use $wgRequest
+        * @return string The new edit token
+        */
+       public function editToken( $salt = '', $request = null ) {
+               wfDeprecated( __METHOD__, '1.19' );
+               return $this->getEditToken( $salt, $request );
+       }
+
+       /**
+        * Internal implementation for self::getEditToken() and
+        * self::matchEditToken().
+        *
+        * @param string|array $salt
+        * @param WebRequest $request
+        * @param string|int $timestamp
+        * @return string
+        */
+       private function getEditTokenAtTimestamp( $salt, $request, $timestamp ) {
+               if ( $this->isAnon() ) {
+                       return self::EDIT_TOKEN_SUFFIX;
+               } else {
+                       $token = $request->getSessionData( 'wsEditToken' );
+                       if ( $token === null ) {
+                               $token = MWCryptRand::generateHex( 32 );
+                               $request->setSessionData( 'wsEditToken', $token );
+                       }
+                       if ( is_array( $salt ) ) {
+                               $salt = implode( '|', $salt );
+                       }
+                       return hash_hmac( 'md5', $timestamp . $salt, $token, false ) .
+                               dechex( $timestamp ) .
+                               self::EDIT_TOKEN_SUFFIX;
+               }
+       }
+
+       /**
+        * Initialize (if necessary) and return a session token value
+        * which can be used in edit forms to show that the user's
+        * login credentials aren't being hijacked with a foreign form
+        * submission.
+        *
+        * @since 1.19
+        *
+        * @param string|array $salt Array of Strings Optional function-specific data for hashing
+        * @param WebRequest|null $request WebRequest object to use or null to use $wgRequest
+        * @return string The new edit token
+        */
+       public function getEditToken( $salt = '', $request = null ) {
+               return $this->getEditTokenAtTimestamp(
+                       $salt, $request ?: $this->getRequest(), wfTimestamp()
+               );
+       }
+
+       /**
+        * Generate a looking random token for various uses.
+        *
+        * @return string The new random token
+        * @deprecated since 1.20: Use MWCryptRand for secure purposes or
+        *   wfRandomString for pseudo-randomness.
+        */
+       public static function generateToken() {
+               return MWCryptRand::generateHex( 32 );
+       }
+
+       /**
+        * Get the embedded timestamp from a token.
+        * @param string $val Input token
+        * @return int|null
+        */
+       public static function getEditTokenTimestamp( $val ) {
+               $suffixLen = strlen( self::EDIT_TOKEN_SUFFIX );
+               if ( strlen( $val ) <= 32 + $suffixLen ) {
+                       return null;
+               }
+
+               return hexdec( substr( $val, 32, -$suffixLen ) );
+       }
+
+       /**
+        * Check given value against the token value stored in the session.
+        * A match should confirm that the form was submitted from the
+        * user's own login session, not a form submission from a third-party
+        * site.
+        *
+        * @param string $val Input value to compare
+        * @param string $salt Optional function-specific data for hashing
+        * @param WebRequest|null $request Object to use or null to use $wgRequest
+        * @param int $maxage Fail tokens older than this, in seconds
+        * @return bool Whether the token matches
+        */
+       public function matchEditToken( $val, $salt = '', $request = null, $maxage = null ) {
+               if ( $this->isAnon() ) {
+                       return $val === self::EDIT_TOKEN_SUFFIX;
+               }
+
+               $timestamp = self::getEditTokenTimestamp( $val );
+               if ( $timestamp === null ) {
+                       return false;
+               }
+               if ( $maxage !== null && $timestamp < wfTimestamp() - $maxage ) {
+                       // Expired token
+                       return false;
+               }
+
+               $sessionToken = $this->getEditTokenAtTimestamp(
+                       $salt, $request ?: $this->getRequest(), $timestamp
+               );
+
+               if ( $val != $sessionToken ) {
+                       wfDebug( "User::matchEditToken: broken session data\n" );
+               }
+
+               return hash_equals( $sessionToken, $val );
+       }
+
+       /**
+        * Check given value against the token value stored in the session,
+        * ignoring the suffix.
+        *
+        * @param string $val Input value to compare
+        * @param string $salt Optional function-specific data for hashing
+        * @param WebRequest|null $request Object to use or null to use $wgRequest
+        * @param int $maxage Fail tokens older than this, in seconds
+        * @return bool Whether the token matches
+        */
+       public function matchEditTokenNoSuffix( $val, $salt = '', $request = null, $maxage = null ) {
+               $val = substr( $val, 0, strspn( $val, '0123456789abcdef' ) ) . self::EDIT_TOKEN_SUFFIX;
+               return $this->matchEditToken( $val, $salt, $request, $maxage );
+       }
+
+       /**
+        * Generate a new e-mail confirmation token and send a confirmation/invalidation
+        * mail to the user's given address.
+        *
+        * @param string $type Message to send, either "created", "changed" or "set"
+        * @return Status
+        */
+       public function sendConfirmationMail( $type = 'created' ) {
+               global $wgLang;
+               $expiration = null; // gets passed-by-ref and defined in next line.
+               $token = $this->confirmationToken( $expiration );
+               $url = $this->confirmationTokenUrl( $token );
+               $invalidateURL = $this->invalidationTokenUrl( $token );
+               $this->saveSettings();
+
+               if ( $type == 'created' || $type === false ) {
+                       $message = 'confirmemail_body';
+               } elseif ( $type === true ) {
+                       $message = 'confirmemail_body_changed';
+               } else {
+                       // Messages: confirmemail_body_changed, confirmemail_body_set
+                       $message = 'confirmemail_body_' . $type;
+               }
+
+               return $this->sendMail( wfMessage( 'confirmemail_subject' )->text(),
+                       wfMessage( $message,
+                               $this->getRequest()->getIP(),
+                               $this->getName(),
+                               $url,
+                               $wgLang->userTimeAndDate( $expiration, $this ),
+                               $invalidateURL,
+                               $wgLang->userDate( $expiration, $this ),
+                               $wgLang->userTime( $expiration, $this ) )->text() );
+       }
+
+       /**
+        * Send an e-mail to this user's account. Does not check for
+        * confirmed status or validity.
+        *
+        * @param string $subject Message subject
+        * @param string $body Message body
+        * @param User|null $from Optional sending user; if unspecified, default
+        *   $wgPasswordSender will be used.
+        * @param string $replyto Reply-To address
+        * @return Status
+        */
+       public function sendMail( $subject, $body, $from = null, $replyto = null ) {
+               global $wgPasswordSender;
+
+               if ( $from instanceof User ) {
+                       $sender = MailAddress::newFromUser( $from );
+               } else {
+                       $sender = new MailAddress( $wgPasswordSender,
+                               wfMessage( 'emailsender' )->inContentLanguage()->text() );
+               }
+               $to = MailAddress::newFromUser( $this );
+
+               return UserMailer::send( $to, $sender, $subject, $body, array(
+                       'replyTo' => $replyto,
+               ) );
+       }
+
+       /**
+        * Generate, store, and return a new e-mail confirmation code.
+        * A hash (unsalted, since it's used as a key) is stored.
+        *
+        * @note Call saveSettings() after calling this function to commit
+        * this change to the database.
+        *
+        * @param string &$expiration Accepts the expiration time
+        * @return string New token
+        */
+       protected function confirmationToken( &$expiration ) {
+               global $wgUserEmailConfirmationTokenExpiry;
+               $now = time();
+               $expires = $now + $wgUserEmailConfirmationTokenExpiry;
+               $expiration = wfTimestamp( TS_MW, $expires );
+               $this->load();
+               $token = MWCryptRand::generateHex( 32 );
+               $hash = md5( $token );
+               $this->mEmailToken = $hash;
+               $this->mEmailTokenExpires = $expiration;
+               return $token;
+       }
+
+       /**
+        * Return a URL the user can use to confirm their email address.
+        * @param string $token Accepts the email confirmation token
+        * @return string New token URL
+        */
+       protected function confirmationTokenUrl( $token ) {
+               return $this->getTokenUrl( 'ConfirmEmail', $token );
+       }
+
+       /**
+        * Return a URL the user can use to invalidate their email address.
+        * @param string $token Accepts the email confirmation token
+        * @return string New token URL
+        */
+       protected function invalidationTokenUrl( $token ) {
+               return $this->getTokenUrl( 'InvalidateEmail', $token );
+       }
+
+       /**
+        * Internal function to format the e-mail validation/invalidation URLs.
+        * This uses a quickie hack to use the
+        * hardcoded English names of the Special: pages, for ASCII safety.
+        *
+        * @note Since these URLs get dropped directly into emails, using the
+        * short English names avoids insanely long URL-encoded links, which
+        * also sometimes can get corrupted in some browsers/mailers
+        * (bug 6957 with Gmail and Internet Explorer).
+        *
+        * @param string $page Special page
+        * @param string $token Token
+        * @return string Formatted URL
+        */
+       protected function getTokenUrl( $page, $token ) {
+               // Hack to bypass localization of 'Special:'
+               $title = Title::makeTitle( NS_MAIN, "Special:$page/$token" );
+               return $title->getCanonicalURL();
+       }
+
+       /**
+        * Mark the e-mail address confirmed.
+        *
+        * @note Call saveSettings() after calling this function to commit the change.
+        *
+        * @return bool
+        */
+       public function confirmEmail() {
+               // Check if it's already confirmed, so we don't touch the database
+               // and fire the ConfirmEmailComplete hook on redundant confirmations.
+               if ( !$this->isEmailConfirmed() ) {
+                       $this->setEmailAuthenticationTimestamp( wfTimestampNow() );
+                       Hooks::run( 'ConfirmEmailComplete', array( $this ) );
+               }
+               return true;
+       }
+
+       /**
+        * Invalidate the user's e-mail confirmation, and unauthenticate the e-mail
+        * address if it was already confirmed.
+        *
+        * @note Call saveSettings() after calling this function to commit the change.
+        * @return bool Returns true
+        */
+       public function invalidateEmail() {
+               $this->load();
+               $this->mEmailToken = null;
+               $this->mEmailTokenExpires = null;
+               $this->setEmailAuthenticationTimestamp( null );
+               $this->mEmail = '';
+               Hooks::run( 'InvalidateEmailComplete', array( $this ) );
+               return true;
+       }
+
+       /**
+        * Set the e-mail authentication timestamp.
+        * @param string $timestamp TS_MW timestamp
+        */
+       public function setEmailAuthenticationTimestamp( $timestamp ) {
+               $this->load();
+               $this->mEmailAuthenticated = $timestamp;
+               Hooks::run( 'UserSetEmailAuthenticationTimestamp', array( $this, &$this->mEmailAuthenticated ) );
+       }
+
+       /**
+        * Is this user allowed to send e-mails within limits of current
+        * site configuration?
+        * @return bool
+        */
+       public function canSendEmail() {
+               global $wgEnableEmail, $wgEnableUserEmail;
+               if ( !$wgEnableEmail || !$wgEnableUserEmail || !$this->isAllowed( 'sendemail' ) ) {
+                       return false;
+               }
+               $canSend = $this->isEmailConfirmed();
+               Hooks::run( 'UserCanSendEmail', array( &$this, &$canSend ) );
+               return $canSend;
+       }
+
+       /**
+        * Is this user allowed to receive e-mails within limits of current
+        * site configuration?
+        * @return bool
+        */
+       public function canReceiveEmail() {
+               return $this->isEmailConfirmed() && !$this->getOption( 'disablemail' );
+       }
+
+       /**
+        * Is this user's e-mail address valid-looking and confirmed within
+        * limits of the current site configuration?
+        *
+        * @note If $wgEmailAuthentication is on, this may require the user to have
+        * confirmed their address by returning a code or using a password
+        * sent to the address from the wiki.
+        *
+        * @return bool
+        */
+       public function isEmailConfirmed() {
+               global $wgEmailAuthentication;
+               $this->load();
+               $confirmed = true;
+               if ( Hooks::run( 'EmailConfirmed', array( &$this, &$confirmed ) ) ) {
+                       if ( $this->isAnon() ) {
+                               return false;
+                       }
+                       if ( !Sanitizer::validateEmail( $this->mEmail ) ) {
+                               return false;
+                       }
+                       if ( $wgEmailAuthentication && !$this->getEmailAuthenticationTimestamp() ) {
+                               return false;
+                       }
+                       return true;
+               } else {
+                       return $confirmed;
+               }
+       }
+
+       /**
+        * Check whether there is an outstanding request for e-mail confirmation.
+        * @return bool
+        */
+       public function isEmailConfirmationPending() {
+               global $wgEmailAuthentication;
+               return $wgEmailAuthentication &&
+                       !$this->isEmailConfirmed() &&
+                       $this->mEmailToken &&
+                       $this->mEmailTokenExpires > wfTimestamp();
+       }
+
+       /**
+        * Get the timestamp of account creation.
+        *
+        * @return string|bool|null Timestamp of account creation, false for
+        *  non-existent/anonymous user accounts, or null if existing account
+        *  but information is not in database.
+        */
+       public function getRegistration() {
+               if ( $this->isAnon() ) {
+                       return false;
+               }
+               $this->load();
+               return $this->mRegistration;
+       }
+
+       /**
+        * Get the timestamp of the first edit
+        *
+        * @return string|bool Timestamp of first edit, or false for
+        *  non-existent/anonymous user accounts.
+        */
+       public function getFirstEditTimestamp() {
+               if ( $this->getId() == 0 ) {
+                       return false; // anons
+               }
+               $dbr = wfGetDB( DB_SLAVE );
+               $time = $dbr->selectField( 'revision', 'rev_timestamp',
+                       array( 'rev_user' => $this->getId() ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'rev_timestamp ASC' )
+               );
+               if ( !$time ) {
+                       return false; // no edits
+               }
+               return wfTimestamp( TS_MW, $time );
+       }
+
+       /**
+        * Get the permissions associated with a given list of groups
+        *
+        * @param array $groups Array of Strings List of internal group names
+        * @return array Array of Strings List of permission key names for given groups combined
+        */
+       public static function getGroupPermissions( $groups ) {
+               global $wgGroupPermissions, $wgRevokePermissions;
+               $rights = array();
+               // grant every granted permission first
+               foreach ( $groups as $group ) {
+                       if ( isset( $wgGroupPermissions[$group] ) ) {
+                               $rights = array_merge( $rights,
+                                       // array_filter removes empty items
+                                       array_keys( array_filter( $wgGroupPermissions[$group] ) ) );
+                       }
+               }
+               // now revoke the revoked permissions
+               foreach ( $groups as $group ) {
+                       if ( isset( $wgRevokePermissions[$group] ) ) {
+                               $rights = array_diff( $rights,
+                                       array_keys( array_filter( $wgRevokePermissions[$group] ) ) );
+                       }
+               }
+               return array_unique( $rights );
+       }
+
+       /**
+        * Get all the groups who have a given permission
+        *
+        * @param string $role Role to check
+        * @return array Array of Strings List of internal group names with the given permission
+        */
+       public static function getGroupsWithPermission( $role ) {
+               global $wgGroupPermissions;
+               $allowedGroups = array();
+               foreach ( array_keys( $wgGroupPermissions ) as $group ) {
+                       if ( self::groupHasPermission( $group, $role ) ) {
+                               $allowedGroups[] = $group;
+                       }
+               }
+               return $allowedGroups;
+       }
+
+       /**
+        * Check, if the given group has the given permission
+        *
+        * If you're wanting to check whether all users have a permission, use
+        * User::isEveryoneAllowed() instead. That properly checks if it's revoked
+        * from anyone.
+        *
+        * @since 1.21
+        * @param string $group Group to check
+        * @param string $role Role to check
+        * @return bool
+        */
+       public static function groupHasPermission( $group, $role ) {
+               global $wgGroupPermissions, $wgRevokePermissions;
+               return isset( $wgGroupPermissions[$group][$role] ) && $wgGroupPermissions[$group][$role]
+                       && !( isset( $wgRevokePermissions[$group][$role] ) && $wgRevokePermissions[$group][$role] );
+       }
+
+       /**
+        * Check if all users have the given permission
+        *
+        * @since 1.22
+        * @param string $right Right to check
+        * @return bool
+        */
+       public static function isEveryoneAllowed( $right ) {
+               global $wgGroupPermissions, $wgRevokePermissions;
+               static $cache = array();
+
+               // Use the cached results, except in unit tests which rely on
+               // being able change the permission mid-request
+               if ( isset( $cache[$right] ) && !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       return $cache[$right];
+               }
+
+               if ( !isset( $wgGroupPermissions['*'][$right] ) || !$wgGroupPermissions['*'][$right] ) {
+                       $cache[$right] = false;
+                       return false;
+               }
+
+               // If it's revoked anywhere, then everyone doesn't have it
+               foreach ( $wgRevokePermissions as $rights ) {
+                       if ( isset( $rights[$right] ) && $rights[$right] ) {
+                               $cache[$right] = false;
+                               return false;
+                       }
+               }
+
+               // Allow extensions (e.g. OAuth) to say false
+               if ( !Hooks::run( 'UserIsEveryoneAllowed', array( $right ) ) ) {
+                       $cache[$right] = false;
+                       return false;
+               }
+
+               $cache[$right] = true;
+               return true;
+       }
+
+       /**
+        * Get the localized descriptive name for a group, if it exists
+        *
+        * @param string $group Internal group name
+        * @return string Localized descriptive group name
+        */
+       public static function getGroupName( $group ) {
+               $msg = wfMessage( "group-$group" );
+               return $msg->isBlank() ? $group : $msg->text();
+       }
+
+       /**
+        * Get the localized descriptive name for a member of a group, if it exists
+        *
+        * @param string $group Internal group name
+        * @param string $username Username for gender (since 1.19)
+        * @return string Localized name for group member
+        */
+       public static function getGroupMember( $group, $username = '#' ) {
+               $msg = wfMessage( "group-$group-member", $username );
+               return $msg->isBlank() ? $group : $msg->text();
+       }
+
+       /**
+        * Return the set of defined explicit groups.
+        * The implicit groups (by default *, 'user' and 'autoconfirmed')
+        * are not included, as they are defined automatically, not in the database.
+        * @return array Array of internal group names
+        */
+       public static function getAllGroups() {
+               global $wgGroupPermissions, $wgRevokePermissions;
+               return array_diff(
+                       array_merge( array_keys( $wgGroupPermissions ), array_keys( $wgRevokePermissions ) ),
+                       self::getImplicitGroups()
+               );
+       }
+
+       /**
+        * Get a list of all available permissions.
+        * @return string[] Array of permission names
+        */
+       public static function getAllRights() {
+               if ( self::$mAllRights === false ) {
+                       global $wgAvailableRights;
+                       if ( count( $wgAvailableRights ) ) {
+                               self::$mAllRights = array_unique( array_merge( self::$mCoreRights, $wgAvailableRights ) );
+                       } else {
+                               self::$mAllRights = self::$mCoreRights;
+                       }
+                       Hooks::run( 'UserGetAllRights', array( &self::$mAllRights ) );
+               }
+               return self::$mAllRights;
+       }
+
+       /**
+        * Get a list of implicit groups
+        * @return array Array of Strings Array of internal group names
+        */
+       public static function getImplicitGroups() {
+               global $wgImplicitGroups;
+
+               $groups = $wgImplicitGroups;
+               # Deprecated, use $wgImplicitGroups instead
+               Hooks::run( 'UserGetImplicitGroups', array( &$groups ), '1.25' );
+
+               return $groups;
+       }
+
+       /**
+        * Get the title of a page describing a particular group
+        *
+        * @param string $group Internal group name
+        * @return Title|bool Title of the page if it exists, false otherwise
+        */
+       public static function getGroupPage( $group ) {
+               $msg = wfMessage( 'grouppage-' . $group )->inContentLanguage();
+               if ( $msg->exists() ) {
+                       $title = Title::newFromText( $msg->text() );
+                       if ( is_object( $title ) ) {
+                               return $title;
+                       }
+               }
+               return false;
+       }
+
+       /**
+        * Create a link to the group in HTML, if available;
+        * else return the group name.
+        *
+        * @param string $group Internal name of the group
+        * @param string $text The text of the link
+        * @return string HTML link to the group
+        */
+       public static function makeGroupLinkHTML( $group, $text = '' ) {
+               if ( $text == '' ) {
+                       $text = self::getGroupName( $group );
+               }
+               $title = self::getGroupPage( $group );
+               if ( $title ) {
+                       return Linker::link( $title, htmlspecialchars( $text ) );
+               } else {
+                       return htmlspecialchars( $text );
+               }
+       }
+
+       /**
+        * Create a link to the group in Wikitext, if available;
+        * else return the group name.
+        *
+        * @param string $group Internal name of the group
+        * @param string $text The text of the link
+        * @return string Wikilink to the group
+        */
+       public static function makeGroupLinkWiki( $group, $text = '' ) {
+               if ( $text == '' ) {
+                       $text = self::getGroupName( $group );
+               }
+               $title = self::getGroupPage( $group );
+               if ( $title ) {
+                       $page = $title->getFullText();
+                       return "[[$page|$text]]";
+               } else {
+                       return $text;
+               }
+       }
+
+       /**
+        * Returns an array of the groups that a particular group can add/remove.
+        *
+        * @param string $group The group to check for whether it can add/remove
+        * @return array Array( 'add' => array( addablegroups ),
+        *     'remove' => array( removablegroups ),
+        *     'add-self' => array( addablegroups to self),
+        *     'remove-self' => array( removable groups from self) )
+        */
+       public static function changeableByGroup( $group ) {
+               global $wgAddGroups, $wgRemoveGroups, $wgGroupsAddToSelf, $wgGroupsRemoveFromSelf;
+
+               $groups = array(
+                       'add' => array(),
+                       'remove' => array(),
+                       'add-self' => array(),
+                       'remove-self' => array()
+               );
+
+               if ( empty( $wgAddGroups[$group] ) ) {
+                       // Don't add anything to $groups
+               } elseif ( $wgAddGroups[$group] === true ) {
+                       // You get everything
+                       $groups['add'] = self::getAllGroups();
+               } elseif ( is_array( $wgAddGroups[$group] ) ) {
+                       $groups['add'] = $wgAddGroups[$group];
+               }
+
+               // Same thing for remove
+               if ( empty( $wgRemoveGroups[$group] ) ) {
+                       // Do nothing
+               } elseif ( $wgRemoveGroups[$group] === true ) {
+                       $groups['remove'] = self::getAllGroups();
+               } elseif ( is_array( $wgRemoveGroups[$group] ) ) {
+                       $groups['remove'] = $wgRemoveGroups[$group];
+               }
+
+               // Re-map numeric keys of AddToSelf/RemoveFromSelf to the 'user' key for backwards compatibility
+               if ( empty( $wgGroupsAddToSelf['user'] ) || $wgGroupsAddToSelf['user'] !== true ) {
+                       foreach ( $wgGroupsAddToSelf as $key => $value ) {
+                               if ( is_int( $key ) ) {
+                                       $wgGroupsAddToSelf['user'][] = $value;
+                               }
+                       }
+               }
+
+               if ( empty( $wgGroupsRemoveFromSelf['user'] ) || $wgGroupsRemoveFromSelf['user'] !== true ) {
+                       foreach ( $wgGroupsRemoveFromSelf as $key => $value ) {
+                               if ( is_int( $key ) ) {
+                                       $wgGroupsRemoveFromSelf['user'][] = $value;
+                               }
+                       }
+               }
+
+               // Now figure out what groups the user can add to him/herself
+               if ( empty( $wgGroupsAddToSelf[$group] ) ) {
+                       // Do nothing
+               } elseif ( $wgGroupsAddToSelf[$group] === true ) {
+                       // No idea WHY this would be used, but it's there
+                       $groups['add-self'] = User::getAllGroups();
+               } elseif ( is_array( $wgGroupsAddToSelf[$group] ) ) {
+                       $groups['add-self'] = $wgGroupsAddToSelf[$group];
+               }
+
+               if ( empty( $wgGroupsRemoveFromSelf[$group] ) ) {
+                       // Do nothing
+               } elseif ( $wgGroupsRemoveFromSelf[$group] === true ) {
+                       $groups['remove-self'] = User::getAllGroups();
+               } elseif ( is_array( $wgGroupsRemoveFromSelf[$group] ) ) {
+                       $groups['remove-self'] = $wgGroupsRemoveFromSelf[$group];
+               }
+
+               return $groups;
+       }
+
+       /**
+        * Returns an array of groups that this user can add and remove
+        * @return array Array( 'add' => array( addablegroups ),
+        *  'remove' => array( removablegroups ),
+        *  'add-self' => array( addablegroups to self),
+        *  'remove-self' => array( removable groups from self) )
+        */
+       public function changeableGroups() {
+               if ( $this->isAllowed( 'userrights' ) ) {
+                       // This group gives the right to modify everything (reverse-
+                       // compatibility with old "userrights lets you change
+                       // everything")
+                       // Using array_merge to make the groups reindexed
+                       $all = array_merge( User::getAllGroups() );
+                       return array(
+                               'add' => $all,
+                               'remove' => $all,
+                               'add-self' => array(),
+                               'remove-self' => array()
+                       );
+               }
+
+               // Okay, it's not so simple, we will have to go through the arrays
+               $groups = array(
+                       'add' => array(),
+                       'remove' => array(),
+                       'add-self' => array(),
+                       'remove-self' => array()
+               );
+               $addergroups = $this->getEffectiveGroups();
+
+               foreach ( $addergroups as $addergroup ) {
+                       $groups = array_merge_recursive(
+                               $groups, $this->changeableByGroup( $addergroup )
+                       );
+                       $groups['add'] = array_unique( $groups['add'] );
+                       $groups['remove'] = array_unique( $groups['remove'] );
+                       $groups['add-self'] = array_unique( $groups['add-self'] );
+                       $groups['remove-self'] = array_unique( $groups['remove-self'] );
+               }
+               return $groups;
+       }
+
+       /**
+        * Deferred version of incEditCountImmediate()
+        */
+       public function incEditCount() {
+               $that = $this;
+               wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle( function() use ( $that ) {
+                       $that->incEditCountImmediate();
+               } );
+       }
+
+       /**
+        * Increment the user's edit-count field.
+        * Will have no effect for anonymous users.
+        * @since 1.26
+        */
+       public function incEditCountImmediate() {
+               if ( $this->isAnon() ) {
+                       return;
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               // No rows will be "affected" if user_editcount is NULL
+               $dbw->update(
+                       'user',
+                       array( 'user_editcount=user_editcount+1' ),
+                       array( 'user_id' => $this->getId(), 'user_editcount IS NOT NULL' ),
+                       __METHOD__
+               );
+               // Lazy initialization check...
+               if ( $dbw->affectedRows() == 0 ) {
+                       // Now here's a goddamn hack...
+                       $dbr = wfGetDB( DB_SLAVE );
+                       if ( $dbr !== $dbw ) {
+                               // If we actually have a slave server, the count is
+                               // at least one behind because the current transaction
+                               // has not been committed and replicated.
+                               $this->initEditCount( 1 );
+                       } else {
+                               // But if DB_SLAVE is selecting the master, then the
+                               // count we just read includes the revision that was
+                               // just added in the working transaction.
+                               $this->initEditCount();
+                       }
+               }
+               // Edit count in user cache too
+               $this->invalidateCache();
+       }
+
+       /**
+        * Initialize user_editcount from data out of the revision table
+        *
+        * @param int $add Edits to add to the count from the revision table
+        * @return int Number of edits
+        */
+       protected function initEditCount( $add = 0 ) {
+               // Pull from a slave to be less cruel to servers
+               // Accuracy isn't the point anyway here
+               $dbr = wfGetDB( DB_SLAVE );
+               $count = (int)$dbr->selectField(
+                       'revision',
+                       'COUNT(rev_user)',
+                       array( 'rev_user' => $this->getId() ),
+                       __METHOD__
+               );
+               $count = $count + $add;
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'user',
+                       array( 'user_editcount' => $count ),
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+
+               return $count;
+       }
+
+       /**
+        * Get the description of a given right
+        *
+        * @param string $right Right to query
+        * @return string Localized description of the right
+        */
+       public static function getRightDescription( $right ) {
+               $key = "right-$right";
+               $msg = wfMessage( $key );
+               return $msg->isBlank() ? $right : $msg->text();
+       }
+
+       /**
+        * Make a new-style password hash
+        *
+        * @param string $password Plain-text password
+        * @param bool|string $salt Optional salt, may be random or the user ID.
+        *  If unspecified or false, will generate one automatically
+        * @return string Password hash
+        * @deprecated since 1.24, use Password class
+        */
+       public static function crypt( $password, $salt = false ) {
+               wfDeprecated( __METHOD__, '1.24' );
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $hash = $passwordFactory->newFromPlaintext( $password );
+               return $hash->toString();
+       }
+
+       /**
+        * Compare a password hash with a plain-text password. Requires the user
+        * ID if there's a chance that the hash is an old-style hash.
+        *
+        * @param string $hash Password hash
+        * @param string $password Plain-text password to compare
+        * @param string|bool $userId User ID for old-style password salt
+        *
+        * @return bool
+        * @deprecated since 1.24, use Password class
+        */
+       public static function comparePasswords( $hash, $password, $userId = false ) {
+               wfDeprecated( __METHOD__, '1.24' );
+
+               // Check for *really* old password hashes that don't even have a type
+               // The old hash format was just an md5 hex hash, with no type information
+               if ( preg_match( '/^[0-9a-f]{32}$/', $hash ) ) {
+                       global $wgPasswordSalt;
+                       if ( $wgPasswordSalt ) {
+                               $password = ":B:{$userId}:{$hash}";
+                       } else {
+                               $password = ":A:{$hash}";
+                       }
+               }
+
+               $passwordFactory = new PasswordFactory();
+               $passwordFactory->init( RequestContext::getMain()->getConfig() );
+               $hash = $passwordFactory->newFromCiphertext( $hash );
+               return $hash->equals( $password );
+       }
+
+       /**
+        * Add a newuser log entry for this user.
+        * Before 1.19 the return value was always true.
+        *
+        * @param string|bool $action Account creation type.
+        *   - String, one of the following values:
+        *     - 'create' for an anonymous user creating an account for himself.
+        *       This will force the action's performer to be the created user itself,
+        *       no matter the value of $wgUser
+        *     - 'create2' for a logged in user creating an account for someone else
+        *     - 'byemail' when the created user will receive its password by e-mail
+        *     - 'autocreate' when the user is automatically created (such as by CentralAuth).
+        *   - Boolean means whether the account was created by e-mail (deprecated):
+        *     - true will be converted to 'byemail'
+        *     - false will be converted to 'create' if this object is the same as
+        *       $wgUser and to 'create2' otherwise
+        *
+        * @param string $reason User supplied reason
+        *
+        * @return int|bool True if not $wgNewUserLog; otherwise ID of log item or 0 on failure
+        */
+       public function addNewUserLogEntry( $action = false, $reason = '' ) {
+               global $wgUser, $wgNewUserLog;
+               if ( empty( $wgNewUserLog ) ) {
+                       return true; // disabled
+               }
+
+               if ( $action === true ) {
+                       $action = 'byemail';
+               } elseif ( $action === false ) {
+                       if ( $this->equals( $wgUser ) ) {
+                               $action = 'create';
+                       } else {
+                               $action = 'create2';
+                       }
+               }
+
+               if ( $action === 'create' || $action === 'autocreate' ) {
+                       $performer = $this;
+               } else {
+                       $performer = $wgUser;
+               }
+
+               $logEntry = new ManualLogEntry( 'newusers', $action );
+               $logEntry->setPerformer( $performer );
+               $logEntry->setTarget( $this->getUserPage() );
+               $logEntry->setComment( $reason );
+               $logEntry->setParameters( array(
+                       '4::userid' => $this->getId(),
+               ) );
+               $logid = $logEntry->insert();
+
+               if ( $action !== 'autocreate' ) {
+                       $logEntry->publish( $logid );
+               }
+
+               return (int)$logid;
+       }
+
+       /**
+        * Add an autocreate newuser log entry for this user
+        * Used by things like CentralAuth and perhaps other authplugins.
+        * Consider calling addNewUserLogEntry() directly instead.
+        *
+        * @return bool
+        */
+       public function addNewUserLogEntryAutoCreate() {
+               $this->addNewUserLogEntry( 'autocreate' );
+
+               return true;
+       }
+
+       /**
+        * Load the user options either from cache, the database or an array
+        *
+        * @param array $data Rows for the current user out of the user_properties table
+        */
+       protected function loadOptions( $data = null ) {
+               global $wgContLang;
+
+               $this->load();
+
+               if ( $this->mOptionsLoaded ) {
+                       return;
+               }
+
+               $this->mOptions = self::getDefaultOptions();
+
+               if ( !$this->getId() ) {
+                       // For unlogged-in users, load language/variant options from request.
+                       // There's no need to do it for logged-in users: they can set preferences,
+                       // and handling of page content is done by $pageLang->getPreferredVariant() and such,
+                       // so don't override user's choice (especially when the user chooses site default).
+                       $variant = $wgContLang->getDefaultVariant();
+                       $this->mOptions['variant'] = $variant;
+                       $this->mOptions['language'] = $variant;
+                       $this->mOptionsLoaded = true;
+                       return;
+               }
+
+               // Maybe load from the object
+               if ( !is_null( $this->mOptionOverrides ) ) {
+                       wfDebug( "User: loading options for user " . $this->getId() . " from override cache.\n" );
+                       foreach ( $this->mOptionOverrides as $key => $value ) {
+                               $this->mOptions[$key] = $value;
+                       }
+               } else {
+                       if ( !is_array( $data ) ) {
+                               wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
+                               // Load from database
+                               $dbr = ( $this->queryFlagsUsed & self::READ_LATEST )
+                                       ? wfGetDB( DB_MASTER )
+                                       : wfGetDB( DB_SLAVE );
+
+                               $res = $dbr->select(
+                                       'user_properties',
+                                       array( 'up_property', 'up_value' ),
+                                       array( 'up_user' => $this->getId() ),
+                                       __METHOD__
+                               );
+
+                               $this->mOptionOverrides = array();
+                               $data = array();
+                               foreach ( $res as $row ) {
+                                       $data[$row->up_property] = $row->up_value;
+                               }
+                       }
+                       foreach ( $data as $property => $value ) {
+                               $this->mOptionOverrides[$property] = $value;
+                               $this->mOptions[$property] = $value;
+                       }
+               }
+
+               $this->mOptionsLoaded = true;
+
+               Hooks::run( 'UserLoadOptions', array( $this, &$this->mOptions ) );
+       }
+
+       /**
+        * Saves the non-default options for this user, as previously set e.g. via
+        * setOption(), in the database's "user_properties" (preferences) table.
+        * Usually used via saveSettings().
+        */
+       protected function saveOptions() {
+               $this->loadOptions();
+
+               // Not using getOptions(), to keep hidden preferences in database
+               $saveOptions = $this->mOptions;
+
+               // Allow hooks to abort, for instance to save to a global profile.
+               // Reset options to default state before saving.
+               if ( !Hooks::run( 'UserSaveOptions', array( $this, &$saveOptions ) ) ) {
+                       return;
+               }
+
+               $userId = $this->getId();
+
+               $insert_rows = array(); // all the new preference rows
+               foreach ( $saveOptions as $key => $value ) {
+                       // Don't bother storing default values
+                       $defaultOption = self::getDefaultOption( $key );
+                       if ( ( $defaultOption === null && $value !== false && $value !== null )
+                               || $value != $defaultOption
+                       ) {
+                               $insert_rows[] = array(
+                                       'up_user' => $userId,
+                                       'up_property' => $key,
+                                       'up_value' => $value,
+                               );
+                       }
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $res = $dbw->select( 'user_properties',
+                       array( 'up_property', 'up_value' ), array( 'up_user' => $userId ), __METHOD__ );
+
+               // Find prior rows that need to be removed or updated. These rows will
+               // all be deleted (the later so that INSERT IGNORE applies the new values).
+               $keysDelete = array();
+               foreach ( $res as $row ) {
+                       if ( !isset( $saveOptions[$row->up_property] )
+                               || strcmp( $saveOptions[$row->up_property], $row->up_value ) != 0
+                       ) {
+                               $keysDelete[] = $row->up_property;
+                       }
+               }
+
+               if ( count( $keysDelete ) ) {
+                       // Do the DELETE by PRIMARY KEY for prior rows.
+                       // In the past a very large portion of calls to this function are for setting
+                       // 'rememberpassword' for new accounts (a preference that has since been removed).
+                       // Doing a blanket per-user DELETE for new accounts with no rows in the table
+                       // caused gap locks on [max user ID,+infinity) which caused high contention since
+                       // updates would pile up on each other as they are for higher (newer) user IDs.
+                       // It might not be necessary these days, but it shouldn't hurt either.
+                       $dbw->delete( 'user_properties',
+                               array( 'up_user' => $userId, 'up_property' => $keysDelete ), __METHOD__ );
+               }
+               // Insert the new preference rows
+               $dbw->insert( 'user_properties', $insert_rows, __METHOD__, array( 'IGNORE' ) );
+       }
+
+       /**
+        * Lazily instantiate and return a factory object for making passwords
+        *
+        * @deprecated since 1.27, create a PasswordFactory directly instead
+        * @return PasswordFactory
+        */
+       public static function getPasswordFactory() {
+               wfDeprecated( __METHOD__, '1.27' );
+               $ret = new PasswordFactory();
+               $ret->init( RequestContext::getMain()->getConfig() );
+               return $ret;
+       }
+
+       /**
+        * Provide an array of HTML5 attributes to put on an input element
+        * intended for the user to enter a new password.  This may include
+        * required, title, and/or pattern, depending on $wgMinimalPasswordLength.
+        *
+        * Do *not* use this when asking the user to enter his current password!
+        * Regardless of configuration, users may have invalid passwords for whatever
+        * reason (e.g., they were set before requirements were tightened up).
+        * Only use it when asking for a new password, like on account creation or
+        * ResetPass.
+        *
+        * Obviously, you still need to do server-side checking.
+        *
+        * NOTE: A combination of bugs in various browsers means that this function
+        * actually just returns array() unconditionally at the moment.  May as
+        * well keep it around for when the browser bugs get fixed, though.
+        *
+        * @todo FIXME: This does not belong here; put it in Html or Linker or somewhere
+        *
+        * @deprecated since 1.27
+        * @return array Array of HTML attributes suitable for feeding to
+        *   Html::element(), directly or indirectly.  (Don't feed to Xml::*()!
+        *   That will get confused by the boolean attribute syntax used.)
+        */
+       public static function passwordChangeInputAttribs() {
+               global $wgMinimalPasswordLength;
+
+               if ( $wgMinimalPasswordLength == 0 ) {
+                       return array();
+               }
+
+               # Note that the pattern requirement will always be satisfied if the
+               # input is empty, so we need required in all cases.
+
+               # @todo FIXME: Bug 23769: This needs to not claim the password is required
+               # if e-mail confirmation is being used.  Since HTML5 input validation
+               # is b0rked anyway in some browsers, just return nothing.  When it's
+               # re-enabled, fix this code to not output required for e-mail
+               # registration.
+               # $ret = array( 'required' );
+               $ret = array();
+
+               # We can't actually do this right now, because Opera 9.6 will print out
+               # the entered password visibly in its error message!  When other
+               # browsers add support for this attribute, or Opera fixes its support,
+               # we can add support with a version check to avoid doing this on Opera
+               # versions where it will be a problem.  Reported to Opera as
+               # DSK-262266, but they don't have a public bug tracker for us to follow.
+               /*
+               if ( $wgMinimalPasswordLength > 1 ) {
+                       $ret['pattern'] = '.{' . intval( $wgMinimalPasswordLength ) . ',}';
+                       $ret['title'] = wfMessage( 'passwordtooshort' )
+                               ->numParams( $wgMinimalPasswordLength )->text();
+               }
+               */
+
+               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_email',
+                       'user_touched',
+                       'user_token',
+                       'user_email_authenticated',
+                       'user_email_token',
+                       'user_email_token_expires',
+                       'user_registration',
+                       'user_editcount',
+               );
+       }
+
+       /**
+        * Factory function for fatal permission-denied errors
+        *
+        * @since 1.22
+        * @param string $permission User right required
+        * @return Status
+        */
+       static function newFatalPermissionDeniedStatus( $permission ) {
+               global $wgLang;
+
+               $groups = array_map(
+                       array( 'User', 'makeGroupLinkWiki' ),
+                       User::getGroupsWithPermission( $permission )
+               );
+
+               if ( $groups ) {
+                       return Status::newFatal( 'badaccess-groups', $wgLang->commaList( $groups ), count( $groups ) );
+               } else {
+                       return Status::newFatal( 'badaccess-group0' );
+               }
+       }
+
+       /**
+        * Get a new instance of this user that was loaded from the master via a locking read
+        *
+        * Use this instead of the main context User when updating that user. This avoids races
+        * where that user was loaded from a slave or even the master but without proper locks.
+        *
+        * @return User|null Returns null if the user was not found in the DB
+        * @since 1.27
+        */
+       public function getInstanceForUpdate() {
+               if ( !$this->getId() ) {
+                       return null; // anon
+               }
+
+               $user = self::newFromId( $this->getId() );
+               if ( !$user->loadFromId( self::READ_EXCLUSIVE ) ) {
+                       return null;
+               }
+
+               return $user;
+       }
+
+       /**
+        * Checks if two user objects point to the same user.
+        *
+        * @since 1.25
+        * @param User $user
+        * @return bool
+        */
+       public function equals( User $user ) {
+               return $this->getName() === $user->getName();
+       }
+}
diff --git a/includes/user/UserArray.php b/includes/user/UserArray.php
new file mode 100644 (file)
index 0000000..31bd601
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Class 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 {
+       /**
+        * @param ResultWrapper $res
+        * @return UserArrayFromResult
+        */
+       static function newFromResult( $res ) {
+               $userArray = null;
+               if ( !Hooks::run( 'UserArrayFromResult', array( &$userArray, $res ) ) ) {
+                       return null;
+               }
+               if ( $userArray === null ) {
+                       $userArray = self::newFromResult_internal( $res );
+               }
+               return $userArray;
+       }
+
+       /**
+        * @param array $ids
+        * @return UserArrayFromResult
+        */
+       static function newFromIDs( $ids ) {
+               $ids = array_map( 'intval', (array)$ids ); // paranoia
+               if ( !$ids ) {
+                       // Database::select() doesn't like empty arrays
+                       return new ArrayIterator( array() );
+               }
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select(
+                       'user',
+                       User::selectFields(),
+                       array( 'user_id' => array_unique( $ids ) ),
+                       __METHOD__
+               );
+               return self::newFromResult( $res );
+       }
+
+       /**
+        * @since 1.25
+        * @param array $names
+        * @return UserArrayFromResult
+        */
+       static function newFromNames( $names ) {
+               $names = array_map( 'strval', (array)$names ); // paranoia
+               if ( !$names ) {
+                       // Database::select() doesn't like empty arrays
+                       return new ArrayIterator( array() );
+               }
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select(
+                       'user',
+                       User::selectFields(),
+                       array( 'user_name' => array_unique( $names ) ),
+                       __METHOD__
+               );
+               return self::newFromResult( $res );
+       }
+
+       /**
+        * @param ResultWrapper $res
+        * @return UserArrayFromResult
+        */
+       protected static function newFromResult_internal( $res ) {
+               return new UserArrayFromResult( $res );
+       }
+}
diff --git a/includes/user/UserArrayFromResult.php b/includes/user/UserArrayFromResult.php
new file mode 100644 (file)
index 0000000..fb533d0
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Class 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
+ */
+
+class UserArrayFromResult extends UserArray implements Countable {
+       /** @var ResultWrapper */
+       public $res;
+
+       /** @var int */
+       public $key;
+
+       /** @var bool|stdClass */
+       public $current;
+
+       /**
+        * @param ResultWrapper $res
+        */
+       function __construct( $res ) {
+               $this->res = $res;
+               $this->key = 0;
+               $this->setCurrent( $this->res->current() );
+       }
+
+       /**
+        * @param bool|stdClass $row
+        * @return void
+        */
+       protected function setCurrent( $row ) {
+               if ( $row === false ) {
+                       $this->current = false;
+               } else {
+                       $this->current = User::newFromRow( $row );
+               }
+       }
+
+       /**
+        * @return int
+        */
+       public function count() {
+               return $this->res->numRows();
+       }
+
+       /**
+        * @return User
+        */
+       function current() {
+               return $this->current;
+       }
+
+       function key() {
+               return $this->key;
+       }
+
+       function next() {
+               $row = $this->res->next();
+               $this->setCurrent( $row );
+               $this->key++;
+       }
+
+       function rewind() {
+               $this->res->rewind();
+               $this->key = 0;
+               $this->setCurrent( $this->res->current() );
+       }
+
+       /**
+        * @return bool
+        */
+       function valid() {
+               return $this->current !== false;
+       }
+}
diff --git a/includes/user/UserRightsProxy.php b/includes/user/UserRightsProxy.php
new file mode 100644 (file)
index 0000000..e686ae3
--- /dev/null
@@ -0,0 +1,287 @@
+<?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
+ * user rights manipulation.
+ */
+class UserRightsProxy {
+
+       /**
+        * Constructor.
+        *
+        * @see newFromId()
+        * @see newFromName()
+        * @param IDatabase $db Db connection
+        * @param string $database Database name
+        * @param string $name User name
+        * @param int $id User ID
+        */
+       private function __construct( $db, $database, $name, $id ) {
+               $this->db = $db;
+               $this->database = $database;
+               $this->name = $name;
+               $this->id = intval( $id );
+               $this->newOptions = array();
+       }
+
+       /**
+        * Accessor for $this->database
+        *
+        * @return string Database name
+        */
+       public function getDBName() {
+               return $this->database;
+       }
+
+       /**
+        * Confirm the selected database name is a valid local interwiki database name.
+        *
+        * @param string $database Database name
+        * @return bool
+        */
+       public static function validDatabase( $database ) {
+               global $wgLocalDatabases;
+               return in_array( $database, $wgLocalDatabases );
+       }
+
+       /**
+        * Same as User::whoIs()
+        *
+        * @param string $database Database name
+        * @param int $id User ID
+        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
+        * @return string User name or false if the user doesn't exist
+        */
+       public static function whoIs( $database, $id, $ignoreInvalidDB = false ) {
+               $user = self::newFromId( $database, $id, $ignoreInvalidDB );
+               if ( $user ) {
+                       return $user->name;
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Factory function; get a remote user entry by ID number.
+        *
+        * @param string $database Database name
+        * @param int $id User ID
+        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
+        * @return UserRightsProxy|null If doesn't exist
+        */
+       public static function newFromId( $database, $id, $ignoreInvalidDB = false ) {
+               return self::newFromLookup( $database, 'user_id', intval( $id ), $ignoreInvalidDB );
+       }
+
+       /**
+        * Factory function; get a remote user entry by name.
+        *
+        * @param string $database Database name
+        * @param string $name User name
+        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
+        * @return UserRightsProxy|null If doesn't exist
+        */
+       public static function newFromName( $database, $name, $ignoreInvalidDB = false ) {
+               return self::newFromLookup( $database, 'user_name', $name, $ignoreInvalidDB );
+       }
+
+       /**
+        * @param string $database
+        * @param string $field
+        * @param string $value
+        * @param bool $ignoreInvalidDB
+        * @return null|UserRightsProxy
+        */
+       private static function newFromLookup( $database, $field, $value, $ignoreInvalidDB = false ) {
+               global $wgSharedDB, $wgSharedTables;
+               // If the user table is shared, perform the user query on it,
+               // but don't pass it to the UserRightsProxy,
+               // as user rights are normally not shared.
+               if ( $wgSharedDB && in_array( 'user', $wgSharedTables ) ) {
+                       $userdb = self::getDB( $wgSharedDB, $ignoreInvalidDB );
+               } else {
+                       $userdb = self::getDB( $database, $ignoreInvalidDB );
+               }
+
+               $db = self::getDB( $database, $ignoreInvalidDB );
+
+               if ( $db && $userdb ) {
+                       $row = $userdb->selectRow( 'user',
+                               array( 'user_id', 'user_name' ),
+                               array( $field => $value ),
+                               __METHOD__ );
+
+                       if ( $row !== false ) {
+                               return new UserRightsProxy( $db, $database,
+                                       $row->user_name,
+                                       intval( $row->user_id ) );
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * Open a database connection to work on for the requested user.
+        * This may be a new connection to another database for remote users.
+        *
+        * @param string $database
+        * @param bool $ignoreInvalidDB If true, don't check if $database is in $wgLocalDatabases
+        * @return IDatabase|null If invalid selection
+        */
+       public static function getDB( $database, $ignoreInvalidDB = false ) {
+               global $wgDBname;
+               if ( $ignoreInvalidDB || self::validDatabase( $database ) ) {
+                       if ( $database == $wgDBname ) {
+                               // Hmm... this shouldn't happen though. :)
+                               return wfGetDB( DB_MASTER );
+                       } else {
+                               return wfGetDB( DB_MASTER, array(), $database );
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * @return int
+        */
+       public function getId() {
+               return $this->id;
+       }
+
+       /**
+        * @return bool
+        */
+       public function isAnon() {
+               return $this->getId() == 0;
+       }
+
+       /**
+        * Same as User::getName()
+        *
+        * @return string
+        */
+       public function getName() {
+               return $this->name . '@' . $this->database;
+       }
+
+       /**
+        * Same as User::getUserPage()
+        *
+        * @return Title
+        */
+       public function getUserPage() {
+               return Title::makeTitle( NS_USER, $this->getName() );
+       }
+
+       /**
+        * Replaces User::getUserGroups()
+        * @return array
+        */
+       function getGroups() {
+               $res = $this->db->select( 'user_groups',
+                       array( 'ug_group' ),
+                       array( 'ug_user' => $this->id ),
+                       __METHOD__ );
+               $groups = array();
+               foreach ( $res as $row ) {
+                       $groups[] = $row->ug_group;
+               }
+               return $groups;
+       }
+
+       /**
+        * Replaces User::addUserGroup()
+        * @param string $group
+        *
+        * @return bool
+        */
+       function addGroup( $group ) {
+               $this->db->insert( 'user_groups',
+                       array(
+                               'ug_user' => $this->id,
+                               'ug_group' => $group,
+                       ),
+                       __METHOD__,
+                       array( 'IGNORE' ) );
+
+               return true;
+       }
+
+       /**
+        * Replaces User::removeUserGroup()
+        * @param string $group
+        *
+        * @return bool
+        */
+       function removeGroup( $group ) {
+               $this->db->delete( 'user_groups',
+                       array(
+                               'ug_user' => $this->id,
+                               'ug_group' => $group,
+                       ),
+                       __METHOD__ );
+
+               return true;
+       }
+
+       /**
+        * Replaces User::setOption()
+        * @param string $option
+        * @param mixed $value
+        */
+       public function setOption( $option, $value ) {
+               $this->newOptions[$option] = $value;
+       }
+
+       public function saveSettings() {
+               $rows = array();
+               foreach ( $this->newOptions as $option => $value ) {
+                       $rows[] = array(
+                               'up_user' => $this->id,
+                               'up_property' => $option,
+                               'up_value' => $value,
+                       );
+               }
+               $this->db->replace( 'user_properties',
+                       array( array( 'up_user', 'up_property' ) ),
+                       $rows, __METHOD__
+               );
+               $this->invalidateCache();
+       }
+
+       /**
+        * Replaces User::touchUser()
+        */
+       function invalidateCache() {
+               $this->db->update( 'user',
+                       array( 'user_touched' => $this->db->timestamp() ),
+                       array( 'user_id' => $this->id ),
+                       __METHOD__ );
+
+               $wikiId = $this->db->getWikiID();
+               $userId = $this->id;
+               $this->db->onTransactionPreCommitOrIdle( function() use ( $wikiId, $userId ) {
+                       User::purge( $wikiId, $userId );
+               } );
+       }
+}
index c866919..c74b04d 100644 (file)
@@ -31,7 +31,7 @@ class FileContentsHasher {
         * Constructor.
         */
        public function __construct() {
-               $this->cache = ObjectCache::newAccelerator( 'hash' );
+               $this->cache = ObjectCache::getLocalServerInstance( 'hash' );
        }
 
        /**
@@ -62,7 +62,7 @@ class FileContentsHasher {
                        return false;
                }
 
-               $cacheKey = wfGlobalCacheKey( __CLASS__, $filePath, $mtime, $algo );
+               $cacheKey = $this->cache->makeGlobalKey( __CLASS__, $filePath, $mtime, $algo );
                $hash = $this->cache->get( $cacheKey );
 
                if ( $hash ) {
index 9f52249..fd7030e 100644 (file)
@@ -411,7 +411,7 @@ class IP {
                                }
                        }
                        if ( $n !== false ) {
-                               # Floating points can handle the conversion; faster than wfBaseConvert()
+                               # Floating points can handle the conversion; faster than Wikimedia\base_convert()
                                $n = strtoupper( str_pad( base_convert( $n, 10, 16 ), 8, '0', STR_PAD_LEFT ) );
                        }
                } else {
@@ -551,11 +551,11 @@ class IP {
                        } else {
                                # Native 32 bit functions WONT work here!!!
                                # Convert to a padded binary number
-                               $network = wfBaseConvert( $network, 16, 2, 128 );
+                               $network = Wikimedia\base_convert( $network, 16, 2, 128 );
                                # Truncate the last (128-$bits) bits and replace them with zeros
                                $network = str_pad( substr( $network, 0, $bits ), 128, 0, STR_PAD_RIGHT );
                                # Convert back to an integer
-                               $network = wfBaseConvert( $network, 2, 10 );
+                               $network = Wikimedia\base_convert( $network, 2, 10 );
                        }
                } else {
                        $network = false;
@@ -587,13 +587,13 @@ class IP {
                        if ( $network === false ) {
                                $start = $end = false;
                        } else {
-                               $start = wfBaseConvert( $network, 10, 16, 32, false );
+                               $start = Wikimedia\base_convert( $network, 10, 16, 32, false );
                                # Turn network to binary (again)
-                               $end = wfBaseConvert( $network, 10, 2, 128 );
+                               $end = Wikimedia\base_convert( $network, 10, 2, 128 );
                                # Truncate the last (128-$bits) bits and replace them with ones
                                $end = str_pad( substr( $end, 0, $bits ), 128, 1, STR_PAD_RIGHT );
                                # Convert to hex
-                               $end = wfBaseConvert( $end, 2, 16, 32, false );
+                               $end = Wikimedia\base_convert( $end, 2, 16, 32, false );
                                # see toHex() comment
                                $start = "v6-$start";
                                $end = "v6-$end";
@@ -713,7 +713,7 @@ class IP {
        /**
         * Checks if an IP is a trusted proxy provider.
         * Useful to tell if X-Forwarded-For data is possibly bogus.
-        * Squid cache servers for the site are whitelisted.
+        * CDN cache servers for the site are whitelisted.
         * @since 1.24
         *
         * @param string $ip
index 740df92..2dfc902 100644 (file)
@@ -176,7 +176,7 @@ class MWCryptHKDF {
                $context[] = gethostname();
 
                // Setup salt cache. Use APC, or fallback to the main cache if it isn't setup
-               $cache = ObjectCache::newAccelerator( $wgMainCacheType );
+               $cache = ObjectCache::getLocalServerInstance( $wgMainCacheType );
 
                if ( is_null( self::$singleton ) ) {
                        self::$singleton = new self( $secret, $wgHKDFAlgorithm, $cache, $context );
index 53c77c2..10606c1 100644 (file)
@@ -97,7 +97,8 @@ class MWCryptRand {
                                        }
                                }
                                // The absolute filename itself will differ from install to install so don't leave it out
-                               if ( ( $path = realpath( $file ) ) !== false ) {
+                               $path = realpath( $file );
+                               if ( $path !== false ) {
                                        $state .= $path;
                                } else {
                                        $state .= $file;
index 04c8e19..e2de900 100644 (file)
@@ -37,6 +37,7 @@ class UIDGenerator {
 
        protected $lockFile88; // string; local file path
        protected $lockFile128; // string; local file path
+       protected $lockFileUUID; // string; local file path
 
        /** @var array */
        protected $fileHandles = array(); // cache file handles
@@ -73,15 +74,17 @@ class UIDGenerator {
                        }
                        file_put_contents( $this->nodeIdFile, $nodeId ); // cache
                }
-               $this->nodeId32 = wfBaseConvert( substr( sha1( $nodeId ), 0, 8 ), 16, 2, 32 );
-               $this->nodeId48 = wfBaseConvert( $nodeId, 16, 2, 48 );
+               $this->nodeId32 = Wikimedia\base_convert( substr( sha1( $nodeId ), 0, 8 ), 16, 2, 32 );
+               $this->nodeId48 = Wikimedia\base_convert( $nodeId, 16, 2, 48 );
                // If different processes run as different users, they may have different temp dirs.
                // This is dealt with by initializing the clock sequence number and counters randomly.
                $this->lockFile88 = wfTempDir() . '/mw-' . __CLASS__ . '-UID-88';
                $this->lockFile128 = wfTempDir() . '/mw-' . __CLASS__ . '-UID-128';
+               $this->lockFileUUID = wfTempDir() . '/mw-' . __CLASS__ . '-UUID-128';
        }
 
        /**
+        * @todo: move to MW-specific factory class and inject temp dir
         * @return UIDGenerator
         */
        protected static function singleton() {
@@ -105,7 +108,7 @@ class UIDGenerator {
         *
         * @param int $base Specifies a base other than 10
         * @return string Number
-        * @throws MWException
+        * @throws RuntimeException
         */
        public static function newTimestampedUID88( $base = 10 ) {
                Assert::parameterType( 'integer', $base, '$base' );
@@ -113,18 +116,25 @@ class UIDGenerator {
                Assert::parameter( $base >= 2, '$base', 'must be >= 2' );
 
                $gen = self::singleton();
-               $time = $gen->getTimestampAndDelay( 'lockFile88', 1, 1024 );
-
-               return wfBaseConvert( $gen->getTimestampedID88( $time ), 2, $base );
+               $info = $gen->getTimeAndDelay( 'lockFile88', 1, 1024, 1024 );
+               $info['offsetCounter'] = $info['offsetCounter'] % 1024;
+               return Wikimedia\base_convert( $gen->getTimestampedID88( $info ), 2, $base );
        }
 
        /**
-        * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
+        * @param array $info The result of UIDGenerator::getTimeAndDelay() or
+        *  a plain (UIDGenerator::millitime(), counter, clock sequence) array.
         * @return string 88 bits
-        * @throws MWException
+        * @throws RuntimeException
         */
        protected function getTimestampedID88( array $info ) {
-               list( $time, $counter ) = $info;
+               if ( isset( $info['time'] ) ) {
+                       $time = $info['time'];
+                       $counter = $info['offsetCounter'];
+               } else {
+                       $time = $info[0];
+                       $counter = $info[1];
+               }
                // Take the 46 MSBs of "milliseconds since epoch"
                $id_bin = $this->millisecondsSinceEpochBinary( $time );
                // Add a 10 bit counter resulting in 56 bits total
@@ -133,7 +143,7 @@ class UIDGenerator {
                $id_bin .= $this->nodeId32;
                // Convert to a 1-27 digit integer string
                if ( strlen( $id_bin ) !== 88 ) {
-                       throw new MWException( "Detected overflow for millisecond timestamp." );
+                       throw new RuntimeException( "Detected overflow for millisecond timestamp." );
                }
 
                return $id_bin;
@@ -151,7 +161,7 @@ class UIDGenerator {
         *
         * @param int $base Specifies a base other than 10
         * @return string Number
-        * @throws MWException
+        * @throws RuntimeException
         */
        public static function newTimestampedUID128( $base = 10 ) {
                Assert::parameterType( 'integer', $base, '$base' );
@@ -159,19 +169,29 @@ class UIDGenerator {
                Assert::parameter( $base >= 2, '$base', 'must be >= 2' );
 
                $gen = self::singleton();
-               $time = $gen->getTimestampAndDelay( 'lockFile128', 16384, 1048576 );
+               $info = $gen->getTimeAndDelay( 'lockFile128', 16384, 1048576, 1048576 );
+               $info['offsetCounter'] = $info['offsetCounter'] % 1048576;
 
-               return wfBaseConvert( $gen->getTimestampedID128( $time ), 2, $base );
+               return Wikimedia\base_convert( $gen->getTimestampedID128( $info ), 2, $base );
        }
 
        /**
-        * @param array $info (UIDGenerator::millitime(), counter, clock sequence)
+        * @param array $info The result of UIDGenerator::getTimeAndDelay() or
+        *  a plain (UIDGenerator::millitime(), counter, clock sequence) array.
         * @return string 128 bits
-        * @throws MWException
+        * @throws RuntimeException
         */
        protected function getTimestampedID128( array $info ) {
-               list( $time, $counter, $clkSeq ) = $info;
-               // Take the 46 MSBs of "milliseconds since epoch"
+               if ( isset( $info['time'] ) ) {
+                       $time = $info['time'];
+                       $counter = $info['offsetCounter'];
+                       $clkSeq = $info['clkSeq'];
+               } else {
+                       $time = $info[0];
+                       $counter = $info[1];
+                       $clkSeq = $info[2];
+               }
+               // Take the 46 bits of "milliseconds since epoch"
                $id_bin = $this->millisecondsSinceEpochBinary( $time );
                // Add a 20 bit counter resulting in 66 bits total
                $id_bin .= str_pad( decbin( $counter ), 20, '0', STR_PAD_LEFT );
@@ -181,18 +201,86 @@ class UIDGenerator {
                $id_bin .= $this->nodeId48;
                // Convert to a 1-39 digit integer string
                if ( strlen( $id_bin ) !== 128 ) {
-                       throw new MWException( "Detected overflow for millisecond timestamp." );
+                       throw new RuntimeException( "Detected overflow for millisecond timestamp." );
                }
 
                return $id_bin;
        }
 
+       /**
+        * Return an RFC4122 compliant v1 UUID
+        *
+        * @return string
+        * @throws RuntimeException
+        * @since 1.27
+        */
+       public static function newUUIDv1() {
+               $gen = self::singleton();
+               // There can be up to 10000 intervals for the same millisecond timestamp.
+               // [0,4999] counter + [0,5000] offset is in [0,9999] for the offset counter.
+               // Add this onto the timestamp to allow making up to 5000 IDs per second.
+               return $gen->getUUIDv1( $gen->getTimeAndDelay( 'lockFileUUID', 16384, 5000, 5001 ) );
+       }
+
+       /**
+        * Return an RFC4122 compliant v1 UUID
+        *
+        * @return string 32 hex characters with no hyphens
+        * @throws RuntimeException
+        * @since 1.27
+        */
+       public static function newRawUUIDv1() {
+               return str_replace( '-', '', self::newUUIDv1() );
+       }
+
+       /**
+        * @param array $info Result of UIDGenerator::getTimeAndDelay()
+        * @return string 128 bits
+        */
+       protected function getUUIDv1( array $info ) {
+               $clkSeq_bin = Wikimedia\base_convert( $info['clkSeq'], 10, 2, 14 );
+               $time_bin = $this->intervalsSinceGregorianBinary( $info['time'], $info['offsetCounter'] );
+               // Take the 32 bits of "time low"
+               $id_bin = substr( $time_bin, 28, 32 );
+               // Add 16 bits of "time mid" resulting in 48 bits total
+               $id_bin .= substr( $time_bin, 12, 16 );
+               // Add 4 bit version resulting in 52 bits total
+               $id_bin .= '0001';
+               // Add 12 bits of "time high" resulting in 64 bits total
+               $id_bin .= substr( $time_bin, 0, 12 );
+               // Add 2 bits of "variant" resulting in 66 bits total
+               $id_bin .= '10';
+               // Add 6 bits of "clock seq high" resulting in 72 bits total
+               $id_bin .= substr( $clkSeq_bin, 0, 6 );
+               // Add 8 bits of "clock seq low" resulting in 80 bits total
+               $id_bin .= substr( $clkSeq_bin, 6, 8 );
+               // Add the 48 bit node ID resulting in 128 bits total
+               $id_bin .= $this->nodeId48;
+               // Convert to a 32 char hex string with dashes
+               if ( strlen( $id_bin ) !== 128 ) {
+                       throw new RuntimeException( "Detected overflow for millisecond timestamp." );
+               }
+               $hex = Wikimedia\base_convert( $id_bin, 2, 16, 32 );
+               return sprintf( '%s-%s-%s-%s-%s',
+                       // "time_low" (32 bits)
+                       substr( $hex, 0, 8 ),
+                       // "time_mid" (16 bits)
+                       substr( $hex, 8, 4 ),
+                       // "time_hi_and_version" (16 bits)
+                       substr( $hex, 12, 4 ),
+                       // "clk_seq_hi_res" (8 bits) and "clk_seq_low" (8 bits)
+                       substr( $hex, 16, 4 ),
+                       // "node" (48 bits)
+                       substr( $hex, 20, 12 )
+               );
+       }
+
        /**
         * Return an RFC4122 compliant v4 UUID
         *
         * @param int $flags Bitfield (supports UIDGenerator::QUICK_RAND)
         * @return string
-        * @throws MWException
+        * @throws RuntimeException
         */
        public static function newUUIDv4( $flags = 0 ) {
                $hex = ( $flags & self::QUICK_RAND )
@@ -206,7 +294,7 @@ class UIDGenerator {
                        substr( $hex, 8, 4 ),
                        // "time_hi_and_version" (16 bits)
                        '4' . substr( $hex, 12, 3 ),
-                       // "clk_seq_hi_res (8 bits, variant is binary 10x) and "clk_seq_low" (8 bits)
+                       // "clk_seq_hi_res" (8 bits, variant is binary 10x) and "clk_seq_low" (8 bits)
                        dechex( 0x8 | ( hexdec( $hex[15] ) & 0x3 ) ) . $hex[16] . substr( $hex, 17, 2 ),
                        // "node" (48 bits)
                        substr( $hex, 19, 12 )
@@ -218,7 +306,7 @@ class UIDGenerator {
         *
         * @param int $flags Bitfield (supports UIDGenerator::QUICK_RAND)
         * @return string 32 hex characters with no hyphens
-        * @throws MWException
+        * @throws RuntimeException
         */
        public static function newRawUUIDv4( $flags = 0 ) {
                return str_replace( '-', '', self::newUUIDv4( $flags ) );
@@ -265,15 +353,15 @@ class UIDGenerator {
         * @param int $count Number of IDs to return (1 to 10000)
         * @param int $flags (supports UIDGenerator::QUICK_VOLATILE)
         * @return array Ordered list of float integer values
-        * @throws MWException
+        * @throws RuntimeException
         */
        protected function getSequentialPerNodeIDs( $bucket, $bits, $count, $flags ) {
                if ( $count <= 0 ) {
                        return array(); // nothing to do
                } elseif ( $count > 10000 ) {
-                       throw new MWException( "Number of requested IDs ($count) is too high." );
+                       throw new RuntimeException( "Number of requested IDs ($count) is too high." );
                } elseif ( $bits < 16 || $bits > 48 ) {
-                       throw new MWException( "Requested bit size ($bits) is out of range." );
+                       throw new RuntimeException( "Requested bit size ($bits) is out of range." );
                }
 
                $counter = null; // post-increment persistent counter value
@@ -282,17 +370,13 @@ class UIDGenerator {
                // Counter values would not survive accross script instances in CLI mode.
                $cache = null;
                if ( ( $flags & self::QUICK_VOLATILE ) && PHP_SAPI !== 'cli' ) {
-                       try {
-                               $cache = ObjectCache::newAccelerator();
-                       } catch ( Exception $e ) {
-                               // not supported
-                       }
+                       $cache = ObjectCache::getLocalServerInstance();
                }
                if ( $cache ) {
                        $counter = $cache->incr( $bucket, $count );
                        if ( $counter === false ) {
                                if ( !$cache->add( $bucket, (int)$count ) ) {
-                                       throw new MWException( 'Unable to set value to ' . get_class( $cache ) );
+                                       throw new RuntimeException( 'Unable to set value to ' . get_class( $cache ) );
                                }
                                $counter = $count;
                        }
@@ -310,10 +394,10 @@ class UIDGenerator {
                        }
                        // Acquire the UID lock file
                        if ( $handle === false ) {
-                               throw new MWException( "Could not open '{$path}'." );
+                               throw new RuntimeException( "Could not open '{$path}'." );
                        } elseif ( !flock( $handle, LOCK_EX ) ) {
                                fclose( $handle );
-                               throw new MWException( "Could not acquire '{$path}'." );
+                               throw new RuntimeException( "Could not acquire '{$path}'." );
                        }
                        // Fetch the counter value and increment it...
                        rewind( $handle );
@@ -345,24 +429,24 @@ class UIDGenerator {
         * @param string $lockFile Name of a local lock file
         * @param int $clockSeqSize The number of possible clock sequence values
         * @param int $counterSize The number of possible counter values
+        * @param int $offsetSize The number of possible offset values
         * @return array (result of UIDGenerator::millitime(), counter, clock sequence)
-        * @throws MWException
+        * @throws RuntimeException
         */
-       protected function getTimestampAndDelay( $lockFile, $clockSeqSize, $counterSize ) {
+       protected function getTimeAndDelay( $lockFile, $clockSeqSize, $counterSize, $offsetSize ) {
                // Get the UID lock file handle
-               $path = $this->$lockFile;
-               if ( isset( $this->fileHandles[$path] ) ) {
-                       $handle = $this->fileHandles[$path];
+               if ( isset( $this->fileHandles[$lockFile] ) ) {
+                       $handle = $this->fileHandles[$lockFile];
                } else {
-                       $handle = fopen( $path, 'cb+' );
-                       $this->fileHandles[$path] = $handle ?: null; // cache
+                       $handle = fopen( $this->$lockFile, 'cb+' );
+                       $this->fileHandles[$lockFile] = $handle ?: null; // cache
                }
                // Acquire the UID lock file
                if ( $handle === false ) {
-                       throw new MWException( "Could not open '{$this->$lockFile}'." );
+                       throw new RuntimeException( "Could not open '{$this->$lockFile}'." );
                } elseif ( !flock( $handle, LOCK_EX ) ) {
                        fclose( $handle );
-                       throw new MWException( "Could not acquire '{$this->$lockFile}'." );
+                       throw new RuntimeException( "Could not acquire '{$this->$lockFile}'." );
                }
                // Get the current timestamp, clock sequence number, last time, and counter
                rewind( $handle );
@@ -384,13 +468,13 @@ class UIDGenerator {
                                $counter = (int)$data[3] % $counterSize;
                                if ( ++$counter >= $counterSize ) { // sanity (starts at 0)
                                        flock( $handle, LOCK_UN ); // abort
-                                       throw new MWException( "Counter overflow for timestamp value." );
+                                       throw new RuntimeException( "Counter overflow for timestamp value." );
                                }
                        }
                } else { // last UID info not initialized
                        $clkSeq = mt_rand( 0, $clockSeqSize - 1 );
                        $counter = 0;
-                       $offset = mt_rand( 0, $counterSize - 1 );
+                       $offset = mt_rand( 0, $offsetSize - 1 );
                        $time = self::millitime();
                }
                // microtime() and gettimeofday() can drift from time() at least on Windows.
@@ -400,14 +484,14 @@ class UIDGenerator {
                        // We don't want processes using too high or low timestamps to avoid duplicate
                        // UIDs and clock sequence number churn. This process should just be restarted.
                        flock( $handle, LOCK_UN ); // abort
-                       throw new MWException( "Process clock is outdated or drifted." );
+                       throw new RuntimeException( "Process clock is outdated or drifted." );
                }
                // If microtime() is synced and a clock change was detected, then the clock went back
                if ( $clockChanged ) {
                        // Bump the clock sequence number and also randomize the counter offset,
                        // which is useful for UIDs that do not include the clock sequence number.
                        $clkSeq = ( $clkSeq + 1 ) % $clockSeqSize;
-                       $offset = mt_rand( 0, $counterSize - 1 );
+                       $offset = mt_rand( 0, $offsetSize - 1 );
                        trigger_error( "Clock was set back; sequence number incremented." );
                }
                // Update the (clock sequence number, timestamp, counter)
@@ -418,7 +502,13 @@ class UIDGenerator {
                // Release the UID lock file
                flock( $handle, LOCK_UN );
 
-               return array( $time, ( $counter + $offset ) % $counterSize, $clkSeq );
+               return array(
+                       'time'          => $time,
+                       'counter'       => $counter,
+                       'clkSeq'        => $clkSeq,
+                       'offset'        => $offset,
+                       'offsetCounter' => $counter + $offset
+               );
        }
 
        /**
@@ -442,17 +532,47 @@ class UIDGenerator {
        /**
         * @param array $time Result of UIDGenerator::millitime()
         * @return string 46 MSBs of "milliseconds since epoch" in binary (rolls over in 4201)
-        * @throws MWException
+        * @throws RuntimeException
         */
        protected function millisecondsSinceEpochBinary( array $time ) {
                list( $sec, $msec ) = $time;
                $ts = 1000 * $sec + $msec;
                if ( $ts > pow( 2, 52 ) ) {
-                       throw new MWException( __METHOD__ .
+                       throw new RuntimeException( __METHOD__ .
                                ': sorry, this function doesn\'t work after the year 144680' );
                }
 
-               return substr( wfBaseConvert( $ts, 10, 2, 46 ), -46 );
+               return substr( Wikimedia\base_convert( $ts, 10, 2, 46 ), -46 );
+       }
+
+       /**
+        * @param array $time Result of UIDGenerator::millitime()
+        * @param integer $delta Number of intervals to add on to the timestamp
+        * @return string 60 bits of "100ns intervals since 15 October 1582" (rolls over in 3400)
+        * @throws RuntimeException
+        */
+       protected function intervalsSinceGregorianBinary( array $time, $delta = 0 ) {
+               list( $sec, $msec ) = $time;
+               $offset = '122192928000000000';
+               if ( PHP_INT_SIZE >= 8 ) { // 64 bit integers
+                       $ts = ( 1000 * $sec + $msec ) * 10000 + (int)$offset + $delta;
+                       $id_bin = str_pad( decbin( $ts % pow( 2, 60 ) ), 60, '0', STR_PAD_LEFT );
+               } elseif ( extension_loaded( 'gmp' ) ) {
+                       $ts = gmp_add( gmp_mul( (string) $sec, '1000' ), (string) $msec ); // ms
+                       $ts = gmp_add( gmp_mul( $ts, '10000' ), $offset ); // 100ns intervals
+                       $ts = gmp_add( $ts, (string) $delta );
+                       $ts = gmp_mod( $ts, gmp_pow( '2', '60' ) ); // wrap around
+                       $id_bin = str_pad( gmp_strval( $ts, 2 ), 60, '0', STR_PAD_LEFT );
+               } elseif ( extension_loaded( 'bcmath' ) ) {
+                       $ts = bcadd( bcmul( $sec, 1000 ), $msec ); // ms
+                       $ts = bcadd( bcmul( $ts, 10000 ), $offset ); // 100ns intervals
+                       $ts = bcadd( $ts, $delta );
+                       $ts = bcmod( $ts, bcpow( 2, 60 ) ); // wrap around
+                       $id_bin = Wikimedia\base_convert( $ts, 10, 2, 60 );
+               } else {
+                       throw new RuntimeException( 'bcmath or gmp extension required for 32 bit machines.' );
+               }
+               return $id_bin;
        }
 
        /**
index 5550a21..c262b40 100644 (file)
@@ -15,6 +15,8 @@ class TitleInputWidget extends \OOUI\TextInputWidget {
        protected $namespace = null;
        protected $relative = null;
        protected $suggestions = null;
+       protected $highlightFirst = null;
+       protected $validateTitle = null;
 
        /**
         * @param array $config Configuration options
@@ -22,6 +24,10 @@ class TitleInputWidget extends \OOUI\TextInputWidget {
         * @param bool|null $config['relative'] If a namespace is set,
         *  return a title relative to it (default: true)
         * @param bool|null $config['suggestions'] Display search suggestions (default: true)
+        * @param bool|null $config['highlightFirst'] Automatically highlight
+        *  the first result (default: true)
+        * @param bool|null $config['validateTitle'] Whether the input must
+        *  be a valid title (default: true)
         */
        public function __construct( array $config = array() ) {
                // Parent constructor
@@ -39,6 +45,12 @@ class TitleInputWidget extends \OOUI\TextInputWidget {
                if ( isset( $config['suggestions'] ) ) {
                        $this->suggestions = $config['suggestions'];
                }
+               if ( isset( $config['highlightFirst'] ) ) {
+                       $this->highlightFirst = $config['highlightFirst'];
+               }
+               if ( isset( $config['validateTitle'] ) ) {
+                       $this->validateTitle = $config['validateTitle'];
+               }
 
                // Initialization
                $this->addClasses( array( 'mw-widget-titleInputWidget' ) );
@@ -58,6 +70,12 @@ class TitleInputWidget extends \OOUI\TextInputWidget {
                if ( $this->suggestions !== null ) {
                        $config['suggestions'] = $this->suggestions;
                }
+               if ( $this->highlightFirst !== null ) {
+                       $config['highlightFirst'] = $this->highlightFirst;
+               }
+               if ( $this->validateTitle !== null ) {
+                       $config['validateTitle'] = $this->validateTitle;
+               }
                return parent::getConfig( $config );
        }
 }
index 67bd0c9..2423092 100644 (file)
--- a/index.php
+++ b/index.php
@@ -32,7 +32,9 @@
 
 // Bail on old versions of PHP, or if composer has not been run yet to install
 // dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
+// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
 require_once dirname( __FILE__ ) . '/includes/PHPVersionCheck.php';
+// @codingStandardsIgnoreEnd
 wfEntryPointCheck( 'index.php' );
 
 require __DIR__ . '/includes/WebStart.php';
index 50ed513..69f518b 100644 (file)
@@ -147,7 +147,7 @@ class Language {
 
        /**
         * Cache for language names
-        * @var MapCacheLRU|null
+        * @var HashBagOStuff|null
         */
        static private $languageNameCache;
 
@@ -207,10 +207,7 @@ class Language {
         * @return Language
         */
        protected static function newFromCode( $code ) {
-               // Protect against path traversal below
-               if ( !Language::isValidCode( $code )
-                       || strcspn( $code, ":/\\\000" ) !== strlen( $code )
-               ) {
+               if ( !Language::isValidCode( $code ) ) {
                        throw new MWException( "Invalid language code \"$code\"" );
                }
 
@@ -224,7 +221,6 @@ class Language {
 
                // Check if there is a language class for the code
                $class = self::classFromCode( $code );
-               self::preloadLanguageClass( $class );
                if ( class_exists( $class ) ) {
                        $lang = new $class;
                        return $lang;
@@ -238,9 +234,8 @@ class Language {
                        }
 
                        $class = self::classFromCode( $fallbackCode );
-                       self::preloadLanguageClass( $class );
                        if ( class_exists( $class ) ) {
-                               $lang = Language::newFromCode( $fallbackCode );
+                               $lang = new $class;
                                $lang->setCode( $code );
                                return $lang;
                        }
@@ -341,17 +336,16 @@ class Language {
         */
        public static function isValidCode( $code ) {
                static $cache = array();
-               if ( isset( $cache[$code] ) ) {
-                       return $cache[$code];
+               if ( !isset( $cache[$code] ) ) {
+                       // People think language codes are html safe, so enforce it.
+                       // Ideally we should only allow a-zA-Z0-9-
+                       // but, .+ and other chars are often used for {{int:}} hacks
+                       // see bugs 37564, 37587, 36938
+                       $cache[$code] =
+                               // Protect against path traversal
+                               strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
+                               && !preg_match( MediaWikiTitleCodec::getTitleInvalidRegex(), $code );
                }
-               // People think language codes are html safe, so enforce it.
-               // Ideally we should only allow a-zA-Z0-9-
-               // but, .+ and other chars are often used for {{int:}} hacks
-               // see bugs 37564, 37587, 36938
-               $cache[$code] =
-                       strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code )
-                       && !preg_match( MediaWikiTitleCodec::getTitleInvalidRegex(), $code );
-
                return $cache[$code];
        }
 
@@ -411,35 +405,6 @@ class Language {
                return false;
        }
 
-       /**
-        * @param string $code
-        * @return string Name of the language class
-        */
-       public static function classFromCode( $code ) {
-               if ( $code == 'en' ) {
-                       return 'Language';
-               } else {
-                       return 'Language' . str_replace( '-', '_', ucfirst( $code ) );
-               }
-       }
-
-       /**
-        * Includes language class files
-        *
-        * @param string $class Name of the language class
-        */
-       public static function preloadLanguageClass( $class ) {
-               global $IP;
-
-               if ( $class === 'Language' ) {
-                       return;
-               }
-
-               if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
-                       include_once "$IP/languages/classes/$class.php";
-               }
-       }
-
        /**
         * Get the LocalisationCache instance
         *
@@ -886,11 +851,11 @@ class Language {
                $cacheKey = $inLanguage === null ? 'null' : $inLanguage;
                $cacheKey .= ":$include";
                if ( self::$languageNameCache === null ) {
-                       self::$languageNameCache = new MapCacheLRU( 20 );
+                       self::$languageNameCache = new HashBagOStuff( array( 'maxKeys' => 20 ) );
                }
-               if ( self::$languageNameCache->has( $cacheKey ) ) {
-                       $ret = self::$languageNameCache->get( $cacheKey );
-               } else {
+
+               $ret = self::$languageNameCache->get( $cacheKey );
+               if ( !$ret ) {
                        $ret = self::fetchLanguageNamesUncached( $inLanguage, $include );
                        self::$languageNameCache->set( $cacheKey, $ret );
                }
@@ -3691,8 +3656,9 @@ class Language {
                                # We got the first byte only of a multibyte char; remove it.
                                $string = substr( $string, 0, -1 );
                        } elseif ( $char >= 0x80 &&
+                               // Use the /s modifier (PCRE_DOTALL) so (.*) also matches newlines
                                preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
-                                       '[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m )
+                                       '[\xf0-\xf7][\x80-\xbf]{1,2})$/s', $string, $m )
                        ) {
                                # We chopped in the middle of a character; remove it
                                $string = $m[1];
@@ -4406,22 +4372,6 @@ class Language {
                $this->mParentLanguage = false;
        }
 
-       /**
-        * Get the name of a file for a certain language code
-        * @param string $prefix Prepend this to the filename
-        * @param string $code Language code
-        * @param string $suffix Append this to the filename
-        * @throws MWException
-        * @return string $prefix . $mangledCode . $suffix
-        */
-       public static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
-               if ( !self::isValidBuiltInCode( $code ) ) {
-                       throw new MWException( "Invalid language code \"$code\"" );
-               }
-
-               return $prefix . str_replace( '-', '_', ucfirst( $code ) ) . $suffix;
-       }
-
        /**
         * Get the language code from a file name. Inverse of getFileName()
         * @param string $filename $prefix . $languageCode . $suffix
@@ -4439,6 +4389,34 @@ class Language {
                return str_replace( '_', '-', strtolower( $m[1] ) );
        }
 
+       /**
+        * @param string $code
+        * @return string Name of the language class
+        */
+       public static function classFromCode( $code ) {
+               if ( $code == 'en' ) {
+                       return 'Language';
+               } else {
+                       return 'Language' . str_replace( '-', '_', ucfirst( $code ) );
+               }
+       }
+
+       /**
+        * Get the name of a file for a certain language code
+        * @param string $prefix Prepend this to the filename
+        * @param string $code Language code
+        * @param string $suffix Append this to the filename
+        * @throws MWException
+        * @return string $prefix . $mangledCode . $suffix
+        */
+       public static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
+               if ( !self::isValidBuiltInCode( $code ) ) {
+                       throw new MWException( "Invalid language code \"$code\"" );
+               }
+
+               return $prefix . str_replace( '-', '_', ucfirst( $code ) ) . $suffix;
+       }
+
        /**
         * @param string $code
         * @return string
@@ -4465,15 +4443,6 @@ class Language {
                return "$IP/languages/i18n/$code.json";
        }
 
-       /**
-        * @param string $code
-        * @return string
-        */
-       public static function getClassFileName( $code ) {
-               global $IP;
-               return self::getFileName( "$IP/languages/classes/Language", $code, '.php' );
-       }
-
        /**
         * Get the first fallback for a given language.
         *
@@ -4482,12 +4451,11 @@ class Language {
         * @return bool|string
         */
        public static function getFallbackFor( $code ) {
-               if ( $code === 'en' || !Language::isValidBuiltInCode( $code ) ) {
-                       return false;
-               } else {
-                       $fallbacks = self::getFallbacksFor( $code );
+               $fallbacks = self::getFallbacksFor( $code );
+               if ( $fallbacks ) {
                        return $fallbacks[0];
                }
+               return false;
        }
 
        /**
index 2199467..f9ebdec 100644 (file)
@@ -35,8 +35,7 @@ class LanguageAz extends Language {
        function ucfirst( $string ) {
                if ( $string[0] == 'i' ) {
                        return 'İ' . substr( $string, 1 );
-               } else {
-                       return parent::ucfirst( $string );
                }
+               return parent::ucfirst( $string );
        }
 }
index eab08fe..0cd0c0d 100644 (file)
@@ -57,9 +57,8 @@ class LanguageKaa extends Language {
        function ucfirst( $string ) {
                if ( substr( $string, 0, 1 ) === 'i' ) {
                        return 'İ' . substr( $string, 1 );
-               } else {
-                       return parent::ucfirst( $string );
                }
+               return parent::ucfirst( $string );
        }
 
        /**
@@ -72,9 +71,8 @@ class LanguageKaa extends Language {
        function lcfirst( $string ) {
                if ( substr( $string, 0, 1 ) === 'I' ) {
                        return 'ı' . substr( $string, 1 );
-               } else {
-                       return parent::lcfirst( $string );
                }
+               return parent::lcfirst( $string );
        }
 
        /**
index b8af885..0f60889 100644 (file)
@@ -422,13 +422,13 @@ class LanguageKk extends LanguageKk_cyrl {
         * @return string
         */
        function ucfirst( $string ) {
-               $variant = $this->getPreferredVariant();
-               if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'i' ) {
-                       $string = 'İ' . substr( $string, 1 );
-               } else {
-                       $string = parent::ucfirst( $string );
+               if ( $string[0] == 'i' ) {
+                       $variant = $this->getPreferredVariant();
+                       if ( $variant == 'kk-latn' || $variant == 'kk-tr' ) {
+                               return 'İ' . substr( $string, 1 );
+                       }
                }
-               return $string;
+               return parent::ucfirst( $string );
        }
 
        /**
@@ -439,13 +439,13 @@ class LanguageKk extends LanguageKk_cyrl {
         * @return string
         */
        function lcfirst( $string ) {
-               $variant = $this->getPreferredVariant();
-               if ( ( $variant == 'kk-latn' || $variant == 'kk-tr' ) && $string[0] == 'I' ) {
-                       $string = 'ı' . substr( $string, 1 );
-               } else {
-                       $string = parent::lcfirst( $string );
+               if ( $string[0] == 'I' ) {
+                       $variant = $this->getPreferredVariant();
+                       if ( $variant == 'kk-latn' || $variant == 'kk-tr' ) {
+                               return 'ı' . substr( $string, 1 );
+                       }
                }
-               return $string;
+               return parent::lcfirst( $string );
        }
 
        /**
index 8431c3f..a4f05f8 100644 (file)
@@ -40,9 +40,8 @@ class LanguageTr extends Language {
        function ucfirst( $string ) {
                if ( strlen( $string ) && $string[0] == 'i' ) {
                        return 'İ' . substr( $string, 1 );
-               } else {
-                       return parent::ucfirst( $string );
                }
+               return parent::ucfirst( $string );
        }
 
        /**
@@ -52,9 +51,8 @@ class LanguageTr extends Language {
        function lcfirst( $string ) {
                if ( strlen( $string ) && $string[0] == 'I' ) {
                        return 'ı' . substr( $string, 1 );
-               } else {
-                       return parent::lcfirst( $string );
                }
+               return parent::lcfirst( $string );
        }
 
 }
index 5a8466f..f27094d 100644 (file)
@@ -19,6 +19,7 @@
        "tog-hideminor": "ЗэхъокӀ цIыкIухэр бэмышIхэм къащымгъэлъагъу",
        "tog-hidepatrolled": "УплъэкIужьыгъэ зэхъокӀхэр бэмышIхэм къащымгъэлъагъу",
        "tog-newpageshidepatrolled": "НэкIубгъуакIэ купым и уплъэкIужьыгъэ нэкIубгъохэр гъэбылъ",
+       "tog-hidecategorization": "НэкIубгъомэ я категоризацие Iух",
        "tog-extendwatchlist": "КӀэлъыплъэ тхылъыр зэхэщ зэхъокӀ пстэур плъэгъунэу, бэмышӀхэм ямызакъоу",
        "tog-usenewrc": "БэмышI зэхъокIхэм ыкIи лъыплъэ купым щыщ зэхъокIхэр куп-купэу гъэзаф",
        "tog-numberheadings": "Аутоматэу цӀэшъхьаӀхэм номер ятын",
        "internalerror": "ЫкIоцI хэукъоныгъэ",
        "internalerror_info": "ЫкIоцI фыкъуагъэ: $1",
        "filecopyerror": "\"$1\"-файлыр \"$2\"-м копи шIын лъэкIыгъэп.",
-       "filerenameerror": "Файлэу \"$1\" ыц1э \"$2\" фэдэу хъожьын лъэкIырэп.",
+       "filerenameerror": "Файлэу \"$1\" ыцIэ \"$2\" фэдэу хъожьын лъэкIырэп.",
        "filedeleteerror": "Файлэу \"$1\" тегъэкIын лъэкIырэп.",
        "directorycreateerror": "Директориеу \"$1\" къэублэн лъэкIыгъэп.",
        "directoryreadonlyerror": "Директориер \"$1\" еджэн пэе закъу.",
        "cannotdelete-title": "НэкIубгъоу \"$1\" тегъэкIыгъэн лъэкIырэп",
        "badtitle": "ЦӀэ дэгъуэп",
        "badtitletext": "УзкIэупчIэрэ нэкIубгъом ыцIэр къуанчэ, е нэкIы, е бзэзэпыщэ е интервики гъэнэфагъэп.\nМыхъущт символ агъэфедагъэнкIи мэхъу.",
-       "title-invalid-characters": "УзыкIэупчIэрэ нэкIубгъуацIэм символ фыкъуагъэ хэт: \"$1\".",
+       "title-invalid-characters": "УзкIэупчIэрэ нэкIубгъуацIэм символ фыкъуагъэ хэт: \"$1\".",
        "viewsource": "Еплъ лъапсэм",
        "viewsource-title": "Еплъ лъапсэм $1 пае",
        "protectedpagetext": "ЕIэзэнхэм ыкIи нэмыкI шIэнмэ яягъэ къэмыкIынэу мы нэкIубгъор ухъумагъэу щыт.",
        "createaccountreason": "ЗыпкъырыкIырэр:",
        "createacct-reason": "ЗыпкъырыкIырэр:",
        "createacct-reason-ph": "Сыда пэмыкI аккаунт зэкIэублэрэр?",
-       "createacct-captcha": "Щынэгъончъэгъэ уплъэкӀун",
-       "createacct-imgcaptcha-ph": "ЫшъхьагъкӀэ плъэгъурэ текстыр итх",
        "createacct-submit": "Уи аккаунт бгъэпсын",
-       "createacct-another-submit": "Ð\9dÑ\8dмÑ\8bкI Ð°ÐºÐºÐ°Ñ\83нÑ\82 ÐºÑ\8aÑ\8dÑ\83бл",
+       "createacct-another-submit": "Ð\90ккаÑ\83нÑ\82 Ñ\83блÑ\8d",
        "createacct-benefit-heading": "{{SITENAME}}-м ощ фэдэхэр дэлажьэх.",
        "createacct-benefit-body1": "{{PLURAL:$1|еӀэзэныгъэ|еӀэзэныгъ}}",
        "createacct-benefit-body2": "{{PLURAL:$1|нэкӀубгъо|нэкӀубгъу}}",
        "passwordreset-email": "Емэйл адрес:",
        "passwordreset-emailtitle": "Аккаунт и гъэпсыкIэхэр, мий щыI {{SITENAME}}",
        "passwordreset-emailelement": "НэбгырацIэ: \n$1\n\nTemporary password: \n$2",
-       "passwordreset-emailsent": "ШÑ\8aÑ\8dÑ\84гÑ\83Ñ\89Ñ\8b\8dм Ð¸ Ð·Ñ\8dÑ\82едзÑ\8bм Ð¿Ð°Ðµ ÐµÐ¼Ñ\8dйл Ð°Ð³Ñ\8aÑ\8dÑ\85Ñ\8cÑ\8bгÑ\8a.",
+       "passwordreset-emailsent": "Ð\9cÑ\8bÑ\80 Ñ\80егиÑ\81Ñ\82Ñ\80Ñ\8bгÑ\8aÑ\8d ÐµÐ¼Ñ\8dйлÑ\8dÑ\83 Ñ\89Ñ\8bÑ\82мÑ\8d Ñ\83и Ð°ÐºÐºÐ°Ñ\83нÑ\82Ñ\8bм Ð¿Ð°Ðµ, Ñ\88Ñ\8aÑ\8dÑ\84гÑ\83Ñ\89Ñ\8b\8dм Ð¸ Ð·Ñ\8dÑ\82едз ÐµÐ¼Ñ\8dйл ÐºÑ\8aÑ\8bпÑ\84агÑ\8aÑ\8dÑ\85Ñ\8cÑ\8bÑ\89Ñ\82.",
        "passwordreset-emailsent-capture": "ШъэфгущыIэм изэтедз фэгъэхьыгъэ емэйлыр гъахьыгъэ, ычIэгъкIэ ар олъэгъу.",
-       "changeemail": "Зэблэхъу емэйл адресыр",
+       "changeemail": "Зэблэхъу е тегъэкI емэйл адресыр",
        "changeemail-no-info": "Мы нэкIубгъом занкIэу укIонэу уфаемэ, системэм ухэхьэгъэн фае.",
        "changeemail-oldemail": "Джырэ емэйл адрес:",
        "changeemail-newemail": "Емэйл адресыкIэр:",
        "prefs-watchlist-token": "Лъыплъэ купым и токен:",
        "prefs-misc": "ПэмыкI гъэпсыкIэхэр",
        "prefs-resetpass": "ШъэфгущыIэр зэблэхъу",
-       "prefs-changeemail": "Зэблэхъу емэйл адресыр",
+       "prefs-changeemail": "Зэблэхъу е тегъэкI емэйл адресыр",
        "prefs-setemail": "Игъахь уи емэйл адресыр",
        "prefs-email": "Емэйл гъэпсыкIэхэр",
        "prefs-rendering": "Ышъотеплъэ",
        "upload-dialog-button-done": "ЗэшIуэкIыгъэ",
        "upload-dialog-button-save": "Итх",
        "upload-dialog-button-upload": "Илъхь",
-       "upload-process-error": "Фыкъуагъэ горэ хъугъэ",
        "upload-form-label-select-file": "Къыхэх файл",
        "upload-form-label-infoform-title": "Къэбар",
        "upload-form-label-infoform-name": "ЦIэ",
        "deletepage": "ТегъэкI нэкIубгъор",
        "confirm": "Теубыт",
        "excontent": "дэтхэгъагъэр: \"$1\"",
-       "excontentauthor": "дэтхэгъагъэр: \"$1\" (хэлэжьэкIо закъоэр \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "дэтхагъэщтыгъэхэр: \"$1\", ыкIи хэлэжьэкIо закъощтыгъэр \"[[Special:Contributions/$2|$2]]\"([[User talk:$2|тегущыIэн]])",
        "delete-confirm": "ТегъэкI \"$1\"",
        "delete-legend": "ТегъэкI",
        "actioncomplete": "ЗэшIогъэкIыгъэ",
index 2499aee..51e930c 100644 (file)
        "createaccountreason": "Rede:",
        "createacct-reason": "Rede",
        "createacct-reason-ph": "Hoekom u nog 'n rekening skep",
-       "createacct-captcha": "Veiligheidskontrole",
-       "createacct-imgcaptcha-ph": "Sleutel die teks hierbo in",
        "createacct-submit": "Skep u rekening",
        "createacct-another-submit": "Skep nog 'n rekening",
        "createacct-benefit-heading": "{{SITENAME}} word deur mense soos u geskep.",
        "columns": "Kolomme",
        "searchresultshead": "Soekresultate",
        "stub-threshold": "Drempel vir merk as <a href=\"#\" class=\"stub\">saadjie</a> (grepe):",
+       "stub-threshold-sample-link": "voorbeeld",
        "stub-threshold-disabled": "Afgeskakel",
        "recentchangesdays": "Aantal dae wat in onlangse wysigings vertoon word:",
        "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|dag|dae}}",
        "rcshowhidemine": "$1 my wysigings",
        "rcshowhidemine-show": "Wys",
        "rcshowhidemine-hide": "Versteek",
+       "rcshowhidecategorization-show": "Wys",
+       "rcshowhidecategorization-hide": "Versteek",
        "rclinks": "Vertoon die laaste $1 wysigings in die afgelope $2 dae<br />$3",
        "diff": "verskil",
        "hist": "geskiedenis",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|gebruiker|gebruikers}} hou die bladsy dop]",
-       "rc_categories": "Beperk tot kategorië (skei met \"|\")",
-       "rc_categories_any": "Enige",
+       "rc_categories": "Beperk tot kategorieë (skei met \"|\"):",
+       "rc_categories_any": "Enige van die gekose",
        "rc-change-size-new": "$1 {{PLURAL:$1|greep|grepe}} na die wysiging",
        "newsectionsummary": "/* $1 */ nuwe afdeling",
        "rc-enhanced-expand": "Wys details",
        "recentchangeslinked-summary": "Hier volg 'n lys van wysigings wat onlangs gemaak is aan bladsye wat van die gespesifiseerde bladsy geskakel word (of van bladsye van die gespesifiseerde kategorie).\nBladsye op [[Special:Watchlist|u dophoulys]] word in '''vetdruk''' uitgewys.",
        "recentchangeslinked-page": "Bladsynaam:",
        "recentchangeslinked-to": "Besigtig wysigings aan bladsye met skakels na die bladsy",
+       "recentchanges-page-added-to-category": "[[:$1]] by kategorie gevoeg",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] en {{PLURAL:$2|een bladsy|$2 bladsye}} by kategorie gevoeg",
+       "recentchanges-page-removed-from-category": "[[:$1]] uit kategorie verwyder",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] en {{PLURAL:$2|een bladsy|$2 bladsye}} van kategorie verwyder",
+       "autochange-username": "Outomatiese MediaWiki-wysiging",
        "upload": "Laai lêer",
        "uploadbtn": "Laai lêer",
        "reuploaddesc": "Keer terug na die laaivorm.",
        "upload-form-label-infoform-description": "Beskrywing",
        "upload-form-label-usage-title": "Gebruik",
        "upload-form-label-usage-filename": "Lêernaam",
+       "foreign-structured-upload-form-label-own-work": "Dit is my eie werk",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorieë",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
        "backend-fail-stream": "Kon nie die lêer $1 uitstroom nie.",
        "backend-fail-backup": "Kon nie 'n rugsteunkopie van die lêer $1 maak nie.",
        "backend-fail-notexists": "Die lêer $1 bestaan nie.",
        "wlheader-showupdated": "Bladsye wat verander is sedert u hulle laas besoek het word in '''vetdruk''' uitgewys.",
        "wlnote": "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}, soos vanaf $3 om $4.",
        "wlshowlast": "Wys afgelope $1 ure, $2 dae of",
+       "watchlistall2": "alles",
+       "watchlist-hide": "Versteek",
+       "wlshowtime": "Wys laaste:",
+       "wlshowhideminor": "klein wysigings",
+       "wlshowhidebots": "robotte",
+       "wlshowhideliu": "geregistreerde gebruikers",
+       "wlshowhideanons": "anonieme gebruikers",
+       "wlshowhidepatr": "gekontroleerde wysigings",
+       "wlshowhidemine": "my wysigings",
        "watchlist-options": "Opsies vir dophoulys",
        "watching": "Plaas op dophoulys...",
        "unwatching": "Verwyder van dophoulys...",
        "movenosubpage": "Die bladsy het geen subbladsye nie.",
        "movereason": "Rede:",
        "revertmove": "rol terug",
-       "delete_and_move": "Skrap en skuif",
        "delete_and_move_text": "==Skrapping benodig==\n\nDie teikenartikel \"[[:$1]]\" bestaan reeds. Wil u dit skrap om plek te maak vir die skuif?",
        "delete_and_move_confirm": "Ja, skrap die bladsy",
        "delete_and_move_reason": "Geskrap om plek te maak vir skuif vanaf \"[[$1]]\"",
        "htmlform-cloner-required": "Ten minste één waarde verwag.",
        "htmlform-title-badnamespace": "[[:$1]] is nie in die \"{{ns:$2}}\" naamspasie nie.",
        "htmlform-title-not-creatable": "\"$1\" is nie 'n aanvaarbare blad titel nie",
-       "htmlform-title-not-exists": "[[:$1]] bestaan nie.",
+       "htmlform-title-not-exists": "$1 bestaan nie.",
        "sqlite-has-fts": "Weergawe $1 met ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "sqlite-no-fts": "Weergawe $1 sonder ondersteuning vir vol-teks soektogte (\"full-text search\")",
        "logentry-delete-delete": "$1 {{GENDER:$2|het}} bladsy $3 verwyder",
        "feedback-bugornote": "As u reg is om 'n tegniese probleem in detail te beskryf, [$1 rapporteer 'n fout].\nAnders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die bladsy \"[$3 $2]\", saam met u gebruikersnaam en die webblaaier wat u gebruik gevoeg word.",
        "feedback-cancel": "Kanselleer",
        "feedback-close": "Gedoen",
+       "feedback-error-title": "Fout",
        "feedback-error1": "Fout: onbekende resultaat van die API",
        "feedback-error2": "Fout: Wysiging het gefaal",
        "feedback-error3": "Fout: Geen reaksie van API",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-minus": "minusteken",
        "mw-widgets-dateinput-no-date": "Geen datum gekies nie",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
index 67c3b84..1a3c8d3 100644 (file)
@@ -62,6 +62,7 @@
        "tog-hideminor": "أخف التعديلات الطفيفة في أحدث التغييرات",
        "tog-hidepatrolled": "أخف التعديلات المراجعة في أحدث التغييرات",
        "tog-newpageshidepatrolled": "أخف الصفحات المعاينة من قائمة الصفحات الجديدة",
+       "tog-hidecategorization": "أخف تصنيف الصفحات",
        "tog-extendwatchlist": "مدد قائمة المراقبة لتعرض كل التغييرات، وليس أحدثها فقط",
        "tog-usenewrc": "طي التغييرات حسب الصفحة في أحدث التغييرات وقائمة المراقبة",
        "tog-numberheadings": "ترقيم العناوين تلقائيا",
@@ -91,6 +92,7 @@
        "tog-watchlisthideliu": "أخف تعديلات المستخدمين المسجلين في قائمة المراقبة",
        "tog-watchlisthideanons": "أخف تعديلات المستخدمين المجهولين في قائمة المراقبة",
        "tog-watchlisthidepatrolled": " أخف التعديلات المراجعة في قائمة المراقبة",
+       "tog-watchlisthidecategorization": "أخف تصنيف الصفحات",
        "tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
        "tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
        "tog-showhiddencats": "أظهر التصنيفات المخفية",
        "morenotlisted": "هذه القائمة غير مكتملة.",
        "mypage": "صفحة",
        "mytalk": "نقاش",
-       "anontalk": "نقاش عنوان الآي بي",
+       "anontalk": "نقاش",
        "navigation": "تصفح",
        "and": "&#32;و",
        "qbfind": "جد",
        "createaccountreason": "السبب:",
        "createacct-reason": "السبب",
        "createacct-reason-ph": "لماذا تقوم بإنشاء حساب آخر",
-       "createacct-captcha": "تحقق أمني",
-       "createacct-imgcaptcha-ph": "أدخل النص الذي تراه في الأعلى",
        "createacct-submit": "افتح الحساب",
        "createacct-another-submit": "أنشئ حسابا",
-       "createacct-benefit-heading": "موقع {{SITENAME}} أنشأه أشخاص مثلك.",
+       "createacct-benefit-heading": "{{SITENAME}} موقع يساهم فيه أشخاص مثلك.",
        "createacct-benefit-body1": "{{PLURAL:$1|تحريرا|تحريرات}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحة}}",
        "createacct-benefit-body3": "آخر {{PLURAL:$1|مساهم|مساهمين}}",
        "passwordreset-emailtext-ip": "أحد ما (قد يكون أنت، من العنوان $1)  طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
        "passwordreset-emailtext-user": "المستخدم $1 على {{SITENAME}} طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
        "passwordreset-emailelement": "اسم {{GENDER:$1\n|المستخدم|المستخدمة}}: \n$1\n\nكلمة السر المؤقتة: \n$2",
-       "passwordreset-emailsent": "أُرسل بريد إلكتروني لإعادة ضبط كلمة السر.",
+       "passwordreset-emailsentemail": "أُرسل بريد إلكتروني لإعادة ضبط كلمة السر.",
        "passwordreset-emailsent-capture": "أُرسل بريد إلكتروني لإعادة ضبط كلمة السر، وهو معروض بالأسفل.",
        "passwordreset-emailerror-capture": "تم توليد رسالة بريد إلكتروني لتصفير كلمة السر نصّه التالي، إلا أنه تعذّر إرسال الرّسالة إلى {{GENDER:$2|المستخدم|المستخدمة}}: $1",
        "changeemail": "تغيير أو إزالة عنوان البريد الإلكتروني",
        "search-category": "(التصنيف $1)",
        "search-file-match": "(يطابق محتوى الملف)",
        "search-suggest": "أتقصد: $1",
-       "search-rewritten": "عرض النتائج ل$1. ابحث بدلا من ذلك عن $2.",
+       "search-rewritten": "نتائج البحث المشابه $1 معروضة. يمكنك بدل ذلك البحث عن $2.",
        "search-interwiki-caption": "المشاريع الشقيقة",
        "search-interwiki-default": "نتائح من $1:",
        "search-interwiki-more": "(المزيد)",
        "showingresultsinrange": "بالأسفل {{PLURAL:$1|نتيجة واحدة|<strong>$1</strong> نتائج|<strong>$1</strong> نتيجة}} في النطاق من <strong>$2</strong> إلى <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|النتائج <strong>$1</strong> من <strong>$3</strong>|النتائج <strong>$1 - $2</strong> من أصل <strong>$3</strong>}}",
        "search-nonefound": "لا توجد نتائج تطابق الاستعلام.",
+       "search-nonefound-thiswiki": "لا توجد نتائج تطابق الاستعلام في هذا الموقع.",
        "powersearch-legend": "بحث متقدم",
        "powersearch-ns": "بحث في النطاقات:",
        "powersearch-togglelabel": "اختر:",
        "prefs-help-recentchangescount": "بما في ذلك أحدث التغييرات وتاريخ الصفحات والسجلات.",
        "prefs-help-watchlist-token2": "هذا هو المفتاح السري لتغذية الوِب لقائمة مراقبتك.\nيمكن لأي شخص يعرفه أن يقرأ قائمة مراقبتك، ولذا لا تتشاركه مع أحد. [[Special:ResetTokens|انقر هنا إذا أردت إعادة ضبطه]].",
        "savedprefs": "تم حفظ تفضيلاتك.",
+       "savedrights": "حُفظت الصلاحيات الجديدة {{GENDER:$1|للمستخدم|للمستخدمة}} $1.",
        "timezonelegend": "المنطقة الزمنية:",
        "localtime": "الوقت المحلي:",
        "timezoneuseserverdefault": "استخدام الويكي الافتراضي ($1)",
        "prefs-help-prefershttps": "سيتم تفعيل هذا التفضيل عند ولوجوك في المرة القادمة.",
        "prefswarning-warning": "لقد أجريت تعديلات على تفضيلاتك، ولم تُحفَظ بعد.\nإذا غادرت هذه الصفحة دون أن تنقر على «$1» لن يتم تحديث تفضيلاتك.",
        "prefs-tabs-navigation-hint": "تلميح: يمكنك استخدام مفتاحي السهمين الأيمن والأيسر للتنقل بين الألسنة في قائمة الألسنة.",
-       "email-address-validity-valid": "يبدو أن عنوان البريد الإلكتروني صالح",
-       "email-address-validity-invalid": "أدخل عنوان بريد إلكتروني صالح",
        "userrights": "صلاحيات المستخدم",
        "userrights-lookup-user": "أدِر مجموعات المستخدم",
        "userrights-user-editname": "أدخل اسم مستخدم:",
        "rcshowhidemine": "$1 تعديلاتي",
        "rcshowhidemine-show": "أظهر",
        "rcshowhidemine-hide": "أخف",
+       "rcshowhidecategorization-show": "أظهر",
+       "rcshowhidecategorization-hide": "أخف",
        "rclinks": "أظهر آخر $1 تعديل في آخر $2 يوم<br />$3",
        "diff": "فرق",
        "hist": "تاريخ",
        "wlheader-showupdated": "الصفحات التي تم تحريرها بعد مطالعتك إياها آخر مرة عناوينها بالخط '''الغليظ'''",
        "wlnote": "بالأسفل {{PLURAL:$1|لا توجد تغييرات|التغيير الأخير|آخر تغييرين|آخر '''$1''' تغييرات|آخر '''$1''' تغييرا|آخر '''$1''' تغيير}} في {{PLURAL:$2||'''الساعة''' الماضية|'''الساعتين''' الماضيتين|ال'''$2''' ساعات الماضية|ال'''$2''' ساعة الماضية}} وفقاً ل$3، $4.",
        "wlshowlast": "عرض آخر $1 ساعات $2 يوما",
+       "watchlistall2": "الكل",
+       "wlshowtime": "أظهر آخر:",
+       "wlshowhideminor": "الطفيفة",
+       "wlshowhidebots": "البوتات",
+       "wlshowhideliu": "المسجلين",
+       "wlshowhideanons": "المجهولين",
+       "wlshowhidemine": "تعديلاتي",
        "watchlist-options": "خيارات قائمة المراقبة",
        "watching": "يراقب...",
        "unwatching": "إزالة المراقبة...",
        "contributions": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}}",
        "contributions-title": "مساهمات {{GENDER:$1|المستخدم|المستخدمة}} $1",
        "mycontris": "مساهماتي",
+       "anoncontribs": "مساهمات",
        "contribsub2": "ل{{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "حساب المستخدم \"$1\" غير مسجل.",
        "nocontribs": "لم يتم العثور على تغييرات تطابق هذه المحددات.",
        "movenosubpage": "ليس لهذه الصفحة صفحات فرعية.",
        "movereason": "السبب:",
        "revertmove": "استرجع",
-       "delete_and_move": "حذف ونقل",
        "delete_and_move_text": "==الحذف مطلوب==\nالصفحة الهدف \"[[:$1]]\" موجودة بالفعل.\nهل تريد حذفها لإفساح المجال للنقل؟",
        "delete_and_move_confirm": "نعم، احذف الصفحة",
        "delete_and_move_reason": "حُذِفت لإفساح مجال لنقل \"[[$1]]\"",
        "htmlform-cloner-required": "مطلوب قيمة واحدة على الأقل.",
        "htmlform-title-badnamespace": "[[:$1]] ليس في نطاق \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" ليس عنوان صفحة يمكن إنشاؤه",
-       "htmlform-title-not-exists": "[[:$1]] غير موجود.",
+       "htmlform-title-not-exists": "$1 غير موجود.",
        "htmlform-user-not-exists": "<strong>$1</strong> غير موجود",
        "htmlform-user-not-valid": "اسم المستخدم <strong>$1</strong> غير صالح.",
        "sqlite-has-fts": "$1 بدعم البحث في كامل النص",
        "revdelete-unrestricted": "أزال الضوابط لمديري النظام",
        "logentry-block-block": "{{GENDER:$2|منع|منعت}} $1 {{GENDER:$4|$3}} لفترة زمنية مدتها $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|رفع منع}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": " {{GENDER:$2|غير|غيرت}} $1 إعدادات المنع ل{{GENDER:$4|$3}} بتاريخ انتهاء $5 $6",
        "logentry-suppress-block": "{{GENDER:$2|منع|منعت}} $1 {{GENDER:$4|$3}} لفترة زمنية مدتها $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|استورد}} $3 بواسطة رفع ملف",
        "logentry-import-interwiki": "$1 {{GENDER:$2|استورد|استوردت}} $3 من ويكي أخرى",
        "logentry-newusers-byemail": "ُ{{GENDER:$2|أنشأ|أنشأت}} $1 حساب المستخدم $3 وأُرسلت كلمة السر بالبريد الإلكتروني",
        "logentry-newusers-autocreate": "أنشئ حساب {{GENDER:$2|المستخدم|المستخدمة}} $1 تلقائيًا",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|نقل}} إعدادات الحماية من $4 إلى $3",
+       "logentry-protect-unprotect": "{{GENDER:$2|رفع|رفعت}} $1 الحماية عن $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|حمى|حمت}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|حمى|حمت}} $3 $4 [مضمنة]",
        "logentry-protect-modify": "{{GENDER:$2|غير|غيرت}} $1 مستوى الحماية ل$3 $4",
index 8d37c4f..14d07ba 100644 (file)
        "prefs-displayrc": "اختيارات العرض",
        "prefs-displaywatchlist": "اختيارات العرض",
        "prefs-diffs": "التغيير",
-       "email-address-validity-valid": "عنوان الإيميل صح",
-       "email-address-validity-invalid": "عنوان الإيميل غلط",
        "userrights": "إدارة الحقوق بتاعة اليوزر",
        "userrights-lookup-user": "إدارة مجموعات اليوزر",
        "userrights-user-editname": "دخل اسم يوزر:",
        "wlheader-showupdated": "الصفحات اللى اتغيرت  بعد زيارتك ليها اخر مرة معروضة بالخط '''العريض'''",
        "wlnote": "تحت فى {{PLURAL:$1|آخر تغيير|آخر '''$1''' تغيير}} فى آخر {{PLURAL:$2|ساعه|'''$2''' ساعه}}، من الوقت $3، $4.",
        "wlshowlast": "عرض اخر $1 ساعات $2 ايام",
+       "watchlistall2": "الكل",
        "watchlist-options": "اختيارات قايمة المراقبة",
        "watching": "بيراقب...",
        "unwatching": "بيبطل مراقبه...",
        "ipbreason-dropdown": "*أسباب المنع المشهورة\n** تدخيل معلومات غلط\n** مسح المحتوى من الصفحات\n** سبام لينك لمواقع خارجية\n** كتابة كلام مالوش معنى فى الصفحات\n** سلوك عدواني/تحرش\n** إساءة استخدام اكتر من حسابات\n** اسم يوزر مش مقبول",
        "ipbcreateaccount": "امنع فتح الحسابات",
        "ipbemailban": "منع اليوزر ده من بعتان إيميل",
-       "ipbenableautoblock": " امنع آخر عنوان أيبى استخدمه اليوزر دا اوتوماتيكي، وأى عناوين أيبى تانية يحاول التحرير منها",
+       "ipbenableautoblock": "امنع آخر عنوان أيبى استخدمه اليوزر دا اوتوماتيكي، وأى عناوين أيبى تانية يحاول التحرير منها",
        "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",
        "movenosubpage": "الصفحه دى مافيهاش صفحات فرعيه.",
        "movereason": "السبب:",
        "revertmove": "رجّع",
-       "delete_and_move": "مسح ونقل",
        "delete_and_move_text": "==المسح مطلوب==\nالصفحة الهدف \"[[:$1]]\" موجودة فعلا.\nانت عايز تمسحها علشان تقدر تنقلها؟",
        "delete_and_move_confirm": "ايوة، امسح الصفحة",
        "delete_and_move_reason": "اتمسحت علشان تسمح بالنقل من \"[[$1]]\"",
index cb750de..acfcd1d 100644 (file)
@@ -26,6 +26,7 @@
        "tog-hideminor": "সাম্প্ৰতিক সাল-সলনিত অগুৰুত্বপূৰ্ণ সম্পাদনা নেদেখুৱাব",
        "tog-hidepatrolled": "সাম্প্ৰতিক সাল-সলনিত তহলদাৰী সম্পাদনা নেদেখুৱাব",
        "tog-newpageshidepatrolled": "নতুন পৃষ্ঠা তালিকাত তহলদাৰী পৃষ্ঠাসমূহ নেদেখুৱাব",
+       "tog-hidecategorization": "পৃষ্ঠাবোৰৰ শ্ৰেণীকৰণ লুকুৱাওক",
        "tog-extendwatchlist": "কেৱল সাম্প্ৰতিকেই নহয, লক্ষ্য-তালিকাৰ সকলো সাল-সলনি বহলাই দেখুৱাওক",
        "tog-usenewrc": "পৃষ্ঠাৰ পৰিৱৰ্তনসমূহ শেহতীয়া সালসলনি আৰু লক্ষ্যতালিকাত ভাগ কৰক",
        "tog-numberheadings": "শীৰ্ষকত স্বয়ংক্ৰিয়ভাৱে ক্ৰমিক নং দিয়ক",
@@ -55,6 +56,7 @@
        "tog-watchlisthideliu": "প্ৰবেশ কৰা সদস্যৰ সম্পাদনাসমূহ আঁতৰাই অনুসৰণ-তালিকা দেখুৱাওক",
        "tog-watchlisthideanons": "বেনামী সদস্যৰ সম্পাদনাসমূহ আঁতৰাই অনুসৰণ-তালিকা দেখুৱাওক",
        "tog-watchlisthidepatrolled": "পৰীক্ষিত সম্পাদনাসমূহ লক্ষ্য-তালিকাৰ পৰা লুকুৱাই ৰাখক",
+       "tog-watchlisthidecategorization": "পৃষ্ঠাবোৰৰ শ্ৰেণীকৰণ লুকুৱাওক",
        "tog-ccmeonemails": "মই অন্য সদস্যলৈ পঠোৱা ই-মেইলৰ প্ৰতিলিপি এটা মোলৈও পঠাব",
        "tog-diffonly": "পার্থক্যৰ তলত পৃষ্ঠাৰ বিষয়বস্তু নেদেখুৱাব",
        "tog-showhiddencats": "নিহিত শ্ৰেণীসমূহ দেখুৱাওক",
        "nstab-template": "সাঁচ",
        "nstab-help": "সাহায্য পৃষ্ঠা",
        "nstab-category": "শ্ৰেণী",
+       "mainpage-nstab": "বেটুপাত",
        "nosuchaction": "এনে কাৰ্য নাই",
        "nosuchactiontext": "এই ইউআৰএলে নিৰ্ধাৰিত কৰা কাৰ্য অবৈধ।\nআপুনি বোধহয়  ইউআৰএল ভুলকৈ লিখিছে বা এটা ভুল লিঙ্ক অনুকৰণ কৰিছে ।\n{{SITENAME}}ত ব্যৱহাৰ হোৱা চফ্টৱেৰত ত্ৰুটি হ'বও পাৰে ।",
        "nosuchspecialpage": "এনে ধৰণৰ কোনো বিশেষ পৃষ্ঠা নাই",
        "createaccountreason": "কাৰণ:",
        "createacct-reason": "কাৰণ",
        "createacct-reason-ph": "আপুনি কিয় আন এটা একাউণ্ট সৃষ্টি কৰিছে",
-       "createacct-captcha": "সুৰক্ষা পৰীক্ষা",
-       "createacct-imgcaptcha-ph": "ওপৰত দেখা পোৱা পাঠ্য লিখক",
        "createacct-submit": "আপোনাৰ একাউণ্ট সৃষ্টি কৰক",
        "createacct-another-submit": "একাউণ্ট সৃষ্টি কৰক",
        "createacct-benefit-heading": "আপোনাৰ দৰে মানুহেই {{SITENAME}} তৈয়াৰ কৰিছে",
        "rev-deleted-event": "(ল'গ সবিশেষ আঁতৰোৱা হ'ল)",
        "rev-deleted-user-contribs": "[সদস্যনাম বা আই-পি ঠিকনা আঁতৰোৱা হ'ল - সম্পাদনা বৰঙনিসমূহৰ পৰা আঁৰ কৰা হৈছে]",
        "rev-deleted-text-permission": "পৃষ্ঠাৰ এই সংশোধনটি '''বিলোপ''' কৰা হ'ল ।\nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অবলুপ্তি অভিলেখত]",
-       "rev-deleted-text-unhide": "পৃষ্ঠাখনৰ এই সংশোধনটো '''বিলোপ''' কৰা হৈছে | \nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অৱলুপ্তি অভিলেখত]।\nআপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
+       "rev-deleted-text-unhide": "পৃষ্ঠাখনৰ এই সংশোধনটো <strong>বিলোপ</strong> কৰা হৈছে। \n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অৱলুপ্তি অভিলেখত ইয়াৰ সবিশেষ পাব]।\nআপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
        "rev-suppressed-text-unhide": "পৃষ্ঠাটোৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হৈছে ।\nসবিশেষ পাব [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} নিবাৰণ অভিলেখত]।\nআপুনি মন কৰিলে [$1 এই সংশোধনটো চাব পাৰে]।",
        "rev-deleted-text-view": "পৃষ্ঠাৰ এই সংশোধনটো '''বিলোপ''' কৰা হ'ল ।\nআপুনি এইটো চাব পাৰে; সবিশেষ পাব [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অবলুপ্তি অভিলেখত]।",
        "rev-suppressed-text-view": "পৃষ্ঠাৰ এই সংশোধনটো '''নিবাৰণ''' কৰা হ’ল।\nআপুনি এইটো চাব পাৰে; সবিশেষ পাব [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} নিবাৰণ অভিলেখত]।",
        "showingresultsinrange": "তলত #<strong>$2</strong>ৰ পৰা #<strong>$3</strong> পৰিসৰৰ ভিতৰত {{PLURAL:$1|<strong>1</strong>টা ফলাফল|<strong>$1</strong>টা লৈকে ফলাফল}} দেখুওৱা হৈছে।",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>-ৰ <strong>$1</strong>টো ফলাফল|<strong>$3</strong>-ৰ <strong>$1 - $2</strong>টো ফলাফল}}",
        "search-nonefound": "এই অনুসন্ধানৰ কোনো ফলাফল নাই ।",
+       "search-nonefound-thiswiki": "এই ছাইটত এই সন্ধানৰ লগত মিলা কোনো ফলাফল নাই।",
        "powersearch-legend": "শক্তিশালী সন্ধান",
        "powersearch-ns": "নামস্থানবোৰত সন্ধান:",
        "powersearch-togglelabel": "পৰীক্ষা কৰক:",
        "rcshowhidemine": "মোৰ সম্পাদনা $1",
        "rcshowhidemine-show": "দেখুৱাওক",
        "rcshowhidemine-hide": "লুকুৱাওক",
+       "rcshowhidecategorization-show": "দেখুৱাওক",
+       "rcshowhidecategorization-hide": "লুকুৱাওক",
        "rclinks": "যোৱা $2 দিনত হোৱা $1 টা সাল-সলনি চাওক ।<br />$3",
        "diff": "পাৰ্থক্য",
        "hist": "ইতিবৃত্ত",
        "speciallogtitlelabel": "গন্তব্য (title or user):",
        "log": "অভিলেখ/ল'গ",
        "all-logs-page": "সকলোবোৰ ৰাজহুৱা সূচী",
-       "alllogstext": "{{SITENAME}} à¦¸à¦\95লà§\8b à¦²â\80\99à¦\97ৰ à¦¸à¦¨à§\8dমিলিত à¦ªà§\8dৰদৰà§\8dশন à¥¤\nà¦\86পà§\81নি à¦²â\80\99à¦\97ৰ à¦ªà§\8dৰà¦\95াৰ, à¦¸à¦¦à¦¸à§\8dযৰ à¦¨à¦¾à¦® à¦¬à¦¾ à¦ªà§\83ষà§\8dঠাà¦\96নৰ নাম নিৰ্বাচন কৰি প্ৰদৰ্শনটোৰ আকাৰ সৰু কৰিব পাৰে ।",
+       "alllogstext": "{{SITENAME}} à¦¸à¦\95লà§\8b à¦²â\80\99à¦\97ৰ à¦¸à¦¨à§\8dমিলিত à¦ªà§\8dৰদৰà§\8dশন à¥¤\nà¦\86পà§\81নি à¦²â\80\99à¦\97ৰ à¦ªà§\8dৰà¦\95াৰ, à¦¸à¦¦à¦¸à§\8dযৰ à¦¨à¦¾à¦® à¦¬à¦¾ à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bৰ নাম নিৰ্বাচন কৰি প্ৰদৰ্শনটোৰ আকাৰ সৰু কৰিব পাৰে ।",
        "logempty": "কোনো মিল থকা আইটেম লগত নাই ।",
        "log-title-wildcard": "এই পাঠেৰে আৰম্ভ হোৱা শিৰোনামাসমূহ অনুসন্ধান কৰক",
        "showhideselectedlogentries": "নিৰ্বাচিত ল'গ ভুক্তি দেখুৱাওক/লুকুৱাওক",
        "wlheader-showupdated": "আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত সলনি হোৱা পৃষ্ঠাসমূহ '''গাঢ়''' আখৰত দেখুওৱা হৈছে।",
        "wlnote": "তলত {{PLURAL:$1| হ'ল সৰ্বশেষ পৰিৱৰ্তন|হ'ল সৰ্বশেষ '''$1''' পৰিৱৰ্তনসমূহ}} সৰ্বশেষ {{PLURAL:$2|ঘন্টা|'''$2''' ঘন্টা}}, $3, $4 -ৰ হিচাপে।",
        "wlshowlast": "যোৱা $1 ঘণ্টা $2 দিন  চাওক",
+       "watchlistall2": "সকলো",
        "watchlist-options": "লক্ষ্য-তালিকা পছন্দসমূহ",
        "watching": "চকু দিয়া হৈছে.....",
        "unwatching": "আঁতৰোৱা হৈ আছে.....",
        "protect-text": "'''$1''' পৃষ্ঠাটোৰ সুৰক্ষা-স্তৰ আপুনি চাব আৰু সলনি কৰিব পাৰে।",
        "protect-locked-blocked": "বাধাপ্ৰাপ্ত অৱস্থাত আপুনি সুৰক্ষা স্তৰ সলাব নোৱাৰে ।\n'''$1''' পৃষ্ঠাৰ বৰ্তমান ছেটিং সমূহ ইয়াত দিয়া হ’ল:",
        "protect-locked-dblock": "এটা সক্ৰিয় অথ্যভঁৰাল প্ৰতিবন্ধকৰ বাবে সুৰক্ষা স্তৰ সলাব নোৱাৰি ।\n'''$1''' পৃষ্ঠাৰ বৰ্তমান ছেটিং সমূহ ইয়াত দিয়া হ’ল:",
-       "protect-locked-access": "এই পৃষ্ঠাটোৰ সুৰক্ষা-স্তৰ সলনি কৰাৰ অনুমতি আপোনাক দিয়া হোৱা নাই ।\n'''$1''' পৃষ্ঠাখনৰ সুৰক্ষা-স্তৰৰ গাঁথনি ইয়াত আছে:",
+       "protect-locked-access": "এই পৃষ্ঠাটোৰ সুৰক্ষা-স্তৰ সলনি কৰাৰ অনুমতি আপোনাক দিয়া হোৱা নাই ।\nপৃষ্ঠাটোৰ বৰ্তমান ছেটিংছ ইয়াত পাব:\n<strong>$1</strong>:",
        "protect-cascadeon": "এই পৃষ্ঠাটো বৰ্তমান সুৰক্ষিত কাৰণ ই {{PLURAL:$1|খন পৃষ্ঠাৰ|খন পৃষ্ঠাৰ}} অন্তৰ্গত য’ত প্ৰপাতাকাৰ সুৰক্ষা সক্ৰিয় ।\nএই পৃষ্ঠাৰ সুৰক্ষা স্তৰ সলালে প্ৰপাতাকাৰ সুৰক্ষাত কোনো প্ৰভাৱ নেপেলায় ।",
        "protect-default": "সকলো ব্যৱহাৰকাৰীৰ বাবে",
        "protect-fallback": "কেৱল \"$1\" অনুমতি থকা ব্যৱহাৰকাৰীকহে সুযোগ দিয়া হয়",
        "move-page-legend": "পৃষ্ঠাটো স্থানান্তৰ কৰক",
        "movepagetext": "তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰিলে এই পৃষ্ঠাৰ শিৰোনাম সলনি হ'ব, লগতে সমগ্ৰ ইতিহাস নতুন শিৰোনামলৈ স্থানান্তৰ কৰা হ'ব।\nপুৰণা শিৰোনামটো নতুন শিৰোনামালৈ এটা পুনৰ্নিৰ্দেশনা হৈ ৰ'ব।\nপুৰণা শিৰোনামলৈ পোনাৱা পুনৰ্নিৰ্দেশনাসমূহ আপুনি স্বয়ংক্ৰিয়ভাৱে আপডে'ট কৰিব পাৰিব।\nযদি এইটো কৰিব নিবিচাৰে তেনেহ'লে  [[Special:DoubleRedirects|দ্বি-পুনৰ্নিৰ্দেশনাসমূহ]] বা [[Special:BrokenRedirects|ভঙা পুনৰ্নিৰ্দেশনাসমূহ]] বাছনি কৰে যেন।\nসকলো সংযোগ সঠিক দিশলৈ পোনাৱাৰ দায়িত্ব আপোনাৰ।\n\nমন কৰিব যে পৃষ্ঠাটো স্থানান্তৰ কৰা '''নহ'ব''' যদিহে নতুন শিৰোনামটোত পূৰ্বৰপৰা এটা পৃষ্ঠা আছেই, আৰু যদিহে পূৰ্বৰ পৃষ্ঠাটো কোনো পুনৰ্নিৰ্দেশ নহয় আৰু তাৰ কোনো সম্পাদনাৰ পূৰ্বইতিহাস নাই।\nইয়াৰ অৰ্থ এয়ে যে ভুল হলে পৃষ্ঠাটো আগৰ ঠাইতে থাকিব, আৰু আপুনি প্ৰচলিত পৃষ্ঠা এটাক আন পৃষ্ঠা এটাৰে সলনি কৰিব নোৱাৰে।\n\n'''সতৰ্কবাণী !'''\nজনপ্ৰিয় পৃষ্ঠা এটাৰ বাবে এয়া এক ডাঙৰ আৰু অনাকাংক্ষিত সাল-সলনি হ’ব পাৰে;\nআগবঢ়াৰ পূৰ্বে এই কাৰ্যৰ পৰিণাম ভালদৰে বিবেচনা কৰি লয় যেন।",
        "movepagetext-noredirectfixer": "তলৰ প্ৰপত্ৰ ব্যৱহাৰ কৰিলে এই পৃষ্ঠাৰ শিৰোনামা সলনি হ'ব, লগতে সমগ্ৰ ইতিহাস নতুন শিৰোনামালৈ স্থানান্তৰ কৰা হ'ব।\nপুৰণা শিৰোনামাটো নতুন শিৰোনামালৈ এটা পুনৰ্নিৰ্দেশনা হৈ ৰ'ব।\n[[Special:DoubleRedirects|দ্বি পুনৰ্নিৰ্দেশনাসমূহ]] বা [[Special:BrokenRedirects|ভঙা পুনৰ্নিৰ্দেশনসমূহ]] পৰীক্ষা কৰিবলৈ নাপাহৰিব।\nসকলো সংযোগে যাতে সঠিক দিশলৈ পোনায়, সেয়া লক্ষ্য কৰা দায়িত্ব আপোনাৰ।\n\nমন কৰিব যে নতুন শিৰোনামাতো যদি প্ৰচলিত, এই পৃষ্ঠা নতুন শিৰোনামালৈ সলনি কৰা '''নহ'ব''' যদিহে সেই পৃষ্ঠা খালী বা কোনো পুনৰ্নিৰ্দেশনৰ পূৰ্ব ইতিহাস নাই।\nইয়াৰ অৰ্থ এয়ে যে ভুল হলে পৃষ্ঠাটো আগৰ ঠাইতে থাকিব, আৰু আপুনি প্ৰচলিত পৃষ্ঠা এটাক আন পৃষ্ঠা এখনেৰে সলনি কৰিব নোৱাৰে।\n\n'''সতৰ্কবাণী !'''\nজনপ্ৰিয় পৃষ্ঠা এটাৰ বাবে এয়া এক ডাঙৰ আৰু অকানাংক্ষিত সাল-সলনি হ'ব পাৰে;\nএই কাৰ্য্যৰ পৰিণাম ভালদৰে বিবেচনা কৰি লয় যেন।",
-       "movepagetalktext": "পà§\83ষà§\8dঠাà¦\96নৰ à¦²à¦\97তà§\87 à¦¸à¦\82শà§\8dলিষà§\8dà¦\9f à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠাà¦\96নà§\8b à¦¸à§\8dবয়à¦\82à¦\95à§\8dৰিয়ভাৱà§\87 à¦¸à§\8dথানানà§\8dতৰ à¦¹â\80\99ব; à¦\8fনà§\87 à¦¨à¦¹à¦¯à¦¼ '''যদিহà§\87:'''\n*নতà§\81ন à¦¶à¦¿à§°à§\8bনামাৰ à¦\85ধà§\80নত à¦\8fà¦\9fা à¦\96ালি à¦¨à§\8bহà§\8bৱা à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠা à¦\87তিমধà§\8dযà§\87à¦\87 à¦¥à¦¾à¦\95à§\87, à¦¬à¦¾\n*à¦\86পà§\81নি à¦¤à¦²à§° à¦\98ৰà¦\9fà§\8b à¦\85à¦\9aিহà§\8dনিত à¦\95ৰà§\87 à¥¤\n\nতà§\87নà§\87 à¦\95à§\8dষà§\87তà§\8dৰত à¦\86পà§\81নি à¦\86পà§\81নি à¦\87à¦\9aà§\8dà¦\9bা à¦\95ৰিলà§\87 à¦¨à¦¿à¦\9c à¦¹à¦¾à¦¤à§\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦¸à§\8dথানানà§\8dতৰ à¦¬à¦¾ à¦\8fà¦\95তà§\8dৰà§\80à¦\95ৰণ à¦\95ৰিব à¦ªà¦¾à§°à§\87 ।",
+       "movepagetalktext": "à¦\8fà¦\87 à¦¬à¦¾à¦\95à¦\9bà¦\9fà§\8b à¦\9aিহà§\8dনিত à¦\95ৰিলà§\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8bৰ à¦²à¦\97তà§\87 à¦¸à¦\82শà§\8dলিষà§\8dà¦\9f à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠাà¦\93 à¦¸à§\8dবয়à¦\82à¦\95à§\8dৰিয়ভাৱà§\87 à¦¸à§\8dথানানà§\8dতৰ à¦¹â\80\99ব; à¦\8fনà§\87 à¦¨à¦¹à¦¯à¦¼ à¦¯à¦¦à¦¿à¦¹à§\87 à¦\8fà¦\9fা à¦\96ালি à¦¨à§\8bহà§\8bৱা à¦\86লà§\8bà¦\9aনা à¦ªà§\83ষà§\8dঠা à¦\87তিমধà§\8dযà§\87à¦\87 à¦¥à¦¾à¦\95à§\87।\n\nতà§\87নà§\87 à¦\95à§\8dষà§\87তà§\8dৰত à¦\86পà§\81নি à¦\86পà§\81নি à¦\87à¦\9aà§\8dà¦\9bা à¦\95ৰিলà§\87 à¦¨à¦¿à¦\9c à¦¹à¦¾à¦¤à§\87 à¦ªà§\83ষà§\8dঠাà¦\9fà§\8b à¦¸à§\8dথানানà§\8dতৰ à¦¬à¦¾ à¦\8fà¦\95তà§\8dৰà§\80à¦\95ৰণ à¦\95ৰিব à¦ªà¦¾à§°à§\87।",
        "moveuserpage-warning": "'''সতৰ্কবাণী:''' আপুনি এখন সদস্যপৃষ্ঠা স্থানান্তৰ কৰিবলৈ বিছাৰিছে । অনুগ্ৰহ কৰি মন কৰক যে কেৱল সদস্যপৃষ্ঠাখনহে স্থানান্তৰ হ’ব আৰু সদস্যজনৰ পুনঃনামাকৰণ নহ’ব ।",
        "movenologintext": "পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপুনি ভুক্ত সদস্য হৈ [[Special:UserLogin|প্ৰৱেশ]] কৰিব লাগিব ।",
        "movenotallowed": "পৃষ্ঠা স্থানান্তৰ কৰিবলৈ আপোনাৰ অনুমতি নাই ।",
        "movenosubpage": "এই পৃষ্ঠাৰ কোনো উপপৃষ্ঠা নাই ।",
        "movereason": "কাৰণ:",
        "revertmove": "আগৰ অৱস্থালৈ ঘূৰি যাওক",
-       "delete_and_move": "বিলোপ আৰু স্থানান্তৰ কৰক",
        "delete_and_move_text": "== বিলোপন আৱশ্যক ==\nলক্ষ্য পৃষ্ঠা \"[[:$1]]\" ইতিমেধ্যে আছেই ।\nআপুনি স্থানান্তৰ কৰিবলৈ এইখন বিলোপ কৰিব খুজিছে নেকি ?",
        "delete_and_move_confirm": "হয়, পৃষ্ঠাটো বিলোপ কৰক",
        "delete_and_move_reason": "\"[[$1]]\"ৰ পৰা স্থানান্তৰৰ স্বাৰ্থত বিলোপ কৰা হৈছে",
        "tooltip-pt-logout": "প্ৰস্থান",
        "tooltip-pt-createaccount": "আপোনাক এটা একাউণ্ট সৃষ্টি কৰি প্ৰৱেশ কৰিবলৈ অনুৰোধ জনোৱা হৈছে, কিন্তু এয়া বাধ্যতামূলক নহয়",
        "tooltip-ca-talk": "সংশ্লিষ্ট প্ৰবন্ধ সম্পৰ্কীয় আলোচনা",
-       "tooltip-ca-edit": "এই পৃষ্ঠাখন সম্পাদনা কৰক",
+       "tooltip-ca-edit": "এই পৃষ্ঠা সম্পাদনা কৰক",
        "tooltip-ca-addsection": "নতুন অনুচ্ছেদ আৰম্ভ কৰক",
        "tooltip-ca-viewsource": "এই পৃষ্ঠাটো সুৰক্ষিত কৰা হৈছে, আপুনি ইয়াৰ উৎস চাব পাৰে।",
        "tooltip-ca-history": "এই পৃষ্ঠাৰ যোৱা সংস্কৰণসমূহ",
        "tooltip-ca-nstab-main": "এই ৱিকিৰ সূচী চাওক",
        "tooltip-ca-nstab-user": "সদস্য পৃষ্ঠা চাওক",
        "tooltip-ca-nstab-media": "মিডিয়া পৃষ্ঠাটো চাওক",
-       "tooltip-ca-nstab-special": "এইটো এটা বিশেষ পৃষ্ঠা, আপুনি সম্পাদনা কৰিব নোৱাৰে",
+       "tooltip-ca-nstab-special": "à¦\8fà¦\87à¦\9fà§\8b à¦\8fà¦\9fা à¦¬à¦¿à¦¶à§\87ষ à¦ªà§\83ষà§\8dঠা, à¦\86ৰà§\81 à¦\8fà¦\87à¦\9fà§\8b à¦\86পà§\81নি à¦¸à¦®à§\8dপাদনা à¦\95ৰিব à¦¨à§\8bৱাৰà§\87",
        "tooltip-ca-nstab-project": "প্ৰকল্প পৃষ্ঠা চাওক",
        "tooltip-ca-nstab-image": "নথিৰ পৃষ্ঠা চাওক",
        "tooltip-ca-nstab-mediawiki": "প্ৰণালী বাৰ্তা চাওক",
index e8f6149..a8c9eef 100644 (file)
@@ -46,6 +46,7 @@
        "tog-watchlisthidebots": "Anubrir les ediciones de bots na llista de siguimientu",
        "tog-watchlisthideminor": "Anubrir les ediciones menores na llista de siguimientu",
        "tog-watchlisthideliu": "Anubrir les ediciones d'usuarios identificaos na llista de siguimientu",
+       "tog-watchlistreloadautomatically": "Recargar la llista de siguimientu automáticamente cuando se cambie un filtru (rique JavaScript).",
        "tog-watchlisthideanons": "Anubrir les ediciones d'usuarios anónimos na llista de siguimientu",
        "tog-watchlisthidepatrolled": "Anubrir les ediciones patrullaes na llista de siguimientu",
        "tog-watchlisthidecategorization": "Tapecer la categorización de páxines",
        "morenotlisted": "Esta llista nun ta completa.",
        "mypage": "Páxina",
        "mytalk": "Alderique",
-       "anontalk": "Alderique pa esta IP",
+       "anontalk": "Alderique",
        "navigation": "Navegación",
        "and": "&#32;y",
        "qbfind": "Alcontrar",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Error: $1",
+       "transaction-duration-limit-exceeded": "Para evitar crear un gran atrasu na replicación, esta transaición albortóse porque la duración de la escritura ($1) pasó la llende de $2 segundos.\nSi tas cambiando munchos oxetos al mesmu tiempu, intenta meyor facer operaciones múltiples más pequeñes.",
        "laggedslavemode": "'''Avisu:''' Esta páxina pue que nun tenga actualizaciones recientes.",
        "readonly": "Base de datos candada",
        "enterlockreason": "Introduz un motivu pal candáu, amestando una estimación de cuándo va tener llugar el descandáu",
        "missingarticle-rev": "(núm. revisión: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
        "readonly_lag": "La base de datos candóse automáticamente mentes los sirvidores de la base de datos esclava se sincronicen cola maestra",
+       "nonwrite-api-promise-error": "Unvióse la testera HTTP 'Promise-Non-Write-API-Action', pero la solicitú foi pa un módulu d'escritura de la API.",
        "internalerror": "Fallu internu",
        "internalerror_info": "Fallu internu: $1",
        "internalerror-fatal-exception": "Escepción fatal de tipu «$1»",
        "title-invalid-utf8": "El títulu de páxina solicitáu contien una secuencia UTF-8 inválida.",
        "title-invalid-interwiki": "El títulu de páxina solicitáu contien un enllaz interwiki que nun puede usase nos títulos.",
        "title-invalid-talk-namespace": "El títulu de páxina solicitáu fai referencia a una páxina d'alderique que nun puede esistir.",
-       "title-invalid-characters": "El títulu de la páxina solicitada contien calteres non válidos: «$1»",
+       "title-invalid-characters": "El títulu de la páxina solicitada contien caráuteres inválidos: «$1»",
        "title-invalid-relative": "El títulu contien un camín relativu. Los títulos de páxina relativos (./, ../) son inválidos porque de vezu nun se puede llegar al pasalos a los restoladores web.",
        "title-invalid-magic-tilde": "El títulu de páxina solicitáu contien una secuencia máxica de tildes (<nowiki>~~~</nowiki>) inválida.",
        "title-invalid-too-long": "El títulu de páxina solicitáu ye llargu enforma. Nun tien de pasar de $1 {{PLURAL:$1|byte|bytes}} en codificación UTF-8.",
        "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Por qué quier crear otra cuenta",
-       "createacct-captcha": "Comprobación de seguridá",
-       "createacct-imgcaptcha-ph": "Escriba'l testu qu'apaez arriba",
        "createacct-submit": "Crear la cuenta",
        "createacct-another-submit": "Crear una cuenta",
        "createacct-benefit-heading": "{{SITENAME}} failu xente como vusté.",
        "wrongpasswordempty": "La contraseña taba en blanco.\nVuelvi a intentalo.",
        "passwordtooshort": "Les contraseñes han de tener polo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
        "passwordtoolong": "Les contraseñes nun puen ser mayores de {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
+       "passwordtoopopular": "Les contraseñes más escoyíes de vezu nun pueden usase. Escueye una contraseña más única.",
        "password-name-match": "La contraseña tien de ser distinta del nome d'usuariu.",
        "password-login-forbidden": "Ta torgao usar esti nome d'usuariu y contraseña.",
        "mailmypassword": "Reaniciar contraseña",
        "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 de corréu.",
        "user-mail-no-body": "Trató d'unviar un corréu electrónicu con un cuerpu baleru o curtiu enforma.",
-       "changepassword": "Camudar la clave",
+       "changepassword": "Camudar la contraseña",
        "resetpass_announce": "P'acabar d'aniciar sesión, tien de definir equí una contraseña nueva.",
        "resetpass_text": "<!-- Amestar testu equí -->",
        "resetpass_header": "Camudar la contraseña de la cuenta",
        "passwordreset-emailtext-ip": "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).\n{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}\na esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,\no si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir\nusando la contraseña antigua.",
        "passwordreset-emailtext-user": "L'usuariu $1 de {{SITENAME}} solicitó un reaniciu de la so contraseña de {{SITENAME}} ($4). {{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}} con esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona, o si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir usando la contraseña antigua.",
        "passwordreset-emailelement": "Nome d'usuariu: \n$1\n\nContraseña temporal: \n$2",
-       "passwordreset-emailsent": "Si esta ye una direición de corréu electrónicu rexistrada pa la to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
+       "passwordreset-emailsentemail": "Si esta ye una direición de corréu electrónicu rexistrada pa la to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
        "passwordreset-emailsent-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
        "passwordreset-emailerror-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
        "changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
        "permissionserrors": "Fallu de permisos",
        "permissionserrorstext": "Nun tien permisu pa facer eso {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
        "permissionserrorstext-withaction": "Nun tien permisu pa $2 {{PLURAL:$1|pol siguiente motivu|polos siguientes motivos}}:",
+       "contentmodelediterror": "Nun ye posible editar esta revisión porque'l so modelu de conteníu ye <code>$1</code>, mentanto que'l modelu de conteníu actual de la páxina ye <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Avisu: Tas volviendo a crear una páxina que se desanició anteriormente.'''\n\nHabríes considerar si ye afechisco siguir editando esta páxina.\nEquí tienes el rexistru de desanicios y tresllaos d'esta páxina:",
        "moveddeleted-notice": "Esta páxina se desanició.\nComo referencia, embaxo s'ufre'l rexistru de desanicios y tresllaos de la páxina.",
        "moveddeleted-notice-recent": "Esta páxina desanicióse apocayá (dientro de les postreres 24 hores).\nLos rexistros de desaniciu y treslláu de la páxina amuésense de siguío como referencia.",
        "undo-summary": "Esfacer la revisión $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]])",
        "undo-summary-username-hidden": "Desfacer la revisión $1 d'un usuariu tapecíu",
        "cantcreateaccounttitle": "Nun pue crease la cuenta",
-       "cantcreateaccount-text": "La creación de cuentes dende esta direición IP ('''$1''') foi bloquiada por [[User:$3|$3]].\n\nEl motivu dau por $3 ye ''$2''",
+       "cantcreateaccount-text": "[[User:$3|$3]] bloquió la creación de cuentes dende esta direición IP (<strong>$1</strong>).\n\nEl motivu dau por $3 ye <em>$2</em>",
        "cantcreateaccount-range-text": "La creación de cuentes dende direiciones IP del rangu '''$1''', qu'incluye la so direición IP ('''$4'''), ta bloquiada pol usuariu [[User:$3|$3]].\n\nLa razón dada por $3 ye ''$2''.",
        "viewpagelogs": "Ver los rexistros d'esta páxina",
        "nohistory": "Nun hay historial d'ediciones pa esta páxina.",
        "revdelete-submit": "Aplicar a {{PLURAL:$1|la revisión seleicionada|les revisiones seleicionaes}}",
        "revdelete-success": "'''Visibilidá de revisiones anovada correutamente.'''",
        "revdelete-failure": "'''La visibilida de revisiones nun se pudo anovar:'''\n$1",
-       "logdelete-success": "'''Visibilidá d'eventos establecida correutamente.'''",
+       "logdelete-success": "Configuróse correutamente la visibilidá del rexistru.",
        "logdelete-failure": "'''Nun se pudo configurar la visibilidá del rexistru:'''\n$1",
        "revdel-restore": "camudar visibilidá",
        "pagehist": "Historial de la páxina",
        "mergehistory-submit": "Fusionar revisiones",
        "mergehistory-empty": "Nun se pue fusionar nenguna revisión.",
        "mergehistory-done": "$3 {{PLURAL:$3|revisión|revisiones}} de $1 {{PLURAL:$3|fusionóse|fusionáronse}} en [[:$2]].",
-       "mergehistory-fail": "Nun se pudo facer la fusión d'historiales, por favor verifica la páxina y los parámetros temporales.",
+       "mergehistory-fail": "Nun pudo facese la fusión d'historiales, por favor comprueba los parámetros de páxina y hora.",
        "mergehistory-fail-toobig": "Nun pudo fusionase l'historial porque moveríense más del máximu de $1 {{PLURAL:$1|revisión|revisiones}}.",
        "mergehistory-no-source": "La páxina d'orixe $1 nun esiste.",
        "mergehistory-no-destination": "La páxina de destín $1 nun esiste.",
        "mergehistory-invalid-source": "La páxina d'orixe ha tener un títulu válidu.",
        "mergehistory-invalid-destination": "La páxina de destín ha tener un títulu válidu.",
-       "mergehistory-autocomment": "[[:$1]] fusionada con [[:$2]]",
-       "mergehistory-comment": "[[:$1]] fusionada con [[:$2]]: $3",
+       "mergehistory-autocomment": "[[:$1]] fusionada en [[:$2]]",
+       "mergehistory-comment": "[[:$1]] fusionada en [[:$2]]: $3",
        "mergehistory-same-destination": "Les páxines d'orixe y destín nun puen ser la mesma",
        "mergehistory-reason": "Motivu:",
        "mergelog": "Rexistru de fusiones",
        "search-relatedarticle": "Rellacionáu",
        "searchrelated": "rellacionáu",
        "searchall": "toos",
-       "showingresults": "Abaxo {{PLURAL:$1|amuésase '''un''' resultáu|amuésense '''$1''' resultaos}}, entamando col #'''$2'''.",
+       "showingresults": "Abaxo s'{{PLURAL:$1|amuesa hasta <strong>un</strong> resultáu|amuesen <strong>$1</strong> resultaos}}, principando por #<strong>$2</strong>.",
        "showingresultsinrange": "Más abaxo s'{{PLURAL:$1|amuesa|amuesen}} fasta {{PLURAL:$1|<strong>1</strong> resultáu|<strong>$1</strong> resultaos}} nel rangu ente #<strong>$2</strong> y #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultáu <strong>$1</strong> de <strong>$3</strong>|Resultaos <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Nun hebo resultaos que casaren cola consulta.",
+       "search-nonefound-thiswiki": "Nun hebo resultaos que casaran cola consulta nesti sitiu.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Buscar nos espacios de nome:",
        "powersearch-togglelabel": "Comprobar:",
        "powersearch-togglenone": "Dengún",
        "powersearch-remember": "Recordar la seleición pa guetes futures",
        "search-external": "Busca esterna",
-       "searchdisabled": "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google. Has fixate en que'l conteníu de los sos índices de {{SITENAME}} pue tar desfasáu.",
+       "searchdisabled": "La busca en {{SITENAME}} ta desactivada. Mentanto, pues buscar en Google.\nHas fixate en que'l conteníu de los sos índices de {{SITENAME}} pué tar desfasáu.",
        "search-error": "Hebo un error al buscar: $1",
        "preferences": "Preferencies",
        "mypreferences": "Preferencies",
        "stub-threshold-sample-link": "exemplu",
        "stub-threshold-disabled": "Desactivao",
        "recentchangesdays": "Díes que s'amuesen nos cambios recientes:",
-       "recentchangesdays-max": "(máximo $1 {{PLURAL:$1|día|díes}})",
+       "recentchangesdays-max": "Máximo $1 {{PLURAL:$1|día|díes}}",
        "recentchangescount": "Númberu d'ediciones p'amosar de mou predetermináu:",
        "prefs-help-recentchangescount": "Incluye los cambios recientes, los historiales de páxines y los rexistros.",
        "prefs-help-watchlist-token2": "Esta ye la clave secreta pa la canal de noticies web de la so llista de vixilancia.\nCualquiera que la sepa podrá lleer la so llista de vixilancia; nun la comparta.\n[[Special:ResetTokens|Calque equí si necesita reaniciala]].",
        "timezonelegend": "Estaya horaria:",
        "localtime": "Hora llocal:",
        "timezoneuseserverdefault": "Usar la predeterminada de la wiki ($1)",
-       "timezoneuseoffset": "Otru (especificar diferencia)",
+       "timezoneuseoffset": "Otra (especificar allancia)",
        "servertime": "Hora del sirvidor:",
-       "guesstimezone": "Obtener del navegador",
+       "guesstimezone": "Rellenar del navegador",
        "timezoneregion-africa": "África",
        "timezoneregion-america": "América",
        "timezoneregion-antarctica": "Antártida",
        "prefs-namespaces": "Espacios de nome",
        "default": "predetermináu",
        "prefs-files": "Ficheros",
-       "prefs-custom-css": "CSS personalizada",
-       "prefs-custom-js": "JS personalizada",
+       "prefs-custom-css": "CSS personalizáu",
+       "prefs-custom-js": "JavaScript personalizáu",
        "prefs-common-css-js": "CSS/JavaScript compartíu pa toles pieles:",
        "prefs-reset-intro": "Pues usar esta páxina pa reaniciar les preferencies a los valores predeterminaos del sitiu.\nEsto nun se pue desfacer.",
        "prefs-emailconfirm-label": "Confirmación del corréu:",
        "yourlanguage": "Llingua:",
        "yourvariant": "Variante llingüística del conteníu:",
        "prefs-help-variant": "La ortografía o variante que prefieres p'amosar el conteníu de les páxines d'esta wiki.",
-       "yournick": "Firma:",
+       "yournick": "Firma nueva:",
        "prefs-help-signature": "Los comentarios nes páxines d'alderique habría que roblales con \"<nowiki>~~~~</nowiki>\" que se convertirán na to robla y una marca de tiempu.",
-       "badsig": "Firma cruda non válida; comprueba les etiquetes HTML.",
-       "badsiglength": "La to robla ye demasiao llarga.\nHa tener menos de $1 {{PLURAL:$1|caráuter|carauteres}}.",
+       "badsig": "El códigu de la firma ye inválidu; comprueba les etiquetes HTML.",
+       "badsiglength": "La to robla ye demasiao llarga.\nHa tener menos de $1 {{PLURAL:$1|caráuter|caráuteres}}.",
        "yourgender": "¿Qué descripción prefieres?",
        "gender-unknown": "Al mentate, el software usará palabres de xéneru neutru siempre que seya posible",
        "gender-male": "Él edita páxines wiki",
        "prefs-help-prefershttps": "Esta preferencia aplicaráse nel siguiente aniciu de sesión.",
        "prefswarning-warning": "Ficisti cambios nes tos preferencies qu'inda nun se guardaron.\nSi abandones esta páxina ensin calcar \"$1\" les preferencies nun s'anovarán.",
        "prefs-tabs-navigation-hint": "Gabitu: pue usar les tecles de flecha izquierda y drecha pa navegar peles llingüetes de la llista.",
-       "email-address-validity-valid": "La direición de corréu paez válida",
-       "email-address-validity-invalid": "Escribi una direición de corréu válida",
        "userrights": "Xestión de permisos d'usuariu",
        "userrights-lookup-user": "Xestión de grupos del usuariu",
-       "userrights-user-editname": "Escribi un nome d'usuariu:",
-       "editusergroup": "Modificar grupos d'usuariu",
+       "userrights-user-editname": "Escribe un nome d'usuariu:",
+       "editusergroup": "Editar los grupos del usuariu",
        "editinguser": "Camudando los permisos {{GENDER:$1|del usuariu|de la usuaria}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar los grupos d'usuariu",
        "saveusergroups": "Guardar los grupos d'usuariu",
        "right-minoredit": "Marcar ediciones como menores",
        "right-move": "Treslladar páxines",
        "right-move-subpages": "Treslladar les páxines coles sos subpáxines",
-       "right-move-rootuserpages": "Treslladar páxines d'un usuariu root",
+       "right-move-rootuserpages": "Treslladar páxines principales d'usuariu",
        "right-move-categorypages": "Treslladar les páxines de categoría",
-       "right-movefile": "Treslladar archivos",
-       "right-suppressredirect": "Nun crear una redireición dende'l nome antiguu cuando se tresllada una páxina",
+       "right-movefile": "Treslladar ficheros",
+       "right-suppressredirect": "Nun dexar redireición al treslladar páxines",
        "right-upload": "Xubir ficheros",
-       "right-reupload": "Sobreescribir un archivu esistente",
-       "right-reupload-own": "Sobreescribir un archivu esistente xubíu pol mesmu usuariu",
-       "right-reupload-shared": "Anular llocalmente archivos del depósitu compartíu multimedia",
-       "right-upload_by_url": "Xubir un archivu dende una direición URL",
-       "right-purge": "Purgar la caché del sitiu pa una páxina que nun tenga páxina de confirmación",
+       "right-reupload": "Sustituir los ficheros esistentes",
+       "right-reupload-own": "Sustituir los ficheros esistentes xubíos por ún mesmu",
+       "right-reupload-shared": "Anular llocalmente los ficheros del estoyu de multimedia compartíu",
+       "right-upload_by_url": "Xubir ficheros dende una URL",
+       "right-purge": "Purgar sin confirmación la caché d'una páxina nel sitiu",
        "right-autoconfirmed": "Nun tar afeutáu por llendes de tasa basaes na IP",
        "right-bot": "Tratar como un procesu automatizáu",
        "right-nominornewtalk": "Nun amosar l'avisu de nuevos mensaxes cuando se faen ediciones menores en páxines d'alderique",
-       "right-apihighlimits": "Usar los llímites superiores nes consultes API",
+       "right-apihighlimits": "Usar les llendes superiores nes consultes API",
        "right-writeapi": "Usar l'API d'escritura",
-       "right-delete": "Esborrar páxines",
-       "right-bigdelete": "Esborrar páxines con historiales grandes",
+       "right-delete": "Desaniciar páxines",
+       "right-bigdelete": "Desaniciar páxines con historiales grandes",
        "right-deletelogentry": "Desaniciar y restaurar entraes del rexistru determinaes",
-       "right-deleterevision": "Eliminar y restaurar revisiones específiques de les páxines",
+       "right-deleterevision": "Desaniciar y restaurar revisiones específiques de les páxines",
        "right-deletedhistory": "Ver entraes eliminaes del historial ensin testu asociáu",
        "right-deletedtext": "Ver el testu desaniciáu y los cambeos ente versiones desaniciaes",
        "right-browsearchive": "Buscar páxines desaniciaes",
        "right-suppressionlog": "Ver rexistros privaos",
        "right-block": "Bloquiar la edición d'otros usuarios",
        "right-blockemail": "Bloquia-y l'unviu de corréu electrónicu a un usuariu",
-       "right-hideuser": "Bloquiar un nome d'usuariu ocultándolu al públicu",
-       "right-ipblock-exempt": "Saltar los bloqueos d'IP, los autobloqueos y los bloqueos d'intervalu",
+       "right-hideuser": "Bloquiar un nome d'usuariu, tapeciéndolu al públicu",
+       "right-ipblock-exempt": "Saltar los bloqueos d'IP, los autobloqueos y los bloqueos de rangos",
        "right-proxyunbannable": "Saltar los bloqueos automáticos de los proxys",
        "right-unblockself": "Desbloquiase ún mesmu",
        "right-protect": "Camudar los niveles de proteición y editar páxines protexíes en cascada",
        "right-editsemiprotected": "Editar les páxines protexíes como \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Editar el modelu de conteníu d'una páxina",
        "right-editinterface": "Editar la interfaz d'usuariu",
-       "right-editusercssjs": "Editar los archivos CSS y JS d'otros usuarios",
-       "right-editusercss": "Editar los archivos CSS d'otros usuarios",
-       "right-edituserjs": "Editar los archivos JS d'otros usuarios",
+       "right-editusercssjs": "Editar los ficheros CSS y JavaScript d'otros usuarios",
+       "right-editusercss": "Editar los ficheros CSS d'otros usuarios",
+       "right-edituserjs": "Editar los ficheros JavaScript d'otros usuarios",
        "right-editmyusercss": "Editar los propios ficheros CSS d'usuariu",
        "right-editmyuserjs": "Editar los propios ficheros JavaScript d'usuariu",
        "right-viewmywatchlist": "Ver la llista de vixilancia propia",
        "right-viewmyprivateinfo": "Ver los datos privaos propios (p. ex. direición de corréu, nome real)",
        "right-editmyprivateinfo": "Editar los datos privaos propios (p. ex. direición de corréu, nome real)",
        "right-editmyoptions": "Editar les preferencies propies",
-       "right-rollback": "Revertir rápido a un usuariu qu'editó una páxina determinada",
+       "right-rollback": "Revertir rápido les ediciones del caberu usuariu qu'editó una páxina determinada",
        "right-markbotedits": "Marcar les ediciones revertíes como ediciones de bot",
        "right-noratelimit": "Nun tar afeutáu polos llímites de tasa",
        "right-import": "Importar páxines dende otres wikis",
-       "right-importupload": "Importar páxines dende un archivu",
-       "right-patrol": "Marcar les ediciones como supervisaes",
+       "right-importupload": "Importar páxines dende un ficheru xubíu",
+       "right-patrol": "Marcar ediciones d'otros como supervisaes",
        "right-autopatrol": "Marcar automáticamente les ediciones como supervisaes",
-       "right-patrolmarks": "Ver les marques de supervisión de los cambeos recientes",
+       "right-patrolmarks": "Ver les marques de supervisión nos cambeos de recién",
        "right-unwatchedpages": "Ver una llista de páxines non vixilaes",
        "right-mergehistory": "Fusionar historiales de páxines",
        "right-userrights": "Editar tolos drechos d'usuariu",
        "wlheader-showupdated": "Les páxines que camudaron dende que les visitasti anteriormente amuesense en '''negrina'''",
        "wlnote": "Abaxo {{PLURAL:$1|tá'l caberu cambiu|tan los caberos <strong>$1</strong> cambios}} {{PLURAL:$2|na cabera hora|nes caberes <strong>$2</strong> hores}}, a día $3, a les $4.",
        "wlshowlast": "Amosar les últimes $1 hores, los últimos $2 díes",
+       "watchlistall2": "toos",
+       "watchlist-hide": "Anubrir",
+       "wlshowtime": "Periodu de tiempu a amosar:",
+       "wlshowhideminor": "ediciones menores",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "usuarios rexistraos",
+       "wlshowhideanons": "usuarios anónimos",
+       "wlshowhidepatr": "ediciones supervisaes",
+       "wlshowhidemine": "les mios ediciones",
        "watchlist-options": "Opciones de la llista de siguimientu",
        "watching": "Vixilando...",
        "unwatching": "Dexando de vixilar...",
        "contributions": "Collaboraciones {{GENDER:$1|del usuariu|de la usuaria}}",
        "contributions-title": "Contribuciones d'usuariu pa $1",
        "mycontris": "Collaboraciones",
+       "anoncontribs": "Contribuciones",
        "contribsub2": "Pa {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.",
        "nocontribs": "Nun s'atoparon cambeos que coincidan con esi criteriu.",
        "movenosubpage": "Esta páxina nun tien subpáxines.",
        "movereason": "Motivu:",
        "revertmove": "revertir",
-       "delete_and_move": "Esborrar y treslladar",
        "delete_and_move_text": "==Necesítase esborrar==\n\nLa páxina de destín \"[[:$1]]\" yá esiste. ¿Quies esborrala pa dexar sitiu pal treslláu?",
        "delete_and_move_confirm": "Sí, esborrar la páxina",
        "delete_and_move_reason": "Desaniciada pa facer sitiu pa treslladar dende «[[$1]]»",
        "tooltip-pt-preferences": "Les tos preferencies",
        "tooltip-pt-watchlist": "Llista de les páxines nes que tas vixilando los cambios",
        "tooltip-pt-mycontris": "Llista de les tos collaboraciones",
+       "tooltip-pt-anoncontribs": "Una llista d'ediciones feches dende esta dirección IP",
        "tooltip-pt-login": "T'encamentamos que t'identifiques, anque nun ye obligatorio",
        "tooltip-pt-logout": "Salir",
        "tooltip-pt-createaccount": "Encamentámoste que crees una cuenta y qu'anicies sesión; sicasí, nun ye obligatorio",
        "htmlform-cloner-required": "Necesítase polo menos un valor.",
        "htmlform-title-badnamespace": "[[:$1]] nun ta nel espaciu de nomes \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "«$1» nun ye un títulu de páxina que pueda crease",
-       "htmlform-title-not-exists": "[[:$1]] nun esiste.",
+       "htmlform-title-not-exists": "$1 nun esiste.",
        "htmlform-user-not-exists": "<strong>$1</strong> nun esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> nun ye un nome d'usuariu válidu.",
        "sqlite-has-fts": "$1 con sofitu pa busca de testu completu",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloquió}} a {{GENDER:$4|$3}} con un tiempu de caducidá de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambió}} la configuracion del bloquéu a {{GENDER:$4|$3}} con un tiempu de caducidá de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importó}} $3 xubiendo un ficheru",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importó}} $3 xubiendo un ficheru ($4 {{PLURAL:$4|revisión|revisiones}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importó}} $3 dende otra wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importó}} $3 dende $5 ($4 {{PLURAL:$4|revisión|revisiones}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|fusionó}} «$3» con «$4» (revisiones fasta la $5)",
        "logentry-move-move": "$1 {{GENDER:$2|treslladó}} la páxina \"$3\" a \"$4\"",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|treslladó}} la páxina \"$3\" a \"$4\" ensin dexar una redireición",
index f5e0e57..1dd92a1 100644 (file)
@@ -26,7 +26,8 @@
                        "Arystanbek",
                        "Dağlı95",
                        "Sayginer",
-                       "Şeyx Şamil"
+                       "Şeyx Şamil",
+                       "Serkanland"
                ]
        },
        "tog-underline": "Keçidlərin altını xətlə:",
        "pagecategories": "$1 {{PLURAL:$1|Kateqoriya|Kateqoriya}}",
        "category_header": "\"$1\" kateqoriyasındakı məqalələr",
        "subcategories": "Alt kateqoriyalar",
-       "category-media-header": "\"$1\" kateqoriyasında mediya",
+       "category-media-header": "\"$1\" kateqoriyasındakı fayllar",
        "category-empty": "\"Bu kateqoriya hal-hazırda boşdur.\"",
        "hidden-categories": "{{PLURAL:$1|Gizli kateqoriya|Gizli kateqoriyalar}}",
        "hidden-category-category": "Gizli kateqoriyalar",
        "disclaimers": "Məsuliyyətdən imtina",
        "disclaimerpage": "Project:Məsuliyyətdən imtina",
        "edithelp": "Redaktə kömək",
+       "helppage-top-gethelp": "Kömək",
        "mainpage": "Ana Səhifə",
        "mainpage-description": "Ana Səhifə",
        "policy-url": "Project:Qaydalar",
        "hidetoc": "gizlə",
        "collapsible-collapse": "Gizlə",
        "collapsible-expand": "Göstər",
+       "confirmable-confirm": "{{GENDER:$1|Siz}} əminsiniz?",
        "confirmable-yes": "Bəli",
        "confirmable-no": "Xeyr",
        "thisisdeleted": "$1 bax və ya bərpa et?",
        "nstab-template": "Şablon",
        "nstab-help": "Kömək",
        "nstab-category": "Kateqoriya",
+       "mainpage-nstab": "Ana Səhifə",
        "nosuchaction": "Bu cür fəaliyyət mövcud deyil.",
        "nosuchactiontext": "URL-də göstərilən əməliyyat düzgün deyil.\nOla bilsin ki, URL-i səhv daxil etmisiniz və ya düzgün olmayan keçiddən istifadə etmisiniz.\nBu həmçinin, {{SITENAME}} saytındakı xətanın göstəricisi ola bilər.",
        "nosuchspecialpage": "Bu adda xüsusi səhifə mövcud deyil",
        "createaccountreason": "Səbəb:",
        "createacct-reason": "Səbəb",
        "createacct-reason-ph": "Niyə başqa bir hesab yaradırsınız",
-       "createacct-captcha": "Təhlükəsizlik nəzarəti",
-       "createacct-imgcaptcha-ph": "Yuxarıda gördüyünüz mətni daxil edin",
        "createacct-submit": "İstifadəçi hesabı yarat",
        "createacct-another-submit": "Başqa bir istifadəçi hesabı yarat",
        "createacct-benefit-heading": "{{SITENAME}} sizin kimi insanlar tərəfindən yaradılır.",
        "passwordreset-email": "E-mail ünvanı:",
        "passwordreset-emailtitle": "{{SITENAME}} hesabın yaradılması",
        "passwordreset-emailelement": "İstifadəçi adı: \n$1\n\nMüvəqqəti parol: \n$2",
-       "passwordreset-emailsent": "Xəbərdarlıq məktubu e-maillə göndərildi.",
+       "passwordreset-emailsentemail": "Xəbərdarlıq məktubu e-maillə göndərildi.",
        "changeemail": "E-məktub ünvanını dəyiş",
        "changeemail-oldemail": "Hazırkı e-poçt ünvanı:",
        "changeemail-newemail": "Yeni e-poçt ünvanı:",
        "notextmatches": "Məqalələrdə uyğun məzmun tapılmadı",
        "prevn": "əvvəlki {{PLURAL:$1|$1}}",
        "nextn": "sonrakı {{PLURAL:$1|$1}}",
+       "prev-page": "əvvəlki səhifə",
+       "next-page": "növbəti səhifə",
        "prevn-title": "Əvvəlki bir $1 {{PLURAL:$1|nəticə|nəticə}}",
        "nextn-title": "Əvvəlki bir $1 {{PLURAL:$1|nəticə|nəticə}}",
        "shown-title": "Səhifə üçün $1 {{PLURAL:$1|nəticə|nəticəyə}} bax",
        "search-result-category-size": "{{PLURAL:$1|$1 element|$1 elementlər}} ({{PLURAL:$2|$2 alt kateqoriya|$2 alt kateqoriyalar}}, {{PLURAL:$3|$3 fayl|$3 fayllar}})",
        "search-redirect": "(yönləndirmə $1)",
        "search-section": "(bölmə $1)",
+       "search-category": "(kateqoriya $1)",
        "search-suggest": "Bəlkə, bunu nəzərdə tuturdunuz: $1",
        "search-interwiki-caption": "Qardaş layihələr",
        "search-interwiki-default": "$1 nəticələri:",
        "skin-preview": "Sınaq görüntüsü",
        "datedefault": "Seçim yoxdur",
        "prefs-labs": "eksperimental imkanlar",
+       "prefs-user-pages": "İstifadəçi səhifəsi",
        "prefs-personal": "İstifadəçi profili",
        "prefs-rc": "Son dəyişikliklər",
        "prefs-watchlist": "İzləmə siyahısı",
        "prefs-dateformat": "Tarix formatı",
        "prefs-timeoffset": "Saat qurşağının fərqi",
        "prefs-advancedediting": "Ümumi parametrlər",
+       "prefs-editor": "Redaktor",
        "prefs-advancedrc": "Ətraflı variantlar",
        "prefs-advancedrendering": "Ətraflı variantlar",
        "prefs-advancedsearchoptions": "Ətraflı variantlar",
        "prefs-displayrc": "Görüntü variantları",
        "prefs-displaywatchlist": "Görüntü variantları",
        "prefs-diffs": "Fərqlər",
-       "email-address-validity-valid": "E-poçt ünvanı düzgündür",
-       "email-address-validity-invalid": "Düzgün e-poçt ünvanı daxil edin",
        "userrights": "İstifadəçi hüququ idarəsi",
        "userrights-lookup-user": "İstifadəçi qruplarını idarə et",
        "userrights-user-editname": "İstifadəçi adınızı yazın:",
        "recentchanges-label-newpage": "Bu dəyişiklik yeni səhifə yaratdı",
        "recentchanges-label-minor": "Bu kiçik redaktədir",
        "recentchanges-label-bot": "Bu redaktə bot tərəfindən edilmişdir",
-       "recentchanges-label-unpatrolled": "Bu redaktə hələ nəzərdən keçirilməmişdir",
+       "recentchanges-label-unpatrolled": "Bu redaktə hələ patrullanmayıb",
        "recentchanges-label-plusminus": "Səhifənin ölçüsü bayt miqdarı ilə təyin edilir",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (həmçinin bax: [[Special:NewPages|yeni səhifələrin siyahısı]])",
        "rcshowhidebots-show": "Göstər",
        "rcshowhidebots-hide": "Gizlət",
        "rcshowhideliu": "Qeydiyyatlı istifadəçiləri $1",
+       "rcshowhideliu-show": "Göstər",
        "rcshowhideliu-hide": "Gizlət",
        "rcshowhideanons": "Anonim istifadəçiləri $1",
        "rcshowhideanons-show": "Göstər",
        "rcshowhideanons-hide": "Gizlət",
        "rcshowhidepatr": "Yoxlanılmış redaktələri $1",
+       "rcshowhidepatr-show": "Göstər",
+       "rcshowhidepatr-hide": "Gizlət",
        "rcshowhidemine": "Mənim redaktələrimi $1",
        "rcshowhidemine-show": "Göstər",
        "rcshowhidemine-hide": "Gizlət",
+       "rcshowhidecategorization-show": "Göstər",
+       "rcshowhidecategorization-hide": "Gizlət",
        "rclinks": "Son $2 gün ərzindəki son $1 dəyişikliyi göstər <br />$3",
        "diff": "fərq",
        "hist": "tarixçə",
        "upload-misc-error": "Naməlum yükləmə xətası",
        "upload-too-many-redirects": "URL-də xeyli yönləndirmə var",
        "upload-http-error": " HTTP xətası var : $1",
+       "upload-dialog-title": "Fayl yüklə",
+       "upload-dialog-button-cancel": "İmtina",
+       "upload-dialog-button-done": "Oldu",
+       "upload-dialog-button-save": "Qeyd et",
+       "upload-dialog-button-upload": "Yüklə",
+       "upload-form-label-select-file": "Fayl seç",
+       "upload-form-label-infoform-title": "Detallar",
+       "upload-form-label-infoform-name": "Ad",
+       "upload-form-label-infoform-description": "İzah",
+       "upload-form-label-usage-title": "İstifadə",
+       "upload-form-label-usage-filename": "Fayl adı",
+       "foreign-structured-upload-form-label-own-work": "Bu mənim öz işimdir",
+       "foreign-structured-upload-form-label-infoform-categories": "Kateqoriyalar",
+       "foreign-structured-upload-form-label-infoform-date": "Tarix",
        "backend-fail-notexists": "\"$1\" faylı mövcud deyil",
        "backend-fail-delete": "\"$1\" faylı sililmədi.",
        "backend-fail-copy": "\"$1\" faylı \"$2\" faylına kopyalanmır.",
        "nolicense": "Heç biri seçilməmişdir",
        "upload_source_url": "(siz düzgün, hər kəsin daxil ola biləcəyi URL seçdiniz)",
        "upload_source_file": "(siz kompüterinizdəki faylı seçdiniz)",
+       "listfiles-delete": "sil",
        "listfiles_search_for": "Media adı üçün axtar:",
        "imgfile": "fayl",
        "listfiles": "Fayl siyahısı",
        "listfiles_size": "Həcm",
        "listfiles_description": "İzah",
        "listfiles_count": "Versiya",
+       "listfiles-latestversion-yes": "Bəli",
+       "listfiles-latestversion-no": "Xeyr",
        "file-anchor-link": "Fayl",
        "filehist": "Faylın tarixçəsi",
        "filehist-help": "Faylın əvvəlki versiyasını görmək üçün gün/tarix bölməsindəki tarixləri tıqlayın.",
        "unusedtemplates": "İstifadəsiz şablonlar",
        "unusedtemplateswlh": "digər keçidlər",
        "randompage": "İxtiyari səhifə",
+       "randomincategory-category": "Kateqoriya:",
+       "randomincategory-submit": "Get",
        "randomredirect": "İxtiyari istiqamətləndirmə",
        "randomredirect-nopages": "\"$1\" ad sahəsində heç bir yönləndirmə yoxdur.",
        "statistics": "Statistika",
        "statistics-users": "Qeydiyyatdan keçmiş [[Special:ListUsers|istifadəçilər]]",
        "statistics-users-active": "Aktiv istifadəçilər",
        "statistics-users-active-desc": "Son {{PLURAL:$1|gün|$1 gündə}} iş görən istifadəçilər",
+       "pageswithprop-submit": "Get",
        "doubleredirects": "İkiqat istiqamətləndirmələr",
        "double-redirect-fixed-move": "[[$1]] səhifəsinin yeri dəyişdirilib.\nO avtomatik yenilənib və [[$2]] səhifəsinə yönləndirilib.",
        "double-redirect-fixed-maintenance": "[[$1]] səhifəsindən [[$2]] səhifəsinə ikiqat yönləndirmə avtomatik düzəldilir.",
        "protectedpages-indef": "Yalnız müddətsiz mühafizələr",
        "protectedpages-cascade": "Yalnız kaskad mühafizələr",
        "protectedpagesempty": "Hal-hazırda bu parametrə uyğun heç bir mühafizəli səhifə yoxdur",
+       "protectedpages-page": "Səhifə",
+       "protectedpages-unknown-timestamp": "Naməlum",
        "protectedtitles": "Mühafizəli başlıqlar",
        "listusers": "İstifadəçi siyahısı",
        "listusers-editsonly": "Yalnız redaktələri olan istifadəçiləri göstər",
        "listgrouprights-removegroup-self": "Öz hesabından $1 {{PLURAL:$2|qrupunu|qruplarını}} sil",
        "listgrouprights-addgroup-self-all": "Bütün qrupları öz hesabına əlavə edə bilər",
        "listgrouprights-removegroup-self-all": "Bütün qrupları öz hesabından çıxara bilər",
+       "listgrouprights-namespaceprotection-namespace": "Adlar fəzası",
        "mailnologin": "Ünvan yoxdur",
        "emailuser": "İstifadəçiyə e-məktub göndər",
        "defemailsubject": "\"$1\" adlı istifadəçidən {{SITENAME}} e-məktubu",
        "wlheader-showupdated": "Son ziyarətinizdən sonra edilən dəyişikliklər '''qalın şriftlərlə''' göstərilmişdir.",
        "wlnote": "Aşağıdakı {{PLURAL:$1|'''$1''' dəyişiklik|'''$1''' dəyişiklik}} son {{PLURAL:$2|saatda|'''$2''' saatda}} edilmişdir.",
        "wlshowlast": "Bunları göstər: son $1 saatı $2 günü",
+       "watchlistall2": "hamısı",
+       "wlshowhidemine": "mənimn redaktələrim",
        "watchlist-options": "İzləmə siyahısının nizamlamaları",
        "watching": "İzlənilir...",
        "unwatching": "İzlənilmir...",
        "enotif_reset": "Baxılmış bütün səhifələri işarələ.",
        "enotif_impersonal_salutation": "{{SITENAME}} istifadəçisi",
+       "enotif_body_intro_moved": "{{SITENAME}}da  $1 səhifəsinin adı $PAGEEDITDATE tarixində $2 tərəfindən {{GENDER:$2|dəyişdirilib}}, son versiya üçün bura baxın: $3.",
        "enotif_lastvisited": "Sonuncu ziyarətinizdən indiyədək olan bütün dəyişiklikləri görmək üçün baxın: $1.",
        "enotif_lastdiff": "Bu dəyişikliyi görmək üçün $1 səhifəsinə baxın.",
        "enotif_anon_editor": "qeydiyyatsız istifadəçi $1",
        "revertpage-nouser": "(istifadəçi adı çıxarılmış) tərəfindən edilən dəyişikliklər [[User:$1|$1]] tərəfindən edilən son dəyişikliyə geri alındı",
        "rollback-success": "$1 tərəfindən edilmiş redaktələr geri qaytarıldı; $2 tərəfindən yaradılmış son versiya bərpa olundu.",
        "sessionfailure-title": "Giriş səhvi",
+       "changecontentmodel-reason-label": "Səbəb:",
+       "logentry-contentmodel-change-revertlink": "geri qaytar",
+       "logentry-contentmodel-change-revert": "geri qaytar",
        "protectlogpage": "Mühafizə etmə qeydləri",
        "protectedarticle": "\"[[$1]]\" səhifəsi mühafizə edildi",
        "modifiedarticleprotection": "\"[[$1]]\" səhifəsi üçün mühafizə səviyyəsi dəyişildi",
        "movenosubpage": "Bu səhifənin altsəhifəsi yoxdur.",
        "movereason": "Səbəb:",
        "revertmove": "Əvvəlki vəziyyətinə",
-       "delete_and_move": "Sil və apar",
        "delete_and_move_text": "==Hazırki məqalənin silinməsi lazımdır==\n\n\"[[$1]]\" məqaləsi mövcuddur. Bu dəyişikliyin yerinə yetirilə bilməsi üçün həmin məqalənin silinməsini istəyirsinizmi?",
        "delete_and_move_confirm": "Bəli, səhifəni sil",
        "delete_and_move_reason": "[[$1]] Ad dəyişməyə yer açmaq üçün silinmişdir",
        "allmessages-filter-modified": "Dəyişdirilmiş",
        "allmessages-language": "Dil:",
        "allmessages-filter-submit": "Keç",
+       "allmessages-filter-translate": "Tərcümə et",
        "thumbnail-more": "Böyüt",
        "filemissing": "Şəkil gözlənilir",
        "thumbnail_error": "Kiçik şəkil yaratma xətası: $1",
        "pageinfo-contentpage": "Məzmunlu səhifə kimi sayılır",
        "pageinfo-contentpage-yes": "Bəli",
        "pageinfo-protect-cascading": "Kaskad mühafizə burada qoşulub",
+       "pageinfo-protect-cascading-yes": "Bəli",
        "pageinfo-category-pages": "Səhifələrin sayı",
        "pageinfo-category-subcats": "Altkateqoriyaların sayı",
        "pageinfo-category-files": "Faylların sayı",
        "markaspatrolleddiff": "Yoxlanıldı",
        "markaspatrolledtext": "Səhifəni patrullanmış kimi işarələ",
        "markedaspatrolled": "Yoxlanıldı",
-       "markedaspatrolledtext": "[[:$1]] üçün seçilmiş versiya gözdən keçirilərək işarələndi.",
+       "markedaspatrolledtext": "[[:$1]] məqaləsinin seçilmiş versiyası patrullanmış kimi işarələndi.",
        "rcpatroldisabled": "Son dəyişikliklərin patrullanması qadağandır",
        "rcpatroldisabledtext": "Son dəyişikliklərin Yoxlanılması hal-hazırda mümkün deyil.",
        "markedaspatrollederror": "Yoxlanmadı",
        "markedaspatrollederror-noautopatrol": "Öz dəyişikliklərinizi yoxlayıb işarələyə bilməzsiniz.",
+       "markedaspatrollednotify": "\"$1\" səhifəsindəki bu redaktə patrullanmış kimi işarələndi.",
        "patrol-log-page": "Patrul gündəliyi",
        "patrol-log-header": "Bu yoxlanmış dəyişikliklərin gündəliyidir.",
        "log-show-hide-patrol": "$1 patrul gündəliyi",
        "svg-long-desc": "SVG fayl, nominal olaraq $1 × $2 piksel, faylın ölçüsü: $3",
        "show-big-image": "Faylın əsli",
        "show-big-image-preview": "Sınaq göstərişi ölçüsü: $1.",
-       "show-big-image-other": "Dig'r {{PLURAL:$2|nəticə|nəticələr}}: $1.",
+       "show-big-image-preview-differ": "Bu $2-faylın $3 formatındakı bu görünüşünün ölçüsü: $1.",
+       "show-big-image-other": "Digər {{PLURAL:$2|ölçü|ölçülər}}: $1.",
        "show-big-image-size": "$1 × $2 piksel",
        "file-info-gif-looped": "ilmələnib",
        "file-info-gif-frames": "$1 {{PLURAL:$1|frame|çərçivə}}",
        "confirm-purge-top": "Bu səhifə keşdən (cache) silinsin?",
        "confirm-watch-button": "OK",
        "confirm-unwatch-button": "OK",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "&larr; əvvəlki səhifə",
        "imgmultipagenext": "sonrakı səhifə &rarr;",
        "imgmultigo": "Seç!",
        "version-software-product": "Məhsul",
        "version-software-version": "Versiya",
        "version-entrypoints-header-url": "URL",
+       "version-libraries-library": "Kitabxana",
+       "version-libraries-authors": "Müəlliflər",
+       "redirect-user": "İstifadəçi ID-si",
+       "redirect-page": "Səhifə ID-si",
        "fileduplicatesearch": "Dublikat fayl axtarışı",
        "fileduplicatesearch-legend": "Dublikatı axtar",
        "fileduplicatesearch-filename": "Fayl adı:",
        "tags-title": "Etiketlər",
        "tags-tag": "Etiket adı",
        "tags-description-header": "Anlamının tam açıqlaması",
+       "tags-source-header": "Mənbə",
        "tags-active-header": "Aktiv?",
        "tags-hitcount-header": "Etiketli dəyişikliklər",
+       "tags-actions-header": "Hərəkətlər",
        "tags-active-yes": "Bəli",
        "tags-active-no": "Xeyr",
        "tags-edit": "redaktə",
+       "tags-delete": "sil",
+       "tags-activate": "aktivləşdirmək",
        "tags-hitcount": "$1 {{PLURAL:$1|dəyişiklik|dəyişiklik}}",
+       "tags-create-reason": "Səbəb:",
+       "tags-create-submit": "Yarat",
+       "tags-delete-reason": "Səbəb:",
+       "tags-activate-reason": "Səbəb:",
+       "tags-deactivate-reason": "Səbəb:",
+       "tags-edit-existing-tags-none": "\"Yox\"",
+       "tags-edit-new-tags": "Yeni taqlar:",
+       "tags-edit-reason": "Səbəb:",
        "comparepages": "Səhifələri qarşılaşdır",
        "compare-page1": "Səhifə 1",
        "compare-page2": "Səhifə 2",
        "htmlform-submit": "Təsdiq et",
        "htmlform-reset": "Dəyişiklikləri geri qaytar",
        "htmlform-selectorother-other": "Digər",
+       "htmlform-no": "Xeyr",
+       "htmlform-yes": "Bəli",
        "sqlite-has-fts": "$1 tam mətn axtarma ilə",
        "sqlite-no-fts": "$1 tam mətn axtarma olmadan",
        "logentry-delete-delete": "$1 $3 səhifəsini {{GENDER:$2|sildi}}",
        "feedback-bugnew": "Mən yoxladım. Yeni xəta barədə xəbər ver",
        "feedback-cancel": "İmtina",
        "feedback-close": "Oldu",
+       "feedback-error-title": "Xəta",
        "feedback-error2": "Xəta: Redaktə qeydə alınmadı",
        "feedback-message": "Mesaj:",
        "feedback-subject": "Mövzu:",
+       "feedback-thanks-title": "Təşəkkür!",
        "searchsuggest-search": "Axtar",
        "api-error-filename-tooshort": "Fayl adı qısadır.",
        "api-error-filetype-banned": "Bu tip fayllar qadağandır.",
        "limitreport-walltime": "Real vaxt istifadəsi",
        "expand_templates_output": "Nəticə",
        "expand_templates_ok": "OK",
+       "pagelang-name": "Səhifə",
+       "pagelang-language": "Dil",
+       "mediastatistics-header-unknown": "Naməlum",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videolar",
+       "mediastatistics-header-office": "Ofis",
+       "mediastatistics-header-text": "Mətn",
        "special-characters-group-latin": "Latın",
        "special-characters-group-latinextended": "Latın genişləndirilmiş",
        "special-characters-group-ipa": "IPA",
index 0c1c30f..6b2d86f 100644 (file)
        "create": "یارات",
        "create-local": "یئرلی آچیقلاما آرتیر",
        "editthispage": "بۇ صحیفه‌‌نی دَییشدیر",
-       "create-this-page": "بۇ صحیفه‌‌نی يارات",
+       "create-this-page": "بۇ صفحه‌‌نی يارات",
        "delete": "سیل",
        "deletethispage": "بۇ صحیفه‌‌نی سیل",
        "undeletethispage": "بۇ صحیفه‌نی دیریلت",
        "createaccountreason": "نَدَن‌لیک:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
-       "createacct-captcha": "امنیت یوخلاماسی",
-       "createacct-imgcaptcha-ph": "اۆستده‌کی گؤردوگونوز یازینی یازین",
        "createacct-submit": "حسابینیزی یارادین",
-       "createacct-another-submit": "بÛ\8cر Ø¨Ø§Ø´Ù\82ا Ø­Ø³Ø§Ø¨ Û\8cارات",
+       "createacct-another-submit": "حساب یارات",
        "createacct-benefit-heading": "{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.",
        "createacct-benefit-body1": "{{PLURAL:$1|دَییشیکلیک}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
        "passwordreset-emailtext-ip": "بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون رمزی یئنیله‌مک ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر گون|$5 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.\nسیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
        "passwordreset-emailtext-user": "{{SITENAME}} سایتیندا، $1 ایستیفاده‌چی، سیزین اوردا ($4) حسابینیزین رمزینی یئنیله‌مک ایستگی وئریب‌دیر. آشاغیداکی {{PLURAL:$3|ایستیفاده‌چی|ایستیفاده‌چیلر}} بو ایمیل ایله ایلگیلیدیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر|$5گون}} سونرا واختلاری قورتاراجاق‌دیر. \nسیز گرک ایندی گیریب و بیر یئنی رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
        "passwordreset-emailelement": "ایشلدن آدی: \n$1\n\nگئچیجی رمز: \n$2",
-       "passwordreset-emailsent": "بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.",
+       "passwordreset-emailsentemail": "بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.",
        "passwordreset-emailsent-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.",
        "passwordreset-emailerror-capture": "آشاغیدا گؤستریلن کیمی بیر رمز یئنیله‌مه ایمیلی یارادیلیب‌دیر، اما {{GENDER:$2ایستیفاده‌چی}}‌یه گؤندرمگی باشاریلی اولمادی: $1",
-       "changeemail": "ایمیل آدرسینی دَییشدیر",
-       "changeemail-text": "ایمیل آدرسینیزی دَییشمک اوچون بو فورمو دولدورون. بو دَییشیگی دوغرولاماق اوچون رمزینیزی وئرمه‌لیسینیز.",
+       "changeemail": "ایمیل آدرسینی دَییشدیر یا سیل",
+       "changeemail-header": "ایمیل آدرسیزی دَییشدیرمک اوچون بو فورمو دولدورون. حسابیزا بوتون ایمیل‌لرین ارتباطینی کسمک اوچون، یئنی ایمیل آدرسینی بوش ساخلایین.",
+       "changeemail-passwordrequired": "بو دَییشمه‌نی دوغرولاماق اوچون، رمزینیزی یازمالیسیز.",
        "changeemail-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
        "changeemail-oldemail": "ایندیکی ایمیل آدرس:",
        "changeemail-newemail": "یئنی ایمیل آدرسی:",
        "sig_tip": "سیزین ایمضانیز واخت ایله",
        "hr_tip": "دوزئی خط (آز ایشلدین)",
        "summary": "قیساسی:",
-       "subject": "قونو/باشلیق:",
+       "subject": "قونو:",
        "minoredit": "بو بیر کیچیک دَییشدیرمه‌دیر",
        "watchthis": "بو صفحه‌نی ایزله",
        "savearticle": "صفحه‌نی ساخلا",
        "missingsummary": "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «{{int:savearticle}}» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
        "selfredirect": "<strong>دیققت:</strong>سیز صفحه نین یولون اوزونه دَییشدیریمک حالیندا سیز.\nایمکانی وار یانلیش سون بیر یئری یولون دَییشمک اوچون سئچیب سیز،یا دا صفحه نی یانلیش دَییشدیرسیز.\nایر\"{{int:savearticle}}\" اوستون یئنی دن باساسینیز یولون دَییشیکلیگی دوزلجک.",
        "missingcommenttext": "لوطفاً آشاغی‌دا بیر یوروم یازین.",
-       "missingcommentheader": "'''یادا سالما:''' سیز یورومونوز اوچون بیر قونو/باشلیق یازمامیسینیز.\n«{{int:savearticle}}»-ی تیک‌لاسازسا، دَییشیکلیگینیز، قونو/باشلیق-ی اولمایاراق قئید اولوناجاق‌دیر.",
+       "missingcommentheader": "<strong>یادا سالما:</strong> سیز یورومونوز اوچون بیر قونو یازمامیسینیز.\n«{{int:savearticle}}»-ی تیک‌لاسازسا، دَییشیکلیگینیز، قونوسوز قئید اولوناجاق‌دیر.",
        "summary-preview": "قیسا اؤن‌گؤستریش:",
-       "subject-preview": "قونو/باشلیق اؤن‌گؤستریشی:",
+       "subject-preview": "قونو اؤن‌گؤستریشی:",
        "previewerrortext": "سیزین دَییشدیرمه‌لرینیزین اؤن‌گؤسترمه‌سینده بیر خطا قاباغا گلدی.",
        "blockedtitle": "ایستیفاده‌چی باغلانیب",
        "blockedtext": "' 'ایستیفاده‌چی آدی و یا آی پی عنوانینیز قاباغی باغلانیب دیر.'\n\nسیزی باغلایان$ 1. الیله اولوب دیر \nباغلاماق سببی:' $ 2.\n\n* باغلانمانین باشلانان زامانی: $ 8\n* باغلانمانین قورتولان زامانی: $ 6\n* باغلانما مدتی: $ 7\n\nگؤستریلن سببه گؤره ائنگئللئنمئنیزین اویغون اولمادیغینی دوشونورسونوزسه، $ 1 یا دا باشقا بیر [[{{MediaWiki:Grouppage-sysop}}|مدیر]]  ایله بو وضعیتی گؤروشه بیلرسینیز. [[Special:Preferences|ترجیح لرینیز]] قیسمینده اعتبارلی بیر ائ-پوچت اونوانی گیرمئدیسئنیز \"ایستیفاده‌چییه ائ-پوچت گؤندر\" خصوصیتینی ایستیفاده ائده، ترجیهلرینیز ایمیل عنوانینیزی علاوه ایمیل گؤندرمک حقوقونا صاحب اولاجاقسینیز.\nبو آنکی باغلانما عنوانینیز $ 3، ائنگئللئنمئ نؤمره‌نیز # $ 5.\nبیر ایداره‌چی‌لر وضعیتینیز حاقیندا معلومات آلماق ایستدیگینیزده و یا هر هانسی بیر سورگودا بو معلومات‌لار لازیم اولا‌جاق، خاهیش ائدیریک نوت ائدین.",
        "readonlywarning": "'''دیقت: باخیم سببی ایله دیتابیس بو آندا قیفیللی‌دیر. بو سببله دییشیک‌لیکلری‌نین بو آندا قئید ائدیل میه‌جکدیر. یازدیقلارینیزی باشقا بیر فایل‌دا آلیب ساخلایا و داها سونرا یئنی‌دن بورا گتیریب یازا بیلرسینیز.\n\nاونو قیفیل‌لایان ایداره‌چی، بو شرحی وئریب‌دیر: $1",
        "protectedpagewarning": "' 'خاطیرلیریق: بو ​​صحیفه باغلانیب دیر و یالنیز مودیر اولان‌لار طرفین‌دن دییش‌دیریله بیلر.'\nسون گونده‌لیک گیردی‌سی ایستیناد مقصدلی آشاغیدا وئریلمیش‌دیر:",
        "semiprotectedpagewarning": "'قئید:' بو صحیفه محافظه‌لی اولدوغو اوچون یالنیز قئیدیات‌دان کئچمیش ایستیفاده‌چی‌لر دییشدیر ائده بیلرلر.",
-       "cascadeprotectedwarning": "'''خاطیرلایریق:''' بو صحیفه بو یئرده {{PLURAL:$1|صحیفهٔ|صحیفه‌لر}} یئرلشمیه یه گوره آبشاری- حفظ اولونوب آلتیندا باغلانیب بونجه مودیر فقط ائلیه بیله لر دییشدیر ائده بیلسین لر",
+       "cascadeprotectedwarning": "<strong>خاطیرلایریق:</strong> بو صحیفه بو یئرده {{PLURAL:$1|صحیفهٔ|صحیفه‌لر}} یئرلشمگه گوره آبشاری حفظ اولونوب آلتیندا باغلانیب بونجه مودیر فقط ائلیه بیله‌لر دییشدیر ائده بیلسینلر",
        "titleprotectedwarning": "'دیققت! بو صحیفه محافظه‌لی‌دیر، یالنیز [[Special:ListGroupRights|ایجازه سی اولان]] ایستیفاده‌چی‌لر اونو دییشدیر ائده بیلرلر.'",
        "templatesused": "{{PLURAL:$1|شابلون}} بو صفحه‌ده ایشلنیب‌دیر:",
        "templatesusedpreview": "{{PLURAL:$1|بیر|$1}} شابلون بو اؤن‌گؤستریش‌ده ایشلنیب‌دیر:",
        "prefs-watchlist-token": "ایزله‌دیک‌لر آدرسی:",
        "prefs-misc": "باشقا",
        "prefs-resetpass": "رمزی دَییشدیر",
-       "prefs-changeemail": "ایمیل آدرسینی دَییشدیر",
+       "prefs-changeemail": "ایمیل آدرسینی دَییشدیر یا سیل",
        "prefs-setemail": "بیر ایمیل آدرسی وئر",
        "prefs-email": "ایمیل ترجیحلری",
        "prefs-rendering": "گؤرونوش",
        "prefs-help-prefershttps": "سیزین بو ترجیحینیزین اثری سیزین سونراکی گیریشینیز دن سونرا اولاجاق.",
        "prefswarning-warning": "ترجیحلرینیزه اولان دَییشیک لر هله آرتیریلمیب.\nایر بو صفحه نین \"$1\" اوستونه باسیلمامیشدان اونجه ترک ائتسز ترجیحلرینیز آرتیریلمییاجاق.",
        "prefs-tabs-navigation-hint": "ایپ اوجو : سیز ائلیه بیلرسیز ساغ و سول جهت نیما کیلید لریندن نیشانه نه نین دولانماسی نیشانه لر لیستینده ایستفاده ائده سیز.",
-       "email-address-validity-valid": "ایمیل آدرسی، گئچرلی نظره گلیر",
-       "email-address-validity-invalid": "گئچرلی بیر ایمیل آدرسی وئرین",
        "userrights": "ایستیفاده‌چی حاقلاری ایداره‌سی",
        "userrights-lookup-user": "ایستیفاده‌چی گروپلاری ایداره‌سی",
        "userrights-user-editname": "ایستیفاده‌چی آدی‌نیزی یازین",
        "upload-dialog-button-done": "اولدو",
        "upload-dialog-button-save": "ذخیره ائت",
        "upload-dialog-button-upload": "یوکله",
-       "upload-process-error": "بیر یالنیشلیق اولدو",
-       "upload-process-warning": "بیر خطا باش وئردی",
        "upload-form-label-select-file": "فایل سئچ",
        "upload-form-label-infoform-title": "جوزئیات",
        "upload-form-label-infoform-name": "آد",
        "wlheader-showupdated": "سون گؤروشونوزدن سوْنرا ائدیلن دییشیکلیکلر '''قالین''' گؤرسدیلیب‌دیر.",
        "wlnote": "آشاغیداکی {{PLURAL:$1|بیر ديَیشیک‌لیک|<strong>$1</strong> ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|<strong>$2</strong> ساعتدا}} ائدیلمیشدیر. $3، $4",
        "wlshowlast": "سون $1 ساعات $2 گون گؤستر",
+       "watchlistall2": "بوتون",
        "watchlist-options": "ایزله‌دیکلر سئچمه‌لری",
        "watching": "ایزله‌نیلیر...",
        "unwatching": "ایزله‌مه...",
        "movenosubpage": "بو صحیفه‌نین آلت صحیفه‌سی یوخ‌دور.",
        "movereason": "ندن:",
        "revertmove": "قایتار",
-       "delete_and_move": "سیل و آپار",
        "delete_and_move_text": "==هازیرکی مقاله‌نین سیلینمه‌سی لازیم‌دیر==\n\n«[[:$1]]» مقاله‌سی مؤوجوددور. بو دییشیکلیگین یئرینه یئتیریله بیلمه‌سی اوچون همین مقاله‌نین سیلینمه‌سینی ایستییرسینیزمی؟",
        "delete_and_move_confirm": "بلی، صحیفنی سیل",
        "delete_and_move_reason": "«[[$1]]» آد دَییشمه ‌یه یئر آچماق اوچون سیلینمیش‌دیر",
        "semiprotectedpagemovewarning": "'''قئید:' بو صحیفه کیلیدلنمیش، یالنیز قئیدیات‌لی ایستیفاده‌چی‌لر داشییا بیلر.\nسون گونده‌لیک گیردی‌سی ایستیناد مقصدلی آشاغیدا وئریلمیش‌دیر:",
        "move-over-sharedrepo": "== فایل مؤوجود ==\n[[:$1]] پایلاشیلمیش هوووزدا مؤوجود. بیر فایلی بو باشلیغا داشیماق پایلاشیلمیش فایلین اوستونه گله‌جک.",
        "file-exists-sharedrepo": "سئچیلن آد پایلاشیلمیش بیر هوووزدا اونسوز دا مؤوجود.\nخاهیش ائدیریک باشقا بیر آد سئچین.",
-       "export": "صحیفه‌‌لری ائشیگه چیخارت",
+       "export": "صفحه‌‌لری ائشیگه چیخارت",
        "exporttext": "مویین بیر صحیفه و یا صحیفه کومانداسینین متنی و دییشدیرمه کئچمیشینی خمل ایله ساری‌لی اولا‌راق خاریجه کؤچوره بیلرسینیز.\nبو، مئدیاویکی ایستیفاده باشقا بیر ویکی [[Special:Import|ایچه کؤچورمه صحیفه‌سی]] ایله ایچه کؤچوروله بیلر.\n\nصحیفه‌لری خاریجه کؤچورمک اوچون، باش‌لیق‌لاری آشاغی‌داکی متن قوتوسونا داخیل ائدین، هر سطره بیر دنه، و کؤهنه سوروملئرلئ بیرلیکده ایندیکی وئرسیاسی، صحیفه کئچمیشی سطرلرینی، یا دا سون دییشیک‌لیک ملوماتییلا بیرلیکده آکتوال وئرسیاسی ایسته‌ییب ایستمدیگینیزی قئید ائدین.\n\nسونونجو حالدا، بیر لینک ده ایستیفاده ائده بیلرسینیز، هؤر: \"[[{{MediaWiki:Mainpage}}]]\" صحیفه‌سی اوچون [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
        "exportall": "بوتون صحیفه‌لری خاریجه کؤچور",
        "exportcuronly": "بوتون تاریخچنی دئییل، یالنیز حال-هازیرکی نوسخه نی داخیل ائت",
        "spam_reverting": "$1-ه باغلانتیسی اولمایان سون نوسخه‌یه قایتاریلیر",
        "spam_blanking": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، بوشادیلیر",
        "spam_deleting": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، سیلینیر",
-       "simpleantispam-label": "ضید هرز یازما بررسلیغی.\nبو قیسمتی'''دولدورمایین'''!",
+       "simpleantispam-label": "ضد اِسپم یوخلاماسی.\nبورانی <strong>دولدورمایین</strong>!",
        "pageinfo-title": "«$1» اوچون بیلگیلر",
        "pageinfo-not-current": "تأسفله بو بیلگیلری اسکی نوسخه‌لره وئرمک اولانماز بیر ایش‌دیر.",
        "pageinfo-header-basic": "اساس معلومات‌لار",
        "autosumm-blank": "صحیفه‌‌نی بوشالتدی",
        "autosumm-replace": "صحیفه‌‌نین مظمونو ' $1' يازیسی ایله ديَیشدیریلدی",
        "autoredircomment": "[[$1]] صحیفه‌‌سینه ایستیقامتلندیریلیر",
-       "autosumm-new": "صحیفه‌‌نی ' $1' ایله يارات",
+       "autosumm-new": "صفحه‌‌نی ' $1' ایله ياراتدی",
        "autosumm-newblank": "بوش صحفه یاراندی",
        "lag-warn-normal": "$1 {{PLURAL:$1 | سانیيه‌دن | سانیيه‌ده}} يئنی ديَیشیکلیکلر بو سیياهیدا گؤرولمه‌يه.",
        "lag-warn-high": "وئریلنلر بازاسی سونوجوسونداکی هددیندن آرتیق گئجیکمه‌دن گؤره، $1 {{PLURAL:$1 | سانیيه‌دن | سانیيه‌دن}} يئنی ديَیشیکلیکلر بو سیياهیدا گؤرونمئيئبیلیر.",
        "specialpages": "اؤزل صفحه‌لر",
        "specialpages-note": "* نورمال اؤزل صفحه‌لر.\n* <span class=\"mw-specialpagerestricted\">محدودلاشدیریلمیش اؤزل صفحه‌لر.</span>",
        "specialpages-group-maintenance": "جاری مروزه‌لر",
-       "specialpages-group-other": "دÛ\8cگر Ø®ØµÙ\88صÛ\8c ØµØ­Û\8cÙ\81ه‌لر",
+       "specialpages-group-other": "Ø¢Û\8cرÛ\8c Ø§Ø¤Ø²Ù\84 ØµÙ\81Ø­ه‌لر",
        "specialpages-group-login": "گیریش / حساب یاراد",
        "specialpages-group-changes": "سون دییشیک‌لیک‌لر و قئیدلر",
        "specialpages-group-media": "مئدیا مروزه‌لری و یوکلمه‌لر",
        "specialpages-group-users": "ایستیفاده‌چی‌لر و حاقلار",
        "specialpages-group-highuse": "ان چوخ ایستیفاده ائدیلن صحیفه‌لر",
        "specialpages-group-pages": "صحیفه‌لرین سیاهی‌لاری",
-       "specialpages-group-pagetools": "صحیفه آلتلری",
+       "specialpages-group-pagetools": "صفحه آلتلری",
        "specialpages-group-wiki": "بیلگیلر و آلتلر",
        "specialpages-group-redirects": "خصوصی ایستیقامتلندیرمه صحیفه‌لری",
        "specialpages-group-spam": "هرزه یازماق آلت‌لری",
        "tags-edit-chosen-no-results": "تای اولان اِتیکِت تاپیلمادی",
        "tags-edit-reason": "ندن:",
        "tags-edit-nooldid-title": "گئچرسیز هدف نوسخه",
-       "comparepages": "صحیفه‌لری قارشی‌لاش‌دیر",
+       "comparepages": "صفحه‌لری موقایسه ائت",
        "compare-page1": "صفحه 1",
        "compare-page2": "صفحه ۲",
        "compare-rev1": "نوسخه ۱",
        "htmlform-cloner-required": "ان آزی بیر دیَر گرکلیدیر.",
        "htmlform-title-badnamespace": "[[:$1]]، «{{ns:$2}}» آدفضاسیندا دئییل.",
        "htmlform-title-not-creatable": "«$1» بیر یارانا بیلن صفحه آدی دئییل",
-       "htmlform-title-not-exists": "[[:$1]] یوخدور.",
+       "htmlform-title-not-exists": "$1 یوخدور.",
        "htmlform-user-not-exists": "<strong>$1</strong> یوخدور.",
        "htmlform-user-not-valid": "<strong>$1</strong> بیر دوزگون ایشلدن آدی دئییل.",
        "sqlite-has-fts": "$1 بوتون یازی آختارما دستگی‌له",
index 9a1c8fb..6b50ef1 100644 (file)
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Tadaw ta ika magmumukna nin ibang panindog",
-       "createacct-captcha": "Rikisang panseguridad",
-       "createacct-imgcaptcha-ph": "Pakikaag an tekstong nahihiling mo sa ibabaw",
        "createacct-submit": "Muknaon an saimong panindog",
        "createacct-another-submit": "Magmukna nin ibang panindog",
        "createacct-benefit-heading": "{{SITENAME}} pinaghimo kan mga tawong siring mo.",
        "wlheader-showupdated": "Mga pahina na pinagriliwat poon kaidtong huri kang nagbisita sainda ipinapatanaw na '''mahîbog'''",
        "wlnote": "Sa ibaba an {{PLURAL:$1|huring pagbabago|mga huring '''$1''' pagbabago}} sa nakaaging {{PLURAL:$2|oras|'''$2''' mga oras}}, magpoon pa kan $3, $4.",
        "wlshowlast": "Ipahilíng an nakaaging $1 na mga oras mga $2 na aldaw",
+       "watchlistall2": "gabos",
        "watchlist-options": "Bantay-listahan na mga pagpipilian",
        "watching": "Pigbabantayan...",
        "unwatching": "Dai pigbabantayan...",
        "htmlform-yes": "Iyo",
        "htmlform-chosen-placeholder": "Magpili nin sarong opsyon",
        "htmlform-title-not-creatable": "\"$1\" bako sarong maimumuknang titulo kan pahina",
-       "htmlform-title-not-exists": "[[:$1]] bakong eksistido.",
+       "htmlform-title-not-exists": "$1 bakong eksistido.",
        "sqlite-has-fts": "$1 na igwang suporta sa kabilogang-teksto nin paghahanap",
        "sqlite-no-fts": "$1 na mayong suporta sa kabilogang-teksto nin paghahanap",
        "logentry-delete-delete": "$1 {{GENDER:$2|pinagpura na}} pahina $3",
index 4d226b5..3d8a3bc 100644 (file)
@@ -50,6 +50,7 @@
        "tog-watchlisthidebots": "Хаваць праўкі робатаў у сьпісе назіраньня",
        "tog-watchlisthideminor": "Хаваць дробныя праўкі ў сьпісе назіраньня",
        "tog-watchlisthideliu": "Хаваць праўкі зарэгістраваных удзельнікаў у сьпісе назіраньня",
+       "tog-watchlistreloadautomatically": "Аўтаматычна перазагружаць сьпіс назіраньня пры зьмене фільтру (патрэбны JavaScript)",
        "tog-watchlisthideanons": "Хаваць праўкі ананімаў у сьпісе назіраньня",
        "tog-watchlisthidepatrolled": "Хаваць патруляваныя праўкі ў сьпісе назіраньня",
        "tog-watchlisthidecategorization": "Хаваць катэгарызацыю старонак",
        "morenotlisted": "Гэта ня поўны сьпіс.",
        "mypage": "Старонка",
        "mytalk": "Гутаркі",
-       "anontalk": "Гутаркі для гэтага IP-адрасу",
+       "anontalk": "Гутаркі",
        "navigation": "Навігацыя",
        "and": "&#32;і",
        "qbfind": "Знайсьці",
        "databaseerror-query": "Запыт: $1",
        "databaseerror-function": "Функцыя: $1",
        "databaseerror-error": "Памылка: $1",
+       "transaction-duration-limit-exceeded": "Каб пазьбегнуць вялікай затрымкі пры рэплікацыі, гэтая транзакцыя была спыненая, таму што працягласьць запісу ($1) перавысіла ліміт у $2 сэк.\nКалі вы адначасова зьмяняеце некалькі элемэнтаў, паспрабуйце замест гэтага зрабіць некалькі невялікіх апэрацыяў.",
        "laggedslavemode": "<strong>Увага:</strong> старонка можа ня ўтрымліваць апошнія зьмены.",
        "readonly": "База зьвестак заблякаваная",
        "enterlockreason": "Пазначце прычыну блякаваньня і заплянаваны час разблякаваньня",
        "missingarticle-rev": "(вэрсія № $1)",
        "missingarticle-diff": "(Розьніца: $1, $2)",
        "readonly_lag": "База зьвестак была аўтаматычна заблякаваная да выкананьня рэплікацыі галоўнай базы зьвестак з другаснымі",
+       "nonwrite-api-promise-error": "Быў дасланы HTTP-загаловак «Promise-Non-Write-API-Action», але запыт быў зроблены да модулю запісу API.",
        "internalerror": "Унутраная памылка",
        "internalerror_info": "Унутраная памылка: $1",
        "internalerror-fatal-exception": "Фатальнае выключэньне тыпу «$1»",
        "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "createacct-reason-ph": "Зь якой мэтай вы ствараеце іншы рахунак",
-       "createacct-captcha": "Праверка бясьпекі",
-       "createacct-imgcaptcha-ph": "Увядзіце тэкст, што бачыце вышэй",
        "createacct-submit": "Стварыць рахунак",
        "createacct-another-submit": "Стварыць рахунак",
        "createacct-benefit-heading": "{{SITENAME}} створаная людзьмі, такімі як вы.",
        "wrongpasswordempty": "Быў уведзены пусты пароль. Калі ласка, паспрабуйце яшчэ раз.",
        "passwordtooshort": "Паролі павінны ўтрымліваць ня менш за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.",
        "passwordtoolong": "Паролі ня могуць быць даўжэй за $1 {{PLURAL:$1|сымбаль|сымбалі|сымбаляў}}.",
+       "passwordtoopopular": "Нельга выкарыстоўваць простыя паролі. Калі ласка, абярыце больш складаны пароль.",
        "password-name-match": "Ваш пароль павінен адрозьнівацца ад Вашага імя ўдзельніка.",
        "password-login-forbidden": "Выкарыстаньне гэтага імя ўдзельніка і паролю было забароненае.",
        "mailmypassword": "Скінуць пароль",
        "passwordreset-emailtext-ip": "Нехта (магчыма Вы, з IP-адрасу $1) зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дні|дзён}}.\nЦяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.",
        "passwordreset-emailtext-user": "Удзельнік $1 зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дні|дзён}}.\nЦяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.",
        "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
-       "passwordreset-emailsent": "Калі гэты адрас электроннай пошты зарэгістраваны для вашага рахунку, тады будзе дасланы ліст пра скідваньне паролю.",
+       "passwordreset-emailsentemail": "Калі гэты адрас электроннай пошты зарэгістраваны для вашага рахунку, тады будзе дасланы ліст пра скідваньне паролю.",
+       "passwordreset-emailsentusername": "Калі зарэгістраваны адпаведны адрас электроннай пошты, тады будзе дасланы ліст пра скідваньне паролю.",
        "passwordreset-emailsent-capture": "Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.",
        "passwordreset-emailerror-capture": "Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1",
        "changeemail": "Зьмяніць або выдаліць адрас электроннай пошты",
        "showingresultsinrange": "Ніжэй паказаныя да {{PLURAL:$1|<strong>$1</strong> выніку ў|<strong>$1</strong> вынікаў у}} дыяпазоне ад <strong>$2</strong> да <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|1=Вынік <strong>$1</strong> з <strong>$3</strong>|Вынікі <strong>$1—$2</strong> з <strong>$3</strong>}}",
        "search-nonefound": "Супадзеньняў па запыце ня знойдзена.",
+       "search-nonefound-thiswiki": "Супадзеньняў па запыце ня знойдзена на гэтым сайце.",
        "powersearch-legend": "Удасканалены пошук",
        "powersearch-ns": "Шукаць у прасторах назваў:",
        "powersearch-togglelabel": "Пазначыць:",
        "prefs-help-prefershttps": "Гэтая налада набудзе моц пры наступным уваходзе ў сыстэму.",
        "prefswarning-warning": "Вы зрабілі зьмены ў вашых наладах, якія яшчэ не былі захаваныя.\nКалі вы закрыеце гэтую старонку і не націсьніце «$1», вашыя налады ня будуць абноўленыя.",
        "prefs-tabs-navigation-hint": "Падказка: вы можаце пераходзіць паміж укладкамі ў сьпісе ўкладак з дапамогай клявішаў налева і направа.",
-       "email-address-validity-valid": "Выглядае слушна",
-       "email-address-validity-invalid": "Неабходны слушны адрас!",
        "userrights": "Кіраваньне правамі ўдзельнікаў і ўдзельніц",
        "userrights-lookup-user": "Кіраваньне групамі ўдзельнікаў і ўдзельніц",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
        "recentchanges-label-plusminus": "Памер старонкі зьмяніўся на такую колькасьць байтаў",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (глядзіце таксама [[Special:NewPages|сьпіс новых старонак]])",
+       "recentchanges-submit": "Паказаць",
        "rcnotefrom": "Ніжэй {{PLURAL:$5|знаходзіцца зьмена|знаходзяцца зьмены}} з <strong>$4 $3</strong> (да <strong>$1</strong> на старонку).",
        "rclistfrom": "Паказаць зьмены з $2 $3",
        "rcshowhideminor": "$1 дробныя праўкі",
        "foreign-structured-upload-form-label-own-work-message-local": "Я пацьвярджаю, што загружаю гэты файл згодна з правіламі і ліцэнзійнай палітыкай {{GRAMMAR:родны|{{SITENAME}}}}.",
        "foreign-structured-upload-form-label-not-own-work-message-local": "Калі вы ня можаце загрузіць файл у адпаведнасьці з правіламі {{GRAMMAR:родны|{{SITENAME}}}}, калі ласка, закрыйце гэтае акно і паспрабуйце іншы мэтад.",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Вы таксама можаце паспрабаваць [[Special:Upload|старонку загрузкі па змоўчаньні]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Я разумею, што загружаю гэты файл у агульнае сховішча. Я пацьвярджаю, што раблю гэта ў адпаведнасьці з умовамі выкарыстаньня і ліцэнзійнай палітыкай.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Калі вы ня можаце загрузіць гэты файл паводле правілаў агульнага сховішча, калі ласка, закрыйце гэты дыялёг і паспрабуйце іншы мэтад.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Вы можаце паспрабаваць скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі гэты файл можна туды загрузіць згодна з правіламі.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Я пацьвярджаю, што зьяўляюся ўласьнікам аўтарскіх правоў на гэты файл, і згодны незваротна перадаць гэты файл ў Вікісховішча на ўмовах ліцэнзіі [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], а таксама згодны з [https://wikimediafoundation.org/wiki/Terms_of_Use умовамі выкарыстаньня].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Калі вы не зьяўляецеся ўласьнікам аўтарскіх правоў на гэты файл, або вы жадаеце распаўсюджваць яго пад іншай ліцэнзіяй, можаце скарыстацца [https://commons.wikimedia.org/wiki/Special:UploadWizard Майстарам загрузкі ў Вікісховішча].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Вы таксама можаце скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі правілы сайту дазваляюць загрузку такога файлу.",
        "backend-fail-stream": "Немагчыма накіраваць файл $1.",
        "backend-fail-backup": "Немагчыма зрабіць рэзэрвовую копію файла $1.",
        "backend-fail-notexists": "Файл $1 не існуе.",
        "mostrevisions": "Старонкі з найбольшай колькасьцю рэдагаваньняў",
        "prefixindex": "Усе старонкі з пачаткам назваў",
        "prefixindex-namespace": "Усе старонкі з прэфіксам (прастора назваў $1)",
+       "prefixindex-submit": "Паказаць",
        "prefixindex-strip": "Прыбраць прэфікс у сьпісе",
        "shortpages": "Кароткія старонкі",
        "longpages": "Доўгія старонкі",
        "protectedpages-performer": "Хто абараніў",
        "protectedpages-params": "Парамэтры абароны",
        "protectedpages-reason": "Прычына",
+       "protectedpages-submit": "Паказаць старонкі",
        "protectedpages-unknown-timestamp": "Невядома",
        "protectedpages-unknown-performer": "Невядомы ўдзельнік",
        "protectedtitles": "Забароненыя старонкі",
        "wlheader-showupdated": "Старонкі, зьмененыя з часу вашага апошняга візыту, вылучаныя '''тоўстым''' шрыфтам.",
        "wlnote": "Ніжэй {{PLURAL:$1|паказаная <strong>$1</strong> апошняя зьмена|паказаныя <strong>$1</strong> апошнія зьмены|паказаныя <strong>$1</strong> апошніх зьменаў}} за <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзінаў}}, па стане на $4 $3.",
        "wlshowlast": "Паказаць за апошнія $1 гадзінаў, $2 дзён",
+       "watchlistall2": "усё",
+       "watchlist-hide": "Схаваць",
+       "wlshowtime": "Пэрыяд часу для паказу:",
+       "wlshowhideminor": "дробныя праўкі",
+       "wlshowhidebots": "робатаў",
+       "wlshowhideliu": "зарэгістраваных удзельнікаў",
+       "wlshowhideanons": "ананімных удзельнікаў",
+       "wlshowhidepatr": "патруляваныя праўкі",
+       "wlshowhidemine": "мае праўкі",
        "watchlist-options": "Налады сьпісу назіраньня",
        "watching": "Дадаецца ў сьпіс назіраньня…",
        "unwatching": "Выдаляецца са сьпісу назіраньня…",
        "contributions": "Унёсак {{GENDER:$1|удзельніка|удзельніцы}}",
        "contributions-title": "Унёсак {{GENDER:$1|удзельніка|удзельніцы}} $1",
        "mycontris": "Унёсак",
+       "anoncontribs": "Унёсак",
        "contribsub2": "Для {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Рахунак удзельніка «$1» не зарэгістраваны.",
        "nocontribs": "Ня знойдзена зьменаў, якія адпавядаюць гэтым крытэрыям.",
        "blocklist-userblocks": "Схаваць блякаваньні рахункаў",
        "blocklist-tempblocks": "Схаваць часовыя блякаваньні",
        "blocklist-addressblocks": "Схаваць блякаваньні асобных IP-адрасоў",
-       "blocklist-rangeblocks": "хаваньне блякаваньняў дыяпазонаў",
+       "blocklist-rangeblocks": "Схаваць блякаваньні дыяпазонаў",
        "blocklist-timestamp": "Дата/час",
        "blocklist-target": "Мэта",
        "blocklist-expiry": "Сканчаецца",
        "movenosubpage": "Гэтая старонка ня мае падстаронак.",
        "movereason": "Прычына:",
        "revertmove": "адкат",
-       "delete_and_move": "Выдаліць і перанесьці",
        "delete_and_move_text": "==Патрабуецца выдаленьне==\nМэтавая старонка «[[:$1]]» ужо існуе.\nЦі жадаеце Вы яе выдаліць, каб вызваліць месца для пераносу?",
        "delete_and_move_confirm": "Так, выдаліць старонку",
        "delete_and_move_reason": "Выдаленая, каб вызваліць месца для пераносу «[[$1]]»",
        "tooltip-pt-preferences": "Вашыя налады",
        "tooltip-pt-watchlist": "Сьпіс старонак, за зьменамі якіх Вы назіраеце",
        "tooltip-pt-mycontris": "Ваш унёсак",
+       "tooltip-pt-anoncontribs": "Сьпіс рэдагаваньняў, зробленых з гэтага IP-адрасу",
        "tooltip-pt-login": "Вас запрашаюць увайсьці, хаця гэта і неабавязкова.",
        "tooltip-pt-logout": "Выйсьці",
        "tooltip-pt-createaccount": "Мы прапануем вам стварыць рахунак і ўвайсьці, але гэта не абавязкова",
        "tooltip-t-recentchangeslinked": "Апошнія зьмены ў старонках, на якія спасылаецца гэтая старонка",
        "tooltip-feed-rss": "RSS-стужка для гэтай старонкі",
        "tooltip-feed-atom": "Atom-стужка для гэтай старонкі",
-       "tooltip-t-contributions": "Ð\9fаказаÑ\86Ñ\8c Ñ\83нÑ\91Ñ\81ак Ð³Ñ\8dÑ\82ага Ñ\83дзельніка/гэтай удзельніцы",
+       "tooltip-t-contributions": "УнÑ\91Ñ\81ак Ð³Ñ\8dÑ\82ага Ñ\9eдзельніка/гэтай удзельніцы",
        "tooltip-t-emailuser": "Даслаць ліст гэтаму ўдзельніку/гэтай удзельніцы па электроннай пошце",
        "tooltip-t-info": "Болей інфармацыі пра гэтую старонку",
        "tooltip-t-upload": "Загрузіць файлы",
        "tooltip-minoredit": "Пазначыць гэтую зьмену як дробную",
        "tooltip-save": "Захаваць Вашы зьмены",
        "tooltip-preview": "Праглядзець Вашы зьмены. Калі ласка, выкарыстоўвайце гэтую магчымасьць перад тым, як захаваць старонку!",
-       "tooltip-diff": "Паказаць зробленыя Вамі зьмены ў тэксьце.",
+       "tooltip-diff": "Паказаць зробленыя Вамі зьмены ў тэксьце",
        "tooltip-compareselectedversions": "Пабачыць розьніцу паміж дзьвюма абранымі вэрсіямі гэтай старонкі.",
        "tooltip-watch": "Дадаць гэтую старонку ў Ваш сьпіс назіраньня",
        "tooltip-watchlistedit-normal-submit": "Выдаліць пазначаныя старонкі",
        "svg-long-error": "Няслушны SVG-файл: $1",
        "show-big-image": "Арыгінальны файл",
        "show-big-image-preview": "Памер прагляду: $1.",
+       "show-big-image-preview-differ": "Памер гэтага $3-прагляду для $2-файлу: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Іншае разрозьненьне|Іншыя разрозьненьні}}: $1.",
        "show-big-image-size": "$1 × $2 піксэлаў",
        "file-info-gif-looped": "паўтараецца",
        "tags-edit-failure": "Гэтыя зьмены ня могуць быць дастасаваныя:\n$1",
        "tags-edit-nooldid-title": "Няслушная мэтавая вэрсія",
        "tags-edit-nooldid-text": "Вы або не пазначылі мэтавую вэрсію для выкананьня гэтай функцыі, або пазначаная вэрсія не існуе.",
+       "tags-edit-none-selected": "Калі ласка, абярыце прынамсі адну метку для дадаваньня ці выдаленьня.",
        "comparepages": "Параўнаньне старонак",
        "compare-page1": "Старонка 1",
        "compare-page2": "Старонка 2",
        "htmlform-cloner-create": "Дадаць больш",
        "htmlform-cloner-delete": "Выдаліць",
        "htmlform-cloner-required": "Патрабуецца як мінімум яшчэ адно значэньне.",
+       "htmlform-title-badnamespace": "[[:$1]] знаходзіцца не ў прасторы назваў «{{ns:$2}}».",
+       "htmlform-title-not-creatable": "«$1» — немагчымы загаловак для старонкі",
+       "htmlform-title-not-exists": "$1 не існуе.",
        "htmlform-user-not-exists": "<strong>$1</strong> не існуе.",
        "htmlform-user-not-valid": "<strong>$1</strong> — некарэктнае імя карыстальніка.",
        "sqlite-has-fts": "$1 з падтрымкай поўнатэкстнага пошуку",
        "revdelete-unrestricted": "зьнятыя абмежаваньні для адміністратараў",
        "logentry-block-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|разблякаваў|разблякавала}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} тэрмін блякаваньня {{GENDER:$4|$3}} на пэрыяд $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|заблякаваў|заблякавала}} {{GENDER:$4|$3}} на тэрмін $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} тэрмін блякаваньня {{GENDER:$4|$3}} на пэрыяд $5 $6",
+       "logentry-import-upload": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 праз загрузку файлу",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 праз загрузку файла ($4 {{PLURAL:$4|вэрсія|вэрсіі|вэрсіяў}})",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|імпартаваў|імпртавала}} $3 зь іншай вікі",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|імпартаваў|імпартавала}} $3 з $5 ($4 {{PLURAL:$4|вэрсія|вэрсіі|вэрсіяў}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|аб’яднаў|аб’яднала}} $3 у $4 (вэрсіі да $5)",
        "logentry-move-move": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|перанёс|перанесла}} старонку $3 у $4 без пакінутага перанакіраваньня",
        "logentry-newusers-create2": "$1 {{GENDER:$2|стварыў|стварыла}} рахунак $3",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|стварыў|стварыла}} рахунак $3, пароль быў дасланы электроннай поштай",
        "logentry-newusers-autocreate": "Рахунак $1 быў {{GENDER:$2|створаны}} аўтаматычна",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|перанёс|перанесла}} налады абароны з $4 на $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|зьняў|зьняла}} абарону з $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|абараніў|абараніла}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|абараніў|абараніла}} $3 $4 [каскадна]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|зьмяніў узровень|зьмяніла ўзровень}} абароны для $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|зьмяніў узровень|зьмяніла ўзровень}} абароны для $3 $4 [каскадна]",
        "logentry-rights-rights": "$1 {{GENDER:$1|зьмяніў|зьмяніла}} прыналежнасьць $3 да групы з $4 на $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$1|зьмяніў|зьмяніла}} прыналежнасьць $3 да групаў",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|быў аўтаматычна пераведзены|была аўтаматычна пераведзеная}} з групы $4 ў $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|загрузіў|загрузіла}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|загрузіў|загрузіла}} новую вэрсію $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|загрузіў|загрузіла}} $3",
+       "log-name-managetags": "Журнал кіраваньня меткамі",
+       "log-description-managetags": "На гэтай старонцы пералічаныя спасылкі, зьвязаныя зь [[Special:Tags|меткамі]]. Журнал зьмяшчае толькі падзеі, выкананыя адміністратарам уручную; меткі могуць быць створаныя або выдаленыя праграмным забесьпячэньнем вікі бяз запісу пра падзею ў журнал.",
+       "logentry-managetags-create": "$1 {{GENDER:$2|стварыў|стварыла}} метку «$4»",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|выдаліў|выдаліла}} метку «$4» (выдаленая з $5 {{PLURAL:$5|вэрсіі ці запісу журналу|вэрсіяў ці запісаў журналу}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|актываваў|актывавала}} метку «$4» дзеля выкарыстаньня ўдзельнікамі і робатамі",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|адлучыў|адлучыла}} метку «$4» дзеля выкарыстаньня ўдзельнікамі і робатамі",
+       "log-name-tag": "Журнал метак",
+       "log-description-tag": "На гэтай старонцы паказана, калі карыстальнікі дадавалі ці выдалялі [[Special:Tags|меткі]] ў асобных вэрсіях ці запісах журналу. Журнал не захоўвае дзеяньні зь меткамі, калі яны былі часткай рэдагаваньня, выдаленьня ці падобных дзеяньняў.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|дадаў|дадала}} {{PLURAL:$7|1=цэтлік|цэтлікі}} $6 да вэрсіі $4 старонкі $3",
        "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|дадаў|дадала}} {{PLURAL:$7|1=цэтлік|цэтлікі}} $6 да запісу журналу $5 старонкі $3",
        "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|выдаліў|выдаліла}} {{PLURAL:$9|1=цэтлік|цэтлікі}} $8 з вэрсіі $4 старонкі $3",
        "feedback-error1": "Памылка: невядомы вынік з API",
        "feedback-error2": "Памылка рэдагаваньня",
        "feedback-error3": "Памылка: няма адказу ад API",
+       "feedback-error4": "Памылка: немагчыма запісаць у дадзены загаловак водгуку",
        "feedback-message": "Паведамленьне:",
        "feedback-subject": "Тэма:",
        "feedback-submit": "Даслаць",
+       "feedback-terms": "Я ўсьведамляю, што інфармацыя майго агента карыстальніка ўлучае зьвесткі пра броўзэр і вэрсію апэрацыйнай сыстэмы і будзе зьмешчаная ў вольным досягу разам з маім водгукам.",
+       "feedback-termsofuse": "Я згодны прадаставіць водгук у адпаведнасьці з Умовамі карыстаньня.",
        "feedback-thanks": "Дзякуй! Ваш водгук быў разьмешчаны на старонцы «[$2 $1]».",
+       "feedback-thanks-title": "Дзякуй!",
+       "feedback-useragent": "Агент удзельніка:",
        "searchsuggest-search": "Пошук",
        "searchsuggest-containing": "утрымлівае...",
        "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "special-characters-title-endash": "кароткі працяжнік",
        "special-characters-title-emdash": "доўгі працяжнік",
        "special-characters-title-minus": "мінус",
+       "mw-widgets-dateinput-no-date": "Дата не абраная",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
+       "mw-widgets-titleinput-description-redirect": "перанакіраваньне на $1",
        "api-error-blacklisted": "Калі ласка, выбярыце іншую, апісальную назву."
 }
index afe80df..b373c35 100644 (file)
        "nstab-template": "Шаблон",
        "nstab-help": "Старонка даведкі",
        "nstab-category": "Катэгорыя",
+       "mainpage-nstab": "Галоўная старонка",
        "nosuchaction": "Няма такога дзеяння",
        "nosuchactiontext": "Недапушчальнае дзеянне (action) ў URL.\nМагчымыя прычыны -- памылка ўпісвання URL або пераход па няправільнай спасылцы; таксама магчымая памылка ў праграмах, што працуюць на пляцоўцы {{SITENAME}}.",
        "nosuchspecialpage": "Няма такой адмысловай старонкі",
        "laggedslavemode": "<strong>Увага:</strong> Старонка можа не ўтрымліваць апошніх змен.",
        "readonly": "База звестак зачынена",
        "enterlockreason": "Упішыце прычыну зачынення, а таксама меркаваны час адчынення",
-       "readonlytext": "Ð\91аза Ð´Ð°Ð½Ñ\8bÑ\85 Ð½Ðµ Ð¿Ñ\80Ñ\8bймае Ð½Ð¾Ð²Ñ\8bÑ\85 Ñ\81Ñ\82аÑ\80онак Ñ\96 Ñ\96нÑ\88Ñ\8bÑ\85 Ð·Ð¼Ñ\8fненнÑ\8fÑ\9e, Ñ\82амÑ\83 Ñ\88Ñ\82о Ñ\8fна Ð·Ð°Ñ\80аз Ð·Ð°Ñ\87Ñ\8bнена, Ð²Ñ\96даÑ\86Ñ\8c, Ð´Ð·ÐµÐ»Ñ\8f Ð°Ð±Ñ\81лÑ\83гоÑ\9eваннÑ\8f, Ð¿Ð°Ñ\81лÑ\8f Ñ\87аго Ð±Ñ\83дзе Ð²ÐµÑ\80нÑ\83Ñ\82а Ð´Ð° Ð½Ð°Ñ\80малÑ\8cнай Ð¿Ñ\80аÑ\86Ñ\8b.\n\nÐ\90дмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80, Ñ\8fкÑ\96 Ð·Ð°Ñ\87Ñ\8bнÑ\8fў базу, растлумачыў гэта так: $1",
+       "readonlytext": "Ð\91аза Ð´Ð°Ð½Ñ\8bÑ\85 Ð·Ð°Ñ\80аз Ð·Ð°Ð±Ð»Ð°ÐºÑ\96Ñ\80авана Ð°Ð´ Ð´Ð°Ð±Ð°Ñ\9eленнÑ\8f Ð½Ð¾Ð²Ñ\8bÑ\85 Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\9e Ñ\96 Ñ\96нÑ\88Ñ\8bÑ\85 Ð·Ð¼ÐµÐ½, Ð²ÐµÑ\80агодна, Ð´Ð·ÐµÐ»Ñ\8f Ð¿Ð»Ð°Ð½Ð°Ð²Ð°Ð³Ð° Ð°Ð±Ñ\81лÑ\83гоÑ\9eваннÑ\8f, Ð¿Ð°Ñ\81лÑ\8f Ñ\8fкога Ñ\8fна Ð±Ñ\83дзе Ð²ÐµÑ\80нÑ\83Ñ\82а Ð´Ð° Ð½Ð°Ñ\80малÑ\8cнай Ð¿Ñ\80аÑ\86Ñ\8b.\n\nÐ\90дмÑ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82аÑ\80, Ñ\8fкÑ\96 Ð·Ð°Ð±Ð»Ð°ÐºÑ\96Ñ\80аваў базу, растлумачыў гэта так: $1",
        "missing-article": "Не ўдалося знайсці тэксту старонкі ў базе даных, хаця ён мусіць там быць, з назвай \"$1\" $2.\n\nЗвычайна так бывае, калі адкрываюць састарэлую розніцу (diff) або спасылку з гісторыі сцёртай старонкі.\n\nКалі гэта не так, то, магчыма, гэта памылка ў праграмах.\nПаведамце пра гэта, разам з праблемным URL, аднаму з [[Special:ListUsers/sysop|адміністратараў]].",
        "missingarticle-rev": "(версія #: $1)",
        "missingarticle-diff": "(розн.: $1, $2)",
        "title-invalid-interwiki": "Запытаны загаловак зьмяшчае інтэрвікі-спасылку, якую нельга ўжываць у назвах.",
        "perfcached": "Гэта ўзятыя з кэшу звесткі, і яны могуць не быць актуальнымі. У кэшы захоўваецца не больш за {{PLURAL:$1|адзін вынік|$1 вынікі|$1 вынікаў}}.",
        "perfcachedts": "Наступныя звесткі кэшаваныя і апошні раз былі абноўленыя $1. У кэшы {{PLURAL:$4|даступны|даступныя}} не больш за $4 {{PLURAL:$4|вынік|вынікі|вынікаў}}.",
-       "querypage-no-updates": "Ð\9dемагÑ\87Ñ\8bма Ð°Ð±Ð½Ð°Ð²Ñ\96Ñ\86Ñ\8c Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ\8bÑ\8f Ð·Ð²ÐµÑ\81Ñ\82кÑ\96, Ñ\82амÑ\83 Ñ\88Ñ\82о Ð·Ð°Ñ\80аз Ð°Ð±Ð½Ð°Ñ\9eленнÑ\96 Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онкÑ\96 Ð½Ðµ Ð´Ð°Ð·Ð²Ð¾Ð»ÐµÐ½Ñ\8b.",
+       "querypage-no-updates": "Ð\90бнаÑ\9eленне Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\86Ñ\8fпеÑ\80 Ð°Ð´ÐºÐ»Ñ\8eÑ\87ана.\nÐ\9fаказанÑ\8bÑ\8f Ñ\82Ñ\83Ñ\82 Ð·Ð²ÐµÑ\81Ñ\82кÑ\96 Ð·Ð°Ñ\80аз Ð½Ðµ Ð°Ð±Ð½Ð¾Ð²Ñ\8fÑ\86Ñ\86а.",
        "viewsource": "Паказаць зыходны тэкст",
        "viewsource-title": "Прагляд зыходнага тэксту старонкі $1",
        "actionthrottled": "Дзеянне прыгашана",
        "createaccountreason": "Прычына:",
        "createacct-reason": "Прычына",
        "createacct-reason-ph": "Чаму вы ствараеце іншы ўліковы запіс",
-       "createacct-captcha": "Праверка бяспекі",
-       "createacct-imgcaptcha-ph": "Увядзіце тэкст, які вы бачыце вышэй",
        "createacct-submit": "Стварыць уліковы запіс",
        "createacct-another-submit": "Стварыць яшчэ адзін уліковы запіс",
        "createacct-benefit-heading": "{{SITENAME}} зроблены такімі ж людзьмі, як вы.",
        "accountcreatedtext": "Створаны ўліковы запіс удзельніка [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|размовы]]).",
        "createaccount-title": "Стварэнне рахунка на {{SITENAME}}",
        "createaccount-text": "На пляцоўцы {{SITENAME}} ($4) быў створаны рахунак удзельніка з гэтым адрасам эл.пошты. Назва рахунка \"$2\", пароль \"$3\". Варта адразу ўвайсці ў сістэму і змяніць пароль.\n\nКалі рахунак быў створаны памылкова, то на гэтае паведамленне можна не звяртаць увагі.",
-       "login-throttled": "Занадта многа нядаўніх спробаў увайсці пад гэтым уліковым запісам. \nПачакайце $1 перад тым, як спрабаваць ізноў.",
+       "login-throttled": "Занадта многа нядаўніх спроб увайсці пад гэтым уліковым запісам. \nПачакайце $1 перад тым, як спрабаваць ізноў.",
        "login-abort-generic": "Няўдалая спроба ўвайсці ў сістэму",
        "loginlanguagelabel": "Мова: $1",
        "suspicious-userlogout": "Ваш запыт на выхад быў адмоўлены, паколькі ён выглядае як накіраваны са зламанага браўзера або кэшаванне проксі-сервераў.",
        "retypenew": "Новы пароль паўторна:",
        "resetpass_submit": "Наставіць пароль і ўвайсці",
        "changepassword-success": "Ваш пароль паспяхова зменены!",
-       "changepassword-throttled": "Занадта многа нядаўніх спробаў увайсці пад гэтым уліковым запісам. \nПачакайце $1 перад тым, як спрабаваць ізноў.",
+       "changepassword-throttled": "Занадта многа нядаўніх спроб увайсці пад гэтым уліковым запісам. \nПачакайце $1 перад тым, як спрабаваць ізноў.",
        "resetpass_forbidden": "Не дазволена мяняць паролі",
        "resetpass-no-info": "Трэба ўвайсці ў сістэму, каб звяртацца да гэтай старонкі наўпрост.",
        "resetpass-submit-loggedin": "Змяніць пароль",
        "passwordreset-emailtext-ip": "Нехта (магчыма вы, з IP-адрасу $1) запытаў скід  вашага пароля ў праекце {{SITENAME}} ($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны|Наступныя ўліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|адзін дзень|$5 дні|$5 дзён}}.\nВы павінны зараз увайсці ў сістэму і абраць новы пароль. Калі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль і не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне і працягнуць выкарыстоўваць свой стары пароль.",
        "passwordreset-emailtext-user": "Удзельнік $1 з праекта {{SITENAME}} запытаў скід вашага пароля ў праекце {{SITENAME}}\n($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны|Наступныя уліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|$5 дзень |$5 дні |$5 дзён}}.\nВы павінны зараз увайсці ў сістэму і выбраць новы пароль. Калі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль і не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне і працягваць выкарыстоўваць свой стары пароль.",
        "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
-       "passwordreset-emailsent": "Па электроннай пошце быў адпраўлены ліст пра скід пароля.",
+       "passwordreset-emailsentemail": "Па электроннай пошце быў адпраўлены ліст пра скід пароля.",
        "passwordreset-emailsent-capture": "Ніжэй прыведзены адпраўлены ліст пра скід пароля.",
        "passwordreset-emailerror-capture": "Ніжэй прыведзены створаны ліст пра скід пароля, яго адпраўка не атрымалася па прычыне: $1",
        "changeemail": "Змяніць адрас электроннай пошты",
        "changeemail-none": "(няма)",
        "changeemail-password": "Ваш {{SITENAME}} пароль:",
        "changeemail-submit": "Змяніць адрас электроннай пошты:",
-       "changeemail-throttled": "Надта штмат спробаў увайсці пад гэтым рахункам. Пачакайце $1 перад тым, як спрабаваць ізноў.",
+       "changeemail-throttled": "Надта многа спроб увайсці пад гэтым рахункам. Пачакайце $1 перад тым, як спрабаваць ізноў.",
        "resettokens": "Скінуць токены",
        "resettokens-text": "Вы можаце пераўстанавіць токены, якія дазваляюць атрымліваць доступ да пэўных прыватных звестак, звязаных з вашым уліковым запісам.\n\nВы мусіце скінуць токены, калі выпадкова падзяліліся імі з кім-небудзь, ці ваш уліковы запіс быў скампраметаваны.",
        "resettokens-no-tokens": "Няма чаго скідваць.",
        "anonpreviewwarning": "''Вы не прайшлі ідэнтыфікацыю Захаванне будзе запісана з вашым IP адрасам у гісторыі правак гэтай старонкі.''",
        "missingsummary": "<strong>Нагадваем:</strong> вы не ўпісалі тлумачэння для сваёй праўкі. Калі націснуць \"{{int:savearticle}}\" яшчэ раз, праўка будзе замацавана без тлумачэння.",
        "missingcommenttext": "Калі ласка, увядзіце ніжэй каментарый.",
-       "missingcommentheader": "'''Увага:''' Ð²Ñ\8b Ð½Ñ\96Ñ\87ога Ð½Ðµ Ñ\9eпÑ\96Ñ\81алÑ\96 Ñ\9e Ñ\82Ñ\8dмÑ\83/загаловак Ð³Ñ\8dÑ\82ай Ð·Ð°Ñ\9eвагÑ\96. Ð\9dаÑ\86Ñ\96Ñ\81канне '{{int:savearticle}}' Ð·Ð°Ð¼Ð°Ñ\86Ñ\83е Ð²Ð°Ñ\88Ñ\83Ñ\8e Ð¿Ñ\80аÑ\9eкÑ\83 Ð· Ð¿Ñ\83Ñ\81Ñ\82ой Ñ\82Ñ\8dмай/загалоўкам.",
+       "missingcommentheader": "'''Ð\9dапамÑ\96нанне:''' Ð²Ñ\8b Ð½Ñ\96Ñ\87ога Ð½Ðµ Ñ\9eпÑ\96Ñ\81алÑ\96 Ñ\9e Ñ\82Ñ\8dмÑ\83/загаловак Ð³Ñ\8dÑ\82ай Ð·Ð°Ñ\9eвагÑ\96.\nÐ\9fÑ\80Ñ\8b Ð¿Ð°Ñ\9eÑ\82оÑ\80нÑ\8bм Ð½Ð°Ñ\86Ñ\96Ñ\81каннÑ\96 ÐºÐ½Ð¾Ð¿ÐºÑ\96 '{{int:savearticle}}' Ð²Ð°Ñ\88а Ð¿Ñ\80аÑ\9eка Ð±Ñ\83дзе Ð·Ð°Ð¿Ñ\96Ñ\81ана Ð· Ð¿Ñ\83Ñ\81Ñ\82Ñ\8bм загалоўкам.",
        "summary-preview": "Перадпаказ апісання:",
        "subject-preview": "Перадпаказ тэмы/загалоўка:",
        "blockedtitle": "Удзельнік заблакаваны",
        "accmailtitle": "Быў адасланы пароль",
        "accmailtext": "На адрас $2 быў дасланы згенераваны пароль для [[User talk:$1|$1]]. Ён можа быць зменены на <em>[[Special:ChangePassword|старонцы змены пароля]]</em> пасля ўваходу ў сістэму.",
        "newarticle": "(Новы)",
-       "newarticletext": "Ð\92Ñ\8b Ð¿ÐµÑ\80айÑ\88лÑ\96 Ð´Ð° Ñ\81Ñ\82аÑ\80онкÑ\96, Ñ\8fкой Ñ\8fÑ\88Ñ\87Ñ\8d Ð½Ñ\8fма, Ñ\96 Ñ\82амÑ\83 Ñ\82Ñ\80апÑ\96лÑ\96 Ñ\81Ñ\8eдÑ\8b. \nÐ\9aаб Ð¿Ð°Ñ\87аÑ\86Ñ\8c Ð½Ð¾Ð²Ñ\83Ñ\8e Ñ\81Ñ\82аÑ\80онкÑ\83, Ð¿Ñ\96Ñ\88Ñ\8bÑ\86е Ñ\8fе Ñ\82Ñ\8dкÑ\81Ñ\82 Ñ\83 Ð½Ñ\96жÑ\8dйпаказанÑ\8bм Ð°ÐºÐ½Ðµ Ñ\80Ñ\8dдагаваннÑ\8f (падÑ\80абÑ\8fзнаÑ\81Ñ\86Ñ\96 Ð±Ð°Ñ\87 Ñ\83 [$1 Ð´Ð°Ð²ÐµÐ´Ñ\86Ñ\8b]). \nКалі вы тут выпадкова, проста націсніце <strong>назад</strong> у браўзеры.",
+       "newarticletext": "Ð\92Ñ\8b Ð¿ÐµÑ\80айÑ\88лÑ\96 Ð¿Ð° Ñ\81паÑ\81Ñ\8bлÑ\86Ñ\8b Ð½Ð° Ñ\81Ñ\82аÑ\80онкÑ\83, Ñ\8fкой Ñ\8fÑ\88Ñ\87Ñ\8d Ð½Ñ\8fма.\nÐ\9aаб Ñ\8fе Ñ\81Ñ\82ваÑ\80Ñ\8bÑ\86Ñ\8c, Ð½Ð°Ð±Ñ\8fÑ\80Ñ\8bÑ\86е Ñ\8fе Ñ\82Ñ\8dкÑ\81Ñ\82 Ñ\83 Ð½Ñ\96жÑ\8dйпаказанÑ\8bм Ð°ÐºÐ½Ðµ Ñ\80Ñ\8dдагаваннÑ\8f (падÑ\80абÑ\8fзнаÑ\81Ñ\86Ñ\96 Ð³Ð». Ñ\9e [$1 Ð´Ð°Ð²ÐµÐ´Ñ\86Ñ\8b]).\nКалі вы тут выпадкова, проста націсніце <strong>назад</strong> у браўзеры.",
        "anontalkpagetext": "----''Гэта старонка размовы з ананімным удзельнікам, які або не мае свайго рахунка, або ім не карыстаўся. Таму дзеля яго ці яе ідэнтыфікацыі мы мусім выкарыстаць лічбавы IP-адрас. Такі адрас IP могуць дзяліць між сабою некалькі асоб. Калі вы ананімны ўдзельнік, і лічыце, што атрымліваеце няслушныя заўвагі,[[Special:UserLogin/signup|стварыце рахунак]] або [[Special:UserLogin|зайдзіце ў сістэму]], каб вас больш не блыталі з іншымі ананімнымі ўдзельнікамі.''",
        "noarticletext": "Старонка не ўтрымлівае тэксту. Вы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэткую назву]] ў іншых старонках ці <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах],\nабо [{{fullurl:{{FULLPAGENAME}}|action=edit}} папрацаваць з гэтай старонкай]</span>.",
        "noarticletext-nopermission": "Старонка не ўтрымлівае тэксту.\nВы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэткую назву]] ў іншых старонках,\nці <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах]</span>, але вы не маеце дазволу на стварэнне гэтай старонкі.",
        "previewnote": "<strong>Памятайце, гэта толькі папярэдні паказ.</strong> Праўкі яшчэ не замацаваныя!",
        "continue-editing": "Працягнуць рэдагаванне",
        "previewconflict": "Гэта папярэдні паказ магчымага выніку замацоўвання актуальнага стану крынічнага тэксту ў верхнім тэкставым полі.",
-       "session_fail_preview": "'''Не ўдалося апрацаваць вашую праўку, таму што сервер згубіў звесткі аб вашым сеансе.\nПаспрабуйце, калі ласка, ізноў. Калі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў.'''",
-       "session_fail_preview_html": "'''Не ўдалося апрацаваць вашую праўку з-за таго, што згубіліся даныя аб сеансе.'''\n\n''Перадпаказ не зроблены, бо на пляцоўцы {{SITENAME}} дазволены сыры код HTML, што робіць магчымымі атакі праз Яваскрыпт.''\n\n'''Калі гэта нармальная спроба праўкі, паспрабуйце паўтарыць запісванне. Калі і гэта не дапаможа, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і ўвайсці ізноў.'''",
+       "session_fail_preview": "'''Не ўдалося апрацаваць вашу праўку, таму што сервер згубіў звесткі аб вашым сеансе.\nПаспрабуйце, калі ласка, ізноў.\nКалі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў.'''",
+       "session_fail_preview_html": "'''Не ўдалося апрацаваць вашу праўку з-за таго, што згубіліся даныя аб сеансе.'''\n\n''Перадпаказ не зроблены, бо на пляцоўцы {{SITENAME}} дазволены сыры код HTML, што робіць магчымымі атакі праз Яваскрыпт.''\n\n'''Калі гэта нармальная спроба праўкі, паспрабуйце паўтарыць запісванне. Калі і гэта не дапаможа, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і ўвайсці ізноў.'''",
        "token_suffix_mismatch": "'''Ваша праўка была адхілена, каб пазбегнуць сапсавання тэксту старонкі, таму што ваш браўзер папсаваў знакі прыпынку ў квітку праўкі.\nМагчыма, прычына ў выкарыстанні вамі ананімнага проксі-сервера, праграмы якога працуюць некарэктна.'''",
        "edit_form_incomplete": "'''Некаторыя часткі формы рэдагавання не дасягнулі сервера. Упэўніцеся, што Вашыя рэдагаванні не пашкоджаныя і паспрабуйце зноў.'''",
        "editing": "Правім $1",
        "copyrightwarning2": "Заўважце, што кожны ўклад на {{SITENAME}} можа быць папраўлены, зменены або выдалены іншымі ўдзельнікамі. Калі вы не жадаеце, каб вашыя матэрыялы бязлітасна правіліся, то і не давайце іх сюды.<br />\nТаксама вы нам абяцаеце, што напісалі гэта самі, або скапіравалі з рэсурсу, які знаходзіцца ў публічнай уласнасці, або з аналагічнага свабоднага рэсурсу (бач падрабязнасці на $1).\n'''НЕ КЛАДЗІЦЕ СЮДЫ, БЕЗ АДПАВЕДНАГА ДАЗВОЛУ, МАТЭРЫЯЛУ, ЯКІ АХОЎВАЕЦЦА АЎТАРСКІМ ПРАВАМ!'''",
        "longpageerror": "'''Памылка: Аб’ём тэксту, які Вы спрабуеце запісаць складае $1 {{PLURAL:$1|кілабайт|кілабайты|кілабайтаў}}, што болей устаноўленага абмежавання на $2 {{PLURAL:$2|кілабайт|кілабайты|кілабайтаў}}.'''\nСтаронка не можа быць захаваная.",
        "readonlywarning": "<strong>Увага: зараз вы не можаце запісаць свае праўкі, таму што база звестак зачынена на абслугоўванне.</strong>\nМагчыма, варта перанесці ваш тэкст у асобны файл і запісаць на потым.\n\nАдміністратар, які зачыніў базу, растлумачыў гэта так: $1",
-       "protectedpagewarning": "'''УВАГА: старонка пастаўленая пад ахову, таму яе могуць правіць толькі адміністратары.'''\nНіжэй паказаны апошні запіс з адпаведнага журналу:",
-       "semiprotectedpagewarning": "'''Увага:''' старонка пастаўленая пад ахову, таму яе могуць правіць толькі рэгістраваныя ўдзельнікі («паў-ахова»). Ніжэй паказаны апошні запіс з адпаведнага журналу:",
+       "protectedpagewarning": "'''УВАГА: старонка пастаўлена пад ахову, таму яе могуць правіць толькі адміністратары.'''\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
+       "semiprotectedpagewarning": "'''Увага:''' старонка пастаўлена пад ахову, таму яе могуць правіць толькі зарэгістраваныя ўдзельнікі («паў-ахова»). Ніжэй паказаны апошні запіс з адпаведнага журнала:",
        "cascadeprotectedwarning": "'''Увага:''' гэтая старонка ахоўваецца, таму яе могуць правіць толькі ўдзельнікі з правамі адміністратара. Прычына аховы: улучэнне гэтай старонкі ў {{PLURAL:$1|старонку, якая стаіць|старонкі, якія стаяць}} пад каскаднай аховай:",
-       "titleprotectedwarning": "'''УВАГА: старонка пастаўленая пад ахову, таму яе могуць ствараць толькі ўдзельнікі з [[Special:ListGroupRights|адмысловымі правамі]].'''\nНіжэй паказаны апошні запіс з адпаведнага журналу:",
+       "titleprotectedwarning": "'''УВАГА: старонка пастаўлена пад ахову, таму яе могуць ствараць толькі ўдзельнікі з [[Special:ListGroupRights|адмысловымі правамі]].'''\nНіжэй паказаны апошні запіс з адпаведнага журнала:",
        "templatesused": "Шабло{{PLURAL:$1|н|ны}} на гэтай старонцы:",
        "templatesusedpreview": "Шабло{{PLURAL:$1|н у|ны ў}} гэтым перадпаказе:",
        "templatesusedsection": "Шабло{{PLURAL:$1|н у|ны ў}} гэтым раздзеле:",
        "edit-hook-aborted": "Праўка спынена хукам (hook).\nТлумачэнняў не было.",
        "edit-gone-missing": "Не ўдалося абнавіць старонку.\nЗдаецца, што яна была сцёртая.",
        "edit-conflict": "Канфлікт правак.",
-       "edit-no-change": "Вашая праўка была праігнараваная, таму што не мяняўся тэкст.",
+       "edit-no-change": "Ваша праўка была праігнаравана, таму што тэкст не памяняўся.",
        "postedit-confirmation-created": "Створана старонка.",
        "postedit-confirmation-restored": "Старонка адноўлена.",
        "postedit-confirmation-saved": "Ваша праўка запісана.",
        "mergehistory-empty": "Няма версій, якія можна аб'яднаць.",
        "mergehistory-done": "$3 {{PLURAL:$3|версія|версій}} $1 паспяхова аб'яднаныя ў склад [[:$2]].",
        "mergehistory-fail": "Немагчыма аб'яднаць гісторыі, праверце зададзеныя назву і час.",
-       "mergehistory-fail-toobig": "Ð\9dемагÑ\87Ñ\8bма Ð²Ñ\8bканаÑ\86Ñ\8c Ð·Ð»Ñ\96Ñ\86Ñ\86Ñ\91 Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bй, Ñ\82амÑ\83 Ñ\88Ñ\82о Ð±Ð¾Ð»Ñ\8cÑ\88 Ð·Ð° Ð»Ñ\96мÑ\96Ñ\82 Ñ\83 $1 {{PLURAL:$1|веÑ\80Ñ\81Ñ\96Ñ\8e|веÑ\80Ñ\81Ñ\96Ñ\96|веÑ\80Ñ\81Ñ\96й}} Ñ\82Ñ\80Ñ\8dба Ð¿ÐµÑ\80аноÑ\81Ñ\96Ñ\86Ñ\8c.",
+       "mergehistory-fail-toobig": "Ð\9dемагÑ\87Ñ\8bма Ð°Ð±'Ñ\8fднаÑ\86Ñ\8c Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\96 Ð¿Ñ\80авак, Ð±Ð¾ Ð´Ð»Ñ\8f Ð³Ñ\8dÑ\82ага Ñ\82Ñ\80Ñ\8dба Ð¿ÐµÑ\80анеÑ\81Ñ\86Ñ\96 Ð±Ð¾Ð»Ñ\8cÑ\88 Ð·Ð° Ð»Ñ\96мÑ\96Ñ\82 Ñ\83 $1 {{PLURAL:$1|веÑ\80Ñ\81Ñ\96Ñ\8e|веÑ\80Ñ\81Ñ\96Ñ\96|веÑ\80Ñ\81Ñ\96й}}.",
        "mergehistory-no-source": "Не існуе крынічная старонка $1.",
        "mergehistory-no-destination": "Не існуе мэтавая старонка $1.",
        "mergehistory-invalid-source": "Крынічная старонка павінна мець карэктную назву.",
        "recentchangesdays-max": "(найбольш $1 {{PLURAL:$1|дзень|дзён}})",
        "recentchangescount": "Прадвызначаная колькасць правак дзеля паказу:",
        "prefs-help-recentchangescount": "Гэта ўключае ў сябе апошнія змены, гісторыі старонак, журналы.",
-       "prefs-help-watchlist-token2": "Гэта сакрэтны ключ к сеціўнай стужцы з вашага спісу назірання.\nКожны, хто ведае гэты ключ, будзе мець магчымасць чытаць ваш спіс назірання, таму не дзяліцеся ім.\nКалі трэба, можна [[Special:ResetTokens|скінуць яго]].",
+       "prefs-help-watchlist-token2": "Гэта сакрэтны ключ к сеціўнай стужцы з вашага спіса назірання.\nКожны, хто ведае гэты ключ, будзе мець магчымасць чытаць ваш спіс назірання, таму не дзяліцеся ім.\nКалі трэба, можна [[Special:ResetTokens|скінуць яго]].",
        "savedprefs": "Настройкі замацаваныя.",
        "timezonelegend": "Часавы пояс:",
        "localtime": "Мясцовы час:",
        "prefs-diffs": "Розніцы",
        "prefs-help-prefershttps": "Гэта настройка пачне дзейнічаць па наступным уваходзе ў сістэму.",
        "prefs-tabs-navigation-hint": "Падказка: Вы можаце карыстацца клавішамі са стрэлкамі ўлева і ўправа для навігацыі паміж карткамі ў спісе картак.",
-       "email-address-validity-valid": "Адрас электроннай пошты з'яўляецца сапраўдным",
-       "email-address-validity-invalid": "Увядзіце слушны адрас электроннай пошты",
        "userrights": "Распараджэнне правамі ўдзельніка",
        "userrights-lookup-user": "Распараджацца групамі ўдзельнікаў",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
        "wlheader-showupdated": "Старонкі, якія былі зменены пасля вашага апошняга наведвання, паказаны <strong>абрысам шрыфту</strong>.",
        "wlnote": "Ніжэй {{PLURAL:$1|паказана апошняя <strong>$1</strong> змена|паказаны апошнія <strong>$1</strong> змены|паказаны апошнія <strong>$1</strong> змен}} за {{PLURAL:$2|апошнюю|апошнія|апошнія}} <strong>$2</strong> {{PLURAL:$2|гадзіну|гадзіны|гадзін}}, на момант часу $3 $4.",
        "wlshowlast": "Паказваць апошнія $1 гадз. $2 дзён",
+       "watchlistall2": "усе",
        "watchlist-options": "Магчымасці назірання",
        "watching": "Дапісваецца ў спіс назірання...",
        "unwatching": "Спыняем назіранне...",
        "revertpage-nouser": "Праўкі (імя ўдзельніка схавана) адкочаны да версіі {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Адкочаны праўкі $1; вернута апошняя версія $2.",
        "sessionfailure-title": "Памылка сеансу",
-       "sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса. Націсніце \"Назад\", і перачытайце старонку, з якой вы сюды прыйшлі, тады паспрабуйце нанова.",
+       "sessionfailure": "Магчыма, ёсць праблемы з вашым сеансам працы ў сістэме. Таму вам было адмоўлена ў выкананні дзеяння, каб засцерагчыся ад захопу сеанса.\n\nВярніцеся на папярэднюю старонку, перазагрузіце яе і тады паспрабуйце зноў.",
        "protectlogpage": "Журнал аховы",
        "protectlogtext": "Ніжэй прыведзены журнал змен абароны старонкі.\nВы можаце таксама прагледзець [[Special:ProtectedPages|пералік старонак пад аховай]].",
        "protectedarticle": "пад аховай «[[$1]]»",
        "prot_1movedto2": "[[$1]] перанесена ў [[$2]]",
        "protect-badnamespace-title": "Прастора імёнаў без аховы",
        "protect-badnamespace-text": "Старонкі ў гэтай прасторы імёнаў не могуць знаходзіцца пад аховай.",
-       "protect-norestrictiontypes-text": "Старонка не можа ахоўвацца, таму што недаступны тыпы абмежавання.",
+       "protect-norestrictiontypes-text": "Старонка не можа ахоўвацца, бо для яе няма даступных тыпаў абмежавання.",
        "protect-norestrictiontypes-title": "Неахоўвальная старонка",
        "protect-legend": "Пацверджанне пачатку аховы",
        "protectcomment": "Прычына:",
        "protect-unchain-permissions": "Адкрыць падрабязныя магчымасці аховы",
        "protect-text": "Тут можна пабачыць і паправіць узровень аховы для старонкі '''$1'''.",
        "protect-locked-blocked": "Вы заблакаваны і не можаце мяняць узроўняў аховы. Вось актуальныя настройкі для старонкі '''$1''':",
-       "protect-locked-dblock": "Ð\9dемагÑ\87Ñ\8bма Ð¼Ñ\8fнÑ\8fÑ\86Ñ\8c Ñ\83зÑ\80оÑ\9eнÑ\96 Ð°Ñ\85овÑ\8b, Ñ\82амÑ\83 Ñ\88Ñ\82о Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ñ\8bÑ\85 Ð·Ð°Ñ\80аз Ð·Ð°Ñ\87Ñ\8bнена.\nВось актуальныя настройкі аховы для старонкі '''$1''':",
+       "protect-locked-dblock": "Ð\9dемагÑ\87Ñ\8bма Ð¿Ð°Ð¼Ñ\8fнÑ\8fÑ\86Ñ\8c Ñ\83зÑ\80оÑ\9eнÑ\96 Ð°Ñ\85овÑ\8b, Ñ\82амÑ\83 Ñ\88Ñ\82о Ð±Ð°Ð·Ð° Ð´Ð°Ð½Ñ\8bÑ\85 Ð·Ð°Ñ\80аз Ð·Ð°Ð±Ð»Ð°ÐºÑ\96Ñ\80авана.\nВось актуальныя настройкі аховы для старонкі '''$1''':",
        "protect-locked-access": "Ваш рахунак не мае правоў, патрэбных каб мяняць ахову старонкі.\nВось актуальныя настройкі для старонкі '''$1''':",
        "protect-cascadeon": "Старонка зараз ахоўваецца, таму што ўлучана ў наступн{{PLURAL:$1|ую старонку, на якую|ыя старонкі, на якія}} пастаўлена каскадная ахова. Можна змяніць узровень аховы гэтай старонкі, але вынікаў каскаднай аховы гэта не пераможа.",
        "protect-default": "Дазваляць усім удзельнікам",
        "protect-expiring-local": "канчацца $1",
        "protect-expiry-indefinite": "бясконца",
        "protect-cascade": "Каскад - ахоўваць таксама і ўсе тыя старонкі, які ўлучаюцца ў гэтую.",
-       "protect-cantedit": "Вы не можаце змяніць узроўню засцерагання гэтай старонкі, таму што не маеце дазволу, каб правіць яе.",
+       "protect-cantedit": "Вы не можаце змяніць узровень аховы гэтай старонкі, таму што не маеце дазволу правіць яе.",
        "protect-othertime": "Іншы час:",
        "protect-othertime-op": "іншы час",
        "protect-existing-expiry": "Вызначаны час сканчэння: $3, $2",
        "contributions": "Уклад {{GENDER:$1|удзельніка|удзельніцы}}",
        "contributions-title": "Уклад {{GENDER:$1|удзельніка|удзельніцы}} $1",
        "mycontris": "Уклад",
+       "anoncontribs": "Унёсак",
        "contribsub2": "Для $1 ($2)",
        "contributions-userdoesnotexist": "Уліковы запіс удзельніка \"$1\" не зарэгістраваны.",
        "nocontribs": "Не знойдзена змен, адпаведных зададзеным параметрам.",
        "change-blocklink": "змяніць блок",
        "contribslink": "уклад",
        "emaillink": "адправіць ліст",
-       "autoblocker": "Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87нÑ\8b Ð±Ð»Ð¾Ðº, Ñ\82амÑ\83 Ñ\88Ñ\82о Ð²Ð°Ñ\88Ñ\8bм Ð°Ð´Ñ\80аÑ\81ам IP Ð½Ñ\8fдаÑ\9eна ÐºÐ°Ñ\80Ñ\8bÑ\81Ñ\82аÑ\9eÑ\81Ñ\8f \"[[User:$1|$1]]\".\nÐ\91лакаванне $1 Ð¿Ð°Ñ\82лÑ\83маÑ\87ана Ñ\82ак: \"$2\"",
+       "autoblocker": "Ð\90Ñ\9eÑ\82амаÑ\82Ñ\8bÑ\87нÑ\8b Ð±Ð»Ð¾Ðº, Ñ\82амÑ\83 Ñ\88Ñ\82о Ð²Ð°Ñ\88Ñ\8bм Ð°Ð´Ñ\80аÑ\81ам IP Ð½Ñ\8fдаÑ\9eна ÐºÐ°Ñ\80Ñ\8bÑ\81Ñ\82аÑ\9eÑ\81Ñ\8f \"[[User:$1|$1]]\".\nÐ\9fÑ\80Ñ\8bÑ\87Ñ\8bна Ð±Ð»Ð°ÐºÑ\96Ñ\80оÑ\9eкÑ\96 Ñ\9eдзелÑ\8cнÑ\96ка $1: \"$2\"",
        "blocklogpage": "Журнал блокаў",
        "blocklog-showlog": "{{GENDER:$1|Гэты ўдзельнік ужо блакаваўся|Гэта ўдзельніца ўжо блакавалася}} раней.\nЖурнал блакіровак прыведзены ніжэй:",
        "blocklog-showsuppresslog": "Гэты ўдзельнік ужо заблакаваны і скрыты. Журнал утойвання прыведзены ніжэй:",
        "ipb-otherblocks-header": "{{PLURAL:$1|Іншая блакіроўка|Іншыя блакіроўкі}}",
        "unblock-hideuser": "Вы не можаце разблакаваць гэтага ўдзельніка, бо яго імя было ўтоена.",
        "ipb_cant_unblock": "Памылка: не знойдзены блок з ID $1. Магчыма, ён ўжо быў зняты.",
-       "ipb_blocked_as_range": "Ð\9dелÑ\8cга Ð·Ð½Ñ\8fÑ\86Ñ\8c Ð±Ð»Ð¾Ðº Ð· IP-адÑ\80аÑ\81Ñ\83 $1, Ñ\82амÑ\83 Ñ\88Ñ\82о Ñ\91н Ð·Ð°Ð±Ð»Ð°ÐºÐ°Ð²Ð°Ð½Ñ\8b Ð½Ðµ Ð½Ð°Ñ\9eпÑ\80оÑ\81Ñ\82, Ð°Ð»Ðµ Ñ\8fк Ñ\87аÑ\81Ñ\82ка Ð°Ð±Ñ\81Ñ\8fгÑ\83 $2; Ñ\82ой Ð°Ð±Ñ\81Ñ\8fг, Ñ\83 Ñ\81ваÑ\8e Ñ\87аÑ\80гÑ\83, Ð¼Ð¾Ð¶Ð½Ð° Ñ\80азблакоÑ\9eваць.",
+       "ipb_blocked_as_range": "Ð\9fамÑ\8bлка: Ð\9dелÑ\8cга Ñ\80азблакÑ\96Ñ\80аваÑ\86Ñ\8c IP-адÑ\80аÑ\81 $1, Ð±Ð¾ Ñ\91н Ð±Ñ\8bÑ\9e Ð·Ð°Ð±Ð»Ð°ÐºÑ\96Ñ\80аванÑ\8b Ð½Ðµ Ð½Ð°Ð¿Ñ\80амÑ\83Ñ\8e, Ð° Ñ\8fк Ñ\87аÑ\81Ñ\82ка Ð°Ð±Ñ\81Ñ\8fгÑ\83 Ð°Ð´Ñ\80аÑ\81оÑ\9e $2, Ñ\8fкÑ\96 Ð¼Ð¾Ð¶Ð½Ð° Ñ\80азблакÑ\96Ñ\80аваць.",
        "ip_range_invalid": "Няправільны абсяг IP.",
        "ip_range_toolarge": "Блакіроўкі дыяпазонаў звыш /$1 забаронены.",
        "proxyblocker": "Блакіратар проксі",
-       "proxyblockreason": "Ваш адрас IP заблакаваны, таму што ён належыць да ліку адкрытых проксі.\nГэта сур'ёзная праблема бяспекі; паведамце пра гэта свайму Інтэрнет-правайдэру або ў службу тэхнічнай падтрымкі.",
+       "proxyblockreason": "Ваш адрас IP заблакіраваны, таму што ён адпавядае адкрытаму проксі-серверу.\nГэта сур'ёзная праблема бяспекі; паведаміце пра гэта свайму Інтэрнет-правайдэру або ў службу тэхнічнай падтрымкі.",
        "sorbsreason": "Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.",
        "sorbs_create_account_reason": "Ваш адрас IP знаходзіцца ў спісе забароненых адкрытых проксі, якім карыстаецца {{SITENAME}}.\nВы не можаце рэгістравацца",
        "xffblockreason": "IP-адрас, прыведзены ў загалоўку X-Forwarded-For, або ваш, або проксі-сервера, які вы выкарыстоўваеце, быў заблакаваны. Першапачаткова блок патлумачаны так: $1",
        "movepage-moved-redirect": "Была створана перасылка.",
        "movepage-moved-noredirect": "Не была створаная перасылка.",
        "articleexists": "Старонка з такой назвай ужо існуе, або\nвамі выбрана недапушчальнае імя.\nВыберыце іншае імя.",
-       "cantmove-titleprotected": "Немагчыма перанесці старонку пад гэтую назву, таму што назва ахоўваецца ад стварэння",
+       "cantmove-titleprotected": "Немагчыма перанесці старонку пад гэтую назву, таму што назва ахоўваецца ад стварэння.",
        "movetalk": "Перанесці таксама старонку размоў",
        "move-subpages": "Таксама перанесці пад-старонкі (да ўзроўню $1)",
        "move-talk-subpages": "Таксама перанесці пад-старонкі размовы (да ўзроўню $1)",
        "movenosubpage": "Старонка не мае пад-старонак.",
        "movereason": "Прычына:",
        "revertmove": "адкат",
-       "delete_and_move": "Сцерці і перанесці",
        "delete_and_move_text": "==Патрабуецца сціранне==\n\nУжо існуе артыкул з мэтавай назвай \"[[:$1]]\". Дык ці жадаеце сцерці яго, каб зрабіць месца для пераносу?",
        "delete_and_move_confirm": "Так, сцерці старонку",
        "delete_and_move_reason": "Сцёрта, каб зрабіць месца для пераносу \"[[$1]]\"",
        "thumbnail_image-type": "Дадзены тып выявы не падтрымліваецца",
        "thumbnail_gd-library": "Няпоўная канфігурацыя бібліятэкі GD, адсутнічае функцыя $1",
        "thumbnail_image-missing": "Хутчэй за ўсё, адсутнічае файл $1",
-       "thumbnail_image-failure-limit": "Занадта шмат няўдалых спробаў ($1 ці болей) стварыць гэту мініяцюру, за апошні час. Калі ласка, паспрабуйце пазней.",
+       "thumbnail_image-failure-limit": "Занадта шмат нядаўніх няўдалых спроб ($1 ці болей) стварыць гэту мініяцюру. Калі ласка, паспрабуйце пазней.",
        "import": "Імпартаваць старонкі",
        "importinterwiki": "Імпарт Transwiki",
        "import-interwiki-text": "Выбар вікі і назвы старонкі дзеля імпарту.\nДаты версій і імёны аўтараў будуць захаваныя.\nУсе транс-вікавыя імпарты запісваюцца ў [[Special:Log/import|журнале імпартаў]].",
        "tooltip-pt-logout": "Выйсці з сістэмы",
        "tooltip-pt-createaccount": "Вам прапануецца стварыць уліковы запіс і ўвайсці ў сістэму, але гэта не абавязкова",
        "tooltip-ca-talk": "Размовы пра змест гэтай старонкі",
-       "tooltip-ca-edit": "СÑ\82аÑ\80онкÑ\83 Ð¼Ð¾Ð¶Ð½Ð° Ð¿Ñ\80авÑ\96Ñ\86Ñ\8c. Ð\9fеÑ\80Ñ\88 Ñ\87Ñ\8bм Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ñ\81вае Ð·Ð¼ÐµÐ½Ñ\8b, Ð¿Ð°Ð³Ð»Ñ\8fдзÑ\96Ñ\86е Ð½Ð° Ð²Ñ\8bнÑ\96к, Ð½Ð°Ñ\86Ñ\96Ñ\81нÑ\83Ñ\9eÑ\88Ñ\8b ÐºÐ½Ð¾Ð¿ÐºÑ\83 Ð¿Ð°Ð¿Ñ\8fÑ\80Ñ\8dднÑ\8fга Ð¿Ñ\80аглÑ\8fдÑ\83.",
+       "tooltip-ca-edit": "Ð\9fÑ\80авÑ\96Ñ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\83 Ñ\81Ñ\82аÑ\80онкÑ\83",
        "tooltip-ca-addsection": "Дадаць новы раздзел",
        "tooltip-ca-viewsource": "Гэтая старонка ахоўваецца, але можна паглядзець яе зыходны тэкст.",
        "tooltip-ca-history": "Ранейшыя версіі гэтай старонкі.",
        "spam_reverting": "Вяртаемся да апошняй версіі без спасылак на $1",
        "spam_blanking": "Усе версіі ўтрымлівалі спасылкі на $1, чысцім",
        "spam_deleting": "Усе версіі ўтрымлівалі спасылкі на $1, сціраем",
-       "simpleantispam-label": "Ð\9fÑ\80авеÑ\80ка Ð°Ð½Ñ\82Ñ\8b\81памÑ\83.\n<strong>Ð\9dÐ\95</strong> ўпісвайце тут нічога!",
+       "simpleantispam-label": "Ð\9fÑ\80авеÑ\80ка Ð°Ð½Ñ\82Ñ\8b\81памÑ\83.\n<strong>Ð\9dе</strong> ўпісвайце тут нічога!",
        "pageinfo-title": "Інфармацыя для \"$1\"",
        "pageinfo-not-current": "Выбачайце, немагчыма даць гэтыя звесткі для старых версій.",
        "pageinfo-header-basic": "Агульныя звесткі",
        "deletedrevision": "Сцёрта старая версія $1",
        "filedeleteerror-short": "Памылка пры сціранні файла: $1",
        "filedeleteerror-long": "Памылкі пры спробе сцірання файла:\n\n$1",
-       "filedelete-missing": "Не быў сцёрты азначаны файл \"$1\", таму што не быў знойдзены.",
+       "filedelete-missing": "Немагчыма выдаліць файл \"$1\", таму што ён не існуе.",
        "filedelete-old-unregistered": "Не знойдзена ў базе даных азначаная версія файла \"$1\".",
        "filedelete-current-unregistered": "Не знойдзены ў базе даных азначаны файл \"$1\".",
        "filedelete-archive-read-only": "Немагчыма для веб-сервера запісаць у архіўны каталог \"$1\".",
        "previousdiff": "← Папярэдняя праўка",
        "nextdiff": "Наступная праўка →",
-       "mediawarning": "'''Увага''': у гэтым тыпе файлаў бывае зламысны код, выкананне якога можа паставіць пад небяспеку вашую сістэму.",
+       "mediawarning": "'''Увага''': у гэтым тыпе файлаў бывае зламысны код, выкананне якога можа паставіць пад небяспеку вашу сістэму.",
        "imagemaxsize": "Мяжа памеру выяваў:<br />''(на тлумачальных старонках)''",
        "thumbsize": "Памеры драбніцы:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|старонка|старонак}}",
        "years": "{{PLURAL:$1|$1 год|$1 гады|$1 гадоў}}",
        "ago": "$1 назад",
        "just-now": "толькі што",
-       "hours-ago": "$1 {{PLURAL:$1|гадзіну|гадзіны|гадзін}} таму",
-       "minutes-ago": "$1 {{PLURAL:$1|мінуту|мінуты|мінут}} таму",
+       "hours-ago": "$1 {{PLURAL:$1|гадзіну|гадзіны|гадзін}} назад",
+       "minutes-ago": "$1 {{PLURAL:$1|мінуту|мінуты|мінут}} назад",
        "seconds-ago": "$1 {{PLURAL:$1|секунду|секунды|секунд}} назад",
        "monday-at": "У панядзелак а $1",
        "tuesday-at": "У аўторак а $1",
        "autosumm-new": "Новая старонка: '$1'",
        "autosumm-newblank": "Створана пустая старонка",
        "lag-warn-normal": "Змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} таму назад, могуць не трапіць у гэты спіс.",
-       "lag-warn-high": "З прычыны моцных затрымак на серверы баз звестак, змены, зробленыя менш за $1 {{PLURAL:$1|сек.|сек.}} таму назад, могуць не трапіць у гэты спіс.",
+       "lag-warn-high": "З прычыны моцных затрымак на серверы баз звестак, змены, зробленыя менш за $1 {{PLURAL:$1|секунду|секунды|секунд}} назад, могуць не трапіць у гэты спіс.",
        "watchlistedit-normal-title": "Спіс назірання",
        "watchlistedit-normal-legend": "Выдаленне складнікаў са спіса назірання",
        "watchlistedit-normal-explain": "Назвы старонак з ліку назіраных паказаныя ніжэй. Каб нешта сцерці, адзначце клетку побач з адпаведным радком, пасля чаго націсніце \"Выняць складнікі\". Таксама можна правіць гэты спіс непасрэдна, [[Special:EditWatchlist/raw|без афармлення]].",
index 3b2366e..a9a6716 100644 (file)
@@ -30,7 +30,9 @@
                        "Macofe",
                        "V111P",
                        "Лорд Бъмбъри",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Xð",
+                       "Miroslav35232"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "mainpage": "Начална страница",
        "mainpage-description": "Начална страница",
        "policy-url": "Project:Политика",
-       "portal": "Ð\9fоÑ\80Ñ\82ал Ð·а общността",
+       "portal": "Ð\9fоÑ\80Ñ\82ал Ð½а общността",
        "portal-url": "Проект:Портал на общността",
        "privacy": "Защита на личните данни",
        "privacypage": "Проект:Защита на личните данни",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Защо създавате друга сметка",
-       "createacct-captcha": "Проверка за сигурност",
-       "createacct-imgcaptcha-ph": "Въведете текста, който виждате по-горе",
        "createacct-submit": "Създаване на сметката",
        "createacct-another-submit": "Създаване на друга сметка",
        "createacct-benefit-heading": "{{SITENAME}} се създава от хора като вас.",
        "passwordreset-emailtext-ip": "Някой (вероятно вие, от IP адрес $1) поиска възстановяване на паролата за сметката в {{SITENAME}} ($4). За {{PLURAL:$3|следната сметка|следните сметки}}\nе посочен този адрес за електронна поща:\n\n$2\n\n{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.\nСега би трябвало да влезете в системата и да си изберете нова парола. Ако заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.",
        "passwordreset-emailtext-user": "Потребител $1 от {{SITENAME}} поиска възстановяване на паролата за сметката в {{SITENAME}}\n($4). За {{PLURAL:$3|следната сметка|следните сметки}} е посочен този адрес за електронна поща:\n\n$2\n\n{{PLURAL:$3|Тази временна парола ще бъде активна|Тези временни пароли ще бъдат активни}} {{PLURAL:$5|един ден|$5 дни}}.\nСега би трябвало да влезете в системата и да изберете нова парола. Ако заявката е направена \nот друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете \nтова съобщение и да продължите да използвате старата си парола.",
        "passwordreset-emailelement": "Потребителско име: \n$1\n\nВременна парола: \n$2",
-       "passwordreset-emailsent": "На електронната поща беше изпратено писмо за възстановяване на паролата.",
+       "passwordreset-emailsentemail": "На електронната поща беше изпратено писмо за възстановяване на паролата.",
        "passwordreset-emailsent-capture": "По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.",
        "passwordreset-emailerror-capture": "По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1",
        "changeemail": "Промяна на адреса за е-поща",
        "prefs-tokenwatchlist": "Маркер",
        "prefs-diffs": "Разлики",
        "prefs-help-prefershttps": "Това предпочитание ще бъде активирано при следващото влизане.",
-       "email-address-validity-valid": "Адресът за е-поща изглежда валиден",
-       "email-address-validity-invalid": "Въведете валиден адрес за е-поща",
        "userrights": "Управление на потребителските права",
        "userrights-lookup-user": "Управляване на потребителските групи",
        "userrights-user-editname": "Потребителско име:",
        "enhancedrc-history": "история",
        "recentchanges": "Последни промени",
        "recentchanges-legend": "Настройки на списъка с последни промени",
-       "recentchanges-summary": "Проследяване на последните промени в {{SITENAME}}.\n\nЛегенда: '''тек''' = разлика на текущата версия,\n'''ист''' = история на версиите",
+       "recentchanges-summary": "Проследяване на последните промени в {{SITENAME}}.\n\nЛегенда: '''{{int:diff}}''' = разлика на текущата версия,\n'''{{int:hist}}''' = история на версиите",
        "recentchanges-noresult": "За дадения период не бяха намерени промени, които да отговарят на критериите.",
        "recentchanges-feed-description": "Проследяване на последните промени в {{SITENAME}}.",
        "recentchanges-label-newpage": "Нова страница",
        "recentchangeslinked-summary": "Тук се показват последните промени на страниците, към които се препраща от дадена страница. При избиране на категория, се показват промените по страниците, влизащи в нея. ''Пример:'' Ако изберете страницата '''А''', която съдържа препратки към '''Б''' и '''В''', тогава ще можете да прегледате промените по '''Б''' и '''В'''.\n\nАко пък сложите отметка пред '''Обръщане на релацията''', ще можете да прегледате промените в обратна посока: ще се включат тези страници, които съдържат препратки към посочената страница.\n\nСтраниците от списъка ви за наблюдение се показват в '''получер'''.",
        "recentchangeslinked-page": "Име на страницата:",
        "recentchangeslinked-to": "Обръщане на релацията, така че да се показват промените на страниците, сочещи към избраната страница",
-       "upload": "Ð\9aаÑ\87ване",
+       "upload": "Ð\9aаÑ\87и Ñ\84айл",
        "uploadbtn": "Качване",
        "reuploaddesc": "Връщане към формуляра за качване.",
        "upload-tryagain": "Съхраняване на промененото описание на файла",
        "wlheader-showupdated": "Страниците, които са били променени след последния път, когато сте ги посетили, са показани в '''получер'''.",
        "wlnote": "{{PLURAL:$1|Показана е последната промяна|Показани са последните '''$1''' промени}} през {{PLURAL:$2|последния час|последните '''$2''' часа}}.",
        "wlshowlast": "Показване на последните $1 часа $2 дни",
+       "watchlistall2": "всички",
        "watchlist-options": "Опции на списъка за наблюдение",
        "watching": "Наблюдение…",
        "unwatching": "Спиране на наблюдение…",
        "contributions": "{{GENDER:$1|Потребителски}} приноси",
        "contributions-title": "Потребителски приноси за $1",
        "mycontris": "Приноси",
+       "anoncontribs": "Приноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "nocontribs": "Не са намерени промени, отговарящи на критерия.",
        "movenosubpage": "Тази страница няма подстраници.",
        "movereason": "Причина:",
        "revertmove": "връщане",
-       "delete_and_move": "Изтриване и преместване",
        "delete_and_move_text": "== Наложително изтриване ==\n\nЦелевата страница „[[:$1]]“ вече съществува. Искате ли да я изтриете, за да освободите място за преместването?",
        "delete_and_move_confirm": "Да, искам да изтрия тази страница.",
        "delete_and_move_reason": "Изтрита, за да се освободи място за преместване от „[[$1]]“",
        "tooltip-pt-preferences": "Вашите настройки",
        "tooltip-pt-watchlist": "Списък на страници, чиито промени сте избрали да наблюдавате",
        "tooltip-pt-mycontris": "Списък на вашите приноси",
-       "tooltip-pt-login": "Ð\9dаÑ\81Ñ\8aÑ\80Ñ\87аваме Ð²и да влезете, въпреки че не е задължително.",
+       "tooltip-pt-login": "Ð\9dаÑ\81Ñ\8aÑ\80Ñ\87аваме Ð\92и да влезете, въпреки че не е задължително.",
        "tooltip-pt-logout": "Излизане от {{SITENAME}}",
        "tooltip-pt-createaccount": "Насърчаваме Ви да си създадете сметка и да влезете, въпреки че не е задължително.",
        "tooltip-ca-talk": "Беседа относно страницата",
-       "tooltip-ca-edit": "Ð\9cожеÑ\82е Ð´Ð° Ñ\80едакÑ\82иÑ\80аÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а. Ð\98зползвайÑ\82е Ð±Ñ\83Ñ\82она Ð·Ð° Ð¿Ñ\80едваÑ\80иÑ\82елен Ð¿Ñ\80еглед Ð¿Ñ\80еди Ð´Ð° Ñ\81Ñ\8aÑ\85Ñ\80аниÑ\82е.",
+       "tooltip-ca-edit": "РедакÑ\82иÑ\80ане Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а",
        "tooltip-ca-addsection": "Започване на нов раздел",
        "tooltip-ca-viewsource": "Страницата е защитена. Можете да разгледате изходния й код.",
        "tooltip-ca-history": "Предишни версии на страницата",
        "tooltip-search": "Претърсване на {{SITENAME}}",
        "tooltip-search-go": "Отиване на страницата, ако тя съществува с точно това име",
        "tooltip-search-fulltext": "Търсене в страниците за този текст",
-       "tooltip-p-logo": "Ð\9dачалната страница",
+       "tooltip-p-logo": "Ð\9fоÑ\81еÑ\89аване Ð½Ð° Ð½ачалната страница",
        "tooltip-n-mainpage": "Началната страница",
        "tooltip-n-mainpage-description": "Посещаване на началната страница",
        "tooltip-n-portal": "Информация за проекта — какво, къде, как",
-       "tooltip-n-currentevents": "Информация за текущите събития по света",
-       "tooltip-n-recentchanges": "Списък на последните промени в {{SITENAME}}",
+       "tooltip-n-currentevents": "Информация за текущи събития",
+       "tooltip-n-recentchanges": "Списък на последните промени в уикито",
        "tooltip-n-randompage": "Зареждане на случайна страница",
-       "tooltip-n-help": "Ð\9fомоÑ\89наÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а",
+       "tooltip-n-help": "Ð\9cÑ\8fÑ\81Ñ\82о ÐºÑ\8aдеÑ\82о Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¸Ð½Ñ\84оÑ\80миÑ\80аÑ\82е",
        "tooltip-t-whatlinkshere": "Списък на всички страници, сочещи насам",
        "tooltip-t-recentchangeslinked": "Последните промени на страници, сочени от тази страница",
        "tooltip-feed-rss": "RSS feed за страницата",
        "tooltip-t-contributions": "Показване на приносите на потребителя",
        "tooltip-t-emailuser": "Изпращане на писмо до потребителя",
        "tooltip-t-info": "Повече за тази страница",
-       "tooltip-t-upload": "Ð\9aаÑ\87ване Ð½Ð° файлове",
+       "tooltip-t-upload": "Ð\9aаÑ\87и файлове",
        "tooltip-t-specialpages": "Списък на всички специални страници",
        "tooltip-t-print": "Версия за печат на страницата",
        "tooltip-t-permalink": "Постоянна препратка към тази версия на страницата",
        "spam_reverting": "Връщане на последната версия, несъдържаща препратки към $1",
        "spam_blanking": "Всички версии, съдържащи препратки към $1, изчистване",
        "spam_deleting": "Всички версии съдържат препратки към $1, изтриване",
-       "simpleantispam-label": "Проверка за спам.\nНеобходимо е да <strong>НЕ</strong> попълвате това поле!",
+       "simpleantispam-label": "Проверка за спам.\n<strong>НЕ</strong> попълвайте това поле!",
        "pageinfo-title": "Информация за \"$1\"",
        "pageinfo-not-current": "За съжаление тази информация не може да бъде предоставена за стари версии.",
        "pageinfo-header-basic": "Основна информация",
index 92d2a03..ac0204f 100644 (file)
@@ -12,6 +12,7 @@
        "tog-hideminor": "کمین تغیرات شه آخیرین تغیراتانی لڑلیستا چیهر داته بئینت",
        "tog-hidepatrolled": "گشت وارته گین ایڈ\tیٹان شه آخیرین ایڈ\tیٹانی لڑلیستا چیهر داته بئینت",
        "tog-newpageshidepatrolled": "گشت وارته ئین تاکدیمان شه نی نوکین تاکدیمانی لڑ لیستا زیان بیئنت",
+       "tog-hidecategorization": "تاکدیمانئ دسته بندی ێی چیهر داتین",
        "tog-extendwatchlist": "پراخ کورتین واچلیستی لڑلیست په موچین تغیراتان،نه فقط آخرینان",
        "tog-usenewrc": "گروپ بندی تغیراتانئ بی اساسئ تاکدیمانئ اخیر ئین تغیران و واچلیستئ لڑ لیستا",
        "tog-numberheadings": "ئنوانانئ اتوماتیکین شماره گذاری",
@@ -41,6 +42,7 @@
        "tog-watchlisthideliu": "لوگین بوته ئین کار زوروکانی ایڈیٹ شه نی واچلیست چیهر بیئنت",
        "tog-watchlisthideanons": "نا دروستي ئین کار زوروکانی ایڈیٹ شه نی واچلیست چیهر بیئنت",
        "tog-watchlisthidepatrolled": "گشت وارته ئین ایڈیٹ شه واچلیستی تا چیهر بیئنت",
+       "tog-watchlisthidecategorization": "تاکدیمانئ دسته بندی ێی چیهر داتین",
        "tog-ccmeonemails": "په من یک کاپی شه آ ایمیلان که من په دیگران دیم ئه دهین ، دیم داته بیئت",
        "tog-diffonly": "جهلگی تاکدیمی محتوا تفاوت نشان داته مه بئینت",
        "tog-showhiddencats": "چیهرین تهرئانه نشان دهی",
        "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "پچی شما لوٹیت که دیگرین کار زوروکین حساب جوڑ کنیت؟",
-       "createacct-captcha": "امنیتئ چیک کورتین",
-       "createacct-imgcaptcha-ph": "په بُرزه گین اکسا کی گیندیت متنی داخل کنیت",
        "createacct-submit": "وتئ کار زوروکین حسابا جوڑ کنیت",
        "createacct-another-submit": "دیگرین کار زوروکین حسابئ جوڑ کورتین",
        "createacct-benefit-heading": "ای {{SITENAME}} چو شمیا همیرنگین مردمانی واسطه ئا جوڑ بوته",
        "noemailcreate": "باید یک موتبرین ایمیل ادرسئ داخل بکنیت",
        "passwordsent": "نوکین چیهرگال بئ سبت بوته ئین ایمیل ادرس ئا په «$1» ئا دیم داته بوت.\nمهربانی بکنیت شه آیی گیپتین ئا پد لوگین به ییت.",
        "blocked-mailpassword": "شمئ آی پي ادرس شه دستکاری کورتینا بلاک بوته، په ای خاطرا شه پاسوردا پایده گ زورته ئه نه کنیت شه سوءاستفاده ئی دیمگیري ئی خاطرا.",
+       "eauthentsent": "یک تائیدین ایمیل په مورد نظرین ایمیل آدرسا دیم داته بوت.\nدیم شه ایشی که دیگه ایمیلئ په ای ایمیل ادرسا دیم داتینئ وڑ بیت، شما باید بعضی دستورانه که په ای مسئله ئی خاتیرا انت، اجرا کنێت.",
        "mailerror": "خطا بی ایمیلی داتینی تا: $1",
        "emailauthenticated": "شمی ایمیلی ادرس بی $2 سائت $3  تا تصدیق ئه بیئت.",
        "emailnotauthenticated": "شمی ایمیلئ ادرس تا انون قبول نه بوته.\nایمیل په هیچ یک شه ویژه گی ئان دیم داته ئه نه بیئت.",
        "accountcreatedtext": "کار زوروکئ حساب په [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|هبر و گپ]]) جوڑ بوته.",
        "createaccount-title": "کار زوروکئ حساب جوڑ کورتین بی {{SITENAME}}",
        "createaccount-text": "یک نفری په شمی ایمیلا یک کار زوروکین حسابئ  بی {{SITENAME}} تا گو «$2» ناما جوڑ کورته ($4)، که آیی پاسورد ایش اینت : $3\nشما باید همی انون وتئ حسابئ تا داخل بئیت و وتئ پاسوردا تغیر بدهیت .\n\nاگه ای حساب اشتباهی جوڑ بوته ، ای پیام ئا نادیستگ بگیریت.",
+       "login-throttled": "شما بیخی باز وار په لوگین بوتینا کوشش کورته ایت.\nمهرباني بکنێت دیم شه آیی که پدا کوشش بکنیت $1 صبر کنیت.",
        "login-abort-generic": "شمی لوگین ناکام ات - ساکت بوت",
        "login-migrated-generic": "شمی کار زوروکین نام انتقال بوته، و شمی کار زوروکین نام دیگه بی ای ویکی ئی تا وجود نداریت.",
        "loginlanguagelabel": "زبان: $1",
        "anonpreviewwarning": "<em>شما لوگین نه بوته ئیت. ذخیره کورتین باعث ئه بیئت که شمی آی پی ادرس بی ای تاکدیمی تاریخچه ئی تا ثبت بیئت.</em>",
        "missingcommenttext": "مهربانی بکنیت جهلگا توضیح دهیت.",
        "summary-preview": "دیم دیست ئی خلاصه:",
-       "subject-preview": "Ù\85Ù\88ضÙ\88 Ø¦Û\8c Ø¯Û\8cÙ\85 Ø¯Û\8cست/ئÙ\86Ù\88اÙ\86:",
+       "subject-preview": "Ù\85Ù\88زÙ\88Û\8cÛ\8c Ø¯Û\8cÙ\85 Ø¯Û\8cست:",
        "previewerrortext": "وختیکه شوما په وتي تغیراني نشان داتینا کوشش ئه کورتێت، یک خطاي مانجینا آت.",
        "blockedtitle": "کار زوروک بسته بوته",
        "blockedtext": "<strong>شمئ کارزورکین حساب یا آی پي ادرس بسته بوته.</strong>\n\nای بسته بوتین شه $1 ئی نیمگاه بوته.\nای نفر وتي دلیلا، ایرنگ گوشته: <em>$2</em>\n\n* بلاک یا بستین ئی شروع: $8\n* پاچ بوتین یا بلاک ئی الاسي: $6\n* هدفین بلاک بوته ئین کارزوروک: $7\n\nشوما توانێت که گۆ $1 یا گۆ [[{{MediaWiki:Grouppage-sysop}}|یک دیگرێن مدیري]] تماس بگیرێت و بئ ائ باره ئا هبر دهیت.\nتوجه کنیت که شما نه توانتیت شه  «ایمیل په ای کارزوروکا» استفاده بکنیت مگه ايکه یک معتبریندایمیل ادرسئ به وتي [[Special:Preferences|کارزوروکین حسابئ]] تا ثبت کورته به ئیت و هم  باید ای قابلیتئ امکان شه شوما گیپته مه بيت.\nشمئ انونین آی پي ادرس $3 و شمئ بلاک بوتینئ شماره $5 اینت.\nمهرباني بکنیت موچین مالوماتانا به وتئ درخواست ئانی تا ذکر بکنیت.",
+       "autoblockedtext": "شمی آی‌پی ادرس یسته بوته، په خاتیریکه ای  آی‌پی ادرس شه یک دیگرین کار زوروکئ نیمگاه استفاده بوته که آ شه $1 ئی نیمگاه بلاک بوته.\nدیم بوته ئین دلیل ایرنگ اینت:\n\n:''$2''\n\n* بلاک یا بستین ئی شروع: $8\n* پاچ بوتین یا بلاک ئی الاسي: $6\n* هدفین بلاک بوته ئین کارزوروک: $7\n\nشوما توانێت که گۆ $1 یا گۆ [[{{MediaWiki:Grouppage-sysop}}|یک دیگرێن مدیري]] تماس بگیرێت و بئ ائ باره ئا حبر دهیت.\nتوجه کنیت که شما نه توانتیت شه  «ایمیل په ای کارزوروکا» استفاده بکنیت مگه ايکه یک معتبرین ایمیل ادرسئ به وتي [[Special:Preferences|کارزوروکین حسابئ]] تا ثبت کورته به ئیت و هم  باید ای قابلیتئ امکان شه شوما گیپته مه بيت.\nشمئ انونین آی پي ادرس $3 و شمئ بلاک بوتینئ شماره $5 اینت.\nمهرباني بکنیت موچین مالوماتانا به وتئ درخواست ئانی تا ذکر بکنیت.",
        "blockednoreason": "دلیلی مشخص نه بوته",
        "whitelistedittext": "په مقاله ئانی ایڈیٹ ئا باید $1.",
+       "confirmedittext": "باید شما،دیم شه تاکدیماني دستکاری کورتینا، وتي ایمیل آدرسا مشخص و تائید بکنیت. مهرباني بکنیت شه [[Special:Preferences|کار زوروکئ تنظماتاني]] نیمگاه ای کارا بکنیت.",
        "nosuchsectiontitle": "ایرنگی بخشئ ودئ نه بوت",
+       "nosuchsectiontext": "شما کوشش کورته ایت که به ای تاکدیمی تا یک بخشیا دستکاری بکنیت که موجود نه اینت.\nمومکن اینت به همي وختا که شما تاکدیما سیل ئه کورتیت ای بخش جابجا یک پاک بوته.",
        "loginreqtitle": "لوگین بوتین ضروری اینت",
        "loginreqlink": "داخل بوتین",
        "loginreqpagetext": "په دیگه تاکدیمانئ دیستینا باید  $1.",
        "editundo": "خنثی‌ کورتین",
        "diff-empty": "(بدون تفاوت)",
        "diff-multi-sameuser": "(ای کار زوروکئ {{PLURAL:$1|یک میانی نخسه|$1 میانی نخسه}}ِ نمایش داته بوته)",
+       "diff-multi-otherusers": "({{PLURAL:$1|۱ میانین نخسه|$1 میانین نخسه}} دستکاری بوتگ شه {{PLURAL:$2|۱ کارزوروک|$2 کارزوروک}}ئ نیمگاه  نشان داته نه بوته)",
+       "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} میانین دستکاری بوته ئین نخسه گیشتیر شه {{PLURAL:$2|یک|$2}} کارزورکئ نیمگاه نشان داته نه بوته)",
        "searchresults": "گشتین ئی  نتیجه",
        "searchresults-title": "گشتینئ نتایج په «$1»",
        "titlematches": "مقاله ئی ئنوانئ یکی کورتین",
        "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-redirect": "($1 یي گردینتین)",
        "search-section": "(بخش $1)",
        "search-category": "(تهر  $1)",
        "search-file-match": "(فایلی محتوایی یکرنگی)",
        "search-suggest": "آیا شمی منظور ایش ات: $1",
+       "search-rewritten": "$1 ئی نتیجه ئانی نمایش. گشتین په $2 جاها.",
        "search-interwiki-caption": "گوارین پروژه ئان",
        "search-interwiki-default": "نتایج شه $1 :",
        "search-interwiki-more": "(گیشتیر)",
        "recentchangescount": "پیش پرزین نشان داته بوته ئین ایڈیٹ ئانی اندازه گ:",
        "prefs-help-recentchangescount": "ای شامیل ئه بیت شه آخیرئین تغیران،که تاکدیمانی تاریخچه و خالیگاه انت.",
        "savedprefs": "شمی تنظیمات ذخیره بوتنت.",
+       "savedrights": "{{GENDER:$1|$1}}ئ کارزوروکین دسترسی ساتیته بوته انت.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "محلی ئن وخت:",
        "timezoneuseserverdefault": "استفاده شه  پیش‌فرض ئین ویکی ($1)",
        "rcshowhidemine": "$1 نی ایڈیٹان",
        "rcshowhidemine-show": "نشان داتین",
        "rcshowhidemine-hide": "چیهر داتین",
+       "rcshowhidecategorization": "$1 تاکدیمئ تهربندی",
+       "rcshowhidecategorization-show": "نشان داتین",
+       "rcshowhidecategorization-hide": "چیهر داتین",
        "rclinks": "نشان داتین $1 آخیر ئین تغییر بئ $2 اخیرین روچا<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "trackingcategories-msg": "ردیابئ تهر",
        "trackingcategories-name": "پیامی نام",
        "trackingcategories-desc": "تهرئ کنجایش ئی معیاران",
+       "hidden-category-category-desc": "تهر به وتي تاکدیمئ  محتوای تا شمل شه <code><nowiki>__HIDDENCAT__</nowiki></code> اینت، که به اتوماتیکین رقما شه تهرِ لینکاني بکسئ نشان‌داتینا به تاکدیماني تا دیمگیری ئه کنت.",
        "trackingcategories-nodesc": "هیچ توضیحی موجود نه اینت.",
        "trackingcategories-disabled": "تهر غیر پئال بوته",
        "mailnologin": "ادرسئ شه دیم دهۆک ئا موجود نه اینت",
        "wlheader-showupdated": "تاکدیمان که شه شمی آخیرین دیستینا پد تغیر بوته انت '''پررنگ''' نشان داته بیئنت.",
        "wlnote": "بئ جهلگا {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که بئ {{PLURAL:$2|سائت|<strong>$2</strong> سائت}} دیمتیرا انجام بوته موجود اینت، آخیرین بازیابی تاریخ: $3، $4",
        "wlshowlast": "نشان داتین آخیرئین $1 سائت $2 روچئ",
+       "watchlistall2": "موچ",
+       "watchlist-hide": "چیهر داتین",
        "watchlist-options": "واچلیستئ آپشن",
        "watching": "بئ دیستینئ حالا...",
        "unwatching": "دیستینئ اوشتارینتین...",
        "deletepage": "تاکدیمی پاک کورتین",
        "confirm": "تأیید کورتین",
        "excontent": "تاکدیمی محتوا ایش ات: «$1»",
-       "excontentauthor": "تاکدیمی محتوا ایش ات: «$1» (و تانا مشارکت کنۆک «[[Special:Contributions/$2|$2]]» ات)",
+       "excontentauthor": "تاکدیمی محتوا ایش ات: «$1» (و تاناین مشارکت کنۆک «[[Special:Contributions/$2|$2]]» ([[User talk:$2|گپ]]) ات)",
        "exbeforeblank": "تاکدیمی محتوا دیم شه خالی کورتینا ایش ات: «$1»",
        "delete-confirm": "پاک کورتین «$1»",
        "delete-legend": "پاک کورتین",
        "contributions": "{{GENDER:$1|کار زوروک}} ئی شراکت ئان",
        "contributions-title": "$1 ئی کار زوروکئ شراکت ئان",
        "mycontris": "شراکت ئان",
+       "anoncontribs": "شراکت ئان",
        "contribsub2": "په {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "«$1» ئی کار زوروکین حساب راجستر نه بوته.",
        "nocontribs": "هیچ تغیری گۆ ای مشخصات ئان ودێ نه بوت",
        "movenosubpage": "ای تاکدیم هیچ گۆنڈدیم ئی نداریت.",
        "movereason": "دلیل:",
        "revertmove": "بیرگردینتین",
-       "delete_and_move": "پاک کورتین یا جابیجا",
        "delete_and_move_confirm": "هان،تاکدیم پاک بیئت",
        "delete_and_move_reason": "پاک کورتین  «[[$1]]» جابجایی امکانا",
        "immobile-source-page": "ای دیم جابیجا ئه نه بیئت.",
        "tooltip-n-help": "جای په ودی کورتین ئا",
        "tooltip-t-whatlinkshere": "موچین تاکدیمانی لڑ لیست که گۆ ای دیما لینک وارته انت",
        "tooltip-t-recentchangeslinked": "تاکدیمانئ آخیرین تغیران که ای دیم گۆ آوان لینک داریت",
+       "tooltip-feed-rss": "آراس‌اس ئی خبرنامه په ای تاکدیما",
        "tooltip-feed-atom": "اتم ئی حبرنامه په ای دیما",
        "tooltip-t-contributions": "ای کار زوروکئ شراکتانی لڑ لیست",
        "tooltip-t-emailuser": "په ای کار زوروکا ایمیل ئی دیم داتین",
        "tooltip-save": "وتئ تغیرانا ذخیره بکنیت",
        "tooltip-preview": "شمی تغیرانی دیم دیست، مهربانی بکنیت دیما شه تاکدیمی ذخیره کورتینا شه ای کیلی ئا استفاده بکنیت.",
        "tooltip-diff": "شمی تغیرانی نمایش که شما بئ متن ئی تا داته ایت.",
+       "tooltip-compareselectedversions": "ای تاکدمئ دو انتخاب بوته ئین نخسه ئاني فرقاني دیستین",
+       "tooltip-watch": "ای دیما به وتي واچلیست یا پدگیری لیستئ تا اڈڈ بکنیت",
        "tooltip-watchlistedit-normal-submit": "ئنوانانی پاک کورتین",
        "tooltip-watchlistedit-raw-submit": "واچلیست ئی اپڈیٹ",
        "tooltip-recreate": "پداجۆڑ کورتین تاکدیمی نه دیستین ایشیرا که ای تاکدیم دیما پاک بوته",
        "patrol-log-page": "گشتئ سیاه چال",
        "patrol-log-header": "ای سیاهه شه گشت وارته ئین ایڈیٹ ئان است.",
        "log-show-hide-patrol": "$1 گشت جنوکین سیاهه",
+       "log-show-hide-tag": "$1 خالیجای ٹاپه",
        "deletedrevision": "$1 قدیمی پاک بوته ئین نخسه ئی است",
        "filedeleteerror-short": "خطا بئ فایلی پاک کورتین: $1",
        "filedeleteerror-long": "بی پدا  پاک کورتین ئی وختا خطا رخ دات:\n\n$1",
        "exif-gpslatitude-s": "جوگراپیایی جنوبی گ\tۆور",
        "exif-gpslongitude-e": "جوگراپیایی روچ درات ئی تچکی",
        "exif-gpslongitude-w": "جوگراپیایی روچ کپت ئی تچکی",
-       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|میتر|میتر}} بُرزتیر شه دریابی روگا",
-       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|میتر|میتر}} جهلتیر شه دریابی روگا",
+       "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|میتر}} بُرزتیر شه دریابی روگا",
+       "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|میتر}} جهلتیر شه دریابی روگا",
        "exif-gpsstatus-a": "بی اندازه گیری هالا",
        "exif-gpsstatus-v": "اندازه گ ئی موقایسه گیری",
        "exif-gpsmeasuremode-2": "دو بوئدین اندازه گیری",
        "version-libraries": "نصب بوته ئین کتابخانه",
        "version-libraries-library": "کتابجاه",
        "version-libraries-version": "نخسه",
+       "version-libraries-license": "اجازه نامه",
+       "version-libraries-description": "توضیحان",
+       "version-libraries-authors": "نویسوکان",
        "redirect-legend": "گردینتین په یک پایل یا تاکدیمئ",
        "redirect-submit": "برا",
        "redirect-lookup": "گشتین:",
        "tags-deactivate-reason": "دلیل:",
        "tags-deactivate-not-allowed": "«$1» ئی تگی غیر په هال کورتین ممکن نه اینت.",
        "tags-deactivate-submit": "غیرپئال کورتین",
+       "tags-edit-title": "ٹاپه ئی ایڈ\tیٹ کورتین",
+       "tags-edit-manage-link": "ٹاپه ئاني مدیریت کورتین",
+       "tags-edit-revision-selected": "{{PLURAL:$1|انتخاب بووته ئین نخسه|انتخابین نخسه ئان}} شه [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|انتخاب بوته ئین خالیجا}}:",
        "tags-edit-existing-tags": "موجودین ٹاپه ئان:",
        "tags-edit-existing-tags-none": "\"هیچگوجام\"",
        "tags-edit-new-tags": "نوکین ٹاپه:",
        "revdelete-uname-unhid": "کار زوروکئ ناما سر درا کورت",
        "revdelete-restricted": "مدیر ئانه محدود کورت",
        "revdelete-unrestricted": "مدیرئانی محدودیت ئا پروشت",
+       "logentry-block-reblock": "$1 بلاک ئی {{GENDER:$2|تنظیماتانه}} په {{GENDER:$4|$3}} ئانه به انبلاک گو بلاکئ وختي الاسیا $5 $6 تغییر دات.",
+       "logentry-suppress-block": "$1 {{GENDER:$2|بسته بوت}} {{GENDER:$4|$3}} گو انبلاک کورتینئ وختا به $5 $6",
+       "logentry-suppress-reblock": "$1 بلاک ئی {{GENDER:$2|تنظیماتانه}} په {{GENDER:$4|$3}} ئانه به انبلاک گو بلاکئ وختي الاسیا $5 $6 تغییر دات.",
+       "logentry-import-interwiki": "$1 $3 ئانه شه دیگه ویکیێ {{GENDER:$2|لَڈڈینت}}",
        "logentry-merge-merge": "$1  $3  را بئ  $4 {{GENDER:$2| ادغام کورت}} (نخسه تا  $5)",
        "logentry-move-move": "$1، $3 ئی تاکدیما بئ $4 {{GENDER:$2|جابجا کورت}}",
+       "logentry-move-move-noredirect": "$1  $3 ئی تاکدیما بغیر شه ایشی که گوجام تغیرمسیرئ بجا بیللیت  به $4 {{GENDER:$2|جابجا کورت}}",
        "logentry-newusers-newusers": "$1 ئی کار زوروکئ حساب {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-create": "$1 ئی کار زوروکئ حساب {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-create2": "$3 ئی کار زوروکئ حساب شه $1 ئی نیمگا {{GENDER:$2|جۆڑ بوت}}",
        "logentry-newusers-byemail": "$3 ئی کار زوروکئ حساب شه $1 ئی نیمگا {{GENDER:$2|جۆڑ بوت}} و چیهرگال یا پاسورد گو ایمیلا دیم داته بوت",
        "logentry-newusers-autocreate": "$1 ئی حساب بئ اتوماتیکین رکما {{GENDER:$2|جۆڑ بوت}}",
+       "logentry-protect-move_prot": "$1 قُلپئ تنظیمانا شه $4 به $3 {{GENDER:$2|جابجا کورت}}",
+       "logentry-protect-unprotect": "$1 $3 ئا شه قُپا {{GENDER:$2|دَر کورت}}",
+       "logentry-protect-protect": "$1 $3 ئا {{GENDER:$2|قُلپ کورت}} $4",
+       "logentry-protect-protect-cascade": "$1 $3 $4 {{GENDER:$2|قُلپ کورت}} [آبشاری]",
+       "logentry-protect-modify": "$1 $3 ئ قُلپئ اندازه گا به {{GENDER:$2|تغییر دات}} $4",
+       "logentry-protect-modify-cascade": "$1 $3 $4 ئ قُلپئ اندازه گا په {{GENDER:$2|تغییر دات}}[آپشاری]",
        "logentry-rights-rights": "$1 ، $3 ئی عضویتا شه $4 ئی گروپا بئ $5 {{GENDER:$2|تغییر دات}}",
        "logentry-rights-rights-legacy": "$1 عضویتئ گروپا بئ $3 ئا {{GENDER:$2|تغییر دات}}",
        "logentry-rights-autopromote": "$1 بئ اوتوماتیکین رکما وتر شه $4 بئ $5 {{GENDER:$2|ارتقاء دات}}",
        "logentry-upload-revert": "$1 {{GENDER:$2|بُرز کورت}} $3 ئا",
        "log-name-managetags": "تگ ئی تاریخچه ئی مدیریت",
        "logentry-managetags-create": "$1 تگ «$4» ئا {{GENDER:$2|ج\tۆڑ کورت}}",
+       "log-name-tag": "خالیجای ٹاپه",
        "rightsnone": "(هیچ)",
        "revdelete-summary": "ایڈیتی خاصه",
        "feedback-back": "بیئرگشت",
index 75746dc..beb5966 100644 (file)
        "tog-hideminor": "অনুল্লেখ্য সম্পাদনাগুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
        "tog-hidepatrolled": "পরীক্ষিত সম্পাদনা গুলো সাম্প্রতিক পরিবর্তনসমূহে আড়াল করো",
        "tog-newpageshidepatrolled": "পরীক্ষিত পাতা গুলো নতুন পাতার তালিকায় আড়াল করো",
+       "tog-hidecategorization": "পাতার শ্রেণীবদ্ধকরণ লুকান",
        "tog-extendwatchlist": "শুধু সাম্প্রতিক পরিবর্তনই নয়, সকল পরিবর্তন দেখতে নজর তালিকা সম্প্রসারণ করুন",
        "tog-usenewrc": "সাম্প্রতিক পরিবর্তনসমূহ এবং নজরতালিকা পাতায় পরিবর্তনগুলো একত্রে প্রদর্শন",
        "tog-numberheadings": "শিরোনামগুলোকে স্বয়ংক্রিয়ভাবে ক্রমিক নম্বর দাও",
-       "tog-showtoolbar": "সমà§\8dপাদনা à¦\9fà§\81লবার দেখাও",
+       "tog-showtoolbar": "সমà§\8dপাদনা à¦¸à¦°à¦\9eà§\8dà¦\9cামদণà§\8dড দেখাও",
        "tog-editondblclick": "দুইবার ক্লিক করে পাতা সম্পাদনা",
        "tog-editsectiononrightclick": "পরিচ্ছেদের শিরোনামে ডান ক্লিকের মাধ্যমে সম্পাদনা করার ক্ষমতা দেয়া হোক",
        "tog-watchcreations": "আমার তৈরি পাতা এবং আপলোড করা ফাইলগুললো আমার নজরতালিকায় যোগ করা হোক",
        "tog-watchlisthidebots": "বটের করা সম্পাদনাগুলি নজরতালিকায় না দেখানো হোক",
        "tog-watchlisthideminor": "অনুল্লেখ্য সম্পাদনাগুলো নজর তালিকায় না দেখানো হোক",
        "tog-watchlisthideliu": "নজরতালিকাতে অ্যাকাউন্টে লগ-ইন করা ব্যবহারকারীদের সম্পাদনা আড়ালে রাখা হোক",
+       "tog-watchlistreloadautomatically": "প্রতিবার একটি ছাঁকনি পরিবর্তন হওয়া মাত্রই স্বয়ংক্রিয়ভাবে নজরতালিকায় পুনঃলোড করো (জাভাস্ক্রিপ্ট প্রয়োজন)",
        "tog-watchlisthideanons": "নজরতালিকাতে বেনামী ব্যবহারকারীদের সম্পাদনা আড়ালে রাখা হোক",
        "tog-watchlisthidepatrolled": "পরীক্ষিত সম্পাদনা গুলো নজরতালিকায় আড়াল করো",
+       "tog-watchlisthidecategorization": "পাতার শ্রেণীবদ্ধকরণ লুকান",
        "tog-ccmeonemails": "অন্য ব্যবহারকারীর কাছে আমার পাঠানো ইমেইলের একটি অনুলিপি আমাকে পাঠানো হোক",
        "tog-diffonly": "পার্থক্যের নিচে পাতার বিষয়বস্তু না দেখানো হোক",
        "tog-showhiddencats": "লুকায়িত বিষয়শ্রেণীসমূহ দেখাও",
        "noindex-category": "নির্ঘণ্ট নয় এমন পাতা",
        "broken-file-category": "অকার্যকর চিত্র সংযোগসহ পাতাসমূহ",
        "about": "পরিচিতি",
-       "article": "বিষয়বস্তু আছে এমন পাতা",
+       "article": "বিষয়বস্তু পাতা",
        "newwindow": "(নতুন উইন্ডোতে খুলবে)",
        "cancel": "বাতিল",
        "moredotdotdot": "আরও...",
        "morenotlisted": "এটি একটি অসম্পূর্ণ তালিকা।",
        "mypage": " পাতা",
        "mytalk": "আলোচনা",
-       "anontalk": "à¦\8fà¦\87 à¦¬à§\87নামà§\80 à¦¬à§\8dযবহারà¦\95ারà§\80র à¦\86লাপà§\87র à¦ªà¦¾à¦¤à¦¾",
+       "anontalk": "à¦\86লাপ",
        "navigation": "পরিভ্রমণ",
        "and": "&#32;এবং",
        "qbfind": "অনুসন্ধান",
        "delete": "অপসারণ",
        "deletethispage": "এই পাতাটি মুছে ফেলুন",
        "undeletethispage": "পাতাটি পুনরুদ্ধার করো",
-       "undelete_short": "পুনঃস্থাপন {{PLURAL:$1|১টি সম্পাদনা|$1টি সম্পাদনাসমূহ}}",
-       "viewdeleted_short": "{{PLURAL:$1| টি অপসারিত সম্পাদনা|$1 টি অপসারিত সম্পাদনা}} দেখাও",
+       "undelete_short": "{{PLURAL:$1|১টি সম্পাদনা|$1টি সম্পাদনা}} পুনঃস্থাপন করুন",
+       "viewdeleted_short": "{{PLURAL:$1|একটি অপসারিত সম্পাদনা|$1টি অপসারিত সম্পাদনা}} দেখাও",
        "protect": "সুরক্ষা",
        "protect_change": "পরিবর্তন করুন",
        "protectthispage": "এই পাতাকে সুরক্ষিত করো",
        "badaccess": "অনুমোদন ত্রুটি",
        "badaccess-group0": "আপনি যে কাজের জন্য অনুরোধ করেছেন, যে কাজটি সম্পন্ন করার অনুমতি নেই।",
        "badaccess-groups": "আপনি যে কাজটি করতে চাচ্ছেন তা কেবল {{PLURAL:$2|এই দলের|এই দলগুলির যেকোন একটির}} একজন সদস্য ব্যবহারকারী সম্পাদন করতে পারেন: $1।",
-       "versionrequired": "মিডিয়াউইকির $1 সংস্করণ প্রয়োজন",
+       "versionrequired": "মিডিয়াà¦\89à¦\87à¦\95ির $1 à¦¨à¦\82 à¦¸à¦\82সà§\8dà¦\95রণ à¦ªà§\8dরয়à§\8bà¦\9cন",
        "versionrequiredtext": "এই পাতাটি ব্যবহার করার জন্য মিডিয়াউইকির $1 নং সংস্করণ প্রয়োজন। [[Special:Version|সংস্করণ পাতা]] দেখুন।",
        "ok": "ঠিক আছে",
        "retrievedfrom": "'$1' থেকে আনীত",
        "cannotdelete": "\"$1\" পাতা বা ফাইলটি মোছা সম্ভব না।\nসম্ভবত অন্য কেউ আগেই এটিকে মুছে ফেলেছেন।",
        "cannotdelete-title": "\"$1\" পৃষ্ঠা মুছে ফেলা যাচ্ছে না।",
        "delete-hook-aborted": "হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।\nএর কোন ব্যাখ্যা নাই।",
-       "no-null-revision": "\"$1\" à¦\8fর à¦\9cনà§\8dয à¦¨à¦¾à¦² à¦°à¦¿à¦­à¦¿à¦¶à¦¨ তৈরী করা যায়নি",
+       "no-null-revision": "\"$1\" à¦ªà¦¾à¦¤à¦¾à¦° à¦\9cনà§\8dয à¦«à¦¾à¦\81à¦\95া à¦¸à¦\82সà§\8dà¦\95রণ তৈরী করা যায়নি",
        "badtitle": "শিরোনামটি গ্রহনযোগ্য নয়।",
        "badtitletext": "অনুরোধকৃত পাতার শিরোনামটি অবৈধ, খালি কিংবা কোন ভুল আন্তঃভাষা বা আন্তঃউইকি শিরোনাম সংযোগ ছিল। এটিতে সম্ভবত এমন এক (একাধিক) ক্যারেক্টার আছে, যা (যেগুলি) শিরোনামে ব্যবহারযোগ্য নয়।",
        "title-invalid-empty": "অনুরোধকৃত পাতার শিরোনামটি খালি বা শুধুমাত্র একটি নামস্থানের নাম ধারণ করে।",
        "viewsource": "উৎস দেখুন",
        "viewsource-title": "$1 এর উৎস দেখুন",
        "actionthrottled": "কাজের গতি ধীরকরণ",
-       "actionthrottledtext": "স্প্যাম-রোধী সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদনা করার সীমা বেঁধে দেওয়া হয়েছে। আপনি সেই সীমা অতিক্রম করেছেন। অনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
+       "actionthrottledtext": "স্প্যাম-রোধী সমাধান হিসেবে এই কাজটি খুব কম সময়ে অনেক বেশিবার সম্পাদনা করার সীমা বেঁধে দেওয়া হয়েছে, এবং আপনি সেই সীমা অতিক্রম করেছেন।\nঅনুগ্রহ করে কয়েক মিনিট পরে আবার চেষ্টা করুন।",
        "protectedpagetext": "সম্পাদনা অথবা স্থানান্তর এড়াতে এ পাতাটির ব্যবহার নিয়ন্ত্রণ করা হয়েছে।",
        "viewsourcetext": "এ পাতাটি আপনি দেখতে এবং উৎসের অনুলিপি নিতে পারবেন।",
        "viewyourtext": "আপনি এই পাতায় <strong>আপনার সম্পাদনা</strong>দেখতে এবং অনুলিপি করতে পারেন।",
        "mycustomjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "myprivateinfoprotected": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করতে আপনার অনুমতি নেই",
        "mypreferencesprotected": "আপনার পছন্দসমূহ সম্পাদনা করতে আপনার অনুমতি নেই",
-       "ns-specialprotected": "{{ns:special}} নামস্থানে পাতাসমূহ সম্পাদনা করা যাবে না।",
+       "ns-specialprotected": "বিশেষ পাতাসমূহ সম্পাদনা করা যাবে না।",
        "titleprotected": "[[User:$1|$1]] কর্তৃক এই শিরোনামটি সৃষ্টি করা থেকে সুরক্ষিত করা হয়েছে। কারণ: \"<em>$2</em>\"।",
        "filereadonlyerror": "\"$1\" ফাইলটিকে পরিবর্তন করা সম্ভব হচ্ছে না কারন \"$2\" ফাইল রিপোসিটোরি রিড-অনলি-মোডে আছে।\n\nএকজন প্রশাসক যিনি এটাকে লকড করেছেন তার যৌক্তিকতা দেওয়া হল: \"$3\"",
        "invalidtitle-knownnamespace": "অবৈধ শিরোনাম, যেখানে নামস্থান \"$2\" এবং লেখা হয়েছে \"$3\"",
        "remembermypassword": "এই ব্রাউজারে আমার প্রবেশ মনে রাখা হোক (সর্বোচ্চ $1 {{PLURAL:$1|দিনের}} জন্য)",
        "userlogin-remembermypassword": "আমাকে প্রবেশ অবস্থায় রাখো",
        "userlogin-signwithsecure": "নিরাপদ সংযোগ ব্যবহার করুন",
-       "yourdomainname": "আপনার ডোমেইন",
+       "yourdomainname": "আপনার ডোমেইন:",
        "password-change-forbidden": "আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।",
        "externaldberror": "হয় কোন বহিঃস্থ যাচাইকরণ ডাটাবেজ ত্রুটি ঘটেছে অথবা আপনার বহিঃস্থ অ্যাকাউন্ট হালনাগাদ করার অনুমতি নেই।",
        "login": "প্রবেশ",
        "createaccountreason": "কারণ:",
        "createacct-reason": "কারণ",
        "createacct-reason-ph": "কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন",
-       "createacct-captcha": "নিরাপত্তা পরীক্ষা",
-       "createacct-imgcaptcha-ph": "উপরে যে লেখা দেখতে পাচ্ছেন তা লিখুন",
        "createacct-submit": "আপনার অ্যাকাউন্ট তৈরি করুন",
        "createacct-another-submit": "অ্যাকাউন্ট তৈরি করুন",
        "createacct-benefit-heading": "{{SITENAME}} আপনার মত লোকের দ্বারাই তৈরি।",
        "passwordtoolong": "পাসওয়ার্ড {{PLURAL:$1|১|$1}} অক্ষরের চেয়ে দীর্ঘ হতে পারবে না।",
        "password-name-match": "আপনার পাসওয়ার্ড আপনার ব্যবহারকারী নাম থেকে আলাদা হতে হবে।",
        "password-login-forbidden": "এই ব্যবহারকারীর নাম এবং পাসওয়ার্ডটি ব্যবহার নিষিদ্ধ করা হয়েছে।",
-       "mailmypassword": "পাসà¦\93য়ারà§\8dড à¦°à¦¿à¦¸à§\87à¦\9f",
+       "mailmypassword": "পাসà¦\93য়ারà§\8dড à¦ªà§\81নà¦\83সà§\8dথাপন",
        "passwordremindertitle": "{{SITENAME}}-এর জন্য নতুন সাময়িক পাসওয়ার্ড",
        "passwordremindertext": "কেউ একজন ($1 আইপি ঠিকানাটি থেকে সম্ভবত আপনি) অনুরোধ করেছেন যেন আমরা আপনাকে {{SITENAME}} ($4) এর জন্য একটি নতুন পাসওয়ার্ড পাঠাই।\n\"$2\" নামে অ্যাকাউন্ট খোলা হয়েছে এবং এর পাসওয়ার্ড \"$3\"। আপনি যদি এটাই চেয়ে থাকেন, তাহলে আপনাকে এখন অ্যাকাউন্টে প্রবেশ করতে হবে ও নতুন একটি পাসওয়ার্ড পছন্দ করতে হবে।\n{{PLURAL:$5|এক দিন|$5 দিন}} পরে আপনার এই অস্থায়ী পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়ে যাবে।\n\nযদি আপনি ছাড়া অন্য কেউ এই অনুরোধ করে থাকে, কিংবা যদি আপনার পুরনো পাসওয়ার্ড মনে পড়ে গিয়ে থাকে ও সেটি আর বদলাবার ইচ্ছা না থাকে, তাহলে এই বার্তাটি উপেক্ষা করতে পারেন এবং পুরনো পাসওয়ার্ডটিই ব্যবহার করে যেতে পারেন।",
        "noemail": "\"$1\" ব্যবহারকারীর জন্য কোন ই-মেইল ঠিকানা সংরক্ষিত নেই।",
        "pt-login-button": "প্রবেশ",
        "pt-createaccount": "অ্যাকাউন্ট তৈরি করুন",
        "pt-userlogout": "প্রস্থান",
-       "php-mail-error-unknown": "পিএইচপি এর মেইল () কার্যে অজ্ঞাত ভুল",
+       "php-mail-error-unknown": "পিএইচপির mail() কার্যে অজ্ঞাত ত্রুটি।",
        "user-mail-no-addy": "কোনো ইমেইল ঠিকানা ছাড়াই ইমেইল করার চেষ্টা করা হয়েছে।",
        "user-mail-no-body": "অত্যান্ত সংক্ষিপ্ত অথবা কোনো তথ্য ছাড়াই ইমেইল পাঠানোর চেষ্টা করা হয়েছিল।",
        "changepassword": "পাসওয়ার্ড পরিবর্তন",
        "passwordreset-emailtext-ip": "কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার\nপাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailtext-user": "ব্যবহারকারী $1 {{SITENAME}} ($4) সাইটের জন্য আপনার পাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailelement": "ব্যবহারকারী নাম: \n$1\n\nঅস্থায়ী পাসওয়ার্ড: \n$2",
-       "passwordreset-emailsent": "পাসওয়ার্ড বদলের একটি ই-মেইল পাঠানো হয়েছে।",
+       "passwordreset-emailsentemail": "যদি আপনার অ্যাকাউন্টের জন্য এটি একটি নিবন্ধিত ইমেল ঠিকানা হয়, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
        "passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
        "passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
-       "changeemail": "ই-মেইল ঠিকানা পরিবর্তন",
-       "changeemail-header": "অ্যাকাউন্ট ই-মেইল ঠিকানা পরিবর্তন",
+       "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
+       "changeemail-header": "আপনার ইমেল ঠিকানা পরিবর্তন করতে এই ফরমটি পূরণ করুন। আপনি যদি আপনার একাউন্ট থেকে যে কোন ইমেল ঠিকানার এসোসিয়েশন অপসারণ করতে চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
+       "changeemail-passwordrequired": "এই পরিবর্তন নিশ্চিত করতে আপনাকে আপনার পাসওয়ার্ড লিখতে হবে।",
        "changeemail-no-info": "এই পাতাটিতে সরাসরি প্রবেশাধিকার পেতে আপনাকে অবশ্যই লগইন করতে হবে।",
        "changeemail-oldemail": "বর্তমান ই-মেইল ঠিকানা:",
        "changeemail-newemail": "নতুন ই-মেইল ঠিকানা:",
        "resettokens-tokens": "টোকেন:",
        "resettokens-token-label": "$1 (বর্তমান: $2)",
        "resettokens-watchlist-token": "ওয়েব ফিড (Atom/RSS) টোকেন পরিবর্তনের জন্য [[Special:Watchlist|নজরতালিকায় থাকা পাতাগুলোতে পরিবর্তন এসেছে]]",
-       "resettokens-done": "à¦\9fà§\8bà¦\95à§\87ন à¦°à¦¿à¦¸à§\87à¦\9f।",
-       "resettokens-resetbutton": "নিরà§\8dবাà¦\9aিত à¦\9fà§\8bà¦\95à§\87ন à¦°à¦¿à¦¸à§\87à¦\9f",
+       "resettokens-done": "à¦\9fà§\8bà¦\95à§\87ন à¦ªà§\81নà¦\83সà§\8dথাপন।",
+       "resettokens-resetbutton": "নিরà§\8dবাà¦\9aিত à¦\9fà§\8bà¦\95à§\87ন à¦ªà§\81নà¦\83সà§\8dথাপন à¦\95রà§\81ন",
        "bold_sample": "গাঢ় লেখা",
        "bold_tip": "গাঢ় লেখা",
        "italic_sample": "তীর্যক লেখা",
        "sig_tip": "সময় ও তারিখসহ আপনার স্বাক্ষর",
        "hr_tip": "অনুভূমিক রেখা (সংযতভাবে ব্যবহার করুন)",
        "summary": "সারাংশ:",
-       "subject": "বিষয়/শিরোনাম:",
+       "subject": "বিষয়:",
        "minoredit": "এটি একটি অনুল্লেখ্য সম্পাদনা",
        "watchthis": "এই পাতাটি নজরে রাখুন",
        "savearticle": "সংরক্ষণ",
        "missingsummary": "'''খেয়াল করুন''':  আপনি কিন্তু সম্পাদনার সারাংশ দেননি। আবার যদি \"সংরক্ষণ\" বোতামে ক্লিক করেন, তাহলে ঐ সারাংশ বাক্যটি ছাড়াই আপনার সম্পাদনা সংরক্ষিত হবে।",
        "selfredirect": "<strong>সতর্কতা:</strong> আপনি এই পাতাকে এর নিজের দিকে পুনঃনির্দেশিত করছেন।\nআপনাকে পুনঃনির্দেশিত করার জন্য হয় ভুল লক্ষ্য নির্দিষ্ট করেছেন, অথবা আপনি ভুল পাতা সম্পাদনা করছেন।\nআপনি যদি আবার \"{{int:savearticle}}\" ক্লিক করেন, পুনর্নির্দেশ যেকোনোভাবেই হোক তৈরি করা হবে।",
        "missingcommenttext": "দয়া করে নিচে মন্তব্য যোগ করুন।",
-       "missingcommentheader": "'''খেয়াল করুন:''' আপনি এই মন্তব্যের জন্য কোন বিষয়/শিরোনাম দেননি। সংরক্ষণ বোতামে ক্লিক করলে, আপনার এই সম্পাদনা কোন বিষয়/শিরোনাম ছাড়াই সংরক্ষিত হবে।",
+       "missingcommentheader": "<strong>খেয়াল করুন:</strong> আপনি এই মন্তব্যের জন্য কোন বিষয় প্রদান করেননি।আপনি যদি আবার \"{{int:savearticle}}\" বোতামে ক্লিক করেন, আপনার এই সম্পাদনা কোন বিষয় ছাড়াই সংরক্ষিত হবে।",
        "summary-preview": "সারাংশ প্রাকদর্শন:",
-       "subject-preview": "বিষয়/শিরোনাম প্রাকদর্শন:",
+       "subject-preview": "বিষয় প্রাকদর্শন:",
        "previewerrortext": "আপনার পরিবর্তনগুলি প্রাকদর্শন করার চেষ্টা করার সময় একটি ত্রুটি ঘটেছে।",
        "blockedtitle": "ব্যবহারকারীকে বাধা দেয়া হয়েছে",
        "blockedtext": "আপনার ব্যবহারকারী নাম বা আইপি ঠিকানার ঊপর নিষেধাজ্ঞা আরোপিত হয়েছে।\n\n$1 নিষেধাজ্ঞা আরোপ করেছেন। নিষেধের কারণ হিসেবে বলা হয়েছে:''$2''।\n\n* নিষেধাজ্ঞা শুরুর সময়:$8\n* নিষেধাজ্ঞা উঠিয়ে নেয়ার সময়: $6\n* যার উপর নিষেধাজ্ঞা আরোপ করা হয়েছে: $7\n\nআপনি $1 অথবা [[{{MediaWiki:Grouppage-sysop}}|প্রশাসকদের]] কারও সাথে এই নিষেধাজ্ঞা সংক্রান্ত বিষয়ে আলোচনা করতে পারেন।\n\nআপনি '(ব্যবহারকারীকে) ইমেইল করুন' ফিচারটি ব্যবহার করতে পারবেন না। তবে [[Special:Preferences|আপনার পছন্দ তালিকাতে]] যদি একটি বৈধ ই-মেইল ঠিকানা নির্দিষ্ট করা হয়ে থাকে এবং ফিচারটি ব্যবহারে যদি আপনাকে বাধা না দেওয়া হয়ে থাকে, তবে আপনি ফিচারটি ব্যবহার করতে পারবেন।\n\nআপনার বর্তমান আইপি ঠিকানা $3, এবং আপনার নিষেধাজ্ঞা নং হল #$5।\n\nদয়া করে আপনার যেকোন জিজ্ঞাসাতে উপরের সমস্ত বিবরণ অন্তর্ভুক্ত করুন।",
        "permissionserrorstext-withaction": "আপনার $2 করার অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}}:",
        "recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
        "moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
+       "moveddeleted-notice-recent": "দুঃখিত, এই পাতাটি সাম্প্রতি অপসারিত হয়েছে (সর্বশেষ ২৪ ঘণ্টায়)।\nসূত্র হিসেবে নিচে এই পাতা অপসারণ ও স্থানান্তর লগ দেয়া হয়েছে।",
        "log-fulllog": "সম্পূর্ণ লগ দেখাও",
        "edit-hook-aborted": "হূক দ্বারা সম্পাদনা পরিত্যক্ত হয়েছে।\nএর কোন ব্যাখ্যা নাই।",
        "edit-gone-missing": "পাতাটি হালনাগাদ হয়নি।\nসম্ভবতঃ পাতাটি মুছে ফেলা হয়েছে।",
        "content-model-text": "সাধারণ লেখা",
        "content-model-javascript": "জাভাস্ক্রিপ্ট",
        "content-model-css": "সিএসএস",
-       "content-json-empty-object": "à¦\96ালি à¦\85বà¦\9cà§\87à¦\95à§\8dà¦\9f",
+       "content-json-empty-object": "à¦\96ালি à¦¬à¦¸à§\8dতà§\81",
        "content-json-empty-array": "খালি অ্যারে",
        "duplicate-args-warning": "<strong>সতর্কীকরণ:</strong> \"$3\" প্যারামিটারের জন্য একের অধিক মানসহ [[:$1]] [[:$2]] কে আহ্বান করছে। শুধুমাত্র প্রদত্ত শেষ মান ব্যবহৃত হবে।",
        "duplicate-args-category": "টেমপ্লেট আহ্বানে সদৃশ আর্গুমেন্ট ব্যবহার করা পাতা",
        "expensive-parserfunction-warning": "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।\n\nএটি $2-এর চেয়ে কম পরিমাণ {{PLURAL:$2|কল|কল}} থাকা উচিত, যেখানে মোট কলের সংখ্যা {{PLURAL:$1|বর্তমানে $1|বর্তমানে $1}}।",
        "expensive-parserfunction-category": "অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল থাকা পাতাসমূহ",
        "post-expand-template-inclusion-warning": "'''সতর্ক হোন:''' টেমপ্লেটের ইনক্লুড আকার অনেক বেশি।\nকিছু টেমপ্লেট সংযুক্ত করা নাও যেতে পারে।",
-       "post-expand-template-inclusion-category": "যেসকল স্থানে টেমপ্লেটের ইনক্লুড আকার অতিক্রম করে গেছে সেই পাতাগুলো",
+       "post-expand-template-inclusion-category": "যেসকল স্থানে টেমপ্লেট অন্তর্ভুক্তির আকার অতিক্রম করে গেছে সেই পাতাগুলো",
        "post-expand-template-argument-warning": "' ' ' সাবধান: ' ' ' এই পাতাটিতে অন্তত একটি ফর্মা যুক্তি আছে যা একটি খুব বড় বিস্তার আকার ধারণ করেছে।\nতাই এই আর্গুমেন্টটি বাদ দেওয়া হয়েছে।",
        "post-expand-template-argument-category": "বাদ ফর্মা আর্গুমেন্ট ধারণকারী পাতা",
        "parser-template-loop-warning": "টেমপ্লেট লুপ সনাক্ত হয়েছে: [[$1]]",
        "undo-norev": "সম্পাদনাটি বাতিল করা যাচ্ছেনা কারণ এটি আর নেই বা মুছে ফেলা হয়েছে।",
        "undo-nochange": "সম্পাদনাটি পূর্বেই বাতিল করা হয়েছে।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|আলাপ]])-এর সম্পাদিত $1 নম্বর সংশোধনটি বাতিল করা হয়েছে",
-       "undo-summary-username-hidden": "à¦\8fà¦\95à¦\9cন à¦²à§\81à¦\95ানà§\8b à¦¬à§\8dযবহারà¦\95ারà§\80 $1 à¦°à¦¿à¦­à¦¿à¦¶ন পুনরায় ফিরিয়ে এনেছেন",
+       "undo-summary-username-hidden": "à¦\8fà¦\95à¦\9cন à¦²à§\81à¦\95ানà§\8b à¦¬à§\8dযবহারà¦\95ারà§\80 $1 à¦¸à¦\82শà§\8bধন পুনরায় ফিরিয়ে এনেছেন",
        "cantcreateaccounttitle": "অ্যাকাউন্ট তৈরি করা যাবে না",
        "cantcreateaccount-text": "[[User:$3|$3]] এই আইপি ঠিকানা('''$1''') থেকে অ্যাকাউন্ট সৃষ্টিতে বাধা দিয়েছেন।\n\n$3-এর দেয়া কারণ হল ''$2''",
        "cantcreateaccount-range-text": "[[User:$3|$3]] কর্তৃক আইপি ঠিকানা '''$1''' ব্যাপ্তির মধ্য থেকে অ্যাকাউন্ট তৈরি করা অবরুদ্ধ করা হয়েছে। যাতে আপনার আইপি ঠিকানা ('''$4''') রয়েছে। \n\n$3 কর্তৃক ''$2'' কারণ দেখানো হয়েছে।",
        "revdelete-show-file-submit": "হ্যাঁ",
        "revdelete-selected-text": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "revdelete-selected-file": "[[:$2]]-এর {{PLURAL:$1|নির্বাচিত ফাইল সংস্করণ|নির্বাচিত ফাইল সংস্করণগুলি}}:",
-       "logdelete-selected": "{{PLURAL:$1|à¦\9fি à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦²à¦\97-à¦\98à¦\9fনা|à¦\9fি à¦¨à¦¿à¦°à§\8dবাà¦\9aিত à¦²à¦\97-ঘটনা}}:",
+       "logdelete-selected": "{{PLURAL:$1|নিরà§\8dবাà¦\9aিত à¦²à¦\97à§\87র ঘটনা}}:",
        "revdelete-text-text": "অপসারিত সংস্করণসমূহ এখনও পাতা ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
        "revdelete-text-file": "অপসারিত ফাইলের সংস্করণসমূহ এখনও ফাইল ইতিহাসে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারবে না।",
        "logdelete-text": "অপসারিত লগ ইভেন্টসমূহ এখনও লগে প্রদর্শিত হয়, কিন্তু সেই বিষয়বস্তুর অংশগুলি সর্বসাধারণ দেখতে পারেবে না।",
        "mergehistory-go": "একত্রীকরণযোগ্য সম্পাদনাগুলি দেখানো হোক",
        "mergehistory-submit": "সংশোধনগুলি একত্র করা হোক",
        "mergehistory-empty": "কোন সংশোধন একত্র করা যাবে না.",
-       "mergehistory-done": "$1 গুলোর মধ্যে $3 {{PLURAL:$3| টি সংশোধন |টি সংশোধনগুলো}} সফলভাবে [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
+       "mergehistory-done": "$1-এর $3{{PLURAL:$3|টি সংশোধন}} [[:$2]]-এর সাথে একত্রিত করা হয়েছে।",
        "mergehistory-fail": "ইতিহাস একত্র করা গেল না। অনুগ্রহ করে পাতাটি ও সময়ের প্যারামিটারগুলি আবার পরীক্ষা করে দেখুন।",
        "mergehistory-fail-toobig": "ইতিহাস থেকে আগের পাতাগুলো একীকরণ সম্ভব নয়, কারণ এর ফলে সর্বোচ্চ $1 টি {{PLURAL:$1|সংস্করণ}} স্থানান্তরের সীমানা অতিক্রম করবে।",
        "mergehistory-no-source": "$1 বলে কোন উৎস পাতার অস্তিত্ব নেই।",
        "nextn": "পরবর্তী {{PLURAL:$1|$1}}টি",
        "prev-page": "পূর্ববর্তী পাতা",
        "next-page": "পরবর্তী পাতা",
-       "prevn-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) দেখানো হোক।",
        "showingresultsinrange": "#<strong>$2</strong> থেকে #<strong>$3</strong> পরিসীমার মধ্যে {{PLURAL:$1|<strong>১টি</strong> ফলাফল|<strong>$1টি</strong> ফলাফল}} নিচে দেখানো হচ্ছে।",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>-এর মধ্যে <strong>$1</strong>টি ফলাফল|<strong>$3</strong>-এর মধ্যে <strong>$1 - $2</strong>টি ফলাফল}}",
        "search-nonefound": "খোঁজকৃত পাতার সাথে মিলে যায় এমন কোনো ফলাফল নেই।",
+       "search-nonefound-thiswiki": "খোঁজ করার সাথে মিলে যায় এমন কোনো ফলাফল এই সাইটে নেই।",
        "powersearch-legend": "উন্নত অনুসন্ধান",
        "powersearch-ns": "নামস্থানে অনুসন্ধান করো:",
        "powersearch-togglelabel": "পরীক্ষা:",
        "prefs-watchlist-token": "নজরতালিকা টোকেন:",
        "prefs-misc": "বিবিধ",
        "prefs-resetpass": "পাসওয়ার্ড পরিবর্তন",
-       "prefs-changeemail": "ই-মেইল পরিবর্তন",
+       "prefs-changeemail": "ইমেইল ঠিকানা পরিবর্তন বা বাতিল",
        "prefs-setemail": "একটি ই-মেইল ঠিকানা নির্ধারণ করুন",
        "prefs-email": "ই-মেইল অপশন",
        "prefs-rendering": "অবয়ব",
        "rows": "সারি:",
        "columns": "কলাম:",
        "searchresultshead": "অনুসন্ধান",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">অসম্পূর্ণ নিবন্ধের সংযোগগুলির</a> বিশেষ ফরম্যাটিঙের সীমা (বাইটে):",
+       "stub-threshold": "অসম্পূর্ণ লিঙ্ক বিন্যাসের জন্য প্রান্তিক মাপ ($1):",
        "stub-threshold-sample-link": "নমুনা",
        "stub-threshold-disabled": "নিস্ক্রিয়",
        "recentchangesdays": "সাম্প্রতিক পরিবর্তনে দিনসমূহ দেখানোর জন্য:",
        "prefs-help-recentchangescount": "এতে সাম্প্রতিক পরিবর্তনসমূহ, পাতার ইতিহাস এবং লগ অন্তর্ভুক্ত।",
        "prefs-help-watchlist-token2": "এটি আপনার নজরতালিকার ওয়েব ফিডের গোপন চাবি। যে কেউ যিনি এটা জানেন তিনি আপনার নজরতালিকা পড়তে সক্ষম হবেন, তাই এটি প্রকাশ করবেন না। [[Special:ResetTokens|আপনার এটি পুনরায় সেট করার প্রয়োজন হলে এখানে ক্লিক করুন]]।",
        "savedprefs": "আপনার পছন্দগুলো সংরক্ষণ করা হয়েছে।",
+       "savedrights": "{{GENDER:$1|$1}}-এর ব্যবহারকারী অধিকার সংরক্ষিত হয়েছে।",
        "timezonelegend": "সময়স্থান:",
        "localtime": "স্থানীয় সময়:",
        "timezoneuseserverdefault": "উইকির পূর্বনির্ধারিত সময় ব্যবহার করো ($1)",
        "youremail": "ইমেইল *",
        "username": "{{GENDER:$1|ব্যবহারকারী নাম}}:",
        "prefs-memberingroups": "{{PLURAL:$1|দলের|দলসমূহের}} {{GENDER:$2|সদস্য}}:",
-       "prefs-registration": "নিবন্ধের সময়:",
+       "prefs-registration": "নিবনà§\8dধনà§\87র à¦¸à¦®à¦¯à¦¼:",
        "yourrealname": "আসল নাম *",
        "yourlanguage": "ভাষা:",
        "yourvariant": "বিষয়বস্তুর ভাষার বিকল্প:",
        "prefs-help-prefershttps": "পরবর্তী লগইনের পর থেকে এই পরিবর্তনগুলো কার্যকর হবে।",
        "prefswarning-warning": "আপানি পছন্দসমূহ পাতায় পাতায় পরিবর্তন করেছেন যেগুলো সংরক্ষণ করা হয়নি। আপনি যদি এই পাতাটি ছেড়ে যাওয়ার আগে \"$1\" ক্লিক না করেন তবে পছন্দসমূহ হালনাগাদ হবে না।",
        "prefs-tabs-navigation-hint": "সাহায্য: আপনি ডান এবং বাম অ্যারো বাটন ব্যবহার করে বিভিন্ন ট্যাবগুলোতে যেতে পারবেন।",
-       "email-address-validity-valid": "ইমেইল ঠিকানাটি সঠিক",
-       "email-address-validity-invalid": "সঠিক ইমেই ঠিকানা প্রদান করুন",
        "userrights": "ব্যবহারকারী অধিকার ব্যবস্থাপনা",
        "userrights-lookup-user": "ব্যবহারকারী দল ব্যবস্থাপনা করুন",
        "userrights-user-editname": "ব্যবহারকারীর নাম লিখুন:",
        "action-deletedhistory": "পাতার মুছে ফেলা ইতিহাস দেখাও",
        "action-browsearchive": "অপসারিত পাতায় অনুসন্ধান করুন",
        "action-undelete": "পাতাটি পুনরুদ্ধার করো",
-       "action-suppressrevision": "লà§\81à¦\95ানà§\8b à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦°à¦¿à¦­à¦¿à¦\89 à¦\8fবà¦\82 à¦°à¦¿à¦¸à§\8dà¦\9fà§\8bর করুন",
+       "action-suppressrevision": "লà§\81à¦\95ানà§\8b à¦¸à¦\82সà§\8dà¦\95রণà¦\97à§\81লà§\8b à¦ªà¦°à§\8dযালà§\8bà¦\9aনা à¦\8fবà¦\82 à¦ªà§\81নà¦\83সà§\8dথাপন করুন",
        "action-suppressionlog": "এই ব্যক্তিগত লগ দেখাও",
        "action-block": "এই ব্যবহারকারীকে সম্পাদনা করতে বাঁধা দাও",
        "action-protect": "এই পাতার সুরক্ষার মাত্রা পরিবর্তন করো",
        "recentchanges-legend-heading": "'''ব্যাখ্যামূলক বর্ণনা:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (আরও দেখুন [[Special:NewPages|নতুন পাতার তালিকা]])",
        "recentchanges-legend-plusminus": "(''±১২৩'')",
+       "recentchanges-submit": "দেখাও",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
        "rclistfrom": "$2, $3 তারিখের পর সংঘটিত নতুন পরিবর্তনগুলো দেখাও",
        "rcshowhideminor": "অনুল্লেখ্য পরিবর্তনগুলো $1",
        "rcshowhidemine": "আমার সম্পাদনাগুলো $1",
        "rcshowhidemine-show": "দেখাও",
        "rcshowhidemine-hide": "আড়াল করো",
+       "rcshowhidecategorization": "পাতা শ্রেণীবদ্ধকরণ $1",
+       "rcshowhidecategorization-show": "দেখাও",
+       "rcshowhidecategorization-hide": "আড়াল করো",
        "rclinks": "'''প্রদর্শনের ধরন'''<br />\n* বিগত ($2) দিনের শেষ ($1)টি পরিবর্তন দেখাও\n* $3",
        "diff": "পরিবর্তন",
        "hist": "ইতিহাস",
        "recentchanges-page-added-to-category-bundled": "বিষয়শ্রেণীতে [[:$1]] এবং {{PLURAL:$2|একটি পাতা|$2টি পাতা}} যোগ করা হয়েছে",
        "recentchanges-page-removed-from-category": "বিষয়শ্রেণী থেকে [[:$1]] সরানো হয়েছে",
        "recentchanges-page-removed-from-category-bundled": "বিষয়শ্রেণী থেকে [[:$1]] এবং {{PLURAL:$2|একটি পাতা|$2টি পাতা}} সরানো হয়েছে",
+       "autochange-username": "মিডিয়াউইকি স্বয়ংক্রিয় পরিবর্তন",
        "upload": "আপলোড",
        "uploadbtn": "ফাইল আপলোড করুন",
        "reuploaddesc": "আপলোড বাতিল করো এবং আপলোড ফর্মে ফেরত যাও।",
        "uploadscripted": "এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।",
        "uploaded-script-svg": "আপলোডকৃত SVG ফাইলে স্ক্রিপ্টযোগ্য উপাদান \"$1\" পাওয়া গেছে।",
        "uploaded-hostile-svg": "আপলোড করা SVG ফাইলের শৈলী উপাদানে অনিরাপদ সিএসএস পাওয়া গেছে।",
+       "uploaded-image-filter-svg": "আপলোডকৃত SVG ফাইলে URL: <code>&lt;$1 $2=\"$3\"&gt;</code> সহ ছবি পরিশোধক পাওয়া গেছে।",
        "uploadscriptednamespace": "এই SVG ফাইলে অবৈধ নামস্থান \"$1\" রয়েছে",
        "uploadinvalidxml": "আপলোডকৃত ফাইলে XML পার্স করা যাবে না।",
        "uploadvirus": "এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1",
        "upload-form-label-infoform-description": "বিবরণ",
        "upload-form-label-usage-title": "ব্যবহার",
        "upload-form-label-usage-filename": "ফাইলের নাম",
+       "foreign-structured-upload-form-label-own-work": "এটি আমার নিজের কাজ",
+       "foreign-structured-upload-form-label-infoform-categories": "বিষয়শ্রেণীসমূহ",
+       "foreign-structured-upload-form-label-infoform-date": "তারিখ",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "এছাড়াও আপনি [[Special:Upload|ডিফল্ট আপলোডের পাতা]] চেষ্টা করতে পারেন।",
        "backend-fail-stream": "\"$1\" ফাইলের স্ট্রিম দেখানো যাচ্ছে না।",
        "backend-fail-backup": "\"$1\" ফাইলের ব্যাকআপ তৈরী সম্ভব নয়।",
        "backend-fail-notexists": "\"$1\" নামের কোনো ফাইল নেই।",
        "mostrevisions": "সবচেয়ে বেশী বার সম্পাদিত নিবন্ধসমূহ",
        "prefixindex": "উপসর্গ সহ সমস্ত পাতা",
        "prefixindex-namespace": "উপসর্গ সহ সকল পাতা ($1 নামস্থান)",
+       "prefixindex-submit": "দেখাও",
        "prefixindex-strip": "তালিকা থেকে প্রিফিক্স সরাও",
        "shortpages": "সংক্ষিপ্ত পাতাসমূহ",
        "longpages": "দীর্ঘ পাতাসমূহ",
        "protectedpages-performer": "ব্যবহারকারীকে সুরক্ষিত করা হচ্ছে",
        "protectedpages-params": "সুরক্ষা প্যারামিটার",
        "protectedpages-reason": "কারণ",
+       "protectedpages-submit": "পাতা প্রদর্শন করুন",
        "protectedpages-unknown-timestamp": "অজানা",
        "protectedpages-unknown-performer": "অজানা ব্যবহারকারী",
        "protectedtitles": "সুরক্ষিত শিরোনামগুলি",
        "protectedtitles-summary": "এই পাতায় বর্তমানে সৃষ্টি করা থেকে সুরক্ষিত পাতার শিরোনামের তালিকা রয়েছে। বিদ্যমান সুরক্ষিত পাতার একটি তালিকা দেখার জন্য, [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] দেখুন।",
        "protectedtitlesempty": "কোন শিরোনাম বর্তমানে এই প্যারামিটারগুলিসহ সুরক্ষিত নয়।",
+       "protectedtitles-submit": "শিরোনাম প্রদর্শন করুন",
        "listusers": "ব্যবহারকারীর তালিকা",
        "listusers-editsonly": "শুধুমাত্র এমন ব্যবহারকারীদের দেখাও যাদের অবদান আছে",
        "listusers-creationsort": "তৈরির তারিখ অনুসারে সাজাও",
        "activeusers-hidebots": "বট লুকাও",
        "activeusers-hidesysops": "প্রশাসক লুকাও",
        "activeusers-noresult": "কোনো ব্যবহারকারী পাওয়া যায়নি।",
+       "activeusers-submit": "সক্রিয় ব্যবহারকারী প্রদর্শন করুন",
        "listgrouprights": "দলগত ব্যবহারকারী অধিকার",
        "listgrouprights-summary": "এই উইকির ব্যবহারকারীদের একটি গ্রুপগুলোর তালিকা দেখানো হচ্ছে, সাথে গ্রুপের কার্যপরিধিও উল্লেখ করা হয়েছে।\nনির্দিষ্ট গ্রুপের কার্যপরিধি সম্পর্কে জানতে [[{{MediaWiki:Listgrouprights-helppage}}|অতিরিক্ত তথ্য]] দেখুন।",
        "listgrouprights-key": "লিজেন্ড:\n* <span class=\"listgrouprights-granted\">অনুমোদিত অধিকার</span>\n* <span class=\"listgrouprights-revoked\">বাধাপ্রাপ্ত অধিকার</span>",
        "wlheader-showupdated": "আপনার শেষ আগমনের পর থেকে যেসব পাতায় পরিবর্তন হয়েছে সেগুলি '''গাঢ়''' করে দেখানো হয়েছে।",
        "wlnote": "নিচে $3, $4 তারিখ থেকে বিগত {{PLURAL:$2|১ ঘন্টায়|<strong>$2</strong> ঘন্টায়}} সংঘটিত {{PLURAL:$1|শেষ ১টি পরিবর্তন|শেষ <strong>$1টি</strong> পরিবর্তন}} দেখানো হল।",
        "wlshowlast": "সর্বশেষ $1 ঘণ্টা $2 দিনে দেখাও",
+       "watchlistall2": "সমস্ত",
+       "watchlist-hide": "আড়াল করো",
+       "watchlist-submit": "দেখাও",
+       "wlshowtime": "প্রদর্শনের সময় কাল:",
+       "wlshowhideminor": "অনুল্লেখ্য সম্পাদনা",
+       "wlshowhidebots": "বট",
+       "wlshowhideliu": "নিবন্ধিত ব্যবহারকারী",
+       "wlshowhideanons": "নামহীন ব্যবহারকারী",
+       "wlshowhidepatr": "পরীক্ষিত সম্পাদনা",
+       "wlshowhidemine": "আমার সম্পাদনা",
        "watchlist-options": "নজর তালিকা পছন্দসমূহ",
        "watching": "নজর রাখা হচ্ছে...",
        "unwatching": "নজর তুলে নেওয়া হচ্ছে...",
        "deletepage": "পাতাটি মুছে ফেলা হোক",
        "confirm": "নিশ্চিত করুন",
        "excontent": "বিষয়বস্তু ছিল: '$1'",
-       "excontentauthor": "বিষয়বস্তু ছিল: \"$1\" (এবং একমাত্র অবদানকারী ছিলেন \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "বিষয়বস্তু ছিল: \"$1\", এবং একমাত্র অবদানকারী ছিলেন \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|আলাপ]])",
        "exbeforeblank": "মুছে ফেলার আগে বিষয়বস্তু ছিল: '$1'",
        "delete-confirm": "\"$1\" অপসারণ",
        "delete-legend": "অপসারণ",
        "protect-level-autoconfirmed": "কেবলমাত্র সয়ংক্রিয় পরীক্ষিত ব্যবহারকারীদের জন্য",
        "protect-level-sysop": "কেবল প্রশাসকদের জন্য অনুমতি",
        "protect-summary-cascade": "প্রপাতাকার",
-       "protect-expiring": "$1 (UTC) সময়ে মেয়াদোত্তীর্ণ",
+       "protect-expiring": "$1 (ইউটিসি) সময়ে মেয়াদোত্তীর্ণ",
        "protect-expiring-local": "মেয়াদ উত্তীর্ণের সময় $1",
        "protect-expiry-indefinite": "অসীম",
        "protect-cascade": "এই পাতায় অন্তর্ভুক্ত পাতাগুলিও সুরক্ষিত করা হোক (প্রপাতাকার সুরক্ষা)",
        "contributions": "{{GENDER:$1|ব্যবহারকারীর}} অবদান",
        "contributions-title": "$1 ব্যবহারকারীর অবদানসমূহ",
        "mycontris": "অবদান",
+       "anoncontribs": "অবদান",
        "contribsub2": "{{GENDER:$3|$1}} ($2)-এর জন্য",
        "contributions-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
        "nocontribs": "এই শর্তগুলির সাথে মিলে যায়, এমন কোন পরিবর্তন খুঁজে পাওয়া যায়নি।",
        "whatlinkshere-hidelinks": "সংযোগ $1",
        "whatlinkshere-hideimages": "$1 ফাইল সংযোগ",
        "whatlinkshere-filters": "ছাকনী",
+       "whatlinkshere-submit": "চলো",
        "autoblockid": "স্বয়ংক্রিয় বাধা #$1",
        "block": "ব্যবহারকারীকে বাধা দাও",
        "unblock": "ব্যবহারকারীর উপর থেকে বাধা অপসারণ",
        "cant-move-to-user-page": "আপনার কোনো পাতা ব্যবহারকারী পাতার স্থানান্তরের অনুমতি নেই (ব্যবহারকারী উপপাতা ব্যতিত)।",
        "cant-move-category-page": "আপনার বিষয়শ্রেণী পাতা স্থানান্তরের অনুমতি নেই।",
        "cant-move-to-category-page": "আপনার পাতাটিকে বিষয়শ্রেণী পাতায় স্থানান্তরের অনুমতি নেই।",
-       "newtitle": "à¦\8fà¦\87 à¦¨à¦¤à§\81ন à¦¶à¦¿à¦°à§\8bনামà§\87",
+       "newtitle": "নতà§\81ন à¦¶à¦¿à¦°à§\8bনাম:",
        "move-watch": "এই পাতাটি নজরে রাখুন",
        "movepagebtn": "পাতা স্থানান্তর করুন",
        "pagemovedsub": "সরিয়ে নেওয়া হয়েছে",
        "movenosubpage": "এই পাতাটির কোনো উপপাতা নেই।",
        "movereason": "কারণ:",
        "revertmove": "পূর্বাবস্থায় ফেরত নেওয়া হোক",
-       "delete_and_move": "মুছে ফেলা হোক ও সরানো হোক",
        "delete_and_move_text": "==মুছে ফেলা আবশ্যক==\n\n\"[[:$1]]\" শিরোনামের গন্তব্য পাতাটি ইতিমধ্যেই বিদ্যমান। আপনি কি স্থানান্তর সফল করার জন্য পাতাটি মুছে দিতে চান?",
        "delete_and_move_confirm": "হ্যাঁ, পাতাটি মুছে ফেলা হোক",
        "delete_and_move_reason": "\"[[$1]]\" থেকে স্থানান্তরের স্বার্থে মুছে ফেলা হয়েছে",
        "importlogpage": "আমদানি লগ",
        "importlogpagetext": "প্রশাসক কর্তৃক অন্যান্য উইকি থেকে সম্পাদনা ইতিহাসসহ পাতা আমদানি।",
        "import-logentry-upload-detail": "$1টি {{PLURAL:$1|সংশোধন}} আমদানি করা হয়েছে",
-       "import-logentry-interwiki-detail": "$2-এর থেকে $1টি {{PLURAL:$1|সংশোধন}} করা হয়েছে",
+       "import-logentry-interwiki-detail": "$2 থেকে $1টি {{PLURAL:$1|সংশোধন}} আমদানি করা হয়েছে",
        "javascripttest": "জাভাস্ক্রিপ্ট পরীক্ষা",
        "javascripttest-pagetext-noframework": "এই পাতাটি জাভাস্ক্রিপ্ট পরীক্ষার জন্য সংরক্ষিত।",
        "javascripttest-pagetext-unknownframework": "পরীক্ষার অজানা ফ্রেমওয়ার্ক \"$1\"।",
        "tooltip-pt-preferences": "আমার পছন্দ",
        "tooltip-pt-watchlist": "যে পাতাগুলির পরিবর্তন আপনি নজরে রেখেছেন, তাদের তালিকা",
        "tooltip-pt-mycontris": "আপনার অবদানগুলোর তালিকা",
+       "tooltip-pt-anoncontribs": "এই আইপি ঠিকানা থেকে করা সম্পাদনার একটি তালিকা",
        "tooltip-pt-login": "আপনার প্রবেশ করাটা বাঞ্চনীয়, কিন্তু তা বাধ্যতামূলক নয়।",
        "tooltip-pt-logout": "প্রস্থান",
        "tooltip-pt-createaccount": "আপনাকে একটি অ্যাকাউন্ট তৈরি করে প্রবেশ করার পরামর্শ দেওয়া হচ্ছে; তবে এটা বাধ্যতামূলক নয়",
        "pageinfo-category-pages": "পাতার সংখ্যা",
        "pageinfo-category-subcats": "উপবিষয়শ্রেণীর সংখ্যা",
        "pageinfo-category-files": "ফাইলের সংখ্যা",
-       "markaspatrolleddiff": "পরà§\80à¦\95à§\8dষিত à¦¬à¦²ে চিহ্নিত করুন",
-       "markaspatrolledtext": "à¦\8fà¦\87 à¦¨à¦¿à¦¬à¦¨à§\8dধà¦\9fিà¦\95à§\87 à¦ªà¦°à§\80à¦\95à§\8dষিত à¦¬à¦²ে চিহ্নিত করুন",
+       "markaspatrolleddiff": "পরà§\80à¦\95à§\8dষিত à¦¹à¦¿à¦¸à§\87বে চিহ্নিত করুন",
+       "markaspatrolledtext": "à¦\8fà¦\87 à¦ªà¦¾à¦¤à¦¾à¦\9fি à¦ªà¦°à§\80à¦\95à§\8dষিত à¦¹à¦¿à¦¸à§\87বে চিহ্নিত করুন",
        "markedaspatrolled": "পরীক্ষিত বলে চিহ্নিত করুন",
        "markedaspatrolledtext": "আপনার নির্বাচিত সংস্করণ [[:$1]] পরীক্ষিত বলে চিহ্নিত করা হয়েছে।",
        "rcpatroldisabled": "সাম্প্রতিক পরিবর্তন প্যাট্রোল নিষ্ক্রিয়",
        "svg-long-error": "অবৈধ SVG ফাইল: $1",
        "show-big-image": "মূল ফাইল",
        "show-big-image-preview": "এই প্রাকদর্শনের আকার: $1।",
+       "show-big-image-preview-differ": "এই $2 ফাইলের জন্য এই $3 প্রাকদর্শনের আকার: $1।",
        "show-big-image-other": "অন্যান্য {{PLURAL:$2|আকার|আকারসমূহ}}: $1।",
        "show-big-image-size": "$1 × $2 পিক্সেল",
        "file-info-gif-looped": "লুপকৃত",
        "version-poweredby-others": "অন্যান্য",
        "version-poweredby-translators": "translatewiki.net অনুবাদকগণ",
        "version-credits-summary": "[[Special:Version|মিডিয়াউইকি]] সফটওয়্যারে অবদানের জন্য আমরা এই ব্যক্তিকে স্বীকৃতি দিতে চাই।",
-       "version-license-info": "মিডিয়াউইকি একটি ফ্রি সফটওয়্যার, আপনি এটি বিতরণ করতে পারবেন এবং/অথবা সম্পদানা করতে পারবেন, এক্ষেত্রে ফ্রি সফটওয়্যার ফাউন্ডেশনের প্রকাশিত গনু জেনারেল পাবলিক লাইসেন্সের ২য় অথবা সাম্প্রতিকতম কোনো সংস্করণ মেনে চলতে হবে। \n\nসকলের উপকারের লক্ষ্যে এটি বিতরণ করা হয়ে থাকে, কিন্তু এক্ষেত্রে কোনো ওয়ারেন্টি দেয়া হয় না, এমনকি বিশেষ কোনো কার্যক্ষেত্রে ব্যবহারের জন্যও তথাকথিত ওয়ারেন্টি দেয়া হয় না। বিস্তারিত জানতে দেখুন গনু জেনারেল পাবলিক লাইসেন্স। \n\nএই সফটওয়্যারের সাথে [{{SERVER}}{{SCRIPTPATH}}/COPYING গনু জেনারেল পাবলিক লাইসেন্সের একটি কপি] থাকার কথা; যদি আপনি না পেয়ে থাকেন তাহলে অনুগ্রহ করে ফ্রি সফটওয়্যার ফাউন্ডেশনকে জানান এই ঠিকানায়, 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-license-info": "মিডিয়াউইকি একটি ফ্রি সফটওয়্যার; আপনি এটি বিতরণ করতে পারবেন এবং/অথবা সম্পদানা করতে পারবেন, এক্ষেত্রে ফ্রি সফটওয়্যার ফাউন্ডেশনের প্রকাশিত গনু জেনারেল পাবলিক লাইসেন্সের ২য় অথবা সাম্প্রতিকতম কোনো সংস্করণ মেনে চলতে হবে। \n\nসকলের উপকারের লক্ষ্যে এটি বিতরণ করা হয়ে থাকে, কিন্তু এক্ষেত্রে কোনো ওয়ারেন্টি দেয়া হয় না, এমনকি বিশেষ কোনো কার্যক্ষেত্রে ব্যবহারের জন্যও তথাকথিত ওয়ারেন্টি দেয়া হয় না। বিস্তারিত জানতে দেখুন গনু জেনারেল পাবলিক লাইসেন্স। \n\nএই সফটওয়্যারের সাথে [{{SERVER}}{{SCRIPTPATH}}/COPYING গনু জেনারেল পাবলিক লাইসেন্সের একটি অনুলিপি] থাকার কথা; যদি আপনি না পেয়ে থাকেন তাহলে অনুগ্রহ করে ফ্রি সফটওয়্যার ফাউন্ডেশনকে জানান এই ঠিকানায়, 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": "সংস্করণ",
        "tags-create-reason": "কারণ:",
        "tags-create-submit": "তৈরি করুন",
        "tags-create-no-name": "আপনাকে একটি ট্যাগের নাম অবশ্যই উল্লেখ করতে হবে।",
+       "tags-create-already-exists": "\"$1\" ট্যাগ ইতিমধ্যেই বিদ্যমান।",
        "tags-delete-title": "ট্যাগ অপসারণ",
        "tags-delete-reason": "কারণ:",
        "tags-delete-submit": "অপরিবর্তনীয় এই ট্যাগ অপসারন করো",
+       "tags-delete-not-found": "\"$1\" ট্যাগ বিদ্যমান নয়।",
        "tags-activate-title": "সক্রিয় ট্যাগ",
        "tags-activate-reason": "কারণ:",
        "tags-activate-submit": "চালু",
        "tags-edit-revision-selected": "[[:$2]] পাতার {{PLURAL:$1|নির্বাচিত সংশোধন|নির্বাচিত সংশোধনসমূহ}}:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|নির্বাচিত লগ ইভেন্ট}}:",
        "tags-edit-existing-tags": "বিদ্যমান ট্যাগ:",
+       "tags-edit-existing-tags-none": "''কোনটি নয়''",
        "tags-edit-new-tags": "নতুন ট্যাগ:",
        "tags-edit-chosen-placeholder": "কিছু ট্যাগ নির্বাচন করুন",
        "tags-edit-chosen-no-results": "কোন ট্যাগ মিল পাওয়া যায়নি",
        "tags-edit-reason": "কারণ:",
+       "tags-edit-revision-submit": "Apply changes to {{PLURAL:$1|এই সংশোধনে|$1 সংশোধনসমূহে}} পরিবর্তন প্রয়োগ করুন",
        "tags-edit-success": "পরিবর্তন সফলভাবে প্রয়োগ করা হয়েছে।",
        "tags-edit-failure": "পরিবর্তন প্রয়োগ করা যায়নি: $1",
        "tags-edit-nooldid-title": "লক্ষ্য সংশোধন অবৈধ",
        "htmlform-cloner-required": "অন্তত একটি মূল্য আবশ্যক।",
        "htmlform-title-badnamespace": "[[:$1]] \"{{ns:$2}}\" নামস্থানে খুঁজে পাওয়া যায়নি।",
        "htmlform-title-not-creatable": "\"$1\" সৃষ্টিযোগ্য পাতার শিরোনাম নয়",
-       "htmlform-title-not-exists": "[[:$1]]-এর অস্তিত্ব নেই।",
+       "htmlform-title-not-exists": "$1-এর অস্তিত্ব নেই।",
        "htmlform-user-not-exists": "<strong>$1</strong>-এর অস্তিত্ব নেই।",
        "htmlform-user-not-valid": "<strong>$1</strong> একটি বৈধ ব্যবহারকারীর নাম নয়।",
        "sqlite-has-fts": "$1 সহ পূর্ণ টেক্সট সার্চ সমর্থন",
        "logentry-suppress-block": "$1 {{GENDER:$4|$3}} কে $5 মেয়াদের জন্য {{GENDER:$2|বাধাদান}} করেছেন $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$4|$3}}-এর জন্য বাধাদান সেটিং $5 সময়ের জন্য {{GENDER:$2|পরিবর্তন}} করেছেন $6",
        "logentry-import-upload": "$1 ফাইল আপলোড দ্বারা $3 {{GENDER:$2|আমদানি করেছেন}}",
+       "logentry-import-upload-details": "$1 ফাইল আপলোড দ্বারা $3 {{GENDER:$2|আমদানি করেছেন}} ($4টি {{PLURAL:$4|সংশোধন}})",
        "logentry-import-interwiki": "$1 অন্য একটি উইকিতে থেকে $3 {{GENDER:$2|আমদানি করেছে}}",
+       "logentry-import-interwiki-details": "$1 $5 থেকে $3 {{GENDER:$2|আমদানি করেছেন}} ($4টি {{PLURAL:$4|সংশোধন}})",
        "logentry-merge-merge": "$1 $4-এ $3 {{GENDER:$2|একত্রীকরণ করেছেন}} ($5 তারিখের সংশোধন পর্যন্ত)",
        "logentry-move-move": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে {{GENDER:$2|স্থানান্তর}} করেছেন",
        "logentry-move-move-noredirect": "$1 ব্যবহারকারী $3 পাতাটিকে $4 শিরোনামে কোনো পুনর্নির্দেশনা ছাড়াই {{GENDER:$2|স্থানান্তর}} করেছেন",
        "api-error-stashfailed": "অভ্যন্তরীণ ত্রুটি: সার্ভার অস্থায়ী ফাইলটি সংরক্ষণ করতে ব্যর্থ হয়েছে।",
        "api-error-publishfailed": "অভ্যন্তরীন ত্রুটি: সার্ভার অস্থায়ী ফাইলটি প্রকাশ করতে ব্যর্থ হয়েছে।",
        "api-error-stasherror": "স্ট্যাশে আপলোডের সময় চিত্র আপলোডের সময় একটি সমস্যা দেখা দিয়েছে।",
+       "api-error-stashfilestorage": "স্ট্যাশে ফাইল সংরক্ষণের সময় একটি ত্রুটি হয়েছে।",
        "api-error-timeout": "কাঙ্খিত সময়ের মধ্যে সার্ভারের কোন সাড়া পাওয়া যায়নি।",
        "api-error-unclassified": "একটি অজানা ত্রুটি দেখা দিয়েছে",
        "api-error-unknown-code": "অজানা ত্রুটি: \"$1\"",
index d2f3850..5dd4d39 100644 (file)
@@ -7,7 +7,8 @@
                        "Shirayuki",
                        "YeshiTuhden",
                        "아라",
-                       "Sawuche"
+                       "Sawuche",
+                       "ཁ་བཏགས་ནག་པོ"
                ]
        },
        "tog-underline": "འོག་ཐིག་ཅན་ལ་སྦྲེལ་མཐུད།",
@@ -74,7 +75,7 @@
        "february": "ཟླ་བ་གཉིས་པ།",
        "march": "ཟླ་བ་གསུམ་པ།",
        "april": "ཟླ་བ་བཞི་བ།",
-       "may_long": "à½\9fྮà¼\8bà½\96་ལྔ་བ།",
+       "may_long": "à½\9fླ་ལྔ་བ།",
        "june": "ཟླ་བ་དྲུག་པ།",
        "july": "ཟླ་བ་བདུན་པ།",
        "august": "ཟླ་བ་བརྒྱད་པ།",
        "wrongpasswordempty": "ལམ་ཡིག་སྟོང་པ་རེད། བསྐྱར་དུ་ཚོད་ལྟ་བྱོས།",
        "mailmypassword": "གསང་བའི་ཨང་གྲངས་བསྐྱར་བཟོ་གནང་རོགས།",
        "loginlanguagelabel": "སྐད་རིགས། $1",
+       "pt-login": "ནང་འཛུ།",
        "pt-login-button": "ནང་འཛུལ།",
        "changepassword": "ལམ་ཡིག་བརྗེ་བ།",
        "resetpass_announce": "ནང་འཛུལ་བྱེད་པར། ཁྱེད་ཀྱིས་གསང་བའི་ཨང་གསར་པ་ཞིག་འཇུག་རོགས།",
        "unwatch": "མི་བལྟ་བ།",
        "unwatchthispage": "བལྟ་བ་མཚམས་འཇོག",
        "wlshowlast": "འདས་བའི་དུས་ཚོད་ $1 ནང་ཚུན་  ཉིན་མ་ $2 ནང་ཚུན་  སྟོན།",
+       "watchlistall2": "ཚང་མ།",
        "watchlist-options": "ལྟ་ཐོའི་འདེམས་ཚན།",
        "watching": "ལྟ་ཐོར་འཇུག་བཞིན་པ་་་",
        "unwatching": "ལྟ་ཐོ་ལས་འདོར་བཞིན་པ་་་",
        "contribslink": "མཐུན་འགྱུར།",
        "blocklogpage": "རྩོམ་ཡིག་བཀག་འགོག",
        "block-log-flags-nocreate": "རྩིས་ཁྲ་གསར་བཟོ་འགོག་འདུག།",
-       "movearticle": "ཤོག་ངོས་སྤོར་བ།",
        "newtitle": "ཁ་བྱང་གསར་བ་ལ།",
        "move-watch": "དྲ་ངོས་འདི་ལ་མཉམ་འཇོག་པ།",
        "movepagebtn": "ཤོག་ངོས་སྤོ་བ།",
index b6209b1..f45e43c 100644 (file)
        "createaccountreason": "Abeg :",
        "createacct-reason": "Abeg",
        "createacct-reason-ph": "Perak emaoc'h o krouiñ ur gont all",
-       "createacct-captcha": "Kontroll surentez",
-       "createacct-imgcaptcha-ph": "Ebarzhit an destenn a welit a-us",
        "createacct-submit": "Krouiñ ho kont",
-       "createacct-another-submit": "Krouiñ ur gont all",
+       "createacct-another-submit": "Krouiñ ur gont",
        "createacct-benefit-heading": "{{SITENAME}} zo graet gant tud eveldoc'h.",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|kemm}}",
        "createacct-benefit-body2": "pajenn{{PLURAL:$1|}}",
        "sig_tip": "Ho sinadur gant an deiziad",
        "hr_tip": "Liamm a-led (arabat implijout re)",
        "summary": "Diverrañ :",
-       "subject": "Danvez/titl:",
+       "subject": "Danvez :",
        "minoredit": "Kemm dister",
        "watchthis": "Evezhiañ ar pennad-mañ",
        "savearticle": "Enrollañ ar bajenn",
        "upload-too-many-redirects": "Re a adkasoù zo en URL-mañ.",
        "upload-http-error": "Ur fazi HTTP zo bet : $1",
        "upload-copy-upload-invalid-domain": "N'haller ket seveniñ enporzhiadennoù a-bell adalek an domani-mañ.",
+       "upload-dialog-button-cancel": "Nullañ",
+       "upload-dialog-button-done": "Graet",
+       "upload-dialog-button-save": "Enrollañ",
+       "upload-dialog-button-upload": "Enporzhiañ",
+       "upload-form-label-select-file": "Diuzañ ur restr",
+       "upload-form-label-infoform-title": "Munudoù",
+       "upload-form-label-infoform-name": "Anv",
+       "upload-form-label-infoform-description": "Deskrivadur",
+       "upload-form-label-usage-title": "Implij",
+       "upload-form-label-usage-filename": "Anv ar restr",
+       "foreign-structured-upload-form-label-infoform-categories": "Rummadoù",
+       "foreign-structured-upload-form-label-infoform-date": "Deiziad",
        "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.",
        "wlheader-showupdated": "E '''tev''' emañ merket ar pajennoù bet kemmet abaoe ar wezh ziwezhañ hoc'h eus sellet outo",
        "wlnote": "Setu aze {{PLURAL:$1|ar c'hemm diwezhañ|ar '''$1''' kemm diwezhañ}} c'hoarvezet e-kerzh an {{PLURAL:$2|eurvezh|'''$2''' eurvezh}} diwezhañ, d'an $3 da $4.",
        "wlshowlast": "Diskouez an $1 eurvezh $2 devezh diwezhañ",
+       "watchlistall2": "pep tra",
+       "wlshowhidemine": "ma c'hemmoù",
        "watchlist-options": "Dibarzhioù ar roll evezhiañ",
        "watching": "Heuliet...",
        "unwatching": "Paouez da evezhiañ...",
        "rollback-success": "Disteuler kemmoù $1; distreiñ da stumm diwezhañ $2.",
        "sessionfailure-title": "Fazi dalc'h",
        "sessionfailure": "Evit doare ez eus ur gudenn gant ho talc'h;\nNullet eo bet an ober-mañ a-benn en em wareziñ diouzh an tagadennoù preizhañ.\nKlikit war \"kent\" hag adkargit ar bajenn oc'h deuet drezi; goude klaskit en-dro.",
+       "changecontentmodel-title-label": "Anv ar bajenn",
+       "changecontentmodel-reason-label": "Abeg :",
        "protectlogpage": "Log_gwareziñ",
        "protectlogtext": "Setu aze a-is roll ar c'hemmoù degaset ouzh live gwareziñ ar pajennoù.\nSellet ouzh ar [[Special:ProtectedPages|roll ar pajennoù gwarezet]] evit kaout roll ar pajennoù gwarezet bremañ.",
        "protectedarticle": "{{Gender:.|en|he}} deus gwarezet [[$1]]",
        "cant-move-to-user-page": "Noc'h ket aotreet da adenvel ur bajenn gant anv hini un implijer all (nemet un ispajenn e vefe).",
        "cant-move-category-page": "N'oc'h ket aotreet da zilec'hiañ pajennoù rummad.",
        "cant-move-to-category-page": "N'oc'h ket aotreet da zilec'hiañ ur bajenn d'ur bajenn rummad.",
-       "newtitle": "anv nevez",
+       "newtitle": "Titl nevez :",
        "move-watch": "Evezhiañ ar bajenn-mañ",
        "movepagebtn": "Adenvel ar pennad",
        "pagemovedsub": "Dilec'hiadenn kaset da benn vat",
        "version-entrypoints": "URLoù ar poent mont e-barzh",
        "version-entrypoints-header-entrypoint": "Poent mont e-barzh",
        "version-entrypoints-header-url": "URL",
+       "version-libraries-library": "Levraoueg",
+       "version-libraries-version": "Stumm",
+       "version-libraries-license": "Aotre-implijout",
+       "version-libraries-description": "Deskrivadur",
        "redirect-legend": "Adkas d'ur restr pe d'ur bajenn",
        "redirect-submit": "Mont",
        "redirect-lookup": "Klask :",
        "tags-tag": "Anv ar valizenn",
        "tags-display-header": "Neuz e rolloù ar c'hemmoù",
        "tags-description-header": "Deskrivadur klok ar valizenn",
+       "tags-source-header": "Mammenn",
        "tags-active-header": "Oberiant ?",
        "tags-hitcount-header": "Kemmoù balizennet",
        "tags-active-yes": "Ya",
        "tags-active-no": "Ket",
        "tags-edit": "aozañ",
+       "tags-activate": "gweredekaat",
+       "tags-deactivate": "diweredekaat",
        "tags-hitcount": "$1 {{PLURAL:$1|kemm|kemm}}",
+       "tags-create-reason": "Abeg :",
+       "tags-create-submit": "Krouiñ",
+       "tags-delete-reason": "Abeg :",
+       "tags-activate-reason": "Abeg :",
+       "tags-activate-submit": "Gweredekaat",
+       "tags-deactivate-reason": "Abeg :",
+       "tags-deactivate-submit": "Diweredekaat",
+       "tags-edit-existing-tags-none": "''Hini ebet''",
+       "tags-edit-reason": "Abeg :",
        "comparepages": "Keñveriañ pajennoù",
        "compare-page1": "Pajenn 1",
        "compare-page2": "Pajenn 2",
        "logentry-newusers-create2": "Gant $1 eo bet krouet ar gont implijer $3",
        "logentry-newusers-byemail": "Krouet eo bet ar gont implijer $3 gant $1 ha kaset eo bet ar ger-tremen dre bostel",
        "logentry-newusers-autocreate": "{{GENDER:$2|Krouet}} eo bet kont $1 ent emgefre",
+       "logentry-protect-protect": "$1 {{GENDER:$2|en|he}} deus gwarezet $3 $4",
        "logentry-rights-autopromote": "$1 zo bet {{GENDER:$2|anvet}} ent emgefre a $4 da $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|en deus|he deus}} ezporzhiet ur stumm nevez eus $3",
        "rightsnone": "(netra)",
        "revdelete-summary": "diverradenn eus ar c'hemmoù",
        "feedback-adding": "Oc'h ouzhpennañ ho soñj war ar bajenn...",
+       "feedback-back": "Distreiñ",
        "feedback-bugcheck": "Eus ar c'hentañ ! Gwiriit mat n'emañ ket e-touez an [$1 draen diskoachet c'hoazh].",
        "feedback-bugnew": "Gwiriet em eus. Kemenn un draen nevez",
        "feedback-bugornote": "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [$1 kemenn un draen].\nA-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-cancel": "Nullañ",
        "feedback-close": "Graet",
+       "feedback-error-title": "Fazi",
        "feedback-error1": "Fazi : disoc'h dianav a-berzh an API",
        "feedback-error2": "Fazi : N'eus ket bet gallet degemer ar c'hemmoù",
        "feedback-error3": "Fazi : respont ebet a-berzh an API",
        "feedback-subject": "Danvez :",
        "feedback-submit": "Kas",
        "feedback-thanks": "Ho trugarekaat ! Postet eo bet hoc'h evezhiadenn d'ar bajenn \"[$2 $1]\".",
+       "feedback-thanks-title": "Trugarez !",
        "searchsuggest-search": "Klask",
        "searchsuggest-containing": "ennañ...",
        "api-error-badaccess-groups": "N'oc'h ket aotreet da enporzhiañ restroù war ar wiki-mañ.",
index b9afc7c..fdeeb1f 100644 (file)
@@ -30,6 +30,7 @@
        "tog-hideminor": "Sakrij manje izmjene u spisku nedavnih izmjena",
        "tog-hidepatrolled": "Sakrij patrolirane izmjene u nedavnim promjenama",
        "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
+       "tog-hidecategorization": "Sakrij kategorizaciju stranica",
        "tog-extendwatchlist": "Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih",
        "tog-usenewrc": "Grupiraj izmjene po stranicama sa nedavnih izmjena i praćenih članaka",
        "tog-numberheadings": "Automatski numeriši podnaslove",
@@ -59,6 +60,7 @@
        "tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa spiska praćenih članaka",
        "tog-watchlisthideanons": "Sakrij izmjene anonimnih korisnika sa spiska praćenih članaka",
        "tog-watchlisthidepatrolled": "Sakrij patrolirane izmjene sa spiska praćenja",
+       "tog-watchlisthidecategorization": "Sakrij kategorizaciju stranica",
        "tog-ccmeonemails": "Pošalji mi kopije e-pošte koju pošaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
        "morenotlisted": "Ovaj spisak nije potpun.",
        "mypage": "Stranica",
        "mytalk": "Razgovor",
-       "anontalk": "Razgovor za ovu IP adresu",
+       "anontalk": "Razgovor",
        "navigation": "Navigacija",
        "and": "&#32;i",
        "qbfind": "Pronađite",
        "redirectedfrom": "(Preusmjereno sa $1)",
        "redirectpagesub": "Preusmjerenje",
        "redirectto": "Preusmjerenje na:",
-       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena $2, $1",
+       "lastmodifiedat": "Ova stranica je posljednji put izmijenjena u $2 na $1.",
        "viewcount": "Ovoj stranici je pristupljeno {{PLURAL:$1|$1 put|$1 puta}}.",
        "protectedpage": "Zaštićena stranica",
        "jumpto": "Idi na:",
        "versionrequiredtext": "Potrebna je verzija $1 MediaWikija da bi se koristila ova strana. Pogledaj [[Special:Version|verziju]].",
        "ok": "U redu",
        "retrievedfrom": "Preuzeto iz \"$1\"",
-       "youhavenewmessages": "Imate $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Imate}} $1 ($2).",
        "youhavenewmessagesfromusers": "Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika}} ($2).",
        "youhavenewmessagesmanyusers": "Imate $1 od mnogo korisnika ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|novu poruku|999=nove poruke}}",
        "viewsourceold": "pogledaj izvor",
        "editlink": "uredi",
        "viewsourcelink": "pogledaj izvor",
-       "editsectionhint": "Uredi sekciju: $1",
+       "editsectionhint": "Uredi odlomak \"$1\"",
        "toc": "Sadržaj",
        "showtoc": "prikaži",
        "hidetoc": "sakrij",
        "viewsource": "Prikaži izvor",
        "viewsource-title": "Prikaz izvora stranice $1",
        "actionthrottled": "Akcija je usporena",
-       "actionthrottledtext": "Kao anti-spam mjera, ograničene su vam izmjene u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte ponovo poslije nekoliko minuta.",
+       "actionthrottledtext": "U cilju borbe protiv zloupotrebe, ograničeno vam je da u kratkom vremenskom periodu previše puta vršite ovu radnju, a upravo ste prešli to ograničenje.\nPokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana da bi se spriječile izmjene.",
        "viewsourcetext": "Možete vidjeti i kopirati izvorni kôd ove stranice.",
-       "viewyourtext": "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
+       "viewyourtext": "Možete vidjeti i kopirati izvor '''vaših izmjena''' na ovoj stranici.",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom wikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.net/  translatewiki.net], projekat za lokalizaciju Mediawikija.",
        "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
        "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
        "userlogin-yourname": "Korisničko ime",
        "userlogin-yourname-ph": "Unesite Vaše korisničko ime",
        "createacct-another-username-ph": "Unesite korisničko ime",
-       "yourpassword": "Šifra:",
+       "yourpassword": "Lozinka:",
        "userlogin-yourpassword": "Lozinka",
        "userlogin-yourpassword-ph": "Unesite Vašu lozinku",
        "createacct-yourpassword-ph": "Unesite lozinku",
-       "yourpasswordagain": "Ponovo upišite šifru:",
+       "yourpasswordagain": "Ponovo upišite lozinku:",
        "createacct-yourpasswordagain": "Potvrdite lozinku",
        "createacct-yourpasswordagain-ph": "Unesite lozinku opet",
-       "remembermypassword": "Zapamti moju šifru na ovom pregledniku (najduže $1 {{PLURAL:$1|dan|dana}})",
+       "remembermypassword": "Zapamti moju lozinku na ovom pregledniku (najduže $1 {{PLURAL:$1|dan|dana}})",
        "userlogin-remembermypassword": "Ostavi me prijavljenog/-u",
        "userlogin-signwithsecure": "Koristite sigurnu konekciju",
        "yourdomainname": "Vaš domen:",
        "createacct-emailoptional": "Adresa e-pošte (opcionalno)",
        "createacct-email-ph": "Unesite Vašu adresu e-pоšte",
        "createacct-another-email-ph": "Unesite adresu e-pošte",
-       "createaccountmail": "Koristite privremenu, slučajno stvorenu šifru/lozinku i pošaljite na navedenu adrеsu e-pošte",
+       "createaccountmail": "Koristite privremenu, slučajno stvorenu lozinku i pošaljite na navedenu adrеsu e-pošte",
        "createacct-realname": "Pravo ime (opcionalno)",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan korisnički račun?",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Napravite svoj korisnički račun",
-       "createacct-another-submit": "Napravi još jedan korisnički račun",
-       "createacct-benefit-heading": "{{SITENAME}} je napravljena od strane ljudi kao što ste Vi.",
+       "createacct-another-submit": "Napravi korisnički račun",
+       "createacct-benefit-heading": "{{GRAMMAR:akuzativ|{{SITENAME}}}} stvaraju ljudi poput Vas.",
        "createacct-benefit-body1": "{{PLURAL:$1|izmjena|izmjene}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stranica|stranice|stranica}}",
        "createacct-benefit-body3": "nedavnih {{PLURAL:$1|doprinosa}}",
-       "badretype": "Šifre koje ste unijeli se ne poklapaju.",
+       "badretype": "Lozinke koje ste unijeli se ne poklapaju",
+       "usernameinprogress": "Račun za ovo korisničko ime već se pravi. Molimo sačekajte.",
        "userexists": "Korisničko ime je već u upotrebi.\nIzaberite drugo.",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Došlo je do greške pri otvaranju naloga",
        "createaccounterror": "Ne može se napraviti račun: $1",
-       "nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) da bi se korisnici prijavili.\nVi ste isključili kolačiće na Vašem računaru.\nMolimo Vas da ih uključite, a onda se prijavite sa svojim novim korisničkim imenom i šifrom.",
+       "nocookiesnew": "Korisnički nalog je napravljen, ali niste prijavljeni.\n{{SITENAME}} koristi kolačiće (cookies) da bi se korisnici prijavili.\nVi ste isključili kolačiće na Vašem računaru.\nMolimo Vas da ih uključite, a onda se prijavite sa svojim novim korisničkim imenom i lozinkom.",
        "nocookieslogin": "{{SITENAME}} koristi kolačiće (''cookies'') da bi se korisnici prijavili.  Vi ste onemogućili kolačiće na Vašem kompjuteru.  Molimo Vas da ih omogućite i da pokušate ponovo sa prijavom.",
        "nocookiesfornew": "Korisnički račun nije napravljen, jer nismo mogli da potvrdimo njegov izvor.\nProvjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.",
        "noname": "Niste izabrali ispravno korisničko ime.",
        "nosuchusershort": "Ne postoji korisnik s imenom \"$1\".\nProvjerite jeste li dobro ukucali.",
        "nouserspecified": "Morate izabrati korisničko ime.",
        "login-userblocked": "Ovaj korisnik je blokiran. Prijava nije dopuštena.",
-       "wrongpassword": "Šifra koju ste unijeli je netačna.\nPokušate ponovno.",
-       "wrongpasswordempty": "Šifra koju ste unijeli je bila prazna.\nMolimo Vas da pokušate ponovno.",
-       "passwordtooshort": "Šifra mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
-       "passwordtoolong": "Šifre ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
+       "wrongpassword": "Lozinka koju ste unijeli je netačna.\nPokušate ponovno.",
+       "wrongpasswordempty": "Lozinka koju ste unijeli je bila prazna.\nMolimo Vas da pokušate ponovno.",
+       "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znaka|$1 znakova}}.",
+       "passwordtoolong": "Lozinke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša šifra mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovih korisničkih imena i šifara je zabranjeo.",
        "mailmypassword": "Poništi lozinku",
        "passwordreset-emailtext-ip": "Neko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik Vaših detalja računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše početne šifre, a ne želite je promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio podsjetnik o detaljima Vašeg računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše originalne šifre, a ne želite je više promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
-       "passwordreset-emailsent": "Podsjetnik na lozinku poslan je na Vašu e-mail adresu.",
+       "passwordreset-emailsentemail": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre će vam biti poslan na vašu adresu e-pošte.",
        "passwordreset-emailsent-capture": "Poslan je podsjetnik preko e-pošte (prikazano ispod).",
        "passwordreset-emailerror-capture": "E-poruka za resetiranje lozinke, prikazano ispod, poslana je, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspjelo: $1",
-       "changeemail": "Promjena e-adrese",
-       "changeemail-header": "Promijeni e-mail adresu korisničkog računa",
+       "changeemail": "Promjena ili uklanjanje e-adrese",
+       "changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
+       "changeemail-passwordrequired": "Morat ćete unijeti šifru da biste potvrdili ovu izmjenu.",
        "changeemail-no-info": "Morate biti prijavljeni za direktan pristup ovoj stranici.",
        "changeemail-oldemail": "Trenutna adresa e-pošte:",
        "changeemail-newemail": "Nova adresa e-pošte:",
+       "changeemail-newemail-help": "Ovo polje možete ostaviti prazno ako želite ukloniti svoju adresu e-pošte. Ako je uklonite, nećete moći resetirati zaboravljenu šifru niti primati e-poruke sa ove wiki.",
        "changeemail-none": "(ništa)",
-       "changeemail-password": "Vaša šifra za {{SITENAME}}:",
+       "changeemail-password": "Vaša šifra za {{GRAMMAR:akuzativ|{{SITENAME}}}}:",
        "changeemail-submit": "Promijeni adresu e-pošte",
        "changeemail-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "changeemail-nochange": "Molimo unesite drugu adresu e-pošte.",
        "resettokens": "Resetovanje žetona",
        "resettokens-text": "Možete ponovno postaviti tokene koji će vam omogućiti pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTrebali bi to učiniti ako ih mimo volje podijelite s nekim ili ako je vaš račun ugrožen.",
        "resettokens-no-tokens": "Nema žetona za resetovanje.",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite oskudno)",
        "summary": "Sažetak:",
-       "subject": "Tema/naslov:",
+       "subject": "Tema:",
        "minoredit": "Ovo je manja izmjena",
        "watchthis": "Prati ovu stranicu",
        "savearticle": "Sačuvaj stranicu",
        "missingsummary": "'''Napomena:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj, Vaša izmjena će biti sačuvana bez sažetka.",
        "selfredirect": "<strong>Upozorenje:</strong> Preusmjerili ste stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
        "missingcommenttext": "Molimo unesite komentar ispod.",
-       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu/naslov za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
        "summary-preview": "Pregled sažetka:",
-       "subject-preview": "Pregled tema/naslova:",
+       "subject-preview": "Pregled teme:",
        "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "'''Vaše korisničko ime ili IP-adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je sljedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati sa $1 ili nekim drugim [[{{MediaWiki:Grouppage-sysop}}|administratorom]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP-adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke pri zahtjevu za deblokadu.",
        "newarticle": "(Novi)",
        "newarticletext": "Došli ste na stranicu koja još nema sadržaja.\n*Ako želite unijeti sadržaj, počnite tipkati u prozor ispod ovog teksta.\n*Ako Vam treba pomoć, idite na [$1 stranicu za pomoć].\n*Ako ste ovamo dospjeli slučajno, kliknite na dugme \"Nazad\" (''Back'') u Vašem internetskom pregledniku.",
        "anontalkpagetext": "----''Ovo je stranica za razgovor za anonimnog korisnika koji još nije napravio nalog ili ga ne koristi.\nZbog toga moramo da koristimo brojčanu IP adresu kako bismo identifikovali njega ili nju.\nTakvu adresu može dijeliti više korisnika.\nAko ste anonimni korisnik i mislite da su vam upućene nebitne primjedbe, molimo Vas da [[Special:UserLogin/signup|napravite nalog]] ili se [[Special:UserLogin|prijavite]] da biste izbjegli buduću zabunu sa ostalim anonimnim korisnicima.''",
-       "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama.\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.",
+       "noarticletext": "Na ovoj stranici trenutno nema teksta.\nMožete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama.\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisnicima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.",
        "noarticletext-nopermission": "Trenutno nema teksta na ovoj stranici.\nMožete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>, ali nemate dozvolu da napravite ovu stranicu.",
        "missing-revision": "Uređivanje broj $1 na stranici \"{{FULLPAGENAME}}\" ne postoji.\n\nOvo se obično dešava kad pratite zastarjelu vezu na stranicu koja je obrisana.\nViše informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protokolu brisanja].",
        "userpage-userdoesnotexist": "Korisnički račun \"<nowiki>$1</nowiki>\" nije registrovan.\nMolimo provjerite da li želite napraviti/izmijeniti ovu stranicu.",
        "nocreate-loggedin": "Nemate dopuštenje da kreirate nove stranice.",
        "sectioneditnotsupported-title": "Uređivanje sekcije nije podržano",
        "sectioneditnotsupported-text": "Uređivanje sekcije nije podržano na ovoj stranici.",
-       "permissionserrors": "Greške pri odobrenju",
-       "permissionserrorstext": "Nemate dopuštenje da to uradite, iz {{PLURAL:$1|slijedećeg razloga|slijedećih razloga}}:",
+       "permissionserrors": "Greška pri odobrenju",
+       "permissionserrorstext": "Nemate dopuštenje za ovu radnju iz {{PLURAL:$1|sljedećeg razloga|sljedećih razloga}}:",
        "permissionserrorstext-withaction": "Nemate dopuštenje da $2, iz {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
+       "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je njen model sadržaja <code>$1</code>, a trenutni model sadržaja stranice je <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Upozorenje: Postavljate stranicu koja je prethodno brisana.'''\n\nRazmotrite da li je nastavljanje uređivanja ove stranice u skladu s pravilima.\nOvdje je naveden zapisnik brisanja i premještanja s obrazloženjem:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nZapisnik brisanja i premještanja stranice je prikazan ispod kao referenca.",
-       "log-fulllog": "Vidi potpuni zapisnik",
+       "moveddeleted-notice-recent": "Žao nam je, ova stranica je nedavno obrisana (u prethodna 24 sata).\nNiže su navedeni zapisnici brisanja i premještanja.",
+       "log-fulllog": "Prikaži cijeli zapisnik",
        "edit-hook-aborted": "Izmjena je poništena putem interfejsa.\nNije ponuđeno nikakvo objašnjenje.",
        "edit-gone-missing": "Stranica se nije mogla osvježiti.\nIzgleda da je obrisana.",
        "edit-conflict": "Sukob izmjena.",
        "cantcreateaccount-range-text": "Pravljenje računa sa IP adresa u rasponu '''$1''', koji uključuje i vašu IP adresu ('''$4'''), je blokirao korisnik [[User:$3|$3]].\n\nNavedeni razlog korisnika $3 je ''$2''",
        "viewpagelogs": "Pogledaj zapisnike ove stranice",
        "nohistory": "Ne postoji historija izmjena za ovu stranicu.",
-       "currentrev": "Trenutna revizija",
-       "currentrev-asof": "Trenutna revizija na dan $1",
+       "currentrev": "Trenutna verzija",
+       "currentrev-asof": "Trenutna verzija na dan $1",
        "revisionasof": "Verzija od $1",
        "revision-info": "Izmjena od $1 od {{GENDER:$6|$2}}$7",
        "previousrevision": "← Starija izmjena",
        "history-feed-item-nocomment": "$1 u $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je izbrisana sa wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
        "history-edit-tags": "Uredi oznake izabranih verzija",
-       "rev-deleted-comment": "(sažetak izmjene uklonjen)",
+       "rev-deleted-comment": "(uklonjen sažetak izmjene)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
        "rev-deleted-event": "(stavka zapisa obrisana)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa uklonjeni - izmjena sakrivena u spisku doprinosa]",
        "revdel-restore": "Promijeni dostupnost",
        "pagehist": "Historija stranice",
        "deletedhist": "Izbrisana historija",
-       "revdelete-hide-current": "Greška pri sakrivanju stavke od $2, $1: ovo je trenutna revizija.\nNe može biti sakrivena.",
+       "revdelete-hide-current": "Greška pri sakrivanju stavke od $2, $1: ovo je trenutna verzija.\nNe može biti sakrivena.",
        "revdelete-show-no-access": "Greška pri prikazivanju stavke od $2, $1: ova stavka je označena kao \"zaštićena\".\nNemate pristup do ove stavke.",
        "revdelete-modify-no-access": "Greška pri izmjeni stavke od $2, $1: ova stavka je označena kao \"zaštićena\".\nNemate pristup ovoj stavci.",
        "revdelete-modify-missing": "Greška pri mijenjanju stavke ID $1: nedostaje u bazi podataka!",
        "mergehistory-go": "Prikaži izmjene koje se mogu spojiti",
        "mergehistory-submit": "Spoji revizije",
        "mergehistory-empty": "Nema revizija za spajanje.",
-       "mergehistory-done": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice $1 uspješno spojeno u [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|izmjena|izmjene|izmjena}} stranice $1 uspješno je spojeno u [[:$2]].",
        "mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
        "mergehistory-fail-toobig": "Ne može se izvršiti spajanje historije jer će se više premjestiti više od ograničenja od $1 {{PLURAL:$1|revizije|revizija}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "shown-title": "Pokaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
        "viewprevnext": "Pogledaj ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Postoji stranica pod nazivom \"[[:$1]]\" na ovoj wiki'''",
-       "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također straniu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
+       "searchmenu-new": "<strong>Napravi stranicu \"[[:$1]]\" na ovoj wiki!</strong> {{PLURAL:$2|0=|Pogledajte također stranicu pronađenu vašom pretragom.|Pogledajte također i vaše rezultate pretrage.}}",
        "searchprofile-articles": "Stranice sadržaja",
        "searchprofile-images": "Multimedija",
        "searchprofile-everything": "Sve",
        "search-section": "(sekcija $1)",
        "search-category": "(kategorija $1)",
        "search-file-match": "(podudara se sadržaj datoteke)",
-       "search-suggest": "Da li ste mislili: $1",
+       "search-suggest": "Jeste li mislili: $1",
+       "search-rewritten": "Prikazujem rezultate za $1. Umjesto toga potraži $2.",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "$1 rezultati:",
        "search-interwiki-more": "(više)",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
+       "search-nonefound-thiswiki": "Nisu pronađeni rezultati koji odgovaraju upitu na ovom sajtu.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga u imenskim prostorima:",
        "powersearch-togglelabel": "Označi:",
        "prefs-edits": "Broj izmjena:",
        "prefsnologintext2": "Prijavite se da biste sačuvali postavke.",
        "prefs-skin": "Tema",
-       "skin-preview": "Pregled",
+       "skin-preview": "Pregledaj",
        "datedefault": "Nije bitno",
        "prefs-labs": "Eksperimentalne mogućnosti",
        "prefs-user-pages": "Korisničke stranice",
        "prefs-watchlist-edits-max": "Najveći broj: 1000",
        "prefs-watchlist-token": "Žeton praćenih članaka:",
        "prefs-misc": "Ostala podešavanja",
-       "prefs-resetpass": "Promijeni šifru",
-       "prefs-changeemail": "Promijeni adresu e-pošte",
+       "prefs-resetpass": "Promijeni lozinku",
+       "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite e-mail adresu",
        "prefs-email": "Opcije e-pošte",
        "prefs-rendering": "Izgled",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i zapisnike.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ sažetka vašeg spiska izmjena. Ko god da ga zna, moći će ga čitati. Ne dijelite ga ni s kim. Ako je potrebno, [[Special:ResetTokens|možete ga ponovo postaviti]].",
        "savedprefs": "Vaše postavke su sačuvane.",
+       "savedrights": "Korisnička prava {{GENDER:$1|korisnika|korisnice}} $1 su sačuvana.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vrijeme:",
        "timezoneuseserverdefault": "Koristi postavke wikija ($1)",
        "allowemail": "Dozvoli e-poštu od ostalih korisnika",
        "prefs-searchoptions": "Traži",
        "prefs-namespaces": "Imenski prostori",
-       "default": "standardno",
+       "default": "predodređeno",
        "prefs-files": "Datoteke",
        "prefs-custom-css": "Prilagođeni CSS",
        "prefs-custom-js": "Prilagođeni JavaScript",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sljedećoj prijavi.",
        "prefswarning-warning": "Napravili ste promjene u vašim postavkama koje još uvijek nisu sačuvane. Ako napustite ovu stranicu bez da pritisnete na \"$1\", postavke neće biti ažurirane.",
        "prefs-tabs-navigation-hint": "Savjet: Možete koristiti tipke sa lijevom i desnom strelicom za kretanje kroz kartice.",
-       "email-address-validity-valid": "Izgleda valjano",
-       "email-address-validity-invalid": "Neophodna valjana adresa!",
        "userrights": "Postavke korisničkih prava",
        "userrights-lookup-user": "Menadžment korisničkih grupa",
        "userrights-user-editname": "Upišite korisničko ime:",
        "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š račun nema privilegije da dodaje ili oduzima prava korisnika.",
+       "userrights-notallowed": "Nemate dopuštenje za dodavanje ili uklanjanje korisničkih prava.",
        "userrights-changeable-col": "Grupe koje možete mijenjati",
        "userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
        "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzornici",
+       "group-suppress": "Skrivači",
        "group-all": "(sve)",
        "group-user-member": "{{GENDER:$1|korisnik|korisnica}}",
        "group-autoconfirmed-member": "Potvrđeni korisnik",
        "group-bot-member": "bot",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorica}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica}}",
-       "group-suppress-member": "Nadzornik",
+       "group-suppress-member": "{{GENDER:$1|skrivač|skrivačica}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "grouppage-autoconfirmed": "{{ns:project}}:Potvrđeni korisnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzornici",
+       "grouppage-suppress": "{{ns:project}}:Skrivač",
        "right-read": "Čitanje stranica",
        "right-edit": "Uređivanje stranica",
        "right-createpage": "Pravljenje stranica (neuključujući stranice za razgovor)",
        "rcshowhidemine": "$1 moje izmjene",
        "rcshowhidemine-show": "Prikaži",
        "rcshowhidemine-hide": "Sakrij",
+       "rcshowhidecategorization": "$1 kategorizaciju stranice",
+       "rcshowhidecategorization-show": "Prikaži",
+       "rcshowhidecategorization-hide": "Sakrij",
        "rclinks": "Prikaži posljednjih $1 izmjena u posljednjih $2 dana<br />$3",
        "diff": "razl",
        "hist": "hist",
        "newpageletter": "N",
        "boteditletter": "b",
        "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_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
+       "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} poslije izmjene",
-       "newsectionsummary": "/* $1 */ novi odjeljak",
+       "newsectionsummary": "/* $1 */ novi odlomak",
        "rc-enhanced-expand": "Pokaži detalje",
        "rc-enhanced-hide": "Sakrij detalje",
        "rc-old-title": "prvobitno kreirano kao \"$1\"",
        "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
        "recentchangeslinked-page": "Naslov stranice:",
        "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom",
+       "recentchanges-page-added-to-category": "[[:$1]] dodana je u kategoriju",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] i još {{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}} su dodane u kategoriju",
+       "recentchanges-page-removed-from-category": "[[:$1]] je uklonjena iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i još {{PLURAL:$2|jedna stranica|$2 stranice|$2 stranica}} su uklonjene iz kategorije",
+       "autochange-username": "Automatska promjena MediaWikija",
        "upload": "Postavi datoteku",
        "uploadbtn": "Postavi datoteku",
        "reuploaddesc": "Vrati me na formular za postavljanje datoteka.",
        "upload-options": "Opcije postavljanja",
        "watchthisupload": "Prati ovu datoteku",
        "filewasdeleted": "Datoteka s ovim nazivom je ranije postavljana i nakon toga obrisana.\nPrije no što nastavite da je ponovo postavite trebate provjeriti $1.",
+       "filename-thumb-name": "Izgleda da je naslov u obliku sličice. Nemojte postavljati sličice nazad na istu wiki. Ako je riječ o nečemu drugom, popravite naziv datoteke tako da ima više značenja i da nema prefiks sličice.",
        "filename-bad-prefix": "Naziv datoteke koju postavljate počinje sa '''\"$1\"''', što je naziv koji obično automatski dodjeljuju digitalni fotoaparati i kamere.\nMolimo Vas da odaberete naziv datoteke koji opisuje njen sadržaj.",
        "filename-prefix-blacklist": " #<!-- ostavite ovu liniju onakvom kakva jeste --> <pre>\n# Sintaksa je slijedeća:\n#   * Sve od karaktera \"#\" pa do kraja je komentar\n#   * Svaka neprazna linija je prefiks za tipična imena datoteka koja automatski dodjeljuje digitalna kamera\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # neki mobilni telefoni\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # razni\n #</pre> <!-- ostavite ovu liniju onakvom kakva jeste -->",
        "upload-success-subj": "Uspješno slanje",
        "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
        "upload-http-error": "Desila se HTTP greška: $1",
        "upload-copy-upload-invalid-domain": "Kopije postavljenih datoteka nisu dostupne sa ove domene.",
+       "upload-dialog-title": "Postavi datoteku",
+       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-done": "Gotovo",
+       "upload-dialog-button-save": "Sačuvaj",
+       "upload-dialog-button-upload": "Postavi",
+       "upload-form-label-select-file": "Izaberi datoteku",
+       "upload-form-label-infoform-title": "Detalji",
+       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Korištenje",
+       "upload-form-label-usage-filename": "Ime datoteke",
+       "foreign-structured-upload-form-label-own-work": "Ovo je moje djelo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potvrđujem da postavljam ovu datoteku u skladu s uvjetima korištenja i pravilima o licenciranju na {{GRAMMAR:dativ|{{SITENAME}}}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Ako niste u stanju postaviti ovu datoteku pod pravilima {{GRAMMAR:genitiv|{{SITENAME}}}}, molimo zatvorite ovaj prozor i pokušajte drugom metodom.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Također možete pokušati [[Special:Upload|na standardnoj stranici za postavljanje]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Shvatam da postavljam ovu datoteku na zajedničko spremište. Potvrđujem da to činim u skladu s uvjetima korištenja i ovdašnjim pravilima licenciranja.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Ako niste u stanju postaviti ovu datoteku pod pravilima zajedničkog skladišta, molimo zatvorite ovaj prozor i pokušajte drugom metodom.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Možete također pokušati koristeći  [[Special:Upload|stranicu za postavljanje na  {{GRAMMAR:dativ|{{SITENAME}}}}]], ako se ova datoteka može postaviti pod tamošnjim pravilima.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrđujem da posjedujem autorska prava za ovu datoteku i slažem se da ću je neopozivo postaviti na Wikimedia Commons pod licencom [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], te se slažem s [https://wikimediafoundation.org/wiki/Terms_of_Use Uvjetima korištenja].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ako ne posjedujete autorska prava za ovu datoteku ili je želite postaviti pod drugom licencom, imajte na umu da možete koristiti [https://commons.wikimedia.org/wiki/Special:UploadWizard čarobnjak za postavljanje datoteka na Commonsu].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Također možete koristiti [[Special:Upload|stranicu za postavljanje datoteka na projektu {{SITENAME}}]] ako politika stranice dozvoljava postavljanje ove datoteke.",
        "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.",
        "filehist-deleteone": "obriši",
        "filehist-revert": "vrati",
        "filehist-current": "trenutno",
-       "filehist-datetime": "Datum/Vrijeme",
+       "filehist-datetime": "Datum/vrijeme",
        "filehist-thumb": "Smanjeni pregled",
        "filehist-thumbtext": "Smanjeni pregled verzije na dan $1",
        "filehist-nothumb": "Bez smanjenog pregleda",
        "nopagetitle": "Ne postoji takva stranica",
        "nopagetext": "Ciljna stranica koju ste naveli ne postoji.",
        "pager-newer-n": "{{PLURAL:$1|novija 1|novije $1}}",
-       "pager-older-n": "{{PLURAL:$1|starija 1|starije $1}}",
-       "suppress": "Nazdor",
+       "pager-older-n": "{{PLURAL:$1|starija $1|starijih $1}}",
+       "suppress": "Sakrij",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
        "apihelp": "API pomoć",
        "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "log": "Zapisnici",
        "all-logs-page": "Svi javni zapisnici",
        "alllogstext": "Zajednički prikaz svih dostupnih zapisnika sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
-       "logempty": "Nema zatraženih članaka u zapisniku.",
+       "logempty": "Nema zatraženih stavki u zapisniku.",
        "log-title-wildcard": "Traži naslove koji počinju ovim tekstom",
        "showhideselectedlogentries": "Pokaži/sakrij izabrane zapise u evidenciji",
        "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "activeusers-hidesysops": "Sakrij administratore",
        "activeusers-noresult": "Nije pronađen korisnik.",
        "listgrouprights": "Prava korisničkih grupa",
-       "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pravima pristupa.\nO svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
+       "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pripadajućim pravima pristupa.\nMoguće je da o svakoj grupi postoje [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
        "listgrouprights-group": "Grupa",
        "listgrouprights-rights": "Prava",
-       "listgrouprights-helppage": "Help:Grupna prava",
+       "listgrouprights-helppage": "Help:Prava grupe",
        "listgrouprights-members": "(spisak članova)",
        "listgrouprights-addgroup": "Mogu dodati {{PLURAL:$2|grupu|grupe}}: $1",
        "listgrouprights-removegroup": "Mogu ukloniti {{PLURAL:$2|grupu|grupe}}: $1",
        "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]]\ni imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]\nda biste slali e-poštu drugim korisnicima.",
-       "emailuser": "Pošalji e-poštu",
+       "emailuser": "Pošalji e-poruku",
        "emailuser-title-target": "Pošalji e-poruku {{GENDER:$1|korisniku|korisnici|korisniku}}",
        "emailuser-title-notarget": "Pošalji e-mail korisniku",
        "emailpagetext": "Možete korisiti obrazac ispod za slanje poruke e-poštom {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku}}.\nAdresa e-pošte koju ste unijeli u [[Special:Preferences|svojim korisničkim postavkama]] će biti prikazana kao adresa pošiljaoca, tako da će primaoc poruke moći da Vam odgovori.",
        "emailccsubject": "Kopiraj Vašu poruku za $1: $2",
        "emailsent": "Poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovaj e-mail je poslao $1 korisniku $2 putem funkcije \"{{int:emailuser}}\" sa {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Spisak praćenja",
        "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste prijavljeni",
        "addwatch": "Dodaj na spisak praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovdje.",
+       "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na vaš [[Special:Watchlist|spisak praćenja]].",
        "addedwatchtext-short": "Stranica \"$1\" je dodana na vaš spisak praćenja.",
        "removewatch": "Ukloni sa spiska praćenja",
-       "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena iz [[Special:Watchlist|vašeg spiska praćenih članaka]].",
+       "removedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor uklonjeni su s [[Special:Watchlist|Vašeg spiska praćenja]].",
        "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
        "watch": "Prati članak",
        "watchthispage": "Prati ovu stranicu",
        "unwatch": "Prestani pratiti",
-       "unwatchthispage": "Ukinite praćenje",
+       "unwatchthispage": "Prestani pratiti",
        "notanarticle": "Nije članak",
        "notvisiblerev": "Revizija je obrisana",
-       "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
+       "watchlist-details": "Imate {{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica}} na Vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "Uključeno je obavještenje e-poštom.",
-       "wlheader-showupdated": "Stranice koje su izmijenjene otkad ste ih posljednji put posjetili su prikazane <strong>podebljanim slovima</strong>.",
+       "wlheader-showupdated": "Stranice koje su izmijenjene otkad ste ih posljednji put posjetili prikazane su <strong>podebljanim slovima</strong>.",
        "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su <strong>$1</strong> najskorije izmjene|<strong>$1</strong> najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
+       "watchlistall2": "sve",
+       "watchlist-hide": "Sakrij",
+       "wlshowtime": "Prikaži posljednjih:",
+       "wlshowhideminor": "manje izmjene",
+       "wlshowhidebots": "botove",
+       "wlshowhideliu": "registrovane korisnike",
+       "wlshowhideanons": "anonimne korisnike",
+       "wlshowhidepatr": "patrolirane izmjene",
+       "wlshowhidemine": "moje izmjene",
        "watchlist-options": "Opcije spiska praćenja",
        "watching": "Pratim...",
        "unwatching": "Ne pratim...",
        "deletepage": "Obrišite stranicu",
        "confirm": "Potvrdite",
        "excontent": "sadržaj je bio: \"$1\"",
-       "excontentauthor": "sadržaj je bio: \"$1\" (a jedini urednik \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "sadržaj je bio: \"$1\", a jedini urednik \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: \"$1\"",
        "delete-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
        "undeletepagetext": "{{PLURAL:$1|Slijedeća $1 stranica je obrisana|Slijedeće $1 stranice su obrisane|Slijedećih $1 je obrisano}} ali su još uvijek u arhivi i mogu biti vraćene.\nArhiva moše biti periodično čišćena.",
        "undelete-fieldset-title": "Vraćanje revizija",
        "undeleteextrahelp": "Da biste vratili cijelu historiju stranice, ostavite sve kućice neoznačene i kliknite na <strong><em>{{int:undeletebtn}}</em></strong>.\nDa biste vratili određene stranice, izaberite verzije koje želite vratiti i kliknite na <strong><em>{{int:undeletebtn}}</em></strong>.",
-       "undeleterevisions": "{{PLURAL:$1|$1 revizija arhivirana|$1 revizije arhivirane|$1 revizija arhivirano}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|izmjena je obrisana|izmjena je obrisano}}",
        "undeletehistory": "Ako vratite stranicu, sve će verzije biti vraćene u njenu historiju.\nAko je u međuvremenu napravljena nova verzija s istim nazivom, vraćene verzije će se pojaviti njenoj ranijoj historiji.",
        "undeleterevdel": "Vraćanje obrisanog se neće izvršiti ako bi rezultiralo da zaglavlje stranice ili revizija datoteke bude djelimično obrisano.\nU takvim slučajevima, morate ukloniti označene ili otkriti sakrivene najskorije obrisane revizije.",
        "undeletehistorynoadmin": "Ova stranica je obrisana.\nRazlog za brisanje se nalazi ispod, zajedno s detaljima o korisniku koji je mijenjao stranicu prije brisanja.\nTekst obrisanih verzija dostupan je samo administratorima.",
        "undelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "undelete-show-file-submit": "Da",
        "namespace": "Imenski prostor:",
-       "invert": "Sve osim odabranog",
+       "invert": "Obrni izbor",
        "tooltip-invert": "Označite ovu kutiju za sakrivanje promjena na stranicama u odabranom imenskom prostoru (i povezanim imenskim prostorima ako je označeno)",
        "tooltip-whatlinkshere-invert": "Označite ovu kutiju za sakrivanje linkova sa stranica u izabranom imenskom prostoru.",
        "namespace_association": "Povezan imenski prostor",
        "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "contributions-title": "Doprinosi korisnika $1",
        "mycontris": "Doprinosi",
+       "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
        "sp-contributions-logs": "zapisnici",
        "sp-contributions-talk": "razgovor",
        "sp-contributions-userrights": "postavke korisničkih prava",
-       "sp-contributions-blocked-notice": "Ovaj korisnik je trenutno blokiran. Posljednje stavke zapisnika blokiranja možete pogledati ispod:",
+       "sp-contributions-blocked-notice": "{{GENDER:$1|Ovaj korisnik|Ova korisnica}} je trenutno {{GENDER:$1|blokiran|blokirana}}.\nPosljednju stavku zapisnika blokiranja možete pogledati ispod:",
        "sp-contributions-blocked-notice-anon": "Ova IP adresa je trenutno blokirana.\nPosljednje stavke zapisnika blokiranja možete pogledati ispod:",
        "sp-contributions-search": "Pretraži doprinose",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
-       "sp-contributions-toponly": "Prikaži samo izmjene koje su posljednje revizije",
+       "sp-contributions-toponly": "Prikaži samo najnovije izmjene",
        "sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Šta vodi ovamo",
        "move-page-legend": "Premjesti stranicu",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom postat će stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmijeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti premješten ako već postoji članak pod imenom na koje ga namjeravate preusmjeriti osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice.\nMolimo da dobro razmislite prije no što premjestite stranicu.",
        "movepagetext-noredirectfixer": "Koristeći donji obrazac, preimenovat ćete stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv postat će preusmjerenje na novi naziv.\nMolimo da provjerite postoje li [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti jesu li linkovi ispravni i vode li tamo kamo bi trebali voditi.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znači da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili, ali ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da premještanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo da budete sigurni da ste shvatili posljedice prije no što nastavite.",
-       "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, automatski će biti premještena istovremeno '''osim ako:'''\n*premještate stranicu preko imenskih prostora\n*neprazna stranica za razgovor već postoji pod novim imenom\n*odčekirate donju kutiju.\n\nU tim slučajevima morat ćete ručno premjestiti ili prekopirati stranicu ako to želite.",
+       "movepagetalktext": "Ako označite ovu kutijicu, odgovarajuća stranica za razgovor, ako postoji, automatski će biti premještena na novi naziv, osim ako već postoji sadržaj na odredišnoj stranici za razgovor.\n\nU tom slučaju, morat ćete ručno premjestiti ili prekopirati stranicu ako to želite.",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
        "movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
        "movenologintext": "Morate biti registrovani korisnik i [[Special:UserLogin|prijavljeni]] da biste premjestili stranicu.",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
        "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
        "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
-       "newtitle": "Novi naslov",
+       "newtitle": "Novi naslov:",
        "move-watch": "Prati ovu stranicu",
        "movepagebtn": "Premjesti stranicu",
        "pagemovedsub": "Premještanje uspjelo",
        "movenosubpage": "Ova stranica nema podstranica.",
        "movereason": "Razlog:",
        "revertmove": "vrati",
-       "delete_and_move": "Obriši i premjesti",
        "delete_and_move_text": "==Potebno brisanje==\nOdredišna stranica \"[[:$1]]\" već postoji.\nDa 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 iz \"[[$1]]\"",
        "tooltip-pt-logout": "Odjava sa projekta {{SITENAME}}",
        "tooltip-pt-createaccount": "Ohrabrujemo vas da otvorite nalog i prijavite se, međutim to nije obavezno",
        "tooltip-ca-talk": "Razgovor o sadržaju",
-       "tooltip-ca-edit": "Možete uređivati ovaj članak. Molimo Vas, koristite dugme \"Prikaži izgled\" prije spašavanja izmjena.",
+       "tooltip-ca-edit": "Uredi ovu stranicu",
        "tooltip-ca-addsection": "Započnite novu sekciju.",
        "tooltip-ca-viewsource": "Ovaj članak je zaključan. Možete ga samo vidjeti ili kopirati kod.",
        "tooltip-ca-history": "Prethodne verzije ove stranice.",
        "anonymous": "{{PLURAL:$1|Anonimni korisnik|$1 anonimna korisnika|$1 anonimnih korisnika}} projekta {{SITENAME}}",
        "siteuser": "{{SITENAME}} korisnik $1",
        "anonuser": "{{SITENAME}} anonimni korisnik $1",
-       "lastmodifiedatby": "Ovu stranicu posljednji je put promijenio $3 u $2, $1",
+       "lastmodifiedatby": "Ovu stranicu posljednji je put {{GENDER:$4|izmijenio|izmijenila}} $3 dana $1 u $2.",
        "othercontribs": "Bazirano na radu od strane korisnika $1.",
        "others": "ostali",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|korisnik|korisnika}} $1",
        "duplicate-displaytitle": "<strong>Upozorenje:</strong> Prikazivani naslov \"$2\" poništava prethodni naslov \"$1\".",
        "invalid-indicator-name": "<strong>Greška:</strong> <code>Imena</code> pokazatelja stanja strance ne smiju biti prazna.",
        "version": "Verzija",
-       "version-extensions": "Instalirana proširenja (ekstenzije)",
-       "version-skins": "Instalirane kože",
+       "version-extensions": "Instalirana proširenja",
+       "version-skins": "Instalirane teme",
        "version-specialpages": "Posebne stranice",
        "version-parserhooks": "Kuke parsera",
        "version-variables": "Promjenjive",
        "version-other": "Ostalo",
        "version-mediahandlers": "Upravljači medije",
        "version-hooks": "Kuke",
-       "version-parser-extensiontags": "Parser proširenja (''tagovi'')",
+       "version-parser-extensiontags": "Oznake proširenja parsera",
        "version-parser-function-hooks": "Kuke parserske funkcije",
        "version-hook-name": "Naziv kuke",
        "version-hook-subscribedby": "Pretplaćeno od",
        "version-version": "($1)",
        "version-no-ext-name": "[nema imena]",
-       "version-license": "Licenca",
+       "version-license": "MediaWiki licenca",
        "version-ext-license": "Licenca",
        "version-ext-colheader-name": "Proširenje",
        "version-skin-colheader-name": "Tema",
        "version-license-not-found": "Za ovo proširenje nije pronađena informacija o licenci.",
        "version-credits-title": "Zasluge za $1",
        "version-credits-not-found": "Za ovo proširenje nisu pronađene informacije o zaslugama.",
-       "version-poweredby-credits": "Ova wiki je zasnovana na '''[https://www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
+       "version-poweredby-credits": "Ova wiki je zasnovana na <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, autorska prava © 2001-$1 $2.",
        "version-poweredby-others": "ostali",
        "version-poweredby-translators": "translatewiki.net prevodioci",
        "version-credits-summary": "Željeli bismo se zahvaliti sljedećim ljudima na njihovom doprinosu [[Special:Version|MediaWikiju]].",
        "version-software": "Instalirani softver",
        "version-software-product": "Proizvod",
        "version-software-version": "Verzija",
-       "version-entrypoints": "URL Adrese ulazne tačke",
+       "version-entrypoints": "Adrese ulaznih tačaka",
        "version-entrypoints-header-entrypoint": "Ulazna tačka",
        "version-entrypoints-header-url": "URL",
        "version-libraries": "Instalirane biblioteke",
        "tags": "Oznake valjane izmjene",
        "tag-filter": "Filter [[Special:Tags|oznaka]]:",
        "tag-filter-submit": "Filter",
-       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Oznaka|Oznake}}]]: $2)",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|oznaka|oznake}}]]: $2)",
        "tags-title": "Oznake",
        "tags-intro": "Ova stranica prikazuje spisak oznaka koje softver može staviti na svaku izmjenu i njihovo značenje.",
        "tags-tag": "Naziv oznake",
-       "tags-display-header": "Vidljivost na spisku izmjena",
+       "tags-display-header": "Izgled na spiskovima izmjena",
        "tags-description-header": "Puni opis značenja",
        "tags-source-header": "Izvor",
        "tags-active-header": "Aktivna?",
        "htmlform-cloner-required": "Potrebna je barem jedna vrijednost.",
        "htmlform-title-badnamespace": "[[:$1]] nije u imenskom prostoru \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "Stranica \"$1\" se ne može napraviti",
-       "htmlform-title-not-exists": "[[:$1]] ne postoji.",
+       "htmlform-title-not-exists": "$1 ne postoji.",
        "htmlform-user-not-exists": "<strong>$1</strong> ne postoji.",
        "htmlform-user-not-valid": "<strong>$1</strong> nije ispravno korisničko ime.",
        "sqlite-has-fts": "$1 sa podrškom pretrage cijelog teksta",
        "logentry-delete-delete": "$1 {{GENDER:$2|obrisao|obrisala}} je stranicu $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|vratio|vratila}} je stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4",
-       "logentry-delete-revision": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|promijenio|promijenila}} je vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
        "logentry-delete-event-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3",
        "logentry-delete-revision-legacy": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|potisnuo|potisnula}} je stranicu $3",
        "logentry-suppress-revision": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|izmjene|$5 izmjene|$5 izmjena}} na stranici $3: $4",
        "logentry-suppress-event-legacy": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost događaja u evidenciji na $3",
        "logentry-suppress-revision-legacy": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
-       "revdelete-content-hid": "skriveni sadržaj",
+       "revdelete-content-hid": "sadržaj je sakriven",
        "revdelete-summary-hid": "sažetak izmjene je sakriven",
        "revdelete-uname-hid": "sažetak izmjene je sakriven",
        "revdelete-content-unhid": "sadržaj je otkriven",
        "logentry-merge-merge": "$1 {{GENDER:$2|spojio|spojila}} je $3 u $4 (sve do izmjene $5)",
        "logentry-move-move": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 bez ostavljanja preusmjerenja",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjerenja",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|premjestio|premjestila}} je stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja",
        "logentry-patrol-patrol": "$1 {{GENDER:$2|označio|označila}} je izmjenu $4 stranice $3 pregledanom",
        "logentry-patrol-patrol-auto": "$1 automatski je {{GENDER:$2|označio|označila}} verziju $4 stranice $3 pregledanom",
        "logentry-newusers-newusers": "Korisnički račun $1 je {{GENDER:$2|napravljen}}",
-       "logentry-newusers-create": "Korisnički račun $1 je {{GENDER:$2|napravljen}}",
+       "logentry-newusers-create": "$1 {{GENDER:$2|napravio|napravila}} je korisnički račun",
        "logentry-newusers-create2": "$1 je {{GENDER:$2|napravio|napravila}} korisnički račun $3",
        "logentry-newusers-byemail": "Korisnički račun $3 je {{GENDER:$2|napravio|napravila}} $1 i lozinka/šifra je poslana putem e-maila",
        "logentry-newusers-autocreate": "Korisnički račun $1 automatski je {{GENDER:$2|napravljen}}",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|premjestio|premjestila}} je postavke zaštite sa $4 na $3",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|uklonio|uklonila}} je zaštitu sa stranice $3",
        "logentry-protect-protect": "$1 {{GENDER:$2|zaštitio|zaštitila}} je $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zaštitio|zaštitila}} je $3 $4 [prenosiva zaštita]",
        "logentry-protect-modify": "$1 {{GENDER:$2|promijenio|promijenila}} je stepen zaštite za $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|promijenio|promijenila}} je nivo zaštite za $3 $4 [prenosiva zaštita]",
        "logentry-rights-rights": "$1 {{GENDER:$2|promijenio|promijenila}} je članstvo grupe za $3 iz $4 u $5",
        "logentry-rights-rights-legacy": "$1 je {{GENDER:$2|promijenio|promijenila|promijenio}} članstvo grupe za $3",
        "logentry-rights-autopromote": "$1 {{GENDER:$1|je automatski promijenjeno članstvo|su automatski promijenjena članstva}} iz $4 u $5",
        "api-error-badaccess-groups": "Nemate ovlasti da postavljate datoteke na ovoj wiki.",
        "api-error-badtoken": "Unutrašnja greška: token nije ispravan.",
        "api-error-copyuploaddisabled": "Postavljanja putem URL-a su onemogućena na ovom serveru.",
-       "api-error-duplicate": "Već postoji {{PLURAL:$1|druga datoteka|druge datoteke}} na ovoj stranici sa istim sadržajem",
+       "api-error-duplicate": "Već postoji {{PLURAL:$1|druga datoteka|druge datoteke}} na ovoj stranici s istim sadržajem.",
        "api-error-duplicate-archive": "{{PLURAL:$1|Postojala je druga datoteka|Postojale su neke druge datoteke}} na sajtu sa istim sadržajem, ali {{PLURAL:$1|je obrisana|su obrisane}}.",
        "api-error-empty-file": "Datoteka koju ste poslali je bila prazna.",
        "api-error-emptypage": "Stvaranje novih praznih stranica nije dozvoljeno.",
        "json-error-inf-or-nan": "Jedna ili više NAN ili INF vrijednosti u iznosu koga treba enkodirati",
        "json-error-unsupported-type": "Data je vrijednost vrste koja se ne može enkodirati",
        "headline-anchor-title": "Veza do ovog odjeljka",
-       "special-characters-group-latin": "Latinica",
-       "special-characters-group-latinextended": "Prošireni latinski",
+       "special-characters-group-latin": "latinica",
+       "special-characters-group-latinextended": "proširena latinica",
        "special-characters-group-ipa": "IPA",
-       "special-characters-group-symbols": "Simboli",
-       "special-characters-group-greek": "Grčki",
-       "special-characters-group-cyrillic": "Ä\86irilica",
-       "special-characters-group-arabic": "Arapski",
-       "special-characters-group-arabicextended": "Prošireni arapski",
+       "special-characters-group-symbols": "simboli",
+       "special-characters-group-greek": "grčki",
+       "special-characters-group-cyrillic": "Ä\87irilica",
+       "special-characters-group-arabic": "arapski",
+       "special-characters-group-arabicextended": "prošireni arapski",
        "special-characters-group-persian": "Perzijski",
-       "special-characters-group-hebrew": "Hebrejski",
-       "special-characters-group-bangla": "Bangladeški",
-       "special-characters-group-tamil": "Tamilski",
-       "special-characters-group-telugu": "Telugu",
-       "special-characters-group-sinhala": "Sinhala",
-       "special-characters-group-gujarati": "Gujarati",
-       "special-characters-group-devanagari": "Devanagari",
-       "special-characters-group-thai": "Tajlandski",
-       "special-characters-group-lao": "Laoški",
-       "special-characters-group-khmer": "Kmerski",
+       "special-characters-group-hebrew": "hebrejski",
+       "special-characters-group-bangla": "bangladeški",
+       "special-characters-group-tamil": "tamilski",
+       "special-characters-group-telugu": "telugu",
+       "special-characters-group-sinhala": "sinhalski",
+       "special-characters-group-gujarati": "gujarati",
+       "special-characters-group-devanagari": "devanagari",
+       "special-characters-group-thai": "tajlandski",
+       "special-characters-group-lao": "laoski",
+       "special-characters-group-khmer": "kmerski",
        "special-characters-title-endash": "crtica",
        "special-characters-title-emdash": "duga crta",
        "special-characters-title-minus": "minus",
+       "mw-widgets-dateinput-no-date": "Nikakav datum nije izabran",
        "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
-       "mw-widgets-titleinput-description-redirect": "preusmjerava na $1"
+       "mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
+       "api-error-blacklisted": "Molimo izaberite drugačiji, deskriptivniji naziv."
 }
index 1604018..1f24144 100644 (file)
                        "Xavier Dengra",
                        "Pginer",
                        "Eduardo Martinez",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "KRLS",
+                       "Jaumeortola",
+                       "Kippelboy"
                ]
        },
        "tog-underline": "Subratlla els enllaços:",
        "tog-hideminor": "Amaga les edicions menors en la pàgina de canvis recents",
        "tog-hidepatrolled": "Amaga edicions patrullades als canvis recents",
        "tog-newpageshidepatrolled": "Amaga pàgines patrullades de la llista de pàgines noves",
+       "tog-hidecategorization": "Amaga la categorització de les pàgines",
        "tog-extendwatchlist": "Desplega la llista de seguiment per a mostrar tots els canvis afectats, no només els més recents",
        "tog-usenewrc": "Agrupa els canvis per pàgina en canvis recents i llista de seguiment",
        "tog-numberheadings": "Enumera automàticament els encapçalaments",
        "tog-watchlisthidebots": "Amaga de la llista de seguiment les edicions fetes per usuaris bots",
        "tog-watchlisthideminor": "Amaga les edicions menors de la llista de seguiment",
        "tog-watchlisthideliu": "Amaga a la llista les edicions d'usuaris registrats",
+       "tog-watchlistreloadautomatically": "Recarrega la llista de seguiment automàticament sempre que canviï un filtre (cal JavaScript)",
        "tog-watchlisthideanons": "Amaga a la llista les edicions d'usuaris anònims",
        "tog-watchlisthidepatrolled": "Amaga edicions patrullades de la llista de seguiment",
+       "tog-watchlisthidecategorization": "Amaga la categorització de les pàgines",
        "tog-ccmeonemails": "Envia’m còpies 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",
        "underline-default": "Per defecte del navegador",
        "editfont-style": "Estil de lletra en edició:",
        "editfont-default": "Per defecte del navegador",
-       "editfont-monospace": "Font monoespaiada",
-       "editfont-sansserif": "Font de pal sec",
+       "editfont-monospace": "Lletra monoespaiada",
+       "editfont-sansserif": "Lletra de pal sec",
        "editfont-serif": "Lletra amb gràcia",
        "sunday": "diumenge",
        "monday": "dilluns",
        "morenotlisted": "Aquesta llista no és completa.",
        "mypage": "Pàgina",
        "mytalk": "Discussió",
-       "anontalk": "Discussió d'aquesta IP",
+       "anontalk": "Discussió",
        "navigation": "Navegació",
        "and": "&#32;i",
        "qbfind": "Cerca",
        "privacy": "Política de privadesa",
        "privacypage": "Project:Política de privadesa",
        "badaccess": "Error de permisos",
-       "badaccess-group0": "No teniu permís per a executar l'acció que heu soŀlicitat.",
-       "badaccess-groups": "L'acció que heu soŀlicitat es limita als usuaris {{PLURAL:$2|del grup|dels grups}}: $1.",
+       "badaccess-group0": "No teniu permís per a executar l'acció que heu solicitat.",
+       "badaccess-groups": "L'acció que heu solicitat es limita als usuaris {{PLURAL:$2|del grup|dels grups}}: $1.",
        "versionrequired": "Cal la versió $1 del MediaWiki",
-       "versionrequiredtext": "Cal la versió $1 del MediaWiki per a utilitzar aquesta pàgina. Vegeu [[Special:Version]]",
+       "versionrequiredtext": "Cal la versió $1 del MediaWiki per a utilitzar aquesta pàgina. Vegeu [[Special:Version]].",
        "ok": "D’acord",
        "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "nstab-category": "Categoria",
        "mainpage-nstab": "Pàgina principal",
        "nosuchaction": "No es reconeix aquesta operació",
-       "nosuchactiontext": "L'acció especificada per la URL no és vàlida.\nPotser heu escrit malament la URL o heu seguit un enllaç incorrecte.\nAixò també pot ser causat per un error al programari utilitzat pel projecte {{SITENAME}}.",
+       "nosuchactiontext": "L'acció especificada per l'URL no és vàlida.\nPotser heu escrit malament l'URL o heu seguit un enllaç incorrecte.\nAixò també pot ser causat per un error en el programari utilitzat pel projecte {{SITENAME}}.",
        "nosuchspecialpage": "No es troba la pàgina especial que busqueu",
        "nospecialpagetext": "<strong>La pàgina especial que demaneu no és vàlida.</strong>\n\nVegeu la llista de pàgines especials a [[Special:SpecialPages]].",
        "error": "Error",
        "databaseerror-function": "Funció: $1",
        "databaseerror-error": "Error:$1",
        "laggedslavemode": "Avís: La pàgina podria mancar de modificacions recents.",
-       "readonly": "La base de dades es troba bloquejada",
+       "readonly": "La base de dades es bloquejada",
        "enterlockreason": "Escriviu una raó pel bloqueig, així com una estimació de quan tindrà lloc el desbloqueig",
        "readonlytext": "La base de dades està temporalment bloquejada segurament per tasques de manteniment, després de les quals es tornarà a la normalitat.\n\nL'administrador que l'ha bloquejada ha donat aquesta explicació: $1",
        "missing-article": "La base de dades no ha trobat el text d'una pàgina que hauria d'haver trobat, anomenada «$1» $2.\n\nNormalment això passa perquè s'ha seguit una diferència desactualitzada o un enllaç d'historial a una pàgina que s'ha suprimit.\n\nSi no fos el cas, podríeu haver trobat un error en el programari.\nAviseu-ho llavors a un [[Special:ListUsers/sysop|administrador]], deixant-li clar l'adreça URL causant del problema.",
        "filedeleteerror": "No s'ha pogut eliminar el fitxer «$1».",
        "directorycreateerror": "No s'ha pogut crear el directori «$1».",
        "directoryreadonlyerror": "El directori \"$1\" és de només lectura.",
-       "directorynotreadableerror": "El directori \"$1\" no és llegible",
+       "directorynotreadableerror": "El directori \"$1\" no és llegible.",
        "filenotfound": "No s'ha pogut trobar el fitxer «$1».",
        "unexpected": "S'ha trobat un valor imprevist: «$1»=«$2».",
-       "formerror": "Error: no s'ha pogut enviar les dades del formulari",
-       "badarticleerror": "Aquesta operació no es pot dur a terme en aquesta pàgina",
+       "formerror": "Error: No s'han pogut enviar les dades del formulari.",
+       "badarticleerror": "Aquesta operació no es pot dur a terme en aquesta pàgina.",
        "cannotdelete": "No s'ha pogut suprimir la pàgina o fitxer «$1».\nPotser ja l'ha suprimit algú altre.",
        "cannotdelete-title": "No es pot suprimir la pàgina \" $1 \"",
        "delete-hook-aborted": "Un «hook» ha interromput la supressió.\nNo ha donat cap explicació.",
        "title-invalid-too-long": "El títol de la pàgina sol·licitada és massa llarg. No ha d’excedir $1 {{PLURAL:$1|byte|bytes}} en codificació UTF-8.",
        "title-invalid-leading-colon": "El títol de la pàgina sol·licitada conté dos punts a l’inici.",
        "perfcached": "Les dades següents es troben a la memòria cau i podrien no estar al dia. Hi ha un màxim {{PLURAL:$1|d'un resultat|de $1 resultats}} disponibles a la memòria cau.",
-       "perfcachedts": "Les dades següents es troben a la memòria cau i es van actualitzar per darrera vegada el $1. Hi ha un màxim {{PLURAL:$4|d'un resultat|de $4 resultats}} disponibles a la memòria cau.",
+       "perfcachedts": "Les dades següents es troben a la memòria cau i la darrera actualització és en data: $1. Hi ha un màxim {{PLURAL:$4|d'un resultat|de $4 resultats}} disponibles a la memòria cau.",
        "querypage-no-updates": "S'ha inhabilitat l'actualització d'aquesta pàgina. Les dades que hi contenen podrien no estar al dia.",
        "viewsource": "Mostra el codi",
        "viewsource-title": "Mostra la font per a $1",
        "actionthrottled": "Acció limitada",
-       "actionthrottledtext": "Com a mesura per a prevenir la propaganda indiscriminada (spam), no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d'ací uns minuts.",
+       "actionthrottledtext": "Com a mesura per prevenir l’abús, no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d’ací a uns minuts.",
        "protectedpagetext": "S'ha protegit la pàgina per evitar-hi modificacions.",
        "viewsourcetext": "Podeu veure i copiar el codi font d’aquesta pàgina.",
        "viewyourtext": "Vostè pot veure i copiar la font de <strong>les teves modificacions</strong> d'aquesta pàgina.",
        "invalidtitle-unknownnamespace": "Títol no vàlid amb espai de noms desconegut de número «$1» i text «$2»",
        "exception-nologin": "No has iniciat sessió",
        "exception-nologin-text": "Cal que inicieu una sessió per accedir a aquesta pàgina o acció.",
-       "exception-nologin-text-manual": "Si us plau, $1 per poder accedir a aquesta pàgina o acció.",
+       "exception-nologin-text-manual": "Si us plau, $1 per poder accedir a aquesta pàgina o acció.",
        "virus-badscanner": "Mala configuració: antivirus desconegut: ''$1''",
        "virus-scanfailed": "escaneig fallit (codi $1)",
        "virus-unknownscanner": "antivirus desconegut:",
        "userlogin-signwithsecure": "Connexió segura",
        "yourdomainname": "El vostre domini",
        "password-change-forbidden": "No podeu canviar les contrasenyes en aquest wiki.",
-       "externaldberror": "Hi ha hagut una fallida en el servidor d'autenticació externa de la base de dades i no teniu permís per a actualitzar el vostre compte d'accès extern.",
+       "externaldberror": "Hi ha hagut un error en la base de dades d'autenticació o bé no teniu permís per a actualitzar el vostre compte extern.",
        "login": "Inici de sessió",
        "nav-login-createaccount": "Inicia una sessió / crea un compte",
        "userlogin": "Inicia una sessió / crea un compte",
        "userlogin-helplink2": "Ajuda amb el registre",
        "userlogin-loggedin": "Heu iniciat una sessió com {{GENDER:$1|$1}}.\nFeu servir el formulari de sota per iniciar la sessió com un altre usuari.",
        "userlogin-createanother": "Crea un altre compte",
-       "createacct-emailrequired": "Adreça de correu electrònic",
-       "createacct-emailoptional": "Adreça de correu electrònic (opcional)",
+       "createacct-emailrequired": "Adreça electrònica",
+       "createacct-emailoptional": "Adreça electrònica (opcional)",
        "createacct-email-ph": "Introduïu la vostra adreça de correu electrònic",
        "createacct-another-email-ph": "Introduïu una adreça de correu electrònic",
        "createaccountmail": "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu indicada",
        "createaccountreason": "Motiu:",
        "createacct-reason": "Motiu",
        "createacct-reason-ph": "Per què creeu un altre compte",
-       "createacct-captcha": "Control de seguretat",
-       "createacct-imgcaptcha-ph": "Introduïu el text que apareix a dalt",
        "createacct-submit": "Crea el meu compte",
        "createacct-another-submit": "Crea un compte",
        "createacct-benefit-heading": "{{SITENAME}} és feta per gent com tu.",
        "loginerror": "Error d'inici de sessió",
        "createacct-error": "Error de creació de compte",
        "createaccounterror": "No s'ha pogut crear el compte: $1",
-       "nocookiesnew": "S'ha creat el compte d'usuari, però no esteu enregistrat. El projecte {{SITENAME}} usa galetes per enregistrar els usuaris. Si us plau activeu-les, per a poder enregistrar-vos amb el vostre nom d'usuari i la clau.",
+       "nocookiesnew": "S'ha creat el compte d'usuari, però no s'ha iniciat la sessió.\nEl projecte {{SITENAME}} usa galetes per a iniciar la sessió d'usuari. \nTeniu les galetes desactivades. \nActiveu-les per a poder iniciar la sessió amb el nou nom d'usuari i la nova clau.",
        "nocookieslogin": "El programari {{SITENAME}} utilitza galetes per enregistrar usuaris. Teniu les galetes desactivades. Activeu-les i torneu a provar.",
        "nocookiesfornew": "No s'ha creat el compte d'usuari, ja que no es podia confirmar el seu origen.\nVerifiqueu que teniu habilitades les galetes al vostre navegador, torneu a carregar aquesta pàgina i intenteu-lo de nou.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "wrongpasswordempty": "La contrasenya que s'ha introduït estava en blanc. Torneu-ho a provar.",
        "passwordtooshort": "La contrasenya ha de tenir un mínim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
        "passwordtoolong": "La contrasenya ha de tenir un màxim {{PLURAL:$1|d'un caràcter|de $1 caràcters}}.",
-       "password-name-match": "La contrasenya ha de ser diferent al vostre nom d'usuari.",
+       "passwordtoopopular": "No poden utilitzar-se contrasenyes d'ús habitual. Trieu-ne una més única.",
+       "password-name-match": "La contrasenya ha de ser diferent del vostre nom d'usuari.",
        "password-login-forbidden": "No és permès d'utilitzar aquest nom d'usuari i contrasenya.",
        "mailmypassword": "Restableix la contrasenya",
        "passwordremindertitle": "Nova contrasenya temporal per al projecte {{SITENAME}}",
-       "passwordremindertext": "Algú (vós mateix segurament, des de l'adreça l'IP $1) ha soŀlicitat que us enviéssim una nova contrasenya per a iniciar la sessió al projecte {{SITENAME}} ($4).\nLa nova contrasenya temporal per a l'usuari «$2» és ara «$3». Si aquesta fou la vostra intenció, ara hauríeu d'iniciar la sessió i canviar-la. Tingueu present que és temporal i caducarà d'aquí {{PLURAL:$5|un dia|$5 dies}}.\n\nSi algú altre hagués fet aquesta soŀlicitud o si ja haguéssiu recordat la vostra contrasenya i\nno volguéssiu canviar-la, ignoreu aquest missatge i continueu utilitzant\nla vostra antiga contrasenya.",
+       "passwordremindertext": "Algú (vós mateix segurament, des de l'adreça IP $1) ha sol·licitat que us enviéssim una nova contrasenya per a iniciar la sessió en el projecte {{SITENAME}} ($4).\nLa nova contrasenya temporal per a l'usuari «$2» és ara «$3». Si la vostra intenció era aquesta, ara hauríeu d'iniciar la sessió i canviar-la. Tingueu present que és temporal i caducarà d'aquí a {{PLURAL:$5|un dia|$5 dies}}.\n\nSi algú altre hagués fet aquesta sol·licitud o si ja haguéssiu recordat la vostra contrasenya i\nno volguéssiu canviar-la, ignoreu aquest missatge i continueu utilitzant\nla contrasenya antiga.",
        "noemail": "No hi ha cap adreça electrònica registrada de l'usuari «$1».",
-       "noemailcreate": "Has d'indicar una adreça de correu electrònic vàlida",
+       "noemailcreate": "Heu d’indicar una adreça electrònica vàlida.",
        "passwordsent": "S'ha enviat una nova contrasenya a l'adreça electrònica registrada per «$1».\nInicieu una sessió després que la rebeu.",
        "blocked-mailpassword": "S'ha blocat la vostra adreça IP. Se us ha desactivat la funció de recuperació de contrasenya per a prevenir abusos.",
        "eauthentsent": "S'ha enviat un correu electrònic a la direcció especificada. Abans no s'enviï cap altre correu electrònic a aquesta adreça, cal verificar que és realment vostra. Per tant, cal que seguiu les instruccions presents en el correu electrònic que se us ha enviat.",
        "accountcreated": "S'ha creat el compte",
        "accountcreatedtext": "S'ha creat el compte d'usuari de [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|discussió]]).",
        "createaccount-title": "Creació d'un compte a {{SITENAME}}",
-       "createaccount-text": "Algú ha creat un compte d'usuari anomenat $2 al projecte {{SITENAME}}\n($4) amb la vostra adreça de correu electrònic. La contrasenya per a l'usuari «$2» és «$3». Hauríeu d'accedir al compte i canviar-vos aquesta contrasenya quan abans millor.\n\nSi no hi teniu cap relació i aquest compte s'ha creat per error, simplement ignoreu el missatge.",
+       "createaccount-text": "Algú ha creat un compte d'usuari anomenat $2 en el projecte {{SITENAME}}\n($4) amb la vostra adreça de correu electrònic. La contrasenya per a l'usuari «$2» és «$3». Hauríeu d'accedir al compte i canviar-vos aquesta contrasenya com més aviat millor.\n\nSi no hi teniu cap relació i aquest compte s'ha creat per error, simplement ignoreu el missatge.",
        "login-throttled": "Heu realitzat massa intents d'accés a la sessió.\nEspereu $1 abans de tornar-ho a provar.",
-       "login-abort-generic": "L'entrada al compte d'usuari no ha reeixit - Abortada",
+       "login-abort-generic": "L'entrada al compte d'usuari no ha reeixit - S'ha interromput.",
        "login-migrated-generic": "S'ha migrat el vostre compte, i el vostre nom d'usuari ja no existeix en aquest wiki.",
        "loginlanguagelabel": "Llengua: $1",
-       "suspicious-userlogout": "S'ha denegat la vostra petició per tancar la sessió ja què sembla que va ser enviada per un navegador defectuós o un proxy cau.",
+       "suspicious-userlogout": "S'ha denegat la vostra petició per a tancar la sessió, ja que sembla que va ser enviada per un navegador defectuós o un servidor intermediari.",
        "createacct-another-realname-tip": "El nom real és opcional.\nSi decidiu proporcionar-lo, s'utilitzarà per a reconèixer a l'usuari el seu treball.",
        "pt-login": "Inicia la sessió",
        "pt-login-button": "Inicia sessió",
        "user-mail-no-addy": "S'ha intentat enviar un missatge de correu electrònic sense adreça.",
        "user-mail-no-body": "Vas intentar enviar un correu electrònic amb un cos buit o excessivament curt.",
        "changepassword": "Canvia la contrasenya",
-       "resetpass_announce": "Per tal de completar l'inici de sessió heu de definir una contrasenya nova.",
+       "resetpass_announce": "Per a completar l'inici de sessió heu de definir una contrasenya nova.",
        "resetpass_text": "<!-- Afegiu-hi un text -->",
        "resetpass_header": "Canvia la contrasenya del compte",
        "oldpassword": "Contrasenya antiga",
        "resetpass_forbidden": "No poden canviar-se les contrasenyes",
        "resetpass-no-info": "Heu d'estar registrats en un compte per a poder accedir directament a aquesta pàgina.",
        "resetpass-submit-loggedin": "Canvia la contrasenya",
-       "resetpass-submit-cancel": "Canceŀla",
+       "resetpass-submit-cancel": "Cancela",
        "resetpass-wrong-oldpass": "Contrasenya actual o temporal no vàlida.\nDeveu haver canviat la vostra contrasenya o demanat una nova contrasenya temporal.",
        "resetpass-recycled": "Restabliu la contrasenya amb un text diferent que el de la contrasenya actual.",
        "resetpass-temp-emailed": "Heu iniciat una sessió amb un codi temporal enviat per correu.\nPer completar l'inici de sessió heu de definir una contrasenya nova a continuació:",
        "passwordreset": "Restablir contrasenya",
        "passwordreset-text-one": "Cal completar aquest formulari per reiniciar la contrasenya",
        "passwordreset-text-many": "{{PLURAL:$1|Ompliu un dels camps per a rebre una contrasenya temporal al vostre correu electrònic.}}",
-       "passwordreset-disabled": "S'ha desactivat el restabliment de contranyes en aquest wiki.",
+       "passwordreset-disabled": "S'ha desactivat el restabliment de contrasenyes en aquest wiki.",
        "passwordreset-emaildisabled": "Les opcions de correu electrònic no estan habilitades en aquest wiki.",
        "passwordreset-username": "Nom d'usuari:",
        "passwordreset-domain": "Domini",
        "passwordreset-capture": "Veure el missatge de correu electrònic?",
        "passwordreset-capture-help": "Si marqueu aquesta casella, el missatge de correu electrònic (amb la contrasenya temporal) es mostrarà al mateix moment que sigui enviat a l'usuari.",
-       "passwordreset-email": "Adreça de correu electrònic:",
+       "passwordreset-email": "Adreça electrònica:",
        "passwordreset-emailtitle": "Detalls del compte a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat una reinicialització de la vostra contrasenya al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar al compte per a fixar-hi una nova contrasenya al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
        "passwordreset-emailtext-user": "L'usuari $1 de {{SITENAME}} ha demanat una reinicialització de la vostra contrasenya per al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar ara per fixar una nova contrasenya. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
        "passwordreset-emailelement": "Nom d'usuari: \n$1\n\nContrasenya temporal: \n$2",
-       "passwordreset-emailsent": "S'ha enviat un correu de reinicialització de contrasenya.",
+       "passwordreset-emailsentemail": "Si aquesta és una adreça electrònica registrada amb el vostre compte, s’hi enviarà un missatge de restabliment de contrasenya.",
        "passwordreset-emailsent-capture": "S'ha enviat un correu electrònic de reinicialització de contrasenya, tal com es mostra a continuació.",
        "passwordreset-emailerror-capture": "S'ha generat un correu electrònic de renovació de contrasenya, que es mostra a continuació, però ha fallat l'enviament a {{GENDER:$2:l'usuari|la usuària}}: $1",
-       "changeemail": "Canvi de correu electrònic",
-       "changeemail-header": "Canvi de l'adreça de correu electrònic del compte",
+       "changeemail": "Canvia o elimina l’adreça electrònica",
+       "changeemail-header": "Empleneu aquest formulari per canviar la vostra adreça electrònica. Si voleu eliminar qualssevol associacions d’adreces electròniques del vostre compte, deixeu en blanc el camp i envieu el formulari.",
+       "changeemail-passwordrequired": "Cal que introduïu la vostra contrasenya per confirmar el canvi.",
        "changeemail-no-info": "Heu d'entrar en un compte d'usuari per accedir directament a aquesta pàgina.",
-       "changeemail-oldemail": "Adreça de correu electrònic actual:",
+       "changeemail-oldemail": "Adreça electrònica actual:",
        "changeemail-newemail": "Adreça electrònica nova:",
+       "changeemail-newemail-help": "Aquest camp s'ha de deixar en blanc si voleu eliminar la vostra adreça de correu electrònic. Si s'elimina l'adreça electrònica, no podreu restablir la contrasenya si l'oblideu i no rebreu correus electrònics des d'aquest wiki.",
        "changeemail-none": "(cap)",
        "changeemail-password": "La vostra contrasenya a {{SITENAME}}:",
        "changeemail-submit": "Canvia de correu electrònic",
        "changeemail-throttled": "Heu realitzat massa intents d'inici de sessió.\nEspereu $1 abans de tornar-ho a provar.",
+       "changeemail-nochange": "Introduïu una adreça electrònica distinta.",
        "resettokens": "Reinicia els testimonis",
        "resettokens-text": "Des d'aquí podeu reiniciar els testimonis que permeten l'accés a certes dades privades associades amb el vostre compte.\n\nHo hauríeu de fer si accidentalment els heu compartit amb algú o si el vostre compte ha estat compromès.",
        "resettokens-no-tokens": "No hi ha testimonis per reiniciar.",
        "sig_tip": "La vostra signatura amb marca horària",
        "hr_tip": "Línia horitzontal (feu-la servir amb moderació)",
        "summary": "Resum:",
-       "subject": "Tema/capçalera:",
+       "subject": "Assumpte:",
        "minoredit": "Aquesta és una modificació menor",
        "watchthis": "Vigila aquesta pàgina",
        "savearticle": "Desa la pàgina",
        "missingsummary": "'''Recordatori''': Heu deixat en blanc el resum de l'edició. Si torneu a clicar al botó de desar, l'edició es guardarà sense resum.",
        "selfredirect": "<strong>Avís:</strong> Esteu redirigint la pàgina a si mateixa.\nPodeu haver especificat un objectiu erroni per a la redirecció, o potser esteu modificant una pàgina incorrecta.\nSi feu clic a «{{int:savearticle}}» una vegada més, la redirecció es crearà de totes maneres.",
        "missingcommenttext": "Introduïu un comentari a continuació.",
-       "missingcommentheader": "'''Recordatori:''' No heu proporcionat un assumpte/encapçalament per al comentari. Si cliqueu de nou al botó \"{{int:savearticle}}\", la vostra contribució se desarà sense cap.",
+       "missingcommentheader": "<strong>Recordatori:</strong> no heu proporcionat un assumpte/encapçalament per al comentari.\nSi feu clic de nou al botó «{{int:savearticle}}», la vostra contribució es desarà sense cap.",
        "summary-preview": "Previsualització del resum:",
-       "subject-preview": "Previsualització de tema/capçalera:",
+       "subject-preview": "Previsualització de l’assumpte:",
        "previewerrortext": "S'ha produït un error quan es provava de previsualitzar els canvis.",
        "blockedtitle": "L'usuari està blocat",
        "blockedtext": "'''S'ha procedit al blocatge del vostre compte d'usuari o la vostra adreça IP.'''\n\nEl blocatge l'ha dut a terme l'usuari $1.\nEl motiu donat és ''$2''.\n\n* Inici del blocatge: $8\n* Final del blocatge: $6\n* Compte blocat: $7\n\nPodeu contactar amb $1 o un dels [[{{MediaWiki:Grouppage-sysop}}|administradors]] per a discutir-ho.\n\nTingueu en compte que no podeu fer servir el formulari d'enviament de missatges de correu electrònic a cap usuari, a menys que tingueu una adreça de correu vàlida registrada a les vostres [[Special:Preferences|preferències d'usuari]] i no ho tingueu tampoc blocat.\n\nLa vostra adreça IP actual és $3, i el número d'identificació del blocatge és #$5.\nSi us plau, incloeu aquestes dades en totes les consultes que feu.",
        "note": "'''Nota:'''",
        "previewnote": "'''Recorda que això és només una previsualització.'''\nEls vostres canvis encara no s'han desat!",
        "continue-editing": "Aneu a l'àrea d'edició",
-       "previewconflict": "Aquesta previsualització reflecteix, a l'àrea\nd'edició superior, el text tal com apareixerà si trieu desar-lo.",
+       "previewconflict": "Aquesta previsualització reflecteix, a l'àrea\nd'edició superior, el text tal 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ó.\nSi us plau, proveu-ho una altra vegada. Si continués sense funcionar, proveu de [[Special:UserLogout|finalitzar la sessió]] i torneu a iniciar-ne una.'''",
        "session_fail_preview_html": "'''Ho sentim, no s'han pogut processar les vostres modificacions a causa d'una pèrdua de dades de la sessió.'''\n\n''Com que el projecte {{SITENAME}} té habilitat l'ús de codi HTML cru, s'ha amagat la previsualització com a prevenció contra atacs mitjançant codis JavaScript.''\n\n'''Si es tracta d'una contribució legítima, si us plau, intenteu-ho una altra vegada. Si continua havent-hi problemes, [[Special:UserLogout|finalitzeu la sessió]] i torneu a iniciar-ne una.'''",
        "token_suffix_mismatch": "'''S'ha rebutjat la vostra modificació perquè el vostre client ha fet malbé els caràcters de puntuació en el testimoni d'edició. S'ha rebutjat la modificació per a evitar la corrupció del text de la pàgina. Açò passa a vegades quan s'utilitza un servei web de servidor intermediari anònim amb problemes.'''",
        "explainconflict": "Algú més ha canviat aquesta pàgina des que l'heu editada.\nL'àrea de text superior conté el text de la pàgina com existeix actualment.\nEls vostres canvis es mostren en l'àrea de text inferior.\nHaureu de fusionar els vostres canvis en el text existent.\n'''Només''' el text de l'àrea superior es desarà quan premeu el botó «{{int:savearticle}}».",
        "yourtext": "El vostre text",
        "storedversion": "Versió emmagatzemada",
-       "nonunicodebrowser": "'''Alerta: El vostre navegador no és compatible amb unicode.'''\nS'ha activat una alternativa que us permetrà modificar pàgines amb seguretat: el caràcters que no són ASCII us apareixeran en la caixa d'edició com a codis hexadecimals.",
+       "nonunicodebrowser": "<strong>Alerta: El vostre navegador no és compatible amb Unicode.</strong>\nS'ha activat una alternativa que us permetrà modificar pàgines amb seguretat: els caràcters que no són ASCII us apareixeran en la caixa d'edició com a codis hexadecimals.",
        "editingold": "'''AVÍS: Esteu editant una revisió desactualitzada de la pàgina.\nSi la deseu, es perdran els canvis que hàgiu fet des de llavors.'''",
        "yourdiff": "Diferències",
        "copyrightwarning": "Si us plau, tingueu en compte que totes les contribucions per al projecte {{SITENAME}} es consideren com a publicades sota els termes de la llicència $2 (vegeu-ne més detalls a $1). Si no desitgeu la modificació i distribució lliure dels vostres escrits sense el vostre consentiment, no els poseu ací.<br />\nA més a més, en enviar el vostre text, doneu fe que és vostra l'autoria, o bé de fonts en el domini públic o recursos lliures similars. Heu de saber que aquest '''no''' és el cas de la majoria de pàgines que hi ha a Internet.\n'''No feu servir textos amb drets d'autor sense permís!'''",
        "permissionserrors": "Error de permisos",
        "permissionserrorstext": "No teniu permisos per a fer-ho, {{PLURAL:$1|pel següent motiu|pels següents motius}}:",
        "permissionserrorstext-withaction": "No teniu permís per a $2, {{PLURAL:$1|pel motiu següent|pels motius següents}}:",
+       "contentmodelediterror": "No podeu modificar aquesta revisió perquè el seu model de contingut és <code>$1</code>, i el model de contingut actual de la pàgina és <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Avís: esteu creant una pàgina que s'ha suprimit prèviament.'''\n\nHauríeu de considerar si és realment necessari continuar editant aquesta pàgina.\nA continuació s'ofereix el registre de supressions i de reanomenaments de la pàgina:",
        "moveddeleted-notice": "S'ha suprimit aquesta pàgina.\nA continuació us mostrem com a referència el registre d'esborraments i reanomenaments de la pàgina.",
+       "moveddeleted-notice-recent": "S’ha suprimit aquesta pàgina recentment (en les últimes 24 hores).\nA continuació us mostrem com a referència el registre de supressions i reanomenaments de la pàgina.",
        "log-fulllog": "Veure tot el registre",
        "edit-hook-aborted": "Modificació avortada pel hook.\nNo s'ha donat cap explicació.",
        "edit-gone-missing": "No s'ha pogut actualitzar la pàgina.\nSembla haver estat esborrada.",
        "defaultmessagetext": "Missatge per defecte",
        "content-failed-to-parse": "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
        "invalid-content-data": "Dades de contingut no vàlides",
-       "content-not-allowed-here": "No Ã©s permés el contingut \"$1\" a la pàgina [[$2]]",
-       "editwarning-warning": "Si sortiu d'aquesta pàgina perdreu tots els canvis que hàgiu fet.\nSi teniu un compte d'usuari, podeu eliminar aquest avís a la secció «{{int:prefs-editing}}» de les vostres preferències.",
+       "content-not-allowed-here": "No Ã©s permès el contingut \"$1\" a la pàgina [[$2]]",
+       "editwarning-warning": "Si sortiu d'aquesta pàgina, perdreu tots els canvis que hàgiu fet.\nSi teniu un compte d'usuari, podeu eliminar aquest avís en la secció «{{int:prefs-editing}}» de les vostres preferències.",
        "editpage-notsupportedcontentformat-title": "No s'admet el format del contingut",
        "editpage-notsupportedcontentformat-text": "No s'admet el format del contingut $1 pel model de contingut $2.",
        "content-model-wikitext": "wikitext",
        "expensive-parserfunction-category": "Pàgines amb massa crides de parser function",
        "post-expand-template-inclusion-warning": "Avís: La mida d'inclusió de la plantilla és massa gran.\nNo s'inclouran algunes plantilles.",
        "post-expand-template-inclusion-category": "Pàgines on s'excedeix la mida d'inclusió de les plantilles",
-       "post-expand-template-argument-warning": "Avís: Aquesta pàgina conté com a mínim un argument de plantilla que té una mida d'expansió massa llarga.\nSe n'han omès els arguments.",
+       "post-expand-template-argument-warning": "Avís: Aquesta pàgina conté com a mínim un argument de plantilla que té una mida d'expansió massa gran.\nSe n'han omès els arguments.",
        "post-expand-template-argument-category": "Pàgines que contenen arguments de plantilla que s'han omès",
        "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)",
        "parser-unstrip-recursion-limit": "S'ha excedit el límit ($1) de recursivitat no desmuntable",
        "converter-manual-rule-error": "Error detectat a la norma de conversió de llengua manual",
        "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ó.",
-       "undo-failure": "No pot desfer-se la modificació perquè hi ha edicions entre mig que hi entren en conflicte.",
+       "undo-failure": "No pot desfer-se la modificació perquè hi ha edicions intermèdies en conflicte.",
        "undo-norev": "No s'ha pogut desfer l'edició perquè no existeix o s'ha suprimit.",
        "undo-nochange": "Sembla que ja s'ha desfet la modificació.",
        "undo-summary": "Es desfà la revisió $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussió]])",
        "undo-summary-username-hidden": "Desfés la revisió $1 d'un usuari ocult",
        "cantcreateaccounttitle": "No es pot crear el compte",
        "cantcreateaccount-text": "[[User:$3|$3]] ha bloquejat la creació de comptes des d'aquesta adreça IP ('''$1''').\n\nEl motiu donat per $3 és ''$2''",
-       "cantcreateaccount-range-text": "La creació de comptes des de les adreces IP en el rang '''$1''', que inclou la vostra adreça IP ('''$4'''), ha esta blocada per [[User:$3|$3]].\n\nEl motiu donat per $3 és ''$2''",
+       "cantcreateaccount-range-text": "La creació de comptes des de les adreces IP en el rang '''$1''', que inclou la vostra adreça IP ('''$4'''), ha estat blocada per [[User:$3|$3]].\n\nEl motiu donat per $3 és ''$2''",
        "viewpagelogs": "Visualitza els registres d'aquesta pàgina",
        "nohistory": "No hi ha un historial de revisions per a aquesta pàgina.",
        "currentrev": "Revisió actual",
        "rev-deleted-no-diff": "No podeu veure aquesta comparativa perquè s'ha '''suprimit''' una de les versions.\nPotser trobareu detalls al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre d'esborrats].",
        "rev-suppressed-no-diff": "No podeu veure aquesta diferència perquè s'ha '''suprimit''' una de les revisions.",
        "rev-deleted-unhide-diff": "S'ha '''eliminat''' una de les revisions d'aquesta comparativa.\nVegeu-ne més detalls al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre de supressions].\nEncara podeu [$1 veure aquesta comparativa] si així ho desitgeu.",
-       "rev-suppressed-unhide-diff": "S¡ha '''suprimit''' una de les revisions d'aquesta comparativa.\nPodeu veure'n més detalls al [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registre de supressions].\nPodeu seguir [$1 veient aquesta comparativa] si així ho desitgeu.",
+       "rev-suppressed-unhide-diff": "S'ha <strong>suprimit</strong> una de les revisions d'aquesta comparativa.\nPodeu veure'n més detalls en el [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registre de supressions].\nEncara podeu [$1 veure aquesta comparativa] si així ho desitgeu.",
        "rev-deleted-diff-view": "S'ha '''suprimit'' una de les revisions d'aquesta comparativa.\nPodeu veure aquesta comparativa; poden haver-hi més detalls al [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registre d'esborraments].",
        "rev-suppressed-diff-view": "S'ha '''suprimit'' una de les revisions d'aquesta comparativa.\nVegeu-ne més detalls al [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registre de supressions].",
        "rev-delundel": "mostra/amaga",
        "mergehistory-go": "Mostra les edicions que es poden fusionar",
        "mergehistory-submit": "Fusiona les revisions",
        "mergehistory-empty": "No pot fusionar-se cap revisió.",
-       "mergehistory-done": "$3 {{PLURAL:$3|revisió|revisions}} de $1 s'han fusionat amb èxit a [[:$2]].",
+       "mergehistory-done": "{{PLURAL:$3|S’ha|S’han}} fusionat correctament $3 {{PLURAL:$3|revisió|revisions}} de $1 a [[:$2]].",
        "mergehistory-fail": "No s'ha pogut realitzar la fusió de l'historial, comproveu la pàgina i els paràmetres horaris.",
-       "mergehistory-fail-toobig": "No s'ha pogut realitzar la fusió de l'historial perquè es mourien més del limit de $1 {{PLURAL:$1|revisió|revisions}}.",
+       "mergehistory-fail-toobig": "No s'ha pogut fer la fusió de l'historial perquè es mourien més del límit de $1 {{PLURAL:$1|revisió|revisions}}.",
        "mergehistory-no-source": "La pàgina d'origen $1 no existeix.",
        "mergehistory-no-destination": "La pàgina de destinació $1 no existeix.",
        "mergehistory-invalid-source": "La pàgina d'origen ha de tenir un títol vàlid.",
        "search-category": "(categoria $1)",
        "search-file-match": "(coincideix amb el contingut del fitxer)",
        "search-suggest": "Volíeu dir: $1",
+       "search-rewritten": "S’hi mostren els resultats de $1. Cerqueu «$2» en comptes d’aquest.",
        "search-interwiki-caption": "Projectes germans",
        "search-interwiki-default": "Resultats de $1:",
        "search-interwiki-more": "(més)",
        "showingresultsinrange": "Es mostren a continuació fins a {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultats}} de #<strong>$2</strong> a #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> de <strong>$3</strong>|Resultats <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "La cerca no ha donat cap resultat.",
+       "search-nonefound-thiswiki": "No hi ha cap resultat que coincideixi amb la consulta en aquest lloc web.",
        "powersearch-legend": "Cerca avançada",
        "powersearch-ns": "Cerca als espais de noms:",
        "powersearch-togglelabel": "Activar:",
        "prefs-watchlist-token": "Testimoni de llista de seguiment:",
        "prefs-misc": "Altres preferències",
        "prefs-resetpass": "Canvia la contrasenya",
-       "prefs-changeemail": "Canvia de correu electrònic",
+       "prefs-changeemail": "Canvia o elimina l’adreça electrònica",
        "prefs-setemail": "Indiqueu una adreça de correu electrònic",
        "prefs-email": "Opcions de correu electrònic",
        "prefs-rendering": "Aparença",
        "rows": "Files",
        "columns": "Columnes",
        "searchresultshead": "Preferències de la cerca",
-       "stub-threshold": "Límit per a formatar l'enllaç com <a href=\"#\" class=\"stub\">esborrany</a> (en octets):",
+       "stub-threshold": "Límit per a formatar com a enllaç a esborrany ($1):",
        "stub-threshold-sample-link": "mostra",
        "stub-threshold-disabled": "Inhabilitat",
        "recentchangesdays": "Dies a mostrar en els canvis recents:",
        "prefs-help-recentchangescount": "Inclou els canvis recents, els historials de pàgines i els registres.",
        "prefs-help-watchlist-token2": "Aquesta és la clau secreta pel canal de continguts de la vostra llista de seguiment.\nQualsevol que la conegui podria llegir la vostra llista de seguiment, així que no la compartiu.\n[[Special:ResetTokens|Cliqueu aquí si voleu restaurar-la]].",
        "savedprefs": "S’han desat les vostres preferències.",
+       "savedrights": "S'han desat els permisos d'usuari de {{GENDER:$1|$1}}.",
        "timezonelegend": "Fus horari:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Utilitza l'hora per defecte del wiki ($1)",
        "timezoneregion-europe": "Europa",
        "timezoneregion-indian": "Oceà Índic",
        "timezoneregion-pacific": "Oceà Pacífic",
-       "allowemail": "Permet que altres usuaris puguin enviar-me correus electrònics",
+       "allowemail": "Permet que altres usuaris puguin enviar-me missatges per correu electrònic",
        "prefs-searchoptions": "Cerca",
        "prefs-namespaces": "Espais de noms",
        "default": "per defecte",
        "prefs-help-prefershttps": "Aquesta preferència tindrà efecte quan inicieu una nova sessió.",
        "prefswarning-warning": "Heu fet canvis a les preferències que encara no s'han desat.\nSi abandoneu la pàgina sense fer clic a «$1», les preferències no s'actualitzaran.",
        "prefs-tabs-navigation-hint": "Consell: Podeu utilitzar les tecles de cursor de dreta i esquerra per a navegar entre les pestanyes.",
-       "email-address-validity-valid": "L'adreça de correu electrònic sembla vàlida",
-       "email-address-validity-invalid": "Escriviu una adreça vàlida de correu electrònic",
        "userrights": "Gestió dels permisos d’usuari",
        "userrights-lookup-user": "Gestiona els grups d'usuari",
        "userrights-user-editname": "Introduïu un nom d'usuari:",
        "userrights-unchangeable-col": "Grups que no podeu canviar",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
-       "userrights-removed-self": "Heu suprimit els propis permisos correctament. Per tant, ja no podreu tornar a accedir a aquesta pàgina.",
+       "userrights-removed-self": "Heu suprimit els vostres propis permisos correctament. Per tant, ja no podeu tornar a accedir a aquesta pàgina.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "group-autoconfirmed": "Usuaris autoconfirmats",
        "group-bot": "Bots",
        "group-sysop": "Administradors",
        "group-bureaucrat": "Buròcrates",
-       "group-suppress": "Oversights",
+       "group-suppress": "Supressors",
        "group-all": "(tots)",
        "group-user-member": "{{GENDER:$1|usuari|usuària}}",
        "group-autoconfirmed-member": "{{GENDER:$1|usuari autoconfirmat|usuària autoconfirmada}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrador|administradora}}",
        "group-bureaucrat-member": "{{GENDER:$1|buròcrata}}",
-       "group-suppress-member": "{{GENDER:$1|supervisió}}",
+       "group-suppress-member": "{{GENDER:$1|supressor|supressora}}",
        "grouppage-user": "{{ns:project}}:Usuaris",
        "grouppage-autoconfirmed": "{{ns:project}}:Usuaris autoconfirmats",
        "grouppage-bot": "{{ns:project}}:Bots",
        "grouppage-sysop": "{{ns:project}}:Administradors",
        "grouppage-bureaucrat": "{{ns:project}}:Buròcrates",
-       "grouppage-suppress": "{{ns:project}}:Oversight",
+       "grouppage-suppress": "{{ns:project}}:Supressió",
        "right-read": "Llegir pàgines",
        "right-edit": "Modificar pàgines",
        "right-createpage": "Crear pàgines (que no són de discussió)",
        "right-upload": "Carregar fitxers",
        "right-reupload": "Carregar al damunt d'un fitxer existent",
        "right-reupload-own": "Carregar al damunt d'un fitxer que havia carregat el propi usuari",
-       "right-reupload-shared": "Carregar localment fitxers amb un nom usat en el repostori multimèdia compartit",
+       "right-reupload-shared": "Sobreescriure localment fitxers presents al repositori multimèdia compartit",
        "right-upload_by_url": "Carregar un fitxer des de l'adreça URL",
        "right-purge": "Purgar la memòria cau del lloc web sense pàgina de confirmació",
        "right-autoconfirmed": "Modificar pàgines semiprotegides",
        "right-editsemiprotected": "Edita les pàgines protegides com «{{int:protect-level-autoconfirmed}}»",
        "right-editcontentmodel": "Editar el model de contingut d'una pàgina",
        "right-editinterface": "Editar la interfície d'usuari",
-       "right-editusercssjs": "Editar els fitxers de configuració CSS i JS d'altres usuaris",
-       "right-editusercss": "Editar els fitxers de configuració CSS d'altres usuaris",
-       "right-edituserjs": "Editar els fitxers de configuració JS d'altres usuaris",
-       "right-editmyusercss": "Editeu els fitxers CSS propis",
-       "right-editmyuserjs": "Editeu els propis fitxers de JavaScript",
+       "right-editusercssjs": "Modificar els fitxers CSS i JavaScript d'altres usuaris",
+       "right-editusercss": "Modificar els fitxers CSS d'altres usuaris",
+       "right-edituserjs": "Modificar els fitxers JavaScript d'altres usuaris",
+       "right-editmyusercss": "Modificar els vostres fitxers d'usuari CSS",
+       "right-editmyuserjs": "Modificar els vostres fitxers d'usuari JavaScript",
        "right-viewmywatchlist": "Mostra la llista de seguiment pròpia",
        "right-editmywatchlist": "Edita la llista de seguiment pròpia. Tingueu en compte que algunes accions encara afegiran pàgina fins i tot sense aquest permís.",
        "right-viewmyprivateinfo": "Mostra les dades privades (p. ex., adreça electrònica o nom real)",
        "right-siteadmin": "Blocar i desblocar la base de dades",
        "right-override-export-depth": "Exportar pàgines incloent aquelles enllaçades fins a una fondària de 5",
        "right-sendemail": "Enviar missatges de correu electrònic a altres usuaris",
-       "right-passwordreset": "Veure les soŀlicituds de restabliment de contrasenya per correu electrònic",
+       "right-passwordreset": "Veure les solicituds de restabliment de contrasenya per correu electrònic",
        "right-managechangetags": "Crear i suprimir [[Special:Tags|etiquetes]] des de la base de dades",
        "right-applychangetags": "Aplica les [[Special:Tags|etiquetes]] juntament amb els canvis propis",
        "right-changetags": "Afegeix i suprimeix [[Special:Tags|etiquetes]] en revisions individuals i entrades de registre",
        "action-undelete": "recuperar aquesta pàgina",
        "action-suppressrevision": "revisar i recuperar aquesta revisió oculta",
        "action-suppressionlog": "visualitzar aquest registre privat",
-       "action-block": "blocar aquest usuari per a què no pugui editar",
+       "action-block": "blocar aquest usuari perquè no pugui editar",
        "action-protect": "canviar els nivells de protecció d'aquesta pàgina",
        "action-rollback": "desfer ràpidament les modificacions de l'últim usuari que va editar una determinada pàgina",
        "action-import": "importa pàgines des d'un altre wiki",
        "action-editcontentmodel": "editar el model de contingut d'una pàgina",
        "action-managechangetags": "crear i suprimir etiquetes de la base de dades",
        "action-applychangetags": "aplica les etiquetes juntament amb els canvis",
-       "action-changetags": "afegeix i elimina etiquetes a les revisions y entrades de registre individuals",
+       "action-changetags": "afegeix i elimina etiquetes a les revisions i les entrades de registre individuals",
        "nchanges": "$1 {{PLURAL:$1|canvi|canvis}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|des de la darrera visita}}",
        "enhancedrc-history": "historial",
        "recentchanges-legend-heading": "'''Llegenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vegeu també la [[Special:NewPages|llista de pàgines noves]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Mostra",
        "rcnotefrom": "A sota hi ha {{PLURAL:$5|el canvi|els canvis}} a partir de <strong>$3, $4</strong> (fins a <strong>$1</strong>).",
        "rclistfrom": "Mostra els canvis nous des de $3, $2",
        "rcshowhideminor": "$1 edicions menors",
        "rcshowhidemine": "$1 edicions pròpies",
        "rcshowhidemine-show": "Mostra",
        "rcshowhidemine-hide": "Amaga",
+       "rcshowhidecategorization": "$1 la categorització de la pàgina",
+       "rcshowhidecategorization-show": "Mostra",
+       "rcshowhidecategorization-hide": "Amaga",
        "rclinks": "Mostra els darrers $1 canvis en els darrers $2 dies<br />$3",
        "diff": "dif",
        "hist": "hist",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més afegides a la categoria",
        "recentchanges-page-removed-from-category": "[[:$1]] treta de la categoria",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|una pàgina|$2 pàgines}} més tretes de la categoria",
+       "autochange-username": "Canvi automàtic del MediaWiki",
        "upload": "Carregueu un fitxer",
        "uploadbtn": "Carrega un fitxer",
        "reuploaddesc": "Torna al formulari per apujar.",
        "filepageexists": "La pàgina de descripció d'aquest fitxer ja ha estat creada (<strong>[[:$1]]</strong>), però de moment no hi ha cap fitxer amb aquest nom. La descripció que heu posat no apareixerà a la pàgina de descripció. Si voleu que hi aparegui haureu d'editar-la manualment.\n[[$1|thumb]]",
        "fileexists-extension": "Ja existeix un fitxer amb un nom semblant: [[$2|thumb]]\n* Nom del fitxer que es puja: <strong>[[:$1]]</strong>\n* Nom del fitxer existent: <strong>[[:$2]]</strong>\nPotser voleu fer servir un nom més fàcil de distingir?",
        "fileexists-thumbnail-yes": "Aquest fitxer sembla ser una imatge en mida reduïda (<em>miniatura</em>). [[$1|thumb]]\nComproveu si us plau el fitxer <strong>[[:$1]]</strong>.\nSi el fitxer és la mateixa imatge a mida original, no cal carregar cap miniatura més.",
-       "file-thumbnail-no": "El nom del fitxer comença per <strong>$1</strong>.\nSembla ser una imatge de mida reduïda ''(miniatura)''.\nSi teniu la imatge en resolució completa, pugeu-la, sinó mireu de canviar-li el nom, si us plau.",
+       "file-thumbnail-no": "El nom del fitxer comença per <strong>$1</strong>.\nSembla una imatge de mida reduïda <em>(miniatura)</em>.\nSi teniu la imatge en alta resolució, pugeu-la. Si no, mireu de canviar-li el nom.",
        "fileexists-forbidden": "Ja hi existeix un fitxer amb aquest nom i no es pot sobreescriure.\nSi us plau, torneu enrere i carregueu aquest fitxer sota un altre nom. [[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "Ja hi ha un fitxer amb aquest nom al fons comú de fitxers.\nSi us plau, si encara desitgeu carregar el vostre fitxer, torneu enrera i carregueu-ne una còpia amb un altre nom. [[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Ja hi ha un fitxer amb aquest nom en el fons comú de fitxers.\nSi encara voleu pujar el fitxer, torneu enrere i pugeu-ne una còpia amb un altre nom. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Aquest fitxer és un duplicat {{PLURAL:$1|del fitxer |dels següents fitxers:}}",
        "file-deleted-duplicate": "S'ha suprimit anteriorment un fitxer idèntic a aquest ([[:$1]]). Hauríeu de comprovar el registre de supressions del fitxer abans de tornar-lo a carregar.",
        "file-deleted-duplicate-notitle": "Un fitxer idèntic a aquest fitxer havia estat suprimit abans, i també el títol. Hauríeu de demanar a algú que pugui veure les dades suprimides del fitxer que revisi la situació abans de procedir a tornar a carregar-lo.",
        "php-uploaddisabledtext": "La càrrega de fitxer està desactivada al PHP. Comproveu les opcions del fitxer file_uploads.",
        "uploadscripted": "Aquest fitxer conté codi HTML o de seqüències que pot ser interpretat equivocadament per un navegador.",
        "upload-scripted-pi-callback": "No es poden carregar arxius que continguin instruccions de processament de pàgines d'estil XML",
+       "uploaded-script-svg": "S’ha trobat l’element programable «$1» al fitxer SVG carregat.",
+       "uploaded-hostile-svg": "S’ha trobat codi CSS no segur a l’element d’estil del fitxer SVG carregat.",
+       "uploaded-event-handler-on-svg": "No es permet establir els atributs de gestió d’esdeveniments <code>$1=\"$2\"</code> en fitxers SVG.",
+       "uploaded-href-attribute-svg": "No es permeten els atributs d’«href» <code>&lt;$1 $2=\"$3\"&gt;</code> amb objectius no locals (p. ex., http:// i javascript:) als fitxers SVG.",
+       "uploaded-href-unsafe-target-svg": "S’ha trobat un element «href» amb un objectiu no segur <code>&lt;$1 $2=\"$3\"&gt;</code> al fitxer SVG carregat.",
+       "uploaded-animate-svg": "S'ha trobat l'etiqueta «animate» que pot estar canviant l'href mitjançant l'atribut <code>&lt;$1 $2=\"$3\"&gt;</code> en el fitxer SVG carregat.",
        "uploadscriptednamespace": "Aquest fitxer SVG conté un espai de noms \"$1\" no autoritzat",
        "uploadinvalidxml": "No s'ha pogut analitzar l'XML del fitxer carregat.",
        "uploadvirus": "El fitxer conté un virus! Detalls: $1",
        "upload-file-error-text": "S'ha produït un error de càrrega desconegut quan s'intentava crear un fitxer temporal al servidor. Poseu-vos en contacte amb un [[Special:ListUsers/sysop|administrador]].",
        "upload-misc-error": "S'ha produït un error de càrrega desconegut",
        "upload-misc-error-text": "S'ha produït un error desconegut durant la càrrega. Verifiqueu que l'URL és vàlid i accessible, i torneu-ho a provar. Si el problema persisteix, adreceu-vos a un [[Special:ListUsers/sysop|administrador]].",
-       "upload-too-many-redirects": "LURL conté massa redireccions",
+       "upload-too-many-redirects": "L'URL conté massa redireccions",
        "upload-http-error": "Ha ocorregut un error HTTP: $1",
        "upload-copy-upload-invalid-domain": "Les càrregues de còpia no són disponibles des d'aquest domini.",
        "upload-dialog-title": "Carrega un fitxer",
        "upload-form-label-infoform-description": "Descripció",
        "upload-form-label-usage-title": "Ús",
        "upload-form-label-usage-filename": "Nom del fitxer",
+       "foreign-structured-upload-form-label-own-work": "Això és el meu propi treball",
        "foreign-structured-upload-form-label-infoform-categories": "Categories",
        "foreign-structured-upload-form-label-infoform-date": "Data",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "També podeu provar [[Special:Upload|la pàgina de càrrega per defecte]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Entenc que esteu carregant el fitxer en un repositori compartit. Confirmo que ho estic fent seguint les condicions d'ús i les polítiques de llicenciament que s'hi apliquen.",
        "backend-fail-stream": "No s'ha pogut transmetre el fitxer $1.",
        "backend-fail-backup": "No s'ha pogut fer una còpia de seguretat del fitxer $1.",
        "backend-fail-notexists": "El fitxer $1 no existeix.",
-       "backend-fail-hashes": "No s'han pogut obtenir els resums dels fitxer per fer-ne comparació.",
+       "backend-fail-hashes": "No s'han pogut obtenir els codis hash dels fitxers per a fer-ne comparació.",
        "backend-fail-notsame": "Ja existeix un fitxer no idèntic a $1.",
        "backend-fail-invalidpath": "$1 no és un camí d'emmagatzemament vàlid.",
        "backend-fail-delete": "No s'ha pogut suprimir el fitxer $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 llegir ni escriure el fitxer \"$1\" a causa de permisos insuficients o perquè hi manquen directoris/contenidors.",
        "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\".",
+       "filejournal-fail-dbquery": "No es pot actualitzar la base de dades per a emmagatzemar el backend \"$1\".",
        "lockmanager-notlocked": "No s'ha pogut desbloquejar «$1»; no és bloquejat.",
        "lockmanager-fail-closelock": "No s'ha pogut bloquejar el fitxer per «$1».",
        "lockmanager-fail-deletelock": "No s'ha pogut suprimir el fitxer de bloqueig per «$1».",
        "lockmanager-fail-svr-release": "No s'han pogut alliberar els bloquejos al servidor $1.",
        "zip-file-open-error": "S'ha trobat un error en obrir l'arxiu ZIP per a fer-hi comprovacions.",
        "zip-wrong-format": "El fitxer especificat no és un arxiu ZIP.",
-       "zip-bad": "El fitxer està corrupte o és un arxiu ZIP iŀlegible.\nNo s'hi ha pogut comprovar la seguretat.",
+       "zip-bad": "El fitxer està corrupte o és un arxiu ZIP ilegible.\nNo s'hi ha pogut comprovar la seguretat.",
        "zip-unsupported": "El fitxer és un arxiu ZIP que utilitza facilitats no acceptades pel MediaWiki. No s'hi ha pogut realitzar la comprovació de seguretat.",
        "uploadstash": "Carrega fitxers en reserva",
        "uploadstash-summary": "Aquesta pàgina permet accedir als fitxers que han estat carregats (o estan en procés de ser carregats), però que encara no s'han publicat al wiki. Aquests fitxers només són visibles per a l'usuari que els ha carregats.",
        "img-auth-streaming": "Lectura corrent de \"$1\".",
        "img-auth-public": "La funció de img_auth.php és de sortida de fitxers d'un lloc wiki privat.\nAquest wiki està configurat com a wiki públic.\nPer seguretat, img_auth.php està desactivat.",
        "img-auth-noread": "L'usuari no té accés a la lectura de \"$1\".",
-       "http-invalid-url": "URL incorrecta: $1",
+       "http-invalid-url": "URL incorrecte: $1",
        "http-invalid-scheme": "Les URLs amb l'esquema \"$1\" no són compatibles.",
        "http-request-error": "La petició HTTP ha fallat per un error desconegut.",
        "http-read-error": "Error de lectura HTTP.",
        "upload_source_url": " (el fitxer que heu seleccionat des d'un URL vàlid i accessible públicament)",
        "upload_source_file": " (un fitxer triat del vostre ordinador)",
        "listfiles-delete": "elimina",
-       "listfiles-summary": "Aquesta pàgina especial mostra tots els fitxers carregats.\nSi filtreu per usuari només es mostraran els fitxers la versió més recent dels quals hagi estat carregada per aquell.",
+       "listfiles-summary": "Aquesta pàgina especial mostra tots els fitxers carregats.",
        "listfiles_search_for": "Cerca el nom d'un fitxer de medis:",
        "listfiles-userdoesnotexist": "El compte d’usuari «$1» no s’ha registrat.",
        "imgfile": "fitxer",
        "filehist-comment": "Comentari",
        "imagelinks": "Ús del fitxer",
        "linkstoimage": "{{PLURAL:$1|La pàgina següent enllaça|Les $1 pàgines següents enllacen}} a aquest fitxer:",
-       "linkstoimage-more": "Hi ha més de $1 {{PLURAL:$1|pàgina que enllaça|pàgines que enllaçen}} a aquest fitxer.\nLa següent llista només mostra {{PLURAL:$1|la primera d'elles|les primeres $1 d'aquestes pàgines}}.\nPodeu consultar la [[Special:WhatLinksHere/$2|llista completa]].",
+       "linkstoimage-more": "Hi ha més de $1 {{PLURAL:$1|pàgina que enllaça|pàgines que enllacen}} a aquest fitxer.\nLa següent llista només mostra {{PLURAL:$1|la primera d'aquestes pàgines|les primeres $1 d'aquestes pàgines}}.\nPodeu consultar la [[Special:WhatLinksHere/$2|llista completa]].",
        "nolinkstoimage": "No hi ha pàgines que enllacin a aquesta imatge.",
        "morelinkstoimage": "Visualitza [[Special:WhatLinksHere/$1|més enllaços]] que porten al fitxer.",
        "linkstoimage-redirect": "$1 (fitxer redirigit) $2",
        "duplicatesoffile": "{{PLURAL:$1|Aquest fitxer és un duplicat del que apareix a continuació|A continuació s'indiquen els $1 duplicats d'aquest fitxer}} ([[Special:FileDuplicateSearch/$2|vegeu-ne més detalls]]):",
        "sharedupload": "Aquest fitxer prové de $1 i pot ser utilitzat per altres projectes.",
-       "sharedupload-desc-there": "Aquest fitxer prové de $1 i pot ser utilitzat per altres projectes.\nSi us plau vegeu la [$2 pàgina de descripció del fitxer] per a més informació.",
+       "sharedupload-desc-there": "Aquest fitxer prové de $1 i pot ser utilitzat per altres projectes.\nVegeu la [$2 pàgina de descripció del fitxer] per a més informació.",
        "sharedupload-desc-here": "Aquest fitxer prové de $1 i pot ser usat per altres projectes.\nLa descripció de la seva [$2 pàgina de descripció] es mostra a continuació.",
        "sharedupload-desc-edit": "Aquest fitxer és de $1 i potser el fan servir altres projectes.\nPotser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].",
        "sharedupload-desc-create": "Aquest fitxer és de $1 i potser el fan servir altres projectes.\nPotser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].",
        "statistics-header-hooks": "Altres estadístiques",
        "statistics-articles": "Pàgines de contingut",
        "statistics-pages": "Pàgines",
-       "statistics-pages-desc": "Totes les pàgines del wiki, incloent les pàgines de discussió, redireccions, etc.",
+       "statistics-pages-desc": "Totes les pàgines del wiki, incloses les pàgines de discussió, redireccions, etc.",
        "statistics-files": "Fitxers carregats",
        "statistics-edits": "Edicions en pàgines des que el projecte {{SITENAME}} fou instal·lat",
        "statistics-edits-average": "Edicions per pàgina de mitjana",
        "pageswithprop-prophidden-long": "valor de propietat text llarg ocult ($1)",
        "pageswithprop-prophidden-binary": "valor de propietat binària oculta ($1)",
        "doubleredirects": "Redireccions dobles",
-       "doubleredirectstext": "Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.\nCada fila conté enllaços a la primera i segona redireccions, així com el destí de la segona redirecció, què generalment és la pàgina destí \"real\", a la què hauria d'apuntar la primera redirecció.\nLes entrades <del>ratllades</del> s'han resolt.",
+       "doubleredirectstext": "Aquesta pàgina llista les pàgines que redirigeixen a altres pàgines de redirecció.\nCada fila conté enllaços a la primera i la segona redireccions, així com la destinació de la segona redirecció, que generalment és la pàgina de destinació \"real\" a la qual hauria d'apuntar la primera redirecció.\nLes entrades <del>ratllades</del> s'han resolt.",
        "double-redirect-fixed-move": "S'ha reanomenat [[$1]].\nS'ha actualitzat automàticament i ara redirigeix a [[$2]].",
        "double-redirect-fixed-maintenance": "S'ha arreglat automàticament la redirecció doble de [[$1]] a [[$2]] en un treball de manteniment.",
        "double-redirect-fixer": "Supressor de dobles redireccions",
        "wantedfiles": "Fitxers demanats",
        "wantedfiletext-cat": "Els fitxers següents s'utilitzen per no existeixen. Els fitxers de repositoris aliens poden ser llistats encara que existeixin. Aquells que siguin fals positius es <del>ratllaran</del>. A més, les pàgines que tinguin fitxers incrustats que no existeixin es llistaran a [[:$1]].",
        "wantedfiletext-cat-noforeign": "Els fitxers següents s'utilitzen, però no existeixen. Addicionalment, s'enumeren a [[:$1]] les pàgines que tenen fitxers inserits que no existeixen.",
-       "wantedfiletext-nocat": "Els fitxers següents es fan servir però no existeixen. Els fitxers d'un repositori aliè poden ser llistats encara que existeixin. Tots aquells fals positius es <del>tatxaran</del>.",
+       "wantedfiletext-nocat": "Els fitxers següents es fan servir però no existeixen. Els fitxers d'un repositori aliè poden ser llistats encara que existeixin. Tots aquests falsos positius es <del>ratllaran</del>.",
        "wantedfiletext-nocat-noforeign": "Els fitxers següents s'utilitzen però no existeixen.",
        "wantedtemplates": "Plantilles demanades",
        "mostlinked": "Pàgines més enllaçades",
        "mostrevisions": "Pàgines més modificades",
        "prefixindex": "Totes les pàgines per prefix",
        "prefixindex-namespace": "Totes les pàgines amb prefix (espai de noms $1)",
+       "prefixindex-submit": "Mostra",
        "prefixindex-strip": "Suprimeix el prefix a la llista",
        "shortpages": "Pàgines curtes",
        "longpages": "Pàgines llargues",
        "deadendpages": "Pàgines atzucac",
-       "deadendpagestext": "Aquestes pàgines no tenen enllaços a d'altres pàgines del projecte {{SITENAME}}.",
+       "deadendpagestext": "Aquestes pàgines no tenen enllaços a altres pàgines del projecte {{SITENAME}}.",
        "protectedpages": "Pàgines protegides",
        "protectedpages-indef": "Només proteccions indefinides",
-       "protectedpages-summary": "Aquesta pàgina llista les pàgines existents que estan protegides actualment. Per consultar la llista de títols protegits per tal que no puguin crear-se'n pàgines, vegeu [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-summary": "Aquesta pàgina llista les pàgines existents que estan protegides actualment. Per a consultar la llista de títols protegits perquè no puguin crear-se'n pàgines, vegeu [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Només proteccions en cascada",
        "protectedpages-noredirect": "Amaga redireccions",
        "protectedpagesempty": "No hi ha cap pàgina protegida per ara",
        "protectedpages-performer": "Protecció de l'usuari",
        "protectedpages-params": "Paràmetres de protecció",
        "protectedpages-reason": "Motiu",
+       "protectedpages-submit": "Mostra les pàgines",
        "protectedpages-unknown-timestamp": "Desconegut",
        "protectedpages-unknown-performer": "Usuari desconegut",
        "protectedtitles": "Títols protegits",
        "protectedtitles-summary": "Aquesta pàgina llista títols protegits perquè no puguin crear-se'n pàgines. Per consultar una llista actual de pàgines protegides, vegeu [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "No hi ha cap títol protegit actualment amb aquests paràmetres.",
+       "protectedtitles-submit": "Mostra els títols",
        "listusers": "Llista d'usuaris",
        "listusers-editsonly": "Mostra només usuaris amb edicions",
        "listusers-creationsort": "Ordena per data de creació",
        "nopagetext": "La pàgina que heu especificat no existeix.",
        "pager-newer-n": "{{PLURAL:$1|1 posterior|$1 posteriors}}",
        "pager-older-n": "{{PLURAL:$1|anterior|$1 anteriors}}",
-       "suppress": "Oversight",
+       "suppress": "Supressió",
        "querypage-disabled": "Aquesta pàgina especial està desactivada per a no perjudicar el rendiment.",
        "apihelp": "Ajuda de l'API",
        "apihelp-no-such-module": "No s'ha trobat el mòdul \"$1\".",
        "booksources-text": "A sota hi ha una llista d'enllaços d'altres llocs que venen llibres nous i de segona mà, i també podrien tenir més informació dels llibres que esteu cercant:",
        "booksources-invalid-isbn": "El codi ISBN donat no és vàlid. Comproveu si l'heu copiat correctament.",
        "specialloguserlabel": "Realitzador:",
-       "speciallogtitlelabel": "L'objectiu (títol o usuari):",
+       "speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):",
        "log": "Registres",
        "all-logs-page": "Tots els registres públics",
        "alllogstext": "Presentació combinada de tots els registres disponibles de {{SITENAME}}.\nPodeu 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).",
        "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.",
        "categories": "Categories",
-       "categoriespagetext": "{{PLURAL:$1|La següent categoria conté|Les següents categories contenen}} pàgines, o fitxers multimèdia.\n[[Special:UnusedCategories|Les categories no usades]] no s'hi mostren.\nVegeu també [[Special:WantedCategories|les categories soŀlicitades]].",
+       "categoriespagetext": "{{PLURAL:$1|La següent categoria conté|Les següents categories contenen}} pàgines, o fitxers multimèdia.\n[[Special:UnusedCategories|Les categories no usades]] no s'hi mostren.\nVegeu també [[Special:WantedCategories|les categories solicitades]].",
        "categoriesfrom": "Mostra les categories que comencen a:",
        "special-categories-sort-count": "ordena per recompte",
        "special-categories-sort-abc": "ordena alfabèticament",
        "activeusers-hidebots": "Amaga bots",
        "activeusers-hidesysops": "Amaga administradors",
        "activeusers-noresult": "No s'han trobat usuaris.",
+       "activeusers-submit": "Mostra els usuaris actius",
        "listgrouprights": "Drets dels grups d'usuaris",
        "listgrouprights-summary": "A continuació hi ha una llista dels grups d'usuaris definits en aquest wiki, així com dels seus drets d'accés associats.\nPot ser que hi hagi més informació sobre drets individuals [[{{MediaWiki:Listgrouprights-helppage}}|aquí]].",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dret concedit</span>\n* <span class=\"listgrouprights-revoked\">Dret retirat</span>",
        "emailccsubject": "Còpia del vostre missatge a $1: $2",
        "emailsent": "Correu electrònic enviat",
        "emailsenttext": "S'ha enviat el vostre correu electrònic.",
-       "emailuserfooter": "Aquest missatge de correu electrònic l'ha enviat $1 a $2 amb la funció «{{int:emailuser}}» de {{SITENAME}}.",
+       "emailuserfooter": "Aquest missatge de correu electrònic l'ha {{GENDER:$1|enviat}} $1 a {{GENDER:$2|$2}} amb la funció «{{int:emailuser}}» de {{SITENAME}}.",
        "usermessage-summary": "Deixant missatges de sistema.",
        "usermessage-editor": "Missatger del sistema",
        "watchlist": "Llista de seguiment",
        "wlheader-showupdated": "Les pàgines que s'han canviat des de la vostra darrera visita es mostren en '''negreta'''.",
        "wlnote": "A sota hi ha {{PLURAL:$1|el darrer canvi|els darrers <strong>$1</strong> canvis}} en {{PLURAL:$2|la darrera hora|les <strong>$2</strong> darreres hores}}, a $4 del $3.",
        "wlshowlast": "Mostra les darreres $1 hores, els darrers $2 dies",
+       "watchlistall2": "tots",
+       "watchlist-hide": "Amaga",
+       "watchlist-submit": "Mostra",
+       "wlshowhideminor": "edicions menors",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "usuaris registrats",
+       "wlshowhideanons": "usuaris anònims",
+       "wlshowhidepatr": "edicions supervisades",
+       "wlshowhidemine": "les meves edicions",
        "watchlist-options": "Opcions de la llista de seguiment",
        "watching": "S'està vigilant...",
        "unwatching": "S'està desatenent...",
        "deletepage": "Elimina la pàgina",
        "confirm": "Confirma",
        "excontent": "el contingut era: «$1»",
-       "excontentauthor": "el contingut era: «$1» (i l'únic coŀlaborador era [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "el contingut era: «$1», i l'únic col·laborador era «[[Special:Contributions/$2|$2]]» ([[User talk:$2|discussió]])",
        "exbeforeblank": "el contingut abans de buidar era: '$1'",
        "delete-confirm": "Elimina «$1»",
        "delete-legend": "Elimina",
        "deletereason-dropdown": "*Motius freqüents d'esborrat\n** Brossa\n** Vandalisme\n** Violació del copyright\n** Demanada per l'autor\n** Redirecció trencada",
        "delete-edit-reasonlist": "Edita els motius d'eliminació",
        "delete-toobig": "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. L'eliminació d'aquestes pàgines està restringida per a prevenir que hi pugui haver un desajustament seriós de la base de dades de tot el projecte {{SITENAME}} per accident.",
-       "delete-warning-toobig": "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. Eliminar-la podria suposar un seriós desajustament de la base de dades de tot el projecte {{SITENAME}}; aneu en compte abans dur a terme l'acció.",
+       "delete-warning-toobig": "Aquesta pàgina té un historial d'edicions molt gran, amb més de $1 {{PLURAL:$1|canvi|canvis}}. Eliminar-la podria suposar un seriós desajustament de la base de dades de tot el projecte {{SITENAME}}; aneu amb compte abans dur a terme l'acció.",
        "deleteprotected": "No podeu eliminar la pàgina perquè ha estat protegida.",
        "deleting-backlinks-warning": "'''Avís:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Altres pàgines]] enllacen o transclouen de la pàgina que esteu a punt de suprimir.",
        "rollback": "Reverteix edicions",
        "rollbacklinkcount": "reverteix $1 {{PLURAL:$1|edició|edicions}}",
        "rollbacklinkcount-morethan": "reverteix més de $1 {{PLURAL:$1|edició|edicions}}",
        "rollbackfailed": "No s'ha pogut revocar",
-       "cantrollback": "No s'ha pogut revertir les edicions; el darrer coŀlaborador és l'únic autor de la pàgina.",
+       "cantrollback": "No s'han pogut revertir les edicions; el darrer col·laborador és l'únic autor de la pàgina.",
        "alreadyrolled": "No es pot revertir la darrera modificació de [[:$1]]\nde l'usuari [[User:$2|$2]] ([[User talk:$2|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]). Algú altre ja ha modificat o revertit la pàgina.\n\nLa darrera modificació l'ha fet l'usuari [[User:$3|$3]] ([[User talk:$3|Discussió]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "El resum d'edició és: «$1».",
        "revertpage": "Revertides les edicions de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussió]]) a l'última versió de [[User:$1|$1]]",
        "prot_1movedto2": "[[$1]] mogut a [[$2]]",
        "protect-badnamespace-title": "Espai de nom no-protectable",
        "protect-badnamespace-text": "Les pàgines en aquest espai de nom no pot ser protegit.",
-       "protect-norestrictiontypes-text": "Aquesta pàgina no es pot protegir ja que no hi ha cap tipus de restricció disponible.",
+       "protect-norestrictiontypes-text": "Aquesta pàgina no es pot protegir, ja que no hi ha cap tipus de restricció disponible.",
        "protect-norestrictiontypes-title": "Pàgina no protegible",
        "protect-legend": "Confirmeu la protecció",
        "protectcomment": "Motiu:",
        "contributions": "Contribucions de {{GENDER:$1|l’usuari|la usuària}}",
        "contributions-title": "Contribucions de l'usuari $1",
        "mycontris": "Contribucions",
+       "anoncontribs": "Contribucions",
        "contribsub2": "Per a {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
-       "nocontribs": "No s’ha trobat cap canvi que encaixessi amb aquests criteris.",
+       "nocontribs": "No s’ha trobat cap canvi que encaixés amb aquests criteris.",
        "uctop": "(actual)",
        "month": "Mes (i anteriors):",
        "year": "Any (i anteriors):",
        "sp-contributions-logs": "registres",
        "sp-contributions-talk": "discussió",
        "sp-contributions-userrights": "gestió de drets d'usuari",
-       "sp-contributions-blocked-notice": "En aquests moments, aquest compte d'usuari es troba blocat.\nPer més detalls, la última entrada del registre es mostra a continuació:",
-       "sp-contributions-blocked-notice-anon": "En aquests moments, aquesta adreça IP es troba blocada.\nPer més detalls, lúltima entrada del registre es mostra a continuació:",
+       "sp-contributions-blocked-notice": "En aquests moments aquest compte d'usuari està blocat.\nPer a més informació, a continuació es mostra l'última entrada del registre:",
+       "sp-contributions-blocked-notice-anon": "En aquests moments, aquesta adreça IP es troba blocada.\nPer més detalls, l'última entrada del registre es mostra a continuació:",
        "sp-contributions-search": "Cerca les contribucions",
        "sp-contributions-username": "Adreça IP o nom d'usuari:",
        "sp-contributions-toponly": "Mostra només les darreres revisions",
        "whatlinkshere-hidelinks": "$1 enllaços",
        "whatlinkshere-hideimages": "$1 enllaços de fitxers",
        "whatlinkshere-filters": "Filtres",
+       "whatlinkshere-submit": "Vés-hi",
        "autoblockid": "Autoblocatge #$1",
        "block": "Blocatge d'usuaris",
        "unblock": "Desblocatge d'usuaris",
-       "blockip": "Bloca {{GENDER:$1|l'usuari|l'usuària}}",
+       "blockip": "Bloca {{GENDER:$1|l'usuari|lusuària}}",
        "blockip-legend": "Bloca l'usuari",
        "blockiptext": "Empreu el següent formulari per blocar l'accés\nd'escriptura des d'una adreça IP específica o des d'un usuari determinat.\naixò només s'hauria de fer per prevenir el vandalisme, i\nd'acord amb la [[{{MediaWiki:Policy-url}}|política del projecte]].\nEmpleneu el diàleg de sota amb un motiu específic (per exemple, citant\nquines pàgines en concret estan sent vandalitzades).",
        "ipaddressorusername": "Adreça IP o nom de l'usuari",
        "emailblock": "s'ha blocat l'enviament de correus electrònics",
        "blocklist-nousertalk": "no podeu modificar la pàgina de discussió pròpia",
        "ipblocklist-empty": "La llista de bloqueigs està buida.",
-       "ipblocklist-no-results": "L'adreça IP o nom d'usuari soŀlicitat no està bloquejat.",
+       "ipblocklist-no-results": "L'adreça IP o nom d'usuari solicitat no està bloquejat.",
        "blocklink": "bloqueja",
        "unblocklink": "desbloca",
        "change-blocklink": "canvia el blocatge",
        "blocklog-showsuppresslog": "S'ha blocat i amagat aquest usuari prèviament.\nPer 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 de bloqueigs]] per veure una llista dels actuals bloqueigs operatius.",
+       "blocklogtext": "Això és una relació d'accions de bloqueig i desbloqueig. Les adreces IP bloquejades automàticament no apareixen. Vegeu la [[Special:BlockList|llista de bloqueigs]] per a 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",
        "unblock-hideuser": "No podeu desblocar aquest usuari, perquè el seu nom d'usuari està ocult.",
        "ipb_cant_unblock": "Errada: No s'ha trobat el núm. ID de bloqueig $1. És possible que ja s'haguera desblocat.",
        "ipb_blocked_as_range": "Error: L'adreça IP $1 no està blocada directament i per tant no pot ésser desbloquejada. Ara bé, sí que ho està per formar part del rang $2 que sí que pot ser desblocat.",
-       "ip_range_invalid": "Rang dIP no vàlid.",
-       "ip_range_toolarge": "No estan permesos el bloquejos de rangs més grans que /$1.",
+       "ip_range_invalid": "Rang d'IP no vàlid.",
+       "ip_range_toolarge": "No són permesos els bloquejos de rangs més grans que /$1.",
        "proxyblocker": "Bloqueig de proxy",
        "proxyblockreason": "S'ha blocat la vostra adreça IP perquè és un proxy obert. Contactau el vostre proveïdor d'Internet o servei tècnic i informau-los d'aquest seriós problema de seguretat.",
        "sorbsreason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert dins la llista negra de DNS que fa servir el projecte {{SITENAME}}.",
        "sorbs_create_account_reason": "La vostra adreça IP està llistada com a servidor intermediari (''proxy'') obert a la llista negra de DNS que utilitza el projecte {{SITENAME}}. No podeu crear-vos-hi un compte",
-       "xffblockreason": "Una adreça IP present en la capçalera X-Forwarded-For, ja sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
+       "xffblockreason": "Una adreça IP present en la capçalera X-Forwarded-For, sigui vostra o la d'un servidor proxy que esteu utilitzant, ha estat blocada. El motiu inicial del bloqueig és: $1",
        "cant-see-hidden-user": "L'usuari que esteu intentant blocar ja ha estat blocat i ocultat. Com que no teniu el permís hideuser no podeu veure ni modificar el seu blocatge.",
        "ipbblocked": "No podeu blocar o desblocar altres usuaris, perquè vós {{GENDER:|mateix|mateixa|mateix}} esteu {{GENDER:|blocat|blocada|blocat}}.",
        "ipbnounblockself": "No teniu permís per a treure el vostre bloqueig",
        "lockdb": "Bloca la base de dades",
        "unlockdb": "Desbloca la base de dades",
-       "lockdbtext": "Si es bloca la base de dades impedirà la capacitat a tots els usuaris d'editar pàgines, canviar les preferències, editar la llista de seguiment i altres canvis que calen de modificacions a la base de dades.\nConfirmeu que això és el que voleu fer, i sobretot no us oblideu de desblocar la base de dades quan acabeu el manteniment.",
+       "lockdbtext": "Bloquejar la base de dades inhabilitarà a tots els usuaris per a modificar pàgines, canviar preferències, editar la llista de seguiment i altres accions que requereixen canvis en la base de dades.\nConfirmeu que això és el que voleu fer, i sobretot no us oblideu de desblocar la base de dades quan acabeu el manteniment.",
        "unlockdbtext": "Desblocant la base de dades es restaurarà l'habilitat de tots\nels usuaris d'editar pàgines, canviar les preferències, editar els llistats de seguiment, i\naltres accions que requereixen canvis en la base de dades.\nConfirmeu que això és el que voleu fer.",
        "lockconfirm": "Sí, realment vull blocar la base de dades.",
-       "unlockconfirm": "Sí, realment vull desblocar la base dades.",
+       "unlockconfirm": "Sí, realment vull desblocar la base de dades.",
        "lockbtn": "Bloca la base de dades",
        "unlockbtn": "Desbloca la base de dades",
        "locknoconfirm": "No heu respost al diàleg de confirmació.",
        "movepagetext-noredirectfixer": "Amb el formulari següent podeu reanomenar una pàgina movent tot el seu historial al nom nou.\nEl títol anterior es convertirà en una pàgina de redirecció al nou títol. \nAssegureu-vos de verificar les redireccions [[Special:DoubleRedirects|dobles]] o [[Special:BrokenRedirects|trencades]].\nÉs responsabilitat vostra assegurar que els enllaços continuen apuntant cap a on se suposa que han d'anar. \n\nTingueu en compte que la pàgina '''no''' serà traslladada si ja existeix una pàgina amb el títol nou, tret que sigui una redirecció i no tingui més historial. \nAixò significa que podeu reanomenar de nou una pàgina al seu títol original si cometeu un error, i que no podeu sobreescriure una pàgina existent.\n \n'''Atenció!''' \nAixò pot ser un canvi dràstic i inesperat per una pàgina popular; \nassegureu-vos que sabeu el que feu abans de continuar.",
        "movepagetalktext": "La pàgina de discussió associada també serà traslladada automàticament '''tret que''':\n* Ja existeixi una pàgina de discussió no buida amb el nou nom, o\n* Desactiveu l'opció de més avall.\n\nEn aquests casos, haureu de traslladar o fusionar la pàgina manualment si ho desitgeu.",
        "moveuserpage-warning": "'''Atenció:''' Esteu a punt de moure una pàgina d'usuari. Tingueu en compte que només la pàgina es desplaçarà i que el compte d'usuari ''no'' canviarà de nom.",
-       "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es moure la pàgina i qualsevol de les pàgines a l'antiga categoria <em>no</em> es recategoritzarà automàticament en la nova.",
+       "movecategorypage-warning": "<strong>Avís:</strong> Esteu a punt de moure una pàgina de categoria. Tingueu en compte que només es mourà aquesta pàgina, i que les pàgines dins la categoria antiga <em>no</em> es recategoritzaran automàticament en la nova.",
        "movenologintext": "Heu de ser un usuari registrat i estar [[Special:UserLogin|dintre d'una sessió]]\nper reanomenar una pàgina.",
        "movenotallowed": "No teniu permís per a moure pàgines.",
        "movenotallowedfile": "No teniu el permís per a moure fitxers.",
        "cantmove-titleprotected": "No podeu moure una pàgina a aquesta ubicació, perquè s'ha protegit la creació del títol nou",
        "movetalk": "Mou la pàgina de discussió associada",
        "move-subpages": "Desplaça'n també les subpàgines (fins a $1)",
-       "move-talk-subpages": "Desplaça també les subpàgines de la pàgina de discussió (fins un màxim de $1)",
+       "move-talk-subpages": "Desplaça també les subpàgines de la pàgina de discussió (fins un màxim de $1)",
        "movepage-page-exists": "La pàgina $1 ja existeix i no pot sobreescriure's automàticament.",
        "movepage-page-moved": "La pàgina $1 s'ha traslladat a $2.",
        "movepage-page-unmoved": "La pàgina $1 no s'ha pogut moure a $2.",
        "movenosubpage": "Aquesta pàgina no té subpàgines.",
        "movereason": "Motiu:",
        "revertmove": "reverteix",
-       "delete_and_move": "Elimina i trasllada",
        "delete_and_move_text": "==Cal l'eliminació==\n\nLa pàgina de destinació, «[[:$1]]», ja existeix. Voleu eliminar-la per a fer lloc al trasllat?",
        "delete_and_move_confirm": "Sí, esborra la pàgina",
        "delete_and_move_reason": "S'ha eliminat per a permetre el reanomenament de \" [[$1]] \"",
        "export-addns": "Afegir",
        "export-download": "Ofereix desar com a fitxer",
        "export-templates": "Inclou les plantilles",
-       "export-pagelinks": "Inclou pàgines enllaçades fins una profunditat de:",
+       "export-pagelinks": "Inclou pàgines enllaçades fins una profunditat de:",
        "allmessages": "Tots els missatges del sistema",
        "allmessagesname": "Nom",
        "allmessagesdefault": "Text per defecte",
        "allmessagescurrent": "Text actual",
-       "allmessagestext": "Tot seguit hi ha una llista dels missatges del sistema que es troben a l'espai de noms ''MediaWiki''. La traducció genèrica d'aquests missatges no s'hauria de fer localment sinó a la traducció del programari MediaWiki. Si voleu ajudar-hi visiteu [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] i [//translatewiki.net translatewiki.net].",
+       "allmessagestext": "Tot seguit hi ha una llista dels missatges del sistema que es troben en l'espai de noms ''MediaWiki''. La traducció genèrica d'aquests missatges no s'hauria de fer localment sinó en la traducció del programari MediaWiki. Si voleu ajudar-hi, visiteu [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] i [//translatewiki.net translatewiki.net].",
        "allmessagesnotsupportedDB": "No es pot processar '''{{ns:special}}:Allmessages''' perquè la variable '''$wgUseDatabaseMessages''' està desactivada.",
        "allmessages-filter-legend": "Filtre",
        "allmessages-filter": "Filtra per l'estat de personalització:",
        "thumbnail_error_remote": "Missatge d'error de $1:\n$2",
        "djvu_page_error": "La pàgina DjVu està fora de l'abast",
        "djvu_no_xml": "No s'ha pogut recollir l'XML per al fitxer DjVu",
-       "thumbnail-temp-create": "No s'ha pogut creat el fitxer de miniatura temporal",
+       "thumbnail-temp-create": "No s'ha pogut crear el fitxer de miniatura temporal",
        "thumbnail-dest-create": "No es pot desar la miniatura a la destinació",
        "thumbnail_invalid_params": "Els paràmetres de les miniatures no són vàlids",
        "thumbnail_toobigimagearea": "Fitxer amb dimensions més gran que $1",
        "importuploaderrorsize": "La càrrega del fitxer d'importació ha fallat. El fitxer és més gran que la mida de càrrega permesa.",
        "importuploaderrorpartial": "La càrrega del fitxer d'importació ha fallat. El fitxer s'ha penjat només parcialment.",
        "importuploaderrortemp": "La càrrega del fitxer d'importació ha fallat. Manca una carpeta temporal.",
-       "import-parse-failure": "error en importar l'XML",
+       "import-parse-failure": "error en importar l'XML",
        "import-noarticle": "No hi ha cap pàgina per importar!",
        "import-nonewrevisions": "No s'ha importat cap revisió (ja hi eren abans o s'han omès a causa d'errors).",
        "xml-error-string": "$1 a la línia $2, columna $3 (byte $4): $5",
        "javascripttest-pagetext-unknownframework": "L'entorn de proves «$1» és desconegut.",
        "javascripttest-pagetext-unknownaction": "Acció desconeguda «$1».",
        "javascripttest-pagetext-frameworks": "Trieu un dels següents entorns de prova: $1",
-       "javascripttest-pagetext-skins": "Trieu un tema on executar-hi els tests:",
+       "javascripttest-pagetext-skins": "Trieu un tema per a executar-hi els tests:",
        "javascripttest-qunit-intro": "Consulteu la [documentació de tests de $1] a mediawiki.org.",
        "tooltip-pt-userpage": "La vostra pàgina d'usuari",
        "tooltip-pt-anonuserpage": "La pàgina d'usuari per la ip que utilitzeu",
        "tooltip-pt-mytalk": "La vostra pàgina de discussió.",
        "tooltip-pt-anontalk": "Discussió sobre les edicions per aquesta adreça ip.",
        "tooltip-pt-preferences": "Les vostres preferències.",
-       "tooltip-pt-watchlist": "La llista de pàgines de les que estau vigilant els canvis.",
+       "tooltip-pt-watchlist": "La llista de pàgines de les quals vigileu els canvis.",
        "tooltip-pt-mycontris": "Llista de les vostres contribucions.",
        "tooltip-pt-login": "Us animem a registrar-vos, però no és obligatori",
        "tooltip-pt-logout": "Finalitza la sessió d'usuari",
        "tooltip-ca-protect": "Protegeix aquesta pàgina.",
        "tooltip-ca-unprotect": "Desprotegeix aquesta pàgina",
        "tooltip-ca-delete": "Elimina aquesta pàgina",
-       "tooltip-ca-undelete": "Restaura les edicions fetes a aquesta pàgina abans de que fos esborrada.",
+       "tooltip-ca-undelete": "Restaura les edicions fetes en aquesta pàgina abans que fos esborrada.",
        "tooltip-ca-move": "Reanomena aquesta pàgina",
        "tooltip-ca-watch": "Afegiu aquesta pàgina a la vostra llista de seguiment",
        "tooltip-ca-unwatch": "Suprimiu aquesta pàgina de la vostra llista de seguiment",
        "group-bureaucrat.css": "/* El CSS d'aquí només afectarà els buròcrates */",
        "common.js": "/* Es carregarà per a tots els usuaris, i per a qualsevol pàgina, el codi JavaScript que hi haja després d'aquesta línia. */",
        "group-autoconfirmed.js": "/* Qualsevol JavaScript d'aquí es carregarà només per als usuaris autoconfirmats */",
-       "group-user.js": "/* Qualsevol JavaScript d'aquí es carregarà només per als usuaris rgistrats */",
+       "group-user.js": "/* Qualsevol JavaScript d'aquí es carregarà només per als usuaris registrats */",
        "group-bot.js": "/* Qualsevol JavaScript d'aquí es carregarà només per als bots */",
        "group-sysop.js": "/* Qualsevol JavaScript d'aquí es carregarà només per als sysops */",
        "group-bureaucrat.js": "/* Qualsevol JavaScript d'aquí es carregarà només per als buròcrates */",
        "pageinfo-robot-policy": "Indexació per robots",
        "pageinfo-robot-index": "Permès",
        "pageinfo-robot-noindex": "No permès",
-       "pageinfo-watchers": "Número d'usuaris que vigilen la pàgina",
+       "pageinfo-watchers": "Nombre d'usuaris que vigilen la pàgina",
        "pageinfo-visiting-watchers": "Nombre de vigilants de la pàgina que han visitat els canvis recents",
        "pageinfo-few-watchers": "Menys de $1 {{PLURAL:$1|observador|observadors}}",
        "pageinfo-redirects-name": "Nombre de redireccions a aquesta pàgina",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Subpàgines d'aquesta pàgina",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirecció|redireccions}}; $3 {{PLURAL:$3|no redireció|no redireccions}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirecció|redireccions}}; $3 {{PLURAL:$3|no redirecció|no redireccions}})",
        "pageinfo-firstuser": "Creador de la pàgina",
        "pageinfo-firsttime": "Data de la creació de la pàgina",
        "pageinfo-lastuser": "Últim editor",
        "pageinfo-lasttime": "Data de l'última edició",
-       "pageinfo-edits": "Número total d'edicions",
-       "pageinfo-authors": "Número total d'autors diferents",
-       "pageinfo-recent-edits": "Número d'edicions recents (en els darrers $1)",
-       "pageinfo-recent-authors": "Número recent d'autors diferents",
+       "pageinfo-edits": "Nombre total d'edicions",
+       "pageinfo-authors": "Nombre total d'autors diferents",
+       "pageinfo-recent-edits": "Nombre d'edicions recents (en els darrers $1)",
+       "pageinfo-recent-authors": "Nombre recent d'autors diferents",
        "pageinfo-magic-words": "{{PLURAL:$1|Paraula clau|Paraules clau}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Categoria oculta|Categories ocultes}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|plantilla inclosa|plantilles incloses}} ($1)",
        "file-info-png-looped": "embuclat",
        "file-info-png-repeat": "s'ha reproduït $1 {{PLURAL:$1|vegada|vegades}}",
        "file-info-png-frames": "$1 {{PLURAL:$1|fotograma|fotogrames}}",
-       "file-no-thumb-animation": "'''Nota: degut a limitacions tècniques no s'animaran les miniatures per aquest fitxer.'''",
-       "file-no-thumb-animation-gif": "''' Nota: degut a limitacions tècniques no s'animaran les miniatures d'alta resolució d'imatges GIF com aquesta.'''",
+       "file-no-thumb-animation": "<strong>Nota: per limitacions tècniques no s'animaran les miniatures per aquest fitxer.</strong>",
+       "file-no-thumb-animation-gif": "<strong>Nota: per limitacions tècniques no s'animaran les miniatures d'alta resolució d'imatges GIF com aquesta.</strong>",
        "newimages": "Galeria de fitxers nous",
        "imagelisttext": "Llista {{PLURAL:$1|d'un sol fitxer|de '''$1''' fitxers ordenats $2}}.",
        "newimages-summary": "Aquesta pàgina especial mostra els darrers fitxers carregats.",
        "saturday-at": "Dissabte a les $1",
        "sunday-at": "Diumenge a les $1",
        "yesterday-at": "Ahir a les $1",
-       "bad_image_list": "El format ha de ser el següent:\n\nNomés els elements de llista (les línies que comencin amb un *) es prenen en consideració. El primer enllaç de cada línia ha de ser el d'un fitxer dolent.\nLa resta d'enllaços de la línia són les excepcions, és a dir, les pàgines on s'hi pot encabir el fitxer.",
+       "bad_image_list": "El format ha de ser el següent:\n\nNomés els elements de llista (les línies que comencin amb un *) es prenen en consideració. El primer enllaç de cada línia ha de ser el d'un fitxer dolent.\nLa resta d'enllaços de la línia són les excepcions, és a dir, les pàgines on es pot encabir el fitxer.",
        "variantname-zh-cn": "cn",
        "variantname-zh-tw": "tw",
        "variantname-zh-hk": "hk",
        "exif-jpeginterchangeformatlength": "Octets de dades JPEG",
        "exif-whitepoint": "Cromositat del punt blanc",
        "exif-primarychromaticities": "Coordenada cromàtica del color primari",
-       "exif-ycbcrcoefficients": "Quoficients de la matriu de transformació de l'espai colorimètric",
+       "exif-ycbcrcoefficients": "Coeficients de la matriu de transformació de l'espai colorimètric",
        "exif-referenceblackwhite": "Valors de referència negre i blanc",
        "exif-datetime": "Data i hora de modificació del fitxer",
        "exif-imagedescription": "Títol de la imatge",
        "exif-exposuremode": "Mode d'exposició",
        "exif-whitebalance": "Balanç de blancs",
        "exif-digitalzoomratio": "Escala d'ampliació digital (zoom)",
-       "exif-focallengthin35mmfilm": "Distància focal per a peŀlícula de 35 mm",
+       "exif-focallengthin35mmfilm": "Distància focal per a película de 35 mm",
        "exif-scenecapturetype": "Tipus de captura d'escena",
        "exif-gaincontrol": "Control d'escena",
        "exif-contrast": "Contrast",
        "exif-gpsaltituderef": "Referència d'altitud",
        "exif-gpsaltitude": "Altitud",
        "exif-gpstimestamp": "Hora GPS (rellotge atòmic)",
-       "exif-gpssatellites": "Satèŀlits utilitzats en la mesura",
+       "exif-gpssatellites": "Satèlits utilitzats en la mesura",
        "exif-gpsstatus": "Estat del receptor",
        "exif-gpsmeasuremode": "Mode de mesura",
        "exif-gpsdop": "Precisió de la mesura",
        "exif-cameraownername": "Propietari de la càmera",
        "exif-label": "Etiqueta",
        "exif-datetimemetadata": "Data que s'ha modificat les metadades per última vegada",
-       "exif-nickname": "Nom informal de l'imatge",
+       "exif-nickname": "Nom informal de limatge",
        "exif-rating": "Valoració (sobre 5)",
        "exif-rightscertificate": "Certificat de gestió de drets",
        "exif-copyrighted": "Estat dels drets d'autor",
        "exif-originaldocumentid": "ID únic del document original",
        "exif-licenseurl": "Direcció de llicències de drets d'autor",
        "exif-morepermissionsurl": "Alternativa informació de llicència",
-       "exif-attributionurl": "Quan re-utilitzis aquest treball, si us plau posa un enllaç a",
-       "exif-preferredattributionname": "Quan re-utilitzis aquest treball, si us plau posa un credit a",
+       "exif-attributionurl": "Quan reutilitzeu aquest treball, si us plau, poseu un enllaç a",
+       "exif-preferredattributionname": "Quan reutilitzeu aquest treball, si us plau posa un credit a",
        "exif-pngfilecomment": "Comentari del fitxer PNG",
        "exif-disclaimer": "Avís general",
        "exif-contentwarning": "Advertència de contingut",
        "exif-originalimageheight": "Alçada de la imatge abans que fos retallada",
        "exif-originalimagewidth": "Amplada de la imatge abans que fos retallada",
        "exif-compression-1": "Sense compressió",
-       "exif-compression-2": "Codificació CCITT Grup 3 longitud monodimensional de Huffman modificat",
+       "exif-compression-2": "Codificació CCITT Grup 3 longitud unidimensional de Huffman modificat",
        "exif-compression-3": "Codificació de fax CCITT grup 3",
        "exif-compression-4": "Codificació de fax CCITT grup 4",
        "exif-compression-6": "JPEG (antic)",
        "exif-orientation-2": "Invertit horitzontalment",
        "exif-orientation-3": "Girat 180°",
        "exif-orientation-4": "Invertit verticalment",
-       "exif-orientation-5": "Rotat 90° en sentit antihorari i invertit verticalment",
-       "exif-orientation-6": "Rotat 90° en sentit antihorari",
-       "exif-orientation-7": "Rotat 90° en sentit horari i invertit verticalment",
-       "exif-orientation-8": "Rotat 90° en sentit horari",
+       "exif-orientation-5": "Girat 90° en sentit antihorari i invertit verticalment",
+       "exif-orientation-6": "Girat 90° en sentit antihorari",
+       "exif-orientation-7": "Girat 90° en sentit horari i invertit verticalment",
+       "exif-orientation-8": "Girat 90° en sentit horari",
        "exif-planarconfiguration-1": "a blocs densos (chunky)",
        "exif-planarconfiguration-2": "format pla",
        "exif-xyresolution-i": "$1 ppp",
        "exif-lightsource-18": "Llum estàndard B",
        "exif-lightsource-19": "Llum estàndard C",
        "exif-lightsource-24": "Bombeta de tungstè d'estudi ISO",
-       "exif-lightsource-255": "Altre font de llum",
+       "exif-lightsource-255": "Una altra font de llum",
        "exif-flash-fired-0": "No s'ha disparat el flaix",
        "exif-flash-fired-1": "Flaix disparat",
        "exif-flash-return-0": "no hi ha funció de detecció del retorn de la llum estroboscòpica",
        "exif-gpsdestdistance-k": "Quilòmetres",
        "exif-gpsdestdistance-m": "Milles",
        "exif-gpsdestdistance-n": "Milles nàutiques",
-       "exif-gpsdop-excellent": "Exceŀlent ($1)",
+       "exif-gpsdop-excellent": "Excelent ($1)",
        "exif-gpsdop-good": "Bona ($1)",
        "exif-gpsdop-moderate": "Moderada ($1)",
        "exif-gpsdop-fair": "Justa ($1)",
        "confirmemail_pending": "Ja s'ha enviat el vostre codi de confirmació per correu electrònic; si\nfa poc hi heu creat el vostre compte, abans de mirar de demanar un nou\ncodi, primer hauríeu d'esperar alguns minuts per a rebre'l.",
        "confirmemail_send": "Envia per correu electrònic un codi de confirmació",
        "confirmemail_sent": "S'ha enviat un missatge de confirmació.",
-       "confirmemail_oncreate": "S'ha enviat un codi de confirmació a la vostra adreça de correu electrònic.\nNo es requereix aquest codi per a autenticar-s'hi, però vos caldrà proporcionar-lo\nabans d'activar qualsevol funcionalitat del wiki basada en missatges\nde correu electrònic.",
+       "confirmemail_oncreate": "S'ha enviat un codi de confirmació a la vostra adreça de correu electrònic.\nAquest codi no cal per a autenticar-se, però haureu de proporcionar-lo abans d'activar qualsevol funcionalitat del wiki basada en missatges de correu electrònic.",
        "confirmemail_sendfailed": "{{SITENAME}} no ha pogut enviar el vostre missatge de confirmació.\nComproveu que l'adreça no tingui caràcters no vàlids.\n\nEl programari de correu retornà el següent missatge: $1",
        "confirmemail_invalid": "El codi de confirmació no és vàlid. Aquest podria haver vençut.",
        "confirmemail_needlogin": "Necessiteu $1 per a confirmar la vostra adreça electrònica.",
        "confirmemail_success": "S'ha confirmat la vostra adreça electrònica.\nAra podeu [[Special:UserLogin|iniciar una sessió]] i gaudir del wiki.",
        "confirmemail_loggedin": "Ja s'ha confirmat la vostra adreça electrònica.",
        "confirmemail_subject": "Confirmació de l'adreça electrònica del projecte {{SITENAME}}",
-       "confirmemail_body": "Algú, segurament vós, ha registrat el compte «$2» al projecte {{SITENAME}}\namb aquesta adreça electrònica des de l'adreça IP $1.\n\nPer a confirmar que aquesta adreça electrònica us pertany realment\ni així activar les opcions de correu del programari, seguiu aquest enllaç:\n\n$3\n\nSi *no* heu estat qui ho ha fet, seguiu aquest altre enllaç per a canceŀlar la confirmació demanada:\n\n$5\n\nAquest codi de confirmació caducarà a $4.",
+       "confirmemail_body": "Algú, segurament vós, ha registrat el compte «$2» al projecte {{SITENAME}}\namb aquesta adreça electrònica des de l'adreça IP $1.\n\nPer a confirmar que aquesta adreça electrònica us pertany realment\ni així activar les opcions de correu del programari, seguiu aquest enllaç:\n\n$3\n\nSi *no* heu estat qui ho ha fet, seguiu aquest altre enllaç per a cancelar la confirmació demanada:\n\n$5\n\nAquest codi de confirmació caducarà a $4.",
        "confirmemail_body_changed": "Algú, segurament vós, des de l'adreça IP $1, ha canviat al projecte {{SITENAME}} l'adreça de correu del compte \"$2\" a aquesta adreça.\n\nPer confirmar que aquest compte realment us pertany i per reactivar\nles opcions de correu a {{SITENAME}}, obriu el següent enllaç al vostre navegador:\n\n$3\n\nSi el compte *no* us pertany, seguiu l'enllaç següent\nper a cancel·lar la confirmació d'adreça de correu:\n\n$5\n\nAquest codi de confirmació expirarà el $4.",
        "confirmemail_body_set": "Algú, probablement vós, des de l'adreça IP $1, \nha establert aquesta adreça de correu electrònic com la del compte «$2» del lloc {{SITENAME}}. \n\nPer confirmar que aquest compte realment us pertany i reactivar \nles facilitats de correu electrònic a {{SITENAME}}, cal que obriu al navegador aquest enllaç:\n\n$3\n\nSi el compte *no* us pertany, cancel·leu l'adreça de correu electrònic seguint aquest enllaç: \n\n$5\n\nAquest codi de confirmació caducarà el $4.",
-       "confirmemail_invalidated": "Confirmació d'adreça electrònica canceŀlada",
-       "invalidateemail": "Canceŀlació d'adreça electrònica",
+       "confirmemail_invalidated": "Confirmació d'adreça electrònica cancelada",
+       "invalidateemail": "Cancelació d'adreça electrònica",
        "scarytranscludedisabled": "[S'ha inhabilitat la transclusió interwiki]",
        "scarytranscludefailed": "[Ha fallat la recuperació de la plantilla per a $1]",
        "scarytranscludefailed-httpstatus": "[Ha fallat la recuperació de la plantilla per a $1: HTTP $2]",
        "duplicate-displaytitle": "<strong>Avís:</strong> El títol a mostrar «$2» sobreescriu l'anterior títol a mostrar «$1».",
        "invalid-indicator-name": "<strong>Error:</strong> No pot estar buit l'atribut <code>name</code> dels indicadors d'estat de la pàgina.",
        "version": "Versió",
-       "version-extensions": "Extensions instaŀlades",
+       "version-extensions": "Extensions instalades",
        "version-skins": "Temes instal·lats",
        "version-specialpages": "Pàgines especials",
        "version-parserhooks": "Extensions de l'analitzador",
        "version-poweredby-others": "altres",
        "version-poweredby-translators": "Traductors de translatewiki.net",
        "version-credits-summary": "El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]",
-       "version-license-info": "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, ja sigui de la seva versió 2 o (a elecció vostra) qualsevol versió posterior. \n\nMediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a  la Llicència Pública General GNU.\n\nAmb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].",
+       "version-license-info": "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, sigui de la seva versió 2 o (a elecció vostra) de qualsevol versió posterior. \n\nMediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a  la Llicència Pública General GNU.\n\nAmb aquest programa heu d'haver rebut [{{SERVER}}{{SCRIPTPATH}}/COPYING una còpia de la Llicència Pública General GNU]; si no és així, adreceu-vos a la Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA o bé [//www.gnu.org/licenses/old-licenses/gpl-2.0.html llegiu-la en línia].",
        "version-software": "Programari instal·lat",
        "version-software-product": "Producte",
        "version-software-version": "Versió",
        "specialpages-group-developer": "Eines de desenvolupador",
        "blankpage": "Pàgina en blanc",
        "intentionallyblankpage": "Pàgina intencionadament en blanc",
-       "external_image_whitelist": " #Deixeu aquesta línia exactament igual com està<pre>\n#Poseu fragments d'expressions regulars (regexps) (només la part entre els //) a sota\n#Aquests fragments es correspondran amb les URL d'imatges externes\n#Se'n mostraran com a imatges si coincideixen, i sinó es mostraran com a enllaços\n#Les línies que comencen amb un # es tracten com a comentaris\n#S'hi distingeixen majúscules i minúscules\n\n#Poseu tots els fragments regex al damunt d'aquesta línia. Deixeu aquesta línia exactament com està</pre>",
+       "external_image_whitelist": " #Deixeu aquesta línia exactament igual com està.<pre>\n#Poseu fragments d'expressions regulars (regex) (només la part entre els //) a sota.\n#Aquests fragments es correspondran amb els URL d'imatges externes.\n#Es mostraran com a imatges si coincideixen, i si no es mostraran com a enllaços.\n#Les línies que comencen amb un # es tracten com a comentaris.\n#S'hi distingeixen majúscules i minúscules.\n\n#Poseu tots els fragments regex al damunt d'aquesta línia. Deixeu aquesta línia exactament com està.</pre>",
        "tags": "Etiquetes de canvi vàlides",
        "tag-filter": "Filtre d'[[Special:Tags|etiquetes]]:",
        "tag-filter-submit": "Filtra",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etiqueta|Etiquetes}}]]: $2)",
        "tags-title": "Etiquetes",
-       "tags-intro": "Aquesta pàgina llista les etiquetes amb les què el programari pot marcar una modificació, i llur significat.",
+       "tags-intro": "Aquesta pàgina llista les etiquetes amb què el programari pot marcar una modificació, i el seu significat.",
        "tags-tag": "Nom de l'etiqueta",
        "tags-display-header": "Aparença de la llista de canvis",
        "tags-description-header": "Descripció completa del significat",
        "tags-create-submit": "Crea",
        "tags-create-no-name": "Heu d'especificar un nom d'etiqueta.",
        "tags-create-invalid-chars": "Els noms d'etiqueta no han de contenir comes (<code>,</code>) o barres (<code>/</code>).",
-       "tags-create-invalid-title-chars": "Els noms d'etiqueta no poden contenir caracters que no es poden usar en els títols de pàgina",
+       "tags-create-invalid-title-chars": "Els noms d'etiqueta no poden contenir caràcters que no es poden usar en els títols de pàgina.",
        "tags-create-already-exists": "L'etiqueta \"$1\" ja existeix.",
        "tags-create-warnings-above": "{{PLURAL:$2|S'ha registrat la següent advertència|S'han registrat les següents advertències}} durant la creació de l'etiqueta \"$1\":",
        "tags-create-warnings-below": "Voleu continuar creant l'etiqueta?",
        "tags-apply-not-allowed-multi": "No es permet aplicar manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-update-no-permission": "No teniu permisos per a afegir o suprimir etiquetes de canvi de revisions individuals o entrades de registre.",
        "tags-update-add-not-allowed-one": "No es permet afegir manualment l'etiqueta «$1».",
-       "tags-update-add-not-allowed-multi": "No es permet afegir manualment {{PLURAL:$2|letiqueta següent|les etiquetes següents}}: $1",
+       "tags-update-add-not-allowed-multi": "No es permet afegir manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-update-remove-not-allowed-one": "No es permet treure l’etiqueta «$1».",
-       "tags-update-remove-not-allowed-multi": "No es permet eliminar manualment {{PLURAL:$2|letiqueta següent|les etiquetes següents}}: $1",
+       "tags-update-remove-not-allowed-multi": "No es permet eliminar manualment {{PLURAL:$2|l'etiqueta següent|les etiquetes següents}}: $1",
        "tags-edit-title": "Modifica les etiquetes",
        "tags-edit-manage-link": "Gestiona les etiquetes",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Revisió seleccionada|Revisions seleccionades}} de [[:$2]]:",
+       "tags-edit-logentry-legend": "Afegeix o suprimeix etiquetes {{PLURAL:$1|d'aquesta entrada del registres|de totes les entrades del registre}}",
        "tags-edit-existing-tags": "Etiquetes existents:",
        "tags-edit-existing-tags-none": "''Cap''",
        "tags-edit-new-tags": "Etiquetes noves:",
        "tags-edit-chosen-placeholder": "Seleccioneu algunes etiquetes",
        "tags-edit-chosen-no-results": "No s’han trobat coincidències d’etiquetes",
        "tags-edit-reason": "Motiu:",
+       "tags-edit-revision-submit": "Aplica els canvis a {{PLURAL:$1|a aquesta revisió|$1 revisions}}",
+       "tags-edit-logentry-submit": "Aplica els canvis a {{PLURAL:$1|aquesta entrada de registre|$1 entrades de registre}}",
        "tags-edit-success": "S’han aplicat els canvis correctament.",
        "tags-edit-failure": "No s’han pogut aplicar els canvis:\n$1",
        "tags-edit-nooldid-title": "Revisió de l'objectiu no vàlida",
        "htmlform-select-badoption": "El valor que heu especificat no és una opció vàlida.",
        "htmlform-int-invalid": "El valor que heu especificat no és un nombre enter.",
        "htmlform-float-invalid": "El valor especificat no és un nombre.",
-       "htmlform-int-toolow": "El valor que heu especifcat està per sota del mínim de $1",
+       "htmlform-int-toolow": "El valor que heu especificat està per sota del mínim de $1.",
        "htmlform-int-toohigh": "El valor que heu especificat està per sobre del màxim de $1",
        "htmlform-required": "Aquest valor és necessari",
        "htmlform-submit": "Tramet",
        "htmlform-cloner-required": "Cal com a mínim un valor.",
        "htmlform-title-badnamespace": "[[:$1]] no es troba en l'espai de noms \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" és un títol de pàgina no editable",
-       "htmlform-title-not-exists": "[[:$1]] no existeix.",
+       "htmlform-title-not-exists": "$1 no existeix.",
        "htmlform-user-not-exists": "<strong>$1</strong> no existeix.",
        "htmlform-user-not-valid": "<strong>$1</strong> no és nom d'usuari vàlid.",
-       "sqlite-has-fts": "$1, amb suport de búsqueda de text íntegre",
-       "sqlite-no-fts": "$1, sense supor de búsqueda de text íntegre",
+       "sqlite-has-fts": "$1, amb suport de cerca de text íntegre",
+       "sqlite-no-fts": "$1, sense supor de cerca de text íntegre",
        "logentry-delete-delete": "$1 {{GENDER:$2|ha esborrat}} la pàgina $3",
        "logentry-delete-restore": "$1 ha restaurat $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ha canviat}} la visibilitat {{PLURAL:$5|d'un esdeveniment al registre|de $5 esdeveniments al registre}} de $3: $4",
        "revdelete-uname-unhid": "ha revelat un nom d'usuari que era ocult",
        "revdelete-restricted": "ha aplicat restriccions als administradors",
        "revdelete-unrestricted": "ha tret les restriccions als administradors",
-       "logentry-block-block": "$1 {{GENDER:$2|ha estat blocat|ha estat blocada}} {{GENDER:$4|$3}} per un període de temps de $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un temps de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|va desblocar}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració del blocatge de {{GENDER:$4|$3}} per un període de temps de $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un període de temps de $5 $6",
-       "logentry-suppress-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració de blocatge de {{GENDER:$4|$3}} per un període de temps de $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració del blocatge de {{GENDER:$4|$3}} per un temps de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|ha blocat}} {{GENDER:$4|$3}} per un temps de $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|ha canviat}} la configuració de blocatge de {{GENDER:$4|$3}} per un temps de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|va importar}} $3 a través de càrrega de fitxer",
        "logentry-import-interwiki": "$1 {{GENDER:$2|va importar}} $3 d'un altre wiki",
        "logentry-merge-merge": "$1 {{GENDER:$2|ha fusionat}} $3 en $4 (revisions fins a $5)",
        "logentry-newusers-create2": "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1",
        "logentry-newusers-byemail": "El compte d'usuari $3 {{GENDER:$2|ha estat creat}} per $1 i la contrasenya ha estat enviada per correu electrònic",
        "logentry-newusers-autocreate": "El compte d'usuari $1 {{GENDER:$2|ha estat creat}} automàticament",
+       "logentry-protect-protect": "$1 {{GENDER:$2|ha protegit}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|ha protegit}} $3 $4 [en cascada]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ha canviat}} el nivell de protecció de $3 $4 [en cascada]",
        "logentry-rights-rights": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3 de $4 a $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ha canviat}} la pertinença de grup per $3",
        "logentry-rights-autopromote": "$1 ha estat {{GENDER:$2|promogut}} automàticament de $4 a $5",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ha carregat}} una nova versió de $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|ha carregat}} $3",
        "log-name-managetags": "Registre de gestió d'etiquetes",
-       "log-description-managetags": "Aquesta pàgina té llistades les tasques de gestió referents a les [[Special:Tags|etiquetes]]. El registre conté només les accions dutes a terme manuament per un administrador; algunes etiquetes poden ser creades o eliminades pel programari wiki sense deixar inventariada una entrada en aquest registre.",
+       "log-description-managetags": "Aquesta pàgina té llistades les tasques de gestió referents a les [[Special:Tags|etiquetes]]. El registre conté només les accions dutes a terme manualment per un administrador; algunes etiquetes poden ser creades o eliminades pel programari wiki sense deixar inventariada una entrada en aquest registre.",
        "logentry-managetags-create": "$1 {{GENDER:$2|va crear}} l'etiqueta «$4»",
        "logentry-managetags-activate": "$1 {{GENDER:$2|ha activat}} l'etiqueta \"$4\" per a ser utilitzada en usuaris i bots",
        "logentry-managetags-deactivate": "$1 {{GENDER:$2|ha desactivat}} l'etiqueta \"$4\" per a ser utilitzada en usuaris i bots",
        "feedback-bugcheck": "Fantàstic! Comproveu que no sigui un dels [$1 problemes ja coneguts].",
        "feedback-bugnew": "Ja ho he comprovat. Informeu d'un nou problema",
        "feedback-bugornote": "Si podeu descriure un problema tècnic en detall, [$1 informeu-ne].\nAltrament, podeu fer servir un senzill formulari a continuació. El vostre comentari s'afegirà a la pàgina «[$3 $2]», juntament amb el vostre nom d'usuari i el navegador que esteu emprant.",
-       "feedback-cancel": "Canceŀla",
+       "feedback-cancel": "Cancela",
        "feedback-close": "Fet",
        "feedback-external-bug-report-button": "Arxiva una tasca tècnica",
        "feedback-dialog-title": "Envia el comentari",
        "api-error-publishfailed": "Error intern: el servidor no ha pogut publicar el fitxer temporal.",
        "api-error-stasherror": "S'ha produït un error en carregar el fitxer al dipòsit.",
        "api-error-stashedfilenotfound": "No s'ha trobat el fitxer de l'espai temporal quan es provava de carregar-lo d'allà.",
-       "api-error-stashpathinvalid": "El camí on s'havia trobar el fitxer de l'espai temporal no és vàlid.",
+       "api-error-stashpathinvalid": "El camí on s'havia de trobar el fitxer de l'espai temporal no és vàlid.",
        "api-error-stashfilestorage": "S'ha produït un error en emmagatzemar el fitxer en l'espai temporal.",
        "api-error-stashzerolength": "El servidor no ha pogut desar el fitxer a l'espai temporal perquè tenia longitud zero.",
        "api-error-stashnotloggedin": "Cal haver iniciat una sessió per desar fitxers en l'espai temporal de càrrega.",
        "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}}",
+       "duration-millennia": "$1 {{PLURAL:$1|mil·lenni|mil·lennis}}",
        "rotate-comment": "Imatge girada $1 {{PLURAL:$1|grau|graus}} en el sentit de les agulles del rellotge",
        "limitreport-title": "Perfil de dades de l'analitzador:",
        "limitreport-cputime": "Temps d'ús de CPU",
        "limitreport-templateargumentsize": "Mida de l'argument de plantilla",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Profunditat màxima d'expansió",
-       "limitreport-expensivefunctioncount": "Número de funcions d'anàlisi dispendioses",
+       "limitreport-expensivefunctioncount": "Nombre de funcions d'anàlisi dispendioses",
        "expandtemplates": "Expansió de plantilles",
        "expand_templates_intro": "Aquesta pàgina especial expandeix de forma recursiva totes les plantilles d'un text donat.\nTambé expandeix les funcions sintàctiques, com ara <code><nowiki>{{</nowiki>#language:…}}</code>, i les variables predefinides, com <code><nowiki>{{</nowiki>CURRENTDAY}}</code> &mdash;de fet, gairebé tot que estigui entre claus dobles.",
        "expand_templates_title": "Títol per contextualitzar ({{FULLPAGENAME}}, etc):",
        "special-characters-group-ipa": "AFI",
        "special-characters-group-symbols": "Símbols",
        "special-characters-group-greek": "Grec",
-       "special-characters-group-cyrillic": "Ciríŀlic",
+       "special-characters-group-cyrillic": "Cirílic",
        "special-characters-group-arabic": "Aràbic",
        "special-characters-group-arabicextended": "Aràbic estès",
        "special-characters-group-persian": "Persa",
index 00281c2..f6b416c 100644 (file)
@@ -50,7 +50,7 @@
        "tog-showhiddencats": "Гайта къайлаха йолу категореш",
        "tog-norollbackdiff": "Юха яьккхиначул тӀаьхьа ма гайта версийн башхо",
        "tog-useeditwarning": "Хаамбе бина хийцамаш дӀаязцабеш аса болх дӀатосучу хенахь",
-       "tog-prefershttps": "Ð\94аима Ð»ÐµÐ»Ð° Ð¹Ðµ Ð»Ð°Ñ\80дина Ñ\81иÑ\81Ñ\82емин Ñ\87Ñ\83далар",
+       "tog-prefershttps": "СиÑ\81Ñ\82емин Ð´Ð¾Ð²Ð·Ð¸Ð¹Ñ\82ина Ñ\87Ñ\83л Ñ\82Ó\80еÑ\85Ñ\8cа Ð´Ð°Ð¸Ð¼Ð°Ð½ Ð»ÐµÐ»Ð°Ð´Ðµ Ð»Ð°Ñ\80дина Ð²Ð¾Ð²Ñ\88аÑ\85Ñ\82аÑ\81ар",
        "underline-always": "Даимна",
        "underline-never": "Цкъа а",
        "underline-default": "Лелае браузеран нисярца",
        "november-date": "Ноябрь $1",
        "december-date": "Декабрь $1",
        "pagecategories": "{{PLURAL:$1|1=Категори|Категореш}}",
-       "category_header": "АгӀонаш категоречохь «$1»",
+       "category_header": "«$1» категори чура агӀонаш",
        "subcategories": "Бухаркатегореш",
        "category-media-header": "Файлаш оцу категори чохь «$1»",
-       "category-empty": "''ХӀара категори хӀинца йаьсса ю.''",
+       "category-empty": "''ХӀара категори хӀинца яьсса ю.''",
        "hidden-categories": "{{PLURAL:$1|1=Къайлаха категори|Къайлаха йолу категореш}}",
        "hidden-category-category": "Къайлаха йолу категореш",
        "category-subcat-count": "{{PLURAL:$2|ХӀокху категори чохь ю хӀокхуьнан бухара категори.|ХӀокху категори чохь ю $1 {{PLURAL:$1|бухара категори|бухара категореш}} $2 массо нах.}}",
        "morenotlisted": "ХӀара могӀа буьззина бац.",
        "mypage": "Долахь йолу агӀо",
        "mytalk": "Сан дийцаре агӀо",
-       "anontalk": "Дийцаре хӀокху IP-адресна",
+       "anontalk": "Дийцаре",
        "navigation": "Навигаци",
        "and": "&#32;а",
        "qbfind": "Лахар",
        "databaseerror-query": "Дехар: $1",
        "databaseerror-function": "Функци: $1",
        "databaseerror-error": "ГӀалат: $1",
-       "laggedslavemode": "Тергам бе: агӀона чохь керла йаьхинарш ца хила мега.",
+       "laggedslavemode": "Тергам бе: агӀон чохь керла яьхнарш ца хила мега.",
        "readonly": "Блоктоьхна дӀайаздар хаамийн бухе",
        "enterlockreason": "Билгалде блоктохаран бахьана а, и чекх йолу хан а.",
        "readonlytext": "АгӀонаш тӀетохар а, кхин хийцамаш барна а блоктоьхна:\nБлокоьхначо биттина хаам: $1.",
        "translateinterface": "ХӀокху хааман гоч тӀетоха я хийца дехар до лелае локализацин сайт MediaWiki [//translatewiki.net/ translatewiki.net].",
        "cascadeprotected": "АгӀо хийцам ца байта ларйина ю {{PLURAL:$1|хӀокху агӀона|хӀокху агӀонийн}} юкъа йогӀуш хилар бахьнехь:\n$2",
        "namespaceprotected": "ХӀан бакъо яц анна цӀерш чохь тадарш да «$1».",
-       "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
-       "customjsprotected": "Хьан бакъо яц хӀара JavaScript-агӀо тая, иза кхечу декъашхочун гӀерс болу дера.",
-       "mycustomcssprotected": "Хьан бакъо яц хӀара CSS агӀо тая.",
+       "customcssprotected": "Хьан бакъо яц хӀара CSS-агӀо таян, иза кхечу декъашхочун гӀирс болу дера.",
+       "customjsprotected": "Хьан бакъо яц хӀара JavaScript-агӀо таян, иза кхечу декъашхочун гӀирс болу дера.",
+       "mycustomcssprotected": "Хьан бакъо яц хӀара CSS агӀо таян.",
        "mycustomjsprotected": "Хьан бакъо яц JavaScript агӀо тая.",
        "myprivateinfoprotected": "Хьайн долара хаамна хийцам ба хьа йиш яц",
        "mypreferencesprotected": "Хьай гӀирс нисбан хьа бакъо яц.",
        "createacct-yourpasswordagain": "Бакъе пароль",
        "createacct-yourpasswordagain-ph": "Кхин цкъа язъе пароль",
        "remembermypassword": "Даглаца сан дӀаяздар хӀокху компьютеран тӀехь (цхьан $1 {{PLURAL:$1|дийнахь}})",
-       "userlogin-remembermypassword": "Ð\94агаÑ\85Ñ\8c Ð»Ð°Ñ\82Ñ\82 Ð²Ðµ/е Ñ\81о",
+       "userlogin-remembermypassword": "СиÑ\81Ñ\82емин Ñ\87оÑ\85Ñ\8c Ó\80ойла",
        "userlogin-signwithsecure": "Ларийна цхьаьнакхетар",
        "yourdomainname": "Хьан машан меттиг:",
        "password-change-forbidden": "Хьан йиш яц хӀокху вики чохь пароль хийца.",
        "externaldberror": "Арахьара хаамийн базан гӀоьнца аутентификаци ечу хенахь гӀалат даьлла я хьа дӀаяздаран хийцам бан бакъонаш яц.",
-       "login": "Системин чугӀо",
-       "nav-login-createaccount": "СиÑ\81Ñ\82емин Ñ\87Ñ\83гÓ\80о / Ð´Ó\80аÑ\8fздаÑ\80 ÐºÑ\85олла",
+       "login": "Системин довзийтар",
+       "nav-login-createaccount": "Ð\94овзийÑ\82аÑ\80 / Ð´Ó\80аÑ\8fздаÑ\80 ÐºÑ\85оллаÑ\80",
        "userlogin": "Довзийтар я декъашхочун дӀаяздар кхоллар",
        "userloginnocreate": "Довзийта",
        "logout": "Болх дӀаберзор",
        "userlogout": "Болх дӀаберзор",
-       "notloggedin": "Ð¥Ó\80инÑ\86а Ð° Ð°Ñ\85Ñ\8cа Ñ\81иÑ\81Ñ\82емин Ñ\87оÑ\85Ñ\8c Ð±Ð¾Ð»Ñ\85 Ð±ÐµÑ\88 Ð±Ð°Ñ\86",
+       "notloggedin": "ЦÓ\80аÑ\80Ñ\86а Ð´Ð¾Ñ\86Ñ\83Ñ\88",
        "userlogin-noaccount": "Декъашхочун дӀаяздар дац хьа?",
        "userlogin-joinproject": "Проектехь дӀаяздар кхоллар",
        "nologin": "Декъашхочун дӀаяздар дац хьа? '''$1'''.",
        "createaccountreason": "Бахьана:",
        "createacct-reason": "Бахьана",
        "createacct-reason-ph": "Стен кхуллуш ду ахьа керла декъашхочун дӀаяздар",
-       "createacct-captcha": "Кхерамзалла хьажар",
-       "createacct-imgcaptcha-ph": "ДӀаязде хьайна лакхахь гуш долу йоза",
        "createacct-submit": "Кхолла декъашхочун дӀаяздар",
        "createacct-another-submit": "Кхолла декъашхочун кхин дӀаяздар",
        "createacct-benefit-heading": "{{SITENAME}} кхолийна хьо санначу наха.",
        "oldpassword": "Шираелла пароль:",
        "newpassword": "Керла пароль:",
        "retypenew": "Юха язъйе керла пароль:",
-       "resetpass_submit": "Пароль дӀахӀоттийна системин чугӀо",
+       "resetpass_submit": "Пароль дӀахӀоттийна а системин чугӀо",
        "changepassword-success": "Хьан пароль кхиамца хийцина!",
        "changepassword-throttled": "Хьо дукха гӀиртира.\nДехар до, собар де $1 юха гӀортале.",
        "resetpass_forbidden": "Пароль хийца йиш яц",
        "passwordreset-emailtext-ip": "{{SITENAME}} ($4) проектехь цхьам я ахьа хӀокху IP-адрес $1 тӀера хьа декъашхочун пароль кхоссар дехна,\nоьцу электронан адресца дихкина ду {{PLURAL:$3|1хӀара декъашхочун дӀаяздар|хӀара декъашхочун дӀаяздар}}:\n\n$2\n\n{{PLURAL:$3|ХӀара хана пароль|ХӀара хана паролаш}} лелар ю {{PLURAL:$5|$5 дийнахь}}.\nСистемин чугӀой харжа керла пароль. \nХьой пароль кхоссар дехна дацахь я хьалхалера пароль дага еънехь хӀума цадеш Ӏад битта хӀара хаам хьа йиш ю шира пароль лелаян.",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) проектера декъашхочо $1 хьа декъашхочун пароль кхоссар дехна,\nоьцу электронан адресца дихкина ду {{PLURAL:$3|1хӀара декъашхочун дӀаяздар|хӀара декъашхочун дӀаяздар}}:\n\n$2\n\n{{PLURAL:$3|ХӀара хана пароль|ХӀара хана паролаш}} лелар ю {{PLURAL:$5|$5 дийнахь}}.\nСистемин чугӀой харжа керла пароль. \nХьой пароль кхоссар дехна дацахь я хьалхалера пароль дага еънехь хӀума цадеш Ӏад битта хӀара хаам хьа йиш ю шира пароль лелаян.",
        "passwordreset-emailelement": "Декъашхочун цӀе: \n$1\n\nХанна йолу пароль: \n$2",
-       "passwordreset-emailsent": "Электронан хаам баийтина кхоьссинчу паролах лаьцна хаам чохь болуш.",
+       "passwordreset-emailsentemail": "Электронан хаам баийтина кхоьссинчу паролах лаьцна хаам чохь болуш.",
        "passwordreset-emailsent-capture": "Электронан хаам баийтина кхоьссинчу паролах лаьцна хаам чохь болуш. \nцуна йозане хьажа йиш ю лахахь.",
        "passwordreset-emailerror-capture": "Пароль кхоссаран хаам чохь болуш электронан кехат кхоьллина, цуна йоза хьажа йиш ю лахахь, амма иза {{GENDER:$2|декъашхочунга}} дӀадахьийта тар цаделира бахьнехь: $1",
        "changeemail": "Хийца электронан пошт",
        "resettokens-watchlist-token": "Веб-каналан (Atom/RSS) токен  [[Special:Watchlist|хьан тергаме могӀанан чура агӀонашна хийцамаш бар]]",
        "resettokens-done": "Токенаш кхиссина.",
        "resettokens-resetbutton": "Къастина токенаш кхоссар",
-       "bold_sample": "Ð\94еÑ\80Ñ\81Ñ\82ино Ð´Ð¾ Ð¹Ð¾Ð·Ð°",
-       "bold_tip": "Ð\94еÑ\80Ñ\81Ñ\82ино Ð´Ð¾ Ð¹Ð¾Ð·Ð°",
-       "italic_sample": "СеÑ\82Ñ\82ан Ð´Ð¾ Ð¹Ð¾Ð·Ð°",
-       "italic_tip": "СеÑ\82Ñ\82ан Ð´Ð¾ Ð¹Ð¾Ð·Ð°",
+       "bold_sample": "Ð\99оза Ó\80аÑ\8cÑ\80жа ÐºÑ\8aаÑ\81Ñ\82оÑ\80",
+       "bold_tip": "Ð\99оза Ó\80аÑ\8cÑ\80жа ÐºÑ\8aаÑ\81Ñ\82оÑ\80",
+       "italic_sample": "Ð\9aÑ\83Ñ\80Ñ\81иваÑ\86а ÐºÑ\8aаÑ\81Ñ\82оÑ\80",
+       "italic_tip": "Ð\9aÑ\83Ñ\80Ñ\81иваÑ\86а ÐºÑ\8aаÑ\81Ñ\82оÑ\80",
        "link_sample": "Хьажориган коьрта могlа",
        "link_tip": "Чоьхьа хьажорг",
        "extlink_sample": "http://www.example.com хьажорг корта",
        "explainconflict": "Ахьа хӀара агӀо тоечу хенахь, цхьам хийцамаш бина.\nЛакхарчу таяран корехь хьона гуш ду хӏинца агӏона чохь долу йоза.\nЛахарчу корехь ахь бина хийцам бу.\nХьой бина хийцам лахарчу корера лакхарчу коре баккха.\nКнопкан «{{int:savearticle}}» тӏетаӏича лакхара корера йоза дӏаязлурду.",
        "yourtext": "Хьан йоза",
        "storedversion": "Ӏалашйина верси",
-       "editingold": "'''ДӀахьедар. Ахьа таеш ю хӀокху агӀона шира елла верси.'''\nАгӀо Ӏалаш йинчул тӀехьа хьалхо бина хийцамаш дӀабяра бу.",
+       "editingold": "'''ДӀахьедар. Ахь таеш ю хӀокху агӀонан шира елла верси.'''\nАгӀо Ӏалаш йинчул тӀаьхьа, хьалхо бина хийцамаш дӀабевра бу.",
        "yourdiff": "Башхаллаш",
        "copyrightwarning": "Тергаме хьажа, массо яззаман чутухуш долу йозан хийцам хьажарехь бу, арахоьцуш санна оцу лицензи хьолехь.\nНагахь хьо лууш вацахь хьайн йозанаш маьрша даржа а кхечаьрга хийцам байта, мадаха уьш кху чу.<br />\nИштта чӀагӀо йой ахьа, айхьа далош долучуьнна хьо куьг да ву аьлла, я хьаэцна цхьан\nхьостера, хийцам ба а дӀаса даржада а чулацам болуш.<br />\n'''МА-КХИССА БАКЪО ЙОЦУ ГӀИРСАШ КХУ ЧУ, КУЬЙГАЛХОЧУЬННА БАКЪО ЛАРЪЕШ ЙОЛУ!'''",
        "readonlywarning": "'''ДӀАХЬЕДО. ГӀирса бух блоктоьхна оьшуш долучу хьаштан, цундера хӀинц хьоьга дӀа ца йазло хийцам.\nХила мега, ахьа Ӏалаш дан дезаш хьайн йоза, юха тӀаьхьо леладан иза йоза.'''\n\nКуьйгалхочо блоктоьхна гӀирса бух, цо битина кхетош хӀара хаам: $1",
        "protectedpagewarning": "'''ДӀахьедар. ХӀара агӀо ларйина ю хийцам цабайта, иза хийца я нисъян а бакъо йолуш куьйгалла лелош болу декъашхой бе бац.'''\nЛахахьа гойту хаамаш тӀаьххьара бина болу хийцамна тептар чура:",
        "semiprotectedpagewarning": "'''ДӀахьедо.''' ХӀара агӀо ларйина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьххьаралера дӀаязбина хаам:",
-       "cascadeprotectedwarning": "<strong>ДӀахьедар:</strong> ХӀара агӀо таян бакъо йолуш [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча {{PLURAL:$1|1=и агӀо латийна кхечу агӀонашца|и агӀо латийна кхечу агӀонашца}} хӀоттделлачу ларйиначух:",
+       "cascadeprotectedwarning": "<strong>ДӀахьедар:</strong> ХӀара агӀо таян бакъо йолуш беккъа [[Project:Куьйгалхой|куьйгалхой]] бу, хӀунда аьлча {{PLURAL:$1|1=хӀара агӀо кхечу агӀонашца латийна ю|хӀара агӀо кхечу агӀонашца латийна ю}} ларъяш ю:",
        "templatesused": "{{PLURAL:$1|1=Кеп, лелош ю|Кепаш, лелош ю}} хӀокху агӀон башхонца:",
        "templatesusedpreview": "{{PLURAL:$1|1=Кеп, лелошдолу|Кепаш, лелойлу}} оцу хьалх хьожучу агӀонца:",
        "templatesusedsection": "ХӀокху декъан чохь {{PLURAL:$1|1=лелош йолу кеп|лелош йолу кепаш}}:",
        "permissionserrors": "ТӀекхачаре бакъона гӀалат",
        "permissionserrorstext": "Хьан бакъо яц кхочуш хилийта хийцам оцу {{PLURAL:$1|1=шолгlа бахьанца|шолгlа бахьанашца}}:",
        "permissionserrorstext-withaction": "Хьан бакъо яц хlумда «'''$2'''» оцу {{PLURAL:$1|1=шолгlа бахьанца|шолгlа бахьанашца}}:",
+       "contentmodelediterror": "Хьуна хӀара верси таян цало, цуна чохь <code>$1</code> модель хилар бахьнехь, ткъа агӀонан чура карара модель — <code>$2</code> ю.",
        "recreate-moveddeleted-warn": "'''Тидам бе. Ахьа кхуллуш ю, хьалхо дӀаяьккхина йолу агӀо.'''\n\nХьажа, билгалла оьши хьуна хӀара агӀо юха кхолла.\nЛахахь далина ду дӀаяхарш тӀяхь долу тептарш а хӀокх агӀона цӀе хийцарш а.",
        "moveddeleted-notice": "ХӀара агӀо дӀаяьккхина яра.\nЛахахьа гойту хӀара дӀаккхарш а, цӀе хийцарш а.",
        "log-fulllog": "Хьажа деригге тептаре",
        "duplicate-args-category": "Кепийн кхайкхамашкахь аргументаш юх-юха лелош йолу агӀонаш",
        "expensive-parserfunction-warning": "'''Тидам бе!''' Ресурсийн функцийн дехарш сов даьлла агӀонаш .\n\nДукху хилла ца деза {{PLURAL:$2|$2 дехар|$2 дехарш|1=цхьана дехар}}, хӀинца $1 {{PLURAL:$1|дехар}} ду.",
        "expensive-parserfunction-category": "Ресурсийн функцийн дехарш сов даьлла агӀонаш",
-       "post-expand-template-inclusion-warning": "Ð\94Ó\80аÑ\85Ñ\8cедаÑ\80: Ñ\8eкÑ\8aа Ñ\82оÑ\8cÑ\85на ÐºÐµÐ¿Ð°Ñ\88ан жамӀан барам тӀех бокха бу. Цхьайолу кепаш юкъа тухур яц.",
-       "post-expand-template-inclusion-category": "ЧÑ\83 Ð´Ñ\83Ñ\8cÑ\85кÑ\83Ñ\88 Ð´Ð¾Ð»Ñ\83 ÐºÐµÐ¿Ð°Ñ\88ан барам тӀех баьлла агӀонаш",
-       "post-expand-template-argument-category": "Ð\9aепаÑ\88ан аргументаш юкъахь йитина агӀонаш",
+       "post-expand-template-inclusion-warning": "Ð\94Ó\80аÑ\85Ñ\8cедаÑ\80: Ñ\8eкÑ\8aа Ñ\82оÑ\8cÑ\85на ÐºÐµÐ¿Ð¸Ð¹н жамӀан барам тӀех бокха бу. Цхьайолу кепаш юкъа тухур яц.",
+       "post-expand-template-inclusion-category": "ЧÑ\83 Ð´Ñ\83Ñ\8cÑ\85кÑ\83Ñ\88 Ð´Ð¾Ð»Ñ\83 ÐºÐµÐ¿Ð¸Ð¹н барам тӀех баьлла агӀонаш",
+       "post-expand-template-argument-category": "Ð\9aепийн аргументаш юкъахь йитина агӀонаш",
        "parser-template-loop-warning": "Карийна кепаш юкъахь хилла шад: [[$1]]",
        "parser-template-recursion-depth-warning": "Дозанал хьаладаьлла кӀоргенца юх юха дина кеп ($1)",
        "node-count-exceeded-category": "Шедийн дукхалла сов даьлла агӀонаш",
        "prefs-watchlist": "Тергаме могӀам",
        "prefs-watchlist-days": "Денойн дукхалла:",
        "prefs-watchlist-days-max": "Къезиг $1 {{PLURAL:$1|дена}}",
-       "prefs-watchlist-edits": "Тергаме могӀам чохь гойтучу нисдарийн максимальни дукхалла:",
+       "prefs-watchlist-edits": "Тергаме могӀам чохь гойтучу нисдарийн максимум дукхалла:",
        "prefs-watchlist-edits-max": "Уггар дукха: 1000",
        "prefs-watchlist-token": "Тергаме могӀанан токен:",
        "prefs-misc": "Кхин гlирсаш",
        "prefs-help-recentchangescount": "Гойту керла нисдарш, агӀонийн истори, тептарш.",
        "prefs-help-watchlist-token2": "Иза хьан тергаме могӀан къайла догӀа ду.\nМуьлха и хуучунна йиш ю хьан тергаме могӀам беша, цундела ма хаийта иза кхечаьрга. [[Special:ResetTokens|ТӀетаӀа йе кхуза и хьайга кхосса лууш делахь]].",
        "savedprefs": "Хьан гӀирс Ӏалашбина.",
+       "savedrights": "{{GENDER:$1|$1}} декъашхочун бакъонаш Ӏалашйина.",
        "timezonelegend": "Сахьтан аса:",
        "localtime": "Меттигера хан:",
        "timezoneuseserverdefault": "Серверан ($1) гӀирс лелабе",
        "prefs-help-email-others": "Кхин дӀа цо кхечу декъашхошна йиш хуьлуьйту хьога электронан кехат даийта хьан агӀона чохь йолу хьажориган гӀоьнца.",
        "prefs-help-email-required": "Электронан поштан адрес яздан деза.",
        "prefs-info": "Коьрта хаам",
-       "prefs-i18n": "ЮкÑ\8aаÑ\80декÑ\8aа Ð¼Ð¾Ñ\82Ñ\82",
+       "prefs-i18n": "Ð\9aÑ\85ин Ð¿Ð°Ñ\80амеÑ\82Ñ\80аÑ\88",
        "prefs-signature": "КуьгтаӀор",
        "prefs-dateformat": "Терахьан формат",
        "prefs-timeoffset": "Хенан  гӀирс",
        "prefs-diffs": "Башхон верси",
        "prefs-help-prefershttps": "И хийцам болх байта юхугӀо системин чу.",
        "prefs-tabs-navigation-hint": "Хьехам: Шу йиш ю аьрру а, аьтту а цхьамзан пиллигаш лелаян цхьана юкъадиллинарг тӀера вукхун тӀе долуш.",
-       "email-address-validity-valid": "Го нийса",
        "userrights": "Декъашхочун бакъонашна урхалладар",
        "userrights-lookup-user": "Декъашхойн бакъонашна урхалладар",
        "userrights-user-editname": "Язъе цӀе:",
        "saveusergroups": "Декъашхочун бакъонаш Ӏалашъян",
        "userrights-groupsmember": "Декъашхо:",
        "userrights-groupsmember-auto": "Бакъонашан тоба:",
-       "userrights-groups-help": "Ð¥Ñ\8cона Ñ\85ийÑ\86а Ð»Ð¾ Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð±Ð°ÐºÑ\8aонаÑ\88.\n* Ð\91акÑ\8aона Ñ\86Ó\80еÑ\80а Ñ\8eÑ\85Ñ\85еÑ\85Ñ\8c Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾ ÐµÐ»Ð°Ñ\85Ñ\8c, Ñ\86Ñ\83на Ð¸ Ð±Ð°ÐºÑ\8aо Ð¹Ð¾Ð»Ñ\83Ñ\88 Ñ\8e.\n* Ð\91илгало Ñ\8fÑ\86аÑ\85Ñ\8c â\80\94 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð¸ Ð±Ð°ÐºÑ\8aо Ñ\8fÑ\86.\n* Ð\97нако * билгала до ахьа бакъо еллачул тӀаьхьа хьона и дӀаяккха цалуш хилар.",
+       "userrights-groups-help": "Ð¥Ñ\8cона Ñ\85ийÑ\86а Ð»Ð¾ Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð±Ð°ÐºÑ\8aонаÑ\88.\n* Ð\91акÑ\8aона Ñ\86Ó\80еÑ\80а Ñ\8eÑ\85Ñ\85еÑ\85Ñ\8c Ð±Ð¸Ð»Ð³Ð°Ð»Ð¾ ÐµÐ»Ð°Ñ\85Ñ\8c, Ñ\86Ñ\83на Ð¸ Ð±Ð°ÐºÑ\8aо Ð¹Ð¾Ð»Ñ\83Ñ\88 Ñ\8e.\n* Ð\91илгало Ñ\8fÑ\86аÑ\85Ñ\8c â\80\94 Ð´ÐµÐºÑ\8aаÑ\88Ñ\85оÑ\87Ñ\83н Ð¸ Ð±Ð°ÐºÑ\8aо Ñ\8fÑ\86.\n* Ð¥Ñ\8cаÑ\8cÑ\80ко * билгала до ахьа бакъо еллачул тӀаьхьа хьона и дӀаяккха цалуш хилар.",
        "userrights-reason": "Бахьана:",
        "userrights-no-interwiki": "Хьан бакъо яц декъашхой бакъо хийца кхечу википеди чохь.",
        "userrights-nologin": "Куьйгалхочунна бакъо йолу [[Special:UserLogin|дӀаяздарца]] ло декъашхочун бакъо.",
        "uploadbtn": "Файл чуяккхар",
        "reuploaddesc": "Юху гӀо файл чуйоккху агӀоне",
        "upload-tryagain": "ДӀадахьийта хийцина файлах лаьцнарг",
-       "uploadnologin": "Ð\90Ñ\85Ñ\8cа Ñ\81иÑ\81Ñ\82емин Ñ\87оÑ\85Ñ\8c Ð±Ð¾Ð»Ñ\85 Ð±ÐµÑ\88 Ð±Ð°Ñ\86",
+       "uploadnologin": "ЦÓ\80аÑ\80Ñ\86а Ð´Ð¾Ñ\86Ñ\83Ñ\88",
        "uploadnologintext": "Серверан чу файлаш яха хьо $1.",
        "uploaderror": "Файл чуяккхаран гӀалат",
        "upload-recreate-warning": "'''Тегам бе: иштта цӀе йолу файл дӀаяьккхина я цӀе хийцина.'''\n\nЛахахьа гойтуш ю хӀокху агӀона тептар:",
        "sourcefilename": "ДIайолалун файл:",
        "sourceurl": "Хьостан URL-адрес:",
        "destfilename": "Файлан керла цӀе:",
-       "upload-maxfilesize": "Файлан: $1 максимальни барам",
+       "upload-maxfilesize": "Файлан: $1 максимум барам",
        "upload-description": "Файлах лаьцна",
        "upload-options": "Чуякхаран параметраш",
        "watchthisupload": "Латайе хӀара файл тергаме могӀам юкъахь",
        "imagelinks": "Файл лелор",
        "linkstoimage": "ХӀара файл лахарчу {{PLURAL:$1|$1 агӀонгахь}} лелош ю:",
        "linkstoimage-more": "$1 дукха {{PLURAL:$1|агӀонаш}} чохь лелош ю хӀара файл.\nХӀокху могӀам чохь {{PLURAL:$1|гойтуш ю $1 хьажорг|гойтуш ю $1 хьажоргаш}} хӀокху файланца.\nКхин хьажа йиш ю [[Special:WhatLinksHere/$2|буьззина могӀаме]].",
-       "nolinkstoimage": "Ð\90гÓ\80онаÑ\88Ñ\87оÑ\85Ñ\8c Ñ\84айл лелош яц.",
-       "linkstoimage-redirect": "$1 (Ñ\84айлан Ð´Ó\80аÑ\81аÑ\85Ñ\8cажоÑ\80аг) $2",
+       "nolinkstoimage": "Ð¥Ó\80аÑ\80а Ñ\84айл Ð°Ð³Ó\80онаÑ\88каÑ\85Ñ\8c лелош яц.",
+       "linkstoimage-redirect": "$1 (файлан дӀасахьажорг) $2",
        "duplicatesoffile": "{{PLURAL:$1|Лахара файл ю дубликат|Лахара $1 файлаш ю дубликаташ}} хӀокху файлан ([[Special:FileDuplicateSearch/$2|мадарра]]):",
        "sharedupload": "ХӀара хӀума оцун $1 чура ю иза хила мега лелош кхечу проекташкахь.",
        "sharedupload-desc-here": "ХӀара файл $1 чура ю и лело йиш ю массо проекташкахь.\nЦунна хаам гайтина лахахь. [$2 Файл Викигуламехь]",
        "double-redirect-fixed-move": "[[$1]] агӀонан цӀе хийцина.\nХӀинца иза авто-карлаяьккхина а [[$2]] агӀона тӀехьажийна.",
        "double-redirect-fixed-maintenance": "Шалха дӀасахьажинарг нисъяр [[$1]] → [[$2]].",
        "double-redirect-fixer": "ДӀасахьажинарш нисерг",
-       "brokenredirects": "ДIадаьхна долу дIасахьажораш",
+       "brokenredirects": "ДӀаяьхна йолу дIасахьажоргаш",
        "brokenredirectstext": "Лахара дӀасахьажийнарш ю йоцучу агӀонийн тӀе хьажийна:",
        "brokenredirects-edit": "нисъе",
        "brokenredirects-delete": "дӀаяккха",
        "wantedfiletext-nocat": "Лахара йоцу файлаш лело гӀерта. Оцу могӀам юкъа ца хууш файлаш кхета там бу, кхечу проекташ чохь йолу. Ишта ца хууш юкъа нийса елачарна тӀехула <del>сиз</del> хира ду.",
        "wantedtemplates": "Оьшуш йолу кепаш",
        "mostlinked": "Дуккха хьажоргаш тӀе тоьхна йолу агӀонаш",
-       "mostlinkedcategories": "Дуккха тӀе хьажораш йолу категореш",
+       "mostlinkedcategories": "Ð\94Ñ\83ккÑ\85а Ñ\82Ó\80е Ñ\85Ñ\8cажоÑ\80гаÑ\88 Ð¹Ð¾Ð»Ñ\83 ÐºÐ°Ñ\82егоÑ\80еÑ\88",
        "mostlinkedtemplates": "Массарел дуккха а лелайо агӀонаш",
        "mostcategories": "Дуккха категореш тӀе тоьхна йолу агӀонаш",
        "mostimages": "Массарел дуккха лелайо файлаш",
        "usercreated": "{{GENDER:$3|дӀавазвелла|дӀаязелла}} $1 $2",
        "newpages": "Керла агӀонаш",
        "newpages-username": "Декъашхо:",
-       "ancientpages": "ТÓ\80аÑ\8cÑ\85Ñ\85Ñ\8cаÑ\80леÑ\80аÑ\87Ñ\83 Ñ\85енаÑ\86а Ð½Ð¸Ñ\81бина Ñ\8fззамаш",
+       "ancientpages": "ШиÑ\80а Ð°Ð³Ó\80онаш",
        "move": "ЦӀе хийца",
        "movethispage": "ХӀокху агӀон цӀе хийца",
        "unusedimagestext": "Лахара файлаш цхьана агӀонгахь лелош яц.\nДехар до, тидаме бе, кхин йолу веб-сайташ а лелош хила мега нийсса йогӀу хьажорг (URL), хӀокху могӀаме йогӀуш ялахь а иза хила мега жигара лелош.",
        "watchlistfor2": "Цунна $1 $2",
        "nowatchlist": "Ха тергаме могӀа баьсса бу.",
        "watchlistanontext": "Тергаме могӀоме хьажа я тая кхочушде $1.",
-       "watchnologin": "Системин чугӀо",
+       "watchnologin": "Системин довзийтар",
        "addwatch": "Тергаме могӀам юкъа тоха",
        "addedwatchtext": "ХӀара «[[:$1]]» агӀо тӀетоьхна хьан [[Special:Watchlist|тергаме могӀам чу]].\nОцу могӀам чохь дӀаязбийр бу агӀона а цуьнца йолу дийцаре агӀона а бина хийцамаш.",
        "addedwatchtext-short": "«$1» агӀо хьан тергаман магӀам тӀетоьхна.",
        "wlheader-showupdated": "Хийцам бина агӀонаш '''Ӏаьржа''' шрифтцан билгальяха ю.",
        "wlnote": "Гойту <strong>$2</strong> {{plural:$2|сахьтчохь}} бина {{PLURAL:$1|тӀеххьара '''$1''' хийцам}}, хан $3 $4",
        "wlshowlast": "Гайта тӀаьххьара $1 сахьт $2 де",
+       "watchlistall2": "массо",
        "watchlist-options": "Тергаме могlаман гlирс нисбар",
        "watching": "Тергаме мlогаман юкъаяккха…",
        "unwatching": "Тергаме могӀанан чура дӀаяккхар…",
        "contributions": "{{GENDER:$1|Декъашхочун}} къинхьегам",
        "contributions-title": "{{GENDER:$1|Декъашхочун}} къинхьегам $1",
        "mycontris": "Сан къинхьегам",
+       "anoncontribs": "Къинхьегам",
        "contribsub2": "Къинхьегам $1 ($2)",
        "contributions-userdoesnotexist": "«$1» ишта декъашхочун дӀаяздар дац.",
        "nocontribs": "Дехарца хийцамаш цакарий.",
        "noautoblockblock": "ша блоктухарг дӏаяйина",
        "createaccountblock": "цамагдо керла дӀаяздарш кхоллар",
        "emailblock": "цамаго кехаташ кхехӀита",
-       "blocklist-nousertalk": "Ñ\88ин Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fн Ð»Ñ\83Ñ\88 Ð´Ð°ц",
+       "blocklist-nousertalk": "Ñ\88ен Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fлÑ\83Ñ\88 Ñ\8fц",
        "ipblocklist-empty": "Блоктохаран могӀам баьсса бу.",
        "ipblocklist-no-results": "И адрес блоктоьхна дац.",
        "blocklink": "блоктоха",
        "block-log-flags-nocreate": "цамагдо керла дӏаяздарш кхоллар",
        "block-log-flags-noautoblock": "ша блоктухарг дӏаяйина",
        "block-log-flags-noemail": "цамаго кехаташ кхехӀита",
-       "block-log-flags-nousertalk": "Ñ\88ин Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fн Ð»Ñ\83Ñ\88 Ð´Ð°ц",
+       "block-log-flags-nousertalk": "Ñ\88ен Ð´Ð¸Ð¹Ñ\86аÑ\80е Ð°Ð³Ó\80о Ñ\82аÑ\8fлÑ\83Ñ\88 Ñ\8fц",
        "block-log-flags-angry-autoblock": "латина шуьйра автоблоктохар",
        "block-log-flags-hiddenname": "декъашхочун цӀе къайлаяьккхина",
        "range_block_disabled": "Куьйгалхошна диапазонашна блоктоха цамага до.",
        "movenosubpage": "ХӀокху агӀона бухара агӀонаш яц.",
        "movereason": "Бахьана:",
        "revertmove": "юхаяккха",
-       "delete_and_move": "Цle а хуьйцуш дӀаяккха",
        "delete_and_move_text": "== ДӀаяккха хьокъ ю ==\nИ цӀе йолу аг1о «[[:$1]]» йолуш ю. \nЛаьий хьуна и дӀаяккха, цӀе хийца таро хилийта?",
        "delete_and_move_confirm": "ХӀаъ, дӀаяккха хӀара агӀо",
        "delete_and_move_reason": "ДӀаяьккхина цӀе хийца я таро хилийта  «[[$1]]»",
        "imagetypemismatch": "Файлан керла шоръелла оцунна тайпанца йогӀуш яц",
        "imageinvalidfilename": "Файлан цӀе гӀалате ю",
        "fix-double-redirects": "Хьалхара цӀе йолу дӀасахьажорг нисъян",
-       "move-leave-redirect": "Ó\80адйиÑ\82а Ð´Ó\80аÑ\81аÑ\85Ñ\8cажоÑ\80аг",
-       "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо ларйина ю; цӀе хийца я нисъян а бакъо йолуш куьйгалхой бе бац.\nЛахахьа тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
+       "move-leave-redirect": "Ӏадйита дӀасахьажорг",
+       "protectedpagemovewarning": "'''ДӀахьедар.''' ХӀара агӀо ларйина ю; цӀе хийца я нисъян а бакъо йолуш куьйгалхой бен бац.\nЛахахь тептаро балийна тӀаьхьаралера дӀаязбина хаам:",
        "semiprotectedpagemovewarning": "'''ДӀахьедо.''' ХӀара агӀо ларйина ю; дӀабазбиначу декъашхошка бе цӀе хийцалуш яц.\nЛахахьа тептаро балийна тӀаьххьаралера дӀаязбина хаам:",
        "move-over-sharedrepo": "== Файл йолуш ю ==\nВикигулам чохь йолуш ю [[:$1]]. ХӀокху файлан цӀе хийцича Викигулам чуьраниг дӀакъовлу.",
        "export": "АгӀонаш араяхар",
        "javascripttest": "JavaScript хьажар",
        "tooltip-pt-userpage": "Декъашхочун агӀо",
        "tooltip-pt-mytalk": "Сан дийцаре агlо",
+       "tooltip-pt-anontalk": "Сан IP адресан дийцаре агӀо",
        "tooltip-pt-preferences": "Хьан гlирс нисбар",
        "tooltip-pt-watchlist": "Ахьа тергам бо агӀонийн хийцаман могӀам",
        "tooltip-pt-mycontris": "Хьан нисдаран могӀам",
+       "tooltip-pt-anoncontribs": "ХӀокху IP-адресца бина хийцамийн могӀам",
        "tooltip-pt-login": "Кхузахь дӀаяздар кхолла мега, амма иза тӀедожийна дац.",
        "tooltip-pt-logout": "Дlадерзадо болх бар",
        "tooltip-pt-createaccount": "Шу йиш ю дӀаяздар кхоьллина системин чудаха, амма иза тӀедожийна дац.",
        "tooltip-ca-nstab-main": "Яззамна чулацам",
        "tooltip-ca-nstab-user": "ХӀора декъашхочун долахь йолу агӀо ю",
        "tooltip-ca-nstab-media": "Медиа-файл",
-       "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара тая луш яц",
+       "tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара таялуш яц",
        "tooltip-ca-nstab-project": "Кхолламан дакъа",
        "tooltip-ca-nstab-image": "Файлан агӀо",
        "tooltip-ca-nstab-mediawiki": "Хааман агlо MediaWiki",
        "monthsall": "массо",
        "confirmemail": "Электронан поштан адрес бакъдар",
        "confirmemail_noemail": "Ахьа нийса электронан поштан адрес яздина дац [[Special:Preferences|гӀирсан чохь]].",
+       "confirmemail_success": "Хьан электроннан поштан адрес бакъдина.",
+       "confirmemail_loggedin": "Хьан электроннан поштан адрес бакъдина.",
        "confirmrecreate": "Декъашхочо [[User:$1|$1]] ([[User talk:$1|дийцаре]]) хӀара агӀо дӀаяьккхина, ахьа иза тая йолийча, дӀаяккхарна бахьана:\n: ''$2''\nДехар до, тешал де, хьо иза агӀо меттахӀотто лууш ву/ю але.",
        "confirmrecreate-noreason": "Декъашхочо [[User:$1|$1]] ([[User talk:$1|дийцаре]]) хӀара агӀо дӀаяьккхина, ахьа иза тая йолийча. Дехар до, тешал де, хьо иза агӀо меттахӀотто лууш ву/ю але.",
        "recreate": "Юха кхолла",
        "specialpages": "Леррина агӀонаш",
        "specialpages-note-top": "Легенда",
        "specialpages-note": "* Гуттарлера белха агlонаш.\n* <strong class=\"mw-specialpagerestricted\">Кlеззиг таронаш йолу леррина агlонаш.</strong>",
-       "specialpages-group-maintenance": "Ð\96амlаÑ\88 Ð³lиÑ\80Ñ\81а Ñ\85Ñ\8cаÑ\88Ñ\82аÑ\88 ÐºÑ\85оÑ\87Ñ\83Ñ\88даÑ\80",
+       "specialpages-group-maintenance": "ТеÑ\85никийн Ñ\85Ñ\8cаÑ\88Ñ\82аÑ\88 ÐºÑ\85оÑ\87Ñ\83Ñ\88даÑ\80ан Ñ\85аамаÑ\88",
        "specialpages-group-other": "Кхин белхан агӀонаш",
-       "specialpages-group-login": "СиÑ\81Ñ\82емин Ñ\87Ñ\83гÓ\80о / Ð´Ó\80аÑ\8fздаÑ\80 ÐºÑ\85олла",
-       "specialpages-group-changes": "Керла нисдарш а тéптарш",
-       "specialpages-group-media": "Ð\96амlаÑ\88 Ð¾Ñ\86Ñ\83 Ð¼ÐµÐ´Ð¸Ð°-гlиÑ\80Ñ\81аÑ\88ан Ð° Ñ\87Ñ\83Ñ\8fÑ\85аÑ\80ш",
-       "specialpages-group-users": "Декъашхой а бакъонаш",
+       "specialpages-group-login": "Ð\94овзийÑ\82аÑ\80 / Ð´Ó\80аÑ\8fздаÑ\80 ÐºÑ\85оллаÑ\80",
+       "specialpages-group-changes": "Керла нисдарш а, тéптарш а",
+       "specialpages-group-media": "Ð\9cедиа-гÓ\80иÑ\80Ñ\81ийн Ð°, Ñ\87Ñ\83Ñ\8fÑ\85аÑ\80ийн Ð° Ñ\85аамаш",
+       "specialpages-group-users": "Декъашхой а, бакъонаш а",
        "specialpages-group-highuse": "Уггаре дукха лелайо агӀонаш",
        "specialpages-group-pages": "АгӀонийн могӀанаш",
        "specialpages-group-pagetools": "ГӀирсаш агӀонашна",
index 427275b..4af8146 100644 (file)
@@ -9,7 +9,8 @@
                        "Palang hernan",
                        "Reedy",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Leeheonjin"
                ]
        },
        "tog-underline": "Binadlisan nga mga sumpay:",
        "unwatch": "Pasagdi",
        "watchlist-details": "{{PLURAL:$1|$1 ka panid|$1 ka mga panid}} ang imong gibantayan, way labot ang mga panid sa hisgot.",
        "wlshowlast": "Ipakita ang miaging $1 ka oras $2 ka mga adlaw",
+       "watchlistall2": "tanan",
+       "watchlist-hide": "Tagoa",
        "watchlist-options": "Mga opsyon sa akong gibantayan",
        "watching": "Gibantayan...",
        "unwatching": "Gipasagdan...",
        "block-log-flags-nocreate": "ang paghimo'g akawnt gipugngan",
        "movepagetext": "Gamit ang form sa ubos moilis og ngalan sa panid, mabalhin ang tanang kaagi niini ngadto sa bag-ong ngalan.\nAng karaang titulo mahimong panid sa redirekta ngadto sa bag-ong titulo.\nPuyde nimo awtomatik nga i-update ang mga redirekta nga mipunterya sa orihinal nga titulo.\nKon dili nimo kini pilion, siguradoha nga i-tsek nimo ang [[Special:DoubleRedirects|duble]] o [[Special:BrokenRedirects|buak nga redirek]].\nIkaw ang responsable sa pagsigurado nga ang mga sumpay padayon nga magpuntirya ngadto sa saktong adtoan.\n\nBantayi nga ang panid '''dili''' ibalhin kon aduna nay panid sa bag-ong titulo, waylabot kon kini walay sulod o kaha redirek lang ug walay kaagi sa pag-usab.\nBuot ipasabot nga puyde nimo ibalik ang pag-ilis sa ngalan ngadto sa karaang ngalan kon ikaw nasayop, ug dili ka maka-overwrite sa panid nga anaa na.\n\n'''Pahibalo!'''\nMahimo nga drastiko ug wala damha nga kausaban kini sa usa ka panid nga popular;\npalihog siguradoha nga nasabtan nimo ang idangat niini bag-o nimo kini ipadayon.",
        "movepagetalktext": "Ang kaubang panid sa hisgot awtomatikong mabalhin uban sa meyn nga panid '''waylabot kon:'''\n*Usa ka may-sulod nga panid sa hisgot anaa na ubos sa bag-ong ngalan, o\n*Imo gi-uncheck ang kahon sa ubos.\n\nSa maong mga kaso, manwal nga imo ibalhin o i-merge ang panid kon gustohon.",
-       "movearticle": "Ibalhin ang panid:",
        "newtitle": "Ngadto sa bag-ong titulo:",
        "move-watch": "Bantayi kining panid",
        "movepagebtn": "Ibalhin ang panid",
index 3972e39..f3f4cdb 100644 (file)
        "nstab-template": "داڕێژە",
        "nstab-help": "پەڕەی یارمەتی",
        "nstab-category": "پۆل",
+       "mainpage-nstab": "دەستپێک",
        "nosuchaction": "کردارێک بەم شێوە نییە",
        "nosuchactiontext": "ئەو چالاکییەی لە لایەن بەستەرەوە دیاریکراوە ناتەواوە.\nلەوانەیە بە هەڵە بەستەرەکەت نووسیبێت، یان بەستەرێکی هەڵەی بە دواوە بێت.\nلەوانەیە ئەمە نیشانەی هەڵەیەک بێت لەو نەرمەکاڵایەی کە بەکاردێت لە لایەن {{SITENAME}}.",
        "nosuchspecialpage": "پەڕەی تایبەتی ئاوا بوونی نییە",
        "createaccountreason": "هۆکار:",
        "createacct-reason": "ھۆکار",
        "createacct-reason-ph": "بۆ ھەژمارێکی تر دروست دەکەی",
-       "createacct-captcha": "تاوتوێی ئاسایشی",
-       "createacct-imgcaptcha-ph": "دەقەکەی لە ژێرەوە دەیبینی بینووسە",
        "createacct-submit": "ھەژمارەکەت دروست بکە",
        "createacct-another-submit": "ھەژمارێکی تر دروست بکە",
        "createacct-benefit-heading": "{{SITENAME}} لە لایەن کەسانێک وەکوو خۆت دروست کراوە.",
        "passwordreset-emailtext-ip": "‫کەسێک (لەوانەیە خۆت، بە ناونیشانی ئایپیی $1) داوای ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە،\nیان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailtext-user": "‫بەکارھێنەر $1 لە {{SITENAME}} ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە، یان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، \nدەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "passwordreset-emailelement": "ناوی بەکارھێنەری: \n$1\n\nتێپەڕوشەی کاتی: \n$2",
-       "passwordreset-emailsent": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
+       "passwordreset-emailsentemail": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا.",
        "passwordreset-emailsent-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە.",
        "passwordreset-emailerror-capture": "ئیمەیلێکی ڕیسێتکردنەوەی تێپەڕوشە نێردرا، کە لە ژێرەوە نیشان دراوە، بەڵام ناردنەکەی بۆ {{GENDER:$2|بەکارھێنەر}} سەرکەوتوو نەبوو: $1",
        "changeemail": "گۆڕینی ناونیشانی ئیمەیل",
        "prefs-tokenwatchlist": "نیشانە",
        "prefs-diffs": "جیاوازییەکان",
        "prefs-help-prefershttps": "بەکارخستنی ئەم تایبەتمەندییە کاریگەری لەسەر چوونەژوورەوەی داھاتووت دروست دەکات",
-       "email-address-validity-valid": "ناونیشانی ئیمەیل دروست وە بەر چاو دێت",
-       "email-address-validity-invalid": "ناونیشانێکی دروستی ئیمەیل بنووسە",
        "userrights": "بەڕێوەبردنی مافەکانی بەکارھێنەر",
        "userrights-lookup-user": "بەڕێوەبردنی گرووپەکانی بەکارھێنەر",
        "userrights-user-editname": "ناوی بەکارهێنەرێک بنووسە:",
        "wlheader-showupdated": "‏ئەو پەڕانە کە لە پاش دوایین سەردانت دەستکاری کراون بە <strong>ئەستوور</strong> نیشان دراون.",
        "wlnote": "خوارەوە {{PLURAL:$1|دوایین گۆڕانکارییە|دوایین <strong>$1</strong> گۆڕانکارییە}} لە دوایین {{PLURAL:$2|کاتژمێر|<strong>$2</strong> کاتژمێر}}دا ھەتا $4ی $3.",
        "wlshowlast": "دوایین $1 کاتژمێری $2 ڕۆژ نیشان بدە",
+       "watchlistall2": "ھەموو",
        "watchlist-options": "ھەڵبژاردەکانی لیستی چاودێری",
        "watching": "چاودێری...",
        "unwatching": "لابردنی چاودێری...",
        "protect-level-sysop": "تەنیا بە بەڕێوەبەران ڕێگە بدە",
        "protect-summary-cascade": "تاڤگەیی",
        "protect-expiring": "بەسەردەچێ لە ڕێکەوتی $1 (UTC)",
-       "protect-expiring-local": "بە سەر دەچێ لە $1",
+       "protect-expiring-local": "بەسەردەچێ لە $1",
        "protect-expiry-indefinite": "بێسنوور",
        "protect-cascade": "پەڕەکانی نێو ئەم پەڕە بپارێزە (پاراستنی تاڤگەیی)",
        "protect-cantedit": "ناتوانی ئاستی پاراستنی ئەم پەڕە بگۆڕی، چونکوو تۆ ئیجازەی ئەم کارەت نیە.",
        "contributions": "بەشدارییەکانی {{GENDER:$1|بەکارھێنەر}}",
        "contributions-title": "بەشدارییەکانی بەکارھێنەر $1",
        "mycontris": "بەشدارییەکان",
+       "anoncontribs": "بەشدارییەکان",
        "contribsub2": "بۆ {{GENDER:$3|$1}} ($2)",
        "nocontribs": "هیچ گۆڕانکاریەکی هاوتای ئەم پێوەرانە نودۆزرایەوە",
        "uctop": "(ھەنووکە)",
        "movenosubpage": "ئەم پەڕەیە ھیچ ژێرپەڕەیەکی نییە.",
        "movereason": "ھۆکار:",
        "revertmove": "پێچەوانەکردنەوە",
-       "delete_and_move": "بیسڕەوە و بیگوازەوە",
        "delete_and_move_text": "== پێویستییەکانی سڕینەوە ==\nلاپەڕەی مەبەست \"[[:$1]]\" لە پێش‌دا هەیە.\nئایا دەتەوێ ئەوە بسڕیتەوە تا ڕێگە بۆ گواستنەوەی بکەیتەوە؟",
        "delete_and_move_confirm": "بەڵێ، پەڕەکە بسڕەوه",
        "delete_and_move_reason": "سڕایەوە بۆ کردنەوەی ڕیگە بۆ گواستنەوە لە «[[$1]]»ەوە",
        "tooltip-ca-nstab-main": "بینینی پەڕەی ناوەڕۆک",
        "tooltip-ca-nstab-user": "پەڕەی بەکارھێنەر تەماشا بکە",
        "tooltip-ca-nstab-media": "پەڕەی میدیا چاو لێ بکە",
-       "tooltip-ca-nstab-special": "ئەمە پەڕەیەکی تایبەتە، ناتوانی خودی ئەم پەڕە دەستکاری بکەیت",
+       "tooltip-ca-nstab-special": "ئەمە پەڕەیەکی تایبەتە و دەستکاری ناکرێت",
        "tooltip-ca-nstab-project": "بینینی پەڕەی پرۆژە",
        "tooltip-ca-nstab-image": "بینینی پەڕەی پەڕگە",
        "tooltip-ca-nstab-mediawiki": "بینینی پەیامی سیستەم",
        "htmlform-no": "نا",
        "htmlform-yes": "بەڵێ",
        "htmlform-title-not-creatable": "پەڕە بە سەردێڕی \"$1\" دروست ناکرێت",
-       "htmlform-title-not-exists": "[[$1]] بوونی نیە.",
+       "htmlform-title-not-exists": "$1 بوونی نیە.",
        "logentry-delete-delete": "$1 پەڕەی $3ی {{GENDER:$2|سڕییەوە}}",
        "logentry-delete-restore": "$1 پەڕەی $3ی {{GENDER:$2|ھێنایەوە}}",
        "logentry-delete-revision": "$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3ی {{GENDER:$2|گۆڕیی}}: $4",
        "revdelete-uname-unhid": "ناوی بەکارهێنەری نیشان درا",
        "revdelete-restricted": "ئەو سنووری بەرگریانەی خستراوەتە سەر بەڕێوبەران",
        "revdelete-unrestricted": "ئەو سنووری بەرگریانەی لابردراوە لە سەر بەڕێوبەران",
+       "logentry-block-block": "$1 {{GENDER:$4|$3}}ی بۆ ماوەی $5 {{GENDER:$2|بەربەست کرد}} $6",
        "logentry-move-move": "$1 پەڕەی $3ی {{GENDER:$2|گواستەوە}} بۆ $4",
        "logentry-move-move-noredirect": "$1 پەڕەی $3ی بەبێ بەجێھشتنی ڕەوانەکەرێک {{GENDER:$2|گواستەوە}} بۆ $4",
        "logentry-move-move_redir": "$1 پەڕەی $3 {{GENDER:$2|گواستەوە}} بۆ $4 کە پێشتر ڕەوانەکەر بوو",
        "logentry-newusers-create2": "ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}}",
        "logentry-newusers-byemail": "ھەژماری بەکارھێنەریی $3 لە لایەن $1 {{GENDER:$2|دروست کرا}} و تێپەڕوشە بە ئیمەیل نێردرا",
        "logentry-newusers-autocreate": "ھەژماری بەکارھێنەریی $1 بە شێوەی خۆگەڕ {{GENDER:$2|دروست کرا}}",
+       "logentry-protect-protect": "$1 $3ی {{GENDER:$2|پاراست}} $4",
+       "logentry-protect-modify": "$1 ئاستی پاراستنی $3ی {{GENDER:$2|گۆڕی}} $4",
        "logentry-rights-rights": "$1 ئەندامێتیی $3ی لە $4 بۆ $5 {{GENDER:$2|گۆڕی}}",
        "logentry-upload-upload": "$1 $3ی {{GENDER:$2|بار کرد}}",
        "logentry-upload-overwrite": "$1 وەشانێکی نوێی $3ی {{GENDER:$2|بار کرد}}",
index 29d0707..1dc61ea 100644 (file)
@@ -5,7 +5,8 @@
                        "Alessandro",
                        "Don Alessandro",
                        "Urhixidur",
-                       "아라"
+                       "아라",
+                       "Исмаил Садуев"
                ]
        },
        "tog-underline": "Багълантыларнынъ тюбюни сызув:",
        "mytalk": "Музакере",
        "anontalk": "Бу IP-нинъ музакереси",
        "navigation": "Сайтта ёл тапув",
-       "and": "&#32;ве",
+       "and": "&#32;а",
        "qbfind": "Тап",
        "qbbrowse": "Бакъып чыкъ",
        "qbedit": "Денъиштир",
        "createaccountreason": "Себеп:",
        "createacct-reason": "Себеп",
        "createacct-reason-ph": "Башкъа бир эсап язысы неден себеп яратасынъыз",
-       "createacct-captcha": "Телюкесизлик контроли",
-       "createacct-imgcaptcha-ph": "Юкъарыда корьген метнинъизни язынъыз",
        "createacct-submit": "Эсап язынъызны яратынъыз",
        "createacct-another-submit": "Башкъа бир эсап язысы яратынъыз",
        "createacct-benefit-heading": "{{SITENAME}} сизинъ киби адамлар тарафындан языла.",
        "move-page-legend": "Саифенинъ адыны денъиштирюв",
        "movepagetext": "Ашагъыдаки форма къулланылып саифенинъ ады денъиштирилир. Бунынънен берабер денъиштирмелер журналы да янъы адгъа авуштырылыр.\nЭски ады янъы адына ёнетме олур. Эски серлевагъа ёнетип тургъан саифелерни автоматик оларакъ янъартып оласынъыз. Бу арекетни автоматик япмагъа истемесенъиз, бутюн [[Special:DoubleRedirects|чифт]] ве [[Special:BrokenRedirects|йыртыкъ]] ёнетме саифелерини озюнъиз тешкермеге меджбур олурсынъыз. Багълантылар эндиден берли догъру чалышмасындан эмин олмалысынъыз.\n\nЯнъы адда бир саифе энди бар олса, ад денъиштирилюви <strong>япылмайджакъ</strong>, анджакъ бар олгъан саифе ёнетме я да бош олса ад денъиштирилюви мумкюн оладжакъ. Бу демек ки, саифенинъ адыны янълыштан денъиштирген олсанъыз деминки адыны кери къайтарып оласынъыз, амма бар олгъан саифени тесадюфен ёкъ этамайсынъыз.\n\n<strong>ТЕНБИ!</strong>\nАд денъиштирилюви популяр саифелер ичюн буюк ве бекленмеген денъишмелерге себеп ола билир. Лютфен, денъиштирме япмаздан эвель ола биледжеклерни козь огюне алынъыз.",
        "movepagetalktext": "Къошулгъан музакере саифесининъ де (бар олса)\nады автоматик тарзда денъиштириледжек. '''Мустесналар:'''\n\n* Айны бу адда бош олмагъан бир музакере саифеси энди бар;\n* Ашагъыдаки бошлукъкъа ишарет къоймадынъыз.\n\nБойле алларда, керек олса, саифелерни къолнен ташымагъа я да бирлештирмеге меджбур олурсынъыз.",
-       "movearticle": "Эски ад",
        "movecategorypage-warning": "<strong>Ихтар:</strong> Бир категория саифесининъ адыны денъиштирмек узьресинъиз. Лютфен, ялынъыз категория саифесининъ кочюриледжегини ве эски категорияда ер алгъан саифелернинъ янъы категориягъа авотматик оларакъ <em>авуштырылмайджагъыны</em> унутманъыз.",
        "movenologintext": "Саифенинъ адыны денъиштирип олмакъ ичюн [[Special:UserLogin|отурым ачынъыз]].",
        "movenotallowed": "Саифелер адларыны денъиштирмеге изининъиз ёкъ.",
index 987e08e..edf978a 100644 (file)
@@ -62,6 +62,7 @@
        "tog-watchlisthidebots": "Na seznamu sledovaných stránek skrýt editace botů",
        "tog-watchlisthideminor": "Na seznamu sledovaných stránek skrýt malé editace",
        "tog-watchlisthideliu": "Na seznamu sledovaných stránek skrýt editace přihlášených uživatelů",
+       "tog-watchlistreloadautomatically": "Při změně nastavení automaticky aktualizovat seznam sledovaných stránek (vyžaduje JavaScript)",
        "tog-watchlisthideanons": "Na seznamu sledovaných stránek skrýt editace nepřihlášených uživatelů",
        "tog-watchlisthidepatrolled": "Skrýt patrolované editace ve sledovaných stránkách",
        "tog-watchlisthidecategorization": "Skrýt kategorizaci stránek",
        "morenotlisted": "Tento seznam není úplný.",
        "mypage": "Stránka",
        "mytalk": "Diskuse",
-       "anontalk": "Diskuse k této IP adrese",
+       "anontalk": "Diskuse",
        "navigation": "Navigace",
        "and": "&#32;a",
        "qbfind": "Hledání",
        "databaseerror-query": "Dotaz: $1",
        "databaseerror-function": "Funkce: $1",
        "databaseerror-error": "Chyba: $1",
+       "transaction-duration-limit-exceeded": "Aby nevznikalo velké replikační zpoždění, byla transakce přerušena, protože trvání zápisu ($1) překročilo $2sekundový limit.\nPokud měníte mnoho položek najednou, zkuste místo toho provést několik menších operací.",
        "laggedslavemode": "<strong>Upozornění:</strong> Stránka nemusí být aktuální.",
        "readonly": "Databáze je uzamčena",
        "enterlockreason": "Udejte důvod zamčení, včetně odhadu, za jak dlouho dojde k odemčení",
        "missingarticle-rev": "(číslo revize: $1)",
        "missingarticle-diff": "(Rozdíl: $1, $2)",
        "readonly_lag": "Databáze byla automaticky dočasně uzamčena kvůli zpoždění ostatních databázových serverů oproti hlavnímu",
+       "nonwrite-api-promise-error": "Byla odeslána HTTP hlavička „Promise-Non-Write-API-Action“, ale požadavek směřoval na API modul pro zápis.",
        "internalerror": "Vnitřní chyba",
        "internalerror_info": "Vnitřní chyba: $1",
        "internalerror-fatal-exception": "Kritická výjimka typu „$1“",
        "createaccountreason": "Důvod:",
        "createacct-reason": "Důvod",
        "createacct-reason-ph": "Proč si vytváříte další účet",
-       "createacct-captcha": "Bezpečnostní kontrola",
-       "createacct-imgcaptcha-ph": "Opište výše zobrazený text",
        "createacct-submit": "Vytvořit účet",
        "createacct-another-submit": "Vytvořit účet",
        "createacct-benefit-heading": "{{grammar:4sg|{{SITENAME}}}} tvoří lidé jako vy.",
        "wrongpasswordempty": "Bylo zadáno prázdné heslo. Zkuste to znovu.",
        "passwordtooshort": "Heslo musí být dlouhé nejméně $1 {{PLURAL:$1|znak|znaky|znaků}}.",
        "passwordtoolong": "Hesla nemohou být delší než {{PLURAL:$1|1 znak|$1 znaky|$1 znaků}}.",
+       "passwordtoopopular": "Není možné používat běžně vybíraná hesla. Prosím vyberte si jiné, méně časté heslo.",
        "password-name-match": "Vaše heslo nesmí být stejné jako uživatelské jméno.",
        "password-login-forbidden": "Použití tohoto uživatelského jména a hesla bylo zakázáno.",
        "mailmypassword": "Poslat nové heslo",
        "passwordreset-emailtext-ip": "Někdo (patrně vy, z IP adresy $1) zažádal na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu účtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší za {{PLURAL:$5|jeden den|$5 dny|$5 dnů}}.\nNyní byste se měli přihlásit a zvolit si nové heslo. Pokud tento požadavek poslal někdo jiný nebo jste si na své staré heslo vzpomněli, a nechcete ho tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailtext-user": "{{gender:$1|Uživatel|Uživatelka}} $1 na {{grammar:6sg|{{SITENAME}}}} {{gender:$1|zažádal|zažádala}} na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu\núčtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší {{PLURAL:$5|za jeden den|za $5 dny|za $5 dnů}}.\nNyní byste se měl(a) přihlásit a zvolit si nové heslo. Pokud tento požadavek\nposlal někdo jiný nebo jste si na své staré heslo vzpomněl(a), a nechcete ho\ntedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailelement": "Uživatelské jméno: \n$1\n\nDočasné heslo: \n$2",
-       "passwordreset-emailsent": "Pokud je to registrovaná emailová adresa k vašemu účtu, tak vám bude odeslán požadavak pro získání nového hesla.",
+       "passwordreset-emailsentemail": "Pokud je to registrovaná e-mailová adresa k vašemu účtu, bude vám zaslán e-mail pro získání nového hesla.",
+       "passwordreset-emailsentusername": "Pokud existuje odpovídající registrovaná e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
        "passwordreset-emailsent-capture": "Byl odeslán e-mail pro získání nového hesla, který je zobrazen níže.",
        "passwordreset-emailerror-capture": "Byl vygenerován e-mail pro získání nového hesla, který je zobrazen níže, ale {{GENDER:$2|uživateli|uživatelce}} se ho nepodařilo odeslat: $1",
        "changeemail": "Změna nebo odstranění e-mailové adresy",
        "showingresultsinrange": "Níže zobrazuji nejvýše <strong>$1</strong> {{PLURAL:$1|výsledek|výsledky|výsledků}} v rozsahu #<strong>$2</strong>–#<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Výsledek <strong>$1</strong> z <strong>$3</strong>|Výsledky <strong>$1–$2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Na váš dotaz nebyly nalezeny žádné výsledky.",
+       "search-nonefound-thiswiki": "Pro tento dotaz nebyly nalezeny žádné odpovídající výsledky na této wiki.",
        "powersearch-legend": "Rozšířené vyhledávání",
        "powersearch-ns": "Hledat ve jmenných prostorech:",
        "powersearch-togglelabel": "Zaškrtnout:",
        "prefs-help-prefershttps": "Toto nastavení se projeví při příštím přihlášení.",
        "prefswarning-warning": "Provedli jste změny nastavení, které dosud nejsou uloženy. Pokud tuto stránku opustíte, aniž byste klikli na „$1“, vaše nastavení se nezmění.",
        "prefs-tabs-navigation-hint": "Tip: Pro přepínání mezi záložkami můžete používat šipky vlevo a vpravo.",
-       "email-address-validity-valid": "E-mailová adresa vypadá jako platná",
-       "email-address-validity-invalid": "Zadejte platnou e-mailovou adresu",
        "userrights": "Správa uživatelských skupin",
        "userrights-lookup-user": "Spravovat uživatelské skupiny",
        "userrights-user-editname": "Zadejte uživatelské jméno:",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vizte též [[Special:NewPages|seznam nových stránek]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Zobrazit",
        "rcnotefrom": "Níže {{PLURAL:$5|je změna|jsou změny}} od <strong>$3, $4</strong> ({{PLURAL:$1|zobrazena|zobrazeny|zobrazeno}} nejvýše <strong>$1</strong>).",
        "rclistfrom": "Ukázat nové změny, počínaje od $2, $3",
        "rcshowhideminor": "$1 malé editace",
        "rcshowhideminor-show": "Zobrazit",
        "rcshowhideminor-hide": "Skrýt",
-       "rcshowhidebots": "$1 roboty",
+       "rcshowhidebots": "$1 boty",
        "rcshowhidebots-show": "Zobrazit",
        "rcshowhidebots-hide": "Skrýt",
        "rcshowhideliu": "$1 registrované uživatele",
        "mostrevisions": "Stránky s nejvíce revizemi",
        "prefixindex": "Seznam stránek dle začátku názvu",
        "prefixindex-namespace": "Seznam stránek dle začátku názvu (jmenný prostor $1)",
+       "prefixindex-submit": "Zobrazit",
        "prefixindex-strip": "Začátek názvu v seznamu odříznout",
        "shortpages": "Nejkratší stránky",
        "longpages": "Nejdelší stránky",
        "protectedpages-performer": "Zamykající",
        "protectedpages-params": "Nastavení zámku",
        "protectedpages-reason": "Důvod",
+       "protectedpages-submit": "Zobrazit stránky",
        "protectedpages-unknown-timestamp": "Neznámé",
        "protectedpages-unknown-performer": "Neznámý uživatel",
        "protectedtitles": "Zamčené názvy stránek",
        "protectedtitles-summary": "Tato stránka obsahuje seznam názvů, které jsou momentálně zamčeny proti založení. Seznam existujících zamčených stránek najdete na stránce [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "S těmito parametry nejsou zamčeny žádné názvy.",
+       "protectedtitles-submit": "Zobrazit názvy",
        "listusers": "Uživatelé",
        "listusers-editsonly": "Zobrazit pouze uživatele s editacemi",
        "listusers-creationsort": "Seřadit podle data registrace",
        "usereditcount": "$1 {{PLURAL:$1|editace|editace|editací}}",
        "usercreated": "{{GENDER:$3|Registrován|Registrována|Registrován(a)}} $1 v $2",
        "newpages": "Nejnovější stránky",
+       "newpages-submit": "Zobrazit",
        "newpages-username": "Uživatelské jméno:",
        "ancientpages": "Nejdéle needitované stránky",
        "move": "Přesunout",
        "specialloguserlabel": "Původce:",
        "speciallogtitlelabel": "Cíl (název nebo {{ns:user}}:Jméno pro uživatele):",
        "log": "Protokolovací záznamy",
+       "logeventslist-submit": "Zobrazit",
        "all-logs-page": "Všechny veřejné záznamy",
        "alllogstext": "Společné zobrazení všech dostupných protokolovacích záznamů pro {{grammar:4sg|{{SITENAME}}}}.\nZobrazení 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.",
        "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ší.",
        "categories": "Kategorie",
+       "categories-submit": "Zobrazit",
        "categoriespagetext": "Následující kategorie {{PLURAL:$1|obsahuje|obsahují}} stránky nebo soubory.\nNezobrazují se tu [[Special:UnusedCategories|nepoužívané kategorie]].\nPodívejte se také na [[Special:WantedCategories|žádané kategorie]].",
        "categoriesfrom": "Zobrazit kategorie počínaje od:",
        "special-categories-sort-count": "seřadit podle počtu",
        "activeusers-hidebots": "Skrýt roboty",
        "activeusers-hidesysops": "Skrýt správce",
        "activeusers-noresult": "Nenalezen žádný uživatel.",
+       "activeusers-submit": "Zobrazit aktivní uživatele",
        "listgrouprights": "Práva skupin uživatelů",
        "listgrouprights-summary": "Toto je seznam uživatelských skupin definovaných na této wiki a&nbsp;jejich přístupových práv.\n\n[[{{MediaWiki:Listgrouprights-helppage}}|Podrobné informace o&nbsp;jednotlivých právech]]",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Udělená práva</span>\n* <span class=\"listgrouprights-revoked\">Odebraná práva</span>",
        "wlheader-showupdated": "Stránky, které se změnily od vaší poslední návštěvy, jsou zobrazeny '''tučně'''.",
        "wlnote": "Níže {{PLURAL:$1|je poslední změna|jsou poslední <strong>$1</strong> změny|je posledních <strong>$1</strong> změn}} za {{PLURAL:$2|poslední hodinu|poslední <strong>$2</strong> hodiny|posledních <strong>$2</strong> hodin}} do $4, $3.",
        "wlshowlast": "Ukázat posledních $1 hodin $2 dnů",
+       "watchlistall2": "všechno",
+       "watchlist-hide": "Skrýt",
+       "watchlist-submit": "Zobrazit",
+       "wlshowtime": "Zobrazené období:",
+       "wlshowhideminor": "malé editace",
+       "wlshowhidebots": "boty",
+       "wlshowhideliu": "registrované uživatele",
+       "wlshowhideanons": "anonymní uživatele",
+       "wlshowhidepatr": "prověřené editace",
+       "wlshowhidemine": "moje editace",
        "watchlist-options": "Možnosti sledovaných stránek",
        "watching": "Přidávám na seznam sledovaných stránek…",
        "unwatching": "Odebírám ze seznamu sledovaných stránek…",
        "delete-confirm": "Smazání stránky „$1“",
        "delete-legend": "Smazat",
        "historywarning": "<strong>Varování:</strong> Stránka, kterou se chystáte smazat, má historii s $1 {{PLURAL:$1|revizí|revizemi}}:",
+       "historyaction-submit": "Zobrazit",
        "confirmdeletetext": "Chystáte se smazat stránku s celou její historií. Prosím potvrďte, že to opravdu chcete učinit, že si uvědomujete důsledky a že je to v souladu s [[{{MediaWiki:Policy-url}}|pravidly]].",
        "actioncomplete": "Provedeno",
        "actionfailed": "Operace se nezdařila",
        "contributions": "Příspěvky {{GENDER:$1|uživatele|uživatelky}}",
        "contributions-title": "Příspěvky uživatele $1",
        "mycontris": "Příspěvky",
+       "anoncontribs": "Příspěvky",
        "contribsub2": "{{GENDER:$3|uživatele|uživatelky}} $1 ($2)",
        "contributions-userdoesnotexist": "Uživatelský účet „$1“ není zaregistrován.",
        "nocontribs": "Nenalezeny žádné změny vyhovující kritériím.",
        "sp-contributions-search": "Zobrazení příspěvků",
        "sp-contributions-username": "IP adresa nebo uživatelské jméno:",
        "sp-contributions-toponly": "Zobrazit pouze editace na aktuální revizi",
-       "sp-contributions-newonly": "Zobrazovat pouze editace zakládající stránku",
+       "sp-contributions-newonly": "Zobrazit pouze editace zakládající stránku",
        "sp-contributions-submit": "Zobrazit",
        "whatlinkshere": "Odkazuje sem",
        "whatlinkshere-title": "Stránky odkazující na „$1“",
        "whatlinkshere-hidelinks": "$1 odkazy",
        "whatlinkshere-hideimages": "$1 vložení souboru",
        "whatlinkshere-filters": "Filtry",
+       "whatlinkshere-submit": "Přejít",
        "autoblockid": "Autoblok #$1",
        "block": "Zablokovat uživatele",
        "unblock": "Odblokovat uživatele",
        "movenosubpage": "Tato stránka nemá žádné podstránky.",
        "movereason": "Důvod:",
        "revertmove": "vrátit",
-       "delete_and_move": "Smazat a přesunout",
        "delete_and_move_text": "==Je potřeba smazání==\n\nCílová stránka „[[:$1]]“ již existuje. Přejete si ji smazat pro uvolnění místa pro přesun?",
        "delete_and_move_confirm": "Ano, smazat cílovou stránku",
        "delete_and_move_reason": "Smazáno pro umožnění přesunu z „[[$1]]“",
        "tooltip-pt-preferences": "Vaše nastavení",
        "tooltip-pt-watchlist": "Seznam stránek, jejichž změny sledujete",
        "tooltip-pt-mycontris": "Seznam vašich příspěvků",
+       "tooltip-pt-anoncontribs": "Seznam editací provedených z této IP adresy",
        "tooltip-pt-login": "Doporučujeme vám přihlásit se, ovšem není to povinné.",
        "tooltip-pt-logout": "Odhlásit se",
        "tooltip-pt-createaccount": "Doporučujeme vytvořit si účet a přihlásit se, není to však povinné",
        "exif-compression-6": "JPEG (starý)",
        "exif-copyrighted-true": "Chráněno autorským právem",
        "exif-copyrighted-false": "Bez informací o autorských právech",
+       "exif-photometricinterpretation-1": "Černobílá (černá je 0)",
        "exif-unknowndate": "neznámé datum",
        "exif-orientation-1": "Normální",
        "exif-orientation-2": "Vodorovně převráceno",
        "htmlform-cloner-required": "Je povinná nejméně jedna hodnota.",
        "htmlform-title-badnamespace": "Stránka [[:$1]] není ve jmenném prostoru „{{ns:$2}}“.",
        "htmlform-title-not-creatable": "Pod názvem „$1“ nelze vytvořit stránku",
-       "htmlform-title-not-exists": "Stránka [[:$1]] neexistuje.",
+       "htmlform-title-not-exists": "Stránka $1 neexistuje.",
        "htmlform-user-not-exists": "Uživatel <strong>$1</strong> neexistuje.",
        "htmlform-user-not-valid": "<strong>$1</strong> není platné uživatelské jméno.",
        "sqlite-has-fts": "$1 s podporou plnotextového vyhledávání",
        "logentry-suppress-block": "$1 {{GENDER:$2|zablokoval|zablokovala|blokuje}} {{GENDER:$4|uživatele|uživatelku}} „$3“ s časem vypršení $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|změnil|změnila|mění}} nastavení bloku {{GENDER:$4|uživatele|uživatelky}} „$3“ s časem vypršení $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|naimportoval|naimportovala}} $3 načtením souboru",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|naimportoval|naimportovala}} $3 načtením souboru ($4 {{PLURAL:$4|revize|revize|revizí}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|naimportoval|naimportovala}} $3 z jiné wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|naimportoval|naimportovala}} $3 z $5 ($4 {{PLURAL:$4|revize|revize|revizí}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|sloučil|sloučila}} stránku $3 do $4 (revize po $5)",
        "logentry-move-move": "$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|přesunul|přesunula}} stránku $3 na $4 bez založení přesměrování",
index 8e935b7..2224b7c 100644 (file)
        "logentry-delete-delete": "$1 {{GENDER:$2|поничьжилъ|поничьжила}} страницѫ ⁖ $3 ⁖",
        "logentry-move-move": "$1 {{GENDER:$2|нарєчє}} страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|нарєчє}} страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ бєꙁ прѣнаправлєниꙗ сътворѥниꙗ",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|нарєчє}} страницѧ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ врьхоу прѣнаправлѥниꙗ",
        "logentry-newusers-create": "польꙃєватєльско мѣсто ⁖ $1 ⁖ {{GENDER:$2|сътворѥно}} ѥстъ",
        "logentry-upload-upload": "$1 {{GENDER:$2|положишє}} $3",
        "revdelete-summary": "мѣнꙑ опьсаниѥ",
index f8d3a0a..1da3321 100644 (file)
        "moredotdotdot": "Малалла…",
        "mypage": "Страница",
        "mytalk": "Сӳтсе явни",
-       "anontalk": "Çак IP-адреса сӳтсе явни",
+       "anontalk": "Сӳтсе явни",
        "navigation": "Меню",
        "and": "&#32;тата",
        "qbfind": "Шырани",
        "userloginnocreate": "Кĕмелли",
        "logout": "Сеансне пĕтерни",
        "userlogout": "Тухрăр",
-       "notloggedin": "ЭÑ\81иÑ\80 Ñ\81айÑ\82а Ðºĕмен",
+       "notloggedin": "Ð\9aĕмен",
        "nologin": "Аккаунт çук-и? $1.",
        "nologinlink": "Çĕнĕ хутшăнакана регистрацилесси",
        "createaccount": "Аккаунт ту",
        "grouppage-suppress": "{{ns:project}}:Тĕрĕслекенсем",
        "rightslogtext": "Ку хутшăнакансен прависене улăштарнисен журналĕ.",
        "enhancedrc-history": "истори",
-       "recentchanges": "Улшăнусем",
+       "recentchanges": "Улăшăннисем",
        "recentchanges-legend": "Çĕнĕ улшăнусен ĕнерлевĕ",
+       "recentchanges-label-newpage": "Çĕнĕ страница тунă пулнă",
+       "recentchanges-label-minor": "Нумайах мар улăштарни",
        "recentchanges-label-bot": "Ку улшăнăва бот тунă",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (пăхăр [[Special:NewPages|çĕнĕ страницăсен списокĕ]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "recentchangeslinked-page": "Страницă ячĕ:",
        "upload": "Файла кĕртесси",
        "uploadbtn": "Файла кĕрт",
-       "uploadnologin": "ЭÑ\81иÑ\80 Ñ\81айÑ\82а ÐºÄ\95мен.",
+       "uploadnologin": "Ð\9aÄ\95мен",
        "uploadnologintext": "Сирĕн $1 файлсем кĕртес тесен.",
        "uploaderror": "Файла кĕртне чухне йăнăш пулчĕ",
        "uploadlogpage": "Файлсене кĕртнине кăтартакан журнал",
        "unwatch": "ан сăна",
        "unwatchthispage": "Сăнама пăрах",
        "notanarticle": "Ку статья мар",
+       "watchlistall2": "пурте",
        "watching": "Сăнамаллисем шутне хушасси…",
        "unwatching": "Сăнав ят-йышĕнчен кăларса пăрахасси…",
        "enotif_reset": "Пур страницăсене те пăхнă пек палăрт",
        "contributions": "{{GENDER:$1|Усă куракан}} ӳсĕмĕсем",
        "contributions-title": "Усă куракан $1 хушни",
        "mycontris": "Хушни",
+       "anoncontribs": "Хушни",
        "contribsub2": "{{GENDER:$3|$1}} валли ($2)",
        "uctop": "(хальхи)",
        "month": "Уйăхран (тата маларах):",
        "movetalk": "Статьяна сӳтсе явнă страницăн ятне те улăштармалла",
        "movelogpage": "Ятне улăштарнин логĕ",
        "movereason": "Сăлтавĕ",
-       "delete_and_move": "Кăларса пăрахса куçарасси",
        "delete_and_move_text": "==Кăларса пăрахмалла==\n[[:$1|«$1»]] ятлă страница пур. Урăх ят парас тесе ăна кăларса пăрахмалла-и?",
        "delete_and_move_confirm": "Ку страницăна чăнах та кăларса пăрахмалла",
        "delete_and_move_reason": "Ятне улăштарма кăларса пăрахнă \"[[$1]]\"",
        "importlogpage": "Импорт журналĕ",
        "tooltip-pt-userpage": "Сирĕн хутшăнакан страници",
        "tooltip-pt-mytalk": "Сирĕн канашлу страници",
+       "tooltip-pt-anontalk": "IP адресне сӳтсе явни",
        "tooltip-pt-preferences": "Сирĕн ĕнерлевсем",
        "tooltip-pt-watchlist": "Эсир пăхакан страницисем",
+       "tooltip-pt-anoncontribs": "Ку IP адреспа тӳрлетнисем",
        "tooltip-pt-logout": "Сеансне пĕтер",
        "tooltip-ca-talk": "Статьяна сӳтсе явасси",
        "tooltip-ca-edit": "Эсир ку страницӑна тӳрлетме пултаратӑр. Тархасшӑн ҫырса хӑваричен страницӑ мӗнле пулассине пӑхӑр.",
index ae34411..0281695 100644 (file)
        "tog-underline": "Tanlinellu cysylltiadau:",
        "tog-hideminor": "Cuddio golygiadau bychain yn rhestr y newidiadau diweddar",
        "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 rhestr y tudalennau newydd",
+       "tog-newpageshidepatrolled": "Cuddio tudalennau a batroliwyd o'r rhestr y tudalennau newydd",
+       "tog-hidecategorization": "Cuddiwych y categoriau",
        "tog-extendwatchlist": "Ehangu'r rhestr wylio i ddangos pob golygiad yn hytrach na'r diweddaraf yn unig",
-       "tog-usenewrc": "Yn dangos newidiadau i un dudalen gyda'i gilydd - ar 'newidiadau diweddar' a'r 'rhestr wylio'",
+       "tog-usenewrc": "Grwpio'r newidiadau bob yn ddalen yn y 'newidiadau diweddar' a'r 'rhestr wylio'",
        "tog-numberheadings": "Rhifo penawdau'n awtomatig",
        "tog-showtoolbar": "Dangos y bar offer golygu",
        "tog-editondblclick": "Golygu tudalennau wrth glicio ddwywaith",
@@ -31,6 +32,7 @@
        "tog-watchdefault": "Ychwanegu tudalennau a ffeiliau at fy rhestr wylio wrth i mi eu golygu",
        "tog-watchmoves": "Ychwanegu tudalennau a ffeiliau at fy rhestr wylio wrth i mi eu symud",
        "tog-watchdeletion": "Ychwanegu tudalennau a ffeiliau at fy rhestr wylio wrth i mi eu dileu",
+       "tog-watchrollback": "Ychwanegwch ddalennau dw i wedi perfformio 'rollback' i fy ffefrynnau",
        "tog-minordefault": "Marcio pob golygiad fel un bach yn ddiofyn",
        "tog-previewontop": "Dangos y rhagolwg cyn y blwch golygu",
        "tog-previewonfirst": "Dangos rhagolwg ar y golygiad cyntaf",
@@ -49,6 +51,7 @@
        "tog-watchlisthideliu": "Cuddio golygiadau gan ddefnyddwyr mewngofnodedig rhag y rhestr wylio",
        "tog-watchlisthideanons": "Cuddio golygiadau gan ddefnyddwyr anhysbys rhag y rhestr wylio",
        "tog-watchlisthidepatrolled": "Cuddio golygiadau sydd wedi derbyn ymweliad patrôl rhag y rhestr wylio",
+       "tog-watchlisthidecategorization": "Cuddiwych y categoriau",
        "tog-ccmeonemails": "Anfon copi ataf pan anfonaf e-bost at ddefnyddiwr arall",
        "tog-diffonly": "Peidio â dangos cynnwys y dudalen islaw'r gymhariaeth ar dudalennau cymharu",
        "tog-showhiddencats": "Dangos categorïau cuddiedig",
        "disclaimers": "Gwadiadau",
        "disclaimerpage": "Project:Gwadiad Cyffredinol",
        "edithelp": "Help gyda golygu",
+       "helppage-top-gethelp": "Cymorth",
        "mainpage": "Hafan",
        "mainpage-description": "Hafan",
        "policy-url": "Project:Policy",
        "nstab-template": "Nodyn",
        "nstab-help": "Cymorth",
        "nstab-category": "Categori",
+       "mainpage-nstab": "Hafan",
        "nosuchaction": "Dim gweithred o'r fath",
        "nosuchactiontext": "Nid yw'r weithred sydd ynghlwm wrth y cyfeiriad URL yn un dilys.\nEfallai eich bod wedi camdeipio'r URL, neu eich bod wedi dilyn cyswllt gwallus.\nNeu efallai fod byg ar {{SITENAME}}.",
        "nosuchspecialpage": "Does dim tudalen arbennig o'r fath",
        "readonly_lag": "Mae'r databas wedi'i gloi'n awtomatig tra bod y gwas-weinyddion yn asio gyda'r prif weinydd",
        "internalerror": "Gwall mewnol",
        "internalerror_info": "Gwall mewnol: $1",
+       "internalerror-fatal-exception": "Cafwyd nam difrifol o fath \"$1\"",
        "filecopyerror": "Wedi methu copïo'r ffeil \"$1\" i \"$2\".",
        "filerenameerror": "Wedi methu ail-enwi'r ffeil '$1' yn '$2'.",
        "filedeleteerror": "Wedi methu dileu'r ffeil \"$1\".",
        "createaccountreason": "Rheswm:",
        "createacct-reason": "Rheswm",
        "createacct-reason-ph": "Pam ydych yn creu cyfrif arall?",
-       "createacct-captcha": "Gwiriad diogelwch",
-       "createacct-imgcaptcha-ph": "Nodwch y testun a welwch uchod",
        "createacct-submit": "Creer y cyfrif",
        "createacct-another-submit": "Creer y cyfrif ychwanegol",
        "createacct-benefit-heading": "Ffrwyth llafur pobl fel chi yw {{SITENAME}}.",
        "prefs-watchlist-token": "Tocyn y rhestr wylio:",
        "prefs-misc": "Amrywiol",
        "prefs-resetpass": "Newid y cyfrinair",
-       "prefs-changeemail": "Newid y cyfeiriad e-bost",
+       "prefs-changeemail": "Newid neu ddiddymu'r cyfeiriad e-bost",
        "prefs-setemail": "Gosod cyfeiriad e-bost",
        "prefs-email": "E-bostio",
        "prefs-rendering": "Ymddangosiad",
        "rows": "Rhesi:",
        "columns": "Colofnau:",
        "searchresultshead": "Chwilio",
-       "stub-threshold": "Trothwy ar gyfer fformatio <a href=\"#\" class=\"stub\">cyswllt eginyn</a> (beitiau):",
+       "stub-threshold": "Trothwy ar gyfer fformatio cyswllt egin ($1):",
+       "stub-threshold-sample-link": "sampl",
        "stub-threshold-disabled": "Analluogwyd",
        "recentchangesdays": "Nifer y diwrnodau i'w dangos yn 'newidiadau diweddar':",
        "recentchangesdays-max": "(hyd at $1 {{PLURAL:$1||diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}})",
        "prefs-help-recentchangescount": "Mae hwn yn cynnwys newidiadau diweddar, hanesion tudalennau, a logiau.",
        "prefs-help-watchlist-token2": "Dyma'r tocyn cudd i borthiant gwe eich rhestr wylio.\nBydd unrhyw un sy'n gwybod hwn yn gallu darllen eich rhestr wylio, felly peidiwch a'i roi i neb.\n[[Special:ResetTokens|Cliciwch fan hyn os oes angen ailosod y tocyn]].",
        "savedprefs": "Mae eich dewisiadau wedi cael eu cadw.",
+       "savedrights": "Nid yw hawliau {{GENDER:$1|$1}} wedi'u harbed.",
        "timezonelegend": "Ardal amser:",
        "localtime": "Amser lleol:",
        "timezoneuseserverdefault": "Defnyddio'r amser yn ôl y wici ($1)",
        "badsig": "Llofnod crai annilys; gwiriwch y tagiau HTML.",
        "badsiglength": "Mae'ch llysenw'n rhy hir.\nGall fod hyd at $1 {{PLURAL:$1|llythyren|lythyren|lythyren|llythyren|llythyren|llythyren}} o hyd.",
        "yourgender": "Sut yr hoffech chi gael eich disgrifio:",
-       "gender-unknown": "Mae'n well gennyf beidio nodi",
+       "gender-unknown": "Pan gyfeirir atoch, bydd y meddalwedd yn defnyddio termau niwtral, pan fo hynny'n bosib",
        "gender-male": "Mae e'n golygu tudalennau wici",
        "gender-female": "Mae hi'n golygu tudalennau wici",
        "prefs-help-gender": "Nid oes rhaid llanw'r dewis yma. \nMae'r meddalwedd yn defnyddio hwn i gyfeirio atoch ac i'ch cyfarch yn ôl eich rhyw.\nMae'r wybodaeth hon ar gael i'r cyhoedd.",
        "userrights-lookup-user": "Rheoli grwpiau defnyddiwr",
        "userrights-user-editname": "Rhowch enw defnyddiwr:",
        "editusergroup": "Golygu Grwpiau Defnyddwyr",
-       "editinguser": "Newid galluoedd y defnyddiwr '''[[User:$1|$1]]''' $2",
+       "editinguser": "Newid galluoedd {{GENDER:$1|y defnyddiwr}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Golygu grwpiau defnyddwyr",
        "saveusergroups": "Cadw'r Grwpiau Defnyddwyr",
        "userrights-groupsmember": "Yn aelod o:",
        "group-bot": "Botiau",
        "group-sysop": "Gweinyddwyr",
        "group-bureaucrat": "Biwrocratiaid",
-       "group-suppress": "Goruchwylwyr",
+       "group-suppress": "Gwastrodwyr",
        "group-all": "(pawb)",
        "group-user-member": "{{GENDER:$1|defnyddiwr}}",
        "group-autoconfirmed-member": "{{GENDER:$1|defnyddiwr wedi ei gadarnhau'n awtomatig}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|gweinyddwr}}",
        "group-bureaucrat-member": "{{GENDER:$1|biwrocrat}}",
-       "group-suppress-member": "{{GENDER:$1|goruchwyliwr}}",
+       "group-suppress-member": "{{GENDER:$1|gwastrodwyr}}",
        "grouppage-user": "{{ns:project}}:Defnyddwyr",
        "grouppage-autoconfirmed": "{{ns:project}}:Defnyddwyr wedi eu cadarnhau'n awtomatig",
        "grouppage-bot": "{{ns:project}}:Botiau",
        "grouppage-sysop": "{{ns:project}}:Gweinyddwyr",
        "grouppage-bureaucrat": "{{ns:project}}:Biwrocratiaid",
-       "grouppage-suppress": "{{ns:project}}:Goruchwylio",
+       "grouppage-suppress": "{{ns:project}}:Gwastrodi",
        "right-read": "Darllen tudalennau",
        "right-edit": "Golygu tudalennau",
        "right-createpage": "Creu tudalennau (nad ydynt yn dudalennau sgwrs)",
        "right-protect": "Newid lefelau diogelu a golygu tudalennau a sgydol-ddiogelwyd",
        "right-editprotected": "Golygu tudalennau sydd wedi eu diogelu ond mai \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Golygu tudalennau sydd wedi eu diogelu, ond \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Golygu cynnwys y ddalen",
        "right-editinterface": "Golygu'r rhyngwyneb",
        "right-editusercssjs": "Golygu ffeiliau CSS a JS yn perthyn i ddefnyddwyr eraill",
        "right-editusercss": "Golygu ffeiliau CSS yn perthyn i ddefnyddwyr eraill",
        "right-override-export-depth": "Allforio tudalennau gan gynnwys tudalennau cysylltiedig hyd at ddyfnder o 5",
        "right-sendemail": "Anfon e-bost at ddefnyddwyr eraill",
        "right-passwordreset": "Gweld e-byst sy'n ailosod cyfrinair",
+       "right-managechangetags": "Creu a dileu [[Special:Tags|tagiau]] o'r gronfa ddata",
        "newuserlogpage": "Lòg creu cyfrifon defnyddwyr newydd",
        "newuserlogpagetext": "Dyma restr o'r defnyddwyr newydd sydd wedi ymuno â'r wici.",
        "rightslog": "Lòg galluoedd defnyddiwr",
        "recentchangeslinked-summary": "Mae'r dudalen arbennig hon yn dangos y newidiadau diweddaraf i'r tudalennau hynny y mae cyswllt yn arwain atynt ar y dudalen a enwir (neu newidiadau i dudalennau sy'n aelodau o'r categori a enwir). Dangosir tudalennau sydd ar [[Special:Watchlist|eich rhestr wylio]] mewn print '''trwm'''.",
        "recentchangeslinked-page": "Tudalen:",
        "recentchangeslinked-to": "Dangos newidiadau i'r tudalennau â chyswllt arnynt sy'n arwain at y dudalen a enwir",
+       "recentchanges-page-added-to-category": "Ychwanegwyd [[:$1]] at y categori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] ac {{PLURAL:$2|un ddalen|$2 dalen}} wedi'u hychwanegu at y categori",
        "upload": "Uwchlwytho ffeil",
        "uploadbtn": "Uwchlwytho ffeil",
        "reuploaddesc": "Dileu'r uwchlwytho a dychwelyd i'r ffurflen uwchlwytho",
        "uploaderror": "Gwall tra'n uwchlwytho ffeil",
        "upload-recreate-warning": "'''Rhybudd: Cafodd ffeil o'r enw hwn ei dileu neu ei symud.'''\n\nDyma'r lòg dileu a symud ar gyfer y dudalen hon, er gwybodaeth:",
        "uploadtext": "Defnyddiwch y ffurflen isod i uwchlwytho ffeiliau.\nI weld a chwilio am ffeiliau sydd eisoes wedi eu huwchlwytho, ewch at y [[Special:FileList|rhestr o'r ffeiliau sydd wedi eu huwchlwytho]]. I weld cofnodion uwchlwytho a dileu ffeiliau, ewch at y [[Special:Log/upload|lòg uwchlwytho]] neu'r [[Special:Log/delete|lòg dileu]].\n\nI osod ffeil mewn tudalen, defnyddiwch gyswllt wici ar un o'r ffurfiau canlynol:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ffeil.jpg]]</nowiki></code>''', er mwyn defnyddio fersiwn llawn y ffeil\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Ffeil.png|200px|bawd|chwith|testun amgen]]</nowiki></code>''' a wnaiff dangos llun 200 picsel o led mewn blwch ar yr ochr chwith, a'r testun 'testun amgen' wrth ei odre\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Ffeil.ogg]]</nowiki></code>''' a fydd yn arwain yn syth at y ffeil heb arddangos y ffeil.",
-       "upload-permitted": "Mathau o ffeiliau a ganiateir: $1",
-       "upload-preferred": "Mathau ffeil dewisol: $1.",
-       "upload-prohibited": "Mathau o ffeiliau a waherddir: $1.",
+       "upload-permitted": "{{PLURAL:$2|Ffeil|Ffeiliau}} a ganiateir: $1.",
+       "upload-preferred": "Mathau o {{PLURAL:$2|ffeil|ffeiliau}} dewisol: $1.",
+       "upload-prohibited": "Mathau o {{PLURAL:$2|ffeil|ffeiliau}} a waherddir: $1.",
        "uploadlogpage": "Lòg uwchlwytho",
        "uploadlogpagetext": "Isod mae rhestr o'r uwchlwythiadau ffeiliau <nowiki>diweddaraf</nowiki>.\nGweler [[Special:NewFiles|oriel y ffeiliau newydd]] i fwrw golwg drostynt.",
        "filename": "Enw'r ffeil",
        "nopagetext": "Nid yw'r dudalen a enwyd ar gael.",
        "pager-newer-n": "{{PLURAL:$1|y $1 mwy diweddar|yr 1 mwy diweddar|y $1 mwy diweddar|y $1 mwy diweddar|y $1 mwy diweddar|y $1 mwy diweddar}}.",
        "pager-older-n": "{{PLURAL:$1|y $1 cynharach|yr $1 cynharach|y $1 cynharach|y $1 cynharach|y $1 cynharach|y $1 cynharach}}",
-       "suppress": "Goruchwylio",
+       "suppress": "Gwastrodi",
        "querypage-disabled": "Analluogwyd y dudalen arbennig hon er mwyn osgoi iddi andwyo perfformiad y wefan.",
        "apihelp": "Cymorth API",
        "apihelp-no-such-module": "Ni chafwyd hyd i fodiwl \"$1\".",
        "booksources-text": "Mae'r rhestr isod yn cynnwys cysylltiadau i wefannau sy'n gwerthu llyfrau newydd a rhai ail-law. Mae rhai o'r gwefannau hefyd yn cynnig gwybodaeth pellach am y llyfrau hyn:",
        "booksources-invalid-isbn": "Ymddengys nad yw'r rhif ISBN hwn yn ddilys; efallai y cafwyd gwall wrth drosglwyddo'r rhif.",
        "specialloguserlabel": "Gwneuthurwr:",
-       "speciallogtitlelabel": "Gwrthrych (teitl neu ddefnyddiwr):",
+       "speciallogtitlelabel": "Targed (teitl neu {{ns:user}}:username ar gyfer y defnyddiwr):",
        "log": "Logiau",
        "all-logs-page": "Pob lòg cyhoeddus",
        "alllogstext": "Mae pob cofnod yn holl logiau {{SITENAME}} wedi cael eu rhestru yma.\nGallwch weld chwiliad mwy penodol trwy ddewis y math o lòg, enw'r defnyddiwr, neu'r dudalen benodedig.\nSylwer bod llythrennau mawr neu fach o bwys i'r chwiliad.",
        "emailccsubject": "Copi o'ch neges at $1: $2",
        "emailsent": "Neges e-bost wedi'i hanfon",
        "emailsenttext": "Mae eich neges e-bost wedi cael ei hanfon.",
-       "emailuserfooter": "Anfonwyd yr e-bost hwn oddi wrth $1 at $2 trwy ddefnyddio'r teclyn \"Anfon e-bost at ddefnyddiwr\" ar {{SITENAME}}.",
+       "emailuserfooter": "Danfonwyd yr ebost {{GENDER:$1|hwn}} gan $1 i {{GENDER:$2|$2}} drwy \"{{int:emailuser}}\" ar {{SITENAME}}.",
        "usermessage-summary": "Yn gadael neges am ddigwyddiad yn y sustem.",
        "usermessage-editor": "Golygydd neges y system",
        "watchlist": "Rhestr wylio",
        "watchlistanontext": "Rhaid mewngofnodi er mwyn gweld neu olygu'r rhestr wylio.",
        "watchnologin": "Nid ydych wedi mewngofnodi",
        "addwatch": "Ychwanegu at y rhestr wylio",
-       "addedwatchtext": "Mae'r dudalen \"[[:$1|$1]]\" wedi cael ei hychwanegu at eich [[Special:Watchlist|rhestr wylio]].\nPan fydd y dudalen hon, neu ei thudalen sgwrs, yn newid, fe fyddant yn ymddangos ar y rhestr honno.",
+       "addedwatchtext": "Mae \"[[:$1]]\"  a'i dudalen Sgwrs wedi cael eu hychwanegu at eich [[Special:Watchlist|rhestr wylio]].",
        "addedwatchtext-short": "Mae'r dudalen \"$1\"  wedi'i hychwanegu i'ch rhestr wylio.",
        "removewatch": "Tynnu oddi ar eich rhestr wylio",
-       "removedwatchtext": "Mae'r dudalen \"[[:$1]]\" wedi'i thynnu oddi ar [[Special:Watchlist|eich rhestr wylio]].",
+       "removedwatchtext": "Mae'r dudalen \"[[:$1]]\" a'i thudalen Sgwrs wedi'u tynnu oddi ar [[Special:Watchlist|eich rhestr wylio]].",
        "removedwatchtext-short": "Mae'r dudalen \"$1\" wedi'i thynnu o'ch tudalen wylio.",
        "watch": "Gwylio",
        "watchthispage": "Gwylier y dudalen hon",
        "wlheader-showupdated": "Mae tudalennau sydd wedi newid ers i chi eu gweld ddiwethaf wedi'u '''hamlygu'''.",
        "wlnote": "Isod, {{PLURAL:$1|yw'r golygiad diweddaraf |yw'r golygiadau diweddaraf <strong>$1</strong> changes}} yn y {{PLURAL:$2|hour|<strong>$2</strong> awr}}, fel ag y mae ar $3, $4.",
        "wlshowlast": "Dangoser newidiadau'r $1 awr ddiwethaf neu'r $2 {{PLURAL:$2|diwrnod|diwrnod|ddiwrnod|diwrnod|diwrnod|diwrnod}} diwethaf neu'r newidiadau.",
+       "watchlistall2": "holl",
+       "wlshowtime": "Dangos y diwethaf:",
+       "wlshowhideminor": "golygiadau bychan",
+       "wlshowhidebots": "botiau",
+       "wlshowhideliu": "defnyddwyr cofrestredig",
+       "wlshowhideanons": "defnyddwyr heb gofnodi",
+       "wlshowhidepatr": "golygiadau sydd wedi derbyn patrol",
+       "wlshowhidemine": "fy ngolygiadau",
        "watchlist-options": "Dewisiadau ar gyfer y rhestr wylio",
        "watching": "Wrthi'n ychwanegu...",
        "unwatching": "Wrthi'n tynnu...",
        "deletepage": "Dilëir y dudalen",
        "confirm": "Cadarnhau",
        "excontent": "y cynnwys oedd: '$1'",
-       "excontentauthor": "y cynnwys oedd: '$1' (a'r unig gyfrannwr oedd '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "y cynnwys oedd: \"$1\", a'r unig gyfrannwr oedd \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "y cynnwys cyn blancio oedd: '$1'",
        "delete-confirm": "Dileu \"$1\"",
        "delete-legend": "Dileu",
        "rollback-success": "Gwrthdrowyd y golygiadau gan $1;\nwedi gwrthdroi i'r golygiad olaf gan $2.",
        "sessionfailure-title": "Sesiwn wedi methu",
        "sessionfailure": "Mae'n debyg fod yna broblem gyda'ch sesiwn mewngofnodi; diddymwyd y weithred er mwyn diogelu'r sustem rhag ddefnyddwyr maleisus. Gwasgwch botwm 'nôl' eich porwr ac ail-lwythwch y dudalen honno, yna ceisiwch eto.",
+       "changecontentmodel-title-label": "Teitl y ddalen",
+       "changecontentmodel-reason-label": "Rheswm:",
        "protectlogpage": "Lòg diogelu",
        "protectlogtext": "Isod mae rhestr o bob gweithred diogelu (a dad-ddiogelu) tudalen.\nMae'r tudalennau sydd wedi eu diogelu ar hyn o bryd wedi eu rhestri ar y [[Special:ProtectedPages|rhestr tudalennau wedi eu diogelu]].",
        "protectedarticle": "wedi diogelu '[[$1]]'",
        "protect-locked-blocked": "Ni allwch newid y lefel diogelu tra eich bod wedi eich blocio.\nDyma'r gosodiadau diogelu cyfredol ar gyfer y dudalen '''$1''':",
        "protect-locked-dblock": "Ni ellir newid y lefel diogelu gan fod y databas dan glo.\nDyma'r gosodiadau diogelu cyfredol ar gyfer y dudalen '''$1''':",
        "protect-locked-access": "Nid yw'r gallu i newid lefel diogelu ar dudalen ynghlwm wrth eich cyfrif defnyddiwr.\nDyma'r gosodiadau diogelu cyfredol ar gyfer y dudalen '''$1''':",
-       "protect-cascadeon": "Mae'r dudalen hon wedi ei diogelu ar hyn o bryd oherwydd ei bod wedi ei chynnwys yn y {{PLURAL:$1|dudalen|dudalen|tudalennau}} canlynol sydd wedi {{PLURAL:$1|ei|ei|eu}} sgydol-diogelu.  Gallwch newid lefel diogelu'r dudalen hon, ond ni fydd hynny'n effeithio ar y sgydol-ddiogelu.",
+       "protect-cascadeon": "Mae'r dudalen hon wedi ei diogelu ar hyn o bryd oherwydd ei bod wedi ei chynnwys yn y {{PLURAL:$1|dudalen|dudalen|tudalennau}} canlynol sydd wedi {{PLURAL:$1|ei|ei|eu}} diogelu. Gallwch newid lefel diogelu'r dudalen hon, ond ni fydd hynny'n effeithio ar y sgydol-ddiogelu (''cascading protection'').",
        "protect-default": "Caniatáu'r gallu i bob defnyddiwr",
        "protect-fallback": "Caniatau i'r defnyddwyr gyda'r gallu \"$1\" yn unig wneud hyn",
        "protect-level-autoconfirmed": "Caniatau'r defnyddwyr sydd wedi eu cadarnhau'n awtomatig yn unig",
        "undeletepagetext": "Mae'r {{PLURAL:$1|dudalen ganlynol wedi cael ei dileu ond mae hi|$1 tudalen ganlynol wedi cael eu dileu ond maent}} ar gael o hyd yn yr archif, ac mae modd i'w hadfer os oes angen.\nGall yr archif gael ei glanhau o dro i dro.",
        "undelete-fieldset-title": "Adfer diwygiadau",
        "undeleteextrahelp": "I adfer hanes gyfan y dudalen, gadewch bob blwch ticio'n wag a phwyso'r botwm '''''{{int:undeletebtn}}'''''. I adfer rhai diwygiadau'n unig, ticiwch y blychau ar gyfer y diwygiadau yr ydych am eu hadfer, wedyn pwyso ar '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "Gosodwyd $1 {{PLURAL:$1|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn}} yn yr archif",
+       "undeleterevisions": "Dilewyd $1 {{PLURAL:$1|fersiwn}}",
        "undeletehistory": "Os adferwch y dudalen, aderir yr holl ddiwygiadau hefyd yn hanes y dudalen.\nOs crëwyd tudalen newydd o'r un enw ers iddi chael ei dileu, dangosir y diwygiadau cynt yn yr hanes, heb ddisodli'r dudalen bresennol.",
        "undeleterevdel": "Ni chyflawnir adfer pe byddai peth o'r diwygiad blaen i'r dudalen neu'r ffeil yn cael ei dileu oherwydd yr adfer.\nOs hynny, mae'n rhaid i chi dad-dicio'r diwygiad dileedig diweddaraf neu ei ddatguddio.",
        "undeletehistorynoadmin": "Dilëwyd y dudalen hon. Dangosir y rheswm dros y dileu isod, ynghyd â manylion o'r holl ddefnyddwyr a olygwyd y dudalen cyn iddi gael ei dileu. Dim ond gweinyddwyr sy'n gallu gweld testun y diwygiadau i'r dudalen.",
        "cant-move-to-user-page": "Nid yw'r gallu ganddoch i symud tudalen i dudalen defnyddiwr (heblaw am i isdudalen defnyddiwr).",
        "cant-move-category-page": "Nid oes gennych yr hawl i symud categoriau.",
        "cant-move-to-category-page": "Nid oes gennych yr hawl i droi tudalen yn gategori.",
-       "newtitle": "I'r teitl newydd:",
+       "newtitle": "Teitl newydd:",
        "move-watch": "Gwylier y dudalen hon",
        "movepagebtn": "Symud y dudalen",
        "pagemovedsub": "Y symud wedi llwyddo",
        "thumbnail_image-missing": "Mae'n debyg bod y ffeil yn eisiau: $1",
        "thumbnail_image-failure-limit": "'Da chi 'di methu gormod o weithiau ($1 neu fwy) i rendro'r ciplun. Ceisiwch eto nes ymlaen.",
        "import": "Mewnforio tudalennau",
-       "importinterwiki": "Mewnforiad traws-wici",
-       "import-interwiki-text": "Dewiswch wici a thudalen i'w mewnforio.\nFe gedwir dyddiadau ac enwau'r golygwyr ar gyfer y diwygiadau i'r dudalen.\nMae cofnod o bob weithred o fewnforio i'w gweld ar y [[Special:Log/import|lòg mewnforio]].",
+       "importinterwiki": "Mewnforio traws-wici",
+       "import-interwiki-text": "Dewiswch wici a thudalen i'w mewnforio.\nFe gedwir dyddiadau ac enwau'r golygwyr.\nMae cofnod o bob gweithred o fewnforio i'w gweld ar y [[Special:Log/import|lòg mewnforio]].",
        "import-interwiki-sourcewiki": "Ffynhonnell y wici:",
        "import-interwiki-sourcepage": "Ffynhonnell (tud.)",
        "import-interwiki-history": "Copïer yr holl fersiynau yn hanes y dudalen hon",
        "import-interwiki-templates": "Cynhwyser pob nodyn",
        "import-interwiki-submit": "Mewnforio",
+       "import-mapping-default": "Mewnforio i'r lleoliadau diofyn",
+       "import-mapping-namespace": "Mewnforio i barth-defnyddiwr",
        "import-upload-filename": "Enw'r ffeil:",
        "import-comment": "Sylw:",
        "importtext": "Allforiwch y ffeil o'r wici gwreiddiol trwy ddefnyddio'r [[Special:Export|nodwedd allforio]]. Rhowch hi ar gadw ar eich cyfrifiadur, ac wedyn ei huwchlwytho fan hyn.",
        "importcantopen": "Ni ellid agor y ffeil i'w fewnforio",
        "importbadinterwiki": "Cyswllt rhyngwici gwallus",
        "importsuccess": "Y mewnforio wedi llwyddo!",
-       "importnosources": "Ni ddiffiniwyd unrhyw ffynonellau mewnforio traws-wici, ac mae uwchlwytho hanesion yn uniongyrchol wedi'i analluogi.",
+       "importnosources": "Ni ddiffiniwyd unrhyw ffynonellau mewnforio traws-wici, ac mae uwchlwytho'r hanes yn uniongyrchol wedi'i analluogi.",
        "importnofile": "Ni uwchlwythwyd unrhyw ffeil mewnforio.",
        "importuploaderrorsize": "Methodd yr uwchlwytho.\nMae'r ffeil yn fwy na'r maint y gellir ei uwchlwytho.",
        "importuploaderrorpartial": "Methodd yr uwchlwytho.\nDim ond rhan o'r ffeil sydd wedi ei huwchlwytho.",
        "tooltip-pt-logout": "Allgofnodi",
        "tooltip-pt-createaccount": "Rydym yn argymell eich bod yn creu cyfri ac yn menwgofnodi. Fodd bynnag, dydy hyn ddim yn orfodol",
        "tooltip-ca-talk": "Sgwrsio am y dudalen",
-       "tooltip-ca-edit": "Gallwch olygu'r dudalen hon. Da o beth fyddai defnyddio'r botwm 'Dangos rhagolwg' cyn rhoi ar gadw.",
+       "tooltip-ca-edit": "Gallwch olygu'r ddalen hon.",
        "tooltip-ca-addsection": "Ychwanegu adran newydd",
        "tooltip-ca-viewsource": "Mae'r dudalen hon wedi'i diogelu. Gallwch weld y côd yma.",
        "tooltip-ca-history": "Fersiynau cynt o'r dudalen hon.",
        "tooltip-ca-nstab-main": "Gweld y dudalen bwnc",
        "tooltip-ca-nstab-user": "Gweld tudalen y defnyddiwr",
        "tooltip-ca-nstab-media": "Gweld y dudalen gyfrwng",
-       "tooltip-ca-nstab-special": "Mae hon yn dudalen arbennig; ni allwch olygu'r dudalen ei hun",
+       "tooltip-ca-nstab-special": "Mae hon yn dudalen arbennig ac ni allwch ei golygu",
        "tooltip-ca-nstab-project": "Gweld tudalen y wici",
        "tooltip-ca-nstab-image": "Gweld tudalen y ffeil",
        "tooltip-ca-nstab-mediawiki": "Gweld neges y system",
        "version-libraries": "llyfrgelloedd a osodwyd ar eich cyfer",
        "version-libraries-library": "Llyfrgell",
        "version-libraries-version": "Fersiwn",
+       "version-libraries-license": "Trwydded",
+       "version-libraries-description": "Disgrifiad",
+       "version-libraries-authors": "Awduron",
        "redirect": "Ailgyfeirio yn ôl enw ffeil, defnyddiwr, tudalen neu ID y diwygiad",
        "redirect-legend": "Ailgyfeirio i ffeil neu dudalen",
        "redirect-summary": "Mae'r dudalen arbennig hon yn ailgyfeirio at ffeil (o roi enw'r ffeil), at dudalen (o roi ID rhyw ddiwygiad o'r dudalen neu ID y dudalen), neu at dudalen defnyddiwr (o roi rhif ID y defnyddiwr).\nDefnydd: \n[[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], neu [[{{#Special:Redirect}}/user/101]].",
        "tags-tag": "Enw'r tag",
        "tags-display-header": "Y nodyn a welir ar logiau",
        "tags-description-header": "Disgrifiad llawn y tag",
+       "tags-source-header": "Ffynhonnell",
        "tags-active-header": "Yn weithredol?",
        "tags-hitcount-header": "Nifer wedi tagio",
+       "tags-actions-header": "Gweithredoedd",
        "tags-active-yes": "Ydy",
        "tags-active-no": "Nacydy",
+       "tags-source-manual": "Gosod drwy law gan ddefnyddwyr a botiau",
+       "tags-source-none": "Nis defnyddir, bellach",
        "tags-edit": "golygu",
+       "tags-delete": "dileu",
+       "tags-activate": "rhoi ar waith",
+       "tags-deactivate": "ei atal",
        "tags-hitcount": "$1 {{PLURAL:$1|newid}}",
+       "tags-create-heading": "Creu tag newydd",
+       "tags-create-explanation": "Yn ddiofyn, bydd y tagiau newydd i'w gweld gan ddefnyddwyr a botiau.",
+       "tags-create-tag-name": "Enw'r tag:",
+       "tags-create-reason": "Rheswm:",
+       "tags-create-submit": "Dechrau",
+       "tags-create-no-name": "Mae'n rhaid nodi tag enw.",
        "comparepages": "Cymharu tudalennau",
        "compare-page1": "Tudalen 1",
        "compare-page2": "Tudalen 2",
        "api-error-badaccess-groups": "Nid oes caniatad gennych i uwchlwytho ffeiliau ar y wici hwn.",
        "api-error-badtoken": "Gwall mewnol: tocyn gwael.",
        "api-error-copyuploaddisabled": "Nid oes modd uwchlwytho drwy URL ar y gweinydd hwn",
-       "api-error-duplicate": "Mae {{PLURAL:$1||ffeil arall|ffeiliau eraill|ffeiliau eraill|ffeiliau eraill|ffeiliau eraill}} gyda'r un cynnwys {{PLURAL:$1||ynddi|ynddynt|ynddynt|ynddynt|ynddynt}} eisoes ar y wici hwn",
+       "api-error-duplicate": "Mae {{PLURAL:$1||ffeil arall|ffeiliau eraill}} yn bodoli'n barod ar y wefan gyda'r un cynnwys.",
        "api-error-duplicate-archive": "Fe fu {{PLURAL:$1|ffeil arall gyda'r un cynnwys ynddi|ffeiliau eraill gyda'r un cynnwys ynddynt}} ar y safle, ond fe'{{PLURAL:$1|i|u}} dilëwyd.",
        "api-error-empty-file": "Mae'r ffeil a gyflwynwyd gennych yn wag.",
        "api-error-emptypage": "Ni chaniateir dechrau tudalen newydd, a honno'n wag.",
index 2e1beb6..65794d1 100644 (file)
                        "Macofe",
                        "Jyllanj",
                        "Matma Rex",
-                       "Poullindholm"
+                       "Poullindholm",
+                       "Mads Haupt",
+                       "Stefan2",
+                       "Ribewiki"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
@@ -83,7 +86,7 @@
        "tog-uselivepreview": "Benyt løbende forhåndsvisning",
        "tog-forceeditsummary": "Advar mig hvis jeg ikke udfylder beskrivelsesfeltet",
        "tog-watchlisthideown": "Skjul egne ændringer i overvågningslisten",
-       "tog-watchlisthidebots": "Skjul ændringer fra bots i overvågningslisten",
+       "tog-watchlisthidebots": "Skjul ændringer fra botter i overvågningslisten",
        "tog-watchlisthideminor": "Skjul mindre ændringer i overvågningslisten",
        "tog-watchlisthideliu": "Skjul indloggede brugeres redigeringer i overvågningslisten",
        "tog-watchlisthideanons": "Skjul anonyme brugeres redigeringer i overvågningslisten",
        "createaccountreason": "Begrundelse:",
        "createacct-reason": "Årsag",
        "createacct-reason-ph": "Hvorfor du vil oprette endnu en konto",
-       "createacct-captcha": "Sikkerhedskontrol",
-       "createacct-imgcaptcha-ph": "Indtast venligst ovenstående tekst",
        "createacct-submit": "Opret din konto",
        "createacct-another-submit": "Opret konto",
        "createacct-benefit-heading": "{{SITENAME}} laves af mennesker som dig.",
        "passwordreset-emailtext-ip": "Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "passwordreset-emailtext-user": "Brugeren $1 på {{SITENAME}} har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "passwordreset-emailelement": "Brugernavn: \n$1\n\nMidlertidig adgangskode: \n$2",
-       "passwordreset-emailsent": "Hvis dettte er en registreret e-mail-adresse til din konto, så vil en e-mail om nulstilling af adgangskoden blive sendt.",
+       "passwordreset-emailsentemail": "Hvis dettte er en registreret e-mail-adresse til din konto, så vil en e-mail om nulstilling af adgangskoden blive sendt.",
        "passwordreset-emailsent-capture": "En e-mail om nulstilling af adgangskode, som vist nedenfor, er blevet sendt.",
        "passwordreset-emailerror-capture": "En mail om nulstilling af adgangskode, som vist nedenfor, blev genereret, men det lykkedes ikke at sende den til {{GENDER:$2|bruger}}: $1",
        "changeemail": "Ændr eller fjern e-mailadresse",
        "missingsummary": "'''Bemærk:''' Du har ikke angivet en redigeringsbeskrivelse. Hvis du igen trykker på \"{{int:savearticle}}\", gemmes ændringerne uden en beskrivelse.",
        "selfredirect": "<strong>Advarsel:</strong> Du er ved at omdirigere denne side til sig selv.\nDu kan have angivet det forkerte mål for omdirigeringen, eller du kan være ved at redigere den forkerte side.\nHvis du klikker på \"{{int:savearticle}}\" igen, vil omdirigeringen blive oprettet uanset dette.",
        "missingcommenttext": "Skriv venligst en kommentar nedenfor.",
-       "missingcommentheader": "'''Bemærk:''' Du har ikke angivet en overskrift/emne for denne kommentar. Hvis du trykker \"{{int:savearticle}}\" én gang til, gemmes dine ændringer uden overskrift/emne.",
+       "missingcommentheader": "<strong>Bemærk:</strong> Du har ikke angivet en overskrift/emne for denne kommentar. Hvis du trykker \"{{int:savearticle}}\" én gang til, gemmes dine ændringer uden overskrift/emne.",
        "summary-preview": "Forhåndsvisning af beskrivelsen:",
        "subject-preview": "Forhåndsvisning af emnet:",
        "previewerrortext": "Der opstod en fejl under forsøget på at lave en forhåndsvisning af dine ændringer.",
        "readonlywarning": "'''Advarsel: Databasen er låst på grund af vedligeholdelse, så du kan ikke gemme dine ændringer lige nu.'''\nDet kan godt være en god ide at kopiere din tekst til en tekstfil, så du kan gemme den til senere.\n\nAdministratoren som låste databasen, gav denne forklaring: $1",
        "protectedpagewarning": "'''ADVARSEL: Denne side er skrivebeskyttet, så kun administratorer kan redigere den.'''<br />\nDen seneste logpost vises nedenfor:",
        "semiprotectedpagewarning": "'''Bemærk: Siden er låst, så kun registrerede brugere kan ændre den.'''\n<br />Den seneste logpost vises nedenfor:",
-       "cascadeprotectedwarning": "'''BEMÆRK: Denne side er skrivebeskyttet, så den kun kan ændres af brugere med Administratorrettigheder. Den er indeholdt i nedenstående {{PLURAL:$1|side|sider}}, som er skrivebeskyttet med tilvalg af nedarvende sidebeskyttelse:'''",
+       "cascadeprotectedwarning": "<strong>Advarsel:</strong> Denne side er blevet beskyttet, så den kun kan ændres af brugere med administratorrettigheder, fordi indholdet er inkluderet i følgende {{PLURAL:$1|side|sider}} med nedarvet sidebeskyttelse:",
        "titleprotectedwarning": "ADVARSEL:  Den side er låst så kun [[Special:ListGroupRights|visse brugere]] kan oprette den.'''\n<br />Den seneste logpost vises nedenfor:",
        "templatesused": "{{PLURAL:$1|Skabelon|Skabeloner}} der er brugt på denne side:",
        "templatesusedpreview": "Følgende {{PLURAL:$1|skabelon|skabeloner}} bruges i denne forhåndsvisning:",
        "prefs-watchlist-token": "Overvågningslistenøgle:",
        "prefs-misc": "Forskelligt",
        "prefs-resetpass": "Skift adgangskode",
-       "prefs-changeemail": "Ændre e-mailadresse",
+       "prefs-changeemail": "Skift eller fjern e-mailadresse",
        "prefs-setemail": "Angiv en e-mailadresse",
        "prefs-email": "Indstillinger for e-mail",
        "prefs-rendering": "Udseende",
        "rows": "Rækker",
        "columns": "Kolonner",
        "searchresultshead": "Søgeresultater",
-       "stub-threshold": "Grænse for visning af henvisning som <a href=\"#\" class=\"stub\">artikelstump</a>:",
+       "stub-threshold": "Grænse før formatering af stublink ($1):",
        "stub-threshold-disabled": "Deaktiveret",
        "recentchangesdays": "Antal dage som skal vises i seneste ændringer:",
        "recentchangesdays-max": "(maks. $1 {{PLURAL:$1|dag|dage}})",
        "badsig": "Syntaksen i signaturen er ugyldig; kontroller venligst den brugte HTML.",
        "badsiglength": "Din signatur er for lang. Den må højst indeholde $1 {{PLURAL:$1|tegn}}.",
        "yourgender": "Hvordan foretrækker du at blive beskrevet?",
-       "gender-unknown": "Jeg foretrækker ikke at specificere",
+       "gender-unknown": "Når du nævnes, vil softwaren bruge kønsneutrale ord, når det er muligt",
        "gender-male": "Han redigerer wikisider",
        "gender-female": "Hun redigerer wikisider",
        "prefs-help-gender": "Angivelse af denne indstilling er valgfri.\nDet bruges af programmet til at lave kønskorrekte tekster på nogle sprog.\nInformationen vil være offentlig.",
        "prefs-help-prefershttps": "Denne indstilling træder i kraft næste gang du logger på.",
        "prefswarning-warning": "Du har foretaget ændringer af dine indstillinger, som ikke er gemt endnu.\nHvis du forlader denne side uden at klikke \"$1\", vil dine indstillinger ikke blive opdateret.",
        "prefs-tabs-navigation-hint": "Tip: Du kan bruge venstre og højre piletasterne til at navigere mellem fanerne i fanelisten.",
-       "email-address-validity-valid": "E-mailadressen ser ud til at være gyldig",
-       "email-address-validity-invalid": "Indtast en gyldig e-mailadresse",
        "userrights": "Håndtering af brugerrettigheder",
        "userrights-lookup-user": "Administrér brugergrupper",
        "userrights-user-editname": "Skriv et brugernavn:",
        "group-bot": "Robotter",
        "group-sysop": "Administratorer",
        "group-bureaucrat": "Bureaukrater",
-       "group-suppress": "Logskjulere",
+       "group-suppress": "Undertrykkere",
        "group-all": "(alle)",
        "group-user-member": "{{GENDER:$1|bruger}}",
        "group-autoconfirmed-member": "{{GENDER:$1|registreret bruger}}",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureaukrat}}",
-       "group-suppress-member": "{{GENDER:$1|logskjuler}}",
+       "group-suppress-member": "{{GENDER:$1|undertrykker}}",
        "grouppage-user": "{{ns:project}}:Brugere",
        "grouppage-autoconfirmed": "{{ns:project}}:Registrerede brugere",
        "grouppage-bot": "{{ns:project}}:Robotter",
        "grouppage-sysop": "{{ns:project}}:Administratorer",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaukrater",
-       "grouppage-suppress": "{{ns:project}}:Logskjulere",
+       "grouppage-suppress": "{{ns:project}}:Undertryk",
        "right-read": "Se sider",
        "right-edit": "Redigere sider",
        "right-createpage": "Oprette andre sider end diskussionssider",
        "rcshowhidemine": "$1 egne bidrag",
        "rcshowhidemine-show": "Vis",
        "rcshowhidemine-hide": "Skjul",
+       "rcshowhidecategorization-show": "Vis",
+       "rcshowhidecategorization-hide": "Skjul",
        "rclinks": "Vis seneste $1 ændringer i de sidste $2 dage<br />$3",
        "diff": "forskel",
        "hist": "historik",
        "newpageletter": "N",
        "boteditletter": "b",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|overvågende bruger|overvågende brugere}}]",
-       "rc_categories": "Kun sider fra kategorierne (adskilt med „|“):",
-       "rc_categories_any": "Alle",
+       "rc_categories": "Grænse for kategorier (adskilt med \"|\"):",
+       "rc_categories_any": "Nogen af de valgte",
        "rc-change-size": "$1 {{PLURAL:$1|Byte|Bytes}}",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} efter ændring",
        "newsectionsummary": "/* $1 */ nyt afsnit",
        "upload-too-many-redirects": "URL'en indeholdt for mange omdirigeringer",
        "upload-http-error": "Der opstod en HTTP-fejl: $1",
        "upload-copy-upload-invalid-domain": "Uploads af kopier er ikke tilgængelig fra dette domæne.",
+       "upload-dialog-title": "Læg en fil op",
+       "upload-dialog-button-cancel": "Annuller",
+       "upload-dialog-button-done": "Færdig",
+       "upload-dialog-button-save": "Gem",
+       "upload-dialog-button-upload": "Læg op",
+       "upload-form-label-select-file": "Vælg filer",
+       "upload-form-label-infoform-name": "Navn",
+       "upload-form-label-infoform-description": "Beskrivelse",
+       "upload-form-label-usage-filename": "Filnavn",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorier",
+       "foreign-structured-upload-form-label-infoform-date": "Dato",
+       "foreign-structured-upload-form-label-own-work-message-local": "Jeg bekræfter at jeg uploader filen i overenstemmelse med betingelser for brug og licenseringspoltikken på {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Hvis du ikke kan uploade filen under politikerne på {{SITENAME}}, skal du lukke dialogboksen og prøve en anden metode.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Du kan også vælge at prøve [[Special:Upload|den almindelige uploadside]].",
        "backend-fail-stream": "Kunne ikke streame filen $1.",
        "backend-fail-backup": "Kunne ikke lave sikkerhedskopi af filen $1.",
        "backend-fail-notexists": "Filen $1 findes ikke.",
        "nopagetext": "Den angivne side findes ikke.",
        "pager-newer-n": "{{PLURAL:$1|1 nyere|$1 nyere}}",
        "pager-older-n": "{{PLURAL:$1|1 ældre|$1 ældre}}",
-       "suppress": "Skjul logs",
+       "suppress": "Skjul",
        "querypage-disabled": "Denne specialside er deaktiveret af hensyn til ydeevnen.",
        "apihelp": "API-hjælp",
        "apihelp-no-such-module": "Modul \"$1\" ikke fundet.",
        "booksources-text": "Dette er en liste med henvisninger til Internetsider, som sælger nye og brugte bøger. Der kan der også findes yderligere informationer om bøgerne. {{SITENAME}} er ikke forbundet med nogen af dem.",
        "booksources-invalid-isbn": "Det angivne ISBN-nummer ser forkert ud. Tjek med kilden om det er skrevet korrekt.",
        "specialloguserlabel": "Udført af:",
-       "speciallogtitlelabel": "Mål (titel eller bruger):",
+       "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:brugernavn for bruger):",
        "log": "Loglister",
        "all-logs-page": "Alle offentlige logger",
        "alllogstext": "Samlet visning af alle loggene på {{SITENAME}}.\nDu 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.",
        "emailccsubject": "Kopi af din besked til $1: $2",
        "emailsent": "E-mail sendt",
        "emailsenttext": "Din e-mail er blevet sendt.",
-       "emailuserfooter": "Denne e-mail er sendt af $1 til $2 ved hjælp af funktionen \"{{int:emailuser}}\" på {{SITENAME}}.",
+       "emailuserfooter": "Denne e-mail er sendt af $1 til {{GENDER:$2|$2}} ved hjælp af funktionen \"{{int:emailuser}}\" på {{SITENAME}}.",
        "usermessage-summary": "Efterlader system besked.",
        "usermessage-editor": "System messenger",
        "watchlist": "Overvågningsliste",
        "watchlistanontext": "Du skal logge på, for at se din overvågningsliste eller ændre indholdet af den.",
        "watchnologin": "Ikke logget på",
        "addwatch": "Tilføj til overvågningsliste",
-       "addedwatchtext": "Siden \"[[:$1]]\" er blevet tilføjet til din [[Special:Watchlist|overvågningsliste]].\nFremtidige ændringer af denne side og dens tilknyttede diskussionsside vil blive vist der.",
+       "addedwatchtext": "\"[[:$1]]\" og tilhørende diskussionsside er blevet tilføjet til din [[Special:Watchlist|overvågningsliste]].",
        "addedwatchtext-short": "Siden \"$1\" er blevet tilføjet til din overvågningsliste.",
        "removewatch": "Fjern fra overvågningsliste",
-       "removedwatchtext": "Siden \"[[:$1]]\" er blevet fjernet fra [[Special:Watchlist||din overvågningsliste]].",
+       "removedwatchtext": "\"[[:$1]]\" og tilhørende diskussionsside er blevet fjernet fra din [[Special:Watchlist|overvågningsliste]].",
        "removedwatchtext-short": "Siden \"$1\" er blevet fjernet fra din overvågningsliste.",
        "watch": "Overvåg",
        "watchthispage": "Overvåg side",
        "unwatchthispage": "Fjern overvågning",
        "notanarticle": "Ikke en artikel",
        "notvisiblerev": "Versionen er blevet slettet",
-       "watchlist-details": "Du har $1 {{PLURAL:$1|side|sider}} på din overvågningsliste (ekskl. diskussionssider).",
+       "watchlist-details": "Du har {{PLURAL:$1|side|sider}} på din overvågningsliste (uden at medregne diskussionssider).",
        "wlheader-enotif": "E-mail-underretning er slået til.",
        "wlheader-showupdated": "Sider, der er ændret siden dit sidste besøg, er vist med '''fed skrift'''.",
        "wlnote": "Nedenfor ses {{PLURAL:$1|den seneste ændring|de seneste <strong>$1</strong> ændringer}} i {{PLURAL:$2|den sidste time|de sidste <strong>$2</strong> timer}} op til den $3 kl. $4.",
        "wlshowlast": "Vis de seneste $1 timer $2 dage",
+       "watchlistall2": "alle",
+       "watchlist-hide": "Skjul",
+       "wlshowtime": "Vis seneste:",
+       "wlshowhideminor": "mindre ændringer",
+       "wlshowhidebots": "robotter",
+       "wlshowhideliu": "registrerede brugere",
+       "wlshowhideanons": "anonyme brugere",
+       "wlshowhidepatr": "patruljerede redigeringer",
+       "wlshowhidemine": "mine redigeringer",
        "watchlist-options": "Indstillinger for overvågningslisten",
        "watching": "Tilføjer overvågning …",
        "unwatching": "Fjerner overvågning …",
        "deletepage": "Slet side",
        "confirm": "Bekræft",
        "excontent": "indholdet var: '$1'",
-       "excontentauthor": "indholdet var: '$1' (og den eneste forfatter var '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "indholdet var: '$1' og den eneste forfatter var '[[Special:Contributions/$2|$2]]' ([[User talk:$2|talk]])",
        "exbeforeblank": "indholdet før siden blev tømt var: '$1'",
        "delete-confirm": "Slet \"$1\"",
        "delete-legend": "Slet",
        "undeletepagetext": "{{PLURAL:$1|Den følgende side er slettet, men den|De følgende sider er slettede, men de}} findes fortsat i arkivet og kan gendannes. Arkivet bliver periodevis slettet.",
        "undelete-fieldset-title": "Gendan versioner",
        "undeleteextrahelp": "For at gendanne siden komplet med alle versioner skal du lade alle afkrydsningsfelterne forblive tomme og klikke på '''''{{int:undeletebtn}}'''''.\nFor at gendanne bestemte versioner vælges disse enkeltvis i afkrydsningsfelterne før der klikkes '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|revision|revisioner}} arkiveret",
+       "undeleterevisions": "$1 {{PLURAL:$1|version|versioner}} slettet",
        "undeletehistory": "Hvis du gendanner siden, vil alle tidligere versioner blive gendannet i historikken.\nHvis en ny side med det samme navn er oprettet efter sletningen, så vil de gendannede versioner dukke op i historikken.",
        "undeleterevdel": "Gendannelsen gennemføres ikke, når den mest aktuelle version er skjult eller indeholder skjulte dele.\nI dette tilfælde må den nyeste version ikke markeres eller dens status skal ændres til en normal version.\nVersioner af filer, som du ikke har adgang til, gendannes ikke.",
        "undeletehistorynoadmin": "Denne side er blevet slettet.\nÅrsagen til sletningen er angivet i resuméet nedenfor\nsammen med oplysninger om brugerne der har redigeret denne side før sletningen.\nTeksten i de slettede versioner er kun tilgængelig for administratorer.",
        "contributions": "{{GENDER:$1|Brugerbidrag}}",
        "contributions-title": "Brugerbidrag for $1",
        "mycontris": "Bidrag",
+       "anoncontribs": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Brugerkontoen \"$1\" er ikke registreret.",
        "nocontribs": "Ingen ændringer er fundet som opfylder disse kriterier.",
        "movenosubpage": "Denne side har ingen undersider.",
        "movereason": "Begrundelse:",
        "revertmove": "gendan",
-       "delete_and_move": "Slet og flyt",
        "delete_and_move_text": "==Sletning nødvendig==\n\nArtiklen \"[[:$1]]\" eksisterer allerede. Vil du slette den for at gøre plads til flytningen?",
        "delete_and_move_confirm": "Ja, slet siden",
        "delete_and_move_reason": "Slettet for at gøre plads til flytning fra \"[[$1]]\"",
        "thumbnail_gd-library": "Ufuldstændig konfiguration af GD-biblioteket: funktionen $1 mangler",
        "thumbnail_image-missing": "Filen $1 ser til at mangle",
        "import": "Importer sider",
-       "importinterwiki": "Importer sider fra en anden wiki",
+       "importinterwiki": "Import fra en anden wiki",
        "import-interwiki-text": "Vælg en Wiki og en side til importen.\nDatoen i den pågældende version og forfatterne ændres ikke.\nAlle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-loggen]].",
        "import-interwiki-history": "Importer alle versioner af denne side",
        "import-interwiki-templates": "Inkluder alle skabeloner",
        "importcantopen": "Importfil kunne ikke åbnes",
        "importbadinterwiki": "Forkert Interwiki-henvisning",
        "importsuccess": "Importen lykkedes!",
-       "importnosources": "Ingen transwiki importkilde defineret og direkte historikuploads er deaktiveret.",
+       "importnosources": "Ingen wikier, hvorfra man kan importere er blevet defineret og direkte historik uploads er slået fra.",
        "importnofile": "Ingen importfil valgt!",
        "importuploaderrorsize": "Upload af importfil mislykkedes da filen er større en den tilladte maksimale uploadstørrelse.",
        "importuploaderrorpartial": "Upload af importfil mislykkedes da filen kun blev delvist uploadet.",
        "version-poweredby-others": "andre",
        "version-poweredby-translators": "translatewiki.net oversættere",
        "version-credits-summary": "Vi vil gerne anerkende følgende personer for deres bidrag til [[Special:Version|MediaWiki]].",
-       "version-license-info": "MediaWiki er fri software; du kan redistribuere det og/eller ændre det under betingelserne i GNU General Public License som offentliggjort af Free Software Foundation; enten version 2 af licensen eller (efter eget valg) enhver senere version. \n\nMediaWiki distribueres i håb om at det vil være nyttigt, men UDEN NOGEN GARANTI; uden selv de underforståede garantier SALGBARHED eller EGNETHED TIL ET BESTEMT FORMÅL. Se GNU General Public License for yderligere detaljer. \n\nDu skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General Public License] sammen med dette program; og hvis ikke, så skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html læs den online].",
+       "version-license-info": "MediaWiki er fri software; du kan redistribuere det og/eller ændre det under betingelserne i GNU General Public License som offentliggjort af Free Software Foundation; enten version 2 af licensen eller (efter eget valg) enhver senere version. \n\nMediaWiki distribueres i håb om at det vil være nyttigt, men UDEN NOGEN GARANTI; uden selv de underforståede garantier SALGBARHED eller EGNETHED TIL ET BESTEMT FORMÅL. Se GNU General Public License for yderligere detaljer. \n\nDu skulle have modtaget [{{SERVER}}{{SCRIPTPATH}}/COPYING en kopi af GNU General Public License] sammen med dette program; og hvis ikke, så skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [//www.gnu.org/licenses/old-licenses/gpl-2.0.html læs den online].",
        "version-software": "Installeret software",
        "version-software-product": "Produkt",
        "version-software-version": "Version",
index 24f1eed..fbb7ba1 100644 (file)
@@ -82,7 +82,8 @@
                        "Freddy2001",
                        "Luke081515",
                        "J. 'mach' wust",
-                       "R4c0r"
+                       "R4c0r",
+                       "MGChecker"
                ]
        },
        "tog-underline": "Links unterstreichen:",
        "tog-watchlisthidebots": "Bearbeitungen durch Bots in der Beobachtungsliste ausblenden",
        "tog-watchlisthideminor": "Kleine Bearbeitungen in der Beobachtungsliste ausblenden",
        "tog-watchlisthideliu": "Bearbeitungen angemeldeter Benutzer in der Beobachtungsliste ausblenden",
+       "tog-watchlistreloadautomatically": "Die Beobachtungsliste automatisch neu laden, wenn ein Filter geändert wurde (erfordert JavaScript)",
        "tog-watchlisthideanons": "Bearbeitungen anonymer Benutzer (IP-Adressen) in der Beobachtungsliste ausblenden",
        "tog-watchlisthidepatrolled": "Kontrollierte Änderungen in der Beobachtungsliste ausblenden",
        "tog-watchlisthidecategorization": "Kategorisierungen von Seiten ausblenden",
        "morenotlisted": "Diese Liste ist nicht vollständig.",
        "mypage": "Eigene Seite",
        "mytalk": "Diskussion",
-       "anontalk": "Diskussionsseite dieser IP",
+       "anontalk": "Diskussionsseite",
        "navigation": "Navigation",
        "and": "&#32;und",
        "qbfind": "Finden",
        "databaseerror-query": "Abfrage: $1",
        "databaseerror-function": "Funktion: $1",
        "databaseerror-error": "Fehler: $1",
+       "transaction-duration-limit-exceeded": "Um eine hohe Nachbildungsverzögerung zu vermeiden, wurde diese Transaktion abgebrochen, da die Schreibdauer ($1) die zweite Grenze von $2 überschritten hat. Falls du viele Objekte auf einmal änderst, versuche stattdessen, mehrere kleine Operationen auszuführen.",
        "laggedslavemode": "<strong>Achtung:</strong> Die angezeigte Seite könnte unter Umständen nicht die letzten Bearbeitungen enthalten.",
        "readonly": "Datenbank gesperrt",
        "enterlockreason": "Bitte gib einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung",
        "missingarticle-rev": "(Versionsnummer: $1)",
        "missingarticle-diff": "(Unterschied zwischen Versionen: $1, $2)",
        "readonly_lag": "Die Datenbank wurde automatisch für Schreibzugriffe gesperrt, damit sich die verteilten Datenbankserver (slaves) mit dem Hauptdatenbankserver (master) abgleichen können.",
+       "nonwrite-api-promise-error": "Der HTTP-Header „Promise-Non-Write-API-Action“ wurde gesendet, aber die Anfrage richtete sich an ein API-Schreibmodul.",
        "internalerror": "Interner Fehler",
        "internalerror_info": "Interner Fehler: $1",
        "internalerror-fatal-exception": "Fataler Ausnahmefehler des Typs „$1“",
        "filedeleteerror": "Die Datei „$1“ konnte nicht gelöscht werden.",
        "directorycreateerror": "Das Verzeichnis „$1“ konnte nicht angelegt werden.",
        "directoryreadonlyerror": "Das Wörterbuch „$1“ ist schreibgeschützt.",
-       "directorynotreadableerror": "Das Wörterbuch „$1“ ist nicht lesbar.",
+       "directorynotreadableerror": "Das Verzeichnis „$1“ ist nicht lesbar.",
        "filenotfound": "Die Datei „$1“ wurde nicht gefunden.",
        "unexpected": "Unerwarteter Wert: „$1“ = „$2“",
        "formerror": "Fehler: Die Eingaben konnten nicht verarbeitet werden.",
        "actionthrottledtext": "Im Rahmen einer Anti-Missbrauchs-Maßnahme kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze hast du überschritten.\nBitte versuche es in ein paar Minuten erneut.",
        "protectedpagetext": "Diese Seite wurde geschützt, um Bearbeitungen sowie andere Aktionen zu verhindern.",
        "viewsourcetext": "Du kannst den Quelltext dieser Seite betrachten und kopieren.",
-       "viewyourtext": "Du kannst den Quelltext <strong>deiner Bearbeitung</strong> dieser Seite betrachten und kopieren.",
+       "viewyourtext": "Du kannst den Quelltext <strong>deiner Bearbeitungen</strong> auf dieser Seite betrachten und kopieren.",
        "protectedinterface": "Diese Seite enthält Text für die Benutzeroberfläche der Software auf diesem Wiki und ist geschützt, um Missbrauch vorzubeugen.\nNutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
        "editinginterface": "<strong>Warnung:</strong> Diese Seite enthält von der MediaWiki-Software genutzten Text.\nÄnderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.",
        "translateinterface": "Um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern, verwende bitte [//translatewiki.net/ translatewiki.net], das MediaWiki-Lokalisierungsprojekt.",
        "cascadeprotected": "Diese Seite ist zur Bearbeitung gesperrt. Sie ist in die {{PLURAL:$1|folgende Seite|folgenden Seiten}} eingebunden, die mittels der Kaskadensperroption geschützt {{PLURAL:$1|ist|sind}}:\n$2",
-       "namespaceprotected": "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
+       "namespaceprotected": "Du hast nicht die erforderliche Berechtigung, um Seiten im Namensraum <strong>$1</strong> bearbeiten zu können.",
        "customcssprotected": "Du hast nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.",
        "customjsprotected": "Du hast nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.",
        "mycustomcssprotected": "Du hast keine Berechtigung, diese CSS-Seite zu bearbeiten.",
        "createaccountreason": "Grund:",
        "createacct-reason": "Begründung",
        "createacct-reason-ph": "Warum erstellst du ein anderes Benutzerkonto?",
-       "createacct-captcha": "Sicherheitsprüfung",
-       "createacct-imgcaptcha-ph": "Gib den Text ein, den du oben siehst.",
        "createacct-submit": "Benutzerkonto erstellen",
        "createacct-another-submit": "Benutzerkonto erstellen",
        "createacct-benefit-heading": "{{SITENAME}} wird von Menschen wie dir geschaffen.",
        "wrongpasswordempty": "Es wurde kein Passwort eingegeben. Bitte versuche es erneut.",
        "passwordtooshort": "Passwörter müssen mindestens {{PLURAL:$1|1 Zeichen|$1 Zeichen}} lang sein.",
        "passwordtoolong": "Passwörter können nicht länger als {{PLURAL:$1|ein|$1}} Zeichen sein.",
+       "passwordtoopopular": "Häufig ausgewählte Passwörter können nicht verwendet werden. Bitte wähle ein einzigartigeres Passwort aus.",
        "password-name-match": "Dein Passwort muss sich von deinem Benutzernamen unterscheiden.",
        "password-login-forbidden": "Die Verwendung dieses Benutzernamens und Passwortes ist nicht erlaubt.",
        "mailmypassword": "Passwort zurücksetzen",
        "passwordreset-emailtext-ip": "Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Zurücksetzung deines Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab.\nDu solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht länger ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.",
        "passwordreset-emailtext-user": "Benutzer $1 bei {{SITENAME}} hat eine Zurücksetzung deines Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab. Du solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.",
        "passwordreset-emailelement": "Benutzername: \n$1\n\nTemporäres Passwort: \n$2",
-       "passwordreset-emailsent": "Falls dies eine registrierte E-Mail-Adresse für dein Benutzerkonto ist, wird eine Passwortzurücksetzungs-E-Mail an diese Adresse versandt.",
+       "passwordreset-emailsentemail": "Falls dies eine registrierte E-Mail-Adresse für dein Benutzerkonto ist, wird eine Passwortzurücksetzungs-E-Mail an diese Adresse versandt.",
+       "passwordreset-emailsentusername": "Falls es eine dazugehörige registrierte E-Mail-Adresse gibt, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
        "passwordreset-emailsent-capture": "Eine Passwortzurücksetzungs-E-Mail wurde versandt, die unten angezeigt wird.",
        "passwordreset-emailerror-capture": "Die unten angezeigte Passwortzurücksetzungs-E-Mail wurde generiert, allerdings ist der Versand an {{GENDER:$2|den Benutzer|die Benutzerin}} gescheitert: $1",
        "changeemail": "E-Mail-Adresse ändern oder entfernen",
        "permissionserrors": "Berechtigungsfehler",
        "permissionserrorstext": "Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:",
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
-       "contentmodelediterror": "Du kannst diese Version nicht bearbeiten, da dieses Inhaltsmodell <code>$1</code> und das aktuelle Inhaltsmodell der Seite <code>$2</code> ist.",
+       "contentmodelediterror": "Du kannst diese Version nicht bearbeiten, da das Inhaltsmodell <code>$1</code> vom aktuellen Inhaltsmodell der Seite <code>$2</code> abweicht.",
        "recreate-moveddeleted-warn": "'''Achtung: Du erstellst eine Seite, die bereits früher gelöscht wurde.'''\n\nBitte prüfe sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.\nZu deiner Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begründung für die vorhergehende Löschung:",
        "moveddeleted-notice": "Diese Seite wurde gelöscht. Zur Information folgt das Lösch- und Verschiebungs-Logbuch dieser Seite.",
        "moveddeleted-notice-recent": "Leider wurde diese Seite kürzlich gelöscht (innerhalb der letzten 24 Stunden).\nZur Information wird das Lösch- und Verschiebungs-Logbuch für die Seite unten angezeigt.",
        "showingresultsinrange": "Unten {{PLURAL:$1|wird <strong>ein</strong> Ergebnis|werden bis zu <strong>$1</strong> Ergebnisse}} im Bereich <strong>$2</strong> bis <strong>$3</strong> angezeigt.",
        "search-showingresults": "{{PLURAL:$4|Ergebnis <strong>$1</strong> von <strong>$3</strong>|Ergebnisse <strong>$1 bis $2</strong> von <strong>$3</strong>}}",
        "search-nonefound": "Zu deiner Suchanfrage wurden keine Ergebnisse gefunden.",
+       "search-nonefound-thiswiki": "Es gibt auf dieser Website keine der Suchanfrage entsprechenden Ergebnisse.",
        "powersearch-legend": "Erweiterte Suche",
        "powersearch-ns": "Suche in Namensräumen:",
        "powersearch-togglelabel": "Wähle aus:",
        "prefs-help-prefershttps": "Diese Einstellung wird bei deiner nächsten Anmeldung wirksam.",
        "prefswarning-warning": "Du hast Änderungen an deinen Einstellungen durchgeführt, die noch nicht gespeichert wurden.\nWenn du diese Seite verlässt ohne auf „$1“ zu klicken, werden deine Einstellungen nicht aktualisiert.",
        "prefs-tabs-navigation-hint": "Tipp: Du kannst die linke und rechte Pfeiltasten benutzen, um zwischen den Registerkarten in der Reiterliste zu navigieren.",
-       "email-address-validity-valid": "Diese E-Mail-Adresse scheint gültig zu sein.",
-       "email-address-validity-invalid": "Eine gültige E-Mail-Adresse ist erforderlich.",
        "userrights": "Benutzerrechte verwalten",
        "userrights-lookup-user": "Gruppenzugehörigkeit verwalten",
        "userrights-user-editname": "Benutzername:",
        "recentchanges-legend-heading": "'''Legende:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (siehe auch die [[Special:NewPages|Liste neuer Seiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
+       "recentchanges-submit": "Anzeigen",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "rcshowhideminor": "Kleine Änderungen $1",
        "foreign-structured-upload-form-label-own-work-message-shared": "Ich bestätige, dass ich das Urheberrecht für diese Datei besitze und stimme unwiderruflich der Veröffentlichung dieser Datei auf Wikimedia Commons unter der Lizenz [https://creativecommons.org/licenses/by-sa/4.0/deed.de „Creative Commons Namensnennung – Weitergabe unter gleichen Bedingungen 4.0 International“] sowie den [https://wikimediafoundation.org/wiki/Terms_of_Use/de Nutzungsbedingungen] zu.",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Falls du nicht das Urheberrecht für diese Datei besitzt oder du diese Datei unter einer anderen Lizenz veröffentlichen möchtest, ziehe [https://commons.wikimedia.org/wiki/Special:UploadWizard den Hochladeassistenten auf Wikimedia Commons] in Erwägung.",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Du kannst auch [[Special:Upload|die Hochladeseite auf {{SITENAME}}]] ausprobieren, falls die Website das Hochladen dieser Datei unter ihren Richtlinien erlaubt.",
+       "foreign-structured-upload-form-2-label-intro": "Vielen Dank für das Spenden eines Bildes zur Verwendung auf {{SITENAME}}. Du solltest nur fortfahren, wenn es mehrere Bedingungen erfüllt:",
+       "foreign-structured-upload-form-2-label-noderiv": "Es darf <strong>kein Werk eines anderen</strong> enthalten oder von diesem inspiriert sein",
+       "foreign-structured-upload-form-3-label-yes": "Ja",
+       "foreign-structured-upload-form-3-label-no": "Nein",
        "backend-fail-stream": "Die Datei $1 konnte nicht übertragen werden.",
        "backend-fail-backup": "Die Datei $1 konnte nicht gesichert werden.",
        "backend-fail-notexists": "Die Datei $1 ist nicht vorhanden.",
        "mostrevisions": "Seiten mit den meisten Versionen",
        "prefixindex": "Alle Seiten (mit Präfix)",
        "prefixindex-namespace": "Alle Seiten mit Präfix (Namensraum $1)",
+       "prefixindex-submit": "Anzeigen",
        "prefixindex-strip": "Präfix in der Liste abschneiden",
        "shortpages": "Kurze Seiten",
        "longpages": "Lange Seiten",
        "protectedpages-performer": "Geschützt von",
        "protectedpages-params": "Schutzparameter",
        "protectedpages-reason": "Grund",
+       "protectedpages-submit": "Seiten anzeigen",
        "protectedpages-unknown-timestamp": "Unbekannt",
        "protectedpages-unknown-performer": "Unbekannter Benutzer",
        "protectedtitles": "Geschützte Seitennamen",
        "protectedtitles-summary": "Diese Seite listet Titel auf, die derzeit vor der Erstellung geschützt sind. Für eine Liste vorhandener geschützter Seiten, siehe „[[{{#special:ProtectedPages}}|{{int:protectedpages}}]]“.",
        "protectedtitlesempty": "Zurzeit sind mit den angegebenen Parametern keine Seiten zur Neuerstellung gesperrt.",
+       "protectedtitles-submit": "Titel anzeigen",
        "listusers": "Benutzerverzeichnis",
        "listusers-editsonly": "Zeige nur Benutzer mit Beiträgen",
        "listusers-creationsort": "Nach Erstelldatum sortieren",
        "usereditcount": "$1 {{PLURAL:$1|Bearbeitung|Bearbeitungen}}",
        "usercreated": "{{GENDER:$3|Erstellt}} am $1 um $2 Uhr",
        "newpages": "Neue Seiten",
+       "newpages-submit": "Anzeigen",
        "newpages-username": "Benutzername:",
        "ancientpages": "Seit längerem unbearbeitete Seiten",
        "move": "Verschieben",
        "specialloguserlabel": "Ausführender Benutzer:",
        "speciallogtitlelabel": "Ziel (Titel oder {{ns:user}}:Benutzername für einen Benutzer):",
        "log": "Logbücher",
+       "logeventslist-submit": "Anzeigen",
        "all-logs-page": "Alle öffentlichen Logbücher",
        "alllogstext": "Dies ist die kombinierte Anzeige aller in {{SITENAME}} geführten Logbücher.\nDie 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.",
        "cachedspecial-viewing-cached-ts": "Du siehst die gecachte Version dieser Seite, die möglicherweise nicht aktuell ist.",
        "cachedspecial-refresh-now": "Aktuelle Version ansehen.",
        "categories": "Kategorien",
+       "categories-submit": "Anzeigen",
        "categoriespagetext": "Folgende {{PLURAL:$1|Kategorie enthält|Kategorien enthalten}} Seiten oder Dateien.\n[[Special:UnusedCategories|Verwaiste Kategorien]] werden hier nicht aufgeführt.\nSiehe auch die Liste der [[Special:WantedCategories|gewünschten Kategorien]].",
        "categoriesfrom": "Zeige Kategorien ab:",
        "special-categories-sort-count": "Sortierung nach Anzahl",
        "activeusers-hidebots": "Bots ausblenden",
        "activeusers-hidesysops": "Administratoren ausblenden",
        "activeusers-noresult": "Keine Benutzer gefunden.",
+       "activeusers-submit": "Aktive Benutzer anzeigen",
        "listgrouprights": "Benutzergruppenrechte",
        "listgrouprights-summary": "Dies ist eine Liste der in diesem Wiki definierten Benutzergruppen und der damit verbundenen Rechte.\nZusätzliche Informationen über einzelne Rechte können [[{{MediaWiki:Listgrouprights-helppage}}|hier]] gefunden werden.",
        "listgrouprights-key": "Legende:\n* <span class=\"listgrouprights-granted\">Gewährtes Recht</span>\n* <span class=\"listgrouprights-revoked\">Entzogenes Recht</span>",
        "wlheader-showupdated": "Seiten mit noch nicht gesehenen Änderungen werden '''fett''' dargestellt.",
        "wlnote": "Es {{PLURAL:$1|folgt die letzte Änderung|folgen die letzten <strong>$1</strong> Änderungen}} der letzten {{PLURAL:$2|Stunde|<strong>$2</strong> Stunden}}. Stand: $3, $4 Uhr.",
        "wlshowlast": "Zeige die Änderungen der letzten $1 Stunden, $2 Tage.",
+       "watchlistall2": "alle",
+       "watchlist-hide": "Ausblenden",
+       "watchlist-submit": "Anzeigen",
+       "wlshowtime": "Anzuzeigende Zeitperiode:",
+       "wlshowhideminor": "Kleine Bearbeitungen",
+       "wlshowhidebots": "Bots",
+       "wlshowhideliu": "Registrierte Benutzer",
+       "wlshowhideanons": "Anonyme Benutzer",
+       "wlshowhidepatr": "Kontrollierte Bearbeitungen",
+       "wlshowhidemine": "Meine Bearbeitungen",
        "watchlist-options": "Anzeigeoptionen",
        "watching": "Beobachten …",
        "unwatching": "Nicht mehr beobachten …",
        "delete-confirm": "Löschen von „$1“",
        "delete-legend": "Löschen",
        "historywarning": "<strong>Achtung:</strong> Die Seite, die du löschen möchtest, hat eine Versionsgeschichte mit {{PLURAL:$1|einer Version|$1 Versionen}}:",
+       "historyaction-submit": "Anzeigen",
        "confirmdeletetext": "Du bist dabei, eine Seite mit allen zugehörigen älteren Versionen zu löschen. Bitte bestätige dazu, dass du dir der Konsequenzen bewusst bist, und dass du in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] handelst.",
        "actioncomplete": "Aktion beendet",
        "actionfailed": "Aktion fehlgeschlagen",
        "contributions": "{{GENDER:$1|Benutzerbeiträge}}",
        "contributions-title": "Benutzerbeiträge von „$1“",
        "mycontris": "Beiträge",
+       "anoncontribs": "Beiträge",
        "contribsub2": "Von {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht vorhanden.",
        "nocontribs": "Es wurden keine Benutzerbeiträge mit diesen Kriterien gefunden.",
        "whatlinkshere-hidelinks": "Links $1",
        "whatlinkshere-hideimages": "Dateilinks $1",
        "whatlinkshere-filters": "Filter",
+       "whatlinkshere-submit": "Los",
        "autoblockid": "Automatische Sperrung #$1",
        "block": "Benutzer sperren",
        "unblock": "Benutzer freigeben",
        "movenosubpage": "Diese Seite hat keine Unterseiten.",
        "movereason": "Grund:",
        "revertmove": "zurück verschieben",
-       "delete_and_move": "Löschen und verschieben",
        "delete_and_move_text": "== Löschung erforderlich ==\n\nDie Seite „[[:$1]]“ existiert bereits. Möchtest du diese löschen, um die Seite verschieben zu können?",
        "delete_and_move_confirm": "Ja, Seite löschen",
        "delete_and_move_reason": "gelöscht, um Platz für die Verschiebung von „[[$1]]“ zu machen",
        "tooltip-pt-preferences": "Deine Einstellungen",
        "tooltip-pt-watchlist": "Liste der von dir beobachteten Seiten",
        "tooltip-pt-mycontris": "Liste eigener Beiträge",
+       "tooltip-pt-anoncontribs": "Eine Liste der Bearbeitungen, die von dieser IP-Adresse gemacht wurden",
        "tooltip-pt-login": "Sich anzumelden wird gerne gesehen, ist jedoch nicht zwingend erforderlich.",
        "tooltip-pt-logout": "Abmelden",
        "tooltip-pt-createaccount": "Wir ermutigen dich dazu, ein Benutzerkonto zu erstellen und dich anzumelden. Es ist jedoch nicht zwingend erforderlich.",
        "exif-compression-4": "CCITT Gruppe 4 Faxcodierung",
        "exif-copyrighted-true": "Geschützt",
        "exif-copyrighted-false": "Urheberrechtsstatus nicht festgelegt",
+       "exif-photometricinterpretation-0": "Schwarzweiß (Weiß ist 0)",
+       "exif-photometricinterpretation-1": "Schwarzweiß (Schwarz ist 0)",
+       "exif-photometricinterpretation-3": "Palette",
+       "exif-photometricinterpretation-4": "Transparenzmaske",
+       "exif-photometricinterpretation-5": "Getrennt (Wahrscheinlich CMYK)",
+       "exif-photometricinterpretation-8": "CIE L*a*b*",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (ICC-Kodierung)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (ITU-Kodierung)",
+       "exif-photometricinterpretation-32803": "Farbfilteranordnung",
+       "exif-photometricinterpretation-34892": "Linear roh",
        "exif-unknowndate": "Unbekanntes Datum",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Horizontal gespiegelt",
        "htmlform-cloner-required": "Es ist mindestens ein Wert erforderlich.",
        "htmlform-title-badnamespace": "[[:$1]] ist nicht im Namensraum „{{ns:$2}}“.",
        "htmlform-title-not-creatable": "„$1“ ist kein erstellbarer Seitentitel",
-       "htmlform-title-not-exists": "[[:$1]] ist nicht vorhanden.",
+       "htmlform-title-not-exists": "$1 ist nicht vorhanden.",
        "htmlform-user-not-exists": "<strong>$1</strong> ist nicht vorhanden.",
        "htmlform-user-not-valid": "<strong>$1</strong> ist kein gültiger Benutzername.",
        "sqlite-has-fts": "Version $1 mit Unterstützung für die Volltextsuche",
        "logentry-suppress-block": "$1 {{GENDER:$2|sperrte}} {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|änderte}} die Sperreinstellungen für {{GENDER:$4|$3}} mit einer Sperrdauer von $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importierte}} $3 durch das Hochladen einer Datei",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importierte}} $3 durch das Hochladen einer Datei ({{PLURAL:$4|Eine Version|$4 Versionen}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importierte}} $3 aus einem anderen Wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importierte}} $3 von $5 ({{PLURAL:$4|Eine Version|$4 Versionen}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|vereinigte}} $3 in die Seite $4 (Versionen bis zum $5)",
        "logentry-move-move": "$1 {{GENDER:$2|verschob}} die Seite $3 nach $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|verschob}} die Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen",
index 781db89..d52a93e 100644 (file)
@@ -29,6 +29,7 @@
        "tog-hideminor": "Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne",
        "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-hidecategorization": "Pera kategorizasyoni bınımne",
        "tog-extendwatchlist": "Lista seyrkerdışi hera bıke ke vurnayışi pêro basê, tenya tewr peyêni nê",
        "tog-usenewrc": "Vurnayışê ke pela vurnayışanê peyênan û lista seyrkerdışi derê inan grube ke.",
        "tog-numberheadings": "Sernuşteyan be xo numre cı şane",
@@ -39,6 +40,7 @@
        "tog-watchdefault": "Pel u dosyeyê ke mı vurnayê lista mına seyrkerdışi ke",
        "tog-watchmoves": "Pel u dosyeyê ke mı kırıştê lista mına seyrkerdışi ke",
        "tog-watchdeletion": "Pel u dosyeyê ke mı esterıtê lista mına seyrkerdışi ke",
+       "tog-watchrollback": "Pelê ke mı peyser ardi inan lista mına seyrkerdışi ke",
        "tog-minordefault": "Vurnayışanê xo pêrune ''vurnayışo qıckek'' nışan bıde",
        "tog-previewontop": "Verqayti pela nuştışi ser de bımocne",
        "tog-previewonfirst": "Vurnayışo verên de verqayti tım bımocne",
@@ -49,7 +51,7 @@
        "tog-shownumberswatching": "Amarê karberanê seyrkerdoğan bımocne",
        "tog-oldsig": "İmzaya mewcude:",
        "tog-fancysig": "İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)",
-       "tog-uselivepreview": "Verqayto giyane bıgureyne (cerrebane)",
+       "tog-uselivepreview": "Verqayto giyane bıgureyne",
        "tog-forceeditsummary": "Mı ke xulasa veng verdaye, hay a mı ser de",
        "tog-watchlisthideown": "Vurnayışanê mı lista mına seyrkerdışi de bınımne",
        "tog-watchlisthidebots": "Lista seyrkerdışi ra vurnayışanê boti bınımne",
@@ -57,6 +59,7 @@
        "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-watchlisthidecategorization": "Pera kategorizasyoni bınımne",
        "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ızdiye bımocne",
        "october-date": "Tışrino Verên $1",
        "november-date": "Tışrino Peyên $1",
        "december-date": "Kanun $1",
-       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" derê",
+       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriyi}}",
+       "category_header": "Pelê ke kategoriya \"$1\" tede derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
        "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
        "broken-file-category": "Peleye ke gıreyê dosyeyanê ğeletan muhtewa kenê",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Heqa cı de",
-       "article": "Wesiqe",
+       "article": "Pela zerreki",
        "newwindow": "(pençereyê newey de beno a)",
        "cancel": "Bıtexelne",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Vêşi lista nêbi...",
-       "mypage": "Per",
+       "mypage": "Pele",
        "mytalk": "Mesac",
-       "anontalk": "Pela werênayışê nê IPy",
+       "anontalk": "Werênayış",
        "navigation": "Pusula",
        "and": "&#32;u",
        "qbfind": "Bıvêne",
        "pool-timeout": "Kılitbiyayışi sero wextê vınetışi",
        "pool-queuefull": "Rêza hewze pırra",
        "pool-errorunknown": "Xeta nêzanıtiye",
+       "poolcounter-usage-error": "Xırab karyayış:$1",
        "aboutsite": "Heqa {{SITENAME}} de",
        "aboutpage": "Project:Heqa {{SITENAME}} de",
        "copyright": "Zerrekacı $1 bındı not biya.",
        "copyrightpage": "{{ns:project}}:Heqa telifi",
-       "currentevents": "Veng û vac",
+       "currentevents": "Hadiseyé rocaniyey",
        "currentevents-url": "Project:Rocani hadisey",
        "disclaimers": "Redê mesuliyeti",
        "disclaimerpage": "Project:Reddê mesuliyetê bıngey",
        "edithelp": "Peştdariya vurnayışi",
+       "helppage-top-gethelp": "Desteg",
        "mainpage": "Pela Seri",
        "mainpage-description": "Pela seri",
        "policy-url": "Project:Terzê hereketi",
        "hidetoc": "bınımne",
        "collapsible-collapse": "Kılm ke",
        "collapsible-expand": "Hera ke",
+       "confirmable-confirm": "{{GENDER:$1|Şıma }} do emeli?",
+       "confirmable-yes": "Eya",
+       "confirmable-no": "Nê",
        "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvêne?",
        "restorelink": "{{PLURAL:$1|jew vurnayış besteriya|$1 vurnayışi besteriyaye}}",
        "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
-       "nstab-main": "Wesiqe",
+       "nstab-main": "Pele",
        "nstab-user": "Pela karberi",
        "nstab-media": "Pela medya",
        "nstab-special": "Pela xase",
        "viewyourtext": "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
        "protectedinterface": "Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.",
        "editinginterface": "'''İqaz:''' Şıma hayo yew pela ke seba nuşteyê meqalanê cayanê bırnayeyan dana, vurnenê.\nVurnayışê na pele karberanê binan rê serpela karberi kena ke bımocno.\nSeba çarnayışi, yardımê [//translatewiki.net/wiki/Main_Page?setlang=diq translatewiki.net]i ra procêdoşkerdışi rê diqet kerên.",
-       "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:\n$2",
+       "cascadeprotected": "No pel de vurnayiş qedexe biyo, çunke şıma tuşa \"kademeyın\" aqtif kerdo u no {{PLURAL:$1|pele|pelo}} pawıteyo de xebıtyeno:\n$2",
        "namespaceprotected": "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
        "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.",
        "invalidtitle-knownnamespace": "Canemey \"$2\" u metnê \"$3\" xırabo",
        "invalidtitle-unknownnamespace": "Sernameye nêşınasiya yana amraiya canameyo  $1 u metno \"$2\" xırab",
        "exception-nologin": "Şıma cıkewtış nêvıraşto",
-       "exception-nologin-text": "Na pera ya zi na karkerdışi de  na wiki de [[Special:Userlogin|cıkewtış]] icab keno.",
+       "exception-nologin-text": "Na pele ya zi nê karkerdışi rê nê wiki de cıkewtış icab keno.",
        "exception-nologin-text-manual": "Na pele resayışi re $1 bıgire.",
        "virus-badscanner": "Eyaro şaş: no virus-cıgerayox nêzanyeno: ''$1''",
        "virus-scanfailed": "cıgerayiş tamam nêbı (kod $1)",
        "externaldberror": "Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.",
        "login": "Cı kewe",
        "nav-login-createaccount": "Dekew de / hesab vıraze",
-       "userlogin": "Cı kewe / hesab vıraze",
+       "userlogin": "Cıkewtış / hesab vıraze",
        "userloginnocreate": "Cı kewe",
        "logout": "Bıveciye",
        "userlogout": "Bıveciye",
        "createaccountreason": "Sebeb:",
        "createacct-reason": "Sebeb",
        "createacct-reason-ph": "Şımaye çı xo re zewbi hesab vırazeni?",
-       "createacct-captcha": "Qontrolê asayişi",
-       "createacct-imgcaptcha-ph": "Nuşteyo ke cor aseno ey cı ke",
        "createacct-submit": "Hesabê xo vıraze",
-       "createacct-another-submit": "Zewbi hesab vıraz",
+       "createacct-another-submit": "Hesab vıraze",
        "createacct-benefit-heading": "{{SITENAME}} meş de merduman şi",
        "createacct-benefit-body1": "{{PLURAL:$1|vurnayış|vurnayışi}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pele|peli}}",
        "passwordreset-emailtext-ip": "Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailtext-user": "$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailelement": "Nameyê karberi: \n$1\n\nParolaya vêrdiye: \n$2",
-       "passwordreset-emailsent": "Yew e-posteyê esterıtışê parola rışiya.",
+       "passwordreset-emailsentemail": "Eke na seba hesabê şıma yew adresa e-posteyê qeydına, yew e-posteyê parola nênkerdışi rışiyeno.",
        "passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
        "passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
        "changeemail": "E-posta adresa xo bıvurnê",
        "accmailtitle": "Paralo şirawiyayo.",
        "accmailtext": "[[User talk:$1|$1]] parolayo ke raşt ameyo şırawiyo na adres $2.\n\nQey na hesabê newe parola, cıkewtış dıma şıma eşkeni na qısım de ''[[Special:ChangePassword|parola bıvurn]]'' bıvurni.",
        "newarticle": "(Newe)",
-       "newarticletext": "To yew gıre tıkna be ra yew pela ke hewna çıniya.\nSeba afernayışê pele ra, qutiya metnê cêrêni bıgurene (seba melumati qaytê [$1 pela peşti] ke).\nEke be ğeletine ameya tiya, wa gocega '''peyser'''i programê xo de bıtıkne.",
+       "newarticletext": "To yew gıre tıkna be ra yew pela ke hewna çıniya.\nSeba afernayışê pele ra, qutiya metnê cêrêni bıgurene (seba melumati qaytê [$1 pela peşti] ke).\nEke be ğeletine ameya tiya, wa gocega <strong>peyser</strong>i programê xo de bıtıkne.",
        "anontalkpagetext": "----''No pel, pel o karbero hesab a nêkerdeyan o, ya zi karbero hesab akerdeyan o labele pê hesabê xo nêkewto de. No sebeb ra ma IP adres şuxulneni û ney IP adresan herkes eşkeno bıvino. Eke şıma qayil niye ina bo xo ri [[Special:UserLogin/signup|yew hesab bıvıraze]] veyaxut [[Special:UserLogin|hesab akere]].''",
        "noarticletext": "Ena pele de hewna theba çıniyo.\nTı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê ena pele cı geyre]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre],\nya zi [{{fullurl:{{FULLPAGENAME}}|action=edit}} ena pele bıvurne]</span>.",
        "noarticletext-nopermission": "Ena pele de hewna theba çıniyo.\nTı şenay zerreyê pelanê binan de [[Special:Search/{{PAGENAME}}|seba sernameyê na pele cı geyre]], ya zi <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} qeydan miyan de cı geyre]</span>, ema destur çıniyo ke na pele vırazê.",
        "nonunicodebrowser": "'''DİQET: Browserê şıma u unicode yewbini nêgeni. Qey izin dayişê vurnayişê pelan: Karakteri ke ASCII niyê; zerreyê qutiyê vurnayişi de kodi (cod) şiyes-şiyes aseni.'''",
        "editingold": "'''İkaz: Şımayé rewizyon da kehan da perer d vırnayış kené.'''\nVanése qeyd k,lakin rewziyoné veréni dé vınibé.",
        "yourdiff": "pêverronayiş",
-       "copyrightwarning": "'''Recayê ikazi:''' Sita da {{SITENAME}} ra iştıraqi pêro umışin da $2 zerredeyo (teferruata rê $1'i bıvinê).\nİştıraqê şıma, şıma kayıl niyê ke yewna merdumi kerpeyina bıvurnê yana yewna caya ra vılakerê se, iştıraq mekewê.<br />\nFına zi qayılê ke  iştıraq kewê, Şıma qayılê kê şar vaco eno nuşte felani nuşnayo yana resmi meqeman ra zanayışê cı  u malumatê cı esto/ Xoseri cayan ra groti rê şıma qerenti danê. '''Tiya dı, şıma wêrê telifira mısade nêgroto se eserê cı tiya vıla mekerê! '''",
-       "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 />\nWexta ke şıma nuşte zi erzeni ita; şıma gani taahhud bıde koti ra ardo (qey teferruati referans: $1).",
+       "copyrightwarning": "'''Recaya iqazi:'''Sita {{SITENAME}} ra iştıraqi pêro umışiya $2 zerredeyo (teferuatan rê $1 bıvênê).\n\nİştıraqê şıma, şıma qayıl niyê ke yewna merdumi kerpeyina bıvurnê ya zi yewna cayi ra vıla kerê ke, iştıraq mekewê.<br />\nFına zi qayılê ke iştıraq kewê, şıma qayılê ke şar vaco eno nuşte fılan kesi nusnayo ya zi meqemanê resmiyan ra zanayışê cı û malumatê cı esto / cayanê xoseran ra gırewtışi rê şıma garanti danê. '''Tiya de şıma werê telifi ra ke mısade nêgırewto, eserê cı tiya vıla mekerê! '''",
+       "copyrightwarning2": "Ney bızanê ke nuşteyê ke şıma ruşnenê (şawenê) keyepela {{SITENAME}} herkes eşkeno nê nuşteyanê şıma ser kay bıkero. Eke şıma qayil niyê kes bıvurno, nuşteyanê xo meerzê ita. <br />\nWexto ke şıma nuşteyi zi erzenê ita; şıma gani teahud bıdê koti ra ardo (qandê teferuati ra referans: $1).",
        "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": "'''Diqet: 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'''\n\nSerkar o ke kılit kerdo; no beyanat dayo: $1",
        "protectedpagewarning": "'''Diqet: No pel pawyeno, teyna serkari eşkeni bıvurni.'''\nWexta ke şıma no pel vurneni diqet bıkeri:",
        "revdelete-nooldid-text": "Şıma vıraştışê nê fonksiyoni rê ya yew çımraviyarnayışo waşte diyar nêkerdo, çımraviyarnayışo diyarkerde çıniyo, ya ki şıma wazenê ke çımraviyarnayışê nıkayêni bınımnê.",
        "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": "E",
+       "revdelete-show-file-submit": "Eya",
        "logdelete-selected": "{{PLURAL:$1|Qeydbiyayışo weçinıte|Qeydbiyayışê weçinıtey}}:",
        "revdelete-confirm": "Ma rica keno testiq bike ti ena hereket keno u ti zano neticeyanê herketanê xo u ti ena hereket pê ena [[{{MediaWiki:Policy-url}}|polici]] ra keno.",
        "revdelete-suppress-text": "Wedardış gani '''tenya''' nê halanê cêrênan de bıxebıtiyo:\n* Melumatê kıfırio mıhtemel\n* Melumatê şexio bêmınasıb\n*: ''adresa keyey u numreyê têlefoni, numreyê siğorta sosyale, uêb.''",
        "mergehistory-go": "Vernayîşê yewbiyayeni bimocne",
        "mergehistory-submit": "revizyonî yew bike",
        "mergehistory-empty": "Revizyonî yew nibenê.",
-       "mergehistory-done": "$3 {{PLURAL:$3|revizyonê|revizyonê}} $1 u [[:$2]] yew biyê.",
+       "mergehistory-done": "$1 ra $3 {{PLURAL:$3|revizyon|revizyoni}} [[:$2]] de {{PLURAL:$3|biyo|biyê}} têmiyan.",
        "mergehistory-fail": "Tarixê pele yew nibeno, ma rica kenê ke pel u wext control bike.",
        "mergehistory-no-source": "Pela çımeyê $1 çıniya.",
        "mergehistory-no-destination": "Pela destinasyoni $1 çini yo.",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) bıvênên",
        "searchmenu-exists": "''Ena 'Wikipediya de ser \"[[:$1]]\" yew pel esto'''",
        "searchmenu-new": "<strong>Na wiki de pela \"[[:$1]]\" vıraze!</strong> {{PLURAL:$2|0=|Sewbina pela ke şıma geyrayê cı aye bıvênê.|Yew zi neticanê cıgeyrayışê xo bıvênê.}}",
-       "searchprofile-articles": "Pelê tedeestey",
+       "searchprofile-articles": "Pelê zerreki",
        "searchprofile-images": "Multimedya",
        "searchprofile-everything": "Heme çi",
        "searchprofile-advanced": "Raverşiyaye",
        "search-result-category-size": "{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 kategoriyê bini|$2 kategirayanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})",
        "search-redirect": "($1 ra ardış)",
        "search-section": "(qısmê $1)",
+       "search-category": "(kategori $1)",
        "search-file-match": "(zerreyê dosya yewbini gêno)",
        "search-suggest": "To va: $1",
        "search-interwiki-caption": "Proceyê bıray",
        "preferences": "Tercihi",
        "mypreferences": "Tercihi",
        "prefs-edits": "Amarê vurnayışan:",
-       "prefsnologintext2": "Reca kem  sazé tercihané karberi $1.",
+       "prefsnologintext2": "Kerem ke, seba vurnayışê tercihanê xo cı kewe.",
        "prefs-skin": "Çerme",
        "skin-preview": "Verqayt",
        "datedefault": "Tercih çıniyo",
        "prefs-tokenwatchlist": "Morge",
        "prefs-diffs": "Ferqi",
        "prefs-help-prefershttps": "Na tercih, fına dekewten dı bena aktiv.",
-       "email-address-validity-valid": "e-posta adresi raştayo",
-       "email-address-validity-invalid": "e-postayo raştay defiye de",
+       "prefswarning-warning": "Şıma tercihanê xo de vurnayışi kerdi ke ney hewna qeyd nêbiyê. \nEke şıma na pele ra bêtıknayışê \"$1\" ra veciyê, tercihê şıma newe nêbenê.",
        "userrights": "İdarey heqanê karberan",
        "userrights-lookup-user": "Grubanê karberi/karbere idare bıke",
        "userrights-user-editname": "Yew nameyê karberi cı kewe:",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:İdarekeri",
        "grouppage-bureaucrat": "{{ns:project}}:Burokrati",
-       "grouppage-suppress": "{{ns:project}}:Qontrol",
+       "grouppage-suppress": "{{ns:project}}:Teftişkar",
        "right-read": "Pera bıwané",
        "right-edit": "Pele bıvurne",
        "right-createpage": "Pele vıraze (pelê ke ê werênayışi niyê)",
        "right-move": "Pele bere",
        "right-move-subpages": "Pele be bınpelanê cı ra pia bere",
        "right-move-rootuserpages": "Pelanê kaberiê rıstımi bere",
+       "right-move-categorypages": "Pelanê kategoriye bere",
        "right-movefile": "Dosyan bere",
        "right-suppressredirect": "Wexto ke pelan benê, pelanê çımey ra neql mevıraze",
        "right-upload": "Dosyeyan bar ke",
        "right-protect": "Sewiyanê pawıtışi (mıhafezey) bıvurne u pelanê kılitbiyaiyan sero bıgureye.",
        "right-editprotected": "Pera pawıtiyan sero bıxebteye (bê pawıtena kaskadi (game be game))",
        "right-editsemiprotected": "Xısusi pera timaryayış \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Modelê zerrekê pele bıvurne",
        "right-editinterface": "Interfaceê karberi sero bıgureye",
        "right-editusercssjs": "CSS u dosyanê JSiê karberanê binan sero bıgureye",
        "right-editusercss": "Dosyanê CSSiê karberanê binan sero bıgureye",
        "rcshowhidemine": "Vurnayışanê mı $1",
        "rcshowhidemine-show": "Bımocne",
        "rcshowhidemine-hide": "Bınımne",
+       "rcshowhidecategorization-show": "Bımocne",
+       "rcshowhidecategorization-hide": "Bınımne",
        "rclinks": "Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3",
        "diff": "ferq",
        "hist": "verê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_categories": "Pelê ke kategoriyan ra (be „|“ ciya biyê):",
+       "rc_categories_any": "Weçinayiyan ra 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",
        "recentchangeslinked-summary": "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdayoğan de lista de vurnayışê peyênana.\n[[Special:Watchlist|Lista şımaya seyrkedışi de]] peli be nuşteyo '''qolınd''' bêli kerdê.",
        "recentchangeslinked-page": "Nameyê pele:",
        "recentchangeslinked-to": "Heruna pela ke yena dayene, vurnayışanê pelanê ke daye ra gırêdayiyê inan bımocne",
+       "recentchanges-page-added-to-category": "[[:$1]] kerd be kategoriye",
+       "recentchanges-page-removed-from-category": "[[:$1]] kategoriye ra vet",
        "upload": "Dosya bar ke",
        "uploadbtn": "Dosya bar ke",
        "reuploaddesc": "Barkerdışi iptal ke u peyser şo formê barkerdışi",
        "uploaderror": "Ğeletê bar kerdişî",
        "upload-recreate-warning": "'''Diqet: Yew dosya pê ena name wedariya ya zi vurniya.'''\n\nLogê wedariyayiş u berdişi seba ena pele a ti ra xezir kerda:",
        "uploadtext": "Qey barkerdişê dosyayî, formê cêrinî bişuxulne.\nDosyayê ke vera cû bar biyê eke şima qayîl e ney dosyayan bivînê ya zî bigerî biewnê[[Special:FileList|listeyê dosyayê bar bîyaye]] (tekrar) bar bîyaye [[Special:Log/upload|rocaneyê barkerdişî]] de, hewn a şîyaye zî tîya de [[Special:Log/delete|rocaneyê hewn a kerdişî]] pawiyene.\n\nwexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişuxulne;\n* Qey xebitnayişê dosyayî: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></code>'''\n*Heto çep de zerreyê yew qutî de, qey xebitnayişi 'nuşteyê binîn' û 200 pikseli: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></code>'''\n* Dosya memocın, dosya te direk gırey bıerz: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></code>'''",
-       "upload-permitted": "Tipanê dosyayi ke izin ey estê: $1.",
-       "upload-preferred": "Tipanê dosyayi ke tercihe ey estê: $1",
-       "upload-prohibited": "Babetê dosyayanê tometebiyayeyan: $1.",
+       "upload-permitted": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê vêrdeyan: $1.",
+       "upload-preferred": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê tercihbiyayeyan: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê tometebiyayeyan: $1.",
        "uploadlogpage": "Cıkewtışê bar-kerdışi",
        "uploadlogpagetext": "cêr de [[Special:NewFiles|listeyê dosyayan]] estî.",
        "filename": "Namey Dosya",
        "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.\nEke şıma emin niyê bıvurni bıewne na dosya<strong>[[:$1]]</strong>\n[[$1|thumb]]",
+       "fileexists": "Nê nameyi ra yew dosya xora esta. Kerem kerên, <strong>[[:$1]]</strong> qontrol kerê {{GENDER:|şıma}} ke emin niyê naye bıvurnê.   \n[[$1|thumb]]",
        "filepageexists": "qey na dosya pelê eşkera kerdışi <strong>[[:$1]]</strong> na adresi de ca ra vıraziyayo labele no name de yew dosya nêasena.\nkılmnuşteyê şıma nêasena eke şıma qayili bıvini gani şıma pê dest bıvurni\n[[$1|resimo qıc]]",
        "fileexists-extension": "zey no nameyê dosyayi yewna nameyê dosyayi esta: [[$2|thumb]]\n* dosyaya ke bar biya: <strong>[[:$1]]</strong>\n* dosyaya ke ca ra esta: <strong>[[:$2]]</strong>\nkerem kere yewna name bıvıcinê",
        "fileexists-thumbnail-yes": "na dosya wina asena ke versiyona yew resmê qıc biyayeya ''(thumbnail)''. [[$1|thumb]]\nkerem kerê <strong>[[:$1]]</strong> na dosya konrol bıkerê .",
        "upload-too-many-redirects": "Eno URL de zaf redireksiyonî esto.",
        "upload-http-error": "Yew ğeletê HTTPî biyo: $1",
        "upload-copy-upload-invalid-domain": "Na domain ra kopyayê barkerdışanê nêbenê.",
+       "upload-dialog-title": "Dosya bar ke",
+       "upload-dialog-button-cancel": "Bıtexelne",
+       "upload-dialog-button-done": "Temam",
+       "upload-dialog-button-save": "Bışevekne",
+       "upload-dialog-button-upload": "Bar ke",
+       "upload-form-label-select-file": "Dosya weçine",
+       "upload-form-label-infoform-title": "Teferuati",
+       "upload-form-label-infoform-name": "Name",
+       "upload-form-label-infoform-description": "Şınasnayış",
+       "upload-form-label-usage-title": "Gurenayış",
+       "upload-form-label-usage-filename": "Nameyê dosya",
+       "foreign-structured-upload-form-label-own-work": "No karê mıno",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategoriyi",
+       "foreign-structured-upload-form-label-infoform-date": "Tarix",
        "backend-fail-stream": "$1 nê vırazeyê",
        "backend-fail-backup": "$1 nê wendeyê",
        "backend-fail-notexists": "Dosyaya $1 çıniya.",
        "listfiles_count": "Versiyoni",
        "listfiles-show-all": "Asayışa versiyonandé verénan",
        "listfiles-latestversion": "Versiyono verin",
-       "listfiles-latestversion-yes": "E",
+       "listfiles-latestversion-yes": "Eya",
        "listfiles-latestversion-no": "Nê",
        "file-anchor-link": "Dosya",
        "filehist": "Ravêrdê dosya",
        "unwatchedpages": "Pelanê seyrnibiyeyî",
        "listredirects": "Listeya Hetenayışan",
        "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
-       "unusedtemplates": "Şablonê ke nê xebtênê",
+       "unusedtemplates": "Şablonê ke nêguriyenê",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
        "randompage": "Pela raştameyiye",
        "randomincategory": "Ğoseri pera kategoriya",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet  per çıniya.",
+       "randomincategory-category": "Kategoriye:",
        "randomincategory-submit": "Şo",
        "randomredirect": "Serçarnayışo rastameye",
        "randomredirect-nopages": "Cayê nameyê \"$1\" de serşıkıtışi çıniyê.",
        "statistics-header-edits": "Îstatistikê vurnayîşî",
        "statistics-header-users": "İstatistikê karberi",
        "statistics-header-hooks": "Îstatistiksê binî",
-       "statistics-articles": "Pelanê tedesteyî",
+       "statistics-articles": "Pelê zerreki",
        "statistics-pages": "Peli",
        "statistics-pages-desc": "Pelanê hemî ke wîkî de estê, pelanê mineqeşeyî, redireksiyon ucb... dehil o.",
        "statistics-files": "Dosyayê bar biye",
        "double-redirect-fixed-move": "[[$1]] kırışiye.\nNa otomatikmen biye rocaniye û nıka [[$2]] ser şıknena.",
        "double-redirect-fixed-maintenance": "Serkışışteno dıletê [[$1]] ra  pela da [[$2]] vuriyeno.",
        "double-redirect-fixer": "Fixerî redirek bike",
-       "brokenredirects": "Hetenayışê vengi",
+       "brokenredirects": "Serşıkıtışê xırabeyi",
        "brokenredirectstext": "Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:",
        "brokenredirects-edit": "bıvurne",
        "brokenredirects-delete": "bestere",
        "withoutinterwiki-submit": "Bımocne",
        "fewestrevisions": "Pelê be senık çımraviyarnayışi",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayti}}",
-       "ncategories": "$1 {{PLURAL:$1|Kategoriye|Kategoriy}}",
+       "ncategories": "$1 {{PLURAL:$1|Kategoriye|Kategoriyi}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikiy}}",
        "nlinks": "$1 {{PLURAL:$1|link|linkî}}",
        "nmembers": "$1 {{PLURAL:$1|eza|ezayan}}",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
        "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
-       "uncategorizedimages": "Dosyayê ke bê kategoriyê",
+       "uncategorizedimages": "Dosyeyê ke bêkategoriyê",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
        "unusedcategories": "Kategoriyê ke nêgureniyê",
-       "unusedimages": "Dosyeyê ke nê xebtênê",
+       "unusedimages": "Dosyeyê ke nêguriyenê",
        "wantedcategories": "Kategoriyê ke waziyayê",
-       "wantedpages": "Peleye ke waştênê",
+       "wantedpages": "Pelê ke waziyayê",
        "wantedpages-badtitle": "sernuşte meqbul niyo: $1",
-       "wantedfiles": "Dosyeyê cıgeyriyayey",
+       "wantedfiles": "Dosyeyê cıgeyriyayeyi",
        "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 waziyenê",
        "prefixindex-namespace": "Peleyê Veroleyıni ($1 cay nami)",
        "prefixindex-strip": "Listeya réz bıyayışi",
        "shortpages": "Pelê kılmeki",
-       "longpages": "Peleyê dergeki",
-       "deadendpages": "Pelê nêgıredayey",
+       "longpages": "Pelê dergeki",
+       "deadendpages": "Pelê nêgıredayeyi",
        "deadendpagestext": "Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.",
-       "protectedpages": "Pelê pawıtiyey",
+       "protectedpages": "Pelê pawıteyi",
        "protectedpages-indef": "têna pawıteyê bêmuddeti",
        "protectedpages-summary": "Listeya ena peler newke pawıtiya.Sername de  ena lista rê pawıte vıraştışi rê [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] bıvinê.",
        "protectedpages-cascade": "Kilit biyaye ke teyna cascadiye",
        "protectedpages-reason": "Sebeb",
        "protectedpages-unknown-timestamp": "Nêzanaye",
        "protectedpages-unknown-performer": "Karbero nêzanaye",
-       "protectedtitles": "Sernameyê pawıtiyey",
+       "protectedtitles": "Sernameyê pawıteyi",
        "protectedtitlesempty": "pê ney parametreyan sernuşteyê pawite çinê",
        "listusers": "Listeyê Karberan",
        "listusers-editsonly": "Teyna karberan bimucne ke ey nuştê",
        "usercreated": "$2 de $1 {{GENDER:$3|viraziya}}",
        "newpages": "Pelê newey",
        "newpages-username": "Nameyê karberi:",
-       "ancientpages": "Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani",
+       "ancientpages": "Pelê kehenêri",
        "move": "Bere",
        "movethispage": "Ena pele bere",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
        "nopagetext": "pelê hedefi ke şıma nişane kerdo çin o.",
        "pager-newer-n": "{{PLURAL:$1|newiyer 1|newiyer $1}}",
        "pager-older-n": "{{PLURAL:$1|deha kehan 1|deha kehan $1}}",
-       "suppress": "Çımpawıten",
+       "suppress": "Fetesnayene",
        "querypage-disabled": "Na pelaya xısusi,sebeb de performansi ra qefılneyê.",
+       "apihelp": "Peştiya APIyi",
+       "apihelp-no-such-module": "Modulê \"$1\" çıniyo.",
        "booksources": "Çımeyê kıtaban",
        "booksources-search-legend": "Seba çımeyanê kıtaban cı geyre",
        "booksources-isbn": "ISBN:",
        "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?",
        "specialloguserlabel": "Kerdoğ:",
-       "speciallogtitlelabel": "Menzil (sernuşte yana karber):",
+       "speciallogtitlelabel": "Meqsed (sername ya zi {{ns:user}}:karberi rê nameyê karberi):",
        "log": "Qeydi",
        "all-logs-page": "Umumi qeydi pêro",
        "alllogstext": "qey {{SITENAME}}i mocnayişê heme rocaneyani.\ntipa 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ê.",
        "sp-deletedcontributions-contribs": "iştıraqi",
        "linksearch": "Gıreyê teberi cı geyrê",
        "linksearch-pat": "bıgêr motif:",
-       "linksearch-ns": "Heruna namey:",
+       "linksearch-ns": "Heruna nameyi:",
        "linksearch-ok": "Cı geyre",
        "linksearch-text": "Jokeri ê zey \"*.wikipedia.org\"i benê ke bıgureniyê.\nTewr senık yew sewiya serêna cayê tesiri lazıma, mesela \"*.org\".<br />\nQeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: $1 (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).",
        "linksearch-line": "$1, $2 ra link biya",
        "wlheader-showupdated": "ziyaretê şıma ye peyini de vuryayişê peli pê '''nuşteyo qalıni''' mocyayo.",
        "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  bımocnê",
+       "watchlistall2": "pêro",
+       "watchlist-hide": "Bınımne",
+       "wlshowtime": "Peyênan bımocne:",
+       "wlshowhideminor": "vurnayışê werdiyi",
+       "wlshowhidebots": "boti",
+       "wlshowhideliu": "karberê qeydıni",
+       "wlshowhideanons": "karberê anonimi",
+       "wlshowhidepatr": "vurnayışê pawıteyi",
+       "wlshowhidemine": "vurnayışê mı",
        "watchlist-options": "Tercihê liste da seyri",
        "watching": "Seyr ke...",
        "unwatching": "Seyr meke...",
        "deletepage": "Pele bestere",
        "confirm": "Tesdiq ke",
        "excontent": "Zerreko verén: '$1'",
-       "excontentauthor": "Zerrey cı: '$1' no/na ('[[Special:Contributions/$2|$2]]'  teyna iştıraq kerdo)",
+       "excontentauthor": "Zerreko verên: \"$1\", (teyna \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|vatış]]) iştiraq kerd bı.",
        "exbeforeblank": "behsê verê esteriyayişi: '$1'",
        "delete-confirm": "\"$1\" bestere",
        "delete-legend": "Bestere",
        "rollback-success": "vurnayişê no kesi $1 tepiya geriyayo u hetê no\n$2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.",
        "sessionfailure-title": "Seans xeripiya",
        "sessionfailure": "cıkewtışê hesabê şıma de yew problem aseno;\nno kar semedê dızdiyê hesabi ibtal biyo.\nkerem kerê \"tepiya\" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar kerê , newe ra tesel/cereb kerê.",
+       "changecontentmodel-title-label": "Sernameyê pele",
+       "changecontentmodel-model-label": "Modelê zerrekiyo newe",
+       "changecontentmodel-reason-label": "Sebeb:",
        "protectlogpage": "Qeydê staryayan",
        "protectlogtext": "Şıma vurnayişê gırewtışê/wedarnayışê pawıtişi vinenê.\nQey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê êna .",
        "protectedarticle": "\"[[$1]]\" kılit biyo",
        "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:\n\n$1",
        "undelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?",
-       "undelete-show-file-submit": "E",
-       "namespace": "Heruna namey:",
+       "undelete-show-file-submit": "Eya",
+       "namespace": "Heruna nameyi:",
        "invert": "Weçinıtışi açarne",
        "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": "Heruna nameyanê elaqedaran",
        "contributions": "İştıraqê {{GENDER:$1|karber}}i",
        "contributions-title": "Dekerdenê karber de $1",
        "mycontris": "İştıraqi",
+       "anoncontribs": "İştıraqi",
        "contribsub2": "Qandê {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Hesabê karberi \"$1\" qeyd nêbiyo.",
        "nocontribs": "Ena kriteriya de vurnayîş çini yo.",
        "ipb-unblock-addr": "$1 a bik",
        "ipb-unblock": "Yew adresê IPî ya zi nameyê karberî blok bike",
        "ipb-blocklist": "Blokî ke hama estê ey bivîne",
-       "ipb-blocklist-contribs": "Ser $1 îştîrakî",
+       "ipb-blocklist-contribs": "Qandê {{GENDER:$1|}} ra iştıraqi",
        "unblockip": "Hesabê karberî a bike",
        "unblockiptext": "Cıreştışê nuştışê IP ya zi karberio ke ver ra gêriyayo, seba peyser barkerdışi dey rê formê cêrêni bıgurenên.",
        "ipusubmit": "Enê kılitkerdışi wedare",
        "movenotallowedfile": "desturê şıma çino, şıma pelan bıkırışi",
        "cant-move-user-page": "desturê şıma çino, şıma pelanê karberani bıkırışi (bê pelê cerıni).",
        "cant-move-to-user-page": "desturê şıma çino, şıma yew peli bıkırışi pelê yew karberi.",
-       "newtitle": "Nameyê newi:",
+       "newtitle": "Sernameyo newe:",
        "move-watch": "Peler seyr ke",
        "movepagebtn": "Pele bere",
        "pagemovedsub": "Berdışi kerd temam",
        "movenosubpage": "pelê bınıni yê no peli çino.",
        "movereason": "Sebeb:",
        "revertmove": "peyser biya",
-       "delete_and_move": "Bestere û bere",
        "delete_and_move_text": "==gani hewn a bıbıo/bıesteriyo==\n\n\" no [[:$1]]\" name de yew pel ca ra esto. şıma wazeni pê hewn a kerdışê ey peli vurnayişê nameyi bıkeri?",
        "delete_and_move_confirm": "Eya, na pele bestere",
        "delete_and_move_reason": "\"[[$1]]\" qande nami re ca akerdışi re besteriyaye",
        "thumbnail_gd-library": "Configurasyonê katalog ê GDî tam niyo:funksiyonê $1î vînî biyo",
        "thumbnail_image-missing": "Dosya vînî biyo: $1",
        "import": "Peleyi import bik",
-       "importinterwiki": "Împortê transwîkî",
+       "importinterwiki": "Zewbina wiki ra ard",
        "import-interwiki-text": "qey kırıştışê zerreyi yew wiki u pel bıvıcinê.\ntarixê revizyon u nameyê nuştoxi pawyene.\nkarê zerredayişê benateyê wikiyani[[Special:Log/import|zerreyê rocaneyê kırıştî de]] qeyd beno.",
        "import-interwiki-history": "Qeydanê pele pêrune kopya ke",
        "import-interwiki-templates": "Şablonan pêro zerre ke",
        "tooltip-pt-mycontris": "Listeya dekerdışan de şıma",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
        "tooltip-pt-logout": "Bıveciye",
+       "tooltip-pt-createaccount": "Şıma rê tewsiyey ma xorê jew hesab akerê. Fına zi hesab akerdış mecburi niyo.",
        "tooltip-ca-talk": "Zerrekê pele sero werênayış",
        "tooltip-ca-edit": "Ena pele bıvurne",
        "tooltip-ca-addsection": "Zu bınnusteya newi ak",
        "tooltip-t-specialpages": "Yew lista pelanê xasanê pêroyinan",
        "tooltip-t-print": "Hewl versiyona ploğnayışa na perer",
        "tooltip-t-permalink": "Gırêyo daimi be ena versiyonê pele",
-       "tooltip-ca-nstab-main": "Perra muhtevay bıvin",
+       "tooltip-ca-nstab-main": "Pela zerreki bıvêne",
        "tooltip-ca-nstab-user": "Pela karberi bıvêne",
        "tooltip-ca-nstab-media": "Pela medya bıvêne",
        "tooltip-ca-nstab-special": "Na pelaya xas a, şıma nêşenê sero vurnayış bıkerê",
        "pageinfo-redirectsto-info": "melumat",
        "pageinfo-contentpage": "Zey jû pela zerreki hesebiyena",
        "pageinfo-contentpage-yes": "Eya",
-       "pageinfo-protect-cascading": "Sıtarkerdey tiya cı ra yenê war",
+       "pageinfo-protect-cascading": "Sıtarkerdeyi tiya cı ra yenê war",
        "pageinfo-protect-cascading-yes": "Eya",
        "pageinfo-protect-cascading-from": "Sıtarkerdey cı ra yenê war",
        "pageinfo-category-info": "Şınasiya kategoriye",
        "duplicate-defaultsort": "'''Tembe:''' Hesıbyaye sırmey ratnayış de \"$2\" sırmey ratnayış de \"$1\"i nêhesıbneno.",
        "version": "Versiyon",
        "version-extensions": "Ekstensiyonî ke ronaye",
-       "version-skins": "Cıldi",
+       "version-skins": "Bar kerde bejni",
        "version-specialpages": "Pelanê xasiyan",
        "version-parserhooks": "Çengelê Parserî",
        "version-variables": "Vurnayeyî",
        "specialpages-group-maintenance": "Raporê pawıtışi",
        "specialpages-group-other": "Pelê xasiyê bini",
        "specialpages-group-login": "Cı kewe / hesab vıraze",
-       "specialpages-group-changes": "Vurnayişê peni u logan",
+       "specialpages-group-changes": "Vurnayışê peyêni û qeydi",
        "specialpages-group-media": "Raporê medya û barkerdışi",
-       "specialpages-group-users": "Karber u heqqî",
+       "specialpages-group-users": "Karberi û heqi",
        "specialpages-group-highuse": "Peleyê ke vêşi karênê",
        "specialpages-group-pages": "Listeyê pelan",
        "specialpages-group-pagetools": "Haletê pelan",
        "specialpages-group-wiki": "Melumat u haceti",
-       "specialpages-group-redirects": "Pela xasîyê ke heteneyayê",
+       "specialpages-group-redirects": "Pelê serşıkıtışiyê xısusiyi",
        "specialpages-group-spam": "haletê spami",
        "specialpages-group-developer": "Xacetanê raverberdoğî",
        "blankpage": "Pela venge",
        "tags-description-header": "Tam arezekerdışê maneyê cı",
        "tags-active-header": "Activ o?",
        "tags-hitcount-header": "Vurnayîşî ke etiket biyê",
-       "tags-active-yes": "E",
+       "tags-active-yes": "Eya",
        "tags-active-no": "Nê",
        "tags-edit": "bıvurne",
        "tags-hitcount": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}",
        "expand_templates_generate_xml": "Dara XML arêdayoği bımocne",
        "expand_templates_generate_rawhtml": "Xam HTML'i bıvin",
        "expand_templates_preview": "Verqayt",
+       "pagelanguage": "Weçinıtoğê zıwanê pele",
+       "pagelang-name": "Pele",
+       "pagelang-language": "Zıwan",
+       "pagelang-use-default": "Zıwanê hesabiyayeyi bıgurene",
+       "pagelang-select-lang": "Zıwan weçine",
+       "right-pagelang": "Zıwanê pele bıvurne",
+       "action-pagelang": "zıwanê pele bıvurne",
+       "log-name-pagelang": "Qeydê zıwani bıvurne",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 bayt|$1 bayti}} ($2; $3%)",
+       "mediastatistics-table-mimetype": "Tewrê MIME",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "latinkiya hêrabiyaye",
        "special-characters-group-ipa": "IPA",
        "special-characters-title-minus": "işaretê kemiye",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
        "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
+       "mw-widgets-titleinput-description-redirect": "berd be $1",
        "api-error-blacklisted": "Reca keme zewbina weçine, name wa şınasnaye bo."
 }
index d8efcde..780527f 100644 (file)
                        "Ah3kal",
                        "Macofe",
                        "Stam.nikos",
-                       "Giorgos456"
+                       "Giorgos456",
+                       "SucreRouge"
                ]
        },
        "tog-underline": "Υπογράμμιση συνδέσμων:",
        "tog-hideminor": "Απόκρυψη μικροεπεξεργασιών στις πρόσφατες αλλαγές",
        "tog-hidepatrolled": "Απόκρυψη ελεγμένων επεξεργασιών στις πρόσφατες αλλαγές",
        "tog-newpageshidepatrolled": "Απόκρυψη ελεγμένων σελίδων από τον κατάλογο νέων σελίδων",
+       "tog-hidecategorization": "Απόκρυψη κατηγοριοποίησης σελίδων",
        "tog-extendwatchlist": "Επέκταση της λίστας παρακολούθησης ώστε να δείχνει όλες τις αλλαγές, όχι μόνο τις πιο πρόσφατες",
        "tog-usenewrc": "Ομαδοποίηση αλλαγών ανά σελίδα στις πρόσφατες αλλαγές και στη λίστα παρακολούθησης",
        "tog-numberheadings": "Αυτόματη αρίθμηση επικεφαλίδων",
        "tog-watchlisthidebots": "Απόκρυψη των επεξεργασιών των bot από τη λίστα παρακολούθησης",
        "tog-watchlisthideminor": "Απόκρυψη των επεξεργασιών μικρής σημασίας από τη λίστα παρακολούθησης",
        "tog-watchlisthideliu": "Απόκρυψη επεξεργασιών συνδεδεμένων χρηστών από τη λίστα παρακολούθησης",
+       "tog-watchlistreloadautomatically": "Φορτώσετε εκ νέου η λίστα παρακολούθησής αυτόματα κάθε φορά που ένα φίλτρο έχει αλλάξει (Απαιτείται JavaScript)",
        "tog-watchlisthideanons": "Απόκρυψη επεξεργασιών ανωνύμων χρηστών από τη λίστα παρακολούθησης",
        "tog-watchlisthidepatrolled": "Απόκρυψη ελεγμένων επεξεργασιών από τη λίστα παρακολούθησης",
+       "tog-watchlisthidecategorization": "Απόκρυψη κατηγοριοποίησης σελίδων",
        "tog-ccmeonemails": "Να μου αποστέλλονται αντίγραφα των μηνυμάτων ηλεκτρονικού ταχυδρομείου που στέλνω σε άλλους χρήστες",
        "tog-diffonly": "Να μην εμφανίζεται περιεχόμενο σελίδων κάτω από τις διαφορές των εκδόσεων",
        "tog-showhiddencats": "Εμφάνιση κρυμμένων κατηγοριών",
        "faq": "Συχνές ερωτήσεις",
        "faqpage": "Project:Συχνές ερωτήσεις",
        "actions": "Ενέργειες",
-       "namespaces": "ΧÏ\8eÏ\81οι Î¿Î½Î¿Î¼Î¬Ï\84Ï\89ν",
+       "namespaces": "Î\9fνομαÏ\84οÏ\87Ï\8eÏ\81οι",
        "variants": "Παραλλαγές",
        "navigation-heading": "Μενού πλοήγησης",
        "errorpagetitle": "Σφάλμα",
        "site-atom-feed": "$1 ροή Atom",
        "page-rss-feed": "Ροή RSS «$1»",
        "page-atom-feed": "Ροή Atom «$1»",
+       "feed-atom": "Άτομο",
        "red-link-title": "$1 (η σελίδα δεν υπάρχει)",
        "sort-descending": "Φθίνουσα ταξινόμηση",
        "sort-ascending": "Αύξουσα ταξινόμηση",
        "nstab-help": "Σελίδα βοήθειας",
        "nstab-category": "Κατηγορία",
        "mainpage-nstab": "Αρχική σελίδα",
-       "nosuchaction": "Δεν υπάρχει τέτοια ενέργεια.",
+       "nosuchaction": "Δεν υπάρχει τέτοια ενέργεια",
        "nosuchactiontext": "Η ενέργεια που καθορίστηκε από την διεύθυνση URL δεν είναι έγκυρη.\nΕνδέχεται να πληκτρολογήσατε λανθασμένα την διεύθυνση URL ή να ακολουθήσατε έναν μη έγκυρο σύνδεσμο.\nΜπορεί επίσης να είναι σημάδι κάποιου σφάλματος του λογισμικού που χρησιμοποιεί ο ιστότοπος {{SITENAME}}.",
        "nosuchspecialpage": "Δεν υπάρχει τέτοια ειδική σελίδα",
        "nospecialpagetext": "<strong>Ζητήσατε μια μη έγκυρη ειδική σελίδα.</strong>\n\nΈνας κατάλογος έγκυρων ειδικών σελίδων μπορεί να βρεθεί στη σελίδα [[Special:SpecialPages|{{int:specialpages}}]].",
        "viewsource": "Προβολή κώδικα",
        "viewsource-title": "Προβολή πηγαίου κώδικα για τη σελίδα $1",
        "actionthrottled": "Η ενέργεια παρεμποδίστηκε",
-       "actionthrottledtext": "Σαν Î¼Î­Ï\84Ï\81ο ÎºÎ±Ï\84ά Ï\84οÏ\85 spam, υπάρχει όριο στην εκτέλεση αυτής της ενέργειας πολλές φορές μέσα σε μικρό χρονικό διάστημα και έχετε ξεπεράσει αυτό το όριο.\nΠαρακαλούμε δοκιμάστε ξανά σε λίγα λεπτά.",
+       "actionthrottledtext": "Σαν Î¼Î­Ï\84Ï\81ο ÎºÎ±Ï\84ά Ï\84ηÏ\82 ÎºÎ±Ï\84άÏ\87Ï\81ηÏ\83ηÏ\82, υπάρχει όριο στην εκτέλεση αυτής της ενέργειας πολλές φορές μέσα σε μικρό χρονικό διάστημα και έχετε ξεπεράσει αυτό το όριο.\nΠαρακαλούμε δοκιμάστε ξανά σε λίγα λεπτά.",
        "protectedpagetext": "Αυτή η σελίδα έχει προστατευθεί για πρόληψη επεξεργασίας ή άλλες ενέργειες.",
        "viewsourcetext": "Μπορείτε να προβάλετε και να αντιγράψετε τον πηγαίο κώδικα αυτής της σελίδας.",
        "viewyourtext": "Μπορείτε να προβάλετε και να αντιγράψετε τον πηγαίο κώδικα των <strong>επεξεργασιών σας</strong> σε αυτήν τη σελίδα.",
        "mycustomjsprotected": "Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα JavaScript.",
        "myprivateinfoprotected": "Δεν έχετε άδεια για να επεξεργαστείτε τα προσωπικά σας στοιχεία.",
        "mypreferencesprotected": "Δεν έχετε άδεια για να επεξεργαστείτε τις προτιμήσεις σας.",
-       "ns-specialprotected": "ΣελίδεÏ\82 Ï\83Ï\84ον Ï\84ομέα {{ns:special}} Î´ÎµÎ½ Î³Î¯Î½ÎµÏ\84αι Î½Î± ÎµÏ\80εξεÏ\81γαÏ\83Ï\84οÏ\8dν.",
+       "ns-specialprotected": "Î\97 ÎµÏ\80εξεÏ\81γαÏ\83ία Ï\83ελίδÏ\89ν Ï\83Ï\84ον Ï\84ομέα {{ns:special}} Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î´Ï\85ναÏ\84ή.",
        "titleprotected": "Αυτός ο τίτλος έχει προστατευθεί από την δημιουργία από τον [[User:$1|$1]].\nΟ λόγος που δίνεται είναι «$2».",
        "filereadonlyerror": "Δεν είναι δυνατή η τροποποίηση του αρχείου «$1» επειδή το αποθετήριο αρχείων «$2» είναι σε κατάσταση λειτουργίας μόνο για ανάγνωση.\n\nΟ διαχειριστής που το κλείδωσε προσφέρει αυτή την αιτιολόγηση: «$3».",
        "invalidtitle-knownnamespace": "Μη έγκυρος τίτλος με χώρο ονομάτων «$2» και κείμενο «$3»",
        "invalidtitle-unknownnamespace": "Μη έγκυρος τίτλος με άγνωστο αριθμό χώρου ονομάτων $1 και κείμενο «$2»",
-       "exception-nologin": "Δεν έχετε συνδεθεί.",
+       "exception-nologin": "Δεν έχετε συνδεθεί",
        "exception-nologin-text": "Παρακαλούμε να συνδεθείτε για να μπορείτε να αποκτήσετε πρόσβαση σε αυτήν τη σελίδα ή την ενέργεια.",
        "exception-nologin-text-manual": "Παρακαλούμε $1 για να μπορείτε να έχετε πρόσβαση σε αυτή τη σελίδα ή ενέργεια.",
        "virus-badscanner": "Λάθος ρύθμιση: άγνωστος ανιχνευτής ιών: ''$1''",
        "welcomecreation-msg": "Ο λογαριασμός σας έχει δημιουργηθεί.\nΜην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} προτιμήσεις]] σας.",
        "yourname": "Όνομα χρήστη:",
        "userlogin-yourname": "Όνομα χρήστη",
-       "userlogin-yourname-ph": "Εισάγετε το όνομα χρήστη σας",
-       "createacct-another-username-ph": "Εισάγετε το όνομα χρήστη",
+       "userlogin-yourname-ph": "Î\95ιÏ\83αγάγεÏ\84ε Ï\84ο Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η Ï\83αÏ\82",
+       "createacct-another-username-ph": "Î\95ιÏ\83αγάγεÏ\84ε Ï\84ο Ï\8cνομα Ï\87Ï\81ήÏ\83Ï\84η",
        "yourpassword": "Κωδικός:",
        "userlogin-yourpassword": "Κωδικός",
-       "userlogin-yourpassword-ph": "Εισάγετε τον κωδικό σας",
+       "userlogin-yourpassword-ph": "Î\95ιÏ\83αγάγεÏ\84ε Ï\84ον ÎºÏ\89δικÏ\8c Ï\83αÏ\82",
        "createacct-yourpassword-ph": "Εισαγωγή κωδικού",
        "yourpasswordagain": "Επαναπληκτρολόγηση κωδικού:",
        "createacct-yourpasswordagain": "Επιβεβαίωση κωδικού",
        "createacct-yourpasswordagain-ph": "Εισαγωγή κωδικού ξανά",
        "remembermypassword": "Απομνημόνευση της σύνδεσής μου σε αυτόν τον περιηγητή (για μέγιστο $1 {{PLURAL:$1|ημέρα|ημέρες}})",
-       "userlogin-remembermypassword": "Î\94ιαÏ\84ηÏ\81ήÏ\83Ï\84ε Î¼Îµ σε σύνδεση",
+       "userlogin-remembermypassword": "Î\9dα Î´Î¹Î±Ï\84ηÏ\81οÏ\8dμαι Î¼Ï\8cνιμα σε σύνδεση",
        "userlogin-signwithsecure": "Χρησιμοποιείστε ασφαλή σύνδεση",
        "yourdomainname": "Το domain σας:",
        "password-change-forbidden": "Δεν μπορείτε να αλλάξετε τους κωδικούς πρόσβασης σε αυτό το βίκι.",
        "userloginnocreate": "Είσοδος",
        "logout": "Έξοδος",
        "userlogout": "Έξοδος",
-       "notloggedin": "Δεν έχετε συνδεθεί.",
+       "notloggedin": "Δεν έχετε συνδεθεί",
        "userlogin-noaccount": "Δεν έχετε λογαριασμό;",
        "userlogin-joinproject": "Συνδεθείτε σε {{SITENAME}}",
        "nologin": "Δεν έχετε λογαριασμό; $1.",
        "userlogin-resetpassword-link": "Ξεχάσατε τον κωδικό πρόσβασης;",
        "userlogin-helplink2": "Βοήθεια για τη σύνδεση",
        "userlogin-loggedin": "Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.\nΧρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.",
-       "userlogin-createanother": "Δημιουργήσετε έναν άλλο λογαριασμό",
+       "userlogin-createanother": "Δημιουργήστε άλλο λογαριασμό",
        "createacct-emailrequired": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createacct-emailoptional": "Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)",
-       "createacct-email-ph": "Î\95ιÏ\83άγεÏ\84ε Ï\84ο email Ï\83αÏ\82",
-       "createacct-another-email-ph": "Εισάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου",
-       "createaccountmail": "Χρήση τυχαίου προσωρινού κωδικού πρόσβασης και αποστολή του στην παρεχώμενη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+       "createacct-email-ph": "Î\95ιÏ\83αγάγεÏ\84ε Ï\84η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\83αÏ\82 Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85",
+       "createacct-another-email-ph": "Î\95ιÏ\83αγάγεÏ\84ε Ï\84η Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85",
+       "createaccountmail": "Χρήση τυχαίου προσωρινού κωδικού πρόσβασης και αποστολή του στην καθοριζόμενη διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "createacct-realname": "Πραγματικό όνομα (προαιρετικό)",
        "createaccountreason": "Αιτία:",
        "createacct-reason": "Λόγος",
        "createacct-reason-ph": "Γιατί δημιουργείτε έναν άλλο λογαριασμό",
-       "createacct-captcha": "Έλεγχος ασφαλείας",
-       "createacct-imgcaptcha-ph": "Εισαγωγή του κειμένου που βλέπετε παραπάνω",
        "createacct-submit": "Δημιουργία λογαριασμού χρήστη",
-       "createacct-another-submit": "Î\94ημιοÏ\85Ï\81γήÏ\83εÏ\84ε Î­Î½Î±Î½ Î¬Î»Î»Î¿ Î»Î¿Î³Î±Ï\81ιαÏ\83μÏ\8c",
-       "createacct-benefit-heading": "{{SITENAME}} έχει γίνει από ανθρώπους όπως εσύ.",
+       "createacct-another-submit": "Î\94ημιοÏ\85Ï\81γία Î»Î¿Î³Î±Ï\81ιαÏ\83μοÏ\8d",
+       "createacct-benefit-heading": "Το {{SITENAME}} έχει φτιαχτεί από ανθρώπους σαν κι εσένα.",
        "createacct-benefit-body1": "{{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
        "createacct-benefit-body2": "{{PLURAL:$1|σελίδα|σελίδες}}",
-       "createacct-benefit-body3": "πρόσφατοι {{PLURAL:$1|συνεισφέρων|συνεισφέροντες}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|πρόσφατος συνεισφέρων|πρόσφατοι συνεισφέροντες}}",
        "badretype": "Οι κωδικοί που έχετε δηλώσει δεν συμφωνούν μεταξύ τους.",
        "usernameinprogress": "Μία δημιουργία λογαριασμού για αυτό το όνομα χρήστη είναι ήδη σε εξέλιξη.\nΠαρακαλώ περιμένετε.",
        "userexists": "Το όνομα χρήστη που εισαγάγατε βρίσκεται ήδη σε χρήση.\nΠαρακαλούμε, διαλέξτε ένα διαφορετικό.",
        "wrongpasswordempty": "Ο κωδικός πρόσβασης που εισάχθηκε ήταν κενός. Παρακαλούμε προσπαθήστε ξανά.",
        "passwordtooshort": "Οι κωδικοί πρέπει να περιέχουν τουλάχιστον {{PLURAL:$1|1 χαρακτήρα|$1 χαρακτήρες}}.",
        "passwordtoolong": "Οι κωδικοί πρόσβασης δεν μπορούν να υπερβαίνουν {{PLURAL:$1|τον 1 χαρακτήρα|τους $1 χαρακτήρες}}.",
+       "passwordtoopopular": "Συνήθως επιλέγονται οι κωδικοί πρόσβασης δεν μπορούν να χρησιμοποιηθούν. Παρακαλώ επιλέξτε μια πιο μοναδικό κωδικό πρόσβασης.",
        "password-name-match": "Ο κωδικός σου θα πρέπει να είναι διαφορετικός από το όνομα χρήστη σου.",
        "password-login-forbidden": "Η χρήση αυτού του ονόματος χρήστη και συνθηματικού έχουν  απαγορευτεί.",
        "mailmypassword": "Επαναφορά κωδικού",
        "throttled-mailpassword": "Ένα email επαναφοράς κωδικού έχει ήδη αποσταλεί, μέσα {{PLURAL:$1|στην τελευταία ώρα|στις τελευταίες $1 ώρες}}.\nΓια την αποφυγή κατάχρησης, μόνο ένα email επαναφοράς κωδικού θα στέλνεται ανά {{PLURAL:$1|ώρα|$1 ώρες}}.",
        "mailerror": "Σφάλμα στην αποστολή του μηνύματος: $1",
        "acct_creation_throttle_hit": "Επισκέπτες αυτού του wiki με την διεύθυνση IP σας έχουν ήδη δημιουργήσει {{PLURAL:$1|ένα λογαριασμό|$1 λογαριασμούς}}, κατά την τελευταία μία ημέρα, που είναι και ο μέγιστος επιτρεπόμενος αριθμός.\nΩς αποτέλεσμα, επισκέπτες αυτού του wiki με αυτήν την διεύθυνση IP δεν μπορούν αυτή την στιγμή να δημιουργήσουν περισσότερους λογαριασμούς.",
-       "emailauthenticated": "Î\97 Î·Î»ÎµÎºÏ\84Ï\81ονική Ï\83αÏ\82 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83η ÎµÏ\80ιβεβαιÏ\8eθηκε Ï\83Ï\84ιÏ\82 $2, Ï\83Ï\84ιÏ\82 $3.",
+       "emailauthenticated": "Î\97 Î´Î¹ÎµÏ\8dθÏ\85νÏ\83ή Ï\83αÏ\82 Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85 ÎµÏ\80ιβεβαιÏ\8eθηκε Ï\83Ï\84ιÏ\82 $2 ÎºÎ±Î¹ Ï\8eÏ\81α $3.",
        "emailnotauthenticated": "Η ηλεκτρονική σας διεύθυνση δεν έχει επαληθευτεί ακόμα.\nΚανένα μήνυμα ηλεκτρονικού ταχυδρομείου δεν θα σταλεί για τις ακόλουθες λειτουργίες.",
        "noemailprefs": "Δεν έχει ορισθεί ηλεκτρονική διεύθυνση, οι λειτουργίες που ακολουθούν δεν θα είναι δυνατόν να ολοκληρωθούν.",
        "emailconfirmlink": "Επαληθεύστε την ηλεκτρονική σας διεύθυνση",
        "login-migrated-generic": "Ο λογαριασμός σας έχει μεταναστεύσει, και το όνομα χρήστη σας δεν υπάρχει πλέον σε αυτό το wiki.",
        "loginlanguagelabel": "Γλώσσα: $1",
        "suspicious-userlogout": "Το αίτημα αποσύνδεσής σας απερρίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετρητή (browser) ή διακομιστή προσωρινής αποθήκευσης.",
-       "createacct-another-realname-tip": "Το πραγματικό όνομα είναι προαιρετικό\nΑν επιλέξετε να το δώσετε, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
+       "createacct-another-realname-tip": "Το πραγματικό όνομα είναι προαιρετικό.\nΑν επιλέξετε να το δώσετε, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
        "pt-login": "Σύνδεση",
        "pt-login-button": "Σύνδεση",
        "pt-createaccount": "Δημιουργία λογαριασμού",
-       "pt-userlogout": "Αποσύνδεση;",
+       "pt-userlogout": "Αποσύνδεση",
        "php-mail-error-unknown": "Άγνωστο σφάλμα στη συνάρτηση mail() της PHP.",
        "user-mail-no-addy": "Προσπαθήσατε να στείλετε e-mail χωρίς μια διεύθυνση e-mail.",
        "user-mail-no-body": "Προσπάθησε να στείλει e-mail με ένα κενό ή αδικαιολόγητα σύντομο σώμα.",
        "resetpass-submit-cancel": "Ακύρωση",
        "resetpass-wrong-oldpass": "Λάθος προσωρινός ή κανονικός κωδικός.\nΜπορεί να έχετε ήδη αλλάξει επιτυχώς τον κωδικό σας ή να έχετε ζητήσει έναν νέο προσωρινό κωδικό.",
        "resetpass-recycled": "Παρακαλούμε επαναφέρετε τον κωδικό πρόσβασής σας σε κάτι διαφορετικό από τον τρέχοντα κωδικό πρόσβασης.",
-       "resetpass-temp-emailed": "Έχετε συνδεθεί με ένα προσωρινό κωδικό μέσω ηλεκτρονικού ταχυδρομείου.\nΓια να ολοκληρώσετε τη σύνδεση, πρέπει να ορίσετε ένα νέο κωδικό εδώ:",
+       "resetpass-temp-emailed": "Έχετε συνδεθεί με έναν προσωρινό κωδικό μέσω ηλεκτρονικού ταχυδρομείου.\nΓια να ολοκληρώσετε τη σύνδεση, πρέπει να ορίσετε έναν νέο κωδικό εδώ:",
        "resetpass-temp-password": "Προσωρινός κωδικός:",
        "resetpass-abort-generic": "Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.",
-       "resetpass-expired": "Τον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹. Î\9fÏ\81ίÏ\83Ï\84ε Î­Î½Î± νέο κωδικό πρόσβασης για να συνδεθείτε.",
-       "resetpass-expired-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹ ÎºÎ±Î¹ Ï\80Ï\81έÏ\80ει Î½Î± Î³Î¯Î½ÎµÎ¹ ÎµÏ\80αναÏ\86οÏ\81ά Ï\84οÏ\85. Î Î±Ï\81ακαλοÏ\8dμε Î³Ï\81άÏ\88Ï\84ε Î­Î½Î± Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î® ÎºÎ¬Î½Ï\84ε ÎºÎ»Î¹Îº Ï\83Ï\84ο \"{{int:resetpass-submit-cancel}}\" για τον επαναφέρετε αργότερα.",
-       "resetpass-validity-soft": "Τον ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ήÏ\82 Ï\83αÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1 \nΠαÏ\81ακαλÏ\8e ÎµÏ\80ιλέξÏ\84ε Î­Î½Î± Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α, Î® ÎºÎ¬Î½Ï\84ε ÎºÎ»Î¹Îº Ï\83Ï\84ο ÎºÎ¿Ï\85μÏ\80ί \"{{int:resetpass-submit-cancel}}\" Î³Î¹Î± Î½Î± Ï\84ο επαναφέρετε αργότερα.",
-       "passwordreset": "Î\9aÏ\89δικÏ\8cÏ\82 ÎµÏ\80αναÏ\86οÏ\81άÏ\82",
+       "resetpass-expired": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹. Î\9fÏ\81ίÏ\83Ï\84ε Î­Î½Î±Î½ νέο κωδικό πρόσβασης για να συνδεθείτε.",
+       "resetpass-expired-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î­Ï\87ει Î»Î®Î¾ÎµÎ¹ ÎºÎ±Î¹ Ï\80Ï\81έÏ\80ει Î½Î± Î³Î¯Î½ÎµÎ¹ ÎµÏ\80αναÏ\86οÏ\81ά Ï\84οÏ\85. Î\95Ï\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α Î® Ï\80αÏ\84ήÏ\83Ï\84ε Â«{{int:resetpass-submit-cancel}}» για τον επαναφέρετε αργότερα.",
+       "resetpass-validity-soft": "Î\9f ÎºÏ\89δικÏ\8cÏ\82 Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Î´ÎµÎ½ ÎµÎ¯Î½Î±Î¹ Î­Î³ÎºÏ\85Ï\81οÏ\82: $1\n\nÎ\95Ï\80ιλέξÏ\84ε Î­Î½Î±Î½ Î½Î­Î¿ ÎºÏ\89δικÏ\8c Ï\80Ï\81Ï\8cÏ\83βαÏ\83ηÏ\82 Ï\84Ï\8eÏ\81α Î® Ï\80αÏ\84ήÏ\83Ï\84ε Â«{{int:resetpass-submit-cancel}}» Î³Î¹Î± Î½Î± Ï\84ον επαναφέρετε αργότερα.",
+       "passwordreset": "Î\95Ï\80αναÏ\86οÏ\81ά ÎºÏ\89δικοÏ\8d",
        "passwordreset-text-one": "Συμπληρώστε την παρακάτω φόρμα για να επαναφέρετε τον κωδικό πρόσβασής σας.",
        "passwordreset-text-many": "{{PLURAL:$1|Συμπληρώστε ένα από τα πεδία για να λάβετε προσωρινό κωδικό πρόσβαση μέσω ηλεκτρονικού ταχυδρομείου.}}",
        "passwordreset-disabled": "Η επαναφορά κωδικού πρόσβασης έχει απενεργοποιηθεί σε αυτό το wiki",
        "passwordreset-emailtext-ip": "Κάποιος (πιθανώς εσείς, από την διεύθυνση IP $1) ζήτησε την επαναφορά του κωδικού σας σε {{SITENAME}} ($4).  {{PLURAL:$3|Ο ακόλουθος λογαριασμός|Οι ακόλουθοι λογαριασμοί}} χρήστη συνδέονται με αυτή τη διεύθυνση e-mail:\n\n$2\n\n{{PLURAL:$3|Αυτός ο προσωρινός κωδικός πρόσβασης θα λήξει|Αυτοί οι προσωρινοί κωδικοί πρόσβασης θα λήξουν}} σε {{PLURAL:$5|μία ημέρα|$5 ημέρες}}.\nΘα πρέπει να συνδεθείτε τώρα και να επιλέξετε ένα νέο κωδικό. Αν κάποιος άλλος έκανε αυτό το αίτημα ή αν έχετε θυμηθεί τον αρχικό κωδικό πρόσβασής σας, και δεν επιθυμείτε πια να τον αλλάξετε, μπορείτε να αγνοήσετε αυτό το μήνυμα και να συνεχίσετε να χρησιμοποιείτε τον παλιό σας κωδικό πρόσβασης.",
        "passwordreset-emailtext-user": "Ο χρήστης $1 στη {{SITENAME}} ζήτησε μια επαναφορά του κωδικού πρόσβασης σας σε {{SITENAME}} ($4). {{PLURAL:$3|Ο ακόλουθος λογαριασμός|Οι ακόλουθοι λογαριασμοί}} χρήστη συνδέονται με αυτή τη διεύθυνση e-mail:\n\n$2\n\n{{PLURAL:$3|Αυτός ο προσωρινός κωδικός πρόσβασης θα λήξει| Αυτοί οι προσωρινοί κωδικοί πρόσβασης θα λήξουν}} σε {{PLURAL:$5| μία ημέρα| $5 ημέρες}}.\nΘα πρέπει να συνδεθείτε τώρα και να επιλέξετε ένα νέο κωδικό. Αν κάποιος άλλος έκανε αυτό το αίτημα ή αν έχετε θυμηθεί τον αρχικό κωδικό πρόσβασής σας, και δεν επιθυμείτε πια να τον αλλάξετε, μπορείτε να αγνοήσετε αυτό το μήνυμα και να συνεχίσετε να χρησιμοποιείτε τον παλιό σας κωδικό πρόσβασης.",
        "passwordreset-emailelement": "Όνομα χρήστη: \n$1\n\nΠροσωρινός κωδικός πρόσβασης:\n$2",
-       "passwordreset-emailsent": "Αν αυτή είναι η καταχωρυμένη διεύθυνση email για τον λογαριασμό σας, τότε θα σταλεί ένα μήνυμα email αρχικοποίησης κωδικού.",
+       "passwordreset-emailsentemail": "Αν αυτή είναι η καταχωρυμένη διεύθυνση email για τον λογαριασμό σας, τότε θα σταλεί ένα μήνυμα email αρχικοποίησης κωδικού.",
        "passwordreset-emailsent-capture": "Έχει αποσταλεί email επαναφοράς κωδικού, το οποίο φαίνεται πιο κάτω.",
        "passwordreset-emailerror-capture": "Ένα email επαναφοράς κωδικού έχει δημιουργηθεί, το οποίο φαίνεται πιο κάτω, αλλά απέτυχε η αποστολή του στο  {{GENDER:$2|χρήστη}}: $1",
        "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
-       "changeemail-header": "Αλλαγή λογαριασμού ηλεκτρονικού ταχυδρομείου",
+       "changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
+       "changeemail-passwordrequired": "Θα χρειαστεί να εισαγάγετε τον κωδικό σας για να επιβεβαιώσετε την αλλαγή αυτή.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "changeemail-oldemail": "Τρέχουσα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "changeemail-newemail": "Νέα διεύθυνση ηλεκτρονικού ταχυδρομείου:",
+       "changeemail-newemail-help": "Αυτό το πεδίο θα πρέπει να μείνει κενό αν θέλετε να καταργήσετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν η διεύθυνση ηλεκτρονικού ταχυδρομείου καταργηθεί, δεν θα μπορείτε να επαναφέρετε τον κωδικό πρόσβασης σε περίπτωση που τον ξεχάσετε και δεν θα λαμβάνετε μηνύματα ηλεκτρονικού ταχυδρομείου από αυτό το wiki.",
        "changeemail-none": "(κανένα)",
        "changeemail-password": "Ο κωδικός πρόσβασής σας στο εγχείρημα {{SITENAME}}:",
        "changeemail-submit": "Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "changeemail-throttled": "Κάνατε πάρα πολλές απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
+       "changeemail-nochange": "Παρακαλούμε εισαγάγετε διαφορετική νέα διεύθυνση ηλεκτρονικού ταχυδρομείου.",
        "resettokens": "Επαναφορά των κλειδιών",
        "resettokens-text": "Μπορείτε να επαναφέρετε τα κλειδιά, τα οποία επιτρέπουν την πρόσβαση σε ορισμένα ιδιωτικά δεδομένα που συνδέονται με τον λογαριασμό σας εδώ.\n\nΠρέπει να το κάνετε εάν κατά λάθος τα μοιραστήκατε με κάποιον ή αν ο λογαριασμός σας έχει παραβιαστεί.",
        "resettokens-no-tokens": "Δεν υπάρχουν κλειδιά για επαναφορά.",
        "sig_tip": "Η υπογραφή σας με ώρα και ημερομηνία",
        "hr_tip": "Οριζόντια γραμμή (να χρησιμοποιείται με φειδώ)",
        "summary": "Σύνοψη:",
-       "subject": "Θέμα/επικεφαλίδα:",
+       "subject": "Θέμα:",
        "minoredit": "Αυτή είναι μια μικροαλλαγή",
        "watchthis": "Παρακολούθηση αυτής της σελίδας",
        "savearticle": "Αποθήκευση σελίδας",
        "anonpreviewwarning": "''Δεν έχετε συνδεθεί. Η αποθήκευση θα καταγράψει την διεύθυνσή IP σας στο ιστορικό επεξεργασίας αυτής της σελίδας.''",
        "missingsummary": "'''Υπενθύμιση:''' Δεν έχετε συμπληρώσει τη σύνοψη επεξεργασίας. Αν κάνετε κλικ στο κουμπί Αποθήκευση πάλι, η επεξεργασία σας θα αποθηκευτεί χωρίς σύνοψη.",
        "selfredirect": "<strong>Προσοχή:</strong> Ανακατευθύνετε αυτή τη σελίδα στον εαυτό της. Μπορεί να δώσατε λάθος στόχο για την ανακατεύθυνση, ή μπορεί να επεξεργάζεστε λάθος σελίδα.\nΑν κάνε κλίκ στο \"{{int:savearticle}}\" ξανά, η ανακατεύθυνση θα δημιουργηθεί ούτως ή άλλως.",
-       "missingcommenttext": "Παρακαλώ εισάγετε ένα σχόλιο παρακάτω.",
-       "missingcommentheader": "'''Υπενθύμιση:''' Δεν έχετε γράψει ένα θέμα/επικεφαλίδα για αυτό το σχόλιο.\nΑν κάνετε πάλι κλικ στο κουμπί \"{{int:savearticle}}\", η επεξεργασία σας θα αποθηκευτεί χωρίς θέμα ή επικεφαλίδα.",
+       "missingcommenttext": "Παρακαλούμε εισαγάγετε σχόλιο παρακάτω.",
+       "missingcommentheader": "<strong>Υπενθύμιση:</strong> δεν έχετε δώσει ένα θέμα γι' αυτό το σχόλιο.\nΕάν κάνετε κλικ στο κουμπί \"{{int:savearticle}}\" ξανά, η επεξεργασία σας θα αποθηκευτεί χωρίς αυτό.",
        "summary-preview": "Προεπισκόπηση σύνοψης:",
-       "subject-preview": "Προεπισκόπηση θέματος/επικεφαλίδας:",
+       "subject-preview": "Προεπισκόπηση θέματος:",
        "previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
        "blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
        "blockedtext": "'''Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.'''\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: ''$2''.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα «αποστολή e-mail σε αυτό το χρήστη» εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής είναι #$5.\nΠαρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
        "newarticle": "(Νέο)",
        "newarticletext": "Ακολουθήσατε ένα σύνδεσμο προς μια σελίδα που δεν υπάρχει ακόμα. \nΓια να δημιουργήσετε τη σελίδα, αρχίστε να πληκτρολογείτε στο παρακάτω πλαίσιο (δείτε τη [$1 σελίδα βοήθειας] για περισσότερες πληροφορίες).\nΑν έχετε βρεθεί εδώ κατά λάθος, πατήστε το κουμπί '''πίσω''' στον περιηγητή σας.",
        "anontalkpagetext": "----''Αυτή η σελίδα συζήτησης προορίζεται για ανώνυμο χρήστη που δεν έχει δημιουργήσει ακόμα λογαριασμό ή που δεν τον χρησιμοποιεί. Έτσι για την ταυτοποίηση ενός ανώνυμου χρήστη χρησιμοποιείται η διεύθυνση IP του. Είναι όμως πιθανόν η διεύθυνση αυτή να είναι κοινή για πολλούς διαφορετικούς χρήστες.  Αν είστε ανώνυμος χρήστης και νομίζετε ότι άσχετα σχόλια απευθύνθηκαν σε σας, παρακαλούμε να [[Special:UserLogin/signup|δημιουργήσετε ένα λογαριασμό]] ή να  [[Special:UserLogin|συνδεθείτε]] για να αποφεύγεται η μελλοντική σύγχυση με άλλους ανώνυμους χρήστες.''",
-       "noarticletext": "Î\94εν Ï\85Ï\80άÏ\81Ï\87ει Ï\80Ï\81οÏ\82 Ï\84ο Ï\80αÏ\81Ï\8cν ÎºÎµÎ¯Î¼ÎµÎ½Î¿ Ï\83ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα. Î\9cÏ\80οÏ\81είÏ\84ε Î½Î± [[Special:Search/{{PAGENAME}}|αναζηÏ\84ήÏ\83εÏ\84ε Î±Ï\85Ï\84Ï\8cν Ï\84ον Ï\84ίÏ\84λο Ï\83ελίδαÏ\82]] Ï\83ε Î¬Î»Î»ÎµÏ\82 Ï\83ελίδεÏ\82,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Î½Î± Î±Î½Î±Î¶Î·Ï\84ήÏ\83εÏ\84ε Ï\84α Ï\83Ï\87εÏ\84ικά Î¹Ï\83Ï\84οÏ\81ικά],\nή Î½Î± [{{fullurl:{{FULLPAGENAME}}|action=edit}} ÎµÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Ï\84η Ï\83ελίδα Î±Ï\85Ï\84ή]</span>.",
-       "noarticletext-nopermission": "Δεν υπάρχει κείμενο σε αυτή τη σελίδα αυτή τη στιγμή.\nΜπορείτε να [[Special:Search/{{PAGENAME}}|αναζητήσετε αυτόν τον τίτλο σελίδας]] σε άλλες σελίδες, ή <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} να ψάξετε στις σχετικές καταγραφές]</span>, αλλά δεν έχετε την άδεια να δημιουργήσετε αυτή τη σελίδα.",
+       "noarticletext": "Î\94εν Ï\85Ï\80άÏ\81Ï\87ει Ï\80Ï\81οÏ\82 Ï\84ο Ï\80αÏ\81Ï\8cν ÎºÎµÎ¯Î¼ÎµÎ½Î¿ Ï\83ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα. Î\9cÏ\80οÏ\81είÏ\84ε Î½Î± [[Special:Search/{{PAGENAME}}|αναζηÏ\84ήÏ\83εÏ\84ε Î±Ï\85Ï\84Ï\8cν Ï\84ον Ï\84ίÏ\84λο Ï\83ελίδαÏ\82]] Ï\83ε Î¬Î»Î»ÎµÏ\82 Ï\83ελίδεÏ\82,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Î½Î± Î±Î½Î±Î¶Î·Ï\84ήÏ\83εÏ\84ε Ï\84ιÏ\82 Ï\83Ï\87εÏ\84ικέÏ\82 ÎºÎ±Ï\84αγÏ\81αÏ\86έÏ\82],\nή Î½Î± [{{fullurl:{{FULLPAGENAME}}|action=edit}} ÎµÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα]</span>.",
+       "noarticletext-nopermission": "Δεν υπάρχει προς το παρόν κείμενο σε αυτή τη σελίδα.\nΜπορείτε να [[Special:Search/{{PAGENAME}}|αναζητήσετε αυτόν τον τίτλο σελίδας]] σε άλλες σελίδες, ή <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} να ψάξετε στις σχετικές καταγραφές]</span>, αλλά δεν έχετε την άδεια να δημιουργήσετε αυτή τη σελίδα.",
        "missing-revision": "Δεν υπάρχει αναθεώρηση με αριθμό $1 για τη σελίδα με όνομα «{{FULLPAGENAME}}».\n\nΑυτό συνήθως προκαλείται από παλιό σύνδεσμο ιστορικού προς σελίδα που έχει διαγραφεί.\nΛεπτομέρειες θα βρείτε στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ημερολόγιο καταγραφής διαγραφών].",
        "userpage-userdoesnotexist": "Ο Λογαριασμός του χρήστη \"<nowiki>$1</nowiki>\" δεν είναι καταχωρημένος. Παρακαλώ δείτε αν θα θέλατε να δημιουργήσετε/επεξεργαστείτε αυτή τη σελίδα.",
        "userpage-userdoesnotexist-view": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.",
        "permissionserrorstext-withaction": "Δεν έχετε την άδεια να $2, για {{PLURAL:$1|τον ακόλουθο λόγο|τους ακόλουθους λόγους}}:",
        "recreate-moveddeleted-warn": "'''Προειδοποίηση: Ξαναδημιουργείτε μια σελίδα που είχε προηγουμένως διαγραφεί.'''\n\nΘα πρέπει να σκεφτείτε σοβαρά αν είναι σωστό να συνεχίσετε να επεξεργάζεστε αυτή τη σελίδα.\nΟι καταγραφές διαγραφών και μετακινήσεων παρέχονται εδώ για διευκόλυνση:",
        "moveddeleted-notice": "Αυτή η σελίδα έχει διαγραφεί.\nΤο αρχείο καταγραφών διαγραφών και μετακινήσεων της σελίδας παρέχεται παρακάτω για αναφορά.",
+       "moveddeleted-notice-recent": "Συγγνώμη, η σελίδα έχει διαγραφεί πρόσφατα (μέσα στις τελευταίες 24 ώρες).\nΗ διαγραφή και μετακίνηση του αρχείου καταγραφής της σελίδας παρέχεται παρακάτω για αναφορά.",
        "log-fulllog": "Εμφάνιση πλήρους αρχείου",
        "edit-hook-aborted": "Η επεξεργασία ματαιώθηκε από το hook.\nΔεν έδωσε εξήγηση.",
        "edit-gone-missing": "Δεν ήταν εφικτό να ενημερωθεί η σελίδα.\nΦαίνεται πως έχει διαγραφεί.",
        "currentrev-asof": "Τελευταία αναθεώρηση της $1",
        "revisionasof": "Αναθεώρηση της $1",
        "revision-info": "Αναθεώρηση ως προς $1 από {{GENDER:$6|τον|την}} $2 $7",
-       "previousrevision": "&larr;Παλαιότερη αναθεώρηση",
-       "nextrevision": "Î\9dεÏ\8eÏ\84εÏ\81η Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηÏ\83η &rarr;",
+       "previousrevision": "← Παλαιότερη αναθεώρηση",
+       "nextrevision": "Î\9dεÏ\8cÏ\84εÏ\81η Î±Î½Î±Î¸ÎµÏ\8eÏ\81ηÏ\83η â\86\92",
        "currentrevisionlink": "Τελευταία αναθεώρηση",
        "cur": "τρέχουσα",
        "next": "επόμενη",
        "suppressionlog": "Κατάλογος διαγραφών",
        "suppressionlogtext": "Παρακάτω βρίσκεται μία λίστα με τις διαγραφές και τις φραγές σχετικό  με περιεχόμενο που έχει αποκρυβεί από τους διαχειριστές.\nΔείτε την [[Special:BlockList|λίστα φραγών IP]] για τις τρέχουσες λειτουργικές απαγορεύσεις και φραγές.",
        "mergehistory": "Συγχώνευση ιστορικών σελίδων",
-       "mergehistory-header": "Αυτή η σελίδα σας επιτρέπει να συγχωνεύσετε τις εκδόσεις από το ιστορικό μίας σελίδας πηγής σε μια νεώτερη σελίδα.\nΣιγουρευτείτε ότι αυτή η αλλαγή θα διατηρήσει την συνοχή του ιστορικού της σελίδας.",
+       "mergehistory-header": "Αυτή η σελίδα σας επιτρέπει να συγχωνεύσετε αναθεωρήσεις από το ιστορικό κάποιας σελίδας προέλευσης σε νεότερη σελίδα.\nΣιγουρευτείτε ότι αυτή η αλλαγή θα διατηρήσει τη συνοχή του ιστορικού της σελίδας.",
        "mergehistory-box": "Συγχώνευση εκδόσεων δυο σελίδων:",
        "mergehistory-from": "Σελίδα πηγής:",
        "mergehistory-into": "Σελίδα προορισμού:",
        "textmatches": "Κείμενα σελίδων που ανταποκρίνονται:",
        "notextmatches": "Δεν υπάρχουν αντίστοιχα κείμενα σελίδων.",
        "prevn": "{{PLURAL:$1|$1}} προηγουμένων",
-       "nextn": "{{PLURAL:$1|$1}} επομένων",
+       "nextn": "{{PLURAL:$1|$1}} επόμενων",
        "prev-page": "προηγούμενη σελίδα",
        "next-page": "επόμενη σελίδα",
        "prevn-title": "{{PLURAL:$1|Προηγούμενο $1 αποτέλεσμα|Προηγούμενα $1 αποτελέσματα}}",
        "showingresultsinrange": "Παρακάτω {{PLURAL:$1|εμφανίζεται μέχρι <strong>1</strong> αποτέλεσμα|εμφανίζονται μέχρι <strong>$1</strong> αποτελέσματα}} σε εύρος από το Νο <strong>$2</strong> μέχρι το Νο <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$5|Αποτέλεσμα <strong>$1</strong> από <strong>$3</strong>|Αποτελέσματα <strong>$1 - $2</strong> από <strong>$3</strong>}}",
        "search-nonefound": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα.",
+       "search-nonefound-thiswiki": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα σε αυτόν τον ιστότοπο.",
        "powersearch-legend": "Αναλυτική αναζήτηση",
        "powersearch-ns": "Αναζήτηση στις περιοχές ονομάτων:",
        "powersearch-togglelabel": "Έλεγχος:",
        "prefs-resetpass": "Αλλαγή κωδικού",
        "prefs-changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "prefs-setemail": "Ορίστε μια διεύθυνση ηλεκτρονικού ταχυδρομείου",
-       "prefs-email": "Επιλογές e-mail",
+       "prefs-email": "Επιλογές διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "prefs-rendering": "Εμφάνιση",
        "saveprefs": "Αποθήκευση",
        "restoreprefs": "Επαναφορά όλων των προεπιλεγμένων ρυθμίσεων (σε όλα τα τμήματα)",
        "prefs-help-recentchangescount": "Αυτό περιλαμβάνει τις πρόσφατες αλλαγές, τα ιστορικά των σελίδων, και τα αρχεία διαγραφών.",
        "prefs-help-watchlist-token2": "Αυτό είναι το μυστικό κλειδί για την web τροφοδοσία  της λίστας παρακολούθησής σας.\nΌποιος το γνωρίζει θα είναι σε θέση να διαβάσει την λίστα παρακολούθησης σας, οπότε μην τον μοιράζεστε.\n[[Special:ResetTokens|Κάνε κλικ εδώ εάν θέλετε να τον επαναφέρετε]].",
        "savedprefs": "Οι προτιμήσεις σας έχουν αποθηκευτεί.",
+       "savedrights": "Τα δικαιώματα χρήστη από {{GENDER:$1|$1}} έχουν αποθηκευτεί.",
        "timezonelegend": "Ζώνη ώρας:",
        "localtime": "Εμφάνιση τοπικής ώρας:",
        "timezoneuseserverdefault": "Χρήση της προεπιλογής του wiki ($1)",
        "prefs-custom-js": "Προκαθορισμένη JS",
        "prefs-common-css-js": "Κοινά CSS/JavaScript για όλα τα θέματα εμφάνισης:",
        "prefs-reset-intro": "Μπορείτε να χρησιμοποιήσετε αυτήν την σελίδα για να επαναρρυθμίσετε τις προτιμήσεις σας στις προεπιλογές του ιστότοπου. Αυτό δεν μπορεί να αναστρεφθεί.",
-       "prefs-emailconfirm-label": "Επιβεβαίωση e-mail:",
+       "prefs-emailconfirm-label": "Επιβεβαίωση διεύθυνσης ηλεκτρονικού ταχυδρομείου:",
        "youremail": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "username": "{{GENDER:$1|Όνομα χρήστη}}:",
        "prefs-memberingroups": "{{GENDER:$2|Μέλος}} της {{PLURAL:$1|ομάδας|ομάδων}}:",
        "yourvariant": "Παράμετρος περιεχομένου γλώσσας:",
        "prefs-help-variant": "Η προτιμόμενη παραλλαγή ή ορθογραφία για εμφάνιση των σελίδων περιεχομένου σε αυτό το wiki.",
        "yournick": "Υπογραφή:",
-       "prefs-help-signature": "Τα σχόλια στις σελίδες συζήτησης θα πρέπει να υπογράφονται με \"<nowiki>~~~~</nowiki>\" το οποίο μετατρέπεται στην υπογραφή σας και σε μία σφραγίδα χρόνου.",
+       "prefs-help-signature": "Τα σχόλια στις σελίδες συζήτησης θα πρέπει να υπογράφονται με «<nowiki>~~~~</nowiki>», το οποίο μετατρέπεται στην υπογραφή σας και σε μία σφραγίδα χρόνου.",
        "badsig": "Άκυρη υπογραφή raw: ελέγξτε τις ετικέτες HTML.",
        "badsiglength": "Η υπογραφή σας είναι πολύ μεγάλη.\nΠρέπει να είναι κάτω από $1 {{PLURAL:$1|χαρακτήρα|χαρακτήρες}}.",
        "yourgender": "Πώς προτιμάτε να χαρακτηρίζεστε;",
        "gender-female": "Γυναίκα",
        "prefs-help-gender": "Η ρύθμιση αυτή της προτίμησης είναι προαιρετική.\nΤο λογισμικό χρησιμοποιεί την τιμή αυτής της παραμέτρου για να απευθύνεται προς εσάς και για να αναφέρεται σε σας όταν απευθύνεται σε άλλους, χρησιμοποιώντας το κατάλληλο γραμματικό γένος.\nΑυτή η πληροφορία θα είναι δημόσια.",
        "email": "Ηλεκτρονικό ταχυδρομείο",
-       "prefs-help-realname": "Το πραγματικό όνομα είναι προαιρετικό.\nΕφόσον παρέχεται, μπορεί να χρησιμοποιηθεί για να αναγνωριστεί το έργο σας.",
+       "prefs-help-realname": "Το πραγματικό όνομα είναι προαιρετικό.\nΕφόσον παρέχεται, μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
        "prefs-help-email": "Το ηλεκτρονικό ταχυδρομείο είναι προαιρετικό, ωστόσο δίνει τη δυνατότητα να σας αποσταλεί ένας νέος κωδικός στην περίπτωση που ξεχάσετε τον κωδικό σας.",
        "prefs-help-email-others": "Μπορείτε επίσης να επιλέξετε να αφήσετε τους  άλλους να επικοινωνήσουν  μαζί σας μέσω της σελίδας χρήστη ή συζήτησης  χωρίς να χρειάζεται να αποκαλύψετε την ταυτότητά σας.",
        "prefs-help-email-required": "Απαιτείται διεύθυνση ηλεκτρονικού ταχυδρομείου.",
        "prefs-help-prefershttps": "Αυτή η προτίμηση θα τεθεί σε ισχύ στην επόμενή σας σύνδεση.",
        "prefswarning-warning": "Έχετε κάνει αλλαγές στις προτιμήσεις σας που δεν έχουν αποθηκευτεί ακόμα.\nΕάν αφήσετε αυτή τη σελίδα χωρίς να κάνετε κλικ στο \"$1\" οι προτιμήσεις σας δεν θα ενημερωθούν.",
        "prefs-tabs-navigation-hint": "Συμβουλή: Μπορείτε να χρησιμοποιήσετε τα πλήκτρα διευθύνσεων αριστερά και δεξιά για να πλοηγηθείτε μεταξύ των καρτελών στη λίστα καρτελών.",
-       "email-address-validity-valid": "Η διεύθυνση ηλεκτρονικού ταχυδρομείου φαίνεται έγκυρη",
-       "email-address-validity-invalid": "Εισάγετε  μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "userrights": "Διαχείριση δικαιωμάτων χρηστών",
        "userrights-lookup-user": "Διαχείριση ομάδων χρηστών",
        "userrights-user-editname": "Δηλώστε όνομα χρήστη:",
        "saveusergroups": "Αποθήκευση ομάδων χρηστών",
        "userrights-groupsmember": "Μέλος της ομάδας:",
        "userrights-groupsmember-auto": "Αυτονόητο μέλος του:",
-       "userrights-groups-help": "Μπορείτε να τροποποιήσετε τις ομάδες στις οποίες ανήκει αυτός ο χρήστης:\n* Ένα κουτί με check δηλώνει ότι ο χρήστης ανήκει σε αυτήν την ομάδα.\n* Ένα κουτί χωρίς check δηλώνει ότι ο χρήστης δεν ανήκει σε αυτήν την ομάδα.\n* Ένας αστερίσκος (*) δηλώνει ότι δεν μπορείτε να αφαιρέσετε την ομάδα αφού την προσθέσετε ή και το αντίστροφο.",
+       "userrights-groups-help": "Μπορείτε να μεταβάλετε τις ομάδες στις οποίες ανήκει {{GENDER:$1|αυτός ο χρήστης|αυτή η χρήστρια}}:\n* Τσεκαρισμένο κουτάκι σημαίνει ότι {{GENDER:$1|ο χρήστης|η χρήστρια}} ανήκει σε αυτήν την ομάδα.\n* Μη τσεκαρισμένο κουτάκι σημαίνει ότι {{GENDER:$1|ο χρήστης|η χρήστρια}} δεν ανήκει σε αυτήν την ομάδα.\n* Αστερίσκος (*) σημαίνει ότι δεν μπορείτε να αφαιρέσετε την ομάδα άπαξ και την προσθέσετε, ή το ανάποδο.",
        "userrights-reason": "Αιτία:",
        "userrights-no-interwiki": "Δεν έχετε άδεια να επεξεργαστείτε τα δικαιώματα χρηστών σε άλλα wiki.",
        "userrights-nodatabase": "Η βάση δεδομένων $1 δεν υπάρχει ή δεν είναι τοπική.",
        "userrights-nologin": "Πρέπει να [[Special:UserLogin|συνδεθείτε]] με έναν λογαριασμό διαχειριστή συστήματος ώστε να ορίσετε δικαιώματα χρηστών.",
-       "userrights-notallowed": "Î\94εν Î­Ï\87εÏ\84ε Î¬Î´ÎµÎ¹Î± Î³Î¹Î± Î½Î± Ï\80Ï\81οÏ\83θέÏ\83εÏ\84ε Î® Î½Î± ÎºÎ±Ï\84αÏ\81γήÏ\83εÏ\84ε Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η.",
+       "userrights-notallowed": "Δεν έχετε άδεια να προσθέσετε ή να καταργήσετε δικαιώματα χρήστη.",
        "userrights-changeable-col": "Ομάδες που μπορείτε να αλλάξετε",
        "userrights-unchangeable-col": "Ομάδες που δεν μπορείτε να αλλάξετε",
        "userrights-conflict": "Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλώ επανεξετάστε και επικυρώστε τις αλλαγές σας.",
        "right-reupload": "Αντικατάσταση ενός ήδη υπάρχοντος αρχείου",
        "right-reupload-own": "Αντικατάσταση ενός ήδη υπάρχοντος αρχείου που έχει ανέβει από κάποιον",
        "right-reupload-shared": "Τοπική υπερκάλυψη αρχείων στο κοινό αποθηκευτήριο πολυμέσων",
-       "right-upload_by_url": "Î\95Ï\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η ÎµÎ½Ï\8cÏ\82 Î±Ï\81Ï\87είοÏ\85 από μία διεύθυνση URL",
+       "right-upload_by_url": "Î\91νέβαÏ\83μα Î±Ï\81Ï\87είÏ\89ν από μία διεύθυνση URL",
        "right-purge": "Καθαρισμός της cache του ιστότοπου για μια σελίδα χωρίς επιβεβαίωση",
        "right-autoconfirmed": "Επεξεργασία ημιπροστατευμένων σελίδων",
        "right-bot": "Μεταχείριση αυτής ως αυτόματης διεργασίας",
        "enhancedrc-history": "ιστορικό",
        "recentchanges": "Πρόσφατες αλλαγές",
        "recentchanges-legend": "Επιλογές πρόσφατων αλλαγών",
-       "recentchanges-summary": "ΠαÏ\81ακολοÏ\85θήÏ\83Ï\84ε Ï\83ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα Ï\84ιÏ\82 Ï\80ιο Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84εÏ\82 Î±Î»Î»Î±Î³Î­Ï\82 Ï\83Ï\84ο Wiki.",
+       "recentchanges-summary": "ΠαÏ\81ακολοÏ\85θήÏ\83Ï\84ε Ï\84ιÏ\82 Ï\80ιο Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84εÏ\82 Î±Î»Î»Î±Î³Î­Ï\82 Ï\83Ï\84ο wiki Ï\83ε Î±Ï\85Ï\84ή Ï\84η Ï\83ελίδα.",
        "recentchanges-noresult": "Χωρίς αλλαγές κατά τη διάρκεια της συγκεκριμένης χρονικής περιόδου, με αυτά τα κριτήρια.",
        "recentchanges-feed-description": "Παρακολούθηση των πιο πρόσφατων αλλαγών στο wiki σε αυτή τη ροή.",
        "recentchanges-label-newpage": "Αυτή η επεξεργασία δημιούργησε μια νέα σελίδα",
-       "recentchanges-label-minor": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î¼Î¹ÎºÏ\81οαλλαγή",
+       "recentchanges-label-minor": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± Î¼Î¹ÎºÏ\81ή Ï\84Ï\81οÏ\80οÏ\80οίηÏ\83η",
        "recentchanges-label-bot": "Αυτή η επεξεργασία έγινε από ένα ρομπότ",
        "recentchanges-label-unpatrolled": "Αυτή η επεξεργασία δεν έχει ελεγχθεί ακόμα",
        "recentchanges-label-plusminus": "Μεταβολή του μεγέθους της σελίδας σε bytes",
        "recentchanges-legend-heading": "'''Υπόμνημα:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|κατάλογος νέων σελίδων]])",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "Παρακάτω {{PLURAL:$5|είναι η αλλαγή|είναι οι αλλαγές}} από <strong>$3, $4</strong> (έως <strong>$1</strong> που εμφανίζεται).",
        "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2",
-       "rcshowhideminor": "$1 μικροεπεξεργασιών",
+       "rcshowhideminor": "$1 μικρών τροποποιήσεων",
        "rcshowhideminor-show": "Εμφάνιση",
        "rcshowhideminor-hide": "Απόκρυψη",
        "rcshowhidebots": "$1 ρομπότ",
        "rcshowhideliu": "$1 εγγεγραμμένων χρηστών",
        "rcshowhideliu-show": "Εμφάνιση",
        "rcshowhideliu-hide": "Απόκρυψη",
-       "rcshowhideanons": "$1 Î±Î½Ï\89νÏ\8dμων χρηστών",
+       "rcshowhideanons": "$1 Î±Î½Ï\8eνÏ\85μων χρηστών",
        "rcshowhideanons-show": "Εμφάνιση",
        "rcshowhideanons-hide": "Απόκρυψη",
        "rcshowhidepatr": "$1 ελεγμένων επεξεργασιών",
        "rcshowhidemine": "$1 των επεξεργασιών μου",
        "rcshowhidemine-show": "Εμφάνιση",
        "rcshowhidemine-hide": "Απόκρυψη",
+       "rcshowhidecategorization": "$1 κατηγοριοποίησης σελίδας",
+       "rcshowhidecategorization-show": "Εμφάνιση",
+       "rcshowhidecategorization-hide": "Απόκρυψη",
        "rclinks": "Εμφάνιση των τελευταίων $1 αλλαγών στο διάστημα των τελευταίων $2 ημερών<br />$3",
        "diff": "διαφορά",
        "hist": "ιστορικό",
        "recentchangeslinked-feed": "Σχετικές αλλαγές",
        "recentchangeslinked-toolbox": "Σχετικές αλλαγές",
        "recentchangeslinked-title": "Αλλαγές σχετικές με το «$1»",
-       "recentchangeslinked-summary": "Î\91Ï\85Ï\84Ï\8cÏ\82 ÎµÎ¯Î½Î±Î¹ Î­Î½Î± ÎºÎ±Ï\84άλογοÏ\82 Î±Î»Î»Î±Î³Ï\8eν Ï\80οÏ\85 Î­Î³Î¹Î½Î±Î½ Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84α Ï\83ε Ï\83ελίδεÏ\82 Ï\80οÏ\85 Ï\83Ï\85νδέονÏ\84αι Î±Ï\80Ï\8c Î¼Î¹Î± ÎºÎ±Î¸Î¿Ï\81ιÏ\83μένη Ï\83ελίδα (ή Ï\83ε Î¼Î­Î»Î· Î¼Î¹Î±Ï\82 ÎºÎ±Î¸Î¿Ï\81ιÏ\83μένηÏ\82 ÎºÎ±Ï\84ηγοÏ\81ίαÏ\82).\nΣελίδεÏ\82 Ï\83Ï\84ην [[Special:Watchlist|λίστα παρακολούθησής]] σας είναι '''έντονες'''.",
+       "recentchangeslinked-summary": "Î\91Ï\85Ï\84Ï\8cÏ\82 ÎµÎ¯Î½Î±Î¹ Î­Î½Î± ÎºÎ±Ï\84άλογοÏ\82 Î±Î»Î»Î±Î³Ï\8eν Ï\80οÏ\85 Î­Î³Î¹Î½Î±Î½ Ï\80Ï\81Ï\8cÏ\83Ï\86αÏ\84α Ï\83ε Ï\83ελίδεÏ\82 Ï\80οÏ\85 Ï\83Ï\85νδέονÏ\84αι Î±Ï\80Ï\8c Î¼Î¹Î± ÎºÎ±Î¸Î¿Ï\81ιÏ\83μένη Ï\83ελίδα (ή Ï\83ε Î¼Î­Î»Î· Î¼Î¹Î±Ï\82 ÎºÎ±Î¸Î¿Ï\81ιÏ\83μένηÏ\82 ÎºÎ±Ï\84ηγοÏ\81ίαÏ\82).\nΣελίδεÏ\82 Ï\80οÏ\85 Ï\85Ï\80άÏ\81Ï\87οÏ\85ν Ï\83Ï\84η [[Special:Watchlist|λίστα παρακολούθησής]] σας είναι '''έντονες'''.",
        "recentchangeslinked-page": "Όνομα σελίδας:",
        "recentchangeslinked-to": "Εμφάνιση αλλαγών σε σελίδες συνδεδεμένες με την δεδομένη σελίδα αντί αυτής",
        "recentchanges-page-added-to-category": "Η σελίδα [[:$1]] προστέθηκε στην κατηγορία",
        "recentchanges-page-added-to-category-bundled": "Η σελίδα [[:$1]] και {{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}} προστέθηκαν στην κατηγορία",
        "recentchanges-page-removed-from-category": "Η σελίδα [[:$1]] αφαιρέθηκε από την κατηγορία",
        "recentchanges-page-removed-from-category-bundled": "Η σελίδα [[:$1]] και {{PLURAL:$2|μία ακόμα σελίδα|$2 ακόμα σελίδες}} αφαιρέθηκαν από την κατηγορία",
+       "autochange-username": "Αυτόματη αλλαγή MediaWiki",
        "upload": "Ανέβασμα αρχείου",
        "uploadbtn": "Ανέβασμα αρχείου",
        "reuploaddesc": "Επιστροφή στη φόρμα φόρτωσης",
        "upload_directory_read_only": "Δεν είναι δυνατή η εγγραφή στον κατάλογο ($1) από τον server.",
        "uploaderror": "Σφάλμα στο ανέβασμα αρχείου",
        "upload-recreate-warning": "'''Προειδοποίηση: Ένα αρχείο με αυτό το όνομα έχει διαγραφεί ή μετακινηθεί.'''\n\nΤο αρχείο διαγραφών και μετακινήσεων για αυτή τη σελίδα παρέχεται εδώ για διευκόλυνση:",
-       "uploadtext": "Î\9cÏ\80οÏ\81είÏ\84ε Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83εÏ\84ε Ï\84ην Ï\80αÏ\81ακάÏ\84Ï\89 Ï\86Ï\8cÏ\81μα Î³Î¹Î± Î½Î± ÎµÏ\80ιÏ\86οÏ\81Ï\84Ï\8eÏ\83εÏ\84ε Î±Ï\81Ï\87εία. Î\93ια Î½Î± Î´ÎµÎ¯Ï\84ε Î®Î´Î· ÎµÏ\80ιÏ\86οÏ\81Ï\84Ï\89μένα Î±Ï\81Ï\87εία, Ï\80ηγαίνεÏ\84ε Ï\83Ï\84η [[Special:FileList|λίÏ\83Ï\84α ÎµÏ\80ιÏ\86οÏ\81Ï\84Ï\89μένÏ\89ν Î±Ï\81Ï\87είÏ\89ν]] Î® Ï\83Ï\84ο [[Special:Log/upload|ιÏ\83Ï\84οÏ\81ικÏ\8c ÎµÏ\80ιÏ\86οÏ\81Ï\84Ï\8eÏ\83εÏ\89ν]]. Î\9fι Î´Î¹Î±Î³Ï\81αÏ\86έÏ\82 Î­Ï\87οÏ\85ν ÎºÎ±Ï\84αγÏ\81αÏ\86εί Ï\83Ï\84η Ï\83ελίδα [[Special:Log/delete|αÏ\81Ï\87είο Î´Î¹Î±Î³Ï\81αÏ\86Ï\8eν]].\n\nÎ\93ια Î½Î± Ï\83Ï\85μÏ\80εÏ\81ιληÏ\86θεί Î¼Î¹Î± ÎµÎ¹ÎºÏ\8cνα Ï\83ε Î¼Î¹Î± Ï\83ελίδα, Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83Ï\84ε Ï\83Ï\85νδέÏ\83μοÏ\85Ï\82 Ï\84ηÏ\82 Î¼Î¿Ï\81Ï\86ήÏ\82:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' (Ï\87Ï\81ήÏ\83η Ï\84ηÏ\82 Ï\80λήÏ\81οÏ\85Ï\82 ÎµÎºÎ´Î¿Ï\87ήÏ\82 Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85)\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' (Ï\87Ï\81ήÏ\83η Î¼Î¯Î±Ï\82 ÎµÎºÎ´Î¿Ï\87ήÏ\82 200 pixel Ï\83ε Ï\80λάÏ\84οÏ\82 Ï\83ε Î­Î½Î± ÎºÎ¿Ï\85Ï\84άκι Ï\83Ï\84ο Î±Ï\81ιÏ\83Ï\84εÏ\81Ï\8c Ï\80εÏ\81ιθÏ\8eÏ\81ιο Î¼Îµ Ï\80εÏ\81ιγÏ\81αÏ\86ή 'alt text')\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' (άμεÏ\83η Ï\83Ï\8dνδεÏ\83η Î¼Îµ Ï\84ο Î±Ï\81Ï\87είο Ï\87Ï\89Ï\81ίÏ\82 ÎµÎ¼Ï\86άνιÏ\83η Ï\84οÏ\85 Î¯Î´Î¹Î¿Ï\85 Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85)",
+       "uploadtext": "ΧÏ\81ηÏ\83ιμοÏ\80οιήÏ\83Ï\84ε Ï\84ην Ï\80αÏ\81ακάÏ\84Ï\89 Ï\86Ï\8cÏ\81μα Î³Î¹Î± Î½Î± Î±Î½ÎµÎ²Î¬Ï\83εÏ\84ε Î±Ï\81Ï\87εία. \nÎ\93ια Ï\80Ï\81οβολή Î® Î±Î½Î±Î¶Î®Ï\84ηÏ\83η Î®Î´Î· Î±Î½ÎµÎ²Î±Ï\83μένÏ\89ν Î±Ï\81Ï\87είÏ\89ν Î¼ÎµÏ\84αβείÏ\84ε Ï\83Ï\84η [[Special:FileList|λίÏ\83Ï\84α Î±Î½ÎµÎ²Î±Ï\83μένÏ\89ν Î±Ï\81Ï\87είÏ\89ν]], Ï\84α (εÏ\80αν)ανεβάÏ\83μαÏ\84α ÎºÎ±Ï\84αγÏ\81άÏ\86ονÏ\84αι ÎµÏ\80ίÏ\83ηÏ\82 Ï\83Ï\84ο [[Special:Log/upload|μηÏ\84Ï\81Ï\8eο Î±Î½ÎµÎ²Î±Ï\83μάÏ\84Ï\89ν]], Î¿Î¹ Î´Î¹Î±Î³Ï\81αÏ\86έÏ\82 Ï\83Ï\84ο [[Special:Log/delete|μηÏ\84Ï\81Ï\8eο Î´Î¹Î±Î³Ï\81αÏ\86Ï\8eν]].\n\nÎ\93ια Î½Î± Ï\83Ï\85μÏ\80εÏ\81ιλάβεÏ\84ε Î¼Î¹Î± ÎµÎ¹ÎºÏ\8cνα Ï\83ε Î¼Î¹Î± Ï\83ελίδα, Ï\87Ï\81ηÏ\83ιμοÏ\80οιήÏ\83Ï\84ε Ï\83Ï\8dνδεÏ\83μο Î¼Îµ ÎºÎ¬Ï\80οια Î±Ï\80Ï\8c Ï\84ιÏ\82 Î±ÎºÏ\8cλοÏ\85θεÏ\82 Î¼Î¿Ï\81Ï\86έÏ\82:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> Î³Î¹Î± Ï\87Ï\81ήÏ\83η Ï\84ηÏ\82 Ï\80λήÏ\81οÏ\85Ï\82 ÎµÎºÎ´Î¿Ï\87ήÏ\82 Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|εναλλακÏ\84ικÏ\8c ÎºÎµÎ¯Î¼ÎµÎ½Î¿]]</nowiki></code></strong> Î³Î¹Î± Ï\87Ï\81ήÏ\83η Î¼Î¯Î±Ï\82 ÎµÎºÎ´Î¿Ï\87ήÏ\82 200 ÎµÎ¹ÎºÎ¿Î½Î¿Ï\83Ï\84οιÏ\87είÏ\89ν Ï\83ε Ï\80λάÏ\84οÏ\82, Î¼Î­Ï\83α Ï\83ε Ï\80λαίÏ\83ιο, Ï\83Ï\84ο Î±Ï\81ιÏ\83Ï\84εÏ\81Ï\8c Ï\80εÏ\81ιθÏ\8eÏ\81ιο, Î¼Îµ Ï\84ο Â«ÎµÎ½Î±Î»Î»Î±ÎºÏ\84ικÏ\8c ÎºÎµÎ¯Î¼ÎµÎ½Î¿Â» Ï\89Ï\82 Ï\80εÏ\81ιγÏ\81αÏ\86ή\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> Î³Î¹Î± Î±Ï\80εÏ\85θείαÏ\82 Ï\83Ï\8dνδεÏ\83μο Ï\80Ï\81οÏ\82 Ï\84ο Î±Ï\81Ï\87είο, Ï\87Ï\89Ï\81ίÏ\82 Ï\80αÏ\81οÏ\85Ï\83ίαÏ\83η Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85",
        "upload-permitted": "{{PLURAL:$2|Επιτρεπτός τύπος αρχείων|Επιτρεπτοί τύποι αρχείων}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Τύπος αρχείων που προτιμάται|Τύποι αρχείων που προτιμούνται}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Απαγορευμένος τύπος αρχείων|Απαγορευμένοι τύποι αρχείων}}: $1.",
        "filestatus": "Κατάσταση του copyright:",
        "filesource": "Πηγή:",
        "ignorewarning": "Αγνόηση της προειδοποίησης και αποθήκευση του αρχείου ούτως ή άλλως",
-       "ignorewarnings": "Î\91γνÏ\8cηÏ\83ε Î¿Ï\80οιεÏ\83δήÏ\80οÏ\84ε Ï\80Ï\81οειδοÏ\80οιήÏ\83ειÏ\82",
+       "ignorewarnings": "Î\91γνÏ\8cηÏ\83η Î¿Ï\80οιÏ\89νδήÏ\80οÏ\84ε Ï\80Ï\81οειδοÏ\80οιήÏ\83εÏ\89ν",
        "minlength1": "Τα ονόματα αρχείων πρέπει να είναι τουλάχιστον ένα γράμμα.",
        "illegalfilename": "Το όνομα του αρχείου \"$1\" περιέχει χαρακτήρες που δεν επιτρέπονται στους τίτλους των σελίδων. Παρακαλούμε δώστε άλλο όνομα στο αρχείο και προσπαθήστε ξανά να το ανεβάσετε.",
        "filename-toolong": "Τα ονόματα των αρχείων δεν πρέπει να ξεπερνούν τα 240 bytes.",
        "emptyfile": "Το αρχείο που φορτώσατε φαίνεται να είναι κενό. Αυτό μπορεί να οφείλεται σε λάθος πληκτρολόγησης του ονόματος του αρχείου. Παρακαλούμε ελέγξτε εαν αυτό είναι πραγματικά το αρχείο που θέλετε να φορτώσετε.",
        "windows-nonascii-filename": "Αυτό το wiki δεν υποστηρίζει ονόματα αρχείων με ειδικούς χαρακτήρες.",
        "fileexists": "Υπάρχει ήδη αρχείο με αυτό το όνομα, παρακαλούμε ελέγξτε το <strong>[[:$1]]</strong> εάν δεν είστε {{GENDER:|σίγουρος|σίγουρη}} αν θέλετε να το αλλάξετε.\n[[$1|thumb]]",
-       "filepageexists": "Î\97 Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 Î³Î¹Î± Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î®Î´Î· Ï\83Ï\84ο <strong>[[:$1]]</strong>, Î±Î»Î»Î¬ ÎºÎ±Î½Î­Î½Î± Î±Ï\81Ï\87είο Î¼Îµ Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\8cνομα Î´ÎµÎ½ Ï\85Ï\80άÏ\81Ï\87ει Î±Ï\85Ï\84ή Ï\84η Ï\83Ï\84ιγμή.\nÎ\97 Ï\80εÏ\81ιγÏ\81αÏ\86á¼  Ï\80οÏ\85 Î¸Î± ÎµÎ¹Ï\83άγεÏ\84ε Î´ÎµÎ½ Î¸Î± ÎµÎ¼Ï\86ανιÏ\83Ï\84εί Ï\83Ï\84η Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82.\nÎ\93ια Î½Î± ÎµÎ¼Ï\86ανιÏ\83Ï\84εί Î· Ï\80εÏ\81ιγÏ\81αÏ\86ή Ï\83αÏ\82 ÎµÎºÎµÎ¯, Î¸Î± Ï\80Ï\81έÏ\80ει Î½Î± Ï\84ην ÎµÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Ï\87ειÏ\81οκίνηÏ\84α.\n[[$1|thumb]]",
+       "filepageexists": "Î\97 Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 Î³Î¹Î± Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο Î´Î·Î¼Î¹Î¿Ï\85Ï\81γήθηκε Î®Î´Î· Ï\83Ï\84ο <strong>[[:$1]]</strong>, Î±Î»Î»Î¬ Î±Ï\85Ï\84ήν Ï\84η Ï\83Ï\84ιγμή Î´ÎµÎ½ Ï\85Ï\80άÏ\81Ï\87ει Î±Ï\81Ï\87είο Î¼Îµ Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\8cνομα.\nÎ\97 Ï\83Ï\8dνοÏ\88η Ï\80οÏ\85 ÎµÎ¹Ï\83αγάγεÏ\84ε Î´ÎµÎ½ Î¸Î± ÎµÎ¼Ï\86ανιÏ\83Ï\84εί Ï\83Ï\84η Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82.\nÎ\93ια Î½Î± ÎµÎ¼Ï\86ανιÏ\83Ï\84εί Î· Ï\83Ï\8dνοÏ\88ή Ï\83αÏ\82 ÎµÎºÎµÎ¯, Î¸Î± Ï\87Ï\81ειαÏ\83Ï\84εί Î½Î± Ï\84ην ÎµÏ\80εξεÏ\81γαÏ\83Ï\84είÏ\84ε Î¼Îµ Ï\84ο Ï\87έÏ\81ι.\n[[$1|thumb]]",
        "fileexists-extension": "Υπάρχει ένα αρχείο με παρόμοιο όνομα: [[$2|thumb]]\n* Όνομα του προς ανέβασμα αρχείου: <strong>[[:$1]]</strong>\n* Όνομα υπάρχοντος αρχείου: <strong>[[:$2]]</strong>\nΜήπως θα θέλατε να χρησιμοποιήσετε κάποιο όνομα που να ξεχωρίζει περισσότερο;",
        "fileexists-thumbnail-yes": "Το αρχείο φαίνεται ότι είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''. [[$1|thumb]]\nΠαρακαλώ ελέγξτε το αρχείο <strong>[[:$1]]</strong>.\nΑν το ελεγμένο αρχείο είναι η ίδια εικόνα στο αρχικό μέγεθος δεν είναι απαραίτητο να επιφορτώσετε μια επιπλέον μικρογραφία.",
        "file-thumbnail-no": "Το όνομα αρχείου αρχίζει με <strong>$1</strong>.\nΦαίνεται πως είναι μια εικόνα μειωμένου μεγέθους ''(μικρογραφία)''.\nΑν έχετε αυτή την εικόνα σε πλήρη ανάλυση, επιφορτώστε τη, αλλιώς αλλάξτε παρακαλώ το όνομα του αρχείου.",
        "uploadinvalidxml": "Δεν ήταν δυνατή η ανάλυση του κώδικα XML στο αρχείο.",
        "uploadvirus": "Το αρχείο περιέχει ιό! Λεπτομέρειες: $1",
        "uploadjava": "Το αρχείο είναι αρχείο ZIP, το οποίο περιέχει ένα αρχείο .class της γλώσσας Java.\nΔεν επιτρέπεται η αποστολή αρχείων Java, επειδή μπορούν να προκαλέσουν παράκαμψη των περιορισμών ασφαλείας του συστήματος.",
-       "upload-source": "Αρχείο πηγής",
-       "sourcefilename": "Όνομα πηγαίου αρχείου:",
+       "upload-source": "Αρχείο προέλευσης",
+       "sourcefilename": "Όνομα αρχείου προέλευσης:",
        "sourceurl": "URL πηγής:",
        "destfilename": "Όνομα αρχείου προορισμού:",
        "upload-maxfilesize": "Μέγιστο μέγεθος αρχείου: $1",
        "upload-description": "Περιγραφή αρχείου",
-       "upload-options": "Επιλογές φόρτωσης",
-       "watchthisupload": "ΠαÏ\81ακολοÏ\85θήÏ\83Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο",
+       "upload-options": "Επιλογές ανεβάσματος",
+       "watchthisupload": "ΠαÏ\81ακολοÏ\8dθηÏ\83η Î±Ï\85Ï\84οÏ\8d Ï\84οÏ\85 Î±Ï\81Ï\87είοÏ\85",
        "filewasdeleted": "Ένα αρχείο με αυτό το όνομα είχε επιφορτωθεί προηγουμένως και επακολούθως διαγράφηκε. Θα έπρεπε να ελέγξετε το $1 πριν προσπαθήσετε να το επιφορτώσετε ξανά.",
+       "filename-thumb-name": "Αυτό μοιάζει με έναν τίτλο μικρογραφίας. Παρακαλούμε μην ανεβάζετε εικόνες μικρογραφίας και πάλι στο ίδιο wiki. Διαφορετικά, παρακαλούμε να διορθώσετε το όνομα του αρχείου έτσι ώστε να έχει περισσότερο νόημα, και να μην έχει πρόθεμα μικρογραφίας.",
        "filename-bad-prefix": "Το όνομα του αρχείου που ανεβάζετε ξεκινά με '''\"$1\"''', που είναι ένα μη περιγραφικό όνομα που συνήθως εκχωρείται αυτόματα από ψηφιακές φωτογραφικές μηχανές. Παρακαλώ διαλέξτε ένα πιο περιγραφικό όνομα για το αρχείο σας.",
        "filename-prefix-blacklist": " #<!-- leave this line exactly as it is --> <pre>\n# Η σύνταξη είναι ως ακολούθως:\n#   * Οτιδήποτε από ένα χαρακτήρα «#» μέχρι το τέλος της γραμμής είναι ένα σχόλιο\n#   * Οποιαδήποτε μη κενή γραμμή είναι ένα πρόθεμα για τυπικά ονόματα αρχείων ορισμένα\n#     αυτόματα από ψηφιακές φωτογραφικές μηχανές\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # μερικά κινητά τηλέφωνα\nIMG # γενικά\nJD # Jenoptik\nMGP # Pentax\nPICT # διάφορα\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-success-subj": "Επιτυχής φόρτωση",
        "upload-warning-subj": "Προειδοποίηση φόρτωσης",
        "upload-warning-msg": "Υπήρξε ένα πρόβλημα με τη φόρτωσή σας από [$2]. Μπορείτε να επιστρέψετε στη [[Special:Upload/stash/$1|φόρμα φόρτωσης]] για να διορθώσετε αυτό το πρόβλημα.",
        "upload-proto-error": "Λανθασμένο πρωτόκολλο",
-       "upload-proto-error-text": "Î\97 Î±Ï\80ομακÏ\81Ï\85Ï\83μένη ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η απαιτεί URL με πρόθεμα <code>http://</code> ή <code>ftp://</code>.",
+       "upload-proto-error-text": "Το Î±Ï\80ομακÏ\81Ï\85Ï\83μένο Î±Î½Î­Î²Î±Ï\83μα απαιτεί URL με πρόθεμα <code>http://</code> ή <code>ftp://</code>.",
        "upload-file-error": "Εσωτερικό σφάλμα",
        "upload-file-error-text": "Ένα εσωτερικό σφάλμα εμφανίστηκε κατά την προσπάθεια δημιουργίας ενός προσωρινού αρχείου στον εξυπηρετητή.\nΠαρακαλούμε επικοινωνήστε με έναν [[Special:ListUsers/sysop|διαχειριστή]] του συστήματος.",
        "upload-misc-error": "Άγνωστο σφάλμα επιφόρτωσης",
        "upload-form-label-infoform-description": "Περιγραφή",
        "upload-form-label-usage-title": "Χρήση",
        "upload-form-label-usage-filename": "Όνομα αρχείου",
+       "foreign-structured-upload-form-label-own-work": "Αυτό είναι το δικό μου έργο",
        "foreign-structured-upload-form-label-infoform-categories": "Κατηγορίες",
        "foreign-structured-upload-form-label-infoform-date": "Ημερομηνία",
+       "foreign-structured-upload-form-label-own-work-message-local": "Επιβεβαιώνω ότι επιφορτώνω  αυτό το αρχείο κατά τους όρους της υπηρεσίας και πολιτικές αδειοδότησης για τον ιστότοπο {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Εάν δεν είστε σε θέση να ανεβάσετε αυτό το αρχείο στο πλαίσιο των πολιτικών της  {{SITENAME}}, παρακαλώ κλείστε αυτό το παράθυρο διαλόγου και να επιχειρήσετε μια άλλη μέθοδος.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Επίσης, μπορεί να θέλετε να δοκιμάσετε [[Special:Upload|την προεπιλεγμένη σελίδα επιφόρτωσης]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Καταλαβαίνω ότι είμαι φόρτωμα αυτό το αρχείο σε ένα κοινόχρηστο αρχείο. Επιβεβαιώνω ότι είμαι τόσο ακόλουθες τους όρους της υπηρεσίας και πολιτικές αδειοδότησης.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Εάν δεν είστε σε θέση να ανεβάσετε αυτό το αρχείο στο πλαίσιο των πολιτικών της shared repository, παρακαλώ κλείστε αυτό το παράθυρο διαλόγου και να επιχειρήσετε μια άλλη μέθοδος.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Αν δεν κατέχει τα πνευματικά δικαιώματα για αυτό το αρχείο, ή επιθυμείτε να το δημοσιεύσετε υπό μια διαφορετική άδεια χρήσης, μπορείτε να χρησιμοποιήσετε τον [https://commons.wikimedia.org/wiki/Special:UploadWizard Οδηγό Ανεβάσματος των Κοινών].",
        "backend-fail-stream": "Αδύνατη η μετάδοση του αρχείου $1.",
        "backend-fail-backup": "Αδύνατη η δημιουργία αντίγραφου ασφαλείας του αρχείου $1.",
        "backend-fail-notexists": "Το αρχείο $1 δεν υπάρχει.",
        "http-bad-status": "Υπήρξε πρόβλημα κατά τη διάρκεια του αιτήματος HTTP: $1 $2",
        "upload-curl-error6": "Το URL δεν ήταν προσβάσιμο",
        "upload-curl-error6-text": "Το παρεχόμενο URL δεν μπόρεσε να προσπελαστεί. Παρακαλώ εξετάστε διπλά, ότι το URL είναι ορθό και ότι ο ιστότοπος είναι διαθέσιμος.",
-       "upload-curl-error28": "Î\9bήξη Ï\87Ï\81Ï\8cνοÏ\85 Î±Î½Î±Î¼Î¿Î½Î®Ï\82 (timeout) Î³Î¹Î± Ï\84ην ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η",
+       "upload-curl-error28": "Î\9bήξη Ï\87Ï\81Ï\8cνοÏ\85 Î±Î½Î±Î¼Î¿Î½Î®Ï\82 (timeout) Î³Î¹Î± Ï\84ο Î±Î½Î­Î²Î±Ï\83μα",
        "upload-curl-error28-text": "Ο ιστότοπος άργησε πολύ να αποκριθεί. Παρακαλούμε ελέγξτε ότι ο ιστότοπος είναι διαθέσιμος, περιμένετε για λίγο και προσπαθήστε ξανά. Μπορεί να θέλετε να δοκιμάσετε σε μια λιγότερο πολυσύχναστη ώρα.",
        "license": "Αδειοδότηση:",
        "license-header": "Αδειοδότηση",
        "nolicense": "Καμία επιλεγμένη",
-       "licenses-edit": "Î\95Ï\80ιλογέÏ\82 ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82 Î¬Î´ÎµÎ¹Î±Ï\82",
+       "licenses-edit": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\80αÏ\81αμέÏ\84Ï\81Ï\89ν Ï\84Ï\89ν Î±Î´ÎµÎ¹Ï\8eν",
        "license-nopreview": "(Μη διαθέσιμη προεπισκόπηση)",
        "upload_source_url": "(το επιλεγμένο σας αρχείο από μια έγκυρη, δημόσια προσβάσιμη διεύθυνση URL)",
        "upload_source_file": "(το επιλεγμένο αρχείο από τον υπολογιστή σας)",
        "duplicatesoffile": "{{PLURAL:$1|Το ακόλουθο αρχείο είναι διπλότυπο|Τα $1 ακόλουθα αρχεία είναι διπλότυπα}} αυτού του αρχείου ([[Special:FileDuplicateSearch/$2|περισσότερες λεπτομέρειες]]):",
        "sharedupload": "Το αρχείο αυτό είναι από το $1 και είναι δυνατόν να χρησιμοποιείται από άλλα εγχειρήματα.",
        "sharedupload-desc-there": "Αυτό το αρχείο προέρχεται από το $1 και ενδέχεται να χρησιμοποιείται και από άλλα εγχειρήματα.\nΠαρακαλούμε δείτε τη [$2 σελίδα περιγραφής του αρχείου] για περισσότερες πληροφορίες.",
-       "sharedupload-desc-here": "Το Î±Ï\81Ï\87είο ÎµÎ¯Î½Î±Î¹ Î±Ï\80Ï\8c Ï\84ο $1 ÎºÎ±Î¹ ÎµÎ½Î´Î­Ï\87εÏ\84αι Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιείÏ\84αι Î±Ï\80Ï\8c Î¬Î»Î»Î± ÎµÎ³Ï\87ειÏ\81ήμαÏ\84α.\nÎ\97 Ï\80εÏ\81ιγÏ\81αÏ\86ή Ï\83Ï\84η [$2 Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 Î±Ï\81Ï\87είοÏ\85] εμφανίζεται παρακάτω.",
+       "sharedupload-desc-here": "Î\91Ï\85Ï\84Ï\8c Ï\84ο Î±Ï\81Ï\87είο ÎµÎ¯Î½Î±Î¹ Î±Ï\80Ï\8c Ï\84ο $1 ÎºÎ±Î¹ ÎµÎ½Î´Î­Ï\87εÏ\84αι Î½Î± Ï\87Ï\81ηÏ\83ιμοÏ\80οιείÏ\84αι Î±Ï\80Ï\8c Î¬Î»Î»Î± ÎµÎ³Ï\87ειÏ\81ήμαÏ\84α.\nÎ\97 Ï\80εÏ\81ιγÏ\81αÏ\86ή Ï\83Ï\84η [$2 Ï\83ελίδα Ï\80εÏ\81ιγÏ\81αÏ\86ήÏ\82 Ï\84οÏ\85 ÎµÎºÎµÎ¯], εμφανίζεται παρακάτω.",
        "sharedupload-desc-edit": "Αυτό το αρχείο είναι από  $1  και μπορεί να χρησιμοποιείται από άλλα εγχειρήματα.\nΊσως θέλετε να επεξεργαστείτε την περιγραφή του στην   [$2  σελίδα περιγραφής αρχείου] εκεί.",
        "sharedupload-desc-create": "Αυτό το αρχείο είναι από $1 και μπορεί να χρησιμοποιείται από άλλα εγχειρήματα.\nΊσως θέλετε να επεξεργαστείτε την περιγραφή του στην [$2 σελίδα περιγραφής αρχείου] εκεί.",
        "filepage-nofile": "Κανένα αρχείο με αυτό το όνομα δεν υπάρχει",
        "notargettext": "Δεν έχετε καθορίσει ένα χρήστη ή μια σελίδα προορισμού για να εκτελεσθεί αυτή η λειτουργία.",
        "nopagetitle": "Δεν υπάρχει τέτοια σελίδα στόχος",
        "nopagetext": "Η σελίδα στόχος που καταχωρίσατε δεν υπάρχει.",
-       "pager-newer-n": "{{PLURAL:$1|1 Î½ÎµÏ\8eÏ\84εÏ\81οÏ\85|$1 Î½ÎµÏ\8eτερων}}",
+       "pager-newer-n": "{{PLURAL:$1|1 Î½ÎµÏ\8cÏ\84εÏ\81οÏ\85|$1 Î½ÎµÏ\8cτερων}}",
        "pager-older-n": "{{PLURAL:$1|1 παλαιότερο|$1 παλαιότερα}}",
        "suppress": "Περιορισμός",
        "querypage-disabled": "Αυτή η ειδική σελίδα είναι απενεργοποιημένη για λόγους απόδοσης.",
        "wlheader-showupdated": "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
        "wlnote": "Παρακάτω είναι {{PLURAL:$1|η πιο πρόσφατη αλλαγή|οι <strong>$1</strong> πιο πρόσφατες αλλαγές}} κατά τη διάρκεια {{PLURAL:$2|της τελευταίας ώρας|των <strong>$2</strong> τελευταίων ωρών}} ως προς τις $3 στις $4.",
        "wlshowlast": "Εμφάνιση των τελευταίων $1 ωρών $2 ημερών",
+       "watchlistall2": "όλα",
+       "watchlist-hide": "Απόκρυψη",
+       "wlshowtime": "Εμφάνιση τελευταίου:",
+       "wlshowhideminor": "μικρές τροποποιήσεις",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "εγγεγραμμένοι χρήστες",
+       "wlshowhideanons": "ανώνυμοι χρήστες",
+       "wlshowhidepatr": "επιτηρούμενες επεξεργασίες",
+       "wlshowhidemine": "οι επεξεργασίες μου",
        "watchlist-options": "Επιλογές λίστας παρακολούθησης",
        "watching": "Παρακολούθηση...",
        "unwatching": "Μη παρακολούθηση...",
        "deletepage": "Διαγραφή σελίδας",
        "confirm": "Επιβεβαίωση",
        "excontent": "το περιεχόμενο ήταν: '$1'",
-       "excontentauthor": "το περιεχόμενο ήταν: \"$1\", (και οι μοναδικές συνεισφορές ήταν του \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|συζήτηση]])",
+       "excontentauthor": "το περιεχόμενο ήταν: \"$1\", και οι μοναδικές συνεισφορές ήταν του \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|συζήτηση]])",
        "exbeforeblank": "το περιεχόμενο πριν τη διαγραφή ήταν: «$1»",
        "delete-confirm": "Διαγραφή του \"$1\"",
        "delete-legend": "Διαγραφή",
        "changecontentmodel-model-label": "Νέο μοντέλο περιεχομένου",
        "changecontentmodel-reason-label": "Αιτία:",
        "changecontentmodel-success-title": "Το περιεχόμενο πρότυπο άλλαξε",
+       "changecontentmodel-success-text": "Ο τύπος περιεχομένου του [[:$1]] έχει αλλάξει.",
+       "changecontentmodel-cannot-convert": "Το περιεχόμενο του [[:$1]] δεν μπορεί να μετατραπεί σε τύπο $2.",
+       "changecontentmodel-nodirectediting": "Το μοντέλο περιεχομένου $1 δεν υποστηρίζει την άμεση επεξεργασία",
+       "log-name-contentmodel": "Αρχείο καταγραφής αλλαγών μοντέλου περιεχομένου",
+       "log-description-contentmodel": "Συμβάντα που σχετίζονται με τα μοντέλα περιεχομένου μιας σελίδας",
        "logentry-contentmodel-change": "{{GENDER:$2|Ο|Η}} $1 άλλαξε το πρότυπο περιεχομένου της σελίδας $3 από «$4» σε «$5»",
        "logentry-contentmodel-change-revertlink": "αναστροφή",
        "logentry-contentmodel-change-revert": "αναστροφή",
        "undelete-show-file-submit": "Ναι",
        "namespace": "Ονοματοχώρος:",
        "invert": "Αντιστροφή επιλογής",
-       "tooltip-invert": "Î\95Ï\80ιλέξÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80λαίÏ\83ιο Î³Î¹Î± Î½Î± Î±Ï\80οκÏ\81Ï\8dÏ\88εÏ\84ε Î±Î»Î»Î±Î³Î­Ï\82 Ï\83ε Ï\83ελίδεÏ\82 Î¼Î­Ï\83α Ï\83Ï\84ον ÎµÏ\80ιλεγμένο Ï\87Ï\8eÏ\81ο Î¿Î½Î¿Î¼Î¬Ï\84Ï\89ν (και Ï\84Ï\89ν Ï\83Ï\85Ï\83Ï\87εÏ\84ικÏ\8eν Ï\87Ï\8eÏ\81Ï\89ν Î¿Î½Î¿Î¼Î¬Ï\84Ï\89ν, ÎµÎ¬Î½ ÎµÏ\80ιλεγχθούν)",
+       "tooltip-invert": "ΤικάÏ\81εÏ\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\80λαίÏ\83ιο Î³Î¹Î± Î½Î± Î±Ï\80οκÏ\81Ï\8dÏ\88εÏ\84ε Î±Î»Î»Î±Î³Î­Ï\82 Ï\83ε Ï\83ελίδεÏ\82 Î¼Î­Ï\83α Ï\83Ï\84ον ÎµÏ\80ιλεγμένο Î¿Î½Î¿Î¼Î±Ï\84οÏ\87Ï\8eÏ\81ο (και Ï\84Ï\89ν Ï\83Ï\85Ï\83Ï\87εÏ\84ικÏ\8eν Î¿Î½Î¿Î¼Î±Ï\84οÏ\87Ï\8eÏ\81Ï\89ν, ÎµÎ¬Î½ ÎµÏ\80ιλεχθούν)",
        "tooltip-whatlinkshere-invert": "Ενεργοποιήστε αυτό το πλαίσιο ελέγχου για να αποκρύψετε συνδέσμους από σελίδες εντός του επιλεγμένου ονοματοχώρου.",
        "namespace_association": "Συσχετισμένος ονοματοχώρος",
        "tooltip-namespace_association": "Επιλέξτε αυτό το κουτάκι για να συμπεριλάβετε τον ονοματοχώρο συζήτησης ή θέματος που σχετίζεται με τον επιλεγμένο ονοματοχώρο",
        "blanknamespace": "(Κύριος ονοματοχώρος)",
-       "contributions": "Συνεισφορές {{GENDER:$1|χρήστη|χρήστριας}}",
+       "contributions": "Συνεισφορές {{GENDER:$1|χρήστη}}",
        "contributions-title": "Συνεισφορές χρήστη για {{GENDER:$1|τον|την}} $1",
        "mycontris": "Συνεισφορές",
+       "anoncontribs": "Συνεισφορές",
        "contribsub2": "Για {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Ο λογαριασμός χρήστη «$1» δεν είναι εγγεγραμμένος.",
        "nocontribs": "Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.",
        "movepagetext-noredirectfixer": "Χρησιμοποιώντας τη φόρμα που ακολουθεί μπορείτε να μετονομάσετε σελίδες και να μεταφέρετε όλο το ιστορικό τους στο νέο όνομα.\nΟ παλιός τίτλος της σελίδας θα γίνει μια σελίδα ανακατεύθυνσης στο νέο τίτλο.\nΜπορείτε να ενημερώσετε τις ανακατευθύνσεις που οδηγούν στον αρχικό τίτλο αυτόματα.\nΑν επιλέξετε να μην γίνει, θα πρέπει να ελέγξετε τις  [[Special:DoubleRedirects|διπλές]] και τις [[Special:BrokenRedirects|κατεστραμμένες ανακατευθύνσεις]].\nΕίστε υπεύθυνος να επιβεβαιώσετε ότι οι σύνδεσμοι εξακολουθούν να οδηγούν προς τις κατευθύνσεις που πρέπει.\n\nΛάβετε υπόψη σας ότι η σελίδα '''δεν''' θα μετακινηθεί αν υπάρχει ήδη μια άλλη σελίδα κάτω από το νέο τίτλο, εκτός αν η σελίδα αυτή είναι κενή ή είναι ανακατεύθυνση χωρίς ιστορικό επεξεργασίας.\nΑυτό σημαίνει ότι, στην περίπτωση που έχετε κάνει λάθος, μπορείτε να μετονομάσετε μια σελίδα ξαναδίνοντας της την αρχική της ονομασία αλλά δεν μπορείτε να αντικαταστήσετε μια υπάρχουσα σελίδα.\n\n'''ΠΡΟΣΟΧΗ!'''\nΗ μετονομασία σελίδας είναι μια αιφνίδια και δραστική αλλαγή όταν πρόκειται για δημοφιλείς σελίδες.\nΠαρακαλούμε, πριν το αποφασίσετε, να εξετάσετε προσεκτικά τις πιθανές επιπτώσεις αυτής της ενέργειας.",
        "movepagetalktext": "Αν τσεκάρετε αυτό το κουτί, η σχετιζόμενη σελίδα συζήτησης θα μετακινηθεί αυτόματα στο νέο τίτλο, εκτός αν υπάρχει κάτω από το νέο όνομα μια σελίδα συζήτησης που δεν είναι κενή.\n\nΣε αυτή την περίπτωση, θα πρέπει να μετακινήσετε ή να συγχωνεύσετε τη σελίδα με το χέρι αν είναι επιθυμητό.",
        "moveuserpage-warning": "'''Προσοχή:''' Ετοιμάζεστε να μετακινήσετε μια σελίδα χρήστη. Σημειώστε παρακαλώ ότι θα μετακινηθεί μόνο η σελίδα και ο χρήστης '''δεν''' θα μετονομαστεί.",
-       "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πάτε να μετακινήσετε μια σελίδα κατηγορίας. Παρακαλούμε να σημειωθεί ότι μόνο η σελίδα θα μετακινηθεί και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα επανακατηγοριοποιηθούν στη νέα κατηγορία.",
+       "movecategorypage-warning": "<strong>Προειδοποίηση:</strong>Πρόκειται να μετακινήσετε μια σελίδα κατηγορίας. Έχετε υπόψη ότι θα μετακινηθεί μόνο η σελίδα και τυχόν σελίδες στην παλιά κατηγορία <em>δεν</em> θα μεταφερθούν στη νέα κατηγορία.",
        "movenologintext": "Για να μετακινήσετε μια σελίδα πρέπει να είστε εγγεγραμένος χρήστης και [[Special:UserLogin|να έχετε συνδεθεί]] στο Wiκi.",
        "movenotallowed": "Δεν έχετε άδεια να μετακινείτε σελίδες.",
        "movenotallowedfile": "Δεν έχετε άδεια να μετακινείτε αρχεία.",
        "movenosubpage": "Αυτή η σελίδα δεν έχει υποσελίδες.",
        "movereason": "Αιτία:",
        "revertmove": "επαναφορά",
-       "delete_and_move": "Διαγραφή και μετακίνηση",
        "delete_and_move_text": "==Χρειάζεται διαγραφή.==\n\nΤο άρθρο [[:$1]] υπάρχει ήδη. Θέλετε να το διαγράψετε για να εκτελεσθεί η μετακίνηση;",
        "delete_and_move_confirm": "Ναι, να διαγραφεί η σελίδα.",
        "delete_and_move_reason": "Διαγράφηκε για να δημιουργήσει χώρο για μετακίνηση από το \"[[$1]]\"",
        "tooltip-pt-preferences": "Οι προτιμήσεις σας",
        "tooltip-pt-watchlist": "Η λίστα με τις σελίδες που παρακολουθείτε για αλλαγές",
        "tooltip-pt-mycontris": "Κατάλογος των συνεισφορών σας",
-       "tooltip-pt-login": "Σας ενθαρρύνουμε να συνδεθείτε&middot; ωστόσο δεν είναι υποχρεωτικό",
+       "tooltip-pt-login": "Σας ενθαρρύνουμε να συνδεθείτε· ωστόσο, δεν είναι υποχρεωτικό",
        "tooltip-pt-logout": "Έξοδος",
        "tooltip-pt-createaccount": "Σας ενθαρρύνουμε να δημιουργήσετε ένα λογαριασμό και να συνδεθείτε· ωστόσο, δεν είναι υποχρεωτικό",
        "tooltip-ca-talk": "Συζήτηση για τη σελίδα περιεχομένου",
        "tooltip-ca-edit": "Επεξεργασία αυτής της σελίδας",
        "tooltip-ca-addsection": "Ξεκίνημα νέας ενότητας",
-       "tooltip-ca-viewsource": "Αυτή η σελίδα είναι προστατευμένη.\nΜπορείτε να προβάλετε τον πηγαίο της κώδικα.",
-       "tooltip-ca-history": "ΠαλιέÏ\82 Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83ειÏ\82 Ï\84οÏ\85 Î¬Ï\81θÏ\81οÏ\85.",
+       "tooltip-ca-viewsource": "Αυτή η σελίδα είναι προστατευμένη.\nΜπορείτε να προβάλετε τον κώδικά της",
+       "tooltip-ca-history": "ΠαλιέÏ\82 Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83ειÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82",
        "tooltip-ca-protect": "Προστασία αυτής της σελίδας",
        "tooltip-ca-unprotect": "Αλλαγή ρυθμίσεων προστασίας αυτής της σελίδας",
        "tooltip-ca-delete": "Διαγραφή αυτής της σελίδας",
        "tooltip-search-go": "Μετάβαση σε μια σελίδα με αυτό ακριβώς το όνομα εάν υπάρχει",
        "tooltip-search-fulltext": "Αναζήτηση σε σελίδες για αυτό το κείμενο",
        "tooltip-p-logo": "Επίσκεψη στην αρχική σελίδα",
-       "tooltip-n-mainpage": "Î\95Ï\80ιÏ\83κεÏ\85τείτε την αρχική σελίδα",
-       "tooltip-n-mainpage-description": "Î\95Ï\80ιÏ\83κεÏ\86θείÏ\84ε Ï\84ην ÎºÏ\8dÏ\81ια σελίδα",
+       "tooltip-n-mainpage": "Î\95Ï\80ιÏ\83κεÏ\86τείτε την αρχική σελίδα",
+       "tooltip-n-mainpage-description": "Î\95Ï\80ιÏ\83κεÏ\86θείÏ\84ε Ï\84ην Î±Ï\81Ï\87ική σελίδα",
        "tooltip-n-portal": "Σχετικά με το εγχείρημα, τι μπορείτε να κάνετε, πού μπορείτε να βρείτε τι",
-       "tooltip-n-currentevents": "ΠληÏ\81οÏ\86οÏ\81ίεÏ\82 Î³Î¹Î± Ï\80Ï\81Ï\8cÏ\83Ï\86ατα γεγονότα",
+       "tooltip-n-currentevents": "Î\92Ï\81είÏ\84ε Î²Î±Ï\83ικέÏ\82 Ï\80ληÏ\81οÏ\86οÏ\81ίεÏ\82 Î³Î¹Î± Ï\84Ï\81έÏ\87οντα γεγονότα",
        "tooltip-n-recentchanges": "Λίστα πρόσφατων αλλαγών στο wiki",
        "tooltip-n-randompage": "Φόρτωση μιας τυχαίας σελίδας",
-       "tooltip-n-help": "Το μέρος για να βρείτε τις απαντήσεις που ψάχνετε.",
-       "tooltip-t-whatlinkshere": "Î\9bίÏ\83Ï\84α Ï\8cλÏ\89ν Ï\84Ï\89ν Ï\83ελίδÏ\89ν Ï\80οÏ\85 Î­Ï\87οÏ\85ν Ï\83Ï\85νδέÏ\83μοÏ\85Ï\82 Ï\80Ï\81οÏ\82 Ï\84α εδώ",
-       "tooltip-t-recentchangeslinked": "ΠÏ\81Ï\8cÏ\83Ï\86αÏ\84εÏ\82 Î±Î»Î»Î±Î³Î­Ï\82 Ï\83ε Ï\83ελίδεÏ\82 Ï\83Ï\84ιÏ\82 Î¿Ï\80οίεÏ\82 Î¿Î´Î·Î³Î¿Ï\8dν Ï\83Ï\8dνδεÏ\83μοι Î±Ï\80Ï\8c Î±Ï\85Ï\84ήν Ï\84η Ï\83ελίδα",
+       "tooltip-n-help": "Το μέρος για να βρείτε αυτό που ψάχνετε",
+       "tooltip-t-whatlinkshere": "Î\9aαÏ\84άλογοÏ\82 Ï\8cλÏ\89ν Ï\84Ï\89ν Ï\83ελίδÏ\89ν wiki Ï\80οÏ\85 Î­Ï\87οÏ\85ν Ï\83Ï\85νδέÏ\83μοÏ\85Ï\82 Ï\80Ï\81οÏ\82 εδώ",
+       "tooltip-t-recentchangeslinked": "ΠÏ\81Ï\8cÏ\83Ï\86αÏ\84εÏ\82 Î±Î»Î»Î±Î³Î­Ï\82 Ï\83ε Ï\83ελίδεÏ\82 Ï\80οÏ\85 Ï\80αÏ\81αÏ\80έμÏ\80οÏ\85ν Î¿Î¹ Ï\83Ï\8dνδεÏ\83μοι Î±Ï\85Ï\84ήÏ\82 Ï\84ηÏ\82 Ï\83ελίδαÏ\82",
        "tooltip-feed-rss": "RSS feed για αυτή τη σελίδα",
        "tooltip-feed-atom": "Ροή Atom για αυτήν τη σελίδα",
        "tooltip-t-contributions": "Λίστα με τις συνεισφορές αυτού του χρήστη",
        "tooltip-t-emailuser": "Αποστολή μηνύματος ηλεκτρονικής αλληλογραφίας σε αυτόν το χρήστη",
        "tooltip-t-info": "Περισσότερες πληροφορίες σχετικά με αυτήν τη σελίδα",
        "tooltip-t-upload": "Ανέβασμα αρχείων",
-       "tooltip-t-specialpages": "Î\97 Î»Î¯Ï\83Ï\84α με όλες τις ειδικές σελίδες",
+       "tooltip-t-specialpages": "Î\9aαÏ\84άλογοÏ\82 με όλες τις ειδικές σελίδες",
        "tooltip-t-print": "Εκτυπώσιμη έκδοση αυτής της σελίδας",
        "tooltip-t-permalink": "Μόνιμος σύνδεσμος σε αυτή την έκδοση της σελίδας",
-       "tooltip-ca-nstab-main": "Προβολή σελίδας περιεχομένου",
+       "tooltip-ca-nstab-main": "ΠÏ\81οβολή Ï\84ηÏ\82 Ï\83ελίδαÏ\82 Ï\80εÏ\81ιεÏ\87ομένοÏ\85",
        "tooltip-ca-nstab-user": "Προβολή της σελίδας χρήστη",
        "tooltip-ca-nstab-media": "Δείτε τη σελίδα πολυμέσων",
-       "tooltip-ca-nstab-special": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± ÎµÎ¹Î´Î¹ÎºÎ® Ï\83ελίδα, ÎºÎ±Î¹ Î´ÎµÎ½ Î¼Ï\80οÏ\81εί Î½Î± ÎµÏ\80εξεÏ\81γαÏ\83Ï\84εί",
+       "tooltip-ca-nstab-special": "Î\91Ï\85Ï\84ή ÎµÎ¯Î½Î±Î¹ Î¼Î¹Î± ÎµÎ¹Î´Î¹ÎºÎ® Ï\83ελίδα, ÎºÎ±Î¹ Î´ÎµÎ½ ÎµÏ\80ιδέÏ\87εÏ\84αι ÎµÏ\80εξεÏ\81γαÏ\83ία",
        "tooltip-ca-nstab-project": "Προβολή της σελίδας εγχειρήματος",
        "tooltip-ca-nstab-image": "Προβολή της σελίδας αρχείου",
        "tooltip-ca-nstab-mediawiki": "Δείτε το μήνυμα του συστήματος",
        "tooltip-ca-nstab-category": "Προβολή της σελίδας κατηγορίας",
        "tooltip-minoredit": "Χαρακτηρισμός αυτής της επεξεργασίας ως μικροεπεξεργασία",
        "tooltip-save": "Αποθήκευση των αλλαγών σας",
-       "tooltip-preview": "Προεπισκόπηση των αλλαγών σας, παρακαλούμε χρησιμοποιήστε την πριν αποθηκεύσετε!",
+       "tooltip-preview": "Προεπισκόπηση των αλλαγών σας. Παρακαλούμε χρησιμοποιήστε την πριν αποθηκεύσετε!",
        "tooltip-diff": "Εμφάνιση των αλλαγών που κάνατε στο κείμενο",
        "tooltip-compareselectedversions": "Προβολή των διαφορών ανάμεσα στις δύο επιλεγμένες αναθεωρήσεις αυτής της σελίδας",
        "tooltip-watch": "Προσθήκη αυτής της σελίδας στη λίστα παρακολούθησής σας",
        "filedelete-current-unregistered": "Το συγκεκριμένο αρχείο \"$1\" δεν υπάρχει στη βάση δεδομένων.",
        "filedelete-archive-read-only": "Το αρχείο καταλόγου \"$1\" είναι μη εγγράψιμο από τον διακομιστή.",
        "previousdiff": "← Παλαιότερη επεξεργασία",
-       "nextdiff": "Î\9dεÏ\8eτερη επεξεργασία →",
+       "nextdiff": "Î\9dεÏ\8cτερη επεξεργασία →",
        "mediawarning": "'''Προειδοποίηση''': Το αρχείο αυτό μπορεί να περιέχει κακοπροαίρετο κώδικα.\nΕκτελώντας το, μπορεί να βλάψει το σύστημα του υπολογιστή σας.",
        "imagemaxsize": "Όριο μεγέθους εικόνων:<br />''(στις σελίδες περιγραφής εικόνων)''",
        "thumbsize": "Μέγεθος μικρογραφίας:",
        "svg-long-error": "Μη έγκυρο αρχείο SVG: $1",
        "show-big-image": "Πρωτότυπο αρχείο",
        "show-big-image-preview": "Μέγεθος αυτής της προεπισκόπησης: $1 .",
+       "show-big-image-preview-differ": "Το μέγεθος αυτής της $3 προεπισκόπησης αυτού του $2 το αρχείο: $1.",
        "show-big-image-other": "Άλλες {{PLURAL:$2|ανάλυση|αναλύσεις}}: $1.",
        "show-big-image-size": "$1 × $2 εικονοστοιχεία",
        "file-info-gif-looped": "περιτυλιγμένο",
        "exif-primarychromaticities": "Πρωτεύοντες χρωματισμοί",
        "exif-ycbcrcoefficients": "Συντελεστές μητρών μετασχηματισμού χρώματος",
        "exif-referenceblackwhite": "Ζεύγος μαύρων και άσπρων αξιών αναφοράς",
-       "exif-datetime": "Ημερομηνία και ώρα τελευταίας επεξεργασίας.",
+       "exif-datetime": "Ημερομηνία και ώρα τελευταίας επεξεργασίας αρχείου",
        "exif-imagedescription": "Τίτλος εικόνας",
        "exif-make": "Κατασκευαστής φωτογραφικής μηχανής",
        "exif-model": "Μοντέλο φωτογραφικής μηχανής",
        "exif-urgency-other": "Προτεραιότητα που ορίστηκε από το χρήστη ($1)",
        "namespacesall": "όλοι",
        "monthsall": "όλα",
-       "confirmemail": "Επιβεβαίωση διεύθυνσης e-mail",
+       "confirmemail": "Επιβεβαίωση διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "confirmemail_noemail": "Δεν έχετε ορίσει μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.",
        "confirmemail_text": "Το σύστημα χρειάζεται να επαληθεύσει τη διεύθυνση e-mail που δώσατε για να χρησιμοποιήσετε τις δυνατότητες αλληλογραφίας. Κάνετε κλικ στο παρακάτω κουμπί και θα σας αποσταλεί μήνυμα επαλήθευσης στη διεύθυνσή σας. Στο μήνυμα αυτό θα εμφανίζεται ένας σύνδεσμος που Θα περιέχει τον κωδικό επαλήθευσης -ακολουθήστε το σύνδεσμο αυτό για να μπορέσει το σύστημα να επαληθεύσει τη διεύθυνση αλληλογραφίας σας.",
        "confirmemail_pending": "Ένας κωδικός επιβεβαίωσης σας έχει ήδη σταλεί μέσω μηνύματος e-mail. Αν δημιουργήσατε\nπρόσφατα το λογαριασμό σας, μπορεί να θέλετε να περιμένετε μερικά λεπτά\nγια να φτάσει αυτό πριν προσπαθήσετε να ζητήσετε ένα νέο κωδικό.",
        "watchlistedit-normal-submit": "Αφαίρεση Σελίδων",
        "watchlistedit-normal-done": "{{PLURAL:$1|1 τίτλος|$1 τίτλοι}} αφαιρέθηκαν από τη λίστα παρακολούθησής σας:",
        "watchlistedit-raw-title": "Επεξεργασία πηγαίας λίστας παρακολούθησης",
-       "watchlistedit-raw-legend": "Î\94ιÏ\8cÏ\81θÏ\89Ï\83ε Ï\84ην Ï\80ηγαία Î»Î¯Ï\83Ï\84α παρακολούθησης",
+       "watchlistedit-raw-legend": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\80ηγαίαÏ\82 Î»Î¯Ï\83Ï\84αÏ\82 παρακολούθησης",
        "watchlistedit-raw-explain": "Οι σελίδες στη λίστα παρακολούθησής σας φαίνονται παρακάτω και μπορείτε να τις επεξεργαστείτε\nπροσθαφαιρώντας από τη λίστα, έναν τίτλο ανά σειρά. Όταν ολοκληρώσετε την επεξεργασία, κάντε κλικ στο \"{{int:Watchlistedit-raw-submit}}\".\nΜπορείτε επίσης να χρησιμοποιήσετε την [[Special:EditWatchlist|προεπιλεγμένη μέθοδο επεξεργασίας]].",
        "watchlistedit-raw-titles": "Σελίδες:",
        "watchlistedit-raw-submit": "Ενημέρωση Λίστας Παρακολούθησης",
        "htmlform-cloner-create": "Προσθήκη περισσοτέρων",
        "htmlform-cloner-delete": "Αφαίρεση",
        "htmlform-cloner-required": "Απαιτείται τουλάχιστον μία τιμή.",
-       "htmlform-title-not-exists": "Ο τίτλος [[:$1]] δεν υπάρχει.",
+       "htmlform-title-badnamespace": "[[:$1]] δεν είναι στο \"{{ns:$2}}\" ονοματοχώρο.",
+       "htmlform-title-not-exists": "Το $1 δεν υπάρχει.",
        "htmlform-user-not-exists": "Δεν υπάρχει χρήστης με όνομα <strong>$1</strong>.",
        "htmlform-user-not-valid": "Το <strong>$1</strong> δεν είναι έγκυρο όνομα χρήστη.",
        "sqlite-has-fts": "$1 με υποστήριξη αναζήτησης πλήρους κειμένου",
        "logentry-managetags-delete": "{{GENDER:$2|Ο|Η}} $1 διέγραψε την ετικέτα «$4» (αφαιρέθηκε από $5 {{PLURAL:$5|αναθεώρηση ή καταχώρηση αρχείου καταγραφής|αναθεωρήσεις και/ή καταχωρήσεις του αρχείου καταγραφής}})",
        "logentry-managetags-deactivate": "{{GENDER:$2|Ο|Η}} $1 απενεργοποίησε την ετικέτα «$4» για χρήση από χρήστες και bots",
        "log-name-tag": "Αρχείο καταγραφών ετικετών",
+       "log-description-tag": "Αυτή η σελίδα εμφανίζεται όταν οι χρήστες έχουν προσθέσει ή αφαιρέσει  [[Special:Tags|ετικέτες]] από επιμέρους αναθεωρήσεις ή καταχωρήσεις του αρχείου καταγραφής. Το αρχείο καταγραφής δεν δημιουργεί κατάλογο ενεργειών ετικετών  όταν αυτές συμβαίνουν ως μέρος κάποιας επεξεργασίας, διαγραφής, ή παρόμοιας ενέργειας.",
        "logentry-tag-update-add-revision": "{{GENDER:$2|Ο|Η}} $1 πρόσθεσε {{PLURAL:$7|την ετικέτα|τις ετικέτες}} $6 στην αναθεώρηση $4 της σελίδας $3",
        "logentry-tag-update-remove-revision": "{{GENDER:$2|Ο|Η}} $1 αφαίρεσε {{PLURAL:$9|την ετικέτα|τις ετικέτες}} $8 από την αναθεώρηση $4 της σελίδας $3",
+       "logentry-tag-update-remove-logentry": "{{GENDER:$2|Ο|Η}} $1 αφαίρεσε {{PLURAL:$9|την ετικέτα|τις ετικέτες}} $8 από το αρχείο καταγραφής $5 της σελίδας $3",
        "logentry-tag-update-revision": "{{GENDER:$2|Ο|Η}} $1 ενημέρωσε ετικέτες στην αναθεώρηση $4 της σελίδας $3 (πρόσθεσε {{PLURAL:$7|την|τις}} $6• αφαίρεσε {{PLURAL:$9|την|τις}} $8)",
        "rightsnone": "(κανένα)",
        "revdelete-summary": "επεξεργασία σύνοψης",
        "searchsuggest-containing": "περιέχει...",
        "api-error-badaccess-groups": "Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.",
        "api-error-badtoken": "Εσωτερικό σφάλμα: εσφαλμένο διακριτικό.",
-       "api-error-copyuploaddisabled": "Î\97 ÎµÏ\80ιÏ\86Ï\8cÏ\81Ï\84Ï\89Ï\83η Î±Ï\80Ï\8c URL ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένη σε αυτόν το διακομιστή.",
+       "api-error-copyuploaddisabled": "Το Î±Î½Î­Î²Î±Ï\83μα Î±Ï\80Ï\8c URL ÎµÎ¯Î½Î±Î¹ Î±Ï\80ενεÏ\81γοÏ\80οιημένο σε αυτόν το διακομιστή.",
        "api-error-duplicate": "Υπάρχει το{{PLURAL:$1|είναι ένα άλλο αρχείο|είναι κάποια άλλα αρχεία}} ήδη στο site με το ίδιο περιεχόμενο.",
        "api-error-duplicate-archive": "{{PLURAL:$1|Υπήρχε ήδη άλλο αρχείο|Υπήρχαν ήδη άλλα αρχεία}} στον ιστότοπο με το ίδιο περιεχόμενο, αλλά {{PLURAL:$1|διαγράφηκε|διαγράφηκαν}}.",
        "api-error-empty-file": "Το αρχείο που υποβάλλατε ήταν κενό.",
        "api-error-stashfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-publishfailed": "Εσωτερικό σφάλμα: ο διακομιστής απέτυχε να αποθηκεύσει το προσωρινό αρχείο.",
        "api-error-stasherror": "Παρουσιάστηκε ένα σφάλμα κατά το ανέβασμα του αρχείου στην κρύπτη.",
+       "api-error-stashfilestorage": "Παρουσιάστηκε ένα σφάλμα κατά την αποθήκευση του αρχείου στην κρύπτη.",
        "api-error-stashzerolength": "Ο διακομιστής δεν θα μπορούσε να κρύψει το αρχείο, επειδή είχε μηδενικό μήκος.",
        "api-error-timeout": "Ο διακομιστής δεν αποκρίθηκε εντός του αναμενόμενου χρόνου.",
        "api-error-unclassified": "Προέκυψε ένα άγνωστο σφάλμα.",
        "expand_templates_generate_xml": "Εμφάνιση δέντρου συντακτικής ανάλυσης XML",
        "expand_templates_generate_rawhtml": "Εμφάνιση ανεπεξέργαστης HTML",
        "expand_templates_preview": "Προεπισκόπηση",
+       "expand_templates_preview_fail_html": "<em>Επειδή το {{SITENAME}} έχει ενεργοποιημένη ακατέργαστη HTML  και υπάρχει μια απώλεια της συνόδου δεδομένων, η προεπισκόπηση είναι κρυμμένη ως ένα προληπτικό μέτρο κατά επιθέσεων JavaScript.</em>\n\n<strong>Αν αυτή είναι μια δικαιολογημένη προσπάθεια προεπισκόπησης, παρακαλούμε δοκιμάστε ξανά.</strong>\nΑν εξακολουθεί να μην λειτουργεί, δοκιμάστε να [[Special:UserLogout|αποσυνδεθείτε]] και να συνδεθείτε πάλι.",
        "pagelanguage": "Επιλογέας γλώσσας σελίδας",
        "pagelang-name": "Σελίδα",
        "pagelang-language": "Γλώσσα",
index 3e545d2..34e67f8 100644 (file)
@@ -35,6 +35,7 @@
        "tog-watchlisthidebots": "Hide bot edits from the watchlist",
        "tog-watchlisthideminor": "Hide minor edits from the watchlist",
        "tog-watchlisthideliu": "Hide edits by logged in users from the watchlist",
+       "tog-watchlistreloadautomatically": "Reload the watchlist automatically whenever a filter is changed (JavaScript required)",
        "tog-watchlisthideanons": "Hide edits by anonymous users from the watchlist",
        "tog-watchlisthidepatrolled": "Hide patrolled edits from the watchlist",
        "tog-watchlisthidecategorization": "Hide categorization of pages",
        "morenotlisted": "This list is not complete.",
        "mypage": "Page",
        "mytalk": "Talk",
-       "anontalk": "Talk for this IP address",
+       "anontalk": "Talk",
        "navigation": "Navigation",
        "and": "&#32;and",
        "qbfind": "Find",
        "databaseerror-query": "Query: $1",
        "databaseerror-function": "Function: $1",
        "databaseerror-error": "Error: $1",
+       "transaction-duration-limit-exceeded": "In order to avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 second limit.\nIf you are changing many items at once, trying doing multiple smaller operations instead.",
        "laggedslavemode": "<strong>Warning:</strong> 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",
        "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",
+       "nonwrite-api-promise-error" : "The 'Promise-Non-Write-API-Action' HTTP header was sent but the request was to an API write module.",
        "internalerror": "Internal error",
        "internalerror_info": "Internal error: $1",
        "internalerror-fatal-exception": "Fatal exception of type \"$1\"",
        "createaccountreason": "Reason:",
        "createacct-reason": "Reason",
        "createacct-reason-ph": "Why you are creating another account",
-       "createacct-captcha": "Security check",
        "createacct-imgcaptcha-help": "",
-       "createacct-imgcaptcha-ph": "Enter the text you see above",
        "createacct-submit": "Create your account",
        "createacct-another-submit": "Create account",
        "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
        "wrongpasswordempty": "Password entered was blank.\nPlease try again.",
        "passwordtooshort": "Passwords must be at least {{PLURAL:$1|1 character|$1 characters}}.",
        "passwordtoolong": "Passwords cannot be longer than {{PLURAL:$1|1 character|$1 characters}}.",
+       "passwordtoopopular": "Commonly chosen passwords cannot be used. Please choose a more unique password.",
        "password-name-match": "Your password must be different from your username.",
        "password-login-forbidden": "The use of this username and password has been forbidden.",
        "mailmypassword": "Reset password",
        "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailtext-user": "User $1 on {{SITENAME}} requested a reset of your password for {{SITENAME}}\n($4). The following user {{PLURAL:$3|account is|accounts are}} associated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailelement": "Username:\n$1\n\nTemporary password:\n$2",
-       "passwordreset-emailsent": "If this is a registered email address for your account, then a password reset email will be sent.",
+       "passwordreset-emailsentemail": "If this is a registered email address for your account, then a password reset email will be sent.",
+       "passwordreset-emailsentusername": "If there is a corresponding registered email address, then a password reset email will be sent.",
        "passwordreset-emailsent-capture": "A password reset email has been sent, which is shown below.",
        "passwordreset-emailerror-capture": "A password reset email was generated, which is shown below, but sending it to the {{GENDER:$2|user}} failed: $1",
        "changeemail": "Change or remove email address",
        "permissionserrors": "Permission error",
        "permissionserrorstext": "You do not have permission to do that, for the following {{PLURAL:$1|reason|reasons}}:",
        "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
-       "contentmodelediterror": "You cannot edit this revision because its content model is <code>$1</code>, and the current content model of the page is <code>$2</code>.",
+       "contentmodelediterror": "You cannot edit this revision because its content model is <code>$1</code>, which differs from the current content model of the page <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Warning: You are recreating a page that was previously deleted.</strong>\n\nYou should consider whether it is appropriate to continue editing this page.\nThe deletion and move log for this page are provided here for convenience:",
        "moveddeleted-notice": "This page has been deleted.\nThe deletion and move log for the page are provided below for reference.",
        "moveddeleted-notice-recent": "Sorry, this page was recently deleted (within the last 24 hours).\nThe deletion and move log for the page are provided below for reference.",
        "showingresultsinrange": "Showing below up to {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> results}} in range #<strong>$2</strong> to #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|Results <strong>$1 - $2</strong> of <strong>$3</strong>}}",
        "search-nonefound": "There were no results matching the query.",
+       "search-nonefound-thiswiki": "There were no results matching the query in this site.",
        "powersearch-legend": "Advanced search",
        "powersearch-ns": "Search in namespaces:",
        "powersearch-togglelabel": "Check:",
        "prefs-help-prefershttps": "This preference will take effect on your next login.",
        "prefswarning-warning": "You've made changes to your preferences that have not been saved yet.\nIf you leave this page without clicking \"$1\" your preferences will not be updated.",
        "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
-       "email-address-validity-valid": "Email address appears valid",
-       "email-address-validity-invalid": "Enter a valid email address",
        "userrights": "User rights management",
        "userrights-summary": "",
        "userrights-lookup-user": "Manage user groups",
        "recentchanges-legend-bot": "{{int:recentchanges-label-bot}}",
        "recentchanges-legend-unpatrolled": "{{int:recentchanges-label-unpatrolled}}",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "recentchanges-submit": "Show",
        "rcnotefrom": "Below {{PLURAL:$5|is the change|are the changes}} since <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "Show new changes starting from $2, $3",
        "rcshowhideminor": "$1 minor edits",
        "foreign-structured-upload-form-label-own-work-message-shared": "I attest that I own the copyright on this file, and agree to irrevocably release this file to Wikimedia Commons under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] license, and I agree to the [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "If you do not own the copyright on this file, or you wish to release it under a different license, consider using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "You may also want to try using [[Special:Upload|the upload page on {{SITENAME}}]], if the site allows the upload of this file under their policies.",
+       "foreign-structured-upload-form-2-label-intro": "Thank you for donating an image to be used on {{SITENAME}}. You should only continue if it meets several conditions:",
+       "foreign-structured-upload-form-2-label-ownwork": "It must be entirely <strong>your own creation</strong>, not just taken from the Internet",
+       "foreign-structured-upload-form-2-label-noderiv": "It has to contain <strong>no work by anyone else</strong>, or inspired by them",
+       "foreign-structured-upload-form-2-label-useful": "It should be <strong>educational and useful</strong> for teaching others",
+       "foreign-structured-upload-form-2-label-ccbysa": "It must be <strong>OK to publish forever</strong> on the Internet under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] license",
+       "foreign-structured-upload-form-2-label-alternative": "If not all of the above are true, you may still be able to upload this file using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], as long as it's available under a free license.",
+       "foreign-structured-upload-form-2-label-termsofuse": "By uploading the file, you attest that you own the copyright on this file, and agree to irrevocably release this file to Wikimedia Commons under the Creative Commons Attribution-ShareAlike 4.0 license, and you agree to the [https://wikimediafoundation.org/wiki/Terms_of_Use Terms of Use].",
+       "foreign-structured-upload-form-3-label-question-website": "Did you download this image from a website, or get it from an image search?",
+       "foreign-structured-upload-form-3-label-question-ownwork": "Did you create this image (take the photo, sketch the drawing, etc.) yourself?",
+       "foreign-structured-upload-form-3-label-question-noderiv": "Does it contain, or is it inspired by, work owned by anyone else, like a logo?",
+       "foreign-structured-upload-form-3-label-yes": "Yes",
+       "foreign-structured-upload-form-3-label-no": "No",
+       "foreign-structured-upload-form-3-label-alternative": "Unfortunately, in this case, this tool does not support uploading this file. You may still be able to upload it using the [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard], as long as it's available under a free license.",
+       "foreign-structured-upload-form-4-label-good": "Using this tool, you can upload educational graphics you've created and photographs you've taken, that don't contain work owned by someone else.",
+       "foreign-structured-upload-form-4-label-bad": "You can not upload images found on a search engine or downloaded from other websites.",
        "backend-fail-stream": "Could not stream file \"$1\".",
        "backend-fail-backup": "Could not backup file \"$1\".",
        "backend-fail-notexists": "The file $1 does not exist.",
        "prefixindex": "All pages with prefix",
        "prefixindex-namespace": "All pages with prefix ($1 namespace)",
        "prefixindex-summary": "",
+       "prefixindex-submit": "Show",
        "prefixindex-strip": "Strip prefix in list",
        "shortpages": "Short pages",
        "shortpages-summary": "",
        "protectedpages-performer": "Protecting user",
        "protectedpages-params": "Protection parameters",
        "protectedpages-reason": "Reason",
+       "protectedpages-submit": "Display pages",
        "protectedpages-unknown-timestamp": "Unknown",
        "protectedpages-unknown-performer": "Unknown user",
        "protectedpages-unknown-reason": "—",
        "protectedtitles": "Protected titles",
        "protectedtitles-summary": "This page lists titles that are currently protected from creation. For a list of existing pages that are protected, see [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "No titles are currently protected with these parameters.",
+       "protectedtitles-submit": "Display titles",
        "listusers": "User list",
        "listusers-summary": "",
        "listusers-editsonly": "Show only users with edits",
        "usercreated": "{{GENDER:$3|Created}} on $1 at $2",
        "newpages": "New pages",
        "newpages-summary": "",
+       "newpages-submit": "Show",
        "newpages-username": "Username:",
        "ancientpages": "Oldest pages",
        "ancientpages-summary": "",
        "specialloguserlabel": "Performer:",
        "speciallogtitlelabel": "Target (title or {{ns:user}}:username for user):",
        "log": "Logs",
+       "logeventslist-submit": "Show",
        "all-logs-page": "All public logs",
        "alllogstext": "Combined display of all available logs of {{SITENAME}}.\nYou 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.",
        "cachedspecial-refresh-now": "View latest.",
        "categories": "Categories",
        "categories-summary": "",
+       "categories-submit": "Show",
        "categoriespagetext": "The following {{PLURAL:$1|category contains|categories contain}} pages or media.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
        "categoriesfrom": "Display categories starting at:",
        "special-categories-sort-count": "sort by count",
        "activeusers-hidebots": "Hide bots",
        "activeusers-hidesysops": "Hide administrators",
        "activeusers-noresult": "No users found.",
+       "activeusers-submit": "Display active users",
        "listgrouprights": "User group rights",
        "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
        "listgrouprights-key": "Legend:\n* <span class=\"listgrouprights-granted\">Granted right</span>\n* <span class=\"listgrouprights-revoked\">Revoked right</span>",
        "wlheader-showupdated": "Pages that have been changed since you last visited them are shown in <strong>bold</strong>.",
        "wlnote": "Below {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} in the last {{PLURAL:$2|hour|<strong>$2</strong> hours}}, as of $3, $4.",
        "wlshowlast": "Show last $1 hours $2 days",
+       "watchlistall2": "all",
+       "watchlist-hide": "Hide",
+       "watchlist-submit": "Show",
+       "wlshowtime": "Period of time to display:",
+       "wlshowhideminor": "minor edits",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "registered users",
+       "wlshowhideanons": "anonymous users",
+       "wlshowhidepatr": "patrolled edits",
+       "wlshowhidemine": "my edits",
        "watchlist-options": "Watchlist options",
        "watching": "Watching...",
        "unwatching": "Unwatching...",
        "delete-confirm": "Delete \"$1\"",
        "delete-legend": "Delete",
        "historywarning": "<strong>Warning:</strong> The page you are about to delete has a history with $1 {{PLURAL:$1|revision|revisions}}:",
+       "historyaction-submit": "Show",
        "confirmdeletetext": "You are about to delete a page along with all of its history.\nPlease confirm that you intend to do this, that you understand the consequences, and that you are doing this in accordance with [[{{MediaWiki:Policy-url}}|the policy]].",
        "actioncomplete": "Action complete",
        "actionfailed": "Action failed",
        "contributions-summary": "",
        "contributions-title": "User contributions for $1",
        "mycontris": "Contributions",
+       "anoncontribs": "Contributions",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
        "nocontribs": "No changes were found matching these criteria.",
        "whatlinkshere-hidelinks": "$1 links",
        "whatlinkshere-hideimages": "$1 file links",
        "whatlinkshere-filters": "Filters",
+       "whatlinkshere-submit": "Go",
        "autoblockid": "Autoblock #$1",
        "block": "Block user",
        "unblock": "Unblock user",
        "move-redirect-text": "",
        "category-move-redirect-override": "-",
        "revertmove": "revert",
-       "delete_and_move": "Delete and move",
        "delete_and_move_text": "== Deletion required ==\nThe destination page \"[[:$1]]\" already exists.\nDo you want to delete it to make way for the move?",
        "delete_and_move_confirm": "Yes, delete the page",
        "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
        "accesskey-pt-preferences": "",
        "accesskey-pt-watchlist": "l",
        "accesskey-pt-mycontris": "y",
+       "accesskey-pt-anoncontribs": "y",
        "accesskey-pt-login": "o",
        "accesskey-pt-logout": "",
        "accesskey-pt-createaccount": "",
        "tooltip-pt-preferences": "Your preferences",
        "tooltip-pt-watchlist": "A list of pages you are monitoring for changes",
        "tooltip-pt-mycontris": "A list of your contributions",
+       "tooltip-pt-anoncontribs": "A list of edits made from this IP address",
        "tooltip-pt-login": "You are encouraged to log in; however, it is not mandatory",
        "tooltip-pt-logout": "Log out",
        "tooltip-pt-createaccount": "You are encouraged to create an account and log in; however, it is not mandatory",
        "spam_blanking": "All revisions contained links to $1, blanking",
        "spam_deleting": "All revisions contained links to $1, deleting",
        "simpleantispam-label": "Anti-spam check.\nDo <strong>not</strong> fill this in!",
-       "autochange-username": "MediaWiki automatic change",
        "pageinfo-header": "-",
        "pageinfo-title": "Information for \"$1\"",
        "pageinfo-not-current": "Sorry, it's impossible to provide this information for old revisions.",
        "exif-compression-34712": "JPEG2000",
        "exif-copyrighted-true": "Copyrighted",
        "exif-copyrighted-false": "Copyright status not set",
+       "exif-photometricinterpretation-0": "Black and white (White is 0)",
+       "exif-photometricinterpretation-1": "Black and white (Black is 0)",
        "exif-photometricinterpretation-2": "RGB",
+       "exif-photometricinterpretation-3": "Palette",
+       "exif-photometricinterpretation-4": "Transparency mask",
+       "exif-photometricinterpretation-5": "Separated (Probably CMYK)",
        "exif-photometricinterpretation-6": "YCbCr",
+       "exif-photometricinterpretation-8": "CIE L*a*b*",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (ICC encoding)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (ITU encoding)",
+       "exif-photometricinterpretation-32803": "Color Filter Array",
+       "exif-photometricinterpretation-34892": "Linear raw",
        "exif-unknowndate": "Unknown date",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Flipped horizontally",
        "htmlform-cloner-required": "At least one value is required.",
        "htmlform-title-badnamespace": "[[:$1]] is not in the \"{{ns:$2}}\" namespace.",
        "htmlform-title-not-creatable": "\"$1\" is not a creatable page title",
-       "htmlform-title-not-exists": "[[:$1]] does not exist.",
+       "htmlform-title-not-exists": "$1 does not exist.",
        "htmlform-user-not-exists": "<strong>$1</strong> does not exist.",
        "htmlform-user-not-valid": "<strong>$1</strong> isn't a valid username.",
        "rawmessage": "$1",
        "logentry-suppress-block": "$1 {{GENDER:$2|blocked}} {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|changed}} block settings for {{GENDER:$4|$3}} with an expiry time of $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|imported}} $3 by file upload",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|imported}} $3 by file upload ($4 {{PLURAL:$4|revision|revisions}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|imported}} $3 from another wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|imported}} $3 from $5 ($4 {{PLURAL:$4|revision|revisions}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|merged}} $3 into $4 (revisions up to $5)",
        "logentry-move-move": "$1 {{GENDER:$2|moved}} page $3 to $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|moved}} page $3 to $4 without leaving a redirect",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
        "api-error-blacklisted": "Please choose a different, descriptive title."
 }
+
+
index d5d538f..0a1ba36 100644 (file)
@@ -42,7 +42,9 @@
                        "Sudastelaro",
                        "Ochilov",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Xð",
+                       "Robin van der Vliet"
                ]
        },
        "tog-underline": "Substreki ligilojn",
        "morenotlisted": "Ĉi tiu listo ne estas kompleta.",
        "mypage": "Paĝo",
        "mytalk": "Diskuto",
-       "anontalk": "Diskutpaĝo por tiu ĉi IP-adreso",
+       "anontalk": "Diskuto",
        "navigation": "Navigado",
        "and": "&#32;kaj",
        "qbfind": "Trovi",
        "viewhelppage": "Vidi helpopaĝon",
        "categorypage": "Vidi kategorian paĝon",
        "viewtalkpage": "Vidi diskuton",
-       "otherlanguages": "Aliaj lingvoj",
+       "otherlanguages": "En aliaj lingvoj",
        "redirectedfrom": "(Alidirektita el $1)",
        "redirectpagesub": "Alidirektilo",
        "redirectto": "Alidirektas al:",
        "viewsource": "Rigardi vikitekston",
        "viewsource-title": "Vidi fonton por $1",
        "actionthrottled": "Agado limigita",
-       "actionthrottledtext": "Por kontraŭigi spamon, vi estas limigita farante ĉi tiun agon tro pluroble en mallonga tempdaŭro, kaj vi transpasis ĉi tiun limon. Bonvolu refaru post kelkaj minutoj.",
+       "actionthrottledtext": "Por kontraŭi misuzon, vi estas limigita farante ĉi tiun agon tro pluroble en mallonga tempdaŭro, kaj vi transpasis ĉi tiun limon. Bonvolu refaru post kelkaj minutoj.",
        "protectedpagetext": "Tiu ĉi paĝo estas ŝlosita por malebligi redaktadon.",
-       "viewsourcetext": "Vi povas rigardi kaj kopii la fonton de la paĝo:",
-       "viewyourtext": "Vi povas vidi kaj kopii la fonton de '''viaj redaktoj''' al ĉi tiu paĝo:",
+       "viewsourcetext": "Vi povas rigardi kaj kopii la fonton de la paĝo.",
+       "viewyourtext": "Vi povas vidi kaj kopii la fonton de <strong>viaj redaktoj</strong> al ĉi tiu paĝo.",
        "protectedinterface": "Ĉi tiu paĝo provizas interfacan tekston por la programaro, kaj estas ŝlosita por malebligi misuzon.\nPor aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
        "editinginterface": "<strong>Atentu:</strong> Vi redaktas paĝon, kiu provizas interfacan tekston por la programaro.\nŜanĝoj de ĉi tiu teksto ŝanĝos aspekton de la interfaco por aliaj uzantoj de ĉi tiu vikio.\nPor aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekton por provizi tradukojn por MediaWiki.",
        "translateinterface": "Por ŝanĝi tradukaĵojn por ĉiuj vikioj bonvolu uzi [//translatewiki.net/ translatewiki.net], la komunan tradukan projekton de MediaWiki.",
-       "cascadeprotected": "Ĉi tiu paĝo estas protektita kontraŭ redaktado, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan paĝon, kiu|sekvajn paĝojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la \"kaskada\" opcio ŝaltita sur:\n$2",
+       "cascadeprotected": "Ĉi tiu paĝo estas protektita kontraŭ redaktado, ĉar ĝi estas enplektita en la {{PLURAL:$1|sekvan paĝon, kiu|sekvajn paĝojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la \"kaskada\" opcio ŝaltita sur:\n$2",
        "namespaceprotected": "Vi ne rajtas redakti paĝojn en la '''$1''' nomspaco.",
        "customcssprotected": "Vi ne rajtas redakti ĉi tiun CSS-paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.",
        "customjsprotected": "Vi ne rajtas redakti ĉi tiun Ĝavaskriptan paĝon, ĉar ĝi enhavas personajn alĝustigojn de alia uzanto.",
        "createaccountreason": "Kialo:",
        "createacct-reason": "Kialo",
        "createacct-reason-ph": "Kial vi kreas plian konton",
-       "createacct-captcha": "Sekureca kontrolo",
-       "createacct-imgcaptcha-ph": "Entajpu la supran tekston",
        "createacct-submit": "Krei konton",
-       "createacct-another-submit": "Krei alian konton",
+       "createacct-another-submit": "Krei konton",
        "createacct-benefit-heading": "{{SITENAME}} estas kreata de homoj kiel vi.",
        "createacct-benefit-body1": "{{PLURAL:$1|redakto|redaktoj}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paĝo|paĝoj}}",
        "createacct-benefit-body3": "{{PLURAL:$1|lasta kontribuanto|lastaj kontribuantoj}}",
        "badretype": "La pasvortoj, kiujn vi tajpis, ne egalas.",
+       "usernameinprogress": "Kontokreado por ĉi tiu uzantnomo jam estas prilaborata. Bonvolu atendi.",
        "userexists": "Salutnomo enigita jam estas uzata.\nBonvolu elekti alian nomon.",
        "loginerror": "Ensaluta eraro",
        "createacct-error": "Eraro pri kreado de konto",
        "passwordreset-emailtext-ip": "Iu (verŝajne vi, de IP-adreso $1) petis restarigon de via pasvorto por {{SITENAME}} ($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:\n\n$2\n\nĈi {{PLURAL:$3|tiu provizora pasvorto|tiuj provizoraj pasvortoj}} findatiĝos {{PLURAL:$5|unu tagon|$5 tagojn}}.\nVi ensalutu kaj elektu novan pasvorton nun. Se iu alia petis ĉi tion,\naŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas\nŝanĝi ĝin, vi povas ignori ĉi tiun mesaĝon kaj plu uzi vian \nmalnovan pasvorton.",
        "passwordreset-emailtext-user": "Uzanto $1 de {{SITENAME}} petis restarigo de via pasvorto por {{SITENAME}}\n($4). La {{PLURAL:$3|jena uzanto-konto estas asociita|jenaj uzanto-kontoj estas asociitaj}} kun ĉi tiu retpoŝtadreso:\n\n$2\n\nĈi {{PLURAL:$3|tiu provizora pasvorto|tiuj provizoraj pasvortoj}} findatiĝos {{PLURAL:$5|unu tagon|$5 tagojn}}.\nVi devas ensaluti kaj elekti novan pasvorton nun. Se iu alia petis ĉi tion,\naŭ se vi memoris vian originalan pasvorton, kaj vi ne plu volas ŝanĝi\nĝin, vi povas ignori ĉi tiun mesaĝon kaj uzi vian malnovan pasvorton.",
        "passwordreset-emailelement": "Salutnomo: \n$1\n\nProvizora pasvorto: \n$2",
-       "passwordreset-emailsent": "Renovigita pasvorto estis retpoŝte sendita.",
+       "passwordreset-emailsentemail": "Se tio estas registrita retpoŝta adreso por via konto, tiam retpoŝto por renovigita pasvorto estos sendata al ĉi tiu adreso.",
        "passwordreset-emailsent-capture": "Retpoŝto kun renovigita pasvorto estis sendita, kiu estas montrata malsupre.",
        "passwordreset-emailerror-capture": "Retpoŝto kun renovigita pasvorto estis generita, montrata sube, sed sendado al la {{GENDER:$2|uzanto}} malsukcesis: $1",
-       "changeemail": "Ŝanĝi retpoŝtadreson",
-       "changeemail-header": "Ŝanĝi retpoŝtadreso por konto",
+       "changeemail": "Ŝanĝi aŭ forigi retpoŝtadreson",
+       "changeemail-header": "Plenigu ĉi tiun formularon por ŝanĝi vian retpoŝtadreson. Se vi volas forigi la difinon de retpoŝtadreso por via uzantokonto, lasu la kampon por la nova retpoŝtadreso malplena ĉe la transigo.",
+       "changeemail-passwordrequired": "Vi devas entajpi vian pasvorton, por konfirmi ĉi tiun ŝanĝon.",
        "changeemail-no-info": "Vi devas ensaluti por atingi ĉi tiun paĝon rekte.",
        "changeemail-oldemail": "Aktuala retpoŝtadreso:",
        "changeemail-newemail": "Nova retpoŝtadreso:",
+       "changeemail-newemail-help": "Ĉi tiu kampo estu lasata malplena, se vi volas forigi vian retpoŝtan adreson. Vi ne povos renovigi forgesitan pasvorton kaj ne ricevos retpoŝtaĵojn de ĉi tiu vikio, se la retpoŝtadreso estas forigata.",
        "changeemail-none": "(nenio)",
        "changeemail-password": "Via pasvorto por {{SITENAME}}:",
        "changeemail-submit": "Ŝanĝi retpoŝtadreson",
        "changeemail-throttled": "Vi tro ofte provis alsaluti.\nBonvolu atendi $1, antaŭ ol vi provos denove.",
+       "changeemail-nochange": "Bonvolu tajpi alian novan retpoŝtadreson.",
        "resettokens": "Renovigi ŝlosilojn",
        "resettokens-text": "Vi povas rekomencigi ĵetonojn, kiuj ebligas aliron al certaj privataj datumoj, kiuj estas ligataj kun via konto de uzanto ĉi tie.\n\nVi faru tion, se vi akcidente kunhavigis ilin kun iu aŭ se via konto estis malkonfidencigita.",
        "resettokens-no-tokens": "Ne estas ŝlosiloj renovigeblaj.",
        "sig_tip": "Via subskribo kun tempindiko",
        "hr_tip": "Horizontala linio (uzu ŝpareme)",
        "summary": "Resumo:",
-       "subject": "Temo/subtitolo:",
+       "subject": "Temo:",
        "minoredit": "Ĉi tiu ŝanĝo estas redakteto",
        "watchthis": "Atenti ĉi tiun paĝon",
        "savearticle": "Konservi ŝanĝojn",
        "missingsummary": "'''Rememorigilo:''' Vi ne provizis redaktan resumon. Se vi alklakos denove la konservan butonon, via redaktaĵo estos konservita sen resumo.",
        "selfredirect": "<strong>Atentigo:</strong> Ve alidirektas tiun ĉi paĝon al ĝi mem. Vi eble volas difini alian celan paĝon aŭ vi volas redakti alian paĝon.\nSe vi denove klakos al \"{{int:savearticle}}\", la alidirektilo estos ĉiuokaze kreita.",
        "missingcommenttext": "Bonvolu entajpi komenton malsupre.",
-       "missingcommentheader": "'''Atenton:''' Vi ne provizis temon aŭ subtitolon por ĉi tiu komento.\nSe vi klakos \"Konservi\" denove, via redakto estos konservita sen ĝi.",
+       "missingcommentheader": "<strong>Atenton:</strong> Vi ne provizis temon aŭ subtitolon por ĉi tiu komento.\nSe vi klakos \"Konservi\" denove, via redakto estos konservita sen ĝi.",
        "summary-preview": "Resuma antaŭrigardo:",
        "subject-preview": "Antaŭrigardo de Temo/Subitolo:",
        "previewerrortext": "Dum provo antaŭrigardi viajn ŝanĝojn okazis eraro.",
        "yourdiff": "Malsamoj",
        "copyrightwarning": "Bonvolu noti, ke ĉiu kontribuaĵo al la {{SITENAME}} estu rigardata kiel eldonita laŭ $2 (vidu je $1). Se vi volas, ke via verkaĵo ne estu redaktota senkompate kaj disvastigota laŭvole, ne alklaku \"Konservi\".<br />\nVi ankaŭ ĵuras, ke vi mem verkis la tekston, aŭ ke vi kopiis ĝin el fonto senkopirajta.\n'''NE UZU AŬTORRAJTE PROTEKTATAJN VERKOJN SENPERMESE!'''",
        "copyrightwarning2": "Bonvolu noti ke ĉiuj kontribuoj al {{SITENAME}} povas esti reredaktitaj, ŝanĝitaj aŭ forigitaj de aliaj kontribuantoj. Se vi ne deziras, ke viaj verkoj estu senkompate reredaktitaj, ne publikigu ilin ĉi tie.<br />\nVi ankaŭ promesu al ni ke vi verkis tion mem aŭ kopiis el publika domajno aŭ simila libera fonto (vidu $1 por detaloj).\n'''NE PROPONU KOPIRAJTITAJN VERKOJN SEN PERMESO!'''",
+       "editpage-cannot-use-custom-model": "La enhavomodelo de ĉi tiu paĝo ne povas esti ŝanĝata.",
        "longpageerror": "'''Eraro: La teksto, kiun vi prezentis, longas {{PLURAL:$1|$1 kilobajton|$1 kilobajtojn}}, kio estas pli longa ol la maksimumo de {{PLURAL:$2|$2 kilobajto|$2 kilobajtoj}}.'''\nĜi ne povas esti konservita.",
        "readonlywarning": "'''AVERTO: La datumbazo estas ŝlosita por teknika laboro, do vi ne povas konservi viajn redaktojn ĉi-momente.\nVi eble volus elkopii kaj englui la tekston al tekstdosiero por konservi ĝin por posta uzo.'''\n\nLa administranto kiu ŝlosis ĝin donis ĉi tiun eksplikaĵon: $1",
        "protectedpagewarning": "'''Averto: Ĉi tiu paĝo estas ŝlosita kontraŭ redaktado krom de administrantoj.'''\nJen la lasta protokolero provizita por via referenco:",
        "semiprotectedpagewarning": "'''Notu:''' Ĉi tiu paĝo estas ŝlosita tiel ke nur ensalutintaj uzantoj povas redakti ĝin.\nJen la lasta protokolero por via referenco:",
-       "cascadeprotectedwarning": "'''Averto:''' Ĉi tiu paĝo estas ŝlosita tiel ke nur uzantoj kun administrantaj privilegioj povas redakti ĝin, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan kaskade protektitan paĝon|sekvajn kaskade protektitajn paĝojn}}:",
+       "cascadeprotectedwarning": "<strong>Averto:</strong> Ĉi tiu paĝo estas ŝlosita, tiel ke nur uzantoj kun administrantaj privilegioj povas redakti ĝin, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan kaskade protektitan paĝon|sekvajn kaskade protektitajn paĝojn}}:",
        "titleprotectedwarning": "'''Averto: Ĉi tiu paĝo estis ŝlosita tial nur [[Special:ListGroupRights|specifaj rajtoj]] estas bezonaj por krei ĝin.'''\nJen la lasta protokolero por via referenco:",
        "templatesused": "{{PLURAL:$1|Ŝablono uzata|Ŝablonoj uzataj}} en ĉi tiu paĝo:",
        "templatesusedpreview": "{{PLURAL:$1|Ŝablono uzata|Ŝablonoj uzataj}} en ĉi tiu antaŭrigardo:",
        "permissionserrors": "Eraro pri permeso",
        "permissionserrorstext": "Vi ne rajtas fari tion pro la {{PLURAL:$1|sekva kialo|sekvaj kialoj}}:",
        "permissionserrorstext-withaction": "Vi ne rajtas $2, pro la {{PLURAL:$1|jena kialo|jenaj kialoj}}:",
+       "contentmodelediterror": "Vi ne povas prilabori ĉi tiun version, ĉar ĝia enhavomodelo <code>$1</code> kaj la aktuala enhavomodelo de la paĝo estas <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Averto: Vi rekreas paĝon, kiu estis antaŭe forigita.'''\n\nVi konsideru, ĉu konvenas daŭre redakti ĉi tiun paĝon.\nJen la protokolo de forigoj kaj alinomigado por via oportuno:",
        "moveddeleted-notice": "Ĉi tiu paĝo estis forigita.\nPliaj detaloj estas en protokolo pri forigado kaj alinomado de tiu ĉi paĝo.",
        "log-fulllog": "Vidi kompletan protokolon",
        "mergehistory-go": "Montri kunigeblajn redaktojn",
        "mergehistory-submit": "Kunigi versiojn",
        "mergehistory-empty": "Neniuj versioj estas kunigeblaj.",
-       "mergehistory-done": "$3 {{PLURAL:$3|versio|versioj}} de $1 sukcese {{PLURAL:$3|kunigita|kunigitaj}} en [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|versio|versioj}} de $1 sukcese estis {{PLURAL:$3|kunigita|kunigitaj}} en [[:$2]].",
        "mergehistory-fail": "Ne povis fari la historian kunigon; bonvolu konstati la paĝajn kaj tempajn parametrojn.",
        "mergehistory-fail-toobig": "Ne eblas kunigi historiojn ĉar pli ol sojlo de $1 {{PLURAL:$1|revizio|revizioj}} estus {{PLURAL:$1|movita|movitaj}}.",
        "mergehistory-no-source": "Fontpaĝo $1 ne ekzistas.",
        "prefs-watchlist-token": "Atentara ĵetono:",
        "prefs-misc": "Miksitaĵoj",
        "prefs-resetpass": "Ŝanĝi pasvorton",
-       "prefs-changeemail": "Ŝanĝi retpoŝtadreson",
+       "prefs-changeemail": "Ŝanĝi aŭ forigi retpoŝtadreson",
        "prefs-setemail": "Difini retpoŝtadreson",
        "prefs-email": "Retpoŝtaj opcioj",
        "prefs-rendering": "Aspekto",
        "rows": "Linioj:",
        "columns": "Kolumnoj:",
        "searchresultshead": "Serĉi",
-       "stub-threshold": "Ago-sojlo por formatigo de <a href=\"#\" class=\"stub\">ligil-ĝermo (anglalingve: \"stub link\")</a> (bitikoj):",
+       "stub-threshold": "Ligilformatigo de ĝermoj ($1):",
+       "stub-threshold-sample-link": "specimeno",
        "stub-threshold-disabled": "Malebligita",
        "recentchangesdays": "Tagoj montrendaj en lastaj ŝanĝoj:",
        "recentchangesdays-max": "(maksimume $1 {{PLURAL:$1|tago|tagoj}})",
        "badsig": "Via kaŝnomo (por subskriboj) malvalidas. Bv. kontroli la HTML-etikedojn!",
        "badsiglength": "La subskribo estas tro longa.\nĜi devas esti sub $1 {{PLURAL:$1|signo|signoj}}.",
        "yourgender": "Sekso:",
-       "gender-unknown": "Nespecifita",
+       "gender-unknown": "En mencii vin, la programaro uzos vortojn de neŭtra genro, ĉiam ol estu ebla",
        "gender-male": "Vira",
        "gender-female": "Ina",
        "prefs-help-gender": "Nedeviga: uzita por sekseca salutado de la programaro. Ĉi tiu informo montriĝos publike.",
        "prefs-help-prefershttps": "Ĉi tiu agordo ekefikos je via sekva ensaluto.",
        "prefswarning-warning": "Vi faris ŝanĝojn al viaj agordoj, kiuj ankoraŭ ne estas konservitaj.\nSe vi foriros de tiu ĉi paĝo sen klaki al \"$1\", viaj agordoj ne estos ĝisdatigitaj.",
        "prefs-tabs-navigation-hint": "Konsileto: Vi povas uzi la maldekstran kaj dekstran sagajn klavojn por navigi inter la langetoj en la langeta listo.",
-       "email-address-validity-valid": "Ŝajnas ke la retpoŝtadreso estas valida",
-       "email-address-validity-invalid": "Tajpu validan retpoŝtadreson",
        "userrights": "Prizorgi rajtojn de uzantoj",
        "userrights-lookup-user": "Administri grupojn de uzantoj",
        "userrights-user-editname": "Entajpu salutnomon:",
        "recentchanges-label-plusminus": "La paĝa grandeco ŝanĝiĝis je ĉi tiu nombro de bajtoj",
        "recentchanges-legend-heading": "'''Klarigo:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vidu ankaŭ [[Special:NewPages|liston de novaj paĝoj]])",
+       "recentchanges-submit": "Montri",
        "rcnotefrom": "Malsupre estas la {{PLURAL:$5|ŝanĝo|ŝanĝoj}} ekde <strong>$3, $4</strong> (montrante ĝis <strong>$1</strong>).",
        "rclistfrom": "Montri novajn ŝanĝojn ekde \"$3 $2\"",
        "rcshowhideminor": "$1 redaktetojn",
        "rcshowhidemine": "$1 miajn redaktojn",
        "rcshowhidemine-show": "Montri",
        "rcshowhidemine-hide": "Kaŝi",
+       "rcshowhidecategorization-show": "Montri",
+       "rcshowhidecategorization-hide": "Kaŝi",
        "rclinks": "Montri $1 lastajn ŝanĝojn dum la $2 lastaj tagoj.<br />$3",
        "diff": "malsamoj",
        "hist": "historio",
        "newpageletter": "N",
        "boteditletter": "r",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|priatentanta uzanto|priatentantaj uzantoj}}]",
-       "rc_categories": "Nur por jenaj kategorioj (disigu per \"|\")",
-       "rc_categories_any": "ĉiu",
+       "rc_categories": "Nur paĝoj el jenaj kategorioj (disigu per \"|\"):",
+       "rc_categories_any": "Iuj el la elektitaj",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajto|bajtoj}} post ŝanĝo",
        "newsectionsummary": "/* $1 */ nova sekcio",
        "rc-enhanced-expand": "Montri detalojn (per JavaScript)",
        "upload-too-many-redirects": "La URL-o enhavis tro multajn alidirektilojn",
        "upload-http-error": "HTTP-eraro okazis: $1",
        "upload-copy-upload-invalid-domain": "Kopio-alŝutoj ne disponiĝas el ĉi tiu domajno.",
+       "upload-dialog-title": "Alŝuti dosieron",
+       "upload-dialog-button-cancel": "Nuligi",
+       "upload-dialog-button-done": "Farite",
+       "upload-dialog-button-save": "Konservi",
+       "upload-dialog-button-upload": "Alŝuti",
+       "upload-form-label-select-file": "Elekti dosieron",
+       "upload-form-label-infoform-title": "Detaloj",
+       "upload-form-label-infoform-name": "Nomo",
+       "upload-form-label-infoform-description": "Priskribo",
+       "upload-form-label-usage-title": "Uzo",
+       "upload-form-label-usage-filename": "Dosiernomo",
+       "foreign-structured-upload-form-label-own-work": "Tio estas mia propra laboro",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorioj",
+       "foreign-structured-upload-form-label-infoform-date": "Dato",
        "backend-fail-stream": "Ne povis fluigi dosieron $1.",
        "backend-fail-backup": "Ne povis enarkivigi dosieron $1.",
        "backend-fail-notexists": "La dosiero $1 ne ekzistas.",
        "mostrevisions": "Artikoloj kun la plej multaj versioj",
        "prefixindex": "Ĉiuj paĝoj kun prefikso",
        "prefixindex-namespace": "Ĉiuj paĝoj kun prefikso ($1 nomspaco)",
+       "prefixindex-submit": "Montri",
        "prefixindex-strip": "Ne montri prefikson en listo",
        "shortpages": "Mallongaj paĝoj",
        "longpages": "Longaj paĝoj",
        "usereditcount": "$1 {{PLURAL:$1|redakto|redaktoj}}",
        "usercreated": "{{GENDER:$3|Kreita}} je $1, $2",
        "newpages": "Novaj paĝoj",
+       "newpages-submit": "Montri",
        "newpages-username": "Salutnomo:",
        "ancientpages": "Plej malnovaj artikoloj",
        "move": "Alinomi",
        "specialloguserlabel": "Faranto:",
        "speciallogtitlelabel": "Celo (titolo aŭ uzanto):",
        "log": "Protokoloj",
+       "logeventslist-submit": "Montri",
        "all-logs-page": "Ĉiuj publikaj protokoloj",
        "alllogstext": "Suma kompilaĵo de ĉiuj protokoloj de {{SITENAME}}.\nVi povas plistrikti la mendon per selektado de protokola speco, la salutnomo (inkluzivante uskladon) aŭ la efika paĝo (ankaŭ inkluzivas uskladon).",
        "logempty": "Neniaj artikoloj en la protokolo.",
        "cachedspecial-viewing-cached-ts": "Vi vidas version de la paĝo el kaŝmemoro, kiu eble ne estas la plej aktuala.",
        "cachedspecial-refresh-now": "Vidas plej nova.",
        "categories": "Kategorioj",
+       "categories-submit": "Montri",
        "categoriespagetext": "La {{PLURAL:$1|jena kategorio|jenaj kategorioj}} ekzistas jam en la vikio.\n[[Special:UnusedCategories|Neuzataj kategorioj]] ne estis montrataj ĉi tie.\nVidu ankaŭ [[Special:WantedCategories|Dezirataj kategorioj]].",
        "categoriesfrom": "Montri kategoriojn komencante de:",
        "special-categories-sort-count": "oridigi laŭ nombrado",
        "wlheader-showupdated": "Paĝoj montriĝis per '''dikaj literoj''' kiuj estis ŝanĝitaj ekde vi laste vizitis.",
        "wlnote": "Jen la {{PLURAL:$1|lasta redakto|lastaj <strong>$1</strong> redaktoj}} dum la {{PLURAL:$2|lasta horo|lastaj <strong>$2</strong> horoj}}, ekde $3, $4.",
        "wlshowlast": "Montri el lastaj $1 horoj $2 tagoj",
+       "watchlistall2": "ĉiuj",
+       "watchlist-hide": "Kaŝi",
+       "watchlist-submit": "Montri",
+       "wlshowhideminor": "Etaj redaktoj",
+       "wlshowhidebots": "robotoj",
+       "wlshowhideliu": "registritaj uzantoj",
+       "wlshowhideanons": "anonimaj uzantoj",
+       "wlshowhidepatr": "patrolitaj redaktoj",
+       "wlshowhidemine": "miaj redaktoj",
        "watchlist-options": "Opcioj por atentaro",
        "watching": "Aldonata al la atentaro...",
        "unwatching": "Malatentante...",
        "delete-confirm": "Forigi \"$1\"",
        "delete-legend": "Forigi",
        "historywarning": "<strong>Averto:</strong> La forigota paĝo havas historion kun $1 {{PLURAL:$1|revizio|revizioj}}:",
+       "historyaction-submit": "Montri",
        "confirmdeletetext": "Vi forigos la artikolon aŭ dosieron kaj forviŝos ĝian tutan historion el la datumaro.<br /> Bonvolu konfirmi, ke vi vere intencas tion, kaj ke vi komprenas la sekvojn, kaj ke vi ja sekvas la [[{{MediaWiki:Policy-url}}|regulojn pri forigado]].",
        "actioncomplete": "Ago farita",
        "actionfailed": "Ago malsukcesis",
        "contributions": "Kontribuoj de {{GENDER:$1|uzanto|uzantino}}",
        "contributions-title": "Kontribuoj de uzanto $1",
        "mycontris": "Kontribuoj",
+       "anoncontribs": "Kontribuoj",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
        "nocontribs": "Trovis neniajn redaktojn laŭ tiu kriterio.",
        "whatlinkshere-hidelinks": "$1 ligilojn",
        "whatlinkshere-hideimages": "$1 ligiloj al bildo",
        "whatlinkshere-filters": "Filtriloj",
+       "whatlinkshere-submit": "Ek",
        "autoblockid": "Aŭtomata forbaro #$1",
        "block": "Forbari uzanton",
        "unblock": "Malforbari uzanton",
        "cant-move-to-user-page": "Vi ne rajtas movi paĝon al uzantopaĝo (krom al uzantosubpaĝo).",
        "cant-move-category-page": "Vi ne rajtas movi kategoriajn paĝojn.",
        "cant-move-to-category-page": "Vi ne rajtas movi paĝon al kategoria paĝo.",
-       "newtitle": "Al nova titolo",
+       "newtitle": "Nova titolo:",
        "move-watch": "Atenti ĉi tiun paĝon",
        "movepagebtn": "Alinomi paĝon",
        "pagemovedsub": "Sukcesis alinomigo",
        "movenosubpage": "Ĉi tiu paĝo havas neniujn subpaĝojn.",
        "movereason": "Kialo:",
        "revertmove": "restarigi",
-       "delete_and_move": "Forigi kaj alinomi",
        "delete_and_move_text": "==Forigo nepras==\n\nLa celartikolo \"[[:$1]]\" jam ekzistas. Ĉu vi volas forigi ĝin por krei spacon por la movo?",
        "delete_and_move_confirm": "Jes, forigu la paĝon",
        "delete_and_move_reason": "Forigita por ebligi movadon de \"[[$1]]\"",
        "exif-compression-8": "Malŝveli (Adobe)",
        "exif-copyrighted-true": "Sub aŭtorrajto",
        "exif-copyrighted-false": "Sub publika domajno",
+       "exif-photometricinterpretation-1": "Nigra kaj blanka (nigra estas 0)",
        "exif-unknowndate": "Nekonata dato",
        "exif-orientation-1": "Normala",
        "exif-orientation-2": "Spegulumita horizontale",
index c8325b9..641bf98 100644 (file)
                        "JasterTDC",
                        "Laurenslimb",
                        "Tusca",
-                       "Tadol"
+                       "Tadol",
+                       "Nelson6e65",
+                       "Matiia",
+                       "SinNovedades"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-oldsig": "Firma actual:",
        "tog-fancysig": "Tratar la firma como wikitexto (sin un enlace automático)",
        "tog-uselivepreview": "Usar previsualización dinámica",
-       "tog-forceeditsummary": "Avisarme cuando grabe la página sin escribir un resumen de edición",
+       "tog-forceeditsummary": "Avisarme cuando deje en blanco el resumen de la edición",
        "tog-watchlisthideown": "Ocultar mis ediciones de la lista de seguimiento",
        "tog-watchlisthidebots": "Ocultar las ediciones de bots de la lista de seguimiento",
        "tog-watchlisthideminor": "Ocultar las ediciones menores de la lista de seguimiento",
        "tog-watchlisthideliu": "Ocultar las ediciones de los usuarios registrados de la lista de seguimiento",
+       "tog-watchlistreloadautomatically": "Recargar la lista de seguimiento automáticamente cuando se modifica un filtro (requiere JavaScript)",
        "tog-watchlisthideanons": "Ocultar las ediciones de los usuarios anónimos de la lista de seguimiento",
        "tog-watchlisthidepatrolled": "Ocultar las ediciones verificadas de la lista de seguimiento",
        "tog-watchlisthidecategorization": "Ocultar la categorización de páginas",
        "morenotlisted": "Esta lista no está completa.",
        "mypage": "Página",
        "mytalk": "Discusión",
-       "anontalk": "Discusión para esta IP",
+       "anontalk": "Discusión",
        "navigation": "Navegación",
        "and": "&#32;y",
        "qbfind": "Buscar",
        "qbpageoptions": "Opciones de página",
        "qbmyoptions": "Mis páginas",
        "faq": "Preguntas frecuentes",
-       "faqpage": "Project:PP. FF.",
+       "faqpage": "Project:Preguntas frecuentes",
        "actions": "Acciones",
        "namespaces": "Espacios de nombres",
        "variants": "Variantes",
        "virus-scanfailed": "ha fallado el análisis (código $1)",
        "virus-unknownscanner": "antivirus desconocido:",
        "logouttext": "<strong>Tu sesión ha finalizado.</strong>\n\nPuede que algunas páginas continúen mostrándose como si la sesión estuviera iniciada hasta que actualices la caché de tu navegador.",
-       "welcomeuser": "¡Bienvenido, $1!",
+       "welcomeuser": "¡Bienvenido/a, $1!",
        "welcomecreation-msg": "Se ha creado tu cuenta.\nSi lo deseas, puedes cambiar tus [[Special:Preferences|preferencias]] para {{SITENAME}}.",
        "yourname": "Usuario:",
        "userlogin-yourname": "Usuario",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por qué estás creando otra cuenta",
-       "createacct-captcha": "Comprobación de seguridad",
-       "createacct-imgcaptcha-ph": "Escribe el texto de arriba",
        "createacct-submit": "Crea tu cuenta",
        "createacct-another-submit": "Crear cuenta",
        "createacct-benefit-heading": "Personas como tú son las que construyen {{SITENAME}}.",
        "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado el restablecimiento de tu contraseña en {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\na esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailtext-user": "El usuario $1 de {{SITENAME}} solicitó el restablecimiento de tu contraseña en {{SITENAME}}\n($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}} a esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: \n$1\n\nContraseña temporal: \n$2",
-       "passwordreset-emailsent": "Si esta es una dirección de correo electrónico registrada para tu cuenta, entonces se enviará un correo electrónico para el restablecimiento de tu contraseña.",
+       "passwordreset-emailsentemail": "Si esta es una dirección de correo electrónico registrada para tu cuenta, entonces se enviará un correo electrónico para el restablecimiento de tu contraseña.",
        "passwordreset-emailsent-capture": "Se ha enviado un correo para el restablecimiento de la contraseña, el cual se muestra a continuación.",
        "passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
        "changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "showingresultsinrange": "Abajo se muestran hasta {{PLURAL:$1|<strong>1</strong> resultado|<strong>$1</strong> resultados}} entre el n.º <strong>$2</strong> y el n.º <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "No hay resultados que cumplan los criterios de búsqueda.",
+       "search-nonefound-thiswiki": "No hay resultados que cumplan los criterios de búsqueda en este sitio.",
        "powersearch-legend": "Búsqueda avanzada",
        "powersearch-ns": "Buscar en los espacios de nombres:",
        "powersearch-togglelabel": "Seleccionar:",
        "prefs-help-prefershttps": "Los cambios surtirán efecto en tu próximo inicio de sesión.",
        "prefswarning-warning": "Has hecho cambios en tus preferencias que todavía no se han guardado. Si sales de esta página sin pulsar en «$1» no se actualizarán las preferencias.",
        "prefs-tabs-navigation-hint": "Sugerencia: Puede utilizar las teclas de flecha izquierda y derecha para navegar entre las pestañas de la lista de pestañas.",
-       "email-address-validity-valid": "La dirección de correo electrónico parece ser válida",
-       "email-address-validity-invalid": "Escribe una dirección de correo electrónico válida",
        "userrights": "Gestión de permisos de usuario",
        "userrights-lookup-user": "Configurar grupos de usuarios",
        "userrights-user-editname": "Escribe un nombre de usuario:",
        "recentchanges-label-plusminus": "El tamaño de la página cambió esta cantidad de bytes",
        "recentchanges-legend-heading": "'''Leyenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (véase también la [[Special:NewPages|lista de páginas nuevas]])",
+       "recentchanges-submit": "Mostrar",
        "rcnotefrom": "Debajo aparece{{PLURAL:$5| el cambio|n los cambios}} desde <strong>$3, $4</strong> (se muestran hasta <strong>$1</strong>).",
        "rclistfrom": "Mostrar cambios nuevos desde las $2 del $3",
        "rcshowhideminor": "$1 ediciones menores",
        "mostrevisions": "Artículos con más ediciones",
        "prefixindex": "Todas las páginas con prefijo",
        "prefixindex-namespace": "Todas las páginas con el prefijo (espacio de nombres $1)",
+       "prefixindex-submit": "Mostrar",
        "prefixindex-strip": "Quitar prefijos en la lista",
        "shortpages": "Páginas cortas",
        "longpages": "Páginas largas",
        "protectedpages-performer": "Protección de usuario",
        "protectedpages-params": "Parámetros de protección",
        "protectedpages-reason": "Motivo",
+       "protectedpages-submit": "Mostrar páginas",
        "protectedpages-unknown-timestamp": "Desconocido",
        "protectedpages-unknown-performer": "Usuario desconocido",
        "protectedtitles": "Títulos protegidos",
        "protectedtitles-summary": "Esta página enumera títulos que actualmente están protegidos desde su creación. Para una lista de las páginas existentes que están protegidas, véase [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Actualmente no existen entradas protegidas con esos parámetros.",
+       "protectedtitles-submit": "Mostrar títulos",
        "listusers": "Lista de usuarios",
        "listusers-editsonly": "Muestra sólo usuarios con ediciones",
        "listusers-creationsort": "Ordenado por fecha de creación",
        "activeusers-hidebots": "Ocultar robots",
        "activeusers-hidesysops": "Ocultar administradores",
        "activeusers-noresult": "No se encontraron usuarios.",
+       "activeusers-submit": "Mostrar usuarios activos",
        "listgrouprights": "Permisos del grupo de usuarios",
        "listgrouprights-summary": "La siguiente es una lista de los grupos de usuario definidos en esta wiki y de sus privilegios de acceso asociados.\nPuede haber información adicional sobre privilegios individuales en [[{{MediaWiki:Listgrouprights-helppage}}]]",
        "listgrouprights-key": "Leyenda:\n* <span class=\"listgrouprights-granted\">Derecho concedido</span>\n* <span class=\"listgrouprights-revoked\">Derecho revocado</span>",
        "wlheader-showupdated": "Las páginas modificadas desde tu última visita aparecen en <strong>negrita</strong>.",
        "wlnote": "A continuación {{PLURAL:$1|se muestra el último cambio|se muestran los últimos <strong>$1</strong> cambios}} en {{PLURAL:$2|la última hora|las últimas <strong>$2</strong> horas}} a fecha de $4 $3.",
        "wlshowlast": "Ver los cambios de las últimas $1 horas, $2 días",
+       "watchlistall2": "todos",
+       "watchlist-hide": "Ocultar",
+       "watchlist-submit": "Mostrar",
+       "wlshowtime": "Mostrar cambios desde hace:",
+       "wlshowhideminor": "ediciones menores",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "usuarios registrados",
+       "wlshowhideanons": "usuarios anónimos",
+       "wlshowhidepatr": "ediciones verificadas",
+       "wlshowhidemine": "mis ediciones",
        "watchlist-options": "Opciones de la lista de seguimiento",
        "watching": "Vigilando...",
        "unwatching": "Eliminando de la lista de seguimiento...",
        "contributions": "Contribuciones {{GENDER:$1|del usuario|de la usuaria}}",
        "contributions-title": "Contribuciones {{GENDER:$1|del usuario|de la usuaria}} $1",
        "mycontris": "Contribuciones",
+       "anoncontribs": "Contribuciones",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "La cuenta de usuario «$1» no está registrada.",
        "nocontribs": "No se encontraron cambios que cumplieran estos criterios.",
        "whatlinkshere-hidelinks": "$1 enlaces",
        "whatlinkshere-hideimages": "$1 enlaces a archivos",
        "whatlinkshere-filters": "Filtros",
+       "whatlinkshere-submit": "Ir",
        "autoblockid": "Bloqueo automático #$1",
        "block": "Bloquear usuario",
        "unblock": "Desbloquear usuario",
        "movenosubpage": "Esta página no tiene subpáginas.",
        "movereason": "Motivo:",
        "revertmove": "revertir",
-       "delete_and_move": "Borrar y trasladar",
        "delete_and_move_text": "==Se necesita borrado==\n\nLa página de destino (\"[[:$1]]\") ya existe. ¿Quiere borrarla para permitir al traslado?",
        "delete_and_move_confirm": "Sí, borrar la página",
        "delete_and_move_reason": "Borrada para permitir el traslado de \"[[$1]]\"",
        "tooltip-pt-preferences": "Tus preferencias",
        "tooltip-pt-watchlist": "Lista de páginas cuyos cambios vigilas",
        "tooltip-pt-mycontris": "Lista de tus contribuciones",
+       "tooltip-pt-anoncontribs": "Una lista de modificaciones hechas desde esta dirección IP",
        "tooltip-pt-login": "Te recomendamos iniciar sesión, aunque no es obligatorio",
        "tooltip-pt-logout": "Salir de la sesión",
        "tooltip-pt-createaccount": "Te recomendamos crear una cuenta e iniciar sesión; sin embargo, no es obligatorio",
        "htmlform-cloner-required": "Se requiere al menos un valor.",
        "htmlform-title-badnamespace": "[[:$1]] no está en el espacio de nombres \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" no es un título de página que se pueda crear",
-       "htmlform-title-not-exists": "[[:$1]] no existe.",
+       "htmlform-title-not-exists": "$1 no existe.",
        "htmlform-user-not-exists": "<strong>$1</strong> no existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> no es un nombre de usuario válido.",
        "sqlite-has-fts": "$1 con soporte para búsqueda de texto completo",
index 1f2a107..086f488 100644 (file)
@@ -33,6 +33,7 @@
        "tog-hideminor": "Peida pisiparandused viimastes muudatustes",
        "tog-hidepatrolled": "Peida kontrollitud redaktsioonid viimastes muudatustes",
        "tog-newpageshidepatrolled": "Peida uute lehtede loendis kontrollitud leheküljed",
+       "tog-hidecategorization": "Peida lehekülgede kategoriseerimine",
        "tog-extendwatchlist": "Laienda jälgimisloendit, et näha kõiki muudatusi, mitte vaid kõige värskemaid",
        "tog-usenewrc": "Rühmita viimased muudatused ja muudatused jälgimisloendis lehekülje järgi",
        "tog-numberheadings": "Pealkirjade automaatnummerdus",
        "tog-watchlisthidebots": "Peida robotid jälgimisloendist",
        "tog-watchlisthideminor": "Peida pisiparandused jälgimisloendist",
        "tog-watchlisthideliu": "Peida sisselogitud kasutajate muudatused jälgimisloendist",
+       "tog-watchlistreloadautomatically": "Laadi jälgimisloend mõne filtri muutmise järel koheselt uuesti (nõutav JavaScript)",
        "tog-watchlisthideanons": "Peida anonüümsete kasutajate muudatused jälgimisloendist",
        "tog-watchlisthidepatrolled": "Peida kontrollitud muudatused jälgimisloendist",
+       "tog-watchlisthidecategorization": "Peida lehekülgede kategoriseerimine",
        "tog-ccmeonemails": "Saada mulle koopiad minu läkitatud e-kirjadest",
        "tog-diffonly": "Ära näita erinevuste vaate all lehe sisu",
        "tog-showhiddencats": "Näita peidetud kategooriaid",
@@ -70,7 +73,7 @@
        "tog-prefershttps": "Kasuta sisselogimisel alati turvalist ühendust",
        "underline-always": "Alati",
        "underline-never": "Mitte kunagi",
-       "underline-default": "Kujunduse või brauseri vaikeväärtus",
+       "underline-default": "Kujunduse või veebilehitseja vaikeväärtus",
        "editfont-style": "Redigeerimisala kirjatüüp:",
        "editfont-default": "Veebilehitseja vaikesäte",
        "editfont-monospace": "Püsisammuga font",
        "morenotlisted": "See loend pole täielik.",
        "mypage": "Minu lehekülg",
        "mytalk": "Arutelu",
-       "anontalk": "Selle IP-aadressi arutelu",
+       "anontalk": "Arutelu",
        "navigation": "Navigeerimine",
        "and": "&#32;ja",
        "qbfind": "Otsi",
        "databaseerror-query": "Päring: $1",
        "databaseerror-function": "Funktsioon: $1",
        "databaseerror-error": "Tõrge: $1",
+       "transaction-duration-limit-exceeded": "Selleks et vältida tiražeerimise suurt mahajäämust, on see tehing katkestatud, kuna kirjutamise kestus ($1) ületas $2 sekundi piirangut.\nKui muudad korraga palju üksusi, siis proovi selle asemel teha mitu väiksemat toimingut.",
        "laggedslavemode": "Hoiatus: Leheküljel võivad puududa viimased uuendused.",
        "readonly": "Andmebaas on hetkel kirjutuskaitse all",
        "enterlockreason": "Sisesta lukustamise põhjus ning juurdepääsu taastamise ligikaudne aeg",
        "missingarticle-rev": "(redaktsioon: $1)",
        "missingarticle-diff": "(redaktsioonid: $1, $2)",
        "readonly_lag": "Andmebaas on automaatselt lukustatud, seniks kuni sekundaarsed andmebaasiserverid on primaarserveriga samal järjel.",
+       "nonwrite-api-promise-error": "Saadeti HTTP päis \"Promise-Non-Write-API-Action\", kuid päring tehti API kirjutusmoodulisse.",
        "internalerror": "Sisemine viga",
        "internalerror_info": "Sisemine viga: $1",
        "internalerror-fatal-exception": "Saatuslik erandtöötluse tõrge: $1",
        "createaccountreason": "Põhjus:",
        "createacct-reason": "Põhjus",
        "createacct-reason-ph": "Miks lood teist kontot?",
-       "createacct-captcha": "Turvakontroll",
-       "createacct-imgcaptcha-ph": "Sisesta ülalnähtav tekst",
        "createacct-submit": "Loo konto",
        "createacct-another-submit": "Loo konto",
        "createacct-benefit-heading": "{{SITENAME}} on sinusuguste inimeste tehtud.",
        "wrongpasswordempty": "Parool jäi sisestamata. Palun proovi uuesti.",
        "passwordtooshort": "Parool peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.",
        "passwordtoolong": "Parool ei saa olla pikem kui {{PLURAL:$1|üks märk|$1 märk}}.",
+       "passwordtoopopular": "Liigi levinud parooli ei saa kasutada. Palun vali haruldasem parool.",
        "password-name-match": "Parool peab kasutajanimest erinema.",
        "password-login-forbidden": "Selle kasutajanime ja parooli kasutamine on keelatud.",
        "mailmypassword": "Lähtesta parool",
        "passwordreset-emailtext-ip": "Keegi, arvatavasti sina ise, IP-aadressilt $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "passwordreset-emailtext-user": "{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "passwordreset-emailelement": "Kasutajanimi: \n$1\n\nAjutine parool: \n$2",
-       "passwordreset-emailsent": "Kui oled sidunud konto selle e-posti aadressiga, siis saadetakse sulle parooli lähtestamise e-kiri.",
+       "passwordreset-emailsentemail": "Kui oled sidunud konto selle e-posti aadressiga, siis saadetakse sulle parooli lähtestamise e-kiri.",
        "passwordreset-emailsent-capture": "E-kirjatsi on saadetud allpool näidatav parooli lähtestuskiri.",
        "passwordreset-emailerror-capture": "Koostati allpool näidatav parooli lähtestuskiri, aga selle e-kirjatsi {{GENDER:$2|kasutajale}} saatmine ebaõnnestus: $1",
        "changeemail": "E-posti aadressi muutmine või eemaldamine",
        "permissionserrors": "Loatõrge",
        "permissionserrorstext": "Sul pole õigust seda teha {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
        "permissionserrorstext-withaction": "Sul pole lubatud {{lcfirst:$2}} {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
+       "contentmodelediterror": "Sa ei saa seda redaktsiooni redigeerida, sest selle sisumudel on <code>$1</code> ning lehekülje praegune sisumudel on <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Hoiatus: Lood uuesti lehekülge, mis on varem kustutatud.'''\n\nKaalu, kas lehekülje uuesti loomine on kohane.\nLehekülje eelnevad kustutamised ja teisaldamised:",
        "moveddeleted-notice": "See lehekülg on kustutatud.\nAllpool on esitatud lehekülje kustutamis- ja teisaldamislogi.",
        "moveddeleted-notice-recent": "Kahjuks on see lehekülg hiljuti kustutatud (viimase 24 tunni jooksul).\nAllpool on ära toodud selle lehekülje sissekanded teisaldamis- ja kustutamislogis.",
        "showingresultsinrange": "Allpool näidatakse {{PLURAL:$1|<strong>üht</strong>|<strong>$1</strong>}} tulemust vahemikus <strong>$2</strong>–<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|<strong>$1</strong>. tulemus <strong>$3</strong>-st|Tulemused <strong>$1–$2</strong> <strong>$3</strong>-st}}",
        "search-nonefound": "Päringule ei leitud vasteid.",
+       "search-nonefound-thiswiki": "Sellest võrgukohast ei leitud vasteid sinu otsingule.",
        "powersearch-legend": "Täpsem otsing",
        "powersearch-ns": "Otsing nimeruumidest:",
        "powersearch-togglelabel": "Vali:",
        "prefs-help-recentchangescount": "See käib viimaste muudatuste, lehekülgede ajalugude ja logide kohta.",
        "prefs-help-watchlist-token2": "See on sinu jälgimisloendi veebivoo salavõti.\nIgaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.\n[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].",
        "savedprefs": "Sinu eelistused on salvestatud.",
+       "savedrights": "Kasutaja $1 õigused on salvestatud.",
        "timezonelegend": "Ajavöönd:",
        "localtime": "Kohalik aeg:",
        "timezoneuseserverdefault": "Kasuta serveri vaikesätet ($1)",
        "timezoneuseoffset": "Muu (määra ajavahe)",
        "servertime": "Serveri aeg:",
-       "guesstimezone": "Loe aeg brauserist",
+       "guesstimezone": "Loe aeg veebilehitsejast",
        "timezoneregion-africa": "Aafrika",
        "timezoneregion-america": "Ameerika",
        "timezoneregion-antarctica": "Antarktika",
        "prefs-dateformat": "Kuupäeva vorming",
        "prefs-timeoffset": "Ajavahe",
        "prefs-advancedediting": "Üldsuvandid",
-       "prefs-editor": "Redaktor",
+       "prefs-editor": "Toimeti",
        "prefs-preview": "Eelvaade",
        "prefs-advancedrc": "Täpsemad eelistused",
        "prefs-advancedrendering": "Täpsemad eelistused",
        "prefs-help-prefershttps": "See eelistus jõustub pärast järgmist sisselogimist.",
        "prefswarning-warning": "Oled teinud eelistustes muudatusi, mida pole veel salvestatud.\nKui lahkud sellelt leheküljelt ilma nupul \"$1\" klõpsamata, jäävad kehtima senised eelistused.",
        "prefs-tabs-navigation-hint": "Spikker: Kaardiloendis toodud kaartide vahel liikumiseks saad kasutada vasakut ja paremat nooleklahvi.",
-       "email-address-validity-valid": "Sobiv e-posti aadress",
-       "email-address-validity-invalid": "Sisesta sobiv e-posti aadress.",
        "userrights": "Kasutajaõiguste haldus",
        "userrights-lookup-user": "Kasutajarühma muutmine",
        "userrights-user-editname": "Sisesta kasutajanimi:",
        "rcshowhidemine": "Minu parandused ($1)",
        "rcshowhidemine-show": "näita",
        "rcshowhidemine-hide": "peida",
+       "rcshowhidecategorization": "Kategoriseerimine ($1)",
+       "rcshowhidecategorization-show": "näita",
+       "rcshowhidecategorization-hide": "peida",
        "rclinks": "Näita viimast $1 muudatust viimase $2 päeva jooksul<br />$3",
        "diff": "erin",
        "hist": "ajal",
        "upload-dialog-button-done": "Valmis",
        "upload-dialog-button-save": "Salvesta",
        "upload-dialog-button-upload": "Laadi üles",
-       "upload-form-label-select-file": "Vali fail",
+       "upload-form-label-select-file": "Faili valimine",
        "upload-form-label-infoform-title": "Üksikasjad",
        "upload-form-label-infoform-name": "Pealkiri",
        "upload-form-label-infoform-description": "Kirjeldus",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Võimalik, et soovid kasutada [[Special:Upload|harilikku üleslaadimislehekülge]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Saan aru, et laadin selle faili jagatud varamusse. Kinnitan, et teen seda kooskõlas sealsete kasutustingimuste ja litsentsipõhimõtetega.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Kui sul pole võimalik laadida seda faili üles kooskõlas jagatud varamu reeglitega, siis palun sule see dialoog ja proovi teisiti toimida.",
-       "foreign-structured-upload-form-label-not-own-work-local-default": "Võimalik, et soovid [[Special:Upload|laadida selle faili üles saidil {{SITENAME}}]], kui seda on võimalik teha kooskõlas sealsete reeglitega.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Võimalik, et soovid [[Special:Upload|laadida selle faili üles saidil {{SITENAME}}]], kui seda on võimalik teha kooskõlas siinsete reeglitega.",
        "foreign-structured-upload-form-label-own-work-message-shared": "Kinnitan, et olen selle faili autoriõiguse valdaja ja nõustun faili avaldamisega Wikimedia Commonsis pöördumatult Creative Commonsi litsentsi \"[https://creativecommons.org/licenses/by-sa/4.0/deed.et Autorile viitamine + jagamine samadel tingimustel 4.0]\" all. Samuti nõustun [https://wikimediafoundation.org/wiki/Terms_of_Use kasutustingimustega].",
        "foreign-structured-upload-form-label-not-own-work-message-shared": "Kui sa pole selle faili autoriõiguse valdaja või kui soovid avaldada seda teise litsentsi all, siis on sul võimalik kasutada [https://commons.wikimedia.org/wiki/Special:UploadWizard Commonsi üleslaadimisviisardit].",
-       "foreign-structured-upload-form-label-not-own-work-local-shared": "Võimalik, et soovid kasutada [[Special:Upload|saidi {{SITENAME}} üleslaadimislehekülge]], kui seda faili on lubatud üles laadida kooskõlas sealsete reeglitega.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Võimalik, et soovid kasutada [[Special:Upload|saidi {{SITENAME}} üleslaadimislehekülge]], kui seda faili on lubatud üles laadida kooskõlas siinsete reeglitega.",
        "backend-fail-stream": "Faili $1 ei saanud edastada.",
        "backend-fail-backup": "Faili $1 ei saanud varundada.",
        "backend-fail-notexists": "Faili $1 pole olemas.",
        "wlheader-showupdated": "Leheküljed, mida on muudetud peale sinu viimast külastust, on '''rasvases kirjas'''.",
        "wlnote": "Allpool on {{PLURAL:$1|viimane muudatus|viimased <strong>$1</strong> muudatust}} viimase {{PLURAL:$2|tunni|<strong>$2</strong> tunni}} jooksul seisuga $3, kell $4.",
        "wlshowlast": "Näita viimast $1 tundi $2 päeva.",
+       "watchlistall2": "kõike",
+       "watchlist-hide": "Peida",
+       "wlshowtime": "Näita viimast:",
+       "wlshowhideminor": "pisimuudatused",
+       "wlshowhidebots": "robotid",
+       "wlshowhideliu": "registreeritud kasutajad",
+       "wlshowhideanons": "anonüümsed kasutajad",
+       "wlshowhidepatr": "kontrollitud muudatused",
+       "wlshowhidemine": "minu muudatused",
        "watchlist-options": "Jälgimisloendi seaded",
        "watching": "Jälgimine...",
        "unwatching": "Jälgimise lõpetamine...",
        "contributions": "{{GENDER:$1|Kasutaja}} kaastöö",
        "contributions-title": "Kasutaja $1 kaastöö",
        "mycontris": "Kaastöö",
+       "anoncontribs": "Kaastöö",
        "contribsub2": "Kasutaja {{GENDER:$3|$1}} ($2) jaoks",
        "contributions-userdoesnotexist": "Kasutajakonto \"$1\" pole registreeritud.",
        "nocontribs": "Antud kriteeriumitele vastavaid muudatusi ei leitud.",
        "movenosubpage": "Sellel leheküljel pole alamlehekülgi.",
        "movereason": "Põhjus:",
        "revertmove": "taasta",
-       "delete_and_move": "Kustuta ja teisalda",
        "delete_and_move_text": "== Vajalik kustutamine ==\nSihtlehekülg \"[[:$1]]\" on juba olemas.\nKas kustutad selle, et luua võimalus teisaldamiseks?",
        "delete_and_move_confirm": "Jah, kustuta lehekülg",
        "delete_and_move_reason": "Kustutatud, et tõsta asemele lehekülg \"[[$1]]\"",
        "tooltip-pt-preferences": "Sinu eelistused",
        "tooltip-pt-watchlist": "Loend lehekülgedest, mille muudatusi jälgid",
        "tooltip-pt-mycontris": "Sinu kaastööde loend",
+       "tooltip-pt-anoncontribs": "Sellelt IP-aadressilt tehtud muudatuste loend",
        "tooltip-pt-login": "See pole küll kohustuslik, aga sul tasub sisse logida.",
        "tooltip-pt-logout": "Logi välja",
        "tooltip-pt-createaccount": "See pole küll kohustuslik, aga sul tasub konto luua ja sisse logida.",
        "htmlform-cloner-required": "Vähemalt üks väärtus on nõutav.",
        "htmlform-title-badnamespace": "[[:$1]] pole nimeruumis \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "Pealkirja \"$1\" all ei saa lehekülge alustada.",
-       "htmlform-title-not-exists": "Lehekülge [[:$1]] pole olemas.",
+       "htmlform-title-not-exists": "Lehekülge $1 pole olemas.",
        "htmlform-user-not-exists": "Kasutajat <strong>$1</strong> pole olemas.",
        "htmlform-user-not-valid": "<strong>$1</strong> pole sobiv kasutajanimi.",
        "sqlite-has-fts": "$1 koos täistekstiotsingu toega",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}}; aegumistähtaeg $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut; aegumistähtaeg $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importis}} lehekülje $3 faili üleslaadimise teel",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importis}} lehekülje $3 faili üleslaadimise teel ($4 {{PLURAL:$4|redaktsioon|redaktsiooni}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importis}} lehekülje $3 teisest vikist",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importis}} lehekülje $3 asukohast $5 ($4 {{PLURAL:$4|redaktsioon|redaktsiooni}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|liitis}} lehekülje $3 leheküljega $4 (kuni redaktsioonini $5)",
        "logentry-move-move": "$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|teisaldas}} lehekülje $3 pealkirja $4 alla ümbersuunamist maha jätmata",
index 630bea2..d7506e6 100644 (file)
                        "Joxemai",
                        "Arkaitz Barnetik",
                        "Sator",
-                       "Macofe"
+                       "Macofe",
+                       "Xð"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
        "tog-hideminor": "Ezkutatu azken aldaketetan aldaketa txikiak",
        "tog-hidepatrolled": "Ezkutatu patruilatutako aldaketa azken aldaketetan",
        "tog-newpageshidepatrolled": "Ezkutatu patruilatutako orriak, orri-zerrenda berritik",
+       "tog-hidecategorization": "Ezkutatu orrien kategorizazioa",
        "tog-extendwatchlist": "Jarraipen-zerrenda zabaldu aldaketa guztiak ikusteko, ez bakarrik azken aldaketak",
        "tog-usenewrc": "Azken aldaketetan eta jarraipen-zerrendan aldaketak orrialdearen arabera taldekatu",
-       "tog-numberheadings": "Goiburukoak automatikoki zenbakitu",
+       "tog-numberheadings": "Zenbakitu automatikoki goiburuak",
        "tog-showtoolbar": "Aldaketen tresna-barra erakutsi",
        "tog-editondblclick": "Klik bikoitzaren bitartez orrialdeak aldatu",
        "tog-editsectiononrightclick": "Atalen izenburuetan eskuin klik eginez aldatzea gaitu",
@@ -39,6 +41,7 @@
        "tog-watchdefault": "Aldatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu",
        "tog-watchmoves": "Izena aldatutako orrialdeak eta fitxategiak jarraipen-zerrendara gehitu",
        "tog-watchdeletion": "Ezabatzen ditudan orrialdeak eta fitxategiak nire jarraipen-zerrendara gehitu",
+       "tog-watchrollback": "Nire jarraipen zerrendan rollbacka egin dudan orrialdeak erakutsi",
        "tog-minordefault": "Lehenetsi bezala aldaketa txiki bezala markatu guztiak",
        "tog-previewontop": "Aurrebista aldaketa koadroaren aurretik erakutsi",
        "tog-previewonfirst": "Lehen aldaketan aurrebista erakutsi",
@@ -57,6 +60,7 @@
        "tog-watchlisthideliu": "Ezkutatu izena emana duten lankideen aldaketak, jarraitze-zerrendan",
        "tog-watchlisthideanons": "Ezkutatu lankide anonimoen aldaketak, jarraitze-zerrendan",
        "tog-watchlisthidepatrolled": "Ezkutatu patruilatutako aldaketak jarraitze-zerrendan",
+       "tog-watchlisthidecategorization": "Orrialdeen kategorizazioa ezkutatu",
        "tog-ccmeonemails": "Beste erabiltzaileei bidaltzen dizkiedan mezuen kopiak niri ere bidali",
        "tog-diffonly": "''Diff''-ak agertzen direnean, orrialdearen edukiera ezkutatu",
        "tog-showhiddencats": "Ikusi kategoria ezkutuak",
        "morenotlisted": "Zerrenda hau ez dago osorik.",
        "mypage": "Orrialdea",
        "mytalk": "Eztabaida",
-       "anontalk": "IP honen eztabaida",
+       "anontalk": "Eztabaida",
        "navigation": "Nabigazioa",
        "and": "&#32;eta",
        "qbfind": "Aurkitu",
        "permalink": "Lotura finkoa",
        "print": "Inprimatu",
        "view": "Ikusi",
+       "view-foreign": "$1(e)n ikusi",
        "edit": "Aldatu",
+       "edit-local": "Aldatu deskribapen lokala",
        "create": "Sortu",
+       "create-local": "Gehitu deskribapen lokala",
        "editthispage": "Orri hau aldatu",
        "create-this-page": "Sortu orri hau",
        "delete": "Ezabatu",
        "viewhelppage": "Laguntza orrialdea ikusi",
        "categorypage": "Kategoria orrialdea ikusi",
        "viewtalkpage": "Eztabaida ikusi",
-       "otherlanguages": "Erdaretan",
+       "otherlanguages": "Beste hizkuntza batzuetan",
        "redirectedfrom": "($1(e)tik birzuzenduta)",
        "redirectpagesub": "Birbideratze orria",
        "redirectto": "Hona birzuzentzen du:",
        "pool-timeout": "Lock-a itxoiten denbora amaitu da",
        "pool-queuefull": "Prozesuen zerrenda beteta dago",
        "pool-errorunknown": "Errore ezezaguna",
+       "pool-servererror": "Pool kontadore zerbitzua ez dago eskuragarri ($1)",
        "poolcounter-usage-error": "Erabilera-errorea: $1",
        "aboutsite": "{{SITENAME}} guneari buruz",
        "aboutpage": "Project:Honi_buruz",
        "viewsourceold": "kodea ikusi",
        "editlink": "aldatu",
        "viewsourcelink": "jatorria ikusi",
-       "editsectionhint": "Atala aldatu: $1",
+       "editsectionhint": "Aldatu atal hau: «$1»",
        "toc": "Edukiak",
        "showtoc": "erakutsi",
        "hidetoc": "ezkutatu",
        "readonly_lag": "Datu-basea automatikoki blokeatu da, menpeko zerbitzariak nagusiarekin sinkronizatu bitartean",
        "internalerror": "Barne errorea",
        "internalerror_info": "Barne errorea: $1",
+       "internalerror-fatal-exception": "\"$1\" motako salbuespen larria",
        "filecopyerror": "Ezin izan da \"$1\" fitxategia \"$2\"(e)ra kopiatu.",
        "filerenameerror": "Ezin izan zaio \"$1\" fitxategiari \"$2\" izen berria eman.",
        "filedeleteerror": "Ezin izan da \"$1\" fitxategia ezabatu.",
        "protectedinterface": "Orrialde honek softwarearentzako interfaze testua gordetzen du eta blokeatuta dago bandalismoak saihesteko.\nWiki guztientzako aldaketak egin edo gehitzeko, mesedez erabili [//translatewiki.net/ translatewiki.net], MediaWikiren lokalizazio proiektua.",
        "editinginterface": "<strong> Oharra:</strong> Softwarearen interfazerako testua duen orri bat aldatzen ari zara.\nOrri honetako aldaketek wiki honetako erabiltzaile guztiei eragingo diete.",
        "translateinterface": "Itzulpenetarako, erabil ezazu [//translatewiki.net/ translatewiki.net], MediaWiki proiektuan.",
-       "cascadeprotected": "Orri hau aldaketen aurka babestua dago, sartuta dagoelako «kaskadako babesa» aukerarekin babestu {{PLURAL:$1|duten orri honetan|dituzten orri hauetan}}:\n$2",
+       "cascadeprotected": "Orri hau aldaketen aurka babestua dago, barneratuta dagoelako «kaskadako babesa» aukerarekin babestu {{PLURAL:$1|duten orri honetan|dituzten orri hauetan}}:\n$2",
        "namespaceprotected": "Ez daukazu '''$1''' izen-tarteko orrialdeak aldatzeko baimenik.",
        "customcssprotected": "Ez duzu baimenik CSS orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.",
        "customjsprotected": "Ez duzu baimenik JavaScript orrialde hau aldatzeko beste erabiltzaile baten hobespen pertsonalak dituelako.",
        "createaccountreason": "Arrazoia:",
        "createacct-reason": "Arrazoia",
        "createacct-reason-ph": "Zergatik ari zaren beste erabiltzaile kontu bat",
-       "createacct-captcha": "Segurtasun froga",
-       "createacct-imgcaptcha-ph": "Sartu gainean ikusten duzun testua",
        "createacct-submit": "Kontua sortu",
        "createacct-another-submit": "Kontu bat sortu",
        "createacct-benefit-heading": "{{SITENAME}} zu bezalako pertsonek egiten dute.",
        "passwordreset-email": "E-mail helbidea:",
        "passwordreset-emailtitle": "{{SITENAME}}-rako kontuaren xehetasunak",
        "passwordreset-emailelement": "Erabiltzaile izena: \n$1\n\nBehin-behineko pasahitza: \n$2",
-       "passwordreset-emailsent": "Pasahitza berrezartzeko e-posta bidali da.",
+       "passwordreset-emailsentemail": "Hau zure konturako erregistratuta dagoen helbide elektronikoa baldin bada, mezu elektronikoa bidaliko da zure pasahitza berrezartzeko.",
        "passwordreset-emailsent-capture": "Pasahitza berrezartzeko e-posta bat bidali dizugu, behean erakusten dena.",
        "changeemail": "Aldatu edo kendu e-mail helbidea",
-       "changeemail-header": "Aldatu kontuko e-posta helbidea",
+       "changeemail-header": "Bete ezazu inprimaki hau, zure helbide elektronikoa aldatzeko. Zure kontuari helbide elektronikorik elkartuta ez izatea nahi baduzu, utz ezazu hutsik helbide elektroniko berria, inprimakia bidaltzen duzunean.",
        "changeemail-no-info": "Orrialde honetara zuzenean sartzeko izena eman behar duzu.",
        "changeemail-oldemail": "Egungo e-mail helbidea:",
        "changeemail-newemail": "E-posta helbide berria:",
        "anonpreviewwarning": "''Ez duzu saioa hasi. Gordez gero, zure IP helbidea grabatuko da orri honen edizio historian.''",
        "missingsummary": "'''Gogorarazpena:''' Ez duzu aldaketa laburpen bat zehaztu. Berriz ere gordetzeko aukeratzen baduzu, laburpen mezurik gordeko da.",
        "missingcommenttext": "Mesedez, iruzkin bat idatzi jarraian.",
-       "missingcommentheader": "'''Oharra:''' Ez duzu iruzkin honetarako gairik edo goiburukorik ezarri. «{{int:Savearticle}}» klikatzen baduzu, hutsune horrekin gordeko da.",
+       "missingcommentheader": "<strong>Oharra:</strong> Ez duzu iruzkin honetarako gairik ezarri. «{{int:Savearticle}}» berriro klikatzen baduzu, gairik gabe gordeko da zure edizioa.",
        "summary-preview": "Laburpenaren aurreikuspena:",
        "subject-preview": "Gaiaren aurrebista:",
        "blockedtitle": "Erabiltzailea blokeatuta dago",
        "creating": "«$1» sortzen",
        "editingsection": "«$1» aldatzen (atala)",
        "editingcomment": "«$1» aldatzen (atal berria)",
-       "editconflict": "Zure aldaketak ezin izan dira gorde, edizio gatazka bat izan delako. Gatazka eskuz konpondu nahi {{GENDER:|duzu}}?",
+       "editconflict": "Edizio gatazka: $1",
        "explainconflict": "Zu orrialdea aldatzen hasi ondoren beste norbaitek ere aldaketak egin ditu.\nGoiko testu koadroan ikus daiteke orrialdeak uneotan duen edukia.\nZure aldaketak beheko testu koadroan ikus daitezke.\nZure testua dagoenarekin elkartu beharko duzu.\nOrrialdea gordetzeko erabakitzen duzun unean goiko koadroko edukia '''bakarrik''' gordeko da.",
        "yourtext": "Zure testua",
        "storedversion": "Gordetako bertsioa",
        "content-model-text": "testu laua",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Objetu hustua",
+       "content-json-empty-array": "Matrize hutsa",
        "expensive-parserfunction-warning": "Adi: Orrialde honek parser funtzio deialdi oso garesti gehiegi ditu.\n\n$2 {{PLURAL:$2|deialdi|deialdi}} baino gutxiago eduki beharko lituzke, eta orain $1 {{PLURAL:$1|dago|daude}}.",
        "expensive-parserfunction-category": "Parser funtzio deialdi oso garesti gehiegi dituzten orrialdeak",
        "post-expand-template-inclusion-warning": "Kontuz: Txantiloiak sartzen duena oso handia da.\nTxantiloi batzuk ez dira erabiliko.",
        "parser-template-recursion-depth-warning": "Txantiloaren rekurtsio sakoneraren muga gainditu da ($1)",
        "language-converter-depth-warning": "Hizkuntza-bihurgailuaren sakonerak ($1) muga gainditu du",
        "node-count-exceeded-category": "Nodo-zenbaketa gainditu den orrialdeak",
-       "node-count-exceeded-warning": "Orrialdeak nodo-zenbaketa gainditu du",
+       "node-count-exceeded-warning": "Orriak nodo-kopuruaren muga gainditu du",
        "expansion-depth-exceeded-category": "Orrialdearen espantsio sakonera gainditu da",
        "expansion-depth-exceeded-warning": "Espantsio sakonera gainditu duten orrialdeak",
        "parser-unstrip-loop-warning": "Loop unstrip bat aurkitu da",
        "previousrevision": "←Berrikuspen zaharragoa",
        "nextrevision": "Berrikuspen berriagoa→",
        "currentrevisionlink": "Oraingo berrikuspena ikusi",
-       "cur": "orain",
+       "cur": "oraingoa",
        "next": "hurrengoa",
-       "last": "azkena",
+       "last": "aurrekoa",
        "page_first": "lehena",
        "page_last": "azkena",
        "histlegend": "Alderaketa hautatzea: marka itzazu alderatu nahi dituzun bi bertsioak, eta saka ezazu «Enter» edo klika ezazu beheko botoia.<br />\nAzalpenak: '''({{int:cur}})''' = oraingo bertsioarekiko aldeak,\n'''({{int:last}})''' = aurreko bertsioarekiko aldeak, \n'''{{int:minoreditletter}}''' = aldaketa txikia.",
        "history-feed-description": "Wikiko orrialde honen berrikuspenen historia",
        "history-feed-item-nocomment": "nork: $1 noiz: $2",
        "history-feed-empty": "Eskatutako orrialdea ez da existitzen. Baliteke wikitik ezabatu edo izenez aldatu izana. Saiatu [[Special:Search|wikian zerikusia duten orrialdeak bilatzen]].",
+       "history-edit-tags": "Hautatutako berrikuspenen etiketak aldatu",
        "rev-deleted-comment": "(aldaketa laburpena ezabatu da)",
        "rev-deleted-user": "(erabiltzailea ezabatu da)",
-       "rev-deleted-event": "(log ekintza ezabatu da)",
+       "rev-deleted-event": "(log xehetasunak ezabatu dira)",
        "rev-deleted-user-contribs": "[lankide izena edo Ip helbidea ezabatua - aldatu ezkutapena ekarpenetatik]",
-       "rev-deleted-text-permission": "Orrialdearen berrikuspen hau '''ezabatua''' izan da.\nXehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] ikus daitezke.",
+       "rev-deleted-text-permission": "Orrialdearen berrikuspen hau <strong>ezabatua</strong> izan da.\nXehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] ikus daitezke.",
        "rev-deleted-text-unhide": "Orriaren bertsio hau '''ezabatu''' da.\nXehetasunak ikusgai daude [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabatze erregistroan].\nAdministratzailea zarenez, oraindik [$1 bertsio hau ikus dezakezu], nahi izanez gero.",
        "rev-suppressed-text-unhide": "Orriaren bertsio hau '''ezeztatu''' da.\nXehetasunak ikusgai daude [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ezeztatze erregistroan].\nAdministratzailea zarenez, oraindik [$1 bertsio hau ikus dezakezu], nahi izanez gero.",
        "rev-deleted-text-view": "Orriaren berrikuspen hau '''ezabatua''' izan da.\nZuk ikusteko aukera daukazu; xehetasunak [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ezabaketa erregistroan] ikus ditzakezu.",
        "rev-showdeleted": "erakutsi",
        "revisiondelete": "Berrikuspenak ezabatu/leheneratu",
        "revdelete-nooldid-title": "Helburu berrikuspenik ez",
-       "revdelete-nooldid-text": "Ez d(it)uzu eragiketa hau burutzeko helburu berrikuspena(k) zehaztu.",
+       "revdelete-nooldid-text": "Ez duzu eragiketa hau burutzeko helburu berrikuspenik zehaztu, edo berrikuspen hori ez da existitzen, edo oraingo berrikuspena ezkutatzen ari zara.",
        "revdelete-no-file": "Zehazturiko fitxategia ez da existitzen.",
        "revdelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" fitxategiaren bertsio ezabatua (eguna: $2; ordua: $3) ikusi nahi duzu?",
        "revdelete-show-file-submit": "Bai",
        "logdelete-selected": "{{PLURAL:$1|Aukeratutako log gertakaria|Aukeratutako log gertakariak}}:",
        "revdelete-confirm": "Baiezta ezazu hori dela zure asmoa, ulertzen dituzula ondorioak, eta [[{{MediaWiki:Policy-url}}|irizpideak]] errespetatuz egiten ari zarela hau.",
-       "revdelete-suppress-text": "Ezabaketa '''bakarrik''' arrazoi hauek direla eta erabili beharko litzateke:\n* Informazio pertsonal desegokia\n*: ''etxeko helbideak eta telefono zenbakiak, segurtasun sozial zenbakiak, etab.''",
+       "revdelete-suppress-text": "Ezabaketa <strong>bakarrik</strong> arrazoi hauek direla eta erabili beharko litzateke:\n* Iraingarria izan daiteken informazioa\n* Informazio pertsonal desegokia\n*: <em>etxeko helbideak eta telefono zenbakiak, nortasun zenbaki nazionalak, etab.</em>",
        "revdelete-legend": "Berrikuspen mugapenak ezarri:",
        "revdelete-hide-text": "Berrikuspenaren testua ezkutatu",
        "revdelete-hide-image": "Fitxategiaren edukia ezkutatu",
        "difference-title-multipage": "«$1» eta «$2» orrien arteko aldeak",
        "difference-multipage": "(Orrien arteko aldeak)",
        "lineno": "$1. lerroa:",
-       "compareselectedversions": "Hautatutako bertsioak alderatu",
+       "compareselectedversions": "Alderatu hautatutako bertsioak",
        "showhideselectedversions": "Erakutsi/ezkutatu aukeratutako berrikuspenak",
        "editundo": "desegin",
        "diff-empty": "(Ez dago alderik)",
+       "diff-multi-sameuser": "(Erabiltzaile berdinaren {{PLURAL:$1|erdiko ekarpen bat ez da|$1 erdiko ekarpen ez dira}} erakusten)",
        "searchresults": "Bilaketaren emaitzak",
        "searchresults-title": "\"$1(e)rako\" emaitzak bilatu",
        "titlematches": "Emaitzak artikuluen izenburuetan",
        "nextn-title": "Hurrengo $1 {{PLURAL:$1|emaitza|emaitzak}}",
        "shown-title": "Erakutsi {{PLURAL:$1|emaitza $1|$1 emaitza}} orrialdeko",
        "viewprevnext": "Ikusi ($1 {{int:pipe-separator}} $2) ($3).",
-       "searchmenu-exists": "'''«[[:$1]]» izena duen orri bat bada wiki honetan.''' {{PLURAL:$2|0=|Ikus, gainera, aurkitutako beste bilaketa emaitzak.}}",
-       "searchmenu-new": "<strong>Sortu «[[:$1]]» orria wiki honetan!<strong> {{PLURAL:$2|0=|Ikus, gainera, zure bilaketarekin aurkitutako orria.|Ikus, gainera, bilaketaren emaitzak.}}",
+       "searchmenu-exists": "<strong>«[[:$1]]» izena duen orri bat bada wiki honetan.</strong> {{PLURAL:$2|0=|Ikus, gainera, aurkitutako beste bilaketa emaitzak.}}",
+       "searchmenu-new": "<strong>Sortu «[[:$1]]» orria wiki honetan!</strong> {{PLURAL:$2|0=|Ikus, gainera, zure bilaketarekin aurkitutako orria.|Ikus, gainera, bilaketaren emaitzak.}}",
        "searchprofile-articles": "Eduki-orriak",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Guztia",
        "search-relatedarticle": "Erlazionatua",
        "searchrelated": "erlazionatua",
        "searchall": "guztia",
-       "showingresults": "Jarraian {{PLURAL:$1|emaitza '''1''' ikus daiteke|'''$1''' emaitza ikus daitezke}}, #'''$2'''.etik hasita.",
+       "showingresults": "Jarraian {{PLURAL:$1|emaitza <strong>bat</strong> ageri da.|<strong>$1</strong> emaitza ageri dira, #'''$2'''.etik hasita.}}",
+       "showingresultsinrange": "Jarraian {{PLURAL:$1|emaitza <strong>bat</strong> ageri da.|<strong>$1</strong> emaitza ageri dira, </strong>$2</strong>.etik hasi eta <strong>$3</strong>.eraino.}}",
+       "search-showingresults": "{{PLURAL:$4|<strong>$1.</strong> emaitza (guztira <strong>$3</strong> dira)|<strong>$1 - $2.</strong> emaitzak (guztira <strong>$3</strong> dira)}}",
        "search-nonefound": "Ez dago eskaerarekin bat egiten duten emaitzarik.",
        "powersearch-legend": "Bilaketa aurreratua",
        "powersearch-ns": "Bilatu honako izen-tartetan:",
        "columns": "Zutabeak:",
        "searchresultshead": "Bilaketa",
        "stub-threshold": "<a href=\"#\" class=\"stub\">stub link</a> formaturako atalasea (byteak):",
+       "stub-threshold-sample-link": "adibidea",
        "stub-threshold-disabled": "Ezgaitua",
        "recentchangesdays": "Aldaketa berrietan erakutsi beharreko egun kopurua:",
        "recentchangesdays-max": "(gehienez {{PLURAL:$1|egun bat|$1 egun}})",
        "prefs-help-recentchangescount": "Honek azken aldaketak, orrialdeen historiak eta logak barne-biltzen ditu.",
        "prefs-help-watchlist-token2": "Hau da zure jarraipen zerrendako web jarioaren giltza sekretua.\nEzagutzen duen orok zure jarraipen zerrenda irakurtzeko aukera izango du, ez partekatu.\n[[Special:ResetTokens|Klik egin hemen berrezarri behar baduzu]]",
        "savedprefs": "Zure hobespenak gorde egin dira.",
+       "savedrights": "{{GENDER:$1|$1}} erabiltzailearen eskubideak gorde dira.",
        "timezonelegend": "Ordu-eremua:",
        "localtime": "Ordu lokala:",
        "timezoneuseserverdefault": "Erabili lehenetsitako wikia ($1)",
        "prefs-diffs": "Ezberdintasunak",
        "prefs-help-prefershttps": "Hobespen hauek eragina izango dute sartzen zaren hurrengoan.",
        "prefs-tabs-navigation-hint": "Gomendioa: Fitxen zerrendan nabigatzeko ezker eta eskuin geziak erabil ditzakezu.",
-       "email-address-validity-valid": "E-posta helbidea zuzena dela dirudi",
-       "email-address-validity-invalid": "E-posta helbide zuzena idatzi",
        "userrights": "Erabiltzaile baimenen kudeaketa",
        "userrights-lookup-user": "Erabiltzaile taldeak kudeatu",
        "userrights-user-editname": "Erabiltzaile izena idatzi:",
        "group-bot": "Bot-ak",
        "group-sysop": "Administratzaileak",
        "group-bureaucrat": "Burokratak",
-       "group-suppress": "Gainikupsenak",
+       "group-suppress": "Gainikupenak",
        "group-all": "(guztiak)",
        "group-user-member": "{{GENDER:$1|lankidea}}",
        "group-autoconfirmed-member": "{{GENDER:$1|baieztatutako lankidea}}",
        "group-bot-member": "{{GENDER:$1|bot-a}}",
        "group-sysop-member": "{{GENDER:$1|administratzailea}}",
        "group-bureaucrat-member": "{{GENDER:$1|burokrata}}",
-       "group-suppress-member": "{{GENDER:$1|gainikuslea}}",
+       "group-suppress-member": "{{GENDER:$1|ezabatzailea}}",
        "grouppage-user": "{{ns:project}}:Lankideak",
        "grouppage-autoconfirmed": "{{ns:project}}:Erabiltzaile autokonfirmatuak",
        "grouppage-bot": "{{ns:project}}:Bot-ak",
        "grouppage-sysop": "{{ns:project}}:Administratzaileak",
        "grouppage-bureaucrat": "{{ns:project}}:Burokratak",
-       "grouppage-suppress": "{{ns:project}}:Gainikuspena",
+       "grouppage-suppress": "{{ns:project}}:Ezabatzea",
        "right-read": "Irakurri orriak",
        "right-edit": "Orriak aldatu",
        "right-createpage": "Orrialdeak sortu (eztabaida orrialdeak ez direnak)",
        "right-move": "Mugitu orriak",
        "right-move-subpages": "Mugitu orrialdeak bere azpiorrialdeekin",
        "right-move-rootuserpages": "Erro-lankidearen orriak mugitu",
+       "right-move-categorypages": "Kategoria orrialdeak mugitu",
        "right-movefile": "Mugitu fitxategiak",
        "right-suppressredirect": "Orri bat mugitzean, ez sortu birbideratzea jatorrizko izenetik",
        "right-upload": "Fitxategia igo",
        "rcshowhidemine": "$1 nire ekarpenak",
        "rcshowhidemine-show": "Erakutsi",
        "rcshowhidemine-hide": "Ezkutatu",
+       "rcshowhidecategorization": "orrialde baten kategorizazioa $1",
+       "rcshowhidecategorization-show": "Erakutsi",
+       "rcshowhidecategorization-hide": "Ezkutatu",
        "rclinks": "Erakutsi azken $2 egunetako $1 aldaketak<br />$3",
        "diff": "ezb",
        "hist": "hist",
        "recentchangeslinked-summary": "Zerrenda honetan zehazturiko orrialde bati (edo kategoria berezi bateko azkeneko kideei) lotura duten orrietan eginiko azken aldaketak agertzen dira.\n[[Special:Watchlist|Zurre jarraitze zerrenda]]n agertzen diren orrialdeak '''beltze'''z agertzen dira.",
        "recentchangeslinked-page": "Orriaren izena:",
        "recentchangeslinked-to": "Lotutako orrietarako aldaketak erakutsi emandako orriaren ordez",
+       "recentchanges-page-added-to-category": "[[:$1]] Kategoriara gehitua",
+       "autochange-username": "MediaWiki aldaketa automatikoa",
        "upload": "Fitxategia igo",
        "uploadbtn": "Fitxategia igo",
        "reuploaddesc": "Igotzeko formulariora itzuli.",
        "upload-form-label-infoform-description": "Deskribapena",
        "upload-form-label-usage-title": "Erabilera",
        "upload-form-label-usage-filename": "Fitxategiaren izena",
+       "foreign-structured-upload-form-label-own-work": "Hau neure lana da",
        "foreign-structured-upload-form-label-infoform-categories": "Kategoriak",
        "foreign-structured-upload-form-label-infoform-date": "Data",
        "backend-fail-stream": "Ezin izan da \"$1\" fitxategiaren stream egin.",
        "upload_source_url": " (baliozko URL publikoa)",
        "upload_source_file": " (zure ordenagailuko fitxategi bat)",
        "listfiles-delete": "ezabatu",
-       "listfiles-summary": "Orri berezi honek igotako fitxategi guztiak erakusten ditu.\nBerez, azken igotako fitxategiak zerrendaren goiko aldean azaltzen dira.",
+       "listfiles-summary": "Orri berezi honek igotako fitxategi guztiak erakusten ditu.",
        "listfiles_search_for": "Irudiaren izenagatik bilatu:",
+       "listfiles-userdoesnotexist": "\"$1\" erabiltzaile-kontua ez dago erregistraturik.",
        "imgfile": "fitxategia",
        "listfiles": "Fitxategien zerrenda",
        "listfiles_thumb": "Iruditxoa",
        "unusedimages": "Erabili gabeko fitxategiak",
        "wantedcategories": "Eskatutako kategoriak",
        "wantedpages": "Eskatutako orrialdeak",
+       "wantedpages-summary": "Lotura gehien dituzten eta existitzen ez diren orrialdeen zerrenda da hau, eurengana birzuzenketak baino ez dituzten orrialdeak kenduta. Eurenganako birzuzenketak dituzten baina existitzen ez diren orrialdeen zerrenda bat ikusteko, [[{{#special:BrokenRedirects}}|apurtutako birzuzenketen zerrendara]] jo dezakezu.",
        "wantedpages-badtitle": "Izenburu okerra hautatutako emaitzetan: $1",
        "wantedfiles": "Eskatutako fitxategiak",
        "wantedtemplates": "Eskatutako txantiloiak",
        "protectedpages-timestamp": "Denbora-marka",
        "protectedpages-page": "Orria",
        "protectedpages-expiry": "Epemuga:",
+       "protectedpages-performer": "Erabiltzailea babesten",
+       "protectedpages-params": "Babesaren parametroak",
        "protectedpages-reason": "Arrazoia",
        "protectedpages-unknown-timestamp": "Ezezaguna",
        "protectedpages-unknown-performer": "Erabiltzaile ezezaguna",
        "nopagetext": "Zuk ezarri duzun helburuko orrialdea ez da existitzen.",
        "pager-newer-n": "{{PLURAL:$1|berriago den 1|berriagoak diren $1}}",
        "pager-older-n": "{{PLURAL:$1|zaharragoa den 1|zaharragoak diren $1}}",
-       "suppress": "Gain-ikuspena",
+       "suppress": "Ezabatu",
        "querypage-disabled": "Orrialde berezi hau desgaituta dago funtzionamendu arrazoiengatik.",
        "apihelp": "API laguntza",
        "apihelp-no-such-module": "Ez da \"$1\" modulua aurkitu.",
        "listgrouprights-addgroup-self-all": "Talde guztiak norbere kontura gehitu",
        "listgrouprights-removegroup-self-all": "Talde guztiak norbere kontutik ezabatu",
        "listgrouprights-namespaceprotection-namespace": "Izen-tartea",
+       "trackingcategories-name": "Mezuaren izena",
+       "trackingcategories-nodesc": "Ez dago deskribapenik eskuragarri.",
        "trackingcategories-disabled": "Kategoria desgaitua dago",
        "mailnologin": "Bidalketa helbiderik ez",
        "mailnologintext": "Beste erabiltzaileei e-posta mezuak bidaltzeko [[Special:UserLogin|saioa hasi]] eta baliozko e-posta helbidea behar duzu izan zure [[Special:Preferences|hobespenetan]].",
        "wlheader-showupdated": "Bisitatu zenituen azken alditik aldaketak izan dituzten orrialdeak '''beltzez''' nabarmenduta daude.",
        "wlnote": "Jarraian {{PLURAL:$2|ikus daiteke azken orduko|ikus daitezke azken '''$2''' orduetako}} azken {{PLURAL:$1|aldaketa|'''$1''' aldaketak}}, $3, $4 gisa.",
        "wlshowlast": "Erakutsi azken $1 orduak, azken $2 egunak",
+       "watchlistall2": "guztia",
+       "watchlist-hide": "Ezkutatu",
+       "wlshowtime": "Erakutsi azkenak:",
+       "wlshowhideminor": "aldaketa txikiak",
+       "wlshowhidebots": "bot-ak",
+       "wlshowhideliu": "Erregistratutako erabiltzaileak",
+       "wlshowhideanons": "erabiltzaile anonimoak",
+       "wlshowhidepatr": "Patruilatutako aldaketak",
+       "wlshowhidemine": "nire edizioak",
        "watchlist-options": "Jarraitze-zerrendaren aukerak",
        "watching": "Zerrendan gehitzen...",
        "unwatching": "Zerrendatik kentzen...",
        "deletecomment": "Arrazoia:",
        "deleteotherreason": "Arrazoi gehigarria:",
        "deletereasonotherlist": "Beste arrazoi bat",
-       "deletereason-dropdown": "*Ezabatzeko ohiko arrazoiak\n** Egileak eskatuta\n** Egile eskubideak urratzea\n** Bandalismoa",
+       "deletereason-dropdown": "*Ezabatzeko ohiko arrazoiak\n** Egileak eskatuta\n** Egile eskubideak urratzea\n** Bandalismoa\n** Hautsitako birzuzenketa \n** Spama",
        "delete-edit-reasonlist": "Ezabaketa arrazoiak aldatu",
        "delete-toobig": "Orrialde honek aldaketa historia luzea du, {{PLURAL:$1|berrikuspen batetik|$1 berrikuspenetik}} gorakoa.\nOrrialde horien ezabaketa mugatua dago {{SITENAME}}n ezbeharrak saihesteko.",
        "delete-warning-toobig": "Orrialde honek aldaketa historia luzea du, {{PLURAL:$1|berrikuspen batetik|$1 berrikuspenetik}} gorakoa.\nEzabatzeak ezbeharrak eragin ditzake {{SITENAME}}ren datu-basean;\nkontu izan.",
        "protect-othertime": "Beste denbora:",
        "protect-othertime-op": "beste denbora",
        "protect-existing-expiry": "Iraungitze ordua: $2, $3",
+       "protect-existing-expiry-infinity": "Oraingo iraungitze denbora: infinitoa",
        "protect-otherreason": "Bestelako arrazoiak (edo gehigarriak):",
        "protect-otherreason-op": "Bestelako arrazoiak",
        "protect-dropdown": "*Babesteko arrazoi ohikoenak\n** Gehiegizko bandalismoa\n** Gehiegizko spama\n** Produkzioaren aurkakoa den edizio gerra\n** Trafiko handiko orrialdea",
        "undelete-show-file-submit": "Bai",
        "namespace": "Izen-tartea:",
        "invert": "Hautapena alderanztu",
+       "tooltip-invert": "Egin klik kutxa honetan zuk aukeratutako izentartean egindako aldaketak ezkutatzeko (eta lotutako izen tartea klik egiten baduzu)",
        "namespace_association": "Lotutako izen-tartea",
+       "tooltip-namespace_association": "Klik egin kutxa honetan aukeratutako izentartearekin lotutako gaia edo eztabaida orriak sartzeko.",
        "blanknamespace": "(Nagusia)",
        "contributions": "{{GENDER:$1|Lankidearen}} ekarpenak",
        "contributions-title": "$1(r)entzat lankidearen ekarpenak",
        "mycontris": "Ekarpenak",
+       "anoncontribs": "Ekarpenak",
        "contribsub2": "{{GENDER:$3|$1(r)entzat}} ($2)",
+       "contributions-userdoesnotexist": "\"$1\" erabiltzaile-kontua ez dago erregistraturik.",
        "nocontribs": "Ez da ezaugarri horiekin bat datorren aldaketarik aurkitu.",
        "uctop": "(azken aldaketa)",
        "month": "Hilabetea (eta lehenagokoak):",
        "sp-contributions-newbies-sub": "Hasiberrientzako",
        "sp-contributions-newbies-title": "Lankideen ekarpenak lankide berrietn",
        "sp-contributions-blocklog": "Blokeaketa erregistroa",
+       "sp-contributions-suppresslog": "lankide-ekarpen ezabatuak",
        "sp-contributions-deleted": "lankide-ekarpen ezabatuak",
        "sp-contributions-uploads": "igoerak",
        "sp-contributions-logs": "erregistroak",
        "sp-contributions-talk": "eztabaida",
        "sp-contributions-userrights": "erabiltzaile-baimenen kudeaketa",
        "sp-contributions-blocked-notice": "Lankide hau une honetan blokeatuta dago.\nBlokeo erregistroa azken sarrera ematen da azpian erreferentziarako:",
+       "sp-contributions-blocked-notice-anon": "Erabiltzaile hau blokeatuta dago une honetan.\nAzken blokeoaren erregistroa ageri da behean, erreferentzia gisa:",
        "sp-contributions-search": "Ekarpenentzako bilaketa",
        "sp-contributions-username": "IP helbidea edo erabiltzaile izena:",
        "sp-contributions-toponly": "Azken aldaketak direnak soilik erakutsi",
        "autoblockid": "Blokeo automatikoa #$1",
        "block": "Blokeatu erabiltzailea",
        "unblock": "Erabiltzailea desblokeatu",
-       "blockip": "Blokeatu erabiltzailea",
+       "blockip": "Blokeatu {{GENDER:$1|erabiltzailea}}",
        "blockip-legend": "Blokeatu erabiltzailea",
        "blockiptext": "IP helbide edo erabiltzaile izen bati idazketa baimenak kentzeko beheko formularioa erabil dezakezu. Ekintza hau bandalismoa saihesteko baino ez da burutu behar, eta beti ere [[{{MediaWiki:Policy-url}}|politikak]] errespetatuz. Blokeoaren arrazoi bat ere zehaztu ezazu (adibidez, orrialde batzuk zehaztuz).",
        "ipaddressorusername": "IP Helbidea edo erabiltzaile izena",
        "unblocked": "[[User:$1|$1]] desblokeatu egin da",
        "unblocked-range": "$1 desblokeatuta izan da.",
        "unblocked-id": "$1 blokeaketa ezabatu da",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] desblokeatua izan da.",
        "blocklist": "Blokeatutako erabiltzaileak",
        "ipblocklist": "Blokeatutako erabiltzaileak",
        "ipblocklist-legend": "Blokeatutako erabiltzaile bat bilatu",
        "articleexists": "Izen hori duen artikulu bat badago edo hautatutako izena ez da baliozkoa. Mesedez, beste izen bat aukeratu.",
        "cantmove-titleprotected": "Ezin duzu orrialde bat leku honetara mugitu izenburu berri hori sor ez dadin babesa duelako",
        "movetalk": "Eztabaida orrialdea ere mugitu, ahal bada.",
-       "move-subpages": "Azpiorrialde guztiak ($1-tik gora) mugitu",
-       "move-talk-subpages": "Azpiorrialdeen eztabaida orrialde guztiak ($1-tik gora) mugitu",
+       "move-subpages": "Mugitu azpiorri guztiak ($1 gehienez)",
+       "move-talk-subpages": "Mugitu azpiorrien eztabaida orri guztiak (gehienez $1)",
        "movepage-page-exists": "$1 orrialdea jada badago eta ezin da automatikoki gainetik idatzi.",
        "movepage-page-moved": "«$1» orria «$2» izenera aldatu da.",
        "movepage-page-unmoved": "$1 orrialdea ezin da $2(e)ra mugitu.",
        "movenosubpage": "Orrialde honek ez du azpiorrialderik.",
        "movereason": "Arrazoia:",
        "revertmove": "desegin",
-       "delete_and_move": "Ezabatu eta mugitu",
        "delete_and_move_text": "== Ezabatzeko beharra ==\n\n\"[[:$1]]\" helburua existitzen da. Lekua egiteko ezabatu nahi al duzu?",
        "delete_and_move_confirm": "Bai, orrialdea ezabatu",
        "delete_and_move_reason": "[[$1]] mugitzeko ezabatu da",
        "thumbnail_gd-library": "GD liburutegiaren konfigurazio osagabea: $1 funtzioa falta da",
        "thumbnail_image-missing": "Fitxategirik ez dagoela dirudi: $1",
        "import": "Orrialdeak inportatu",
-       "importinterwiki": "Wikien arteko inportazioa",
+       "importinterwiki": "Beste wiki batetik inportatu",
        "import-interwiki-text": "Aukeratu inportatzeko wiki eta orrialde izenburu bat. Berrikuspenen datak eta egileak gorde egingo dira. Inportazio ekintza guzti hauek [[Special:Log/import|inportazio erregistroan]] gordetzen dira.",
        "import-interwiki-sourcewiki": "Jatorrizko wikia:",
        "import-interwiki-sourcepage": "Jatorrizko orria:",
        "tooltip-pt-preferences": "Nire hobespenak",
        "tooltip-pt-watchlist": "Jarraitzen dituzun orrialdeen zerrenda.",
        "tooltip-pt-mycontris": "Nire ekarpenen zerrenda",
+       "tooltip-pt-anoncontribs": "IP helbide honetatik egindako aldaketen zerrenda",
        "tooltip-pt-login": "Izen ematera gonbidatzen zaitugu.",
        "tooltip-pt-logout": "Saioa itxi",
        "tooltip-pt-createaccount": "Kontu bat sortu eta horrekin saioa hastea eskatu nahi genizuke; ez da ezinbestekoa, ordea.",
        "spambot_username": "MediaWikiren spam garbiketa",
        "spam_reverting": "$1(e)rako loturarik ez daukan azken bertsiora itzultzen",
        "spam_blanking": "Berrikuspen guztiek $1(e)rako lotura zeukaten, husten",
-       "spam_deleting": "$1(e)ra loturak dituzten errebisio guztiak ezabatzen",
+       "spam_deleting": "''$1'' webgunera loturak dituzte berrikuspen guztiek; ezabatzekoa",
        "simpleantispam-label": "Anti-spam egiaztapena.\nAtal hau <strong>ez</strong> bete!",
        "pageinfo-title": "\"$1\"(r)entzako informazioa",
        "pageinfo-not-current": "Barkatu, errebisio zaharretako informazioa eskaintzea ezinezkoa da.",
        "pageinfo-protect-cascading-yes": "Bai",
        "pageinfo-protect-cascading-from": "Serieko babesak aktibatuta. Sorburua:",
        "pageinfo-category-info": "Kategoria informazioa",
+       "pageinfo-category-total": "Erabiltzaile kopurua, guztira",
        "pageinfo-category-pages": "Orrialde kopurua",
        "pageinfo-category-subcats": "Azpikategorien zenbakia",
        "pageinfo-category-files": "Fitxategi kopurua",
        "patrol-log-page": "Patrullatze loga",
        "patrol-log-header": "Hau patruliatutako aldaketen log bat da.",
        "log-show-hide-patrol": "$1 patruilatze loga",
+       "log-show-hide-tag": "$1 etiketa erregistroa",
        "deletedrevision": "$1 berrikuspen zaharra ezabatu da",
        "filedeleteerror-short": "Errorea fitxategia ezabatzerakoan: $1",
        "filedeleteerror-long": "Erroreak gertatu dira fitxategia ezabatzerakoan:\n\n$1",
        "file-info-size-pages": "$1 × $2 pixel, fitxategi tamaina: $3, MIME mota: $4, {{PLURAL:$5|orrialde $5|$5 orrialde}}",
        "file-nohires": "Ez dago bereizmen handiagorik.",
        "svg-long-desc": "SVG fitxategia, nominaldi $1 × $2 pixel, fitxategiaren tamaina: $3",
+       "svg-long-desc-animated": "SVG fitxategi animatua, nominalki $1 × $2 pixel, fitxategiaren tamaina: $3",
        "svg-long-error": "SVG fitxategi ez baliagarria: $1",
        "show-big-image": "Jatorrizko fitxategia",
        "show-big-image-preview": "Aurreikuspen honen neurria: $1.",
        "exif-compression-6": "JPEG",
        "exif-copyrighted-true": "Copyrightduna",
        "exif-copyrighted-false": "Copyright egoera ez da ezarri",
+       "exif-photometricinterpretation-1": "Zuri-beltza (beltza 0 da)",
        "exif-photometricinterpretation-2": "GBU (RGB)",
        "exif-photometricinterpretation-6": "YCbCr",
        "exif-unknowndate": "Data ezezaguna",
        "autosumm-replace": "Orriaren edukiaren ordez, «$1» jarri da",
        "autoredircomment": "[[$1]] orrialdera birzuzentzentzen",
        "autosumm-new": "Orria sortu da. Edukia: $1",
+       "autosumm-newblank": "Orrialde zuria sortu da",
        "lag-warn-normal": "{{PLURAL:$1|segundu $1|$1 segundu}} baino berriagoak diren aldaketak ez dira zerrenda honetan agertuko.",
        "lag-warn-high": "Zerbitzariaren atzerapen handia dela eta, {{PLURAL:$1|segundu $1|$1 segundu}} baino berriagoak diren aldaketak baliteke zerrenda honetan ez azaltzea.",
        "watchlistedit-normal-title": "Jarraitze zerrenda aldatu",
        "watchlistedit-clear-submit": "Garbitu jarraipen zerrenda (Behin betiko da!)",
        "watchlistedit-clear-done": "Zure jarraipen-zerrenda garbitu da.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|Izenburu 1 kendu da|$1 izenburu kendu dira}}:",
+       "watchlistedit-too-many": " Orrialde gehiegi, hemen erakusteko.",
        "watchlisttools-clear": "Garbitu jarraipen-zerrenda",
        "watchlisttools-view": "Aldaketa garrantzitsuak ikusi",
        "watchlisttools-edit": "Zerrenda ikusi eta aldatu",
        "version-ext-colheader-license": "Lizentzia",
        "version-ext-colheader-description": "Deskribapena",
        "version-ext-colheader-credits": "Egileak",
+       "version-license-title": "$1-entzako lizentzia",
+       "version-credits-title": "$1-entzako aitorpena",
        "version-poweredby-credits": "Wiki hau '''[https://www.mediawiki.org/ MediaWiki]'''k sustatzen du (copyright © 2001-$1 $2).",
        "version-poweredby-others": "beste batzuk",
        "version-poweredby-translators": "translatewiki.net itzultzaileak",
        "version-entrypoints": "Sarrera puntuko URLa",
        "version-entrypoints-header-entrypoint": "Sarrera puntua",
        "version-entrypoints-header-url": "URL",
+       "version-libraries": "Instalatutako bibliotekak",
        "version-libraries-library": "Liburutegia",
        "version-libraries-version": "Bertsioa",
        "version-libraries-license": "Lizentzia",
        "tags-actions-header": "Ekintzak",
        "tags-active-yes": "Bai",
        "tags-active-no": "Ez",
+       "tags-source-extension": "Luzapenak definitua",
+       "tags-source-none": "Ez da gehiago erabiltzen",
        "tags-edit": "aldatu",
        "tags-delete": "ezabatu",
        "tags-activate": "aktibatu",
        "tags-deactivate": "desaktibatu",
        "tags-hitcount": "$1 {{PLURAL:$1|aldaketa|aldaketa}}",
+       "tags-manage-no-permission": "Ez duzu etiketa aldaketak kudeatzeko baimenik.",
        "tags-create-heading": "Etiketa berria sortu",
        "tags-create-tag-name": "Etiketaren izena:",
        "tags-create-reason": "Arrazoia:",
        "tags-create-submit": "Sortu",
+       "tags-create-already-exists": "\"$1\" etiketa badago.",
+       "tags-create-warnings-below": "Etiketaren sorrerarekin jarraitu nahi duzu?",
        "tags-delete-title": "Etiketa ezabatu",
+       "tags-delete-explanation-initial": "Datu-basetik \"$1\" etiketa ezabatzera zoaz",
        "tags-delete-reason": "Arrazoia:",
        "tags-delete-not-found": "\"$1\" etiketa  ez da existitzen.",
+       "tags-activate-title": "Etiketa aktibatu",
+       "tags-activate-question": "\"$1\" etiketa aktibatzear zaude.",
        "tags-activate-reason": "Arrazoia:",
+       "tags-activate-not-allowed": "Ezin izan da \"$1\" etiketa aktibatu.",
+       "tags-activate-not-found": "\"$1\" etiketa ez da existitzen.",
        "tags-activate-submit": "Aktibatu",
+       "tags-deactivate-title": "Etiketa desaktibatu",
+       "tags-deactivate-question": "\"$1\" etiketa desaktibatzear zaude.",
        "tags-deactivate-reason": "Arrazoia:",
+       "tags-deactivate-not-allowed": "Ezin izan da \"$1\" etiketa desaktibatu.",
        "tags-deactivate-submit": "Desaktibatu",
+       "tags-edit-title": "Etiketak aldatu",
+       "tags-edit-manage-link": "Etiketak kudeatu",
        "tags-edit-existing-tags": "Existitzen diren etiketak:",
+       "tags-edit-existing-tags-none": "\"Bat ere ez\"",
        "tags-edit-new-tags": "Etiketa berriak:",
        "tags-edit-add": "Gehitu etiketa hauek:",
        "tags-edit-remove": "Kendu etiketa hauek:",
        "compare-revision-not-exists": "Zehazturiko berrikuspena ez da existitzen.",
        "dberr-problems": "Barkatu! Webgune honek zailtasun teknikoak jasaten ari da.",
        "dberr-again": "Saiatu pare bat minutu itxaroten edo kargatu ezazu orrialdea berriro.",
-       "dberr-info": "($1: Ezin da datu-base zerbitzariarekin konektatu)",
-       "dberr-info-hidden": "(Ezin da konektatu datubasearen zerbitzariarekin)",
+       "dberr-info": "($1: Ezin da datu-basera konektatu)",
+       "dberr-info-hidden": "(Ezin da konektatu datu-basera)",
        "dberr-usegoogle": "Bitartean Google bidez bilatzen saiatu zintezke.",
        "dberr-outofdate": "Eduki hauek aurkibideak eguneratu gabe egon daitezke.",
        "dberr-cachederror": "Ondorengoa eskatutako orriaren katxedun kopia da, eta eguneratu gabe egon daiteke.",
        "htmlform-chosen-placeholder": "Aukeratu",
        "htmlform-cloner-create": "Gehitu gehiago",
        "htmlform-cloner-delete": "Kendu",
-       "htmlform-title-not-exists": "[[:$1]] ez da existitzen.",
+       "htmlform-title-not-creatable": "\"$1\" ez da sor daitekeen orrialde baten izenburua",
+       "htmlform-title-not-exists": "$1 ez da existitzen.",
+       "htmlform-user-not-exists": "<strong>$1</strong> ez da existitzen.",
+       "htmlform-user-not-valid": "<strong>$1</strong> erabiltzaile izena ezin da erabili.",
        "sqlite-has-fts": "$1 testu osoan bilatzeko laguntzarekin",
        "sqlite-no-fts": "$1 testu osoan bilatzeko laguntzarik gabe",
        "logentry-delete-delete": "$1 {{GENDER:$2|wikilariak}} «$3» orria ezabatu du",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe",
        "logentry-move-move_redir": "$1 {{GENDER:$2|wikilariak}} «$3» orria «$4» izenera aldatu du, birzuzenketaren gainetik",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:wikilariak}} «$3» orria «$4» izenera aldatu du, birbideratze bat gainidatzita, birbideratzerik utzi gabe",
-       "logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuzpena patruilatutzat {{GENDER:$2|markatu}} du",
+       "logentry-patrol-patrol": "$1(e)k $3 orrialdearen $4 berrikuspena patruilatutzat {{GENDER:$2|markatu}} du",
        "logentry-newusers-newusers": "$1 erabiltzaile kontua sortu da",
        "logentry-newusers-create": "$1 erabiltzaile kontua {{GENDER:$2|sortu da}}",
        "logentry-newusers-create2": "$1 wikilariak $3 erabiltzaile kontua sortu du",
        "logentry-upload-upload": "$1(e)k $3 {{GENDER:$2|igo du}}",
+       "log-name-tag": "Etiketen erregistroa",
        "rightsnone": "(bat ere ez)",
        "revdelete-summary": "aldaketaren laburpena",
        "feedback-adding": "Orriari feedbacka gehitzen...",
        "feedback-bugnew": "Txekeatu dut. Bug berria bidaliko",
        "feedback-cancel": "Utzi",
        "feedback-close": "Egina",
+       "feedback-dialog-title": "Feedbacka bidali",
        "feedback-error-title": "Errorea",
        "feedback-error1": "Akatsa: APIaren emaitza ez ezagunak",
        "feedback-error2": "Akatsa: Aldaketa ez da egin",
        "duration-centuries": "{{PLURAL:$1|Mende $1|$1 mende}}",
        "duration-millennia": "{{PLURAL:$1|Milurteko $1|$1 milurteko}}",
        "rotate-comment": "Irudia erlojuaren norantzan {{PLURAL:$1|gradu 1|$1 gradu}} biratua izan da",
+       "limitreport-title": "Parser profilaren datuak:",
        "limitreport-cputime": "CPU denbora erabilpena",
        "limitreport-cputime-value": "{{PLURAL:$1|Segundu $1|$1 segundu}}",
        "limitreport-walltime": "Denbora errealeko erabilpena",
        "expand_templates_input": "Sarrerako testua:",
        "expand_templates_output": "Emaitza",
        "expand_templates_xml_output": "XML irteera",
+       "expand_templates_html_output": "HTML irteera gordina",
        "expand_templates_ok": "Ados",
        "expand_templates_remove_comments": "Iruzkinak kendu",
        "expand_templates_remove_nowiki": "Ezabatu <nowiki> etiketen emaitzak",
        "expand_templates_generate_xml": "Erakutsi XML parse zuhaitza",
+       "expand_templates_generate_rawhtml": "Erakutsi HTML gordina",
        "expand_templates_preview": "Aurreikusi",
        "pagelanguage": "Orriaren hizkuntza aukeratu",
        "pagelang-name": "Orria",
        "log-name-pagelang": "Hizkuntza aldatu:",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (gaituta)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desgaituta''')",
+       "mediastatistics": "Media estatistikak",
+       "mediastatistics-summary": "Igotako fitxategien estatistikak. Hemen ikus daitekeena fitxategiaren azken bertsioa baino ez da. Fitxategiaren bertsio zahar edo ezabatuak kanpo daude.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 byte}} ($2; %$3)",
        "mediastatistics-table-mimetype": "MIME mota",
+       "mediastatistics-table-extensions": "Luzapen posibleak",
        "mediastatistics-table-count": "Fitxategi kopurua",
+       "mediastatistics-table-totalbytes": "Konbinatuta tamaina",
        "mediastatistics-header-unknown": "Ezezaguna",
        "mediastatistics-header-bitmap": "Bit-mapako irudiak",
        "mediastatistics-header-drawing": "Marrazkiak (irudi bektorialak)",
        "mediastatistics-header-audio": "Audioa",
        "mediastatistics-header-video": "Bideoak",
+       "mediastatistics-header-multimedia": "Media aberatsa",
        "mediastatistics-header-office": "Bulego",
+       "mediastatistics-header-text": "Testuala",
+       "mediastatistics-header-executable": "Exekutagarriak",
+       "mediastatistics-header-archive": "Formatu konprimatuak",
        "json-error-syntax": "Sintaxi-errorea",
+       "headline-anchor-title": "Lotura sekzio honetara",
        "special-characters-group-latin": "Latina",
        "special-characters-group-latinextended": "Latin hedatua",
        "special-characters-group-ipa": "NAF",
        "special-characters-group-greek": "Greziera",
        "special-characters-group-cyrillic": "Zirilikoa",
        "special-characters-group-arabic": "Arabiera",
+       "special-characters-group-arabicextended": "Arabiera hedatua",
        "special-characters-group-persian": "Persiera",
        "special-characters-group-hebrew": "Hebreera",
        "special-characters-group-bangla": "Bangla",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Sinhala",
        "special-characters-group-gujarati": "Guajarati",
+       "special-characters-group-devanagari": "Devanagari",
        "special-characters-group-thai": "Thaiera",
        "special-characters-group-lao": "Laosera",
        "special-characters-group-khmer": "Khmerrera",
+       "special-characters-title-endash": "en lerroa",
+       "special-characters-title-emdash": "em lerroa",
        "special-characters-title-minus": "minus zeinua",
-       "mw-widgets-dateinput-no-date": "Ez duzu datarik aukeratu"
+       "mw-widgets-dateinput-no-date": "Ez duzu datarik aukeratu",
+       "mw-widgets-titleinput-description-new-page": "orri hori oraindik ez da existitzen",
+       "mw-widgets-titleinput-description-redirect": "$1ra birzuzendu",
+       "api-error-blacklisted": "Aukera ezazu, mesedez, izenburu ezberdin eta deskriptiboago bat."
 }
index f3701af..31f96ed 100644 (file)
                ]
        },
        "tog-underline": "خط کشیدن زیر پیوندها:",
-       "tog-hideminor": "تغییرات جزئی از فهرست تغییرات اخیر پنهان شوند",
-       "tog-hidepatrolled": "ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر پنهان شوند",
-       "tog-newpageshidepatrolled": "صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه پنهان شوند",
-       "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط آخرین‌ها",
-       "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحات تغییرات اخیر و فهرست پیگیری‌ها",
+       "tog-hideminor": "نهفتن تغییرات جزئی از فهرست تغییرات اخیر",
+       "tog-hidepatrolled": "نهفتن ویرایش‌های گشت‌خورده از فهرست تغییرات اخیر",
+       "tog-newpageshidepatrolled": "نهفتن صفحه‌های گشت‌خورده از فهرست صفحه‌های تازه",
+       "tog-hidecategorization": "نهفتن رده‌بندی صفحه‌ها",
+       "tog-extendwatchlist": "گسترش فهرست پیگیری‌ها برای نمایش همهٔ تغییرات، نه فقط جدیدترین‌ها",
+       "tog-usenewrc": "گروه‌بندی تغییرات بر پایهٔ صفحه‌ در تغییرات اخیر و فهرست پیگیری‌ها",
        "tog-numberheadings": "شماره‌گذاری خودکار عنوان‌ها",
-       "tog-showtoolbar": "نوار ابزار ویرایش نمایش یابد",
+       "tog-showtoolbar": "نامیش نوار ابزار ویرایش",
        "tog-editondblclick": "ویرایش صفحات با دو کلیک",
        "tog-editsectiononrightclick": "فعال کردن ویرایش بخش‌ها با کلیک راست روی عنوان بخش‌ها",
-       "tog-watchcreations": "صÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\85Û\8câ\80\8cسازÙ\85 Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û\8c Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8cÙ\85 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
-       "tog-watchdefault": "صÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\88Û\8cراÛ\8cØ´ Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8cÙ\85 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
-       "tog-watchmoves": "صÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\85Ù\86تÙ\82Ù\84 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8cÙ\85 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
-       "tog-watchdeletion": "صÙ\81حات Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø­Ø°Ù\81 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8cÙ\85 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
-       "tog-watchrollback": "صÙ\81حاتÛ\8c Ú©Ù\87 Ù\88اگرداÙ\86Û\8c Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8cÙ\85 Ø§Ù\81زÙ\88دÙ\87 Ø´Ù\88د",
-       "tog-minordefault": "همهٔ ویرایش‌ها به طور پیش‌فرض به عنوان «جزئی» علامت بخورد",
-       "tog-previewontop": "Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ù\82بÙ\84 Ø§Ø² Ø¬Ø¹Ø¨Ù\87Ù\94 Ù\88Û\8cراÛ\8cØ´ Ù\86Ù\85اÛ\8cØ´ Û\8cابد",
-       "tog-previewonfirst": "Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ù\87Ù\86گاÙ\85 Ø§Ù\88Ù\84Û\8cÙ\86 Ù\88Û\8cراÛ\8cØ´ Ù\86Ù\85اÛ\8cØ´ Û\8cابد",
+       "tog-watchcreations": "اÙ\81زÙ\88دÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\85Û\8câ\80\8cسازÙ\85 Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û\8c Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
+       "tog-watchdefault": "اÙ\81زÙ\88دÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\88Û\8cراÛ\8cØ´ Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
+       "tog-watchmoves": "اÙ\81زÙ\88دÙ\86 ØµÙ\81Ø­Ù\87â\80\8cÙ\87ا Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ù\85Ù\86تÙ\82Ù\84 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
+       "tog-watchdeletion": "اÙ\81زÙ\88دÙ\86 ØµÙ\81حات Ù\88 Ù¾Ø±Ù\88Ù\86دÙ\87â\80\8cÙ\87اÛ\8cÛ\8c Ú©Ù\87 Ø­Ø°Ù\81 Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
+       "tog-watchrollback": "اÙ\81زÙ\88دÙ\86 ØµÙ\81حاتÛ\8c Ú©Ù\87 Ù\88اگرداÙ\86Û\8c Ù\85Û\8câ\80\8cÚ©Ù\86Ù\85 Ø¨Ù\87 Ù\81Ù\87رست Ù¾Û\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86",
+       "tog-minordefault": "علامت زدن همهٔ ویرایش‌ها به عنوان «جزئی» به طور پیش‌فرض",
+       "tog-previewontop": "Ù\86Ù\85اÛ\8cØ´ Ø¯Ø§Ø¯Ù\86 Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ø¨Ø§Ù\84اÛ\8c Ø¬Ø¹Ø¨Ù\87Ù\94 Ù\88Û\8cراÛ\8cØ´",
+       "tog-previewonfirst": "Ù\86Ù\85اÛ\8cØ´ Ø¯Ø§Ø¯Ù\86 Ù¾Û\8cØ´â\80\8cÙ\86Ù\85اÛ\8cØ´ Ù\87Ù\86گاÙ\85 Ø§Ù\88Ù\84Û\8cÙ\86 Ù\88Û\8cراÛ\8cØ´",
        "tog-enotifwatchlistpages": "اگر صفحه یا پرونده‌ای از فهرست پی‌گیری‌هایم ویرایش شد به من ایمیلی فرستاده شود",
        "tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من ایمیلی فرستاده شود",
-       "tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من ایمیل فرستاده شود",
-       "tog-enotifrevealaddr": "آدرس ایمیل من را در ایمیل‌های اطلاع‌رسانی نمایش یابد",
+       "tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من ایمیلی فرستاده شود",
+       "tog-enotifrevealaddr": "نشانی پست الکترونیکی من را در ایمیل‌های اطلاع‌رسانی هویدا گردد",
        "tog-shownumberswatching": "شمار کاربران پی‌گیرندهٔ نمایش یابد",
        "tog-oldsig": "امضای کنونی:",
        "tog-fancysig": "امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)",
        "tog-uselivepreview": "استفاده از پیش‌نمایش زنده",
        "tog-forceeditsummary": "هنگامی که خلاصهٔ ویرایش ننوشته‌ام به من اطلاع داده شود",
-       "tog-watchlisthideown": "ویرایش‌های خودم در فهرست پی‌گیری‌ها پنهان شود",
-       "tog-watchlisthidebots": "ویرایش‌های ربات‌ها در فهرست پی‌گیری‌ها پنهان شود",
-       "tog-watchlisthideminor": "ویرایش‌های جزئی در فهرست پی‌گیری‌ها پنهان شود",
-       "tog-watchlisthideliu": "ویرایش‌های کاربران وارد شده به سامانه در فهرست پی‌گیری‌ها پنهان شود",
-       "tog-watchlisthideanons": "ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌های من پنهان شود",
-       "tog-watchlisthidepatrolled": "ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها پنهان شود",
+       "tog-watchlisthideown": "نهفتن ویرایش‌های خودم در فهرست پی‌گیری‌ها",
+       "tog-watchlisthidebots": "نفتهن ویرایش‌های ربات‌ها در فهرست پی‌گیری‌ها",
+       "tog-watchlisthideminor": "نهفتن ویرایش‌های جزئی در فهرست پی‌گیری‌ها",
+       "tog-watchlisthideliu": "نفهتن ویرایش‌های کاربران وارد شده به سامانه در فهرست پی‌گیری‌ها",
+       "tog-watchlisthideanons": "نهفتن ویرایش‌های کاربران ناشناس در فهرست پی‌گیری‌ها",
+       "tog-watchlisthidepatrolled": "نهفتن ویرایش‌های گشت‌خورده در فهرست پی‌گیری‌ها",
+       "tog-watchlisthidecategorization": "نهفتن رده‌بندی صفحه‌ها",
        "tog-ccmeonemails": "رونوشتی از ایمیلی که به دیگران ارسال می‌کنم برای خودم هم فرستاده شود",
        "tog-diffonly": "محتوای صفحه، زیر تفاوت نمایش داده نشود",
-       "tog-showhiddencats": "رده‌های پنهان نمایش داده شود",
-       "tog-norollbackdiff": "بعد از واگردانی تفاوت نشان داده نشود",
+       "tog-showhiddencats": "نمایش رده‌های پنهان",
+       "tog-norollbackdiff": "بعد از واگردانی، تفاوت نشان داده نشود",
        "tog-useeditwarning": "زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود",
        "tog-prefershttps": "در حالت ورود به سامانه همواره از اتصال امن استفاده شود",
        "underline-always": "همیشه",
        "underline-never": "هرگز",
-       "underline-default": "پوسته یا مرورگر پیش‌فرض",
+       "underline-default": "پیش‌فرض پوسته یا مرورگر",
        "editfont-style": "سبک قلم جعبهٔ ویرایش:",
        "editfont-default": "پیش‌فرض مرورگر",
        "editfont-monospace": "قلم با فاصلهٔ ثابت",
        "morenotlisted": "این فهرست کامل نیست.",
        "mypage": "صفحه",
        "mytalk": "بحث",
-       "anontalk": "بحث درباره این نشانی آی‌پی",
+       "anontalk": "بحث",
        "navigation": "ناوبری",
        "and": "&#32;و",
        "qbfind": "یافتن",
        "views": "بازدیدها",
        "toolbox": "ابزارها",
        "userpage": "نمایش صفحهٔ کاربر",
-       "projectpage": "دیدن صفحهٔ پروژه",
+       "projectpage": "نمایش صفحهٔ پروژه",
        "imagepage": "نمایش صفحهٔ پرونده",
        "mediawikipage": "نمایش صفحهٔ پیغام",
        "templatepage": "نمایش صفحهٔ الگو",
        "otherlanguages": "به زبان‌های دیگر",
        "redirectedfrom": "(تغییرمسیر از $1)",
        "redirectpagesub": "صفحهٔ تغییرمسیر",
-       "redirectto": "تغییر مسیر به:",
+       "redirectto": "تغییرمسیر به:",
        "lastmodifiedat": "این صفحه آخرین‌بار در $1 ساعت $2 تغییر یافته‌است.",
        "viewcount": "از این صفحه {{PLURAL:$1|یک‌بار|$1بار}} بازدید شده‌است.",
        "protectedpage": "صفحهٔ محافظت‌شده",
        "missingarticle-rev": "(شمارهٔ نسخه: $1)",
        "missingarticle-diff": "(تفاوت: $1، $2)",
        "readonly_lag": "پایگاه داده به طور خودکار قفل شده‌است تا نسخه‌های پشتیبان با نسخهٔ اصلی هماهنگ شوند",
+       "nonwrite-api-promise-error": "سرآیند اچ‌تی‌تی‌پی 'Promise-Non-Write-API-Action' ارسال شد ولی درخواست به یک رابط برنامه‌نویسی پودمان نوشتن بود.",
        "internalerror": "خطای داخلی",
        "internalerror_info": "خطای داخلی: $1",
        "internalerror-fatal-exception": "نوع استثنای مخرب \"$1\"",
        "viewsource": "نمایش مبدأ",
        "viewsource-title": "نمایش مبدأ برای $1",
        "actionthrottled": "جلوی عمل شما گرفته شد",
-       "actionthrottledtext": "بÙ\87 Ù\85Ù\86ظÙ\88ر Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø§Ø² Ø§Ù\86تشار Ø§Ø³Ù¾Ù\85، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.\nلطفاً پس از چند دقیقه دوباره تلاش کنید.",
+       "actionthrottledtext": "بÙ\87 Ù\85Ù\86ظÙ\88ر Ø¬Ù\84Ù\88Ú¯Û\8cرÛ\8c Ø§Ø² Ø§Ù\86تشار Ø®Ø±Ø§Ø¨Ú©Ø§Ø±Û\8c، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.\nلطفاً پس از چند دقیقه دوباره تلاش کنید.",
        "protectedpagetext": "این صفحه برای جلوگیری از ویرایش یا فعالیت دیگر محافظت شده‌است.",
        "viewsourcetext": "می‌توانید متن مبدأ این صفحه را مشاهده کنید یا از آن نسخه بردارید:",
        "viewyourtext": "می‌توانید کد مبدأ <strong>ویرایش‌هایتان</strong> در این صفحه را ببینید و کپی کنید.",
        "createaccountreason": "دلیل:",
        "createacct-reason": "دلیل",
        "createacct-reason-ph": "چرا شما حساب دیگری می‌سازید؟",
-       "createacct-captcha": "بررسی امنیتی",
-       "createacct-imgcaptcha-ph": "متن تصویری که در بالا می‌بینید، وارد کنید",
        "createacct-submit": "حسابتان را بسازید",
        "createacct-another-submit": "ایجاد حساب کاربری",
        "createacct-benefit-heading": "{{SITENAME}} توسط افرادی مانند شما ساخته شده است",
        "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\nشما باید هم‌اکنون ثبت ورود کنید و گذرواژه‌ای جدید برگزینید. اگر فکر می‌کنید شخص دیگری این درخواست را داده است یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "passwordreset-emailtext-user": "کاربر $1 از {{SITENAME}} درخواست بازنشانی گذرواژهٔ شما در {{SITENAME}} ($4) را کرده است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط است:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} تا {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.\nشما باید هم‌اکنون وارد شده و یک گذرواژهٔ جدید برگزینید. اگر شخص دیگری این درخواست را داده است، یا اگر گذرواژهٔ اصلی‌تان را به خاطر آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
        "passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
-       "passwordreset-emailsent": "یک نامهٔ بازنشانی گذرواژه فرستاده شده‌است.",
+       "passwordreset-emailsentemail": "اگر نشانی پست الکترونیکی که وارد کردید برای حساب کاربریتان ثبت شده باشد، یک نامهٔ بازنشانی گذرواژه به آن فرستاده می‌شود.",
        "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
        "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
        "changeemail": "تغییر یا حذف نشانی ایمیل",
-       "changeemail-header": "تغییر آدرس ایمیل حساب کاربری",
+       "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
+       "changeemail-passwordrequired": "برای تائید این تغییر باید گذرواژه‌تان را وارد کنید.",
        "changeemail-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
        "changeemail-oldemail": "آدرس ایمیل کنونی:",
        "changeemail-newemail": "آدرس ایمیل جدید:",
+       "changeemail-newemail-help": "برای حذف ایمیل باید این بخش را خالی رها کنید در نتیجه امکان بازگردانی گذرواژه و دریافت ایمیل از ویکی برای شما مقدور نخواهد بود.",
        "changeemail-none": "(هیچ)",
        "changeemail-password": "گذرواژهٔ {{SITENAME}} شما:",
        "changeemail-submit": "تغییر ایمیل",
        "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی \"{{int:savearticle}}\" دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
        "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
-       "missingcommentheader": "'''یادآوری:''' شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
        "summary-preview": "پیش‌نمایش خلاصه:",
-       "subject-preview": "پیش‌نمایش موضوع/عنوان:",
+       "subject-preview": "پیش‌نمایش موضوع:",
        "previewerrortext": "در زمان تلاش برای نمایش دادن تغییرات شما، خطای رخ داد.",
        "blockedtitle": "کاربر بسته شده‌است",
        "blockedtext": "<strong>دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.</strong>\n\nاین قطع دسترسی توسط $1 انجام شده است.\nدلیل ارائه‌شده چنین است: <em>$2</em>\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
        "permissionserrors": "خطای سطح دسترسی",
        "permissionserrorstext": "شما اجازهٔ انجام این کار را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
        "permissionserrorstext-withaction": "شما اجازهٔ $2 را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
+       "contentmodelediterror": "امکان ویرایش این نسخه برای شما نیست چون نوع محتوای آن <code>$1</code> است و نوع محتوای کنونی صفحه <code>$2</code> است.",
        "recreate-moveddeleted-warn": "<strong>هشدار: شما در حال ایجاد صفحه‌ای هستید که قبلاً حذف شده‌است.</strong>\n\nدر نظر داشته باشید که آیا ادامهٔ ویرایش این صفحه کار درستی‌است یا نه.\nسیاههٔ حذف و انتقال این صفحه در زیر نشان داده شده‌است:",
        "moveddeleted-notice": "این صفحه حذف شده‌است.\nدر زیر سیاههٔ حذف و انتقال این صفحه نمایش داده شده‌است.",
        "moveddeleted-notice-recent": "متاسفانه صفحه قبلا حذف شده‌است (در ۲۴ ساعت اخیر) \nدلیل حذف و سیاههٔ انتقال در پائین موجود است.",
        "showingresultsinrange": "نمایش در پائین تا {{PLURAL:$1|<strong>1</strong> نتیجه|<strong>$1</strong> نتیجه}} در محدودهٔ #<strong>$2</strong> تا #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|نتایج <strong>$1</strong> از <strong>$3</strong>|نتایج <strong>$1 - $2</strong> از <strong>$3</strong>}}",
        "search-nonefound": "نتیجه‌ای منطبق با درخواست پیدا نشد.",
+       "search-nonefound-thiswiki": "نتیجه‌ای منطبق با این درخواست در این وب‌گاه موجود نبود.",
        "powersearch-legend": "جستجوی پیشرفته",
        "powersearch-ns": "جستجو در فضاهای نام:",
        "powersearch-togglelabel": "بررسی:",
        "prefs-help-recentchangescount": "این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.",
        "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پی‌گیری‌های شماست.\nهرکس آن را بداند می‌تواند فهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].",
        "savedprefs": "ترجیحات شما ذخیره شد.",
+       "savedrights": "دسترسی کاربری {{GENDER:$1|$1}} ذخیره شده‌است.",
        "timezonelegend": "منطقهٔ زمانی:",
        "localtime": "زمان محلی:",
        "timezoneuseserverdefault": "استفاده از پیش‌فرض ویکی ($1)",
        "prefs-help-prefershttps": "تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.",
        "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
        "prefs-tabs-navigation-hint": "نکته: شما می توانید از کلیدهای جهت‌نمای چپ و راست برای حرکت بین زبانه‌ها در فهرست زبانه‌ها استفاده کنید.",
-       "email-address-validity-valid": "آدرس ایمیل معتبر به نظر می‌رسد",
-       "email-address-validity-invalid": "آدرس ایمیل معتبر وارد کنید",
        "userrights": "مدیریت اختیارات کاربر",
        "userrights-lookup-user": "مدیریت گروه‌های کاربری",
        "userrights-user-editname": "یک نام کاربری وارد کنید:",
        "group-bot": "ربات‌ها",
        "group-sysop": "مدیران",
        "group-bureaucrat": "دیوان‌سالاران",
-       "group-suppress": "Ù¾Ù\86Ù\87اÙ\86گران",
+       "group-suppress": "Ù\81رÙ\88Ù\86شاÙ\86Ù\86دگان",
        "group-all": "(همه)",
        "group-user-member": "{{GENDER:$1|کاربر}}",
        "group-autoconfirmed-member": "{{GENDER:$1|کاربر تأییدشده}}",
        "group-bot-member": "ربات",
        "group-sysop-member": "{{GENDER:$1|مدیر}}",
        "group-bureaucrat-member": "{{GENDER:$1|دیوان‌سالار}}",
-       "group-suppress-member": "{{GENDER:$1|Ù¾Ù\86Ù\87اÙ\86گر}}",
+       "group-suppress-member": "{{GENDER:$1|Ù\81رÙ\88Ù\86شاÙ\86Ù\86دÙ\87}}",
        "grouppage-user": "{{ns:project}}:کاربران",
        "grouppage-autoconfirmed": "{{ns:project}}:کاربران تأییدشده",
        "grouppage-bot": "{{ns:project}}:ربات‌ها",
        "grouppage-sysop": "{{ns:project}}:مدیران",
        "grouppage-bureaucrat": "{{ns:project}}:دیوان‌سالاران",
-       "grouppage-suppress": "{{ns:project}}:Ù¾Ù\86Ù\87اÙ\86گر",
+       "grouppage-suppress": "{{ns:project}}:Ù\81رÙ\88Ù\86شاÙ\86Û\8c",
        "right-read": "خواندن صفحه",
        "right-edit": "ویرایش صفحه",
        "right-createpage": "ایجاد صفحه (در مورد صفحه‌های غیر بحث)",
        "right-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صفحات را اضافه می‌کنند.",
        "right-viewmyprivateinfo": "داده‌های خصوصی خود را ببینید (مانند آدرس ایمیل و نام واقعی)",
        "right-editmyprivateinfo": "داده‌های خصوصی خود را ویرایش کنید (مانند آدرس ایمیل و نام واقعی)",
-       "right-editmyoptions": "ترجیحات خود را ویرایش",
+       "right-editmyoptions": "ویرایش ترجیحات خود",
        "right-rollback": "واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است",
        "right-markbotedits": "علامت زدن ویرایش‌های واگردانی‌شده به عنوان ویرایش ربات",
        "right-noratelimit": "تاثیر نپذیرفتن از محدودیت سرعت",
        "recentchanges-legend-heading": "'''اختصارها:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
        "recentchanges-legend-plusminus": "(<em>±۱۲۳</em>)",
+       "recentchanges-submit": "نمایش",
        "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
        "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
        "rcshowhideminor": "$1 ویرایش‌های جزئی",
        "rcshowhidemine": "$1 ویرایش‌های من",
        "rcshowhidemine-show": "نمایش",
        "rcshowhidemine-hide": "نهفتن",
+       "rcshowhidecategorization": "$1 رده‌بندی صفحه‌ها",
+       "rcshowhidecategorization-show": "نمایش",
+       "rcshowhidecategorization-hide": "نهفتن",
        "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
        "diff": "تفاوت",
        "hist": "تاریخچه",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر به رده اضافه شدند",
        "recentchanges-page-removed-from-category": "[[:$1]] از رده حذف شد",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر از رده حذف شدند",
+       "autochange-username": "تغییرات خودکار مدیاویکی",
        "upload": "بارگذاری پرونده",
        "uploadbtn": "بارگذاری پرونده",
        "reuploaddesc": "بازگشت به فرم بارگذاری",
        "upload-options": "گزینه‌های بارگذاری",
        "watchthisupload": "پی‌گیری این پرونده",
        "filewasdeleted": "پرونده‌ای با همین نام پیشتر بارگذاری و پس از آن پاک شده‌است.\nشما باید $1 را قبل از بارگذاری مجدد آن ببینید.",
+       "filename-thumb-name": "به نظر می رسد که عنوان thumbnail است. لطفاً تصویر thumbnail  از دیگر ویکی‌ها را بارگذاری نکنید. عنوان پرونده را اصلاح کنید به صورتی که پیشوند thumbnail نداشته باشد.",
        "filename-bad-prefix": "نام پرونده‌ای که بارگذاری می‌کنید با '''$1''' آغاز می‌شود که یک پیشوند مخصوص تصاویر ثبت شده توسط دوربین‌های دیجیتال است.\nلطفاً نامی بهتر برای پرونده برگزینید.",
        "upload-success-subj": "بارگذاری با موفقیت انجام شد",
        "upload-success-msg": "بارگذاری شما از [$2] موفق بود. این پرونده در اینجا قابل دسترسی است: [[:{{ns:file}}:$1]]",
        "foreign-structured-upload-form-label-own-work": "این کار خودم است",
        "foreign-structured-upload-form-label-infoform-categories": "رده‌ها",
        "foreign-structured-upload-form-label-infoform-date": "تاریخ",
+       "foreign-structured-upload-form-label-own-work-message-local": "تائید می کنم که این پرونده را تحت مجوزها و سیاست‌های {{SITENAME}} بارگذاری می‌کنم.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "اگر امکان بارگذاری پرونده تحت سیاست‌های {{SITENAME}} را ندارید، لطفاً این پنجره را ببندید و از روش‌های دیگر استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "ممکن بخواهید از [[Special:Upload|پنجرهٔ بارگذاری پیش‌فرض]] استفاده کنید.",
+       "foreign-structured-upload-form-label-own-work-message-default": "متوجهم که این پرونده را بر روی مخزن مشترک بارگذاری می‌کنم و تائید می‌کنم که تحت سیاست‌ها و مجوزهای آنجا عمل می‌کنم.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "اگر امکان بارگذاری پرونده تحت سیاست‌ها و مجوزهای مخزن اشتراک‌گذاری را ندارید، لطفاً این پنجره را ببندید و از روش‌های دیگر استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "در صورتی که نمی‌شود پرونده را تحت سیاست‌ها بارگذاری کنید ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "تصدیق می‌کنم که مالک حق تکثیر این پرونده هستم و موافق اشتراک‌گذاری آن تحت مجوز [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] هستم و موافق [https://wikimediafoundation.org/wiki/Terms_of_Use سیاست نحوهٔ استفاده] هستم.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "اگر مالک حق تکثیر این پرونده نیستید یا قصد بارگذاری تحت مجوز دیگری دارید، از [https://commons.wikimedia.org/wiki/Special:UploadWizard جادوگر بارگذاری ویکی‌انبار] استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "در صورتی که سایت امکان بارگذاری پرونده را تحت سیاست‌ها بارگذاری می‌دهد ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
        "backend-fail-stream": "نمی‌توان پروندهٔ $1 را ارسال کرد.",
        "backend-fail-backup": "نمی‌توان نسخهٔ پشتیبان برای پروندهٔ $1 ایجاد کرد.",
        "backend-fail-notexists": "پروندهٔ $1 وجود ندارد.",
        "mostrevisions": "صفحه‌های دارای بیشترین نسخه",
        "prefixindex": "تمام صفحات با پیشوند",
        "prefixindex-namespace": "همهٔ صفحه‌های دارای پیشوند (فضای‌نام $1)",
+       "prefixindex-submit": "نمایش",
        "prefixindex-strip": "حذف پیشوند در فهرست",
        "shortpages": "صفحه‌های کوتاه",
        "longpages": "صفحه‌های بلند",
        "protectedpages-performer": "کاربر حفاظت‌کننده",
        "protectedpages-params": "پارامترهای حفاظت",
        "protectedpages-reason": "دلیل",
+       "protectedpages-submit": "نمایش صفحه‌ها",
        "protectedpages-unknown-timestamp": "ناشناس",
        "protectedpages-unknown-performer": "کاربر ناشناس",
        "protectedtitles": "عنوان‌های محافظت‌شده",
        "protectedtitles-summary": "این صفحه فهرست صفحات موجود است که در حال حاضر محافظت از ساخت شده‌اند. برای فهرست عنوان‌هایی که محافظت از ویرایش شده‌اند، به [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] مراجعه کنید.",
        "protectedtitlesempty": "در حال حاضر هیچ عنوانی با این پارامترها محافظت نشده‌است.",
+       "protectedtitles-submit": "نمایش عناوین",
        "listusers": "فهرست کاربران",
        "listusers-editsonly": "فقط کاربرانی که ویرایش دارند را نشان بده",
        "listusers-creationsort": "مرتب کردن بر اساس تاریخ ایجاد",
        "usereditcount": "$1 {{PLURAL:$1|ویرایش|ویرایش}}",
        "usercreated": "{{GENDER:$3|ایجادشده}} در تاریخ $1 در ساعت $2",
        "newpages": "صفحه‌های تازه",
+       "newpages-submit": "نمایش",
        "newpages-username": "نام کاربری:",
        "ancientpages": "قدیمی‌ترین صفحات",
        "move": "انتقال",
        "nopagetext": "صفحهٔ هدفی که شما مشخص کردید وجود ندارد.",
        "pager-newer-n": "{{PLURAL:$1|یک مورد جدیدتر|$1 مورد جدیدتر}}",
        "pager-older-n": "{{PLURAL:$1|یک مورد قدیمی‌تر|$1 مورد قدیمی‌تر}}",
-       "suppress": "نظارت",
+       "suppress": "سرکوب",
        "querypage-disabled": "این صفحه ویژه به دلایل عملکردی غیرفعال شده‌است.",
        "apihelp": "راهنمای API",
        "apihelp-no-such-module": "پودمان \" $1 \" یافت نشد.",
        "specialloguserlabel": "مجری:",
        "speciallogtitlelabel": "هدف (عنوان یا {{ns:user}}:نام کاربر برای کاربر):",
        "log": "سیاهه‌ها",
+       "logeventslist-submit": "نمایش",
        "all-logs-page": "تمام سیاهه‌های عمومی",
        "alllogstext": "نمایش یک‌جای تمام سیاهه‌های موجود در {{SITENAME}}.\nمی‌توانید با انتخاب نوع سیاهه، نام کاربری (حساس به کوچکی و بزرگی حروف) و صفحه‌های تغییریافته (حساس به بزرگی و کوچکی حروف)، نمایش را محدودتر سازید.",
        "logempty": "مورد منطبق با منظور شما در سیاهه یافت نشد.",
        "cachedspecial-viewing-cached-ts": "شما در حال مشاهدهٔ نسخه‌ای از این صفحه که در میانگیر قرار دارد هستید، و این نسخه ممکن است کاملاً واقعی نباشد.",
        "cachedspecial-refresh-now": "مشاهده آخرین.",
        "categories": "رده‌ها",
+       "categories-submit": "نمایش",
        "categoriespagetext": "{{PLURAL:$1|ردهٔ|رده‌های}} زیر دارای صفحات یا پرونده‌هایی {{PLURAL:$1|است|هستند}}.\n[[Special:UnusedCategories|رده‌های استفاده‌نشده]] در اینجا نمایش داده نشده‌اند.\nهمچنین [[Special:WantedCategories|رده‌های مورد نیاز]] را ببینید.",
        "categoriesfrom": "نمایش رده‌ها با شروع از:",
        "special-categories-sort-count": "مرتب کردن بر اساس تعداد",
        "activeusers-hidebots": "نهفتن ربات‌ها",
        "activeusers-hidesysops": "نهفتن مدیران",
        "activeusers-noresult": "کاربری پیدا نشد.",
+       "activeusers-submit": "نمایش کاربران فعال",
        "listgrouprights": "اختیارات گروه‌های کاربری",
        "listgrouprights-summary": "فهرست زیر شامل گروه‌های کاربری تعریف شده در این ویکی و اختیارات داده شده به آن‌ها است.\nاطلاعات بیشتر در مورد هر یک از اختیارات را در [[{{MediaWiki:Listgrouprights-helppage}}]] بیابید.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">اختیارات داده‌شده</span>\n* <span class=\"listgrouprights-revoked\">اختیارات گرفته‌شده</span>",
        "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
        "wlnote": "در زیر {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که در {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
        "wlshowlast": "نمایش آخرین $1 ساعت $2 روز",
+       "watchlistall2": "همه",
+       "watchlist-hide": "نهفتن",
+       "watchlist-submit": "نمایش",
+       "wlshowtime": "نمایش بازهٔ زمانی:",
+       "wlshowhideminor": "ویرایش‌های جزئی",
+       "wlshowhidebots": "ربات‌ها",
+       "wlshowhideliu": "کاربران ثبت‌شده",
+       "wlshowhideanons": "کاربران ناشناس",
+       "wlshowhidepatr": "ویرایش‌های گشت‌خورده",
+       "wlshowhidemine": "ویرایش‌های من",
        "watchlist-options": "گزینه‌های پی‌گیری",
        "watching": "پی‌گیری...",
        "unwatching": "توقف پی‌گیری...",
        "delete-confirm": "حذف «$1»",
        "delete-legend": "حذف",
        "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال پاک‌کردن آن هستید دارای یک تاریخچه همراه $1 {{PLURAL:$1|بازبینی|بازبینی‌ها}} است:",
+       "historyaction-submit": "نمایش",
        "confirmdeletetext": "شما در حال حذف کردن یک صفحه یا تصویر از پایگاه داده‌ها همراه با تمام تاریخچهٔ آن هستید.\nلطفاً این عمل را تأیید کنید و اطمینان حاصل کنید که عواقب این کار را می‌دانید و این عمل را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
        "actioncomplete": "عمل انجام شد",
        "actionfailed": "عمل ناموفق بود",
        "contributions": "مشارکت‌های {{GENDER:$1|کاربر}}",
        "contributions-title": "مشارکت‌های کاربری $1",
        "mycontris": "مشارکت‌ها",
+       "anoncontribs": "مشارکت‌ها",
        "contribsub2": "برای {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "حساب کاربری «$1» ثبت نشده‌است.",
        "nocontribs": "هیچ تغییری با این مشخصات یافت نشد.",
        "whatlinkshere-hidelinks": "$1 پیوند",
        "whatlinkshere-hideimages": "$1 پیوندهای پرونده",
        "whatlinkshere-filters": "پالایه‌ها",
+       "whatlinkshere-submit": "برو",
        "autoblockid": "شناسه قطع دسترسی خودکار #$1",
        "block": "بستن کاربر",
        "unblock": "بازکردن کاربر",
        "move-page-legend": "انتقال صفحه",
        "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحات موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحات به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحات محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
        "movepagetext-noredirectfixer": "استفاده از فرم زیر سبب تغییر نام یک صفحه و انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.\nعنوان پیشین تغییرمسیری به عنوان جدید خواهد شد.\nبه خاطر داشته باشید که [[Special:DoubleRedirects|تغییرمسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییرمسیرهای خراب]] را بررسی کنید.\nشما مسئولید که مطمئن شوید پس از انتقال، پیوندها به عنوان پیشین به جایی منتهی می‌شوند که باید.\n\nتوجه کنید که اگر صفحه‌ای تحت عنوان جدید از قبل موجود باشد، انتقال انجام '''نخواهد شد'''، مگر اینکه صفحه خالی و یا تغییرمسیر باشد و تاریخچهٔ ویرایشی دیگری نداشته باشد.\nاین یعنی اگر صفحه را به نامی اشتباه منتقل کردید می‌توانید این تغییر را واگردانی کنید، اما نمی‌توانید یک صفحه را به صفحه‌ای که از قبل موجود است انتقال دهید.\n\n'''هشدار!'''\nانتقال صفحه‌های پربیننده ممکن است عملی غیرمنتظره باشد؛\nلطفاً پیش از انتقال مطمئن شوید از نتیجهٔ کار آگاهید.",
-       "movepagetalktext": "صÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø« Ù\85ربÙ\88Ø·Ø\8c Ø§Ú¯Ø± Ù\88جÙ\88د Ø¯Ø§Ø´ØªÙ\87 Ø¨Ø§Ø´Ø¯Ø\8c Ø¨Ø·Ù\88ر Ø®Ù\88دکار Ù\87Ù\85راÙ\87 Ø¨Ø§ Ù\85Ù\82اÙ\84Ù\87Ù\94 Ø§ØµÙ\84Û\8c Ù\85Ù\86تÙ\82Ù\84 Ø®Ù\88اÙ\87د Ø´Ø¯ <strong>Ù\85گر Ø§Û\8cÙ\86Ú©Ù\87:</strong>\n* Ø¯Ø± Ø­Ø§Ù\84 Ø§Ù\86تÙ\82اÙ\84 ØµÙ\81Ø­Ù\87 Ø§Ø² Ø§Û\8cÙ\86 Ù\81ضاÛ\8c Ù\86اÙ\85 Ø¨Ù\87 Ù\81ضاÛ\8c Ù\86اÙ\85 Ø¯Û\8cگرÛ\8c Ø¨Ø§Ø´Û\8cدØ\8c\n* Û\8cÚ© ØµÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø« ØºÛ\8cرخاÙ\84Û\8c ØªØ­Øª Ø§Û\8cÙ\86 Ù\86اÙ\85 Ø¬Ø¯Û\8cد Ù\88جÙ\88د Ø¯Ø§Ø´ØªÙ\87 Ø¨Ø§Ø´Ø¯Ø\8c Û\8cا\n* Ø¬Ø¹Ø¨Ù\87Ù\94 Ø²Û\8cر Ø±Ø§ ØªÛ\8cÚ© Ù\86زدÙ\87 Ø¨Ø§Ø´Û\8cد.\n\nدر Ø§Û\8cÙ\86 Ø­Ø§Ù\84ات، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
+       "movepagetalktext": "اگر Ø§Û\8cÙ\86 Ú¯Ø²Û\8cÙ\86Ù\87 Ø±Ø§ Ø§Ù\86تخاب Ú©Ù\86Û\8cدØ\8c ØµÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø« Ù\85رتبط Ø¨Ù\87 ØµÙ\88رت Ø®Ù\88دکار Ø§Ù\86تÙ\82اÙ\84 Ø¯Ø§Ø¯Ù\87 Ù\85Û\8câ\80\8cØ´Ù\88د Ø¨Ù\87 Ø¹Ù\86Ù\88اÙ\86 Ø¬Ø¯Û\8cد Ù\88 Ø¯Ø± ØµÙ\88رت Ø¹Ø¯Ù\85 Ø§Ù\86تخاب Ú¯Ø²Û\8cÙ\86Ù\87Ø\8c ØµÙ\81Ø­Ù\87Ù\94 Ø¨Ø­Ø« Ø¬Ø¯Û\8cد Û\8cÚ© ØµÙ\81Ø­Ù\87Ù\94 Ø®Ø§Ù\84Û\8c Ø®Ù\88اÙ\87د Ø¨Ù\88د Ù\88 Ø¯Ø± Ø§Û\8cÙ\86 Ø­Ø§Ù\84ت، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
        "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
        "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
        "movenologintext": "برای انتقال صفحات باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
        "movenosubpage": "این صفحه هیچ زیرصفحه‌ای ندارد.",
        "movereason": "دلیل:",
        "revertmove": "واگردانی",
-       "delete_and_move": "حذف و انتقال",
        "delete_and_move_text": "== نیاز به حذف ==\n\nمقالهٔ مقصد «[[:$1]]» وجود دارد. آیا می‌خواهید آن را حذف کنید تا انتقال ممکن شود؟",
        "delete_and_move_confirm": "بله، صفحه حذف شود",
        "delete_and_move_reason": "حذف برای ممکن‌شدن انتقال  «[[$1]]»",
        "tooltip-pt-preferences": "ترجیحات من",
        "tooltip-pt-watchlist": "فهرست صفحه‌هایی که شما تغییرات آن‌ها را پی‌گیری می‌کنید",
        "tooltip-pt-mycontris": "فهرست مشارکت‌های شما",
+       "tooltip-pt-anoncontribs": "فهرست ویرایش‌ها انجام شده از این نشانی آی‌پی",
        "tooltip-pt-login": "توصیه می‌شود که به سامانه وارد شوید، گرچه اجباری نیست",
        "tooltip-pt-logout": "خروج از سامانه",
        "tooltip-pt-createaccount": "از شما دعوت می‌شود که حساب کاربری بسازید و به سامانه وارد شوید؛ هرچند که ساخت حساب کاربری اختیاری است.",
        "svg-long-error": "پرونده SVG نامجاز: $1",
        "show-big-image": "پروندهٔ اصلی",
        "show-big-image-preview": "اندازهٔ این پیش‌نمایش: $1.",
+       "show-big-image-preview-differ": "حجم پیش‌نمایش $3 این $2 file:$1",
        "show-big-image-other": "{{PLURAL:$2|کیفیت|کیفیت‌های}} دیگر: $1.",
        "show-big-image-size": "<span dir=\"ltr\">$1 × $2</span> پیکسل",
        "file-info-gif-looped": "چرخش‌دار",
        "exif-compression-4": "رمزگذاری نمابر سی‌سی‌آی‌تی‌تی گروه ۴",
        "exif-copyrighted-true": "دارای حق تکثیر",
        "exif-copyrighted-false": "وضعیت حق‌تکثیر تعیین نشده است",
+       "exif-photometricinterpretation-1": "سیاه و سفید (سیاه ۰ است)",
        "exif-unknowndate": "تاریخ نامعلوم",
        "exif-orientation-1": "عادی",
        "exif-orientation-2": "افقی پشت و روشده",
        "tags-edit": "ویرایش",
        "tags-delete": "حذف",
        "tags-activate": "فعال‌سازی",
-       "tags-deactivate": "غیرفعال‌سازی",
+       "tags-deactivate": "غیرفعال کردن/إکار کةتن",
        "tags-hitcount": "$1 {{PLURAL:$1|تغییر|تغییر}}",
        "tags-manage-no-permission": "شما اجازه مدیریت تغییر تگ‌ها را ندارید.",
        "tags-create-heading": "ایجاد یک برچسب جدید",
        "htmlform-cloner-required": "حداقل یک مقدار مورد نیاز است.",
        "htmlform-title-badnamespace": "[[:$1]] در فضای نام \"{{ns:$2}}\"  موجود نیست.",
        "htmlform-title-not-creatable": "\"$1\" عنوان قابل ایجاد نیست",
-       "htmlform-title-not-exists": "[[:$1]] وجود ندارد.",
+       "htmlform-title-not-exists": "$1 وجود ندارد.",
        "htmlform-user-not-exists": "<strong>$1</strong> وجود ندارد.",
        "htmlform-user-not-valid": "حساب کاربری <strong>$1</strong> معتبر نیست.",
        "sqlite-has-fts": "$1 با پشتیبانی از جستجو در متن کامل",
        "logentry-suppress-block": "$1 {{GENDER:$2|بسته شد}} {{GENDER:$4|$3}} با پایان قطع دسترسی در زمان $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن برای  {{GENDER:$4|$3}} به پایان قطع دسترسی  $5 $6 تغییر یافت",
        "logentry-import-upload": "$1 $3 را توسط بارگذار پرونده {{GENDER:$2|درون‌ریزی کرد}}",
+       "logentry-import-upload-details": "$1 $3 را از طریق بارگذاری پرونده {{GENDER:$2|درون‌ریزی کرد}} ($4 {{PLURAL:$4|نسخه}})",
        "logentry-import-interwiki": "$1 $3 را از ویکی دیگر {{GENDER:$2|درون‌ریز کرد}}",
+       "logentry-import-interwiki-details": "$1 $3 را از $5 {{GENDER:$2|درون‌ریزی کرد}} ($4 {{PLURAL:$4|نسخه}})",
        "logentry-merge-merge": "$1  $3  را به  $4 {{GENDER:$2| ادغام کرد}} (نسخه تا  $5)",
        "logentry-move-move": "$1 صفحهٔ $3 را به $4 {{GENDER:$2|منتقل کرد}}",
        "logentry-move-move-noredirect": "$1 صفحهٔ $3 را بدون برجای‌گذاشتن تغییرمسیر به $4 {{GENDER:$2|منتقل کرد}}",
        "logentry-protect-move_prot": "$1 تنظیمات محافظت را از $4 به $3 {{GENDER:$2|منتقل کرد}}",
        "logentry-protect-unprotect": "$1 $3 را از محافظت {{GENDER:$2|خارج کرد}}",
        "logentry-protect-protect": "$1 $3 را {{GENDER:$2|محافظت کرد}} $4",
+       "logentry-protect-protect-cascade": "$1 $3 $4 {{GENDER:$2|محافظت کرد}} [آبشاری]",
        "logentry-protect-modify": "$1 سطح محافظت $3 را {{GENDER:$2|تغییر داد}} $4",
+       "logentry-protect-modify-cascade": "$1 سطح حفاظت برای $3 $4 را {{GENDER:$2|تغییر داد}}[آبشاری]",
        "logentry-rights-rights": "$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}",
        "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
        "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}",
index c0233f2..665877a 100644 (file)
                        "McSalama",
                        "Macofe",
                        "Beluga",
-                       "Pyscowicz"
+                       "Pyscowicz",
+                       "Olimar"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "tog-hideminor": "Piilota pienet muutokset tuoreet muutokset -listasta",
        "tog-hidepatrolled": "Piilota tarkastetut muutokset tuoreet muutokset -listasta",
        "tog-newpageshidepatrolled": "Piilota tarkastetut sivut uusien sivujen listalta",
+       "tog-hidecategorization": "Piilota sivujen luokittelu",
        "tog-extendwatchlist": "Laajenna tarkkailulista näyttämään kaikki tehdyt muutokset eikä vain viimeisimmät",
        "tog-usenewrc": "Ryhmittele muutokset sivun mukaan tuoreiden muutosten listalla ja tarkkailulistalla",
        "tog-numberheadings": "Numeroi otsikot automaattisesti",
@@ -64,7 +66,7 @@
        "tog-watchmoves": "Lisää siirtämäni sivut ja tiedostot tarkkailulistalleni",
        "tog-watchdeletion": "Lisää poistamani sivut ja tiedostot tarkkailulistalleni",
        "tog-watchrollback": "Lisää tarkkailulistalleni ne sivut, joissa olen käyttänyt palautus-toimintoa.",
-       "tog-minordefault": "Merkitse kaikki muutokset oletusarvoisesti pieniksi",
+       "tog-minordefault": "Merkitse kaikki muutokset oletuksena pieniksi",
        "tog-previewontop": "Näytä esikatselu muokkauskentän yläpuolella",
        "tog-previewonfirst": "Näytä esikatselu heti, kun muokkaus aloitetaan",
        "tog-enotifwatchlistpages": "Lähetä sähköpostiviesti tarkkailulistallani olevien sivujen muokkauksista",
        "tog-watchlisthidebots": "Piilota bottien muokkaukset tarkkailulistalta",
        "tog-watchlisthideminor": "Piilota pienet muokkaukset tarkkailulistalta",
        "tog-watchlisthideliu": "Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta",
+       "tog-watchlistreloadautomatically": "Päivitä tarkkailulista automaattisesti aina kun jotakin suodatinta on muutettu (vaatii JavaScriptiä)",
        "tog-watchlisthideanons": "Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta",
        "tog-watchlisthidepatrolled": "Piilota muutostentarkastajien hyväksymät muokkaukset tarkkailulistalta",
+       "tog-watchlisthidecategorization": "Piilota muutokset, jotka koskevat sivujeen lisäämistä tai poistamista luokkiin",
        "tog-ccmeonemails": "Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista",
        "tog-diffonly": "Älä näytä sivun sisältöä eroavaisuusvertailun alapuolella",
        "tog-showhiddencats": "Näytä piilotetut luokat",
        "listingcontinuesabbrev": "jatkuu",
        "index-category": "Indeksoidut sivut",
        "noindex-category": "Indeksointikiellolliset sivut",
-       "broken-file-category": "Sivut, joilla toimimattomia tiedostolinkkejä",
+       "broken-file-category": "Sivut, joissa on toimimattomia tiedostolinkkejä",
        "about": "Tietoja",
-       "article": "Sivu",
+       "article": "Sisältösivu",
        "newwindow": "(avautuu uuteen ikkunaan)",
        "cancel": "Peruuta",
        "moredotdotdot": "Lisää...",
        "morenotlisted": "Tämä luettelo ei ole täydellinen.",
        "mypage": "Käyttäjäsivu",
-       "mytalk": "Keskustelusivu",
-       "anontalk": "Keskustelusivu tälle IP-muokkaajalle",
+       "mytalk": "Keskustelu",
+       "anontalk": "Keskustelu",
        "navigation": "Valikko",
        "and": "&#32;ja",
        "qbfind": "Etsi",
        "navigation-heading": "Navigointivalikko",
        "errorpagetitle": "Virhe",
        "returnto": "Palaa sivulle $1.",
-       "tagline": "{{SITENAME}}",
+       "tagline": "Kohteesta {{SITENAME}}",
        "help": "Ohje",
        "search": "Haku",
        "searchbutton": "Hae",
        "portal-url": "Project:Kahvihuone",
        "privacy": "Tietosuojakäytäntö",
        "privacypage": "Project:Tietosuojakäytäntö",
-       "badaccess": "Lupa evätty",
+       "badaccess": "Ei lupaa",
        "badaccess-group0": "Sinulla ei ole lupaa suorittaa pyydettyä toimintoa.",
        "badaccess-groups": "Pyytämäsi toiminto on rajoitettu käyttäjille, jotka kuuluvat {{PLURAL:$2|seuraavaan ryhmään|seuraaviin ryhmiin}}: $1.",
        "versionrequired": "MediaWikistä tarvitaan vähintään versio $1",
        "missingarticle-rev": "(versio nro: $1)",
        "missingarticle-diff": "(vertailu: $1, $2)",
        "readonly_lag": "Tietokanta on automaattisesti lukittu, jotta kaikki tietokantapalvelimet saisivat kaikki tuoreet muutokset",
+       "nonwrite-api-promise-error": "HTTP-header 'Promise-Non-Write-API-Action' on lähetetty, mutta pyyntö oli kohdistettu API:n kirjoitusmoduuliin (API write module).",
        "internalerror": "Sisäinen virhe",
        "internalerror_info": "Sisäinen virhe: $1",
        "internalerror-fatal-exception": "Vakava virhe, jonka tyyppi on \"$1\"",
        "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Miksi olet luomassa toista käyttäjätunnusta",
-       "createacct-captcha": "Turvatarkastus",
-       "createacct-imgcaptcha-ph": "Kirjoita teksti, jonka näet edellä",
        "createacct-submit": "Luo tunnus",
        "createacct-another-submit": "Luo käyttäjätunnus",
        "createacct-benefit-heading": "{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.",
        "wrongpasswordempty": "Et voi antaa tyhjää salasanaa.",
        "passwordtooshort": "Salasanan täytyy olla vähintään {{PLURAL:$1|yhden merkin pituinen|$1 merkkiä pitkä}}.",
        "passwordtoolong": "Salasanat saavat olla enintään $1 {{PLURAL:$1|merkin}} pituisia.",
+       "passwordtoopopular": "Tavanomaisen kaltaisia salasanoja ei saa käyttää. Valitse parempi ja yksilöllisempi salasana.",
        "password-name-match": "Salasanasi täytyy olla eri kuin käyttäjätunnuksesi.",
        "password-login-forbidden": "Tämän käyttäjänimen ja salasanan käyttö on estetty.",
        "mailmypassword": "Uudista salasana",
        "passwordreset-emailtext-ip": "Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi salasanasi\nvaihtamista sivustolla {{SITENAME}} ($4). {{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}}\nyhdistettynä tähän sähköpostiosoitteeseen:\n\n$2\n\n{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\nKirjaudu sisään nyt ja valitse uusi salasana heti. Jos joku toinen teki tämän pyynnön \ntai jos muistitkin vanhan salasanasi etkä halua enää muuttaa sitä,\nvoit jättää tämän viestin huomiotta ja jatkaa vanhan salasanasi käyttämistä.",
        "passwordreset-emailtext-user": "Käyttäjä $1 pyysi muistutusta tunnuksesi tiedoista sivustolla {{SITENAME}} ($4).\n{{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}} liitetty tähän sähköpostiosoitteeseen:\n\n$2\n\n{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\nSinun kannattaa kirjautua sisään ja valita uusi salasana. Jos joku toinen teki tämän\npyynnön, tai muistat sittenkin vanhan salasanasi, etkä halua muuttaa sitä,\nvoit jättää tämän viestin huomiotta ja jatkaa vanhan salasanan käyttöä.",
        "passwordreset-emailelement": "Käyttäjätunnus: \n$1\n\nVäliaikainen salasana: \n$2",
-       "passwordreset-emailsent": "Jos tämä on sinun tunnuksellesi rekisteröity sähköpostiosoite, siihen lähetetään salasanan uudistamisesta kertova viesti.",
+       "passwordreset-emailsentemail": "Jos tämä on sinun tunnuksellesi rekisteröity sähköpostiosoite, siihen lähetetään salasanan uudistamisesta kertova viesti.",
        "passwordreset-emailsent-capture": "Salasanan uudistamisesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.",
        "passwordreset-emailerror-capture": "Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1",
        "changeemail": "Muuta tai poista sähköpostiosoite",
        "permissionserrors": "Puutteelliset oikeudet",
        "permissionserrorstext": "Sinulla ei ole oikeutta suorittaa toimintoa {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:",
        "permissionserrorstext-withaction": "Sinulla ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:",
+       "contentmodelediterror": "Et voi muokata tätä versiota, koska sen sisältömalli on <code>$1</code>, ja sivun nykyinen sisältömalli on <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Varoitus: Olet luomassa sellaista sivua, joka on aikaisemmin poistettu.'''\n\nHarkitse, kannattaako tätä sivua luoda uudelleen. \nAlla on tämän sivun poisto- ja siirtohistoria:",
        "moveddeleted-notice": "Tämä sivu on poistettu. Alla on tämän sivun poisto- ja siirtohistoria.",
        "moveddeleted-notice-recent": "Valitettavasti tämä sivu on poistettu aivan äskettäin (viimeisen 24 tunnin aikana).\nAlla näkyy sivun poisto- ja siirtolokin tietoja.",
        "mergehistory-into": "Kohdesivu:",
        "mergehistory-list": "Sivuhistoria, joka voidaan yhdistää",
        "mergehistory-merge": "Seuraavat versiot sivusta [[:$1]] voidaan yhdistää sivuun [[:$2]]. \n\nValintamerkin sijoituksella voit yhdistää vain ne versiot, jotka on luotu valittuna ajankohtana tai sitä ennen (listassa alaspäin). \nOta huomioon, että jos käytät navigaatiolinkkejä, tekemäsi valinta poistuu.",
-       "mergehistory-go": "Etsi muokkaukset, jotka voidaan yhdistää",
+       "mergehistory-go": "Näytä muokkaukset, jotka voidaan yhdistää",
        "mergehistory-submit": "Yhdistä versiot",
        "mergehistory-empty": "Mitään versioita ei voida yhdistää.",
        "mergehistory-done": "$3 {{PLURAL:$3|versio|versiota}} sivusta $1 yhdistettiin onnistuneesti sivuun [[:$2]].",
        "showingresultsinrange": "Alla näytetään {{PLURAL:$1|<strong>1</strong> tulos|<strong>$1</strong> tulosta}} väliltä <strong>$2</strong>–<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Tulos <strong>$1</strong> enimmäismäärästä <strong>$3</strong>|Tulokset <strong>$1 – $2</strong> enimmäismäärästä <strong>$3</strong>}}",
        "search-nonefound": "Hakusi ei tuottanut tulosta.",
+       "search-nonefound-thiswiki": "Hakusi ei tuottanut tulosta tällä sivustolla.",
        "powersearch-legend": "Laajennettu haku",
        "powersearch-ns": "Hae nimiavaruuksista:",
        "powersearch-togglelabel": "Muuta valintaa",
        "prefs-help-recentchangescount": "Tämä sisältää tuoreet muutokset, muutoshistoriat ja lokit.",
        "prefs-help-watchlist-token2": "Tämä on salainen avain tarkkailulistasi verkkosyötteeseen.\nKuka tahansa, joka tietää sen voi lukea tarkkailulistaasi, joten älä paljasta sitä.\n[[Special:ResetTokens|Napsauta tästä, jos sinun pitää uudistaa se]].",
        "savedprefs": "Asetuksesi on tallennettu.",
+       "savedrights": "Käyttäjän {{GENDER:$1|$1}} käyttöoikeudet on tallennettu.",
        "timezonelegend": "Aikavyöhyke",
        "localtime": "Paikallinen aika",
        "timezoneuseserverdefault": "Käytä oletusta ($1)",
        "prefs-help-prefershttps": "Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.",
        "prefswarning-warning": "Olet tehnyt asetuksiisi muutoksia, joita ei ole vielä tallennettu.\nJos poistut sivulta klikkaamatta \"$1\", asetuksiasi ei päivitetä.",
        "prefs-tabs-navigation-hint": "Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.",
-       "email-address-validity-valid": "Sähköpostiosoite vaikuttaa kelvolliselta",
-       "email-address-validity-invalid": "Virheellinen sähköpostiosoite",
        "userrights": "Käyttöoikeuksien hallinta",
        "userrights-lookup-user": "Hallinnoi käyttäjän ryhmiä",
        "userrights-user-editname": "Käyttäjätunnus",
        "recentchanges-legend-heading": "'''Selitys:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (katso myös [[Special:NewPages|lista uusista sivuista]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Näytä",
        "rcnotefrom": "Alla ovat muutokset <strong>$3, $4</strong> lähtien. (Enintään <strong>$1</strong> näytetään.)",
        "rclistfrom": "Näytä uudet muutokset $3 $2 alkaen",
        "rcshowhideminor": "$1 pienet muutokset",
        "rcshowhidemine": "$1 omat muutokset",
        "rcshowhidemine-show": "Näytä",
        "rcshowhidemine-hide": "Piilota",
+       "rcshowhidecategorization": "$1 sivujen luokkien muutokset",
+       "rcshowhidecategorization-show": "Näytä",
+       "rcshowhidecategorization-hide": "Piilota",
        "rclinks": "Näytä $1 tuoretta muutosta viimeisten $2 päivän ajalta.<br />$3",
        "diff": "ero",
        "hist": "historia",
        "upload-options": "Tallennusasetukset",
        "watchthisupload": "Tarkkaile tätä tiedostoa",
        "filewasdeleted": "Tiedosto tällä samalla nimellä on aikaisemmin tallennettu ja sittemmin poistettu.\nKatso $1 ennen kuin jatkat tiedoston tallentamista uudestaan.",
+       "filename-thumb-name": "Tämä vaikuttaa olevan esikatselukuvan nimi. Älä tallenna esikatselukuvia takaisin samaan wikiin. Muussa tapauksessa korjaa tiedoston nimi sellaiseksi, joka on mielekkäämpi ja joka ei sisällä esikatselun etuliitettä.",
        "filename-bad-prefix": "Tallentamasi tiedoston nimi alkaa merkkijonolla '''$1''', joka on yleensä digitaalikameroiden automaattisesti antama nimi, joka ei kuvaa tiedoston sisältöä. Anna tiedostolle kuvaavampi nimi.",
        "filename-prefix-blacklist": " #<!-- älä muokkaa tätä riviä --> <pre>\n# Syntaksi on seuraava:\n#   * #-merkki aloittaa kommentin, joka jatkuu rivin loppuun\n#   * Jokainen epätyhjä rivi on tiedostonimien etuliite digitaalikameroiden yleisesti käyttämille tiedostonimille\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # jotkut matkapuhelimet\nIMG # yleinen\nJD # Jenoptik\nMGP # Pentax\nPICT # muut\n #</pre> <!-- älä muokkaa tätä riviä -->",
        "upload-success-subj": "Tallennus onnistui",
        "foreign-structured-upload-form-label-own-work": "Tämä on oma työni",
        "foreign-structured-upload-form-label-infoform-categories": "Luokat",
        "foreign-structured-upload-form-label-infoform-date": "Päivämäärä",
+       "foreign-structured-upload-form-label-own-work-message-local": "Vakuutan, että tallennan tämän tiedoston noudattaen sivustolla {{SITENAME}} voimassa olevia käyttöehtoja sekä lisenssejä koskevia käytäntöjä.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Jos et kykene tallentamaan tätä tiedostoa noudattaen niitä käytäntöjä, jotka ovat voimassa sivustolla {{SITENAME}}, sulje tämä dialogi ja kokeile jotain toista menetelmää.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Voit myös kokeilla [[Special:Upload|yleistä tallentamista]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Ymmärrän, että olen tallentamassa tätä tiedostoa yhteiseen mediasäilöön. Vakuutan, että teen tämän noudattaen asiaankuuluvia käyttöehtoja ja lisenssejä koskevia käytäntöjä.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Jos et kykene tallentamaan tätä tiedostoa noudattaen niitä käytäntöjä, jotka ovat voimassa yhteisessä mediasäilössä, sulje tämä dialogi ja kokeile jotain toista menetelmää.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Voit myös kokeilla [[Special:Upload|tallennussivua sivustolla {{SITENAME}}]]. Saattaa olla, että tämän tiedoston tallentaminen sinne on mahdollista siellä voimassa olevien käytäntöjen mukaisesti.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Vakuutan, että minä omistan tämän tiedoston tekijänoikeudet, ja sitoudun siihen, että luovutan peruuttamattomasti tämän tiedoston kohteeseen Wikimedia Commons niillä ehdoilla, jotka liittyvät lisenssiin [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0]. Sitoudun myös noudattamaan [https://wikimediafoundation.org/wiki/Terms_of_Use käyttöehtoja].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Jos sinulla ei ole tähän tiedostoon tekijänoikeutta tai jos haluat luovuttaa tiedoston käyttäen jotain toista lisenssiä, voit käyttää erityistä [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] -toimintoa.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Voit myös kokeilla [[Special:Upload|tallennussivua sivustolla {{SITENAME}}]]. Saattaa olla, että sivusto antaa tallentaa tämän tiedoston sinne siellä voimassa olevien käytäntöjen mukaisesti.",
        "backend-fail-stream": "Tiedoston $1 virtauttaminen epäonnistui.",
        "backend-fail-backup": "Tiedostoa $1 ei voitu varmuuskopioida.",
        "backend-fail-notexists": "Tiedostoa $1 ei ole olemassa.",
        "mostrevisions": "Muokatuimmat sivut",
        "prefixindex": "Kaikki sivut katkaisuhaulla",
        "prefixindex-namespace": "Kaikki sivut etuliitteellä (nimiavaruus $1)",
+       "prefixindex-submit": "Näytä",
        "prefixindex-strip": "Älä näytä etuliitteitä listauksessa",
        "shortpages": "Lyhyet sivut",
        "longpages": "Pitkät sivut",
        "protectedpages-performer": "Suojauksen asettanut",
        "protectedpages-params": "Suojauksen asetukset",
        "protectedpages-reason": "Syy",
+       "protectedpages-submit": "Hae sivut",
        "protectedpages-unknown-timestamp": "Tuntematon",
        "protectedpages-unknown-performer": "Tuntematon käyttäjä",
        "protectedtitles": "Suojatut sivunimet",
        "protectedtitles-summary": "Tällä sivulla on lueteltu ne sivut, jotka on tällä hetkellä suojattu uudelleenluonnilta. Nähdäksesi luettelon olemassaolevista suojatuista sivuista katso [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Ei suojattuja sivunimiä näillä hakuehdoilla.",
+       "protectedtitles-submit": "Hae sivunimet",
        "listusers": "Käyttäjien luettelo",
        "listusers-editsonly": "Näytä vain käyttäjät, joilla on muokkauksia",
        "listusers-creationsort": "Lajittele tunnuksen luontipäivämäärän mukaan",
        "pager-newer-n": "← {{PLURAL:$1|1 uudempi|$1 uudempaa}}",
        "pager-older-n": "{{PLURAL:$1|1 vanhempi|$1 vanhempaa}} →",
        "suppress": "Häivytys",
-       "querypage-disabled": "Tämä toimintosivu on poistettu käytöstä suorituskykysyistä.",
+       "querypage-disabled": "Tämä toimintosivu on poistettu käytöstä suorituskykyyn liittyvien syiden vuoksi.",
        "apihelp": "API-apu",
        "apihelp-no-such-module": "Moduulia ”$1” ei löydy.",
        "booksources": "Kirjalähteet",
        "activeusers-hidebots": "Piilota botit",
        "activeusers-hidesysops": "Piilota ylläpitäjät",
        "activeusers-noresult": "Käyttäjiä ei löytynyt.",
+       "activeusers-submit": "Hae aktiiviset käyttäjät",
        "listgrouprights": "Käyttäjäryhmien oikeudet",
        "listgrouprights-summary": "Tämä lista sisältää tämän wikin käyttäjäryhmät sekä ryhmiin liitetyt käyttöoikeudet.\nLisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWiki:Listgrouprights-helppage}}|erilliseltä ohjesivulta]].",
        "listgrouprights-key": "Selite:\n* <span class=\"listgrouprights-granted\">Myönnetyt oikeudet</span>\n* <span class=\"listgrouprights-revoked\">Kumotut oikeudet</span>",
        "post-expand-template-inclusion-category-desc": "Sivun koko on suurempi kuin <code>$wgMaxArticleSize</code>, kun kaikki mallineet on laajennettu. Tämän vuoksi joitakin mallineita ei laajennettu.",
        "post-expand-template-argument-category-desc": "Sivu on suurempi kuin <code>$wgMaxArticleSize</code>, kun mallineen argumentti on laajennettu (argumentti on merkkijono kolmen aaltosulun sisällä kuten <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "Tämä sivu käyttää liian monta resursseja vaativaa jäsenninfunktiota (kuten <code>#ifexist</code>). Katso [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Tämä sivu sisältää rikkinäisen tiedostolinkin. Tällä tarkoitetaan linkkiä sellaiseen tiedostoon, jota ei olemassa.",
+       "broken-file-category-desc": "Tämä sivu sisältää toimimattoman tiedostolinkin (eli linkin upotettavaan tiedostoon, jota ei olemassa).",
        "hidden-category-category-desc": "Tämä luokka sisältää koodin <code><nowiki>__HIDDENCAT__</nowiki></code> sen tekstisisällössä. Koodi estää luokan näkymisen sivujen alareunassa olevassa luokkien laatikossa kuten yleensä.",
        "trackingcategories-nodesc": "Ei kuvausta olemassa.",
        "trackingcategories-disabled": "Luokka on poistettu käytöstä",
        "email-legend": "Sähköpostin lähetys {{GRAMMAR:genitive|{{SITENAME}}}} käyttäjälle",
        "emailfrom": "Lähettäjä",
        "emailto": "Vastaanottaja",
-       "emailsubject": "Aihe",
+       "emailsubject": "Aihe:",
        "emailmessage": "Viesti",
        "emailsend": "Lähetä",
        "emailccme": "Lähetä kopio viestistä minulle.",
        "wlheader-showupdated": "Sivut, joita on muokattu viimeisen käyntisi jälkeen, on '''lihavoitu'''.",
        "wlnote": "Alla {{PLURAL:$1|on viimeisin muutos|ovat viimeisimmät <strong>$1</strong> muutosta}} edellisen {{PLURAL:$2|tunnin|<strong>$2</strong> tunnin}} ajalta $3 kello $4 lukien.",
        "wlshowlast": "Näytä edelliset $1 tuntia tai $2 päivää",
+       "watchlistall2": "kaikki",
+       "watchlist-hide": "Piilota",
+       "watchlist-submit": "Näytä",
+       "wlshowtime": "Näytettävä aikajakso:",
+       "wlshowhideminor": "pienet muutokset",
+       "wlshowhidebots": "botit",
+       "wlshowhideliu": "rekisteröityneet käyttäjät",
+       "wlshowhideanons": "anonyymit käyttäjät",
+       "wlshowhidepatr": "tarkastetut muutokset",
+       "wlshowhidemine": "omat muokkaukseni",
        "watchlist-options": "Tarkkailulistan asetukset",
        "watching": "Lisätään tarkkailulistalle...",
        "unwatching": "Poistetaan tarkkailulistalta...",
        "deletepage": "Poista sivu",
        "confirm": "Toteuta",
        "excontent": "sisälsi: ”$1”",
-       "excontentauthor": "sisältö oli: \"$1\", ja ainoa muokkaaja oli \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|keskustelu]])",
+       "excontentauthor": "sisältö oli: \"$1\", ja ainoa muokkaaja oli \"[[Special:Contributions/$2|$2]]\"",
        "exbeforeblank": "ennen tyhjentämistä sisälsi: ”$1”",
        "delete-confirm": "Poista ”$1”",
        "delete-legend": "Sivun poisto",
        "tooltip-whatlinkshere-invert": "Laita rasti tähän ruutuun, kun haluat piilottaa linkit niistä sivuista, jotka kuuluvat valittuun nimiavaruuteen.",
        "namespace_association": "Liittyvä nimiavaruus",
        "tooltip-namespace_association": "Valitse tämä kohta, jos haluat haun sisältävän myös valittuun nimiavaruuteen liittyvän keskustelu- tai aihenimiavaruuden.",
-       "blanknamespace": "(sivut)",
+       "blanknamespace": "(pääavaruus)",
        "contributions": "{{GENDER:$1|Käyttäjän}} muokkaukset",
        "contributions-title": "Käyttäjän $1 muokkaukset",
-       "mycontris": "Omat muokkaukset",
+       "mycontris": "Muokkaukset",
+       "anoncontribs": "Muokkaukset",
        "contribsub2": "Käyttäjän {{GENDER:$3|$1}} ($2) muokkaukset",
        "contributions-userdoesnotexist": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
        "nocontribs": "Näihin ehtoihin sopivia muokkauksia ei löytynyt.",
        "whatlinkshere-hidelinks": "$1 linkit",
        "whatlinkshere-hideimages": "$1 tiedostolinkit",
        "whatlinkshere-filters": "Suotimet",
+       "whatlinkshere-submit": "Siirry",
        "autoblockid": "Automaattinen esto #$1",
        "block": "Estä käyttäjä",
        "unblock": "Poista käyttäjän esto",
        "movenosubpage": "Tällä sivulla ei ole alasivuja.",
        "movereason": "Syy:",
        "revertmove": "kumoa siirto",
-       "delete_and_move": "Poista kohdesivu ja siirrä",
        "delete_and_move_text": "==Poistamista edellyttävä siirto==\nKohdesivu [[:$1]] on jo olemassa. \nHaluatko poistaa sen, jotta nykyinen sivu voitaisiin siirtää?",
        "delete_and_move_confirm": "Kyllä, poista kohdesivu",
        "delete_and_move_reason": "Sivu on sivun [[$1]] siirron tiellä.",
        "tooltip-pt-preferences": "Omat asetukset",
        "tooltip-pt-watchlist": "Lista sivuista, joiden muokkauksia tarkkailet",
        "tooltip-pt-mycontris": "Lista omista muokkauksista",
+       "tooltip-pt-anoncontribs": "Luettelo tästä IP-osoitteesta tehdyistä muokkauksista",
        "tooltip-pt-login": "Kirjaudu sisään tai luo tunnus",
        "tooltip-pt-logout": "Kirjaudu ulos",
        "tooltip-pt-createaccount": "On suositeltavaa luoda käyttäjätunnus ja kirjautua sisään. Se ei kuitenkaan ole pakollista.",
        "svg-long-error": "Kelvoton SVG-tiedosto: $1",
        "show-big-image": "Alkuperäinen tiedosto",
        "show-big-image-preview": "Tämän esikatselun koko: $1.",
+       "show-big-image-preview-differ": "Tämän $3-esikatselun koko koskien $2-tiedostoa: $1.",
        "show-big-image-other": "{{PLURAL:$2|Muu resoluutio|Muut resoluutiot}}: $1.",
        "show-big-image-size": "$1 × $2 kuvapistettä",
        "file-info-gif-looped": "toistuva",
        "htmlform-cloner-required": "Vähintään yksi arvo on pakollinen.",
        "htmlform-title-badnamespace": "Sivu [[:$1]] ei ole nimiavaruudessa ”{{ns:$2}}”.",
        "htmlform-title-not-creatable": "”$1” ei kelpaa sivun nimeksi.",
-       "htmlform-title-not-exists": "Sivua [[:$1]] ei ole olemassa.",
+       "htmlform-title-not-exists": "Sivua $1 ei ole olemassa.",
        "htmlform-user-not-exists": "Käyttäjää <strong>$1</strong> ei ole olemassa.",
        "htmlform-user-not-valid": "<strong>$1</strong> ei ole kelvollinen käyttäjänimi.",
        "sqlite-has-fts": "$1, jossa on tuki kokotekstihaulle",
        "logentry-block-reblock": "$1 {{GENDER:$2|muutti}} eston asetuksia kohteessa {{GENDER:$4|$3}}. Eston kesto on $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|esti}} käyttäjän {{GENDER:$4|$3}}. Eston kesto on $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|muutti}} eston asetuksia kohteessa {{GENDER:$4|$3}}. Eston kesto on $5 $6",
-       "logentry-import-upload": "$1 {{GENDER:$2|toi}} kohteen $3 tiedostotallennuksella",
-       "logentry-import-interwiki": "$1 {{GENDER:$2|toi}} kohteen $3 muusta wikistä",
+       "logentry-import-upload": "$1 {{GENDER:$2|on tuonut}} kohteen $3 tiedostotallennuksella",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|on tuonut}} kohteen $3 tiedostotallennuksella ($4 {{PLURAL:$4|versio|versiota}})",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|on tuonut}} kohteen $3 muusta wikistä",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|on tuonut}} kohteen $3 paikasta $5 ($4 {{PLURAL:$4|versio|versioita}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|yhdisti}} sivun $3 sivuun $4 (versiot $5 saakka)",
        "logentry-move-move": "$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|siirsi}} sivun $3 uudelle nimelle $4 luomatta ohjausta",
        "feedback-error3": "Virhe: Ohjelmointirajapinta ei vastaa",
        "feedback-error4": "Virhe: Annetun palautteen otsikkoa ei voida lähettää",
        "feedback-message": "Viesti",
-       "feedback-subject": "Otsikko",
+       "feedback-subject": "Aihe:",
        "feedback-submit": "Lähetä",
        "feedback-terms": "Ymmärrän, että minua koskeva \"user agent\" -tieto sisältää tiedon siitä, mitä yksittäistä selainta ja käyttöjärjestelmää minä käytän ja että nämä tiedot tulevat näkymään julkisesti kaikille palautteeni yhteydessä.",
        "feedback-termsofuse": "Sitoudun lähettämään palautteen käyttöehtojen määräysten mukaisesti.",
index 0c3fb7a..260e85c 100644 (file)
        },
        "tog-underline": "Soulignement des liens :",
        "tog-hideminor": "Masquer les modifications mineures dans les changements récents",
-       "tog-hidepatrolled": "Masquer les modifications surveillées dans les modifications récentes",
-       "tog-newpageshidepatrolled": "Masquer les pages surveillées dans la liste des nouvelles pages",
+       "tog-hidepatrolled": "Masquer les modifications relues dans les modifications récentes",
+       "tog-newpageshidepatrolled": "Masquer les pages relues dans la liste des nouvelles pages",
        "tog-hidecategorization": "Masquer la catégorisation des pages",
        "tog-extendwatchlist": "Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes",
        "tog-usenewrc": "Grouper les changements par page dans les modifications récentes et 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",
        "tog-watchlisthideliu": "Masquer les modifications faites par des utilisateurs inscrits dans la liste de suivi",
+       "tog-watchlistreloadautomatically": "Recharger automatiquement la liste de suivi lorsque les options de filtrage sont modifiées (JavaScript requis)",
        "tog-watchlisthideanons": "Masquer les modifications d'utilisateurs anonymes dans la liste de suivi",
-       "tog-watchlisthidepatrolled": "Masquer les modifications surveillées dans la liste de suivi",
+       "tog-watchlisthidepatrolled": "Masquer les modifications relues dans la liste de suivi",
        "tog-watchlisthidecategorization": "Masquer la catégorisation des pages",
        "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",
        "pagecategories": "{{PLURAL:$1|Catégorie|Catégories}}",
        "category_header": "Pages dans la catégorie « $1 »",
        "subcategories": "Sous-catégories",
-       "category-media-header": "Média dans la catégorie \"$1\"",
+       "category-media-header": "Média dans la catégorie « $1 »",
        "category-empty": "<em>Cette catégorie ne contient aucune page ou fichier multimédia.</em>",
        "hidden-categories": "{{PLURAL:$1|Catégorie cachée|Catégories cachées}}",
        "hidden-category-category": "Catégories cachées",
        "morenotlisted": "Cette liste n’est pas complète.",
        "mypage": "Page",
        "mytalk": "Discussion",
-       "anontalk": "Discussion avec cette adresse IP",
+       "anontalk": "Discussion",
        "navigation": "Navigation",
        "and": "&#32;et",
        "qbfind": "Rechercher",
        "nstab-category": "Catégorie",
        "mainpage-nstab": "Accueil",
        "nosuchaction": "Action inconnue",
-       "nosuchactiontext": "L'action spécifiée dans l'URL est invalide.\nVous avez peut-être mal entré l'URL ou suivi un lien erroné.\nIl peut également s'agir d'un bug dans le logiciel utilisé par {{SITENAME}}.",
+       "nosuchactiontext": "L’action spécifiée dans l’URL est invalide.\nVous avez peut-être mal entré l’URL ou suivi un lien erroné.\nIl 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>\n\nUne liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Erreur",
        "databaseerror-query": "Requête : $1",
        "databaseerror-function": "Fonction : $1",
        "databaseerror-error": "Erreur : $1",
+       "transaction-duration-limit-exceeded": "Pour éviter une trop forte augmentation du délai de réplication, cette transaction a été annulée car la durée d’écriture ($1) a dépassé la limite de $2 secondes. Si vous cherchez à modifier un grand nombre d’éléments simultanément, essayez plutôt d’effectuer l’opération en plusieurs étapes.",
        "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",
        "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.",
+       "nonwrite-api-promise-error": "L’entête HTTP 'Promise-Non-Write-API-Action' a été envoyé mais la requête a été faite à un module d’écriture de l’API.",
        "internalerror": "Erreur interne",
        "internalerror_info": "Erreur interne : $1",
        "internalerror-fatal-exception": "Erreur fatale de type « $1 »",
        "title-invalid-utf8": "Le titre de la page demandée contient une séquence UTF-8 invalide.",
        "title-invalid-interwiki": "La page cible contient un lien interwiki ne pouvant être utilisé dans les titres.",
        "title-invalid-talk-namespace": "Le titre de la page demandée fait référence à une page de discussion qui peut ne pas exister.",
-       "title-invalid-characters": "Le titre de la page demandée contient des caractères non valides: \"$1\".",
+       "title-invalid-characters": "Le titre de la page demandée contient des caractères non valides : « $1 ».",
        "title-invalid-relative": "Le titre contient un chemin relatif. Les titres référençant des pages relatives (./, ../) sont invalides, car il seront souvent inaccessibles à partir des explorateurs des utilisateurs.",
        "title-invalid-magic-tilde": "Le titre de la page demandée contient une séquence invalide de tilde magiques (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "La demande de titre de la page est trop longue. Il ne doit pas être de plus de $1 {{PLURAL:$1|octets|bytes}} dans l'encodage UTF-8.",
        "createaccountreason": "Motif :",
        "createacct-reason": "Motif",
        "createacct-reason-ph": "Pourquoi créez-vous un autre compte",
-       "createacct-captcha": "Contrôle de sécurité",
-       "createacct-imgcaptcha-ph": "Entrez le texte que vous voyez ci-dessus",
        "createacct-submit": "Créez votre compte",
        "createacct-another-submit": "Créer le compte",
        "createacct-benefit-heading": "{{SITENAME}} est écrit par des gens comme vous.",
        "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}}.",
        "passwordtoolong": "Les mots de passe ne peuvent pas dépasser {{PLURAL:$1|1 caractère|$1 caractères}}.",
+       "passwordtoopopular": "Les mots de passe trop courants ne peuvent pas être utilisés. Veuillez choisir un mot de passe plus original.",
        "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/ou de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
        "passwordreset-emailtext-ip": "Quelqu'un (probablement vous, depuis l'adresse IP $1) a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailtext-user": "L'utilisateur $1 sur {{SITENAME}} a demandé un réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailelement": "Nom d'utilisateur : \n$1\n\nMot de passe temporaire : \n$2",
-       "passwordreset-emailsent": "Si c’est une adresse de courriel enregistrée pour votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
+       "passwordreset-emailsentemail": "Si c’est une adresse de courriel enregistrée pour votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
+       "passwordreset-emailsentusername": "S’il y a une adresse de courriel enregistrée pour ce compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "passwordreset-emailsent-capture": "Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.",
        "passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1",
        "changeemail": "Changer ou supprimer l’adresse de courriel",
        "copyrightwarning": "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br />\nVous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. '''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
        "copyrightwarning2": "Toutes les contributions à {{SITENAME}} peuvent être modifiées ou supprimées par d’autres utilisateurs. Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br \n/>Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).\n'''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
        "editpage-cannot-use-custom-model": "Le modèle de contenu de cette page ne peut pas être modifié.",
-       "longpageerror": "'''Erreur: Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.'''\nIl ne peut pas être sauvegardé.",
+       "longpageerror": "<strong>Erreur : Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.</strong>\nIl ne peut pas être sauvegardé.",
        "readonlywarning": "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l’instant.'''\nVous pouvez copier et coller votre texte dans un fichier texte et l’enregistrer pour plus tard.\n\nL’administrateur ayant verrouillé la base de données a donné l’explication suivante : $1",
        "protectedpagewarning": "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut d'administrateur peuvent la modifier.'''<br />\nLa dernière entrée du journal est affichée ci-dessous pour référence :",
        "semiprotectedpagewarning": "'''Note :''' Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. La dernière entrée du journal est affichée ci-dessous pour référence :",
        "permissionserrors": "Erreur de permissions",
        "permissionserrorstext": "Vous n'avez pas la permission d'effectuer l'opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
        "permissionserrorstext-withaction": "Vous ne pouvez pas $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
+       "contentmodelediterror": "Vous ne pouvez pas modifier cette révision car son modèle de contenu est <code>$1</code>, et le modèle de contenu actuel de la page est <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.'''\n\nAssurez-vous qu'il est pertinent de poursuivre les modifications sur cette page. Le journal des suppressions et des déplacements est affiché ci-dessous :",
        "moveddeleted-notice": "Cette page a été supprimée. Le journal des suppressions et des déplacements est affiché ci-dessous pour référence.",
        "moveddeleted-notice-recent": "Désolé, cette page a été récemment supprimée (dans les dernières 24 heures).\nLes journaux des suppressions et des renommages pour la page sont fournis ci-dessous à titre d’information.",
        "postedit-confirmation-saved": "Votre modification a été enregistrée.",
        "edit-already-exists": "La nouvelle page n'a pas pu être créée.\nElle existe déjà.",
        "defaultmessagetext": "Message par défaut",
-       "content-failed-to-parse": "Échec de l’analyse syntaxique du contenu de $2 pour le modèle $1: $3",
+       "content-failed-to-parse": "Échec de l’analyse syntaxique du contenu de $2 pour le modèle $1 : $3",
        "invalid-content-data": "Données du contenu non valides",
        "content-not-allowed-here": "Le contenu « $1 » n’est pas autorisé sur la page [[$2]]",
        "editwarning-warning": "Quitter cette page vous fera perdre toutes les modifications que vous avez faites.\nSi vous êtes connecté{{GENDER:||e}}, vous pouvez désactiver cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objet vide",
        "content-json-empty-array": "Tableau vide",
-       "duplicate-args-warning": "<strong>Avertissement:</strong> [[:$1]] appelle [[:$2]] avec plus d'une valeur pour le paramètre \"$3\". Seule la dernière valeur fournie sera utilisée.",
+       "duplicate-args-warning": "<strong>Avertissement :</strong> [[:$1]] appelle [[:$2]] avec plus d'une valeur pour le paramètre « $3 ». Seule la dernière valeur fournie sera utilisée.",
        "duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
        "duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Attention : cette page contient de trop nombreux appels à des fonctions coûteuses de l'analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a maintenant $1.",
        "rev-deleted-user": "(nom d'utilisateur retiré)",
        "rev-deleted-event": "(détails de l’entrée retirée)",
        "rev-deleted-user-contribs": "[nom d'utilisateur ou adresse IP retiré - modification masquée sur les contributions]",
-       "rev-deleted-text-permission": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
-       "rev-suppressed-text-permission": "Cette version de la page a été <strong>supprimée</strong>.\nLes détails se trouvent dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des suppressions].",
-       "rev-deleted-text-unhide": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} le journal des effacements].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
-       "rev-suppressed-text-unhide": "Cette version de la page a été '''supprimée'''.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} le journal des suppression].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
-       "rev-deleted-text-view": "Cette version de la page a été '''effacée'''.\nVous pouvez la visualiser ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
-       "rev-suppressed-text-view": "Cette version de la page a été '''supprimée'''.\nVous pouvez la visualiser ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des suppressions].",
-       "rev-deleted-no-diff": "Vous ne pouvez pas voir ce diff parce qu'une des versions a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
+       "rev-deleted-text-permission": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
+       "rev-suppressed-text-permission": "Cette version de la page a été <strong>supprimée</strong>.\nLes détails se trouvent dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des masquages].",
+       "rev-deleted-text-unhide": "Cette version de la page a été '''effacée'''.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} le journal des suppressions].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
+       "rev-suppressed-text-unhide": "Cette version de la page a été '''supprimée'''.\nDes détails sont disponibles dans [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} le journal des masquages].\nVous pouvez toujours [$1 voir cette version] si vous le voulez.",
+       "rev-deleted-text-view": "Cette version de la page a été '''effacée'''.\nVous pouvez la visualiser ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
+       "rev-suppressed-text-view": "Cette version de la page a été '''supprimée'''.\nVous pouvez la visualiser ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des masquages].",
+       "rev-deleted-no-diff": "Vous ne pouvez pas voir ce diff parce qu'une des versions a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "rev-suppressed-no-diff": "Vous ne pouvez pas voir cette différence car une des révisions a été '''supprimée'''.",
-       "rev-deleted-unhide-diff": "Une des révisions de cette différence a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].\nVous pouvez toujours [$1 voir cette différence] si vous le voulez.",
-       "rev-suppressed-unhide-diff": "L'une des révisions de ce diff a été '''supprimée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des suppressions].\nVous pouvez toujours [$1 voir ce diff] si vous souhaitez poursuivre.",
-       "rev-deleted-diff-view": "Une des révisions de ce diff a été '''supprimée'''.\nVous pouvez voir ce diff ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
-       "rev-suppressed-diff-view": "Une des révisions de ce diff a été '''effacée'''.\nVous pouvez voir ce diff ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des effacements].",
+       "rev-deleted-unhide-diff": "Une des révisions de cette différence a été '''effacée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].\nVous pouvez toujours [$1 voir cette différence] si vous le voulez.",
+       "rev-suppressed-unhide-diff": "L'une des révisions de ce diff a été '''supprimée'''.\nDes détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des masquages].\nVous pouvez toujours [$1 voir ce diff] si vous souhaitez poursuivre.",
+       "rev-deleted-diff-view": "Une des révisions de ce diff a été '''effacée'''.\nVous pouvez voir ce diff ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
+       "rev-suppressed-diff-view": "Une des révisions de ce diff a été '''supprimée'''.\nVous pouvez voir ce diff ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des masquages].",
        "rev-delundel": "afficher/masquer",
        "rev-showdeleted": "afficher",
        "revisiondelete": "Supprimer ou restaurer des événements",
        "revdelete-nooldid-title": "Version cible non valide",
        "revdelete-nooldid-text": "Vous n’avez pas précisé de révision(s) cible(s) pour cette fonction, ou bien la révision spécifiée n’existe pas, ou bien vous tentez de masquer la révision actuelle.",
        "revdelete-no-file": "Le fichier spécifié n'existe pas.",
-       "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e|(e)}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
+       "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "revdelete-show-file-submit": "Oui",
        "revdelete-selected-text": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]] :",
        "revdelete-selected-file": "{{PLURAL:$1|Version de fichier sélectionnée|Versions de fichier sélectionnées}} de [[:$2]] :",
        "search-category": "(catégorie $1)",
        "search-file-match": "(correspond au contenu du fichier)",
        "search-suggest": "Essayez avec cette orthographe : $1",
-       "search-rewritten": "Affiche les résultats pour $1. Recherchez à sa place pour $2.",
+       "search-rewritten": "Résultats affichés pour $1. Rechercher $2 à la place.",
        "search-interwiki-caption": "Projets frères",
        "search-interwiki-default": "Résultats de $1 :",
        "search-interwiki-more": "(plus)",
        "showingresultsinrange": "Afficher ci-dessous jusqu’à {{PLURAL:$1|<strong>1</strong> résultat|<strong>$1</strong> résultats}} dans la série #<strong>$2</strong> à #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Résultat <strong>$1</strong> parmi <strong>$3</strong>|Résultats <strong>$1 à $2</strong> parmi <strong>$3</strong>}}",
        "search-nonefound": "Il n'y a aucun résultat correspondant à la requête.",
+       "search-nonefound-thiswiki": "Il n’y a pas de résultats correspondant à la requête sur ce site.",
        "powersearch-legend": "Recherche avancée",
        "powersearch-ns": "Rechercher dans les espaces de noms :",
        "powersearch-togglelabel": "Cocher :",
        "prefs-help-prefershttps": "Cette préférence sera effective lors de votre prochaine connexion.",
        "prefswarning-warning": "Vous avez effectué des modifications dans vos préférences qui n’ont pas encore été enregistrées.\nSi vous quittez cette page sans cliquer sur « $1 », vos préférences ne seront pas mises à jour.",
        "prefs-tabs-navigation-hint": "Astuce : Vous pouvez utiliser les flèches de gauche et de droite pour naviguer entre les onglets.",
-       "email-address-validity-valid": "Semble valide",
-       "email-address-validity-invalid": "Une adresse valide est nécessaire !",
        "userrights": "Gestion des droits des utilisateurs",
        "userrights-lookup-user": "Gestion des groupes d'utilisateurs",
        "userrights-user-editname": "Entrez un nom d'utilisateur :",
        "userrights-removed-self": "Vous avez bien supprimé vos propres droits. Du coup, vous ne pouvez plus accéder à cette page.",
        "group": "Groupe :",
        "group-user": "Utilisateurs",
-       "group-autoconfirmed": "Utilisateurs enregistrés",
+       "group-autoconfirmed": "Utilisateurs autoconfirmés",
        "group-bot": "Robots",
        "group-sysop": "Administrateurs",
        "group-bureaucrat": "Bureaucrates",
        "group-suppress": "Limitateurs",
        "group-all": "(tous)",
        "group-user-member": "{{GENDER:$1|utilisateur|utilisatrice}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|utilisateur enregistré|utilisatrice enregistrée}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|utilisateur autoconfirmé|utilisatrice autoconfirmée}}",
        "group-bot-member": "{{GENDER:$1|robot}}",
        "group-sysop-member": "{{GENDER:$1|administrateur|administratrice}}",
        "group-bureaucrat-member": "{{GENDER:$1|bureaucrate}}",
        "group-suppress-member": "{{GENDER:$1|limitateur|limitatrice}}",
        "grouppage-user": "{{ns:project}}:Utilisateurs",
-       "grouppage-autoconfirmed": "{{ns:project}}:Utilisateurs enregistrés",
+       "grouppage-autoconfirmed": "{{ns:project}}:Utilisateurs autoconfirmés",
        "grouppage-bot": "{{ns:project}}:Robots",
        "grouppage-sysop": "{{ns:project}}:Administrateurs",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrates",
        "right-noratelimit": "Ne pas être affecté par les limites de taux",
        "right-import": "Importer des pages depuis d'autres wikis",
        "right-importupload": "Importer des pages depuis un fichier",
-       "right-patrol": "Marquer des modifications des autres comme vérifiées",
-       "right-autopatrol": "Avoir ses modifications automatiquement marquées comme surveillées",
-       "right-patrolmarks": "Voir les marquages de surveillance dans les modifications récentes",
+       "right-patrol": "Marquer des modifications des autres comme relues",
+       "right-autopatrol": "Avoir ses modifications automatiquement marquées comme relues",
+       "right-patrolmarks": "Voir les marquages de relecture dans les modifications récentes",
        "right-unwatchedpages": "Voir la liste des pages non suivies",
        "right-mergehistory": "Fusionner les historiques des pages",
        "right-userrights": "Modifier tous les droits d'un utilisateur",
        "recentchanges-label-newpage": "Cette modification a créé une nouvelle page",
        "recentchanges-label-minor": "Cette modification est mineure.",
        "recentchanges-label-bot": "Cette modification a été effectuée par un robot.",
-       "recentchanges-label-unpatrolled": "Cette modification n'a pas encore été patrouillée.",
+       "recentchanges-label-unpatrolled": "Cette modification n’a pas encore été relue.",
        "recentchanges-label-plusminus": "La taille de la page a changé de ce nombre d’octets.",
        "recentchanges-legend-heading": "'''Légende :'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (voir aussi la [[Special:NewPages|liste des nouvelles pages]]).",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Lister",
        "rcnotefrom": "Ci-dessous {{PLURAL:$5|la modification effectuée|les modifications effectuées}} depuis le <strong>$3, $4</strong> (affichées jusqu’à <strong>$1</strong>).",
        "rclistfrom": "Afficher les nouvelles modifications depuis le $3 à $2",
        "rcshowhideminor": "$1 les modifications mineures",
        "backend-fail-notsame": "Un fichier différent existe déjà pour $1 .",
        "backend-fail-invalidpath": "$1 n’est pas un chemin de stockage valide.",
        "backend-fail-delete": "Impossible de supprimer le fichier $1.",
-       "backend-fail-describe": "Impossible de modifier les métadonnées du fichier \"$1\".",
+       "backend-fail-describe": "Impossible de modifier les métadonnées du fichier « $1 ».",
        "backend-fail-alreadyexists": "Le fichier $1 existe déjà.",
        "backend-fail-store": "Impossible de stocker le fichier $1 en $2.",
        "backend-fail-copy": "Impossible de copier le fichier $1 en $2.",
        "backend-fail-read": "Impossible de lire le fichier $1.",
        "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-readonly": "Le support de stockage « $1 » est actuellement en lecture seule. La raison indiquée est : « <em>$2</em> »",
+       "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 de lire ou d’écrire le fichier « $1 » en raison de droits insuffisants ou répertoires/conteneurs manquants.",
-       "filejournal-fail-dbconnect": "Impossible de se connecter à la base de données du journal pour le terminal de stockage \"$1\".",
-       "filejournal-fail-dbquery": "Impossible de mettre à jour la base de données du journal pour le terminal de stockage \"$1\".",
+       "filejournal-fail-dbconnect": "Impossible de se connecter à la base de données du journal pour le terminal de stockage « $1 ».",
+       "filejournal-fail-dbquery": "Impossible de mettre à jour la base de données du journal pour le terminal de stockage « $1 ».",
        "lockmanager-notlocked": "Impossible de déverrouiller « $1 » ; elle n'est pas verrouillée.",
        "lockmanager-fail-closelock": "Impossible de fermer le fichier de verrou pour « $1 ».",
        "lockmanager-fail-deletelock": "Impossible de supprimer le fichier de verrou pour « $1 ».",
        "mostrevisions": "Pages les plus modifiées",
        "prefixindex": "Toutes les pages commençant par…",
        "prefixindex-namespace": "Toutes les pages avec préfixe (espace de noms $1)",
+       "prefixindex-submit": "Lister",
        "prefixindex-strip": "Enlever le préfixe dans la liste",
        "shortpages": "Pages courtes",
        "longpages": "Pages longues",
        "protectedpages-performer": "Protection de l’utilisateur",
        "protectedpages-params": "Paramètres de protection",
        "protectedpages-reason": "Motif",
+       "protectedpages-submit": "Afficher les pages",
        "protectedpages-unknown-timestamp": "Inconnu",
        "protectedpages-unknown-performer": "Utilisateur inconnu",
        "protectedtitles": "Titres protégés",
        "protectedtitles-summary": "Cette page liste les titres actuellement protégés contre la création. Pour une liste des pages protégées existantes, voir [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Aucun titre n'est actuellement protégé avec ces paramètres.",
+       "protectedtitles-submit": "Afficher les titres",
        "listusers": "Liste des utilisateurs",
        "listusers-editsonly": "Ne montrer que les utilisateurs ayant au moins une contribution",
        "listusers-creationsort": "Trier par date de création",
        "usereditcount": "$1 modification{{PLURAL:$1||s}}",
        "usercreated": "{{GENDER:$3|Créé}} le $1 à $2",
        "newpages": "Nouvelles pages",
+       "newpages-submit": "Lister",
        "newpages-username": "Nom d'utilisateur :",
        "ancientpages": "Pages les plus anciennement modifiées",
        "move": "Renommer",
        "specialloguserlabel": "Auteur :",
        "speciallogtitlelabel": "Cible (titre ou {{ns:user}}:nom d'utilisateur) :",
        "log": "Journaux d’opérations",
+       "logeventslist-submit": "Lister",
        "all-logs-page": "Tous les journaux publics",
        "alllogstext": "Affichage combiné de tous les journaux disponibles sur {{SITENAME}}.<br />\nVous 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.",
        "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.",
        "categories": "Liste des catégories",
+       "categories-submit": "Lister",
        "categoriespagetext": "{{PLURAL:$1|La catégorie suivante est utilisée|Les catégories suivantes sont utilisées}} par des pages ou fichiers.\n[[Special:UnusedCategories|Les catégories inutilisées]] ne sont pas affichées ici.\nVoyez aussi [[Special:WantedCategories|les catégories demandées]].",
        "categoriesfrom": "Afficher les catégories à partir de :",
        "special-categories-sort-count": "tri par nombre d'éléments",
        "activeusers-hidebots": "Masquer les robots",
        "activeusers-hidesysops": "Masquer les administrateurs",
        "activeusers-noresult": "Aucun utilisateur trouvé.",
+       "activeusers-submit": "Afficher les utilisateurs actifs",
        "listgrouprights": "Droits des groupes d'utilisateurs",
        "listgrouprights-summary": "Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d'accès qui leur sont associés.\nDes [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuvent exister au sujet des droits individuels.",
        "listgrouprights-key": "Légende :\n*<span class=\"listgrouprights-granted\">Droit octroyé</span>\n*<span class=\"listgrouprights-revoked\">Droit révoqué</span>",
        "watchlistanontext": "Veuillez vous connecter pour visualiser ou modifier les éléments de votre liste de suivi.",
        "watchnologin": "Non connecté",
        "addwatch": "Ajouter à la liste de suivi",
-       "addedwatchtext": "La page «[[:$1]]» et sa page de discussion ont été ajoutées à votre [[Special:Watchlist|liste de suivi]].",
+       "addedwatchtext": "La page « [[:$1]] » et sa page de discussion ont été ajoutées à votre [[Special:Watchlist|liste de suivi]].",
        "addedwatchtext-short": "La page « $1 » a été ajoutée à votre liste de suivi.",
        "removewatch": "Supprimer de la liste de suivi",
        "removedwatchtext": "La page « [[:$1]] » et sa page de discussion ont été retirées de votre [[Special:Watchlist|liste de suivi]].",
        "wlheader-showupdated": "Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
        "wlnote": "Ci-dessous {{PLURAL:$1|figure la dernière modification effectuée|figurent les <strong>$1</strong> dernières modifications effectuées}} durant {{PLURAL:$2|la dernière heure|les <strong>$2</strong> dernières heures}}, depuis $3, $4.",
        "wlshowlast": "Montrer les dernières $1 heures, les derniers $2 jours",
+       "watchlistall2": "tout",
+       "watchlist-hide": "Masquer",
+       "watchlist-submit": "Lister",
+       "wlshowtime": "Période affichée :",
+       "wlshowhideminor": "modifications mineures",
+       "wlshowhidebots": "robots",
+       "wlshowhideliu": "utilisateurs inscrits",
+       "wlshowhideanons": "utilisateurs anonymes",
+       "wlshowhidepatr": "modifications relues",
+       "wlshowhidemine": "mes modifications",
        "watchlist-options": "Options de la liste de suivi",
        "watching": "Suivi…",
        "unwatching": "Fin du suivi…",
        "delete-confirm": "Supprimer « $1 »",
        "delete-legend": "Supprimer",
        "historywarning": "<strong>Attention :</strong> la page que vous êtes sur le point de supprimer a un historique avec $1 {{PLURAL:$1|version|versions}} :",
+       "historyaction-submit": "Lister",
        "confirmdeletetext": "Vous êtes sur le point de supprimer une page ou un fichier, ainsi que toutes ses versions antérieures historisées. Veuillez confirmer que c’est bien là ce que vous voulez faire, que vous en comprenez les conséquences et que vous faites ceci en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].",
        "actioncomplete": "Action effectuée",
        "actionfailed": "L'action a échoué",
        "deletedtext": "« $1 » a été supprimée.\nVoir $2 pour une liste des suppressions récentes.",
-       "dellogpage": "Journal des suppressions de page",
+       "dellogpage": "Journal des suppressions",
        "dellogpagetext": "Voici la liste des suppressions les plus récentes.",
        "deletionlog": "journal des suppressions",
        "reverted": "Version précédente rétablie",
        "protect-cascadeon": "Cette page est protégée car elle est transcluse dans {{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.\nLa modification du niveau de protection de cette page n'affectera pas la protection en cascade.",
        "protect-default": "Autoriser tous les utilisateurs",
        "protect-fallback": "Autoriser uniquement les utilisateurs avec le droit « $1 »",
-       "protect-level-autoconfirmed": "Autoriser uniquement les utilisateurs auto-confirmés",
+       "protect-level-autoconfirmed": "Autoriser uniquement les utilisateurs autoconfirmés",
        "protect-level-sysop": "Autoriser uniquement les administrateurs",
        "protect-summary-cascade": "protection en cascade",
        "protect-expiring": "expire le $1 (UTC)",
        "undeleterevision-missing": "Version incorrecte ou manquante.\nVous avez peut-être un mauvais lien, ou la version a pu être restaurée ou supprimée de l’archive.",
        "undelete-nodiff": "Aucune version précédente trouvée.",
        "undeletebtn": "Restaurer",
-       "undeletelink": "visualiser/rétablir",
+       "undeletelink": "voir/restaurer",
        "undeleteviewlink": "voir",
        "undeleteinvert": "Inverser la sélection",
        "undeletecomment": "Motif :",
        "undeletedrevisions": "$1 {{PLURAL:$1|version restaurée|versions restaurées}}",
        "undeletedrevisions-files": "$1 version{{PLURAL:$1||s}} et $2 fichier{{PLURAL:$2||s}} restauré{{PLURAL:$2||s}}",
        "undeletedfiles": "$1 {{PLURAL:$1|fichier restauré|fichiers restaurés}}",
-       "cannotundelete": "Échec de la restauration:\n$1",
+       "cannotundelete": "Échec de la restauration :\n$1",
        "undeletedpage": "'''La page $1 a été restaurée.'''\n\nConsultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la liste des récentes suppressions et restaurations.",
        "undelete-header": "Consultez le [[Special:Log/delete|journal des suppressions]] pour lister les pages récemment supprimées.",
        "undelete-search-title": "Rechercher les pages supprimées",
        "contributions": "Contributions de l’{{GENDER:$1|utilisateur|utilisatrice}}",
        "contributions-title": "Liste des contributions de l’utilisat{{GENDER:$1|eur|rice|eur}} $1",
        "mycontris": "Contributions",
+       "anoncontribs": "Contributions",
        "contribsub2": "Pour {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Le compte utilisateur « $1 » n’est pas enregistré.",
        "nocontribs": "Aucune modification correspondant à ces critères n'a été trouvée.",
        "whatlinkshere-hidelinks": "$1 les liens",
        "whatlinkshere-hideimages": "$1 les liens vers le fichier",
        "whatlinkshere-filters": "Filtres",
+       "whatlinkshere-submit": "Lister",
        "autoblockid": "Blocage automatique #$1",
        "block": "Bloquer l’utilisateur",
        "unblock": "Débloquer l’utilisateur",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] a été bloqué{{GENDER:$1||e}}.<br />\nConsultez 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{{GENDER:||e}} 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{{GENDER:||e}} de vouloir le faire ?",
-       "ipb-confirmaction": "Si vous êtes sûr{{GENDER:||e|(e)}} de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.",
+       "ipb-confirmaction": "Si vous êtes sûr{{GENDER:||e}} de vraiment vouloir le faire, veuillez cocher le champ « {{int:ipb-confirm}} » en bas.",
        "ipb-edit-dropdown": "Modifier les motifs de blocage par défaut",
        "ipb-unblock-addr": "Débloquer $1",
        "ipb-unblock": "Débloquer un compte utilisateur ou une adresse IP",
        "autoblocker": "Vous avez été bloqué automatiquement parce que votre adresse IP a été récemment utilisée par « [[User:$1|$1]] ».\nLe motif fourni pour le blocage de $1 est « $2 »",
        "blocklogpage": "Journal des blocages",
        "blocklog-showlog": "Cet utilisateur a été bloqué précédemment. Le journal des blocages est disponible ci-dessous :",
-       "blocklog-showsuppresslog": "Cet utilisateur a été bloqué et caché précédemment. Le journal des suppressions est disponible ci-dessous :",
+       "blocklog-showsuppresslog": "Cet utilisateur a été bloqué et masqué précédemment. Le journal des masquages est disponible ci-dessous :",
        "blocklogentry": "a bloqué [[$1]] ; expiration : $2 $3",
        "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 blocage et déblocage d’utilisateurs.\nLes adresses IP automatiquement bloquées ne sont pas listées.\nConsultez la [[Special:BlockList|liste des blocages]] pour voir les bannissements et blocages effectivement en cours.",
        "movenosubpage": "Cette page n'a aucune sous-page.",
        "movereason": "Motif :",
        "revertmove": "rétablir",
-       "delete_and_move": "Supprimer et renommer",
        "delete_and_move_text": "== Suppression requise ==\nLa page de destination « [[:$1]] » existe déjà.\nÊtes-vous certain{{GENDER:||e|}} de vouloir la supprimer pour permettre ce renommage ?",
        "delete_and_move_confirm": "Oui, supprimer la page de destination",
        "delete_and_move_reason": "Page supprimée pour permettre le renommage depuis « [[$1]] »",
        "tooltip-pt-preferences": "Vos préférences",
        "tooltip-pt-watchlist": "La liste des pages dont vous suivez les modifications",
        "tooltip-pt-mycontris": "La liste de vos contributions",
+       "tooltip-pt-anoncontribs": "Une liste des modifications effectuées depuis cette adresse IP",
        "tooltip-pt-login": "Il est recommandé de vous identifier ; ce n'est cependant pas obligatoire.",
        "tooltip-pt-logout": "Se déconnecter",
        "tooltip-pt-createaccount": "Il vous est conseillé de créer un compte et de vous connecter ; cependant, ce n’est pas obligatoire",
        "common.css": "/* Le CSS placé ici sera appliqué à tous les habillages. */",
        "print.css": "/* Le CSS placé ici affectera les impressions */",
        "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-autoconfirmed.css": "/* Le CSS placé ici n’affectera que les utilisateurs autoconfirmés. */",
        "group-user.css": "/* Le CSS placé ici n’affectera que les utilisateurs enregistrés. */",
        "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 */",
        "common.js": "/* Tout JavaScript ici sera chargé avec chaque page accédée par n’importe quel utilisateur. */",
-       "group-autoconfirmed.js": "/* Le JavaScript inclus ici n’affectera que les utilisateurs auto-confirmés */",
+       "group-autoconfirmed.js": "/* Le JavaScript inclus ici n’affectera que les utilisateurs autoconfirmés */",
        "group-user.js": "/* Le JavaScript placé ici ne sera chargé que pour les utilisateurs enregistrés. */",
        "group-bot.js": "/* Le JavaScript inclus ici n’affectera que les robots */",
        "group-sysop.js": "/* Le JavaScript inclus ici n’affectera que les administrateurs */",
        "markedaspatrollederrortext": "Vous devez sélectionner une version pour pouvoir la marquer comme relue.",
        "markedaspatrollederror-noautopatrol": "Vous n'avez pas le droit de marquer vos propres modifications comme relues.",
        "markedaspatrollednotify": "Cette modification de $1 a été marquée comme relue.",
-       "markedaspatrollederrornotify": "Échec du marquage comme contrôlé.",
+       "markedaspatrollederrornotify": "Échec du marquage de la modification comme relue.",
        "patrol-log-page": "Journal des relectures",
        "patrol-log-header": "Voici l’historique des versions relues.",
        "log-show-hide-patrol": "$1 l’historique des relectures",
        "file-info-size-pages": "$1 × $2 pixels, taille de fichier : $3, type MIME : $4, $5 page{{PLURAL:$5||s}}",
        "file-nohires": "Pas de plus haute résolution disponible.",
        "svg-long-desc": "Fichier SVG, résolution de $1 × $2 pixels, taille : $3",
-       "svg-long-desc-animated": "Fichier SVG animé, taille $1 x $2 pixels, taille du fichier: $3",
-       "svg-long-error": "Fichier SVG non valide: $1",
+       "svg-long-desc-animated": "Fichier SVG animé, taille $1 × $2 pixels, taille du fichier : $3",
+       "svg-long-error": "Fichier SVG non valide : $1",
        "show-big-image": "Fichier d'origine",
        "show-big-image-preview": "Taille de cet aperçu : $1.",
        "show-big-image-preview-differ": "Taille de cet aperçu $3 de ce fichier $2 : $1.",
        "exif-compression-6": "JPEG (ancien)",
        "exif-copyrighted-true": "Soumis au droit d'auteur",
        "exif-copyrighted-false": "État des droits d’auteur non défini",
+       "exif-photometricinterpretation-1": "Noir et blanc (0 pour le noir)",
        "exif-unknowndate": "Date inconnue",
        "exif-orientation-1": "Normale",
        "exif-orientation-2": "Inversée horizontalement",
        "hijri-calendar-m12": "Dhou al-hijja",
        "hebrew-calendar-m1": "tichri",
        "hebrew-calendar-m2": "hechvan",
-       "hebrew-calendar-m3": "Kislev",
-       "hebrew-calendar-m4": "Téveth",
-       "hebrew-calendar-m5": "Schébat",
-       "hebrew-calendar-m6": "Adar",
-       "hebrew-calendar-m7": "Nissane",
-       "hebrew-calendar-m8": "Iyar",
-       "hebrew-calendar-m9": "Sivane",
-       "hebrew-calendar-m10": "Tamouz",
-       "hebrew-calendar-m11": "Av",
-       "hebrew-calendar-m12": "Éloul",
+       "hebrew-calendar-m3": "kislev",
+       "hebrew-calendar-m4": "tévet",
+       "hebrew-calendar-m5": "chevat",
+       "hebrew-calendar-m6": "adar",
+       "hebrew-calendar-m6a": "adar I",
+       "hebrew-calendar-m6b": "adar II",
+       "hebrew-calendar-m7": "nissan",
+       "hebrew-calendar-m8": "iyar",
+       "hebrew-calendar-m9": "sivan",
+       "hebrew-calendar-m10": "tamouz",
+       "hebrew-calendar-m11": "av",
+       "hebrew-calendar-m12": "eloul",
        "hebrew-calendar-m1-gen": "tichri",
        "hebrew-calendar-m2-gen": "hechvan",
-       "hebrew-calendar-m3-gen": "Kislev",
-       "hebrew-calendar-m4-gen": "Téveth",
-       "hebrew-calendar-m5-gen": "Schébat",
-       "hebrew-calendar-m6-gen": "Adar",
-       "hebrew-calendar-m7-gen": "Nissane",
-       "hebrew-calendar-m8-gen": "Iyar",
-       "hebrew-calendar-m9-gen": "Sivane",
-       "hebrew-calendar-m10-gen": "Tamouz",
-       "hebrew-calendar-m11-gen": "Av",
-       "hebrew-calendar-m12-gen": "Éloul",
+       "hebrew-calendar-m3-gen": "kislev",
+       "hebrew-calendar-m4-gen": "tévet",
+       "hebrew-calendar-m5-gen": "chevat",
+       "hebrew-calendar-m6-gen": "adar",
+       "hebrew-calendar-m6a-gen": "adar I",
+       "hebrew-calendar-m6b-gen": "adar II",
+       "hebrew-calendar-m7-gen": "nissan",
+       "hebrew-calendar-m8-gen": "iyar",
+       "hebrew-calendar-m9-gen": "sivan",
+       "hebrew-calendar-m10-gen": "tamouz",
+       "hebrew-calendar-m11-gen": "av",
+       "hebrew-calendar-m12-gen": "eloul",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
        "duplicate-defaultsort": "Attention : la clé de tri par défaut « $2 » écrase la précédente clé « $1 ».",
-       "duplicate-displaytitle": "<strong>Attention :</strong> Le titre d'affichage «$2» remplace l'ancien titre d'affichage «$1».",
+       "duplicate-displaytitle": "<strong>Attention :</strong> Le titre d'affichage « $2 » remplace l'ancien titre d'affichage « $1 ».",
        "invalid-indicator-name": "<strong>Erreur :</strong> L’attribut <code>name</code> des indicateurs d’état de la page ne doit pas être vide.",
        "version": "Version",
        "version-extensions": "Extensions installées",
        "tags-edit-revision-legend": "Ajouter ou enlever des balises de {{PLURAL:$1|cette révision|toutes les $1 révisions}}",
        "tags-edit-logentry-legend": "Ajouter ou enlever les balises de {{PLURAL:$1|cette entrée de journal|toutes les $1 entrées de journal}}",
        "tags-edit-existing-tags": "Balises existantes :",
-       "tags-edit-existing-tags-none": "\"Aucun\"",
+       "tags-edit-existing-tags-none": "''Aucun''",
        "tags-edit-new-tags": "Nouvelles balises :",
        "tags-edit-add": "Ajouter ces balises :",
        "tags-edit-remove": "Enlever ces balises :",
        "htmlform-cloner-create": "Ajouter encore",
        "htmlform-cloner-delete": "Supprimer",
        "htmlform-cloner-required": "Une valeur au moins est obligatoire.",
-       "htmlform-title-badnamespace": "[[:$1]] n'est pas dans l'espace de noms \"{{ns:$2}}\" .",
-       "htmlform-title-not-creatable": "\"$1\" n'est pas un titre de page réalisable",
-       "htmlform-title-not-exists": "[[:$1]] n’existe pas",
+       "htmlform-title-badnamespace": "[[:$1]] n'est pas dans l’espace de noms « {{ns:$2}} ».",
+       "htmlform-title-not-creatable": "« $1 » n’est pas un titre de page pouvant être créée",
+       "htmlform-title-not-exists": "$1 n’existe pas",
        "htmlform-user-not-exists": "<strong>$1</strong> n’existe pas.",
        "htmlform-user-not-valid": "<strong>$1</strong> n’est pas un nom d’utilisateur valide.",
        "sqlite-has-fts": "$1 avec recherche en texte intégral supportée",
        "logentry-suppress-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|a importé}} $3 par téléchargement de fichier",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|a importé}} $3 par téléchargement de fichier ($4 {{PLURAL:$4|révision|révisions}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|a importé}} $3 depuis un autre wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|a importé}} $3 depuis $5 ($4 {{PLURAL:$4|révision|révisions}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|a fusionné}} $3 en $4 (révisions jusqu’à $5)",
        "logentry-move-move": "$1 {{GENDER:$2|a déplacé}} la page $3 vers $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|a déplacé}} la page $3 vers $4 sans laisser de redirection",
        "feedback-bugornote": "Si vous êtes prêt à décrire un problème technique en détail, veuillez [$1 signaler un bogue].\nSinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentaire sera ajouté à la page « [$3 $2] », avec votre nom d'utilisateur.",
        "feedback-cancel": "Annuler",
        "feedback-close": "Fait",
-       "feedback-external-bug-report-button": "Signaler un bug technique",
+       "feedback-external-bug-report-button": "Signaler un bogue technique",
        "feedback-dialog-title": "Soumettre un commentaire",
        "feedback-dialog-intro": "Vous pouvez utiliser le simple formulaire ci-dessous pour faire parvenir vos commentaires. Votre commentaire sera ajouté à la page « $1 », ainsi que votre nom d’utilisateur.",
        "feedback-error-title": "Erreur",
        "api-error-ok-but-empty": "Erreur interne : Le serveur n'a pas répondu.",
        "api-error-overwrite": "Écraser un fichier existant n'est pas autorisé.",
        "api-error-stashfailed": "Erreur interne : le serveur n'a pas pu enregistrer le fichier temporaire.",
-       "api-error-publishfailed": "Erreur interne: Le serveur n'a pas pu publier le fichier temporaire.",
+       "api-error-publishfailed": "Erreur interne : Le serveur n'a pas pu publier le fichier temporaire.",
        "api-error-stasherror": "Une erreur s'est produite lors du téléchargement du fichier pour le dissimuler.",
        "api-error-stashedfilenotfound": "Le fichier caché n’a pas été trouvé lors de la tentative pour le télécharger depuis sa cachette.",
        "api-error-stashpathinvalid": "Le chemin où aurait dû se trouver le fichier caché n’est pas valide.",
index 3c89d9a..be92a64 100644 (file)
        "nstab-template": "Patron",
        "nstab-help": "Aide",
        "nstab-category": "Classe",
+       "mainpage-nstab": "Page Principale",
        "nosuchaction": "Action inconnue",
        "nosuchactiontext": "L'action spécifiée dans l'adresse URL est invalide.\nTu as peut-être mal entré l'URL ou suivi un lien erroné.\nIl peut aussi s'indiquer d'un bug dans le logiciel utilisé par {{SITENAME}}.",
        "nosuchspecialpage": "Page espéciale inconnue",
        "prevn-title": "$1 {{PLURAL:$1|résultat dernier|résultats derniers}}",
        "nextn-title": "$1 {{PLURAL:$1|résultat suivant|résultats suivants}}",
        "viewprevnext": "Regarder ($1 {{int:pipe-separator}} $2) ($3).",
+       "searchprofile-images": "Multimédia",
        "searchprofile-everything": "Tout",
        "searchprofile-advanced": "Charche avancée",
        "searchprofile-articles-tooltip": "Charcher dans $1",
        "powersearch-toggleall": "Tout",
        "powersearch-togglenone": "Aucun",
        "preferences": "Réglage",
-       "mypreferences": "Mon réglage",
+       "mypreferences": "Préférences",
        "skin-preview": "Vue d'avance",
        "prefs-user-pages": "Pages d'useur",
        "prefs-personal": "Profil d'useur",
        "action-undelete": "restaurer cette page",
        "action-sendemail": "envoyer des emails",
        "nchanges": "$1 changement{{PLURAL:$1||s}}",
+       "enhancedrc-history": "changements",
        "recentchanges": "Changements récent",
+       "recentchanges-legend-heading": "'''Légende:'''",
+       "rcshowhideminor-hide": "Cacher",
        "rcshowhidebots": "$1 les robots",
+       "rcshowhidebots-show": "Afficher",
+       "rcshowhideliu-hide": "Cacher",
+       "rcshowhideanons-hide": "Cacher",
        "rcshowhidepatr": "$1 les modifications patrouillés",
+       "rcshowhidemine-hide": "Cacher",
        "diff": "diff",
        "hist": "hist",
+       "hide": "Cacher",
+       "show": "Afficher",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après changement",
        "recentchangeslinked-page": "Nom de la page:",
        "filename": "Nom du fichier",
        "filedesc": "Sommaire",
        "filehist": "Historique du fichier",
        "filehist-deleteall": "effacer tout",
        "filehist-deleteone": "effacer",
+       "filehist-current": "Courant",
+       "filehist-datetime": "Date et heure",
        "filehist-user": "Useur",
+       "filehist-dimensions": "Dimensions",
+       "filehist-comment": "Commentaire",
        "imagelinks": "Utilisation du fichier",
+       "nolinkstoimage": "Aucune page uses ce fichier.",
        "shared-repo-from": "de: $1",
        "filerevert-comment": "Raison:",
        "filedelete": "Effacer $1",
        "unusedimages": "Fichiers orphelins",
        "protectedpages-page": "Page",
        "protectedpages-reason": "Raison",
+       "newpages": "Nouvelles pages",
        "newpages-username": "Nom d'useur:",
        "ancientpages": "Pages les plus anciennement changées",
        "move": "Renommer",
        "emailuser": "Emailer cet useur",
        "emailuser-title-target": "Emailer {{GENDER:$1|cet useur|cette useuse}}",
        "emailuser-title-notarget": "Emailer useur",
-       "emailpage": "Emailer useur",
        "noemailtitle": "Aucune adresse d'email",
        "emailusername": "Nom d'useur:",
        "emailfrom": "De:",
        "deletecomment": "Raison:",
        "deleteotherreason": "Raison autre ou supplémentaire:",
        "deletereasonotherlist": "Autre raison",
+       "rollbacklink": "révoquer",
        "protectcomment": "Raison:",
        "restriction-edit": "Changer",
        "restriction-move": "Renommer",
        "undelete-search-submit": "Charcher",
        "undelete-show-file-submit": "Oui",
        "namespace": "Espace de noms:",
+       "invert": "Inverser la sélection",
        "blanknamespace": "(Principal)",
-       "contributions": "Changements de l'useur",
-       "mycontris": "Mes changements",
+       "contributions": "Contributions de l’{{GENDER:$1|useur|useuse}}",
+       "mycontris": "Contributions",
        "uctop": "(actuel)",
        "sp-contributions-talk": "Discuter",
        "sp-contributions-submit": "Charcher",
+       "whatlinkshere": "Pages liées",
+       "whatlinkshere-title": "Pages qui connectent vers \"$1\"",
        "whatlinkshere-page": "Page:",
+       "isimage": "lien vers le fichier",
+       "whatlinkshere-next": "{{PLURAL:$1|suivante|$1 suivantes}}",
        "whatlinkshere-links": "← liens",
        "whatlinkshere-hidelinks": "$1 les liens",
+       "whatlinkshere-filters": "Filtres",
        "block": "Bloquer l’useur",
        "unblock": "Débloquer l’useur",
        "blockip": "Bloquer l’{{GENDER:$1|useur|useuse}}",
        "block-log-flags-nocreate": "création de compte interdite",
        "tooltip-pt-login": "Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier mais ce n’est pas obligatoire.",
        "tooltip-ca-talk": "Discussion de cette page de contenu",
+       "tooltip-ca-edit": "Changer cette page",
        "tooltip-ca-watch": "Additionner cette page à votre liste de suivi",
        "tooltip-search": "Charche {{SITENAME}}",
        "tooltip-search-fulltext": "Charche les pages pour ce texte",
        "tooltip-n-recentchanges": "La liste de changement récent dans ce wiki",
        "tooltip-n-randompage": "Afficher un page au hasard",
        "tooltip-n-help": "La place pour savoir",
+       "tooltip-t-whatlinkshere": "Liste des pages liées à celle-ci",
        "tooltip-t-specialpages": "Liste de tout les pages speciales",
-       "tooltip-ca-nstab-special": "Ceci est une page spéciale, vous ne pouvez pas la changer.",
+       "tooltip-t-print": "Version imprimable de cette page",
+       "tooltip-ca-nstab-user": "Voir la page d'useur",
+       "tooltip-ca-nstab-special": "Ceci est une page spéciale, et elle ne peut pas être changée.",
+       "pageinfo-toolboxlink": "Information sur la page",
        "bad_image_list": "Le format est le suivant :\n\nSeules les listes d’énumération (commençant par *) sont prises en compte. Le premier lien d’une ligne doit être celui d’une mauvaise image.\nLes autres liens sur la même ligne sont considérés comme des exceptions, par exemple des pages sur lesquelles l’image peut apparaître.",
+       "metadata": "Métadonnées",
+       "exif-orientation": "Orientation",
+       "exif-colorspace": "Espace des couleurs",
+       "exif-orientation-1": "Normale",
        "namespacesall": "Tous",
+       "monthsall": "tous",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discussion]])",
        "redirect-file": "Nom du fichier",
+       "specialpages": "Pages spéciales",
        "searchsuggest-search": "Charcher"
 }
index 1bf2083..3aca26e 100644 (file)
@@ -17,6 +17,7 @@
        "tog-hideminor": "Letj anrangen fersteeg",
        "tog-hidepatrolled": "Letj anrangen fersteeg",
        "tog-newpageshidepatrolled": "Kontroliaret sidjen bi a \"Nei sidjen\" fersteeg",
+       "tog-hidecategorization": "Kategorisiarang faan sidjen fersteeg",
        "tog-extendwatchlist": "Ütjwidjet list faan sidjen, diar dü uun't uug behual wel",
        "tog-usenewrc": "Ütjwidjet uunwisin faan a ''Leetst feranrangen'' an bi a sidjen, diar dü ''Uun't uug behual'' wel",
        "tog-numberheadings": "Auerskraften automaatisk numeriare",
@@ -46,6 +47,7 @@
        "tog-watchlisthideliu": "Feranrangen faan uunmeldet brükern bi sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthideanons": "Feranrangen faan anonüüm brükern (IPs) bi sidjen, diar ik uun't uug behual wal, fersteeg",
        "tog-watchlisthidepatrolled": "Kontroliaret feranrangen bi a sidjen, diar ik uun't uug behual wal, fersteeg",
+       "tog-watchlisthidecategorization": "Kategorisiarang faan sidjen fersteeg",
        "tog-ccmeonemails": "Schüür mi kopiin faan e-mails, diar ik tu ööder brükern schüür",
        "tog-diffonly": "Bi en werjuunsferglik bluas di ferskeel uunwise, ei det hialer sidj",
        "tog-showhiddencats": "Ferbürgen kategoriin uunwise",
        "createaccountreason": "Grünj:",
        "createacct-reason": "Grünj",
        "createacct-reason-ph": "Huaram dü en ööder brükerkonto iinrachtst",
-       "createacct-captcha": "Seekerhaidspreew",
-       "createacct-imgcaptcha-ph": "Skriiw di tekst, diar dü boowen schochst",
        "createacct-submit": "Din brükerkonto iinracht",
        "createacct-another-submit": "En ööder brükerkonto iinracht",
        "createacct-benefit-heading": "{{SITENAME}} woort faan lidj üs di maaget.",
        "rcshowhidemine": "$1 min bidracher",
        "rcshowhidemine-show": "Wise",
        "rcshowhidemine-hide": "Fersteeg",
+       "rcshowhidecategorization": "$1 kategorisiarang faan sidjen",
+       "rcshowhidecategorization-show": "Wise",
+       "rcshowhidecategorization-hide": "Fersteeg",
        "rclinks": "Wise a leetst $1 feranrangen faan a leetst $2 daar.<br />$3",
        "diff": "ferskeel",
        "hist": "werjuunen",
        "upload-dialog-button-done": "Klaar",
        "upload-dialog-button-save": "Seekre",
        "upload-dialog-button-upload": "Huuchschüür",
-       "upload-process-error": "Diar as wat skiaf gingen",
-       "upload-process-warning": "Diar as en wäärnang kimen",
        "upload-form-label-select-file": "Datei ütjschük",
        "upload-form-label-infoform-title": "Enkelthaiden",
        "upload-form-label-infoform-name": "Nööm",
        "wlheader-showupdated": "Nei feranert sidjen wurd '''fäät''' uunwiset.",
        "wlnote": "Diar {{PLURAL:$1|stäänt det leetst feranrang|stun a leetst <strong>$1</strong> feranrangen}} faan a leetst {{PLURAL:$2|stünj|<strong>$2</strong> stünjen}}. Stant: $3, klook $4.",
        "wlshowlast": "Wise a feranrangen faan a leetst $1 stünjen, $2 daar.",
+       "watchlistall2": "aaltumaal",
        "watchlist-options": "Iinstelangen för't uunwisin",
        "watching": "Uun't uug behual ...",
        "unwatching": "Ei uun't uug behual ...",
        "htmlform-cloner-create": "Muar diartudu",
        "htmlform-cloner-delete": "Wechnem",
        "htmlform-cloner-required": "Dü skel tumanst ään wäärs uundu.",
-       "htmlform-title-not-exists": "[[:$1]] jaft at ei.",
+       "htmlform-title-not-exists": "$1 jaft at ei.",
        "htmlform-user-not-exists": "<strong>$1</strong> jaft at ei.",
        "htmlform-user-not-valid": "<strong>$1</strong> as nään tuläät brükernööm",
        "sqlite-has-fts": "Werjuun $1 mä halep för't schüken uun di hialer tekst.",
index ea547c5..2876ef2 100644 (file)
@@ -13,7 +13,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Robin0van0der0vliet",
-                       "Macofe"
+                       "Macofe",
+                       "Xð"
                ]
        },
        "tog-underline": "Keppelings ûnderstreekje:",
        "viewhelppage": "Helpside sjen litte",
        "categorypage": "Besjoch kategoryside",
        "viewtalkpage": "Oerlisside",
-       "otherlanguages": "Oare talen",
+       "otherlanguages": "In oare talen",
        "redirectedfrom": "(Trochwiisd fan \"$1\")",
        "redirectpagesub": "Trochferwiis-side",
        "lastmodifiedat": "Lêste kear bewurke op $2, $1.",
        "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Wêrom makkesto in oare akkount?",
-       "createacct-captcha": "Feiligenshifking",
-       "createacct-imgcaptcha-ph": "Nim de tekst fan hjirboppe oer",
        "createacct-submit": "Meitsje in akkount",
        "createacct-another-submit": "Meitsje in oare akkount",
        "createacct-benefit-heading": "{{SITENAME}} is makke troch minsken krekt as dy.",
        "watchlist-details": "Jo folchlist hat {{PLURAL:$1|$1 side|$1 siden}}, oerlissiden net meiteld.",
        "wlnote": "Dit {{PLURAL:$1|is de lêste feroaring|binne de lêste '''$1''' feroarings}} yn de lêste {{PLURAL:$2|oer|'''$2''' oeren}}.",
        "wlshowlast": "Lit feroarings sjen fan de lêste $1 oeren $2 dagen",
+       "watchlistall2": "alles",
        "watching": "Dwaande mei op'e folchlist te setten ...",
        "unwatching": "Dwaande mei fan'e folchlist ôf te heljen ...",
        "enotif_impersonal_salutation": "meidogger fan {{SITENAME}}",
        "movelogpagetext": "Dit is in list fan feroare titels.",
        "movereason": "Reden:",
        "revertmove": "werom sette",
-       "delete_and_move": "Fuortsmite en omneame",
        "delete_and_move_text": "== Wiskjen nedich ==\nDe doelside \"[[:$1]]\" is der al.\nMoat dy wiske wurde om plak te meitsjen foar it werneamen?",
        "delete_and_move_confirm": "Ja, wiskje de side",
        "delete_and_move_reason": "Wiske om plak te meitsjen foar in werneamde side",
index 0eeaf98..fce4d42 100644 (file)
        "nstab-template": "Teamplaid",
        "nstab-help": "Cuideachadh",
        "nstab-category": "Roinn-seòrsa",
+       "mainpage-nstab": "Prìomh-dhuilleag",
        "nosuchaction": "Chan eil a leithid de ghnìomh ann",
        "nosuchactiontext": "Tha an gnìomh a shònraich an t-URL mì-dhligheach.\nFaodaidh gun do chuir thu a-steach URL mearachdach no gun do lean thu ri ceangal mearachdach.\nCuideachd, faodaidh gu bheil seo 'na chomharradh air buga sa bhathar-bhog aig {{SITENAME}}",
        "nosuchspecialpage": "Chan eil duilleag shònraichte d' a leithid ann",
        "createaccountreason": "Adhbhar:",
        "createacct-reason": "Adhbhar",
        "createacct-reason-ph": "Carson a tha thu a' cruthachadh cunntas eile?",
-       "createacct-captcha": "Sgrùdadh tèarainteachd",
-       "createacct-imgcaptcha-ph": "Cuir a-steach an teacsa a chì thu gu h-àrd",
        "createacct-submit": "Cruthaich an cunntas agad",
        "createacct-another-submit": "Cruthaich cunntas eile",
        "createacct-benefit-heading": "Tha {{SITENAME}} 'ga chruthachadh le daoine mar thu fhèin.",
        "wlheader-showupdated": "Tha clò <strong>trom</strong> air duilleagan a chaidh atharrachadh on turas mu dheireadh a thadhail thu orra.",
        "wlnote": "Chì thu gu h-ìosal {{PLURAL:$1|a' $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|am $1 mùthadh}} mu dheireadh san {{PLURAL:$2|$2 uair a thìde|$2 uair a thìde|$2 uairean a thìde|$2 uair a thìde}} mu dheireadh, mar a bha e $3, $4.",
        "wlshowlast": "Seall na $1 uairean a thìde mu dheireadh $2 làithean mu dheireadh",
+       "watchlistall2": "na h-uile",
        "watchlist-options": "Roghainnean mo chlàir-faire",
        "watching": "'Ga chur air a' chlàr-fhaire...",
        "unwatching": "A' toirt far a' chlàir-fhaire...",
        "movenosubpage": "Chan eil fo-dhuilleag aig an duilleag seo.",
        "movereason": "Adhbhar:",
        "revertmove": "till",
-       "delete_and_move": "Sguab às agus gluais",
        "delete_and_move_text": "== Tha sguabadh às a dhìth ==\nTha an duilleag-uidhe \"[[:$1]]\" ann mar-thà.\nA bheil thu airson a sguabadh às ach am bidh rum airson a' ghluasaid ann?",
        "delete_and_move_confirm": "Siuthad, sguab às an duilleag",
        "delete_and_move_reason": "Chaidh a sguabadh às gus rum a airson a' ghluasaid o \"[[$1]]\" a chruthachadh",
        "tooltip-ca-nstab-main": "Seall duilleag na susbainte",
        "tooltip-ca-nstab-user": "Seall duilleag a' chleachdaiche",
        "tooltip-ca-nstab-media": "Seall duilleag a' mheadhain",
-       "tooltip-ca-nstab-special": "Seo duilleag shònraichte, chan urrainn dhut an duilleag fhèin a dheasachadh",
+       "tooltip-ca-nstab-special": "Seo duilleag shònraichte ’s cha ghabh a dheasachadh",
        "tooltip-ca-nstab-project": "Seall duilleag a' phròiseict",
        "tooltip-ca-nstab-image": "Seall duilleag an fhaidhle",
        "tooltip-ca-nstab-mediawiki": "Seall teachdaireachd an t-siostaim",
        "spam_reverting": "A' tilleadh dhan mhùthadh mu dheireadh anns nach eil ceangal gu $1",
        "spam_blanking": "Cha ceangal gu $1 anns gach mùthadh, 'ga bhànachadh",
        "spam_deleting": "Cha ceangal gu $1 anns gach mùthadh, 'ga sguabadh às",
-       "simpleantispam-label": "Dearbhadh an aghaidh spama.\n<strong>NA</strong> lìon seo!",
+       "simpleantispam-label": "Sgrùdadh an aghaidh spama.\n<strong>NA</strong> lìon seo!",
        "pageinfo-title": "Fiosrachadh airson \"$1\"",
        "pageinfo-not-current": "Duilich, ach cha ghabh am fiosrachadh seo a thoirt seachad airson seann mhùthaidhean.",
        "pageinfo-header-basic": "Fiosrachadh bunasach",
index 26d1d26..afb197f 100644 (file)
@@ -56,6 +56,7 @@
        "tog-watchlisthidebots": "Agochar as edicións dos bots na lista de vixilancia",
        "tog-watchlisthideminor": "Agochar as edicións pequenas na lista de vixilancia",
        "tog-watchlisthideliu": "Agochar as edicións dos usuarios rexistrados na lista de vixilancia",
+       "tog-watchlistreloadautomatically": "Recargar a lista de vixilancia automáticamente cando se produce un cambio nun filtro (require JavaScript)",
        "tog-watchlisthideanons": "Agochar as edicións dos usuarios anónimos na lista de vixilancia",
        "tog-watchlisthidepatrolled": "Agochar as edicións patrulladas na lista de vixilancia",
        "tog-watchlisthidecategorization": "Agochar a categorización das páxinas",
        "morenotlisted": "Esta lista non está completa.",
        "mypage": "Páxina",
        "mytalk": "Conversa",
-       "anontalk": "Conversa con este enderezo IP",
+       "anontalk": "Conversa",
        "navigation": "Navegación",
        "and": "&#32;e",
        "qbfind": "Procurar",
        "databaseerror-query": "Pescuda: $1",
        "databaseerror-function": "Función: $1",
        "databaseerror-error": "Erro: $1",
+       "transaction-duration-limit-exceeded": "Para evitar crear un gran atraso na replicación, esta transacción abortouse xa que a duración de escritura ($1) excedeu o límite de $2 segundos.\nSe estás a cambiar moitos obxectos ao mesmo tempo, procura facer operacións múltiples máis pequenas no seu lugar.",
        "laggedslavemode": "'''Aviso:''' A páxina pode non conter as actualizacións recentes.",
        "readonly": "Base de datos pechada",
        "enterlockreason": "Dea unha razón para o peche, incluíndo unha estimación de até cando se manterá",
        "missingarticle-rev": "(nº de revisión: $1)",
        "missingarticle-diff": "(dif: $1, $2)",
        "readonly_lag": "A base de datos bloqueouse automaticamente mentres os servidores levan a cabo a sincronización co servidor principal",
+       "nonwrite-api-promise-error": "A cabeceira HTTP  'Promise-Non-Write-API-Action' foi enviada pero a petición foi feita a un módulo de escritura da API.",
        "internalerror": "Erro interno",
        "internalerror_info": "Erro interno: $1",
        "internalerror-fatal-exception": "Excepción grave de tipo \"$1\"",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que crea outra conta?",
-       "createacct-captcha": "Comprobación de seguridade",
-       "createacct-imgcaptcha-ph": "Insira o texto que ve enriba",
        "createacct-submit": "Crear a conta",
        "createacct-another-submit": "Crear conta",
        "createacct-benefit-heading": "Xente coma vostede elabora {{SITENAME}}.",
        "wrongpasswordempty": "O campo do contrasinal estaba en branco.\nPor favor, inténteo de novo.",
        "passwordtooshort": "Os contrasinais deben conter, como mínimo, {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "passwordtoolong": "Os contrasinais non deben ser máis longo de {{PLURAL:$1|1 carácter|$1 caracteres}}.",
+       "passwordtoopopular": "Os contrasinais escollidos máis habitualmente non poden usarse. Por favor, escolle un contrasinal máis único.",
        "password-name-match": "O seu contrasinal debe ser diferente do seu nome de usuario.",
        "password-login-forbidden": "O uso deste nome de usuario e contrasinal foi prohibido.",
        "mailmypassword": "Restablecer o contrasinal",
        "passwordreset-emailtext-ip": "Alguén (probablemente vostede, desde o enderezo IP $1) solicitou o restablecemento do seu\ncontrasinal de {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
        "passwordreset-emailtext-user": "O usuario $1 solicitou o restablecemento do contrasinal de {{SITENAME}}\n($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
        "passwordreset-emailelement": "Nome de usuario: \n$1\n\nContrasinal temporal: \n$2",
-       "passwordreset-emailsent": "Se esta é unha dirección de correo electrónico rexistrada para a túa conta, entón enviarase un correo electrónico para o restablecemento do teu contrasinal.",
+       "passwordreset-emailsentemail": "Se esta é unha dirección de correo electrónico rexistrada para a túa conta, entón enviarase un correo electrónico para o restablecemento do teu contrasinal.",
        "passwordreset-emailsent-capture": "Enviouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación.",
        "passwordreset-emailerror-capture": "Xerouse un correo electrónico de restablecemento do contrasinal, mostrado a continuación, pero o envío {{GENDER:$2|ao usuario|á usuaria}} fallou: $1",
        "changeemail": "Cambiar ou eliminar o enderezo de correo electrónico",
        "changeemail-no-info": "Debe rexistrarse para acceder directamente a esta páxina.",
        "changeemail-oldemail": "Enderezo de correo electrónico actual:",
        "changeemail-newemail": "Novo enderezo de correo electrónico:",
+       "changeemail-newemail-help": "Este campo debe deixarse en branco se quere eliminar o seu enderezo de correo electrónico. Non será capaz de redefinir a súa clave nin recibir mensaxes electrónicas desta wiki se elimina o correo electrónico.",
        "changeemail-none": "(ningún)",
        "changeemail-password": "O seu contrasinal en {{SITENAME}}:",
        "changeemail-submit": "Cambiar o correo electrónico",
        "permissionserrors": "Erro de permisos",
        "permissionserrorstext": "Non ten os permisos necesarios para facelo {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "permissionserrorstext-withaction": "Non ten os permisos necesarios para $2, {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
+       "contentmodelediterror": "Non pode editar esta revisión porque o seu modelo de contido é <code>$1</code>, e o modelo de contido actual da páxina é <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Atención: Vai volver crear unha páxina que xa foi eliminada anteriormente.'''\n\nDebería considerar se é apropiado continuar a editar esta páxina.\nVelaquí están o rexistro de borrados e mais o de traslados desta páxina, por se quere consultalos:",
        "moveddeleted-notice": "Esta páxina foi borrada.\nA continuación pódese ver o rexistro de borrados e traslados desta páxina, por se quere consultalos.",
        "moveddeleted-notice-recent": "Sentímolo, esta página foi borrada recentemente (dentro das últimas 24 horas).\nO rexistro de borrado e traslado da páxina amósanse abaixo como referencia.",
        "showingresultsinrange": "{{PLURAL:$1|Móstrase <strong>1</strong> resultado|Móstranse <strong>$1</strong> resultados}}, comezando polo número <strong>$2</strong> e rematando polo número <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados do <strong>$1</strong> ao <strong>$2</strong>, dun total de <strong>$3</strong>}}",
        "search-nonefound": "Non se atopou ningún resultado que coincidise coa procura.",
+       "search-nonefound-thiswiki": "Non hai resultados que cumpran os criterios de busca neste sitio.",
        "powersearch-legend": "Busca avanzada",
        "powersearch-ns": "Procurar nos espazos de nomes:",
        "powersearch-togglelabel": "Seleccionar:",
        "prefs-help-prefershttps": "Esta preferencia ha aplicarse no seu vindeiro acceso ao sistema.",
        "prefswarning-warning": "Fixo cambios nas súas preferencias que aínda non se gardaron.\nSe deixa esta páxina sen premer en \"$1\", non se actualizarán as súas preferencias.",
        "prefs-tabs-navigation-hint": "Consello: Pode empregar as frechas esquerda e dereita para navegar polas lapelas da lista.",
-       "email-address-validity-valid": "O enderezo de correo electrónico semella válido",
-       "email-address-validity-invalid": "Escriba un enderezo de correo electrónico válido",
        "userrights": "Xestión dos dereitos de usuario",
        "userrights-lookup-user": "Administrar os grupos do usuario",
        "userrights-user-editname": "Escriba un nome de usuario:",
        "foreign-structured-upload-form-label-infoform-categories": "Categorías",
        "foreign-structured-upload-form-label-infoform-date": "Data",
        "foreign-structured-upload-form-label-own-work-message-local": "Confirmo que estou a cargar este ficheiro seguindo os termos de uso e políticas de licenza de {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Se non é capaz de cargar este ficheiro baixo as políticas de {{SITENAME}}, por favor peche este diálogo e intente outro método.",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Quizais tamén queira probar [[Special:Upload|a páxina predeterminada de subidas]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Comprendo que estou a cargar este ficheiro nun repositorio compartido. Confirmo que fago isto seguindo os termos de uso e políticas de licenza existentes alí.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Se non é capaz de cargar este ficheiro baixo as políticas do repositorio compartido, por favor peche este diálogo e intente outro método.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Tamén pode interesarlle usar [[Special:Upload|a páxina de carga en {{SITENAME}}]], se este ficheiro pode ser cargado alí baixo as súas políticas.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Certifico que son o propietario dos dereitos de autor deste ficheiro, e que concordo a liberar irrevocablemente este ficheiro a Wikimedia Commons baixo a licenza [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], e que concordo cos [https://wikimediafoundation.org/wiki/Terms_of_Use Termos de uso].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Se non posúe os dereitos de autor deste ficheiro, ou quere liberalo baixo unha licenza diferente, considere usar o [https://commons.wikimedia.org/wiki/Special:UploadWizard Asistente de subas de Commons].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Tamén pode interesarlle usar [[Special:Upload|a páxina de carga en {{SITENAME}}]], se o sitio permite a suba deste ficheiro nas súas políticas.",
        "backend-fail-stream": "Non se puido transmitir o ficheiro \"$1\".",
        "backend-fail-backup": "Non se puido facer unha copia de seguridade do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro \"$1\" non existe.",
        "wlheader-showupdated": "As páxinas que cambiaron desde a súa última visita móstranse en '''negra'''.",
        "wlnote": "A continuación {{PLURAL:$1|está a última modificación|están as últimas <strong>$1</strong> modificacións}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} ata o $3 ás $4.",
        "wlshowlast": "Mostrar as últimas $1 horas e os últimos $2 días",
+       "watchlistall2": "todo",
+       "watchlist-hide": "Agochar",
+       "wlshowtime": "Periodo de tempo a amosar:",
+       "wlshowhideminor": "edicións menores",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "usuarios rexistrados",
+       "wlshowhideanons": "usuarios anónimos",
+       "wlshowhidepatr": "edicións vixiadas",
+       "wlshowhidemine": "as miñas edicións",
        "watchlist-options": "Opcións de vixilancia",
        "watching": "Vixiando...",
        "unwatching": "Deixando de vixiar...",
        "contributions": "Contribucións {{GENDER:$1|do usuario|da usuaria}}",
        "contributions-title": "Contribucións de $1",
        "mycontris": "Contribucións",
+       "anoncontribs": "Contribucións",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "A conta de usuario \"$1\" non está rexistrada.",
        "nocontribs": "Non se deron atopado cambios con eses criterios.",
        "movenosubpage": "Esta páxina non ten subpáxinas.",
        "movereason": "Motivo:",
        "revertmove": "reverter",
-       "delete_and_move": "Borrar e mover",
        "delete_and_move_text": "== Cómpre borrar ==\nA páxina de destino, chamada \"[[:$1]]\", xa existe.\nQuérea borrar para deixar sitio para facer o traslado?",
        "delete_and_move_confirm": "Si, borrar a páxina",
        "delete_and_move_reason": "Eliminado para facer sitio para mover \"[[$1]]\"",
        "tooltip-pt-preferences": "As miñas preferencias",
        "tooltip-pt-watchlist": "A lista de páxinas cuxas modificacións está a seguir",
        "tooltip-pt-mycontris": "Lista das súas contribucións",
+       "tooltip-pt-anoncontribs": "Unha lista de modificacións feitas desde esta dirección IP",
        "tooltip-pt-login": "Recoméndaselle rexistrarse, se ben non é obrigatorio",
        "tooltip-pt-logout": "Saír ao anonimato",
        "tooltip-pt-createaccount": "Recoméndaselle crear unha conta e acceder ao sistema, se ben non é obrigatorio",
        "htmlform-cloner-required": "Necesítase, polo menos, un valor.",
        "htmlform-title-badnamespace": "\"[[:$1]]\" non está no espazo de nomes \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" non é un título de páxina que se poida crear",
-       "htmlform-title-not-exists": "\"[[:$1]]\" non existe.",
+       "htmlform-title-not-exists": "\"$1\" non existe.",
        "htmlform-user-not-exists": "\"<strong>$1</strong>\" non existe.",
        "htmlform-user-not-valid": "\"<strong>$1</strong>\" non é un nome de usuario válido.",
        "sqlite-has-fts": "$1 con soporte para procuras de texto completo",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueou}} a {{GENDER:$4|$3}} cun tempo de duración de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambiou}} as configuracións do bloqueo de {{GENDER:$4|$3}} cunha caducidade de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importou}} $3 por medio da carga de ficheiros",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importou}} $3 para a suba do ficheiro ($4 {{PLURAL:$4|revisión|revisións}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importou}} $3 dende outra wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importou}} $3 desde $5 ($4 {{PLURAL:$4|revisión|revisións}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|fusionou}} \"$3\" con \"$4\" (revisións ata o $5)",
        "logentry-move-move": "$1 {{GENDER:$2|moveu}} a páxina \"$3\" a \"$4\"",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|moveu}} a páxina \"$3\" a \"$4\" sen deixar unha redirección",
index 15b9156..7d986c7 100644 (file)
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "तूं दुसरें खातें कित्याक उगडटात",
-       "createacct-captcha": "सुरक्षा तपासणी",
-       "createacct-imgcaptcha-ph": "वयर दिसता तो मजकूर बरय",
        "createacct-submit": "तुमचे खातें रोचात",
        "createacct-another-submit": "दुसरें खातें तयार कर",
        "createacct-benefit-heading": "{{SITENAME}} तुमच्या सारख्या लोकांनी केल्लो",
        "unwatch": "पळोवंक नासलें",
        "watchlist-details": "लक्ष {{PLURAL:$1|$1वळेरींतलें|$1 वळेंरींतली}} {{PLURAL:$1|$1पान|$1 पानां}} उलोवपाची पानां सोडून",
        "wlshowlast": "फाटलें $1 वरांचें $2 दिसांचें  दाखयात",
+       "watchlistall2": "सगळें",
        "watchlist-options": "लक्षवळेंरींतलो पर्याय",
        "delete-legend": "काडून उडयात",
        "actioncomplete": "क्रिया पुराय जाल्या",
        "specialpages": "खाशेलीं पानां",
        "tag-filter": "[[Special:Tags|कुर्वेचीट]] गाळणो:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|कुरवेचीट|कुरवेचीटी}}]]: $2)",
-       "htmlform-title-not-exists": "[[:$1]] अस्तित्वांत ना.",
+       "htmlform-title-not-exists": "$1 अस्तित्वांत ना.",
        "logentry-delete-delete": "$1 {{GENDER:$2|काडून उडयल्ले पान}} $3",
        "logentry-move-move": "$1 हाणें $3 पानाक $4 {{GENDER:$2|हालयला}}",
        "logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
index b30c69e..9575ede 100644 (file)
        "createaccountreason": "Karonn:",
        "createacct-reason": "Karonn",
        "createacct-reason-ph": "Tum dusrem khatem kiteak rochtai",
-       "createacct-captcha": "Suraksha topasni",
-       "createacct-imgcaptcha-ph": "Voir dixta to mozkur boroi",
        "createacct-submit": "Tujem khatem roch",
        "createacct-another-submit": "Dusrem khatem roch",
        "createacct-benefit-heading": "{{SITENAME}} tujea bhaxen lokani kel'la",
        "watchlist-details": "Tujea sadurvollerint {{PLURAL:$1|$1 pan asa|$1 panam asat}}, ulovpachim panam veglim mezonastanam.",
        "wlheader-showupdated": "Tujea fatle bhette san bodol'lean tim panam '''datt''' dakhoileant.",
        "wlshowlast": "Xevottchim $1 voram $2 dis  dakhoi",
+       "watchlistall2": "soglle",
        "watchlist-options": "Sadurvollericheo poryay",
        "watching": "Disht dovortanv...",
        "unwatching": "Disht kaddthanv...",
        "external_image_whitelist": " #Hi voll asa toxich dovor<pre>\n#Khala sodpache sache (''regular expressions'') ghal (fokot // modem voita poi tem bhag)\n#Hanche borobor bhaile zodlele murt comparar kel'le zatele\n#Mell khatat tim murt koxeo distele, na zalear fokot mortek ek zodd distele\n#Jeo voll #-an suru zatele tem vivek mhunn manlele zatele\n#Hanga vhodle and dhakte okxora modem forok podona\n\n#Soglle sodpache sache hea volla voir ghal. Hi voll asa toxich dovor</pre>",
        "tag-filter": "[[Special:Tags|Kurvechit]] challni:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Kurvechit|Kurvechiti}}]]: $2)",
-       "htmlform-title-not-exists": "[[:$1]] ostitvant na.",
+       "htmlform-title-not-exists": "$1 ostitvant na.",
        "logentry-delete-delete": "$1-an {{GENDER:$2|kadun udoile}} pan $3",
        "logentry-move-move": "$1-an $3 panak $4 {{GENDER:$2|haloilea}}",
        "logentry-newusers-create": "Vapurpeacho kont $1 {{GENDER:$2|rochlam}}",
index 7df66f8..41f1ec9 100644 (file)
@@ -20,7 +20,8 @@
                        "לערי ריינהארט",
                        "80686",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Xð"
                ]
        },
        "tog-underline": "Links unterstryche:",
        "viewhelppage": "D Hilf aazeige",
        "categorypage": "Kategoriesyte aazeige",
        "viewtalkpage": "Diskussion",
-       "otherlanguages": "Anderi Sproche",
+       "otherlanguages": "In andere Sprooche",
        "redirectedfrom": "(Witergleitet vun $1)",
        "redirectpagesub": "Umgleiteti Syte",
        "redirectto": "Wyterleitig uf:",
        "createaccountreason": "Grund:",
        "createacct-reason": "Grund",
        "createacct-reason-ph": "Wurum Du ne ander Benutzerkonto aaleisch",
-       "createacct-captcha": "Sicherheitspriefig",
-       "createacct-imgcaptcha-ph": "Gib dr Tekscht yy, wu Du obe siisch",
        "createacct-submit": "Dyy Benutzerkonto aalege",
        "createacct-another-submit": "Benutzerkonto aalege",
        "createacct-benefit-heading": "{{SITENAME}} wird vu Mänsche wie Dir gschaffe.",
        "passwordreset-emailtext-ip": "Eber mit dr IP-Adresse $1, wahrschyns Du sälber, het e Erinnerig an Dyyni Benutzerkonteninformatione fir {{SITENAME}} aagforderet ($4). \n\n{{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft: \n\n$2 \n\n{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.\nDu sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.",
        "passwordreset-emailtext-user": "Dr Benutzer $1 bi {{SITENAME}} het e Zrucksetzig vu Dym Passwort bi {{SITENAME}} aagforderet ($4). \n\n{{PLURAL:$3|Des Benutzerkonto isch|Die Benutzerkonte sin}} mit däre E-Mail-Adräss verchnipft: \n\n$2 \n\n{{PLURAL:$3|Des temporär Passwort lauft|Die temporäre Passwerter laufe}} in {{PLURAL:$5|eim Tag|$5 Täg}} ab.\nDu sottsch di aamälden un e nej Passwort vergee. Wänn eber ander die Aafrog gstellt het oder Du di wider an Dyy alt Passwort chasch erinnere un s nimi wettsch ändere, chasch die Nochricht ignorieren un alsfurt Dyy alt Passwort bruche.",
        "passwordreset-emailelement": "Benutzername: \n$1\n\nTemporär Passwort: \n$2",
-       "passwordreset-emailsent": "We das di bestätigti E-Mail-Adrässen vo dym Wiki-Konto isch, de wird es E-Mail verschickt, für ds Passwort zrüggzsetze.",
+       "passwordreset-emailsentemail": "We das di bestätigti E-Mail-Adrässen vo dym Wiki-Konto isch, de wird es E-Mail verschickt, für ds Passwort zrüggzsetze.",
        "passwordreset-emailsent-capture": "E Passwort-Zrucksetzigs-Mail isch vergschickt worde, un isch unte aazeigt.",
        "passwordreset-emailerror-capture": "Die unten angezeigte Passwortzrucksetzigsmail, wu unten aazeigt wird, isch generiert wore, aber dr Versand an {{GENDER:$2|dr Benutzer|d Benutzeri}} het nit funktioniert: $1",
        "changeemail": "E-Mail-Adrässen änderen oder lösche",
        "searchrelated": "verwandt",
        "searchall": "alli",
        "showingresults": "Do {{PLURAL:$1|isch '''1''' Ergebnis|sin '''$1''' Ergebniss}}, s fangt aa mit dr Nummerer '''$2.'''",
-       "showingresultsinrange": "Uf der Liste {{PLURAL:$1|isch <strong>ei</strong> Kategorie|sy <strong>$1</stong> Kategorië}} vo Nummere <strong>$2</strong> bis <strong>$3</strong>.",
+       "showingresultsinrange": "Do unte {{PLURAL:$1|wird <strong>ei</strong> Ergebnis|wäre bis zue <strong>$1</strong> Ergebnis}} im Berych <strong>$2</strong> bis <strong>$3</strong> aazeigt.",
        "search-showingresults": "{{PLURAL:$4|Ergebnis <strong>$1</strong> vu <strong>$3</strong>|Ergebnis <strong>$1 bis $2</strong> vu <strong>$3</strong>}}",
        "search-nonefound": "Fir Dyyni Suechaafrog sin keini Ergebniss gfunde wore.",
        "powersearch-legend": "Erwytereti Suech",
        "wlheader-showupdated": "Syte, wo syt em letste Bsuech hei g’änderet, sy <strong>fett</strong> dargstellt.",
        "wlnote": "Unde {{PLURAL:$1|steit di letsti Änderig|stöh di letste <strong>$1</strong> Änderigen}} us {{PLURAL:$2|der letste Stund|de letste <strong>$2</strong> Stunde}}. Stand: $3, $4 Uhr.",
        "wlshowlast": "Zeig di letste $1 Stunden und $2 Täg",
+       "watchlistall2": "alli",
        "watchlist-options": "Aazeigoptione",
        "watching": "Am beobachte …",
        "unwatching": "Nümm am beobachten …",
        "movenosubpage": "Die Syte het kei Untersyte.",
        "movereason": "Grund:",
        "revertmove": "Zrugg verschiebe",
-       "delete_and_move": "Lösche un Verschiebe",
        "delete_and_move_text": "== D Ziilsyte isch scho vorhande, lösche?==\n\nD Syte „[[:$1]]“ gits scho. Wottsch du si lösche, zume Platz zum verschiebe mache?",
        "delete_and_move_confirm": "D Ziilsyte für d Verschiebig lösche",
        "delete_and_move_reason": "glöscht, zume Platz für s Verschiebe vo „[[$1]]“ z mache",
        "tooltip-pt-mycontris": "Lischt vu Dyyne Byyträg",
        "tooltip-pt-login": "Aamälde",
        "tooltip-pt-logout": "Abmälde",
-       "tooltip-pt-createaccount": "Du chasch gärn e Bentuzerkonto aalege un Di aamälde. Du muesch s aber nit",
+       "tooltip-pt-createaccount": "Du chasch gärn e Benutzerkonto aalege un Di aamälde. Du muesch s aber nit",
        "tooltip-ca-talk": "Diskussion zum Artikelinhalt",
        "tooltip-ca-edit": "Die Syte bearbeite",
        "tooltip-ca-addsection": "Neje Abschnitt aafange",
        "htmlform-cloner-required": "Es bruucht mindistens ei Wärt.",
        "htmlform-title-badnamespace": "[[:$1]] isch nid im Namensruum «{{ns:$2}}».",
        "htmlform-title-not-creatable": "«$1» isch kei Sytename, wo sech lat la alege",
-       "htmlform-title-not-exists": "[[:$1]] git’s nid.",
+       "htmlform-title-not-exists": "$1 git’s nid.",
        "htmlform-user-not-exists": "<strong>$1</strong> git’s nid.",
        "htmlform-user-not-valid": "<strong>$1</strong> isch ke gültige Name.",
        "sqlite-has-fts": "$1 mit Unterstitzig vu dr Volltextsuechi",
index 773448b..bba5c0d 100644 (file)
        "createaccountreason": "કારણ:",
        "createacct-reason": "કારણ",
        "createacct-reason-ph": "તમે કેમ બીજું ખાતું બનાવો છો",
-       "createacct-captcha": "સલામતી ચકાસણી",
-       "createacct-imgcaptcha-ph": "તમે જે લખાણ જુઓ છો તે દાખલ કરો",
        "createacct-submit": "તમારું ખાતું બનાવો",
        "createacct-another-submit": "બીજું ખાતું બનાવો",
        "createacct-benefit-heading": "{{SITENAME}} એ તમારા જેવા લોકોએ બનાવેલ છે.",
        "passwordreset-emailtext-ip": "કોઈકે (કદાચ તમોએ , $1 IP એડ્રેસ થી) તમારી વેબસાઈટ {{SITENAME}}  ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલા છે.\n.\n.\n\n$2\n\n{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસો}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો.",
        "passwordreset-emailtext-user": "વેબસાઈટ  {{SITENAME}} ના વપરાશકર્તા $1 એ તમારા {{SITENAME}} ($4) નો પાસવર્ડ રિસેટ કરવાની રજૂઆત કરી છે. આ ઈમેઈલ એડ્રેસ સાથે {{PLURAL:$3|નું ખાતું|ના ખાતા}} જોડાયેલ છે.\n\n$2\n\n{{PLURAL:$3|આ કામચલાઉ પાસવર્ડ|આ બધા કામચલાઉ પાસવર્ડ}} {{PLURAL:$5|એક દિવસ|$5 દિવસ}} માં નષ્ટ થઇ જશે. તમારે અત્યારે જ ખાતું ખોલીને નવો પાસવર્ડ સેટ કરી લેવો જોઈએ .જો કોઈ બીજા એ આ રજૂઆત કરી હોય, અથવા જો તમને પોતાનો અસલ પાસવર્ડ યાદ હોય, અને તેને બદલવા નથી માગતા, તો આ સંદેશાને જતો કરીને પોતાના અસલ પાસવર્ડ ને વાપરી શકો છો..",
        "passwordreset-emailelement": "વપરાશકર્તા નામ: \n$1\n\nકામચલાઉ પાસવર્ડ: \n$2",
-       "passwordreset-emailsent": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે.",
+       "passwordreset-emailsentemail": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે.",
        "passwordreset-emailsent-capture": "પાસવર્ડ બદલવાનો ઇમેલ મોકલવામાં આવ્યો છે, જે નીચે પ્રમાણે છે.",
        "passwordreset-emailerror-capture": "પાસવર્ડ ફરી ગોઠવવા માટેનો ઇમેલ બનાવવામાં આવ્યો છે, જે નીચે પ્રમાણે છે, પરંતુ તે {{GENDER:$2|સભ્ય}}ને મોકલવામાં નિષ્ફળ થયો છે: $1",
        "changeemail": "ઇમેલ સરનામું બદલો",
        "prefs-tokenwatchlist": "નિશાની",
        "prefs-diffs": "ભેદો",
        "prefs-help-prefershttps": "આ પ્રાથમિકતા તમારા હવે પછીના પ્રવેશથી લાગુ પડશે.",
-       "email-address-validity-valid": "ઈ-મેલ યોગ્ય લાગે છે.",
-       "email-address-validity-invalid": "પ્રમાણભૂત શૈલિમાં ઈ-મેલ એડ્રેસ લખો",
        "userrights": "સભ્ય હક્ક પ્રબંધન",
        "userrights-lookup-user": "સભ્ય સમુહો નું પ્રબંધન કરો",
        "userrights-user-editname": "સભ્યનામ દાખલ કરો:",
        "userrights-editusergroup": "સભ્ય સમુહો સંપાદીત કરો",
        "saveusergroups": "સભ્ય સમુહો સાચવો",
        "userrights-groupsmember": "સભ્યપદ:",
-       "userrights-groupsmember-auto": "àª\86નà«\8b અભિપ્રેત સભ્ય:",
+       "userrights-groupsmember-auto": "સામà«\87 àª¦àª°à«\8dશાવà«\87લા {{PLURAL:$1|àª\9cà«\82થ|àª\9cà«\82થà«\8b}}{{GENDER:$2|નà«\8b|નà«\80|ના}} અભિપ્રેત સભ્ય:",
        "userrights-groupsmember-type": " $1",
-       "userrights-groups-help": "àª\85 àª¸à«\8dભà«\8dય àª\9cà«\87નà«\8b àª¸àª­à«\8dય àª\9bà«\87 àª¤à«\87 àª¸àª®à«\8dહà«\82હનà«\87 àª¬àª¦àª²à«\80 àª¶àª\95à«\8b àª\9bà«\8b:\n* àª\85àª\82àª\95િત àª\95રà«\87લà«\81àª\82 àª\96ાનà«\81àª\82 àª¬àª¤àª¾àªµà«\87 àª\9bà«\87 àª¸àª­à«\8dય àª¤à«\87નà«\8b àª¸àª®à«\82હમાàª\82 àª¶àª¾àª®àª¿àª² àª\9bà«\87.\n* àª\9cà«\8b àª\96ાનà«\81àª\82 àª\85àª\82àª\95િત àª¨ àª¹à«\8bય àª¤à«\8b àª¸àª­à«\8dય àª¤à«\87 àª¸àª®à«\82હમાàª\82 àª¶àª¾àª®àª¿àª² àª¨àª¥à«\80.\n* àª\8fàª\95  *દરà«\8dશાવà«\87 àª\9bà«\87 àª¤àª®à«\87 àª\89મà«\87રà«\8dયા àªªàª\9bà«\80 àª¸àª®à«\82હ àª¹àª\9fાવà«\80 àª¨ àª¶àª\95à«\8b àª\85થવા àª¤à«\87થà«\80 àª\89લàª\9fà«\81àª\82.",
+       "userrights-groups-help": "àª\86 àª¸àª­à«\8dય àª\9cà«\87 àª\9cà«\82થà«\8bનà«\8b àª¸àª­à«\8dય àª\9bà«\87 àª¤à«\87 àª¤àª®à«\87 àª¬àª¦àª²à«\80 àª¶àª\95à«\8b àª\9bà«\8b:\n* àª\85àª\82àª\95િત àª\95રà«\87લà«\81àª\82 àª\96ાનà«\81àª\82 àª¦àª°à«\8dશાવà«\87 àª\9bà«\87 àª\95à«\87 àª¸àª­à«\8dય àª¤à«\87 àª\9cà«\82થમાàª\82 àª\9bà«\87.\n* àª\9cà«\8b àª\96ાનà«\81àª\82 àª\85àª\82àª\95િત àª¨ àª¹à«\8bય àª¤à«\8b àª¤à«\87નà«\8b àª\85રà«\8dથ àª\8fમ àª\9bà«\87 àª\95à«\87 àª¸àª­à«\8dય àª¤à«\87 àª\9cà«\82થમાàª\82 àª¨àª¥à«\80.\n* àª«à«\81દડà«\80 (*) àª¦àª°à«\8dશાવà«\87 àª\9bà«\87 àª\95à«\87 àª¤àª®à«\87 àª\8fàª\95 àªµàª\96ત àª\89મà«\87રà«\8dયા àªªàª\9bà«\80 àª¤à«\87 àª\9cà«\82થ àª¹àª\9fાવà«\80 àª¨àª¹à«\80 àª¶àª\95à«\8b àª\85થવા àª¹àª\9fાવà«\8dયા àªªàª\9bà«\80 àª\89મà«\87રà«\80 àª¨àª¹à«\80 àª¶àª\95à«\8b.",
        "userrights-reason": "કારણ:",
        "userrights-no-interwiki": "અન્ય વિકિ પર અન્ય સભ્યો ના અધિકારો માં પરિવર્તન કરવાની તમને પરવાનગી નથી",
        "userrights-nodatabase": "માહિતીસંચ $1 અસ્તિત્વમાં નથી કે તે સ્થાનીય નથી.",
        "userrights-unchangeable-col": "તમે બદલી ન શકો તેવા જૂથ",
        "group": "સમુહ",
        "group-user": "સભ્ય",
-       "group-autoconfirmed": "સà«\8dવયàª\82àª\9aલિત àª®àª¾àª¨à«\8dય àª¸àª­à«\8dયà«\8b",
+       "group-autoconfirmed": "સà«\8dવàª\9aાલિત àª®àª\82àª\9cà«\82ર àª¸àª­à«\8dય",
        "group-bot": "બૉટો",
        "group-sysop": "સાઇસૉપ/પ્રબંધકો",
        "group-bureaucrat": "રાજનૈતિકો",
-       "group-suppress": "દà«\81રà«\8dલàª\95à«\8dષ",
+       "group-suppress": "નાબà«\82દàª\95રà«\8dતા",
        "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|દà«\81રà«\8dલàª\95à«\8dષ}}",
+       "group-suppress-member": "{{GENDER:$1|નાબà«\82દàª\95રà«\8dતા}}",
        "grouppage-user": "{{ns:project}}:સભ્યો",
-       "grouppage-autoconfirmed": "{{ns:project}}:સà«\8dવયàª\82àª\9aલિત àª®àª¾àª¨à«\8dય સભ્યો",
+       "grouppage-autoconfirmed": "{{ns:project}}:સà«\8dવàª\9aાલિત àª®àª\82àª\9cà«\82ર સભ્યો",
        "grouppage-bot": "{{ns:project}}:બૉટો",
        "grouppage-sysop": "{{ns:project}}:પ્રબંધકો",
        "grouppage-bureaucrat": "{{ns:project}}: રાજનૈતિક",
-       "grouppage-suppress": "{{ns:project}}:દà«\81રà«\8dલàª\95à«\8dષ",
+       "grouppage-suppress": "{{ns:project}}:નાબà«\82દ",
        "right-read": " પાના વાંચો",
        "right-edit": "પાના બદલો",
        "right-createpage": "પાના બનાવો ( જે ચર્ચા પાના ન હોય)",
        "nopagetext": "તમે લખેલ પાનું અસ્તિત્વમાં નથી",
        "pager-newer-n": "{{PLURAL:$1|નવું 1|નવા $1}}",
        "pager-older-n": "{{PLURAL:$1|જૂનું 1|જૂનાં $1}}",
-       "suppress": "દà«\81રà«\8dલàª\95à«\8dષ",
+       "suppress": "નાબà«\82દ",
        "querypage-disabled": "કાર્યક્ષમતાના કારણે આ ખાસ પાનું નિષ્ક્રિ કરાયું છે.",
        "apihelp": "API મદદ",
        "apihelp-no-such-module": "સાધન જૂથ \"$1\" ન મળ્યું.",
        "wlheader-showupdated": "તમારી છેલ્લી મુલાકાત પછી બદલાયેલાં પાના  '''ઘાટા''' અક્ષરો વડે દર્શાવ્યાં છે.",
        "wlnote": "નીચે $3, $4 વાગ્યા સુધીના છેલ્લા {{PLURAL:$2|એક કલાક|'''$2''' કલાક}}માં થયેલા {{PLURAL:$1|ફેરફાર|'''$1''' ફેરફારો }} દર્શાવ્યા છે.",
        "wlshowlast": "છેલ્લા $1 કલાકો $2 દિવસો બતાવો",
+       "watchlistall2": "બધા",
        "watchlist-options": "ધ્યાનસૂચિના વિકલ્પો",
        "watching": "નજર રાખી રહ્યાં છો...",
        "unwatching": "નજર રાખવાની બંધ કરી છે...",
        "movenosubpage": "આ પાનાના કોઈ ઉપ-પાના નથી",
        "movereason": "કારણ:",
        "revertmove": "પૂર્વવત",
-       "delete_and_move": "હટાવો અને નામ બદલો",
        "delete_and_move_text": "== પાનું દૂર કરવાની જરૂર છે  ==\nલક્ષ્ય પાનું  \"[[:$1]]\" પહેલેથી અસ્તિત્વમાં છે.\nશું તમે આને હટાવીને સ્થળાંતર કરવાનો માર્ગ મોકળો કરવા માંગો છો?",
        "delete_and_move_confirm": "હા, આ પાનું હટાવો",
        "delete_and_move_reason": "હટાવવાનું કામ આગળ વધાવવા ભૂંસી દેવાયુ \"[[$1]]\"",
index 1662718..a89ba25 100644 (file)
@@ -30,7 +30,8 @@
                        "GilCahana",
                        "Ldorfman",
                        "LaG roiL",
-                       "Eraab"
+                       "Eraab",
+                       "Geagea"
                ]
        },
        "tog-underline": "סימון קישורים בקו תחתי:",
@@ -65,6 +66,7 @@
        "tog-watchlisthidebots": "הסתרת עריכות של בוטים ברשימת המעקב",
        "tog-watchlisthideminor": "הסתרת עריכות משניות ברשימת המעקב",
        "tog-watchlisthideliu": "הסתרת עריכות של משתמשים רשומים ברשימת המעקב",
+       "tog-watchlistreloadautomatically": "רענון אוטומטי של רשימת המעקב בכל פעם שמסנן משתנה (נדרש JavaScript)",
        "tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
        "tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
        "tog-watchlisthidecategorization": "הסתרת הוספות והסרות של דפים מקטגוריות",
        "morenotlisted": "רשימה זו אינה מלאה.",
        "mypage": "דף משתמש",
        "mytalk": "שיחה",
-       "anontalk": "×\93×£ ×\94ש×\99×\97×\94 ×¢×\91×\95ר ×\9bת×\95×\91ת IP ×\96×\95",
+       "anontalk": "ש×\99×\97×\94",
        "navigation": "ניווט",
        "and": "&#32;וגם",
        "qbfind": "חיפוש",
        "databaseerror-query": "שאילתה: $1",
        "databaseerror-function": "פונקציה: $1",
        "databaseerror-error": "שגיאה: $1",
+       "transaction-duration-limit-exceeded": "כדי למנוע עיכובי העתקה גדולים, פעולה זו הופסקה כיוון שמשך הכתיבה ($1) עבר את המגבלה של $2 שניות.\nאם הפעולה דורשת שינוי של פריטים רבים בו־זמנית, ניתן לנסות לבצע מספר פעולות קטנות יותר.",
        "laggedslavemode": "'''אזהרה:''' הדף עשוי שלא להכיל עדכונים אחרונים.",
        "readonly": "בסיס הנתונים נעול",
        "enterlockreason": "יש להקליד סיבה לנעילה, כולל הערכה למועד שחרור הנעילה",
        "missingarticle-rev": "(מספר גרסה: $1)",
        "missingarticle-diff": "(השוואת הגרסאות: $1, $2)",
        "readonly_lag": "בסיס הנתונים ננעל אוטומטית כדי לאפשר לבסיסי הנתונים המשניים להתעדכן מהבסיס הראשי.",
+       "nonwrite-api-promise-error": "כותרת ה־HTTP‏ 'Promise-Non-Write-API-Action' נשלחה, אבל הבקשה הייתה למודול כתיבה של API.",
        "internalerror": "שגיאה פנימית",
        "internalerror_info": "שגיאה פנימית: $1",
        "internalerror-fatal-exception": "שגיאה חמורה מסוג \"$1\"",
        "createaccountreason": "סיבה:",
        "createacct-reason": "סיבה",
        "createacct-reason-ph": "סיבה ליצירת חשבון נוסף",
-       "createacct-captcha": "בדיקת אבטחה",
-       "createacct-imgcaptcha-ph": "יש להקליד את הטקסט המופיע למעלה",
        "createacct-submit": "יצירת החשבון שלך",
        "createacct-another-submit": "יצירת חשבון",
        "createacct-benefit-heading": "אנשים כמוך יוצרים את {{SITENAME}}.",
        "wrongpasswordempty": "הסיסמה שהקלדתם ריקה.\nאנא נסו שוב.",
        "passwordtooshort": "סיסמאות חייבות להיות באורך {{PLURAL:$1|תו אחד|$1 תווים}} לפחות.",
        "passwordtoolong": "סיסמאות אינן יכולות להיות ארוכות {{PLURAL:$1|מתו אחד|מ־$1 תווים}}.",
+       "passwordtoopopular": "לא ניתן להשתמש בסיסמאות נפוצות. יש לבחור סיסמה ייחודית יותר.",
        "password-name-match": "סיסמתך חייבת להיות שונה משם המשתמש שלך.",
        "password-login-forbidden": "השימוש בשם המשתמש והסיסמה האלה נאסר.",
        "mailmypassword": "איפוס סיסמה",
        "passwordreset-emailtext-ip": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש איפוס של\nהסיסמה שלכם ב{{grammar:תחילית|{{SITENAME}}}} ($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}}\nלכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
        "passwordreset-emailtext-user": "{{GENDER:$1|המשתמש|המשתמשת}} $1 ב{{GRAMMAR:תחילית|{{SITENAME}}}} {{GENDER:$1|ביקש|ביקשה}} איפוס של הסיסמה שלכם ב{{GRAMMAR:תחילית|{{SITENAME}}}}\n($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}} לכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
        "passwordreset-emailelement": "שם משתמש:\n$1\n\nסיסמה זמנית:\n$2",
-       "passwordreset-emailsent": "אם זוהי כתובת דואר אלקטרוני רשומה עבור החשבון שלך, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
+       "passwordreset-emailsentemail": "אם זוהי כתובת דואר אלקטרוני רשומה עבור החשבון שלך, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
+       "passwordreset-emailsentusername": "אם רשומה כתובת דואר אלקטרוני מתאימה, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
        "passwordreset-emailsent-capture": "נשלח דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן.",
        "passwordreset-emailerror-capture": "נוצר דואר אלקטרוני לאיפוס הסיסמה, והוא מוצג להלן, אך שליחתו ל{{GENDER:$2|משתמש|משתמשת}} נכשלה: $1",
        "changeemail": "שינוי או הסרת כתובת דוא\"ל",
        "showingresultsinrange": "{{PLURAL:$1|מוצגת תוצאה <strong>אחת</strong>|מוצגות עד <strong>$1</strong> תוצאות}} בין המספרים <strong>$2</strong> ו‏‏־<strong>$3</strong>:",
        "search-showingresults": "{{PLURAL:$4|תוצאה <strong>$1</strong> מתוך <strong>$3</strong>|תוצאות <strong>$1 - $2</strong> מתוך <strong>$3</strong>}}",
        "search-nonefound": "לא נמצאו תוצאות המתאימות לחיפוש.",
+       "search-nonefound-thiswiki": "לא נמצאו תוצאות המתאימות לחיפוש באתר זה.",
        "powersearch-legend": "חיפוש מתקדם",
        "powersearch-ns": "חיפוש על־פי מרחבי שם:",
        "powersearch-togglelabel": "בחירה:",
        "prefs-help-prefershttps": "העדפה זו תיכנס לתוקף בכניסה הבאה לחשבון.",
        "prefswarning-warning": "ביצעת שינויים בהעדפות שלך, והם עדיין לא נשמרו.\nעזיבת דף זה ללא לחיצה על \"$1\" תגרום לכך שההעדפות שלך לא יעודכנו.",
        "prefs-tabs-navigation-hint": "טיפ: ניתן להשתמש במקשי החצים הימני והשמאלי כדי לנווט בין הלשוניות ברשימת הלשוניות.",
-       "email-address-validity-valid": "כתובת הדוא\"ל נראית תקינה",
-       "email-address-validity-invalid": "יש להקליד כתובת דוא\"ל תקינה",
        "userrights": "ניהול הרשאות משתמש",
        "userrights-lookup-user": "ניהול קבוצות משתמש",
        "userrights-user-editname": "שם משתמש:",
        "recentchanges-legend-heading": "'''מקרא:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ראו גם [[Special:NewPages|רשימת דפים חדשים]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "הצגה",
        "rcnotefrom": "להלן {{PLURAL:$5|השינוי שבוצע|השינויים שבוצעו}} החל מ‏‏֫־<b>$2</b> (עד <b>$1</b> מוצגים).",
        "rclistfrom": "הצגת שינויים חדשים החל מ־$2, $3",
        "rcshowhideminor": "$1 שינויים משניים",
        "uploadlogpage": "יומן העלאות",
        "uploadlogpagetext": "להלן רשימה של העלאות הקבצים האחרונות שבוצעו.\nראו את [[Special:NewFiles|גלריית הקבצים החדשים]] להצגה ויזואלית שלהם.",
        "filename": "שם הקובץ",
-       "filedesc": "תקציר",
+       "filedesc": "<div style=\"direction: rtl;\">תקציר</div>",
        "fileuploadsummary": "תיאור:",
        "filereuploadsummary": "השינויים בקובץ:",
        "filestatus": "מעמד זכויות יוצרים:",
        "upload-curl-error28": "הסתיים זמן ההמתנה להעלאה",
        "upload-curl-error28-text": "לאתר לקח זמן רב מדי לענות. אנא בדקו שהאתר זמין, המתינו מעט ונסו שוב. ייתכן שתרצו לנסות בזמן פחות עמוס.",
        "license": "רישיון:",
-       "license-header": "רישיון",
+       "license-header": "<div style=\"direction: rtl;\">רישיון</div>",
        "nolicense": "אין",
        "licenses-edit": "עריכת אפשרויות רישיון",
        "license-nopreview": "(תצוגה מקדימה לא זמינה)",
        "mostrevisions": "הדפים עם מספר העריכות הגבוה ביותר",
        "prefixindex": "רשימת הדפים המתחילים ב…",
        "prefixindex-namespace": "רשימת הדפים המתחילים ב… (במרחב השם $1)",
+       "prefixindex-submit": "הצגה",
        "prefixindex-strip": "הסתרת התחילית ברשימה",
        "shortpages": "דפים קצרים",
        "longpages": "דפים ארוכים",
        "protectedpages-performer": "הוגן על־ידי",
        "protectedpages-params": "פרמטרים להגנה",
        "protectedpages-reason": "סיבה",
+       "protectedpages-submit": "הצגת דפים",
        "protectedpages-unknown-timestamp": "לא ידוע",
        "protectedpages-unknown-performer": "משתמש לא ידוע",
        "protectedtitles": "כותרות מוגנות",
        "protectedtitles-summary": "בדף זה רשומות הכותרות שמוגנות כעת מפני יצירה. לרשימת הדפים הקיימים שמוגנים, ראו [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "אין כרגע כותרות מוגנות עם הפרמטרים האלה.",
+       "protectedtitles-submit": "הצגת כותרות",
        "listusers": "רשימת משתמשים",
        "listusers-editsonly": "הצגת משתמשים עם עריכות בלבד",
        "listusers-creationsort": "מיון לפי תאריך היצירה",
        "usereditcount": "{{PLURAL:$1|עריכה אחת|$1 עריכות}}",
        "usercreated": "{{GENDER:$3|נוצר|נוצרה}} ב־$2, $1",
        "newpages": "דפים חדשים",
+       "newpages-submit": "הצגה",
        "newpages-username": "שם משתמש:",
        "ancientpages": "דפים מוזנחים",
        "move": "העברה",
        "specialloguserlabel": "בוצעו על־ידי המשתמש:",
        "speciallogtitlelabel": "יעד (כותרת או {{ns:user}}:שם עבור משתמש):",
        "log": "יומנים",
+       "logeventslist-submit": "הצגה",
        "all-logs-page": "כל היומנים הציבוריים",
        "alllogstext": "תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי רישיות) או הדף המושפע (גם כן תלוי רישיות).",
        "logempty": "אין פריטים תואמים ביומן.",
        "cachedspecial-viewing-cached-ts": "זוהי גרסה שמורה בזיכרון המטמון של דף זה, שעשויה שלא להיות מעודכנת.",
        "cachedspecial-refresh-now": "צפייה באחרון.",
        "categories": "קטגוריות",
+       "categories-submit": "הצגה",
        "categoriespagetext": "{{PLURAL:$1|הקטגוריה הבאה כוללת|הקטגוריות הבאות כוללות}} דפים או קובצי מדיה.\n[[Special:UnusedCategories|קטגוריות שאינן בשימוש]] אינן מוצגות כאן.\nראו גם את [[Special:WantedCategories|רשימת הקטגוריות המבוקשות]].",
        "categoriesfrom": "הצגת קטגוריות החל מ:",
        "special-categories-sort-count": "סידור לפי מספר הדפים",
        "activeusers-hidebots": "הסתרת בוטים",
        "activeusers-hidesysops": "הסתרת מפעילי מערכת",
        "activeusers-noresult": "לא נמצאו משתמשים.",
+       "activeusers-submit": "הצגת משתמשים פעילים",
        "listgrouprights": "רשימת הרשאות לקבוצה",
        "listgrouprights-summary": "זוהי רשימה של קבוצות המשתמש המוגדרות באתר זה, עם ההרשאות של כל אחת.\nמידע נוסף על ההרשאות ניתן למצוא [[{{MediaWiki:Listgrouprights-helppage}}|כאן]].",
        "listgrouprights-key": "מקרא:\n* <span class=\"listgrouprights-granted\">הרשאה שהוענקה</span>\n* <span class=\"listgrouprights-revoked\">הרשאה שהוסרה</span>",
        "wlheader-showupdated": "דפים שהשתנו מאז ביקורך האחרון בהם מוצגים ב'''הדגשה'''.",
        "wlnote": "להלן {{PLURAL:$1|השינוי האחרון|<strong>$1</strong> השינויים האחרונים}} {{PLURAL:$2|בשעה האחרונה|בשעתיים האחרונות|ב־<strong>$2</strong> השעות האחרונות}}, עד $4, $3.",
        "wlshowlast": "הצגת $1 שעות אחרונות $2 ימים אחרונים",
+       "watchlistall2": "הכול",
+       "watchlist-hide": "הסתרה",
+       "watchlist-submit": "הצגה",
+       "wlshowtime": "תקופת זמן לצפייה:",
+       "wlshowhideminor": "עריכות משניות",
+       "wlshowhidebots": "בוטים",
+       "wlshowhideliu": "משתמשים רשומים",
+       "wlshowhideanons": "משתמשים אנונימיים",
+       "wlshowhidepatr": "עריכות בדוקות",
+       "wlshowhidemine": "עריכות שלי",
        "watchlist-options": "אפשרויות ברשימת המעקב",
        "watching": "בהוספה לרשימת המעקב…",
        "unwatching": "בהסרה מרשימת המעקב…",
        "delete-confirm": "מחיקת \"$1\"",
        "delete-legend": "מחיקה",
        "historywarning": "<strong>אזהרה:</strong> לדף שאתם עומדים למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
+       "historyaction-submit": "הצגה",
        "confirmdeletetext": "אתם עומדים למחוק דף יחד עם כל ההיסטוריה שלו.\n\nאנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
        "actioncomplete": "הפעולה בוצעה",
        "actionfailed": "הפעולה נכשלה",
        "contributions": "תרומות {{GENDER:$1|המשתמש|המשתמשת}}",
        "contributions-title": "תרומות של ה{{GENDER:$1|משתמש|משתמשת}} $1",
        "mycontris": "תרומות",
+       "anoncontribs": "תרומות",
        "contribsub2": "עבור {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "החשבון \"$1\" אינו רשום.",
        "nocontribs": "לא נמצאו שינויים המתאימים לקריטריונים אלו.",
        "whatlinkshere-hidelinks": "$1 קישורים",
        "whatlinkshere-hideimages": "$1 קישורים לקובץ",
        "whatlinkshere-filters": "מסננים",
+       "whatlinkshere-submit": "הצגה",
        "autoblockid": "חסימה אוטומטית #$1",
        "block": "חסימת משתמש",
        "unblock": "שחרור משתמש",
        "movenosubpage": "לדף זה אין דפי משנה.",
        "movereason": "סיבה:",
        "revertmove": "החזרה",
-       "delete_and_move": "מחיקה והעברה",
        "delete_and_move_text": "== בקשת מחיקה ==\nדף היעד, \"[[:$1]]\", כבר קיים.\nהאם ברצונך למחוק אותו כדי לאפשר את ההעברה?",
        "delete_and_move_confirm": "אישור מחיקת הדף",
        "delete_and_move_reason": "מחיקה כדי לאפשר העברה מהשם \"[[$1]]\"",
        "tooltip-pt-preferences": "ההעדפות שלך",
        "tooltip-pt-watchlist": "רשימת הדפים שאתם עוקבים אחרי השינויים בהם",
        "tooltip-pt-mycontris": "רשימת התרומות שלך",
+       "tooltip-pt-anoncontribs": "רשימת העריכות שנעשו מכתובת ה־IP הזאת",
        "tooltip-pt-login": "מומלץ להירשם, אך אין חובה לעשות כן",
        "tooltip-pt-logout": "יציאה מהחשבון",
        "tooltip-pt-createaccount": "מומלץ ליצור חשבון ולהיכנס אליו; עם זאת, זו אינה חובה",
        "exif-compression-32946": "Deflate (של PKZIP)",
        "exif-copyrighted-true": "מוגן בזכויות יוצרים",
        "exif-copyrighted-false": "מצב זכויות היוצרים לא הוגדר",
+       "exif-photometricinterpretation-0": "שחור־לבן (לבן זה 0)",
+       "exif-photometricinterpretation-1": "שחור־לבן (שחור זה 0)",
+       "exif-photometricinterpretation-3": "לוח צבעים",
+       "exif-photometricinterpretation-4": "מסכת שקיפות",
+       "exif-photometricinterpretation-5": "מופרד (כנראה CMYK)",
+       "exif-photometricinterpretation-8": "CIE L*a*b*‎",
+       "exif-photometricinterpretation-9": "CIE L*a*b*‎ (קידוד ICC)",
+       "exif-photometricinterpretation-10": "CIE L*a*b*‎ (קידוד ITU)",
+       "exif-photometricinterpretation-32803": "מערך סינון צבע",
+       "exif-photometricinterpretation-34892": "גולמי קווי",
        "exif-unknowndate": "תאריך בלתי ידוע",
        "exif-orientation-1": "רגילה",
        "exif-orientation-2": "הפוך אופקית",
        "htmlform-cloner-required": "דרוש לפחות ערך אחד.",
        "htmlform-title-badnamespace": "[[:$1]] אינו במרחב השם \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" אינו שם של דף שאפשר ליצור",
-       "htmlform-title-not-exists": "[[:$1]] אינו קיים.",
+       "htmlform-title-not-exists": "$1 אינו קיים.",
        "htmlform-user-not-exists": "<strong>$1</strong> אינו קיים.",
        "htmlform-user-not-valid": "<strong>$1</strong> אינו שם משתמש תקין.",
        "sqlite-has-fts": "$1 עם תמיכה בחיפוש בטקסט מלא",
        "logentry-suppress-block": "$1 {{GENDER:$2|חסם|חסמה}} את {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|שינה|שינתה}} את הגדרות החסימה של {{GENDER:$4|$3}} עם זמן פקיעה של $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 באמצעות העלאת קובץ",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 באמצעות העלאת קובץ ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מאתר ויקי אחר",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|ייבא|ייבאה}} את $3 מ־$5 ({{PLURAL:$4|גרסה אחת|$4 גרסאות}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|מיזג|מיזגה}} את $3 לתוך $4 (גרסאות עד $5)",
        "logentry-move-move": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}}",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|העביר|העבירה}} את הדף $3 ל{{GRAMMAR:תחילית|$4}} בלי להשאיר הפניה",
index 8aea5cb..8438165 100644 (file)
@@ -74,6 +74,7 @@
        "tog-hideminor": "हाल में हुए परिवर्तन में छोटे बदलाव छिपाएँ",
        "tog-hidepatrolled": "हाल में हुए परिवर्तन में परीक्षित बदलाव छिपाएँ",
        "tog-newpageshidepatrolled": "नये पृष्ठों की सूची में परीक्षित पृष्ठ छिपाएँ",
+       "tog-hidecategorization": "पृष्ठों का श्रेणीकरण हटाएँ",
        "tog-extendwatchlist": "केवल हालिया ही नहीं, बल्कि सभी परिवर्तनों को दिखाने के लिए ध्यानसूची को विस्तारित करें",
        "tog-usenewrc": "हाल में हुए परिवर्तनों और ध्यानसूची में परिवर्तनों को पृष्ठ अनुसार समूहों में बाँटें",
        "tog-numberheadings": "शीर्षक स्व-क्रमांकित करें",
        "tog-watchlisthideliu": "मेरी ध्यानसूची में सत्रारम्भित सदस्यों के सम्पादन न दिखाएँ",
        "tog-watchlisthideanons": "आई॰पी॰ सदस्यों द्वारा किए सम्पादनों को मेरी ध्यानसूची में न दिखायें",
        "tog-watchlisthidepatrolled": "परीक्षित सम्पादन मेरी ध्यानसूची में छुपाएँ",
+       "tog-watchlisthidecategorization": "पृष्ठों का श्रेणीकरण छुपाएँ",
        "tog-ccmeonemails": "मेरे द्वारा अन्य सदस्यों को भेजी जाने वाली ईमेल की प्रतियाँ मुझे भी भेजें",
        "tog-diffonly": "अवतरणों में अन्तर दर्शाते समय पुराने अवतरण न दिखायें",
        "tog-showhiddencats": "छिपाई हुई श्रेणियाँ दिखायें",
        "missingarticle-rev": "(अवतरण#: $1)",
        "missingarticle-diff": "(अंतर: $1, $2)",
        "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस सर्वर के बराबर अद्यातानीत होने तक मुख्य डाटाबेस सर्वर लॉक हो गया है।",
+       "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' को एचटीटीपी शीर्षक द्वारा भेजा पर एपीआई में लेखन मॉड्यूल है।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
        "internalerror-fatal-exception": "प्रकार की गंभीर अपवाद \"$1\"",
        "protectedinterface": "यह पृष्ठ इस विकी के सॉफ़्टवेयर का इंटरफ़ेस पाठ देता है, और इसे गलत प्रयोग से बचाने के लिये सुरक्षित कर दिया गया है।\nसभी विकियों के लिए अनुवाद जोड़ने या बदलने के लिए कृपया मीडियाविकि के क्षेत्रीयकरण प्रकल्प [//translatewiki.net/ translatewiki.net] का प्रयोग करें।",
        "editinginterface": "<strong>चेतावनी:</strong> आप एक ऐसे पृष्ठ को बदल रहे हैं जो सॉफ़्टवेयर का इंटरफ़ेस पाठ प्रदान करता है।\nइस पृष्ठ को बदलने से अन्य सदस्यों को प्रदर्शित इंटरफ़ेस की शक्लोसूरत में बदलाव आएगा।",
        "translateinterface": "सभी विकियों के लिए अनुवाद जोड़ने या बदलने के लिए मीडियाविकि क्षेत्रीयकरण परियोजना [//translatewiki.net/ translatewiki.net] का प्रयोग करें।",
-       "cascadeprotected": "यह à¤ªà¥\83षà¥\8dठ à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\88à¤\82, à¤\95à¥\8dयà¥\8bà¤\82à¤\95à¥\80 à¤¯à¤¹ à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पà¥\83षà¥\8dठ|पà¥\83षà¥\8dठà¥\8bà¤\82}} à¤\95à¥\80 à¤¸à¥\81रà¤\95à¥\8dषा-सà¥\80à¥\9dी में समाविष्ट है:\n$2",
+       "cascadeprotected": "यह à¤ªà¥\83षà¥\8dठ à¤¸à¥\81रà¤\95à¥\8dषित à¤¹à¥\88à¤\82, à¤\95à¥\8dयà¥\8bà¤\82à¤\95ि à¤¯à¤¹ à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित {{PLURAL:$1|पà¥\83षà¥\8dठ|पà¥\83षà¥\8dठà¥\8bà¤\82}} à¤\95à¥\80 à¤¸à¥\81रà¤\95à¥\8dषा-सà¥\80ढ़ी में समाविष्ट है:\n$2",
        "namespaceprotected": "आपको '''$1''' नामस्थान में समाविष्ट पृष्ठों को बदलने की अनुमति नहीं है।",
        "customcssprotected": "आपको इस CSS पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।",
        "customjsprotected": "आपको इस जावास्क्रिप्ट पृष्ठ को संपादित करने की अनुमति नहीं है, क्योंकि इसमें अन्य सदस्य की व्यक्तिगत सेटिंग्स शामिल हैं।",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आप एक अन्य खाता क्यों बना रहे हैं",
-       "createacct-captcha": "सुरक्षा जाँच",
-       "createacct-imgcaptcha-ph": "उपरोक्त पाठ लिखें",
        "createacct-submit": "अपना खाता बनाएँ",
        "createacct-another-submit": "खाता बनाएँ",
        "createacct-benefit-heading": "{{SITENAME}} आपके जैसे लोगों द्वारा बनायी गई है।",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठ}}",
        "createacct-benefit-body3": "{{PLURAL:$1|योगदानकर्ता}}",
        "badretype": "आपने जो कूटशब्द दिये हैं वे एक दूसरे से नहीं मिलते। फिर से लिखें।",
+       "usernameinprogress": "इस प्रयोक्ता का खाता निर्माण अभी चालू है।\nकृपया प्रतीक्षा करें।",
        "userexists": "आपका दिया सदस्यनाम पहले से प्रयोग में है।\nकृपया कोई अन्य सदस्यनाम चुनें।",
        "loginerror": "लॉग इन त्रुटि",
        "createacct-error": "खाता निर्माण त्रुटि",
        "passwordreset-emailtext-ip": "किसी ने (शायद आपने ही, $1 आइ॰पी पते से) {{SITENAME}} ($4) पर अपने {{PLURAL:$3|कूटशब्द|कूटशब्दों}} को रीसेट करने का अनुरोध किया है। इस ई-मेल पते से निम्न {{PLURAL:$3|खाता जुड़ा है|खाते जुड़े हैं}}:\n\n$2\n\n{{PLURAL:$3|यह|ये}} अस्थायी कूटशब्द {{PLURAL:$5|एक दिन|$5 दिनों}} के बाद काम नहीं करेंगे। आपको लॉग इन करके एक नया कूटशब्द अभी चुन लेना चाहिए। यदि यह अनुरोध किसी और ने किया है, या फिर आपको अपना मूल कूटशब्द याद आ गया है, और आप {{PLURAL:$3|अपना|अपने}} कूटशब्द नहीं बदलना चाहते, आप इस संदेश को अनदेखा कर के अपने पुराने कूटशब्द का प्रयोग जारी रख सकते हैं।",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पर सदस्य $1 ने आपके {{PLURAL:$3|खाते|खातों}} के कूटशब्द को रीसेट करने का अनुरोध किया है। इस ई-मेल पते से निम्न {{PLURAL:$3|खाता जुड़ा है|खाते जुड़े हैं}}:\n\n$2\n\n{{PLURAL:$3|यह|ये}} अस्थायी कूटशब्द {{PLURAL:$5|एक दिन|$5 दिनों}} के बाद काम नहीं करेंगे।\nआपको लॉग इन करके एक नया कूटशब्द अभी चुन लेना चाहिए। यदि यह अनुरोध किसी और ने किया है, या फिर आपको अपना मूल कूटशब्द याद आ गया है, और आप {{PLURAL:$3|अपना|अपने}} कूटशब्द नहीं बदलना चाहते, आप इस संदेश को अनदेखा कर के अपने पुराने कूटशब्द का प्रयोग जारी रख सकते हैं।",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी कूटशब्द: \n$2",
-       "passwordreset-emailsent": "एक कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
+       "passwordreset-emailsentemail": "एक कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailsent-capture": "नीचे दिखाया गया कूटशब्द रीसेट ई-मेल भेज दिया गया है।",
        "passwordreset-emailerror-capture": "नीचे दृष्टित कूटशब्द रीसेट ई-मेल उत्पन्न किया गया था, परंतु उसे {{GENDER:$2|सदस्य}} को भेजना असफल रहा।\nत्रुटि: $1",
        "changeemail": "ई-मेल पता परिवर्तित करें",
-       "changeemail-header": "खाते का ई-मेल पता परिवर्तित करें",
+       "changeemail-header": "अपना ईमेल पता परिवर्तन हेतु इसे पूरा करें। यदि आप अपना वर्तमान ईमेल पता हटाना चाहते हैं, तो इसे खाली छोड़ दें और इसे भेजें।",
+       "changeemail-passwordrequired": "आपको इस परिवर्तन हेतु पासवर्ड (कूटशब्द) डालना होगा।",
        "changeemail-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "changeemail-oldemail": "वर्तमान ई-मेल पता:",
        "changeemail-newemail": "नया ई-मेल पता:",
+       "changeemail-newemail-help": "यदि आप अपना ईमेल (वि-डाक) पते को रिक्त रखना चाहते हैं तो आप इस जगह को खाली छोड़ सकते हैं। लेकिन आप अपना पासवर्ड भूल जाने पर उसे ईमेल द्वारा प्राप्त नहीं कर पाएंगे।",
        "changeemail-none": "(कोई नहीं)",
        "changeemail-password": "आपका {{SITENAME}} पासवर्ड:",
        "changeemail-submit": "ई-मेल बदलें",
        "changeemail-throttled": "आपने हाल ही में कई बार लॉग इन करने के प्रयास किये हैं।\nपुनः प्रयास करने से पहले कृपया $1 प्रतीक्षा करें।",
+       "changeemail-nochange": "कृपया कोई नया ईमेल पता प्रविष्ट करें।",
        "resettokens": "टोकन रीसेट करें",
        "resettokens-text": "जो टोकन आपके खाते से सम्बद्ध कुछ विशिष्ट व्यक्तिगत जानकारी प्रदान करते हैं, आप उन्हें यहाँ रीसेट कर सकते हैं।\n\nयदि आपने उन्हें गलती से किसी को दिखा दिया है या फिर आपका खाता हैक हो गया है तो आपको इन्हें रीसेट कर देना चाहिए।",
        "resettokens-no-tokens": "रीसेट करने के लिए कोई टोकन नहीं हैं।",
        "sig_tip": "आपका हस्ताक्षर व समय",
        "hr_tip": "हॉरिज़ौंटल लाइन (कम इस्तेमाल करें)",
        "summary": "सारांश:",
-       "subject": "विषय/शीर्षक:",
+       "subject": "विषय:",
        "minoredit": "यह एक छोटा बदलाव है",
        "watchthis": "इस पृष्ठ को ध्यानसूची में डालें",
        "savearticle": "पृष्ठ सहेजें",
        "missingcommenttext": "कृपया नीचे टिप्पणी दें।",
        "missingcommentheader": "'''अनुस्मारक:''' आपने इस टिप्पणी का कोई शीर्षक नहीं दिया है।\nअगर आप \"{{int:savearticle}}\" पर दोबारा क्लिक करते हैं तो आपके बदलाव बिना शीर्षक के संजोये जायेंगे।",
        "summary-preview": "सारांश की झलक:",
-       "subject-preview": "विषय/शीर्षक की झलक:",
+       "subject-preview": "विषय की झलक:",
        "previewerrortext": "आपके परिवर्तनों का पूर्वावलोकन करने का प्रयास करते समय एक त्रुटि हुई।",
        "blockedtitle": "सदस्य अवरुद्ध है",
        "blockedtext": "'''आपका सदस्यनाम अथवा आइ॰पी पता अवरोधित कर दिया गया हैं ।'''\n\nअवरोध $1 द्वारा किया गया था।\nअवरोध का कारण है ''$2''\n\n* अवरोध का आरंभ: $8\n* अवरोध की समाप्ति: $6\n* अवरोधित इकाई: $7\n\nइस अवरोध के बारे में चर्चा करने के लिए आप $1 या किसी अन्य [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] से संपर्क कर सकते हैं।\nअगर आपने [[Special:Preferences|अपनी वरीयताओं]] में वैध ई-मेल पता प्रविष्ट किया है तो ही आप 'इस प्रयोक्ता को ई-मेल भेजें' वाली सुविधा का इस्तेमाल कर सकते हैं और आपको इसका इस्तेमाल करने से नहीं रोका गया है।\nआपका मौजूदा आइ॰पी पता $3 है और अवरोध क्रमांक #$5 है।\nअपने किसी भी प्रश्न में कृपया यह सभी जानकारी भी शामिल करें।",
        "yourdiff": "अंतर",
        "copyrightwarning": "कृपया ध्यान दें कि {{SITENAME}} को किये गये सभी योगदान $2 की शर्तों के तहत होंगे (अधिक जानकारी के लिये $1 देखें)।\nयदि आप अपने योगदान को लगातार बदलते और पुनः वितरित होते नहीं देख सकते हैं तो यहाँ योगदान न करें।<br />\nआप यह भी प्रमाणित कर रहे हैं कि यह आपने स्वयं लिखा है अथवा सार्वजनिक क्षेत्र या किसी समान मुक्त स्रोत से प्रतिलिपित किया है।\n'''कॉपीराइट सुरक्षित कार्यों को बिना अनुमति के यहाँ न डालें!'''",
        "copyrightwarning2": "{{SITENAME}} पर किया कोई भी योगदान अन्य सदस्यों द्वारा बदला जा सकता है और हटाया भी जा सकता है।\nअगर आपको अपने लिखे हुए पाठ में संपादन होना नामंजूर है तो यहाँ पर न लिखें।<br />\nआप हमें यह भी वचन देतें हैं कि यह आपने स्वयं लिखा है अथवा सार्वजनिक क्षेत्र या किसी समान मुक्त स्रोत से प्रतिलिपित किया है (अधिक जानकारी के लिये $1 देखें)।\n'''कॉपीराइट सुरक्षित कार्यों को बिना अनुमति के यहाँ न डालें!'''",
+       "editpage-cannot-use-custom-model": "इस पृष्ठ का मुख्य सामग्री परिवर्तित नहीं हुआ।",
        "longpageerror": "'''त्रुटि: आपका दिया हुआ पाठ {{PLURAL:|$1 किलोबाइट|$1 किलोबाइट}} लंबा है, जो {{PLURAL:|$2 किलोबाइट|$2 किलोबाइट}} की सीमा से बाहर है।\nइसे संजोया नहीं जा सकता।'''",
        "readonlywarning": "'''सावधान: डाटाबेस को रख-रखाव के लिये बंद कर दिया गया है, इसलिये अभी आपके बदलाव संजोए नहीं जा सकते।\nअगर आप चाहें तो इस सामग्री को बाद के लिए कॉपी-पेस्ट कर के किसी टेक्स्ट फ़ाइल में रख सकते हैं।'''\n\nबंद करने वाले प्रबंधक ने बंद करने का यह कारण दिया है: $1",
        "protectedpagewarning": "'''चेतावनी: इस पृष्ठ को सुरक्षित कर दिया गया है और इसे केवल प्रबंधक ही सम्पादित कर सकते हैं।'''\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:",
        "semiprotectedpagewarning": "'''सूचना:''' यह पृष्ठ सुरक्षित कर दिया गया है और इसे केवल पंजीकृत सदस्य ही सम्पादित कर सकते हैं।\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:",
-       "cascadeprotectedwarning": "'''सावधान:''' à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤¸à¥\81रà¤\95à¥\8dषा-सà¥\80à¥\9dà¥\80 {{PLURAL:$1|पà¥\83षà¥\8dठ à¤¸à¥\87|पनà¥\8dनà¥\8bà¤\82 à¤¸à¥\87}} à¤\9cà¥\81à¥\9cा हुआ होने के कारण सुरक्षित है, और केवल प्रबंधक ही इसमें बदलाव कर सकते हैं:",
+       "cascadeprotectedwarning": "'''सावधान:''' à¤¯à¤¹ à¤ªà¥\83षà¥\8dठ à¤¨à¤¿à¤®à¥\8dनलिà¤\96ित à¤¸à¥\81रà¤\95à¥\8dषा-सà¥\80ढ़à¥\80 {{PLURAL:$1|पà¥\83षà¥\8dठ à¤¸à¥\87|पनà¥\8dनà¥\8bà¤\82 à¤¸à¥\87}} à¤\9cà¥\81ड़ा हुआ होने के कारण सुरक्षित है, और केवल प्रबंधक ही इसमें बदलाव कर सकते हैं:",
        "titleprotectedwarning": "'''चेतावनी: यह पृष्ठ सुरक्षित है और इसे बनाने के लिये [[Special:ListGroupRights|विशेष अधिकारों]] की आवश्यकता है।'''\nनवीनतम लॉग प्रविष्टि संदर्भ के लिये नीचे दी है:",
        "templatesused": "इस पृष्ठ पर प्रयुक्त {{PLURAL:$1|साँचा|साँचे}}:",
        "templatesusedpreview": "इस झलक में प्रयुक्त {{PLURAL:$1|साँचा|साँचे}}:",
        "permissionserrors": "अधिकार त्रुटि",
        "permissionserrorstext": "निम्नलिखित {{PLURAL:$1|कारण|कारणों}} से आपको ऐसा करने की अनुमति नहीं हैं:",
        "permissionserrorstext-withaction": "आपको $2 की अनुमति नहीं हैं, निम्नलिखित {{PLURAL:$1|कारण|कारणों}} की वजह से:",
+       "contentmodelediterror": "आप इस पृष्ठ का इतिहास में सम्पादन नहीं कर सकते हैं क्योंकि इसका सामग्री <code>$1</code>, और वर्तमान सामग्री <code>$2</code> है।",
        "recreate-moveddeleted-warn": "'''चेतावनी: आप एक पहले हटाए गए पृष्ठ को पुनर्निर्मित कर रहे हैं।'''\n\nआप को विचार करना चाहिये कि क्या इस पृष्ठ का संपादन जारी रखना उचित होगा।\nइस पृष्ट के हटाने व स्थानांतरण का लॉग सुविधा के लिये उपलब्ध है:",
        "moveddeleted-notice": "यह पृष्ठ हटाया जा चुका है।\nपृष्ठ के हटाने और स्थानांतरण का लॉग संदर्भ के लिए नीचे दिया गया है।",
+       "moveddeleted-notice-recent": "क्षमा करें, यह पृष्ठ कुछ ही समय पहले हटाया गया है। (24 घण्टों के भीतर)\nइसके हटाये और स्थानांतरित करने का लोग नीचे दिया हुआ है।",
        "log-fulllog": "पूरा लॉग देखें",
        "edit-hook-aborted": "फंदे द्वारा संपादन बीच में ही छोड़ा गया।\nउसने कोई कारण नहीं बताया।",
        "edit-gone-missing": "पृष्ठ अद्यतित न किया जा सका।\nलगता है यह हटा दिया गया है।",
        "search-category": "(श्रेणी $1)",
        "search-file-match": "(फ़ाइल सामग्री से मेल खाता है)",
        "search-suggest": "कहीं आपका मतलब $1 तो नहीं था?",
+       "search-rewritten": "$1 का परिणाम दिखा रहा है। यह $2 हेतु खोज रहा है।",
        "search-interwiki-caption": "अन्य प्रकल्प",
        "search-interwiki-default": "$1 से परिणाम:",
        "search-interwiki-more": "(और)",
        "showingresultsinrange": "दिखा रहे हैं {{PLURAL:$1|<strong>1</strong> result|<strong>$1</strong> परिणाम}} तक पहुँच  #<strong>$2</strong> to #<strong>$3</strong> में।",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> में से <strong>$1</strong> परिणाम|<strong>$3</strong> में से परिणाम <strong>$1 - $2</strong>}}",
        "search-nonefound": "आपकी खोज से मेल खाते कोई परिणाम नहीं मिले।",
+       "search-nonefound-thiswiki": "आपके खोज से कोई भी परिणाम नहीं मिला।",
        "powersearch-legend": "उन्नत खोज",
        "powersearch-ns": "नामस्थानों में खोजें:",
        "powersearch-togglelabel": "चुनें:",
        "prefs-watchlist-token": "ध्यानसूची टोकन",
        "prefs-misc": "अन्य",
        "prefs-resetpass": "कूटशब्द बदलें",
-       "prefs-changeemail": "à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤¬à¤¦à¤²ें",
+       "prefs-changeemail": "à¤\88-मà¥\87ल à¤ªà¤¤à¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतित à¤\95रें",
        "prefs-setemail": "ई-मेल पता सेट करें",
        "prefs-email": "ई-मेल वरीयताएँ",
        "prefs-rendering": "शक्लोसूरत",
        "rows": "कतारें:",
        "columns": "कॉलम:",
        "searchresultshead": "खोज",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">आधार कड़ियों</a> का अधिकतम आकार (बाइट):",
+       "stub-threshold": "आधार कड़ी हेतु प्रारूपण ($1):",
+       "stub-threshold-sample-link": "उदाहरण",
        "stub-threshold-disabled": "अक्षम किया गया",
        "recentchangesdays": "हाल में हुए बदलावों में दर्शाने के दिन:",
        "recentchangesdays-max": "अधिकतम $1 {{PLURAL:$1|दिन}}",
        "prefs-help-recentchangescount": "इसमें हाल के बदलाव, पृष्ठ इतिहास व लॉग शामिल हैं।",
        "prefs-help-watchlist-token2": "यह आपकी ध्यानसूची की वेब फ़ीड की गोपनीय चाबी है।\nयह जिसके भी पास होगी वह आपकी ध्यानसूची पढ़ सकेगा, इसिलए इसे किसी के साथ बांटियेगा नहीं।\n[[Special:ResetTokens|इसे रीसेट करने के लिए यहाँ क्लिक करें]]।",
        "savedprefs": "आपकी वरीयताएँ संजोई गई हैं।",
+       "savedrights": "प्रयोक्ता {{GENDER:$1|$1}} का सदस्य अधिकार सहेजा गया।",
        "timezonelegend": "समयमंडल:",
        "localtime": "स्थानीय समय:",
        "timezoneuseserverdefault": "विकी डिफ़ॉल्ट का उपयोग करें ($1)",
        "prefs-help-prefershttps": "यह वरीयता आपके अगले लॉगिन पर प्रभावी होगी।",
        "prefswarning-warning": "आपने अपनी वरीयताओं में एैसे परिवर्तन किए हैं जिन्हे अभी तक संचित नहीं किया गया है। अगर अाप \"$1\" पर बिना क्लिक किये इस पृष्ठ को छोड़ देते हैं तो अापकी वरीयताओं का अद्यतन नहीं किया जाएगा।",
        "prefs-tabs-navigation-hint": "सुझाव: आप टैब्स सूची में टैब्स के बीच आवागमन करने के लिए बाएँ और दाएँ तीर कुंजियों का उपयोग कर सकते हैं।",
-       "email-address-validity-valid": "ई-मेल पता वैध प्रतीत होता है",
-       "email-address-validity-invalid": "एक वैध ई-मेल पता प्रविष्ट करें",
        "userrights": "सदस्य अधिकार व्यवस्थापन",
        "userrights-lookup-user": "सदस्य समूहों का व्यवस्थापन करें",
        "userrights-user-editname": "सदस्यनाम दें:",
        "rcshowhidemine": "मेरे बदलाव $1",
        "rcshowhidemine-show": "दिखाएँ",
        "rcshowhidemine-hide": "छुपाएँ",
+       "rcshowhidecategorization": "$1 पृष्ठ श्रेणीकरण",
+       "rcshowhidecategorization-show": "दिखाएँ",
+       "rcshowhidecategorization-hide": "छुपाएँ",
        "rclinks": "पिछले $2 दिनों में हुए $1 बदलाव दिखाएँ<br />$3",
        "diff": "अंतर",
        "hist": "इतिहास",
        "boteditletter": "बॉ",
        "number_of_watching_users_pageview": "[$1 ध्यान रखने वाले {{PLURAL:$1|सदस्य}}]",
        "rc_categories": "श्रेणीयों तक सीमीत रखें (\"|\" से अलग करें)",
-       "rc_categories_any": "कोई भी",
+       "rc_categories_any": "कोई भी चुनिन्दा",
        "rc-change-size-new": "बदलाव के बाद $1 {{PLURAL:$1|बाइट}}",
        "newsectionsummary": "/* $1 */ नया अनुभाग",
        "rc-enhanced-expand": "विस्तृत जानकारी दिखाएँ",
        "recentchangeslinked-summary": "यह पृष्ठ किसी विशिष्ट पृष्ठ से जुड़े पृष्ठों (या किसी श्रेणी में श्रेणीबद्ध पृष्ठों) में हाल में हुए बदलावों की सूची दर्शाता है।\n[[Special:Watchlist|आपकी ध्यानसूची]] में मौजूद पृष्ठ '''मोटे''' अक्षरों में दिखेंगे।",
        "recentchangeslinked-page": "पृष्ठ नाम:",
        "recentchangeslinked-to": "इसके बदले में दिये हुए पृष्ठसे जुडे पन्नोंके बदलाव दर्शायें",
+       "recentchanges-page-added-to-category": "[[:$1]] श्रेणी में जुड़ा",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] और {{PLURAL:$2|एक पृष्ठ|$2 पृष्ठ}} श्रेणी में जुड़ा",
+       "recentchanges-page-removed-from-category": "[[:$1]] श्रेणी से हटा",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] और {{PLURAL:$2|एक पृष्ठ|$2 पृष्ठ}} श्रेणी से हटा",
+       "autochange-username": "मीडियाविकि स्वतः परिवर्तन",
        "upload": "फ़ाइल अपलोड करें",
        "uploadbtn": "फ़ाइल अपलोड करें",
        "reuploaddesc": "अपलोड रद्द करें और पुनः अपलोड फ़ॉर्म पर जाएँ",
        "uploaded-href-attribute-svg": "गैर-स्थानीय लक्ष्य के साथ एचआरईऍफ श्रेय (href attributes) <code>&lt;$1 $2=\"$3\"&gt;</code> (उदाहरण के लिए http://, जावास्क्रीप्ट:, इत्यादि) एसवीजी फाइल में अनुमत नहीं हैं।",
        "uploaded-href-unsafe-target-svg": "अपलोड की गयी फ़ाइल में असुरक्षित लक्ष्य <code>&lt;$1 $2=\"$3\"&gt;</code> पाये गए।",
        "uploaded-animate-svg": "चिप्पि \"animate\" पायी गई जिससे href परिवर्तित हो सकता है, अपलोड की गयी फ़ाइल में \"from\" विशेषता <code>&lt;$1 $2=\"$3\"&gt;</code> काम में ली जा रही है।",
+       "uploaded-setting-event-handler-svg": "विकल्प आयोजन-संभालने वाला अवरोधित है, एसवीजी फ़ाइल में मिला <code>&lt;$1 $2=\"$3\"&gt;</code> है।",
+       "uploaded-setting-href-svg": "\"set\" का उपयोग कर \"href\" जोड़ना अवरोधित है।",
+       "uploaded-wrong-setting-svg": "\"set\" का उपयोग कर किसी अन्य डाटा, लिपि से कार्य अवरोधित है। एसवीजी फ़ाइल में मिला <code>&lt;set to=\"$1\"&gt;</code> है।",
+       "uploaded-setting-handler-svg": "एसवीजी जो \"handler\" जोड़ता है, अवरोधित है। उससे मिला <code>$1=\"$2\"</code> है।",
+       "uploaded-remote-url-svg": "एसवीजी जो रिमोट पते द्वारा शैली तय करता है, अवरोधित है। उससे <code>$1=\"$2\"</code> मिला है।",
+       "uploaded-image-filter-svg": "पते के साथ छवि छन्नी मिला: <code>&lt;$1 $2=\"$3\"&gt;</code> एसवीजी फ़ाइल में।",
        "uploadscriptednamespace": "इस एस॰वी॰जी फ़ाइल में अमान्य नामस्थान \"$1\" है।",
        "uploadinvalidxml": "अपलोड की गई फ़ाइल में स्थित XML पार्स नहीं की जा सकी।",
        "uploadvirus": "इस फ़ाइल में व्हाईरस हैं! अधिक जानकारी: $1",
        "upload-options": "अपलोड विकल्प",
        "watchthisupload": "इस फ़ाइल पर ध्यान रखें",
        "filewasdeleted": "इस नाम की एक फ़ाइल पहले भी अपलोड होने के बाद हटाई जा चुकी है।\nफिरसे अपलोड करने से पहले आप $1 को अच्छी तरह से जाँचे।",
+       "filename-thumb-name": "यह एक थंबनेल शीर्षक की तरह लग रहा है। कृपया थंबनेल  वापस विकि पर अपलोड न करें। अन्यथा, कृपया फ़ाइल नाम ठीक करें।",
        "filename-bad-prefix": "आप जो फ़ाइल अपलोड कर रहे हैं उसका नाम '''\"$1\"''' से शुरू होता है, जो डिजिटल कैमेरे द्वारा दिया गया नाम है।\nकृपया इस फ़ाइल के लिये कोई दूसरा अधिक जानकारीयुक्त नाम चुनें।",
        "filename-prefix-blacklist": "#<!-- leave this line exactly as it is --> <pre>\n# रूपरेखा इस प्रकार हैं:\n#   *  \"#\" अक्षर से शुरू होने वाली लाइनें टिप्पणीयाँ हैं।\n#   *हर नई लाइन कैमेरा उत्पादक द्वारा लगाये जाने वाले उपपदों की सूची है।\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # some mobil phones\nIMG # generic\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- leave this line exactly as it is -->",
        "upload-success-subj": "अपलोड हो गई",
        "upload-too-many-redirects": "इस यू॰आर॰एल में अत्यधिक पुनर्निर्देशन हैं",
        "upload-http-error": "एक एच॰टी॰टी॰पी त्रुटि आई: $1",
        "upload-copy-upload-invalid-domain": "कॉपी अपलोड इस डोमेन से उपलब्ध नहीं हैं।",
+       "upload-dialog-title": "फ़ाइल डालें",
+       "upload-dialog-button-cancel": "रद्द करें",
+       "upload-dialog-button-done": "पूर्ण हुआ",
+       "upload-dialog-button-save": "सहेजें",
+       "upload-dialog-button-upload": "डालें",
+       "upload-form-label-select-file": "फ़ाइल चुनें",
+       "upload-form-label-infoform-title": "विवरण",
+       "upload-form-label-infoform-name": "नाम",
+       "upload-form-label-infoform-description": "विवरण",
+       "upload-form-label-usage-title": "उपयोग",
+       "upload-form-label-usage-filename": "फ़ाइल का नाम",
+       "foreign-structured-upload-form-label-own-work": "यह मेरा कार्य है",
+       "foreign-structured-upload-form-label-infoform-categories": "श्रेणियाँ",
+       "foreign-structured-upload-form-label-infoform-date": "दिनांक",
+       "foreign-structured-upload-form-label-own-work-message-local": "मैं यह सत्यापित करता हूँ कि मेरे द्वारा डाला गया फ़ाइल {{SITENAME}} सेवा के शर्तों और अधिकार नियम के अनुकूल है।",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "यदि आप {{SITENAME}} के नियमों के अंतर्गत फ़ाइल नहीं डाल सकते, तो आप इसे हटा कर किसी दूसरे विधि का उपयोग करें।",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "आप [[Special:Upload|मूल डालने वाले पृष्ठ]] का भी उपयोग कर सकते हो।",
+       "foreign-structured-upload-form-label-own-work-message-default": "मैं यह समझता हूँ कि यहाँ सभी फ़ाइल सांझा होते हैं। मैं यह सत्यापित करता हूँ कि में सेवा के शर्तों और नियम के अनुरूप ही कार्य कर रहा हूँ।",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "यदि आप इस नियम के अंतर्गत फ़ाइल नहीं डालना चाहते तो अभी इसे बन्द कर दें और कोई दूसरे विधि को खोजें।",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "यदि आप चाहें तो आप [[Special:Upload|{{SITENAME}} के पृष्ठ]] पर फ़ाइल डाल सकते हैं, यदि यह फ़ाइल वहाँ के नियम के अंतर्गत हो तो।",
+       "foreign-structured-upload-form-label-own-work-message-shared": "कम से कम इस फ़ाइल का प्रतिकृति अधिकार मेरे पास है और यह [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] के अंतर्गत है, व [https://wikimediafoundation.org/wiki/Terms_of_Use विकि उपयोग की शर्तों] का भी पालन करता है।",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "यदि आपके पास इस फ़ाइल का प्रतिकृति अधिकार नहीं है और आप इसे किसी और अधिकार के तहत प्रदर्शित करना चाहते हैं तो आप [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons Upload Wizard] का उपयोग करें।",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "यदि आप चाहें तो आप [[Special:Upload|{{SITENAME}} के पृष्ठ]] पर फ़ाइल डाल सकते हैं, यदि यह फ़ाइल वहाँ के नियम के अंतर्गत हो तो।",
        "backend-fail-stream": "फ़ाइल $1 स्ट्रीम नहीं हो पाई।",
        "backend-fail-backup": "फ़ाइल $1 बैकअप नहीं हो पाई।",
        "backend-fail-notexists": "फ़ाइल $1 मौजूद नहीं है।",
        "activeusers-hidebots": "बॉट छुपाएँ",
        "activeusers-hidesysops": "प्रबंधक छुपाएँ",
        "activeusers-noresult": "कोई सदस्य नहीं मिले।",
+       "activeusers-submit": "सक्रिय सदस्यों को दिखायें",
        "listgrouprights": "सदस्य समूह अधिकार",
        "listgrouprights-summary": "नीचे इसे विकि के लिए परिभाषित सदस्य समूहों की सूची है, साथ में हर समूह से जुड़े अधिकार भी वर्णित हैं।\nहर अधिकार के बारे में [[{{MediaWiki:Listgrouprights-helppage}}|अतिरिक्त जानकारी]] भी उपलब्ध है।",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">दिए गए अधिकार</span>\n* <span class=\"listgrouprights-revoked\">हटाए गए अधिकार</span>",
        "wlheader-showupdated": "पृष्ठ जो आपके द्वारा देखे जाने के बाद बदले गये हैं '''बोल्ड''' दिखेंगे।",
        "wlnote": "$3 को $4 बजे तक पिछले <strong>$2</strong> {{PLURAL:$2|घंटे|घंटों}} में {{PLURAL:$1|हुआ एक|हुए <strong>$1</strong>}} परिवर्तन निम्न {{PLURAL:$1|है|हैं}}।",
        "wlshowlast": "पिछले $1 घंटे $2 दिन  देखें",
+       "watchlistall2": "सभी",
+       "wlshowtime": "अंतिम दिखाएँ:",
+       "wlshowhideminor": "छोटा संपादन",
+       "wlshowhidebots": "बॉट",
+       "wlshowhideliu": "पञ्जीकृत प्रयोक्ता",
+       "wlshowhideanons": "अनाम प्रयोक्ता",
+       "wlshowhidepatr": "परीक्षित सम्पादन",
+       "wlshowhidemine": "मेरा संपादन",
        "watchlist-options": "ध्यानसूची विकल्प",
        "watching": "ध्यान दे रहे हैं...",
        "unwatching": "ध्यान हटा रहे हैं...",
        "changecontentmodel-model-label": "नयि सामग्री का नमूना",
        "changecontentmodel-reason-label": "कारण:",
        "changecontentmodel-success-title": "सामगरि का नामुने मे बदलाव हुुुाा हेेे",
+       "changecontentmodel-success-text": "[[:$1]] के सामग्री का प्रकार परिवर्तित हुआ।",
+       "changecontentmodel-cannot-convert": "[[:$1]] की सामग्री का प्रकार $2 में नहीं बदल सकता है।",
+       "changecontentmodel-nodirectediting": "$1 सामग्री सीधे सम्पादन समर्थित नहीं करता है",
+       "log-name-contentmodel": "सामाग्री परिवर्तन लॉग",
+       "log-description-contentmodel": "आयोजन जो इस पृष्ठ के सामग्री से मिलते जुलते हैं",
+       "logentry-contentmodel-change": "$1 ने $3 पृष्ठ का सामग्री \"$4\" से \"$5\" {{GENDER:$2|परिवर्तित किया}}",
+       "logentry-contentmodel-change-revertlink": "पूर्ववत करें",
+       "logentry-contentmodel-change-revert": "पूर्ववत करें",
        "protectlogpage": "सुरक्षा लॉग",
        "protectlogtext": "नीचे पृष्ठ सुरक्षा में हुए बदलावों की सूची है।\nवर्तमान सुरक्षित पृष्ठों की सूची के लिए [[Special:ProtectedPages|सुरक्षित पृष्ठों की सूची]] देखें।",
        "protectedarticle": "\"[[$1]]\" सुरक्षित कर दिया",
        "movenosubpage": "इस पृष्ठ के कोई उपपृष्ठ नहीं हैं।",
        "movereason": "कारण:",
        "revertmove": "पुराने अवतरण पर ले जाएं",
-       "delete_and_move": "हटाएँ और नाम बदलें",
        "delete_and_move_text": "==हटाने की ज़रूरत==\nलक्ष्य पृष्ठ \"[[:$1]]\" पहले से मौजूद है।\nनाम बदलने के लिये क्या आप इसे हटाना चाहते हैं?",
        "delete_and_move_confirm": "जी हाँ, पृष्ठ हटाएँ",
        "delete_and_move_reason": "\"[[$1]]\" से स्थानांतरण करने के लिये जगह बनाई गयी है",
        "pageinfo-robot-index": "अनुमतित",
        "pageinfo-robot-noindex": "नहीं अनुमतित",
        "pageinfo-watchers": "पृष्ठ पर नज़र रखने वालों की संख्या",
+       "pageinfo-visiting-watchers": "पृष्ठ देखने वालों की संख्या जो हाल के संपादनों में आए।",
        "pageinfo-few-watchers": "$1 से कम ध्यान देने {{PLURAL:$1|वाला|वाले}}",
+       "pageinfo-few-visiting-watchers": "हो सकता है या नहीं भी कि कोई इस हाल के सम्पादन द्वारा कोई प्रयोक्ता आया हो।",
        "pageinfo-redirects-name": "इस पृष्ठ को पुनर्निर्देशों की संख्या",
        "pageinfo-subpages-name": "इस पृष्ठ के उप-पृष्ठ",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देश}}; $3 {{PLURAL:$3|ग़ैर-पुनर्निर्देश}})",
        "svg-long-error": "अमान्य एस॰वी॰जी फ़ाइल: $1",
        "show-big-image": "मूल फ़ाइल",
        "show-big-image-preview": "इस पूर्वावलोकन का आकार:  $1 ।",
+       "show-big-image-preview-differ": "पूर्वावलोकन $3 का आकार $2 फ़ाइल: $1",
        "show-big-image-other": "अन्य  {{PLURAL:$2| resolution|resolutions}}:  $1 ।",
        "show-big-image-size": "$1 × $2  पिक्सेल",
        "file-info-gif-looped": "चक्रित",
        "version-libraries": "स्थापित लाइब्रेरी",
        "version-libraries-library": "लाइब्रेरी",
        "version-libraries-version": "संस्करण",
+       "version-libraries-license": "अनुज्ञापत्र",
+       "version-libraries-description": "विवरण",
+       "version-libraries-authors": "लेखक",
        "redirect": "अनुप्रेषित करें फ़ाइल, उपयोगकर्ता, या संशोधन पहचान के आधार पर",
        "redirect-legend": "फ़ाइल अथवा पृष्ठ को पुनर्प्रेषण",
        "redirect-summary": "यह विशेष पृष्ठ फ़ाइलनाम प्रदान करने पर फ़ाइल नाम को, पृष्ठ आइ॰दी अथवा अवतरण आइ॰दी देने पर पृष्ठ को, और सदस्य आइ॰दी देने पर सदस्य पृष्ठ को पुनर्प्रेषित करता है। उदाहरण: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], या [[{{#Special:Redirect}}/user/101]]।",
        "htmlform-cloner-create": "अधिक जोड़ें",
        "htmlform-cloner-delete": "हटाएँ",
        "htmlform-cloner-required": "कम से कम एक मूल्य की आवश्यकता है।",
+       "htmlform-title-badnamespace": "[[:$1]] अभी \"{{ns:$2}}\" नामस्थान में नहीं है।",
+       "htmlform-title-not-creatable": "\"$1\" निर्माण करने लायक शीर्षक नहीं है।",
+       "htmlform-title-not-exists": "$1 नहीं बना है।",
+       "htmlform-user-not-exists": "<strong>$1</strong> मौजूद नहीं है।",
+       "htmlform-user-not-valid": "<strong>$1</strong> मान्य प्रयोक्ता नाम नहीं है।",
        "sqlite-has-fts": "$1 पूर्ण पाठ खोज समर्थन के साथ",
        "sqlite-no-fts": "$1पूर्ण-पाठ खोज समर्थन के बिना",
        "logentry-delete-delete": "$1 ने पृष्ठ $3 {{GENDER:$2|हटा}} दिया",
        "logentry-newusers-create2": "सदस्य खाता $3 $1 द्वारा {{GENDER:$2|बनाया}} गया था",
        "logentry-newusers-byemail": "$1 द्वारा सदस्य खाता $3 {{GENDER:$2|बनाया}} गया एवं पासवर्ड ई-मेल द्वारा भेजा गया था",
        "logentry-newusers-autocreate": "खाते $1 स्वचालित रूप से {{GENDER:$2|बनाया}} गया था",
+       "logentry-protect-move_prot": "$1 ने सुरक्षा व्यवस्था $4 से {{GENDER:$2|स्थानांतरित}} कर $3 में कर दिया।",
+       "logentry-protect-unprotect": "$1 ने $3 से सुरक्षा {{GENDER:$2|हटाया}}",
+       "logentry-protect-protect": "$1 ने $3 $4 {{GENDER:$2|सुरक्षित}} किया।",
+       "logentry-protect-protect-cascade": "$1 ने $3 $4 {{GENDER:$2|सुरक्षित किया}} [व्यापक]",
+       "logentry-protect-modify": "$1 ने $3 $4 का सुरक्षा स्तर {{GENDER:$2|परिवर्तित किया}}",
+       "logentry-protect-modify-cascade": "$1 ने $3 $4 का सुरक्षा स्तर {{GENDER:$2|परिवर्तित किया}} [व्यापक]",
        "logentry-rights-rights": "$1 ने $3 के सदस्य समूह $4 से बदलकर $5 {{GENDER:$2|किये}}",
        "logentry-rights-rights-legacy": "$1 ने $3 के सदस्य समूह {{GENDER:$2|बदले}}",
        "logentry-rights-autopromote": "$1 के सदस्य समूह स्वतः $4 से बदलकर $5 {{GENDER:$2|किये}} गए",
        "special-characters-title-endash": "एन डैश",
        "special-characters-title-emdash": "एम डैश",
        "special-characters-title-minus": "ऋण चिह्न",
+       "mw-widgets-dateinput-no-date": "कुछ चयनित नहीं",
        "mw-widgets-titleinput-description-new-page": "पृष्ठ अभी मौजूद नहीं है",
-       "mw-widgets-titleinput-description-redirect": "$1 को अनुप्रेषित"
+       "mw-widgets-titleinput-description-redirect": "$1 को अनुप्रेषित",
+       "api-error-blacklisted": "कृपया कोई दूसरा विवरणात्मक शीर्षक चुनें।"
 }
index 430f6a3..319a29f 100644 (file)
@@ -14,7 +14,9 @@
                        "Filipinayzd",
                        "SNN95",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "V6rg",
+                       "C.R."
                ]
        },
        "tog-underline": "Jorr ke niche line khicho:",
        "createaccountreason": "Kaaran:",
        "createacct-reason": "Kaaran",
        "createacct-reason-ph": "Aap ke ii account ke banae ke kaaran",
-       "createacct-captcha": "Security check",
-       "createacct-imgcaptcha-ph": "Niche dekhae waala text ke likho",
        "createacct-submit": "Aapan account banao",
        "createacct-another-submit": "Duusra account banao",
        "createacct-benefit-heading": "Aap ke rakam log {{SITENAME}} ke banain hae.",
        "passwordreset-emailsent-capture": "Ek password yaad karae waala e-mail, jiske niche dekhawa jaawe hae, ke bhej dewa gais hae.",
        "passwordreset-emailerror-capture": "Ek password yaad karae waala e-mail ke banawa gais hae, jiske niche dekhawa jaawe hae, lekin jiske {{GENDER:$2|user}} ke lage bheje nai jawa sake hae: $1",
        "changeemail": "E-mail address ke badlo",
-       "changeemail-text": "Aapan e-mail ke badle kae khaatir ii form ke fill karo. Ii badlao ke khatir aap ke aapan password ke de ke parri.",
+       "changeemail-header": "Account e-mail address ke badlo",
        "changeemail-no-info": "Ii panna ke sidha dekhe ke khaatir, aap ke login kare ke parri.",
        "changeemail-oldemail": "Abhi ke E-mail address:",
        "changeemail-newemail": "Nawaa E-mail address:",
        "wlheader-showupdated": "Panna jiske aap ke pichhla visit ke ke baad badal dewa gais hia ke '''bold''' me dekhawa jaawe hai.",
        "wlnote": "Niche ke {{PLURAL:$1|pahile waala badlao hai| pahile <strong>$1</strong> badlao hai}} pichhle {{PLURAL:$2|ghanta|<strong>$2</strong> ghanta}} me as of $3, $4.",
        "wlshowlast": "Pichhla $1 ghanta $2 din  ke dekhao",
+       "watchlistall2": "sab",
        "watchlist-options": "Dhyan suchi ke options",
        "watching": "Dekhtaa...",
        "unwatching": "Nai dekhtaa...",
        "movenosubpage": "Ii panna me koi subpages nai hai.",
        "movereason": "Kaaran:",
        "revertmove": "purana copy pe lae jao",
-       "delete_and_move": "Mitao aur hatao",
        "delete_and_move_text": "== Mitae ke jaruri hai ==\nDestination panna \"[[:$1]]\" abhi hai.\nKa aap mangta hai ki iske mitae dewa jaae, jisse ki ii naam se duusra paana ke save karaa jaae sake?",
        "delete_and_move_confirm": "Haan, panna ke mitao",
        "delete_and_move_reason": "\"[[$1]]\" se move kare ke khatir isk mitaya",
index eccf3ea..d64a88a 100644 (file)
        "morenotlisted": "Ovaj popis nije potpun.",
        "mypage": "Stranica",
        "mytalk": "Razgovor",
-       "anontalk": "Razgovor za ovu IP adresu",
+       "anontalk": "Razgovor",
        "navigation": "Orijentacija",
        "and": "&#32;i",
        "qbfind": "Nađi",
        "nstab-template": "Predložak",
        "nstab-help": "Pomoć",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Glavna stranica",
        "nosuchaction": "Nema takve naredbe",
        "nosuchactiontext": "Navedeni URL označava nepostojeću naredbu.\nMožda se pogrešno upisali URL ili slijedili pogrešnu poveznicu.\nOvo također može ukazivati na grešku u softveru kojeg koristi {{SITENAME}}.",
        "nosuchspecialpage": "Posebna stranica ne postoji",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate drugi račun",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Stvorite svoj suradnički račun",
        "createacct-another-submit": "Stvori još jedan račun",
        "createacct-benefit-heading": "{{SITENAME}} su stvorili ljudi poput Vas.",
        "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
        "passwordreset-emailtext-user": "Suradnik $1 na {{SITENAME}} zatražio podsjetnik o pojedinostima vašeg računa za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste sjeti Vaše izvorne lozinke, a vi je više ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru lozinku.",
        "passwordreset-emailelement": "Suradničko ime: \n$1\n\nPrivremena lozinka: \n$2",
-       "passwordreset-emailsent": "E-mail podsjetnik zaporke je poslan.",
+       "passwordreset-emailsentemail": "E-mail podsjetnik zaporke je poslan.",
        "passwordreset-emailsent-capture": "Poslan Vam je podsjetnik kao e-pošta (tekst je prikazan dolje).",
        "passwordreset-emailerror-capture": "Napravljena je e-poruka za ponovno postavljanje zaporke (prikazana ispod), ali njeno slanje suradniku nije uspjelo: $1",
        "changeemail": "Promijeni e-mail adresu",
        "revdelete-selected-text": "{{PLURAL:$1|Označena izmjena|Označene izmjene}} stranice [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Označena inačica|Označene inačice}} datoteke [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Odabrani zapis u evidenciji|Odabrani zapisi u evidenciji}}:",
-       "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti vidljivi javno.",
+       "revdelete-text-text": "Izbrisane izmjene će i dalje biti vidljive u povijesti stranice, ali dijelovi sadržaja neće biti javno vidljivi.",
+       "revdelete-text-file": "Izbrisane inačice datoteke će i dalje biti vidljive u povijesti datoteke, ali neki dijelovi sadržaja neće biti javno vidljivi.",
        "logdelete-text": "Izbrisane izmjene i dalje će biti vidljive u evidencijama, ali dijelovi njihova sadržaja biti će nedostupni za javnost.",
        "revdelete-text-others": "Ostali administratori na projektu moći će pristupiti izbrisanom sadržaju i vratiti ga, osim ako nisu postavljena dodatna ograničenja.",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "showingresultsinrange": "Dolje {{PLURAL:$1|je prikazan '''$1''' rezultat|su prikazana '''$1''' rezultata|je prikazano '''$1''' rezultata}}, u rasponu od '''$2''' do '''$3'''.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Ne postoje rezultati koji se podudaraju s upitom.",
+       "search-nonefound-thiswiki": "Nema rezultata na ovim stranicama koji se podudaraju s upitom.",
        "powersearch-legend": "Napredno pretraživanje",
        "powersearch-ns": "Traži u imenskom prostoru:",
        "powersearch-togglelabel": "Uključi:",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne promjene, stare izmjene, i evidencije.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].",
        "savedprefs": "Vaše postavke su sačuvane.",
+       "savedrights": "Suradnička prava {{GENDER:suradnika $1|suradnice $1}} su spremljena.",
        "timezonelegend": "Vremenska zona:",
        "localtime": "Lokalno vrijeme:",
        "timezoneuseserverdefault": "Koristi postavke wikija ($1)",
        "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod sljedeće prijave.",
        "prefswarning-warning": "Napravili ste promjene u Vašim postavkama koje još nisu snimljene.\nAko napustite ovu stranicu bez pritiska na \"$1\", postavke neće biti ažurirane.",
        "prefs-tabs-navigation-hint": "Savjet: možete rabiti tipke sa strjelicama lijevo i desno za prebacivanje između kartica na popisu kartica.",
-       "email-address-validity-valid": "Adresa e-pošte pokazuje se ispravnom",
-       "email-address-validity-invalid": "Unesite valjanu adresu e-pošte",
        "userrights": "Upravljanje suradničkim pravima",
        "userrights-lookup-user": "Upravljaj suradničkim skupinama",
        "userrights-user-editname": "Unesite suradničko ime:",
        "upload-too-many-redirects": "URL je sadržavao previše preusmjeravanja",
        "upload-http-error": "HTTP-pogrješka: $1",
        "upload-copy-upload-invalid-domain": "Kopije postavljenih datoteka nisu dostupne s ove domene.",
+       "upload-dialog-title": "Postavi datoteku",
+       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-done": "Gotovo",
+       "upload-dialog-button-save": "Spremi",
+       "upload-dialog-button-upload": "Postavi",
+       "upload-form-label-select-file": "Odaberi datoteku",
+       "foreign-structured-upload-form-label-own-work": "Ovo je moje djelo",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Možete pokušati [[Special:Upload|postaviti datoteku na projektu {{SITENAME}}]], pod uvjetom da može biti tamo postavljena, sukladno pravilima projekta.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrđujem da posjedujem autorska prava ove datoteke i slažem se da je nepozivo postavljam na Zajednički poslužitelj pod licencijom  [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], i pristajem na [https://wikimediafoundation.org/wiki/Terms_of_Use Uvjete uporabe].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ako ne posjedujete autorska prava za ovu datoteku, ili je želite objaviti pod drugom licencijom, razmislite o uporabi [https://commons.wikimedia.org/wiki/Special:UploadWizard Čarobnjaka za postavljanje] na Zajedničkom poslužitelju.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Možete pokušati [[Special:Upload|postaviti datoteku na projektu {{SITENAME}}]], pod uvjetom da je dopušteno postavljanje ove datoteke, sukladno pravilima projekta.",
        "backend-fail-stream": "Ne mogu prikazati datoteku $1.",
        "backend-fail-backup": "Izrada sigurnosne kopije datoteke \"$1\" nije uspjela.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
        "mostrevisions": "Popis članaka po broju uređivanja",
        "prefixindex": "Sve stranice prema početku naslova",
        "prefixindex-namespace": "Sve stranice s predmetkom (imenski prostor $1)",
+       "prefixindex-strip": "Ne prikazuj predmetak u popisu",
        "shortpages": "Kratke stranice",
        "longpages": "Duge stranice",
        "deadendpages": "Slijepe ulice",
        "wlheader-showupdated": "Stranice koje su promijenjene od Vašeg posljednjeg posjeta prikazane su '''podebljano'''.",
        "wlnote": "Ovdje {{PLURAL:$1|je posljednja $1 promjena|su posljednje $1 promjene|je posljednjih $1 promjena}} u {{PLURAL:$2|posljednjem <strong>$2</strong> satu|posljednja '''$2''' sata|posljednjih <strong>$2</strong> sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
+       "watchlistall2": "sve",
+       "watchlist-hide": "Sakrij",
+       "wlshowtime": "Prikaži posljednjih:",
+       "wlshowhideminor": "manje promjene",
+       "wlshowhidebots": "botove",
+       "wlshowhideliu": "prijavljene suradnike",
+       "wlshowhideanons": "neprijavljene suradnike",
+       "wlshowhidepatr": "ophođena uređivanja",
+       "wlshowhidemine": "moje promjene",
        "watchlist-options": "Izbornik popisa praćenja",
        "watching": "Pratim...",
        "unwatching": "Prestajem pratiti...",
        "undeletecomment": "Razlog:",
        "undeletedrevisions": "{{PLURAL:$1|$1 inačica vraćena|$1 inačice vraćene|$1 inačica vraćeno}}",
        "undeletedrevisions-files": "{{PLURAL:$1|$1 promjena|$1 promjene|$1 promjena}} i {{PLURAL:$2|$2 datoteka vraćena|$2 datototeke vraćene|$2 datoteka vraćeno}}",
-       "undeletedfiles": "{{PLURAL:$1|$1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
+       "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
        "cannotundelete": "Vraćanje obrisane inačice nije uspjelo:\n$1",
        "undeletedpage": "'''$1 je vraćena'''\n\nPogledajte [[Special:Log/delete|evidenciju brisanja]] za zapise nedavnih brisanja i vraćanja.",
        "undelete-header": "Pogledaj [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.",
        "contributions": "Doprinosi {{GENDER:$1|suradnika|suradnice}}",
        "contributions-title": "Suradnički doprinosi za $1",
        "mycontris": "Doprinosi",
+       "anoncontribs": "Doprinosi",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Suradnički račun \"$1\" nije registriran.",
        "nocontribs": "Nema promjena koje udovoljavaju ovim kriterijima.",
        "movenosubpage": "Ova stranica nema podstranica.",
        "movereason": "Razlog:",
        "revertmove": "vrati",
-       "delete_and_move": "Izbriši i premjesti",
        "delete_and_move_text": "==Nužno brisanje==\n\nOdredišni članak \"[[:$1]]\" već postoji. Želite li ga obrisati da biste napravili mjesto za premještaj?",
        "delete_and_move_confirm": "Da, izbriši stranicu",
        "delete_and_move_reason": "obrisano kako bi se napravilo mjesto za premještaj, stari naziv \"[[$1]]\"",
        "patrol-log-page": "Evidencija pregledavanja promjena",
        "patrol-log-header": "Ovo su evidencije ophođenih izmjena.",
        "log-show-hide-patrol": "$1 evidenciju patroliranja",
-       "deletedrevision": "Izbrisana stara inačica $1",
+       "deletedrevision": "izbrisana stara inačica $1",
        "filedeleteerror-short": "Pogrješka u brisanju datoteke: $1",
        "filedeleteerror-long": "Dogodila se pogrješka prilikom brisanja datoteke:\n\n$1",
        "filedelete-missing": "Datoteka \"$1\" ne može biti obrisana, jer ne postoji.",
        "tags-tag": "Naziv oznake",
        "tags-display-header": "Izgled na popisima izmjena",
        "tags-description-header": "Puni opis značenja",
+       "tags-active-header": "Aktivno?",
        "tags-hitcount-header": "Označene izmjene",
        "tags-active-yes": "Da",
        "tags-active-no": "Ne",
        "feedback-bugornote": "Ako ste spremni detaljno opisati tehnički problem molimo [$1 prijavite \"bug\"].\nInače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će dodan na stranicu \"[$3 $2]\", zajedno s vašim suradničkim imenom i imenom internetskog preglednika koji rabite.",
        "feedback-cancel": "Odustani",
        "feedback-close": "Gotovo",
+       "feedback-external-bug-report-button": "Arhiviraj tehnički zadatak",
+       "feedback-dialog-title": "Slanje povratnih informacija",
+       "feedback-dialog-intro": "Da biste poslali povratnu informaciju, rabite jednostavan obrazac. Vaš će komentar biti dodan na stranici \"$1\" s Vašim suradničkim imenom.",
        "feedback-error-title": "Pogrješka",
-       "feedback-error1": "Pogreška: Neprepoznati rezultat od API funkcije",
-       "feedback-error2": "Pogreška: Uređivanje nije uspjelo",
-       "feedback-error3": "Pogreška: Nema odgovora od API funkcije",
+       "feedback-error1": "Pogreška: neprepoznati rezultat API funkcije",
+       "feedback-error2": "Pogreška: uređivanje nije uspjelo",
+       "feedback-error3": "Pogreška: nema odgovora API funkcije",
+       "feedback-error4": "Pogreška: nije moguće objaviti povratnu informaciju",
        "feedback-message": "Poruka:",
        "feedback-subject": "Tema:",
        "feedback-submit": "Predaj",
+       "feedback-terms": "Jasno mi je da moje ''user agent'' informacije sadrže točne informacije o mom pregledniku i operativnom sustavu te da će biti javno dostupne zajedno s mojom povratnom informacijom.",
+       "feedback-termsofuse": "Slažem se da povratne informacije objavljujem u skladu s Uvjetima uporabe.",
        "feedback-thanks": "Hvala! Vaš odgovor je snimljen na stranicu \"[$2 $1]\".",
        "feedback-thanks-title": "Hvala!",
        "searchsuggest-search": "Traži",
        "special-characters-group-khmer": "kmerski",
        "mw-widgets-dateinput-placeholder-day": "GGGG-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "GGGG-MM",
+       "mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
        "mw-widgets-titleinput-description-redirect": "preusmjeravanje na $1"
 }
index 0c8cc3a..8743e54 100644 (file)
        "nstab-template": "Předłoha",
        "nstab-help": "Pomoc",
        "nstab-category": "Kategorija",
+       "mainpage-nstab": "Hłowna strona",
        "nosuchaction": "Žana tajka akcija",
        "nosuchactiontext": "Akcija, kotruž URL podawa, je njepłaćiwa.\nSy so snano při zapodaću URL zapisał abo sy wopačnemu wotkazej slědował.\nTo móhło tež programowanski zmylk w {{GRAMMAR:lokatiw|{{SITENAME}}}} być.",
        "nosuchspecialpage": "Tuta specialna strona njeeksistuje.",
        "createaccountreason": "Přičina:",
        "createacct-reason": "Přičina",
        "createacct-reason-ph": "Čehodla załožuješ druhe konto?",
-       "createacct-captcha": "Wěstotna kontrola",
-       "createacct-imgcaptcha-ph": "Zapodaj tekst, kotryž deleka widźiš",
        "createacct-submit": "Twoje konto załožić",
-       "createacct-another-submit": "Dalše konto załožić",
-       "createacct-benefit-heading": "{{SITENAME}} je so wot ludźi kaž ty wutworił.",
+       "createacct-another-submit": "Konto załožić",
+       "createacct-benefit-heading": "{{SITENAME}} je so wot ludźi kaž tebje wutworiła.",
        "createacct-benefit-body1": "{{PLURAL:$1|změna|změnje|změny|změnow}}",
        "createacct-benefit-body2": "{{PLURAL:$1|strona|stronje|strony|stronow}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|aktiwny sobuskutkowar|aktiwnej sobuskutkowarjej|aktiwni sobuskutkowarjo}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|aktiwny sobuskutkowar|aktiwnej sobuskutkowarjej|aktiwni sobuskutkowarjo|aktiwnych sobuskutkowarjow}}",
        "badretype": "Hesle, kotrejž sy zapodał, so njekryjetej.",
        "userexists": "Wužiwarske mjeno, kotrež sy zapodał, so hižo wužiwa.\nProšu wubjer druhe mjeno.",
        "loginerror": "Zmylk při přizjewjenju",
        "passwordreset-emailtext-ip": "Něchtó (najskerje ty, z IP-adresu $1) je anulowanje hesła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} požadał ($4).  {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane}}:\n\n$2\n\n{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.\nTy měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.",
        "passwordreset-emailtext-user": "Wužiwar $1 na {{GRAMMAR:lokatiw|{{SITENAME}}}} je anulowanje twojeho hesła za {{GRAMMAR:akuzatiw|{{SITENAME}}}} požadał ($4).  {{PLURAL:$3|Slědowace wužiwarske konto je|Slědowacej wužiwarskej konće stej|Slědowace wužiwarske konta su}} z tutej e-mejlowej adresu {{PLURAL:$3|zwjazane|zwjazanej|zwjazane}}:\n\n$2\n\n{{PLURAL:$3|Tute nachwilne hesło spadnje|Tutej nachwilnej hesle spadnjetej|Tute nachwilne hesła spadnu}} za {{PLURAL:$5|jedyn dźeń|$5 dnjej|$5 dny|$5 dnjow}}.\nTy měł so nětko přizjewić a nowe hesło wubrać. Jeli něchtó druhi je tute naprašowanje pósłał, abo jeli sy so zaso na prěnjotne hesło dopomnił a wjace nochceš jo změnić, móžeš tutu zdźělenku ignorować a swoje stare hesło dale wužiwać.",
        "passwordreset-emailelement": "Wužiwarske mjeno: \n$1\n\nNachwilne hesło: \n$2",
-       "passwordreset-emailsent": "E-mejl za anulowanje hesło je so pósłała.",
+       "passwordreset-emailsentemail": "E-mejl za anulowanje hesło je so pósłała.",
        "passwordreset-emailsent-capture": "E-mejl za anulowanje hesła je so pósłała, kotraž so deleka pokazuje.",
        "passwordreset-emailerror-capture": "E-mejl za anulowanje hesła je so wutworiła, kotraž so deleka pokazuje, ale słanje {{GENDER:$2|wužiwarjej|wužiwarce}} je so njeporadźiło: $1",
-       "changeemail": "E-mejlowu adresu změnić",
+       "changeemail": "E-mejlowu adresu změnić abo wotstronić",
        "changeemail-header": "Kontowu e-mejlowu adresu změnić",
        "changeemail-no-info": "Dyrbiš so přizjewić, zo by direktny přistup na tutu stronu měł.",
        "changeemail-oldemail": "Aktualna e-mejlowa adresa:",
        "shown-title": "$1 {{PLURAL:$1|wuslědk|wuslědkaj|wuslědki|wuslědkow}} na stronu pokazać",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) pokazać",
        "searchmenu-exists": "'''Je strona z mjenom \"[[$1]]\" na tutym wikiju'''",
-       "searchmenu-new": "<strong>Wutwor stronu \"[[:$1]]\" na tutym wikiju!</strong> {{PLURAL:$2|0=|Hlej tež stronu namakanu z twojim pytanjom.|Hlej tež namakane pytanske wuslědki.}}",
+       "searchmenu-new": "<strong>Wutwor stronu \"[[:$1]]\" na tutym wikiju!</strong> {{PLURAL:$2|0=|Hlej tež stronu namakanu z twojim pytanjom.|Dźiwaj tež na namakane pytanske wuslědki.}}",
        "searchprofile-articles": "Wobsahowe strony",
        "searchprofile-images": "Multimedia",
        "searchprofile-everything": "Wšitko",
        "prefs-diffs": "Rozdźěle",
        "prefs-help-prefershttps": "Tute nastajenje so po twojim přichodnym přizjewjenju wuskutkuje.",
        "prefs-tabs-navigation-hint": "Tip: Móžeš lěwy a prawy šipk wužiwać, zo byšće mjez rajtarkami w lisćinje rajtarkow nawigował.",
-       "email-address-validity-valid": "Zda so, zo e-mejlowa adresa je płaćiwa",
-       "email-address-validity-invalid": "Zapodaj płaćiwu e-mejlowu adresu",
        "userrights": "Zrjadowanje wužiwarskich prawow",
        "userrights-lookup-user": "Wužiwarske skupiny zrjadować",
        "userrights-user-editname": "Wužiwarske mjeno:",
        "rcshowhidemine": "moje změny $1",
        "rcshowhidemine-show": "pokazać",
        "rcshowhidemine-hide": "schować",
+       "rcshowhidecategorization-show": "Pokazać",
+       "rcshowhidecategorization-hide": "Schować",
        "rclinks": "Pokazuj poslednje $1 změny poslednich $2 dnjow.<br />$3",
        "diff": "rozdźěl",
        "hist": "wersije",
        "wlheader-showupdated": "Strony, kotrež su so po twojim poslednim wopyće změnili, so '''tučne''' pokazuja.",
        "wlnote": "Deleka {{PLURAL:$1|je poslednja změna|stej poslednjej <strong>$1</strong> změnje|su poslednje <strong>$1</strong> změny|je poslednich <strong>$1</strong> změnow}} za {{PLURAL:$2|poslednju hodźinu|poslednje <strong>$2</strong> hodźinje|poslednje <strong>$2</strong> hodźiny|poslednich <strong>$2</strong> hodźin}}, staw : $3, $4.",
        "wlshowlast": "Změny zańdźenych $1 hodźin, $2 dnjow, pokazać",
+       "watchlistall2": "wšě",
+       "wlshowtime": "Pokazaj změny zašłych",
        "watchlist-options": "Opcije wobkedźbowankow",
        "watching": "Wobkedźbuju…",
        "unwatching": "Njewobkedźbuju…",
        "protect-locked-dblock": "Datowa banka je zawrjena, tohodla njemóžeš škit strony změnić. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
        "protect-locked-access": "Nimaš trěbne prawa, zo by škit strony změnił. Tu widźiš aktualne škitne nastajenja za stronu'''„$1“:'''",
        "protect-cascadeon": "Tuta strona je tuchwilu škitana, dokelž je w {{PLURAL:$1|slědowacej stronje|slědowacych stronach}} zapřijata, {{PLURAL:$1|kotraž je|kotrež su}} přez kaskadowu opciju {{PLURAL:$1|škitana|škitane}}. Změny na škitnym schodźenku tuteje strony njebudu kaskadowy škit wobwliwować.",
-       "protect-default": "Wšěch wužiwarjow dowolić",
+       "protect-default": "Wšěm wužiwarjam dowolić",
        "protect-fallback": "Jenož wužiwarjow z prawom \"$1\" dowolić",
-       "protect-level-autoconfirmed": "Jenož awtomatisce wobkrućenych wužiwarjow dowolić",
-       "protect-level-sysop": "Jenož administratorow dowolić",
+       "protect-level-autoconfirmed": "Jenož awtomatisce wobkrućenym wužiwarjam dowolić",
+       "protect-level-sysop": "Jenož administratoram dowolić",
        "protect-summary-cascade": "kaskadowacy",
        "protect-expiring": "spadnje $1 (UTC)",
        "protect-expiring-local": "płaćiwy hač do $1",
        "movenosubpage": "Tuta strona podstrony nima.",
        "movereason": "Přičina:",
        "revertmove": "wróćo přesunyć",
-       "delete_and_move": "wušmórnyć a přesunyć",
        "delete_and_move_text": "== Wušmórnjenje trěbne ==\n\nCilowa strona „[[:$1]]” hižo eksistuje. Chceš ju wušmórnyć, zo by so přesunjenje zmóžniło?",
        "delete_and_move_confirm": "Haj, stronu wušmórnyć.",
        "delete_and_move_reason": "Wušmórnjena, zo by so rum za přesunjenje z \"[[$1]]\" wutworił.",
        "tooltip-ca-nstab-main": "stronu wobhladać",
        "tooltip-ca-nstab-user": "wužiwarsku stronu wobhladać",
        "tooltip-ca-nstab-media": "datajowu stronu wobhladać",
-       "tooltip-ca-nstab-special": "To je specialna strona. Njemóžeš ju wobdźěłać.",
+       "tooltip-ca-nstab-special": "To je specialna strona, kotruž wobdźěłać njemóžeš.",
        "tooltip-ca-nstab-project": "projektowu stronu wobhladać",
        "tooltip-ca-nstab-image": "Datajowu stronu pokazać",
        "tooltip-ca-nstab-mediawiki": "systemowu zdźělenku wobhladać",
index c81c306..0cbe908 100644 (file)
                        "Grin",
                        "Macofe",
                        "Nyuszika7H",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "JulesWinnfield-hu"
                ]
        },
        "tog-underline": "Hivatkozások aláhúzása:",
        "tog-hideminor": "Apró változtatások elrejtése a friss változtatások lapon",
        "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-hidecategorization": "Lapok kategorizálásának elrejtése",
        "tog-extendwatchlist": "A figyelőlistán az összes változtatás látszódjon, ne csak az utolsó",
        "tog-usenewrc": "Szerkesztések csoportosítása oldal szerint a friss változtatásokban és a figyelőlistán",
        "tog-numberheadings": "Fejezetcímek automatikus számozása",
@@ -76,6 +78,7 @@
        "tog-watchlisthideliu": "Bejelentkezett szerkesztők módosításainak elrejtése a figyelőlistáról",
        "tog-watchlisthideanons": "Névtelen szerkesztések elrejtése",
        "tog-watchlisthidepatrolled": "Az ellenőrzött szerkesztések elrejtése",
+       "tog-watchlisthidecategorization": "Lapok kategorizálásának elrejtése",
        "tog-ccmeonemails": "A másoknak küldött e-mailjeimről kapjak másolatot",
        "tog-diffonly": "Ne mutassa a lap tartalmát a lapváltozatok közötti eltérések megtekintésekor",
        "tog-showhiddencats": "Rejtett kategóriák megjelenítése",
        "nstab-template": "Sablon",
        "nstab-help": "Segítség",
        "nstab-category": "Kategória",
+       "mainpage-nstab": "Kezdőlap",
        "nosuchaction": "Nincs ilyen művelet",
        "nosuchactiontext": "Az URL-ben megadott művelet érvénytelen.\nValószínűleg elgépelted vagy hibás hivatkozásra kattintottál.\nAz is előfordulhat, hogy a(z) {{SITENAME}} wiki szoftverében hiba található.",
        "nosuchspecialpage": "Nem létezik ilyen speciális lap",
        "createaccountreason": "Indoklás:",
        "createacct-reason": "Indoklás",
        "createacct-reason-ph": "Miért hozol létre egy másik fiókot",
-       "createacct-captcha": "Biztonsági ellenőrzés",
-       "createacct-imgcaptcha-ph": "Írd be a szöveget, amit fent látsz",
        "createacct-submit": "Felhasználói fiók létrehozása",
-       "createacct-another-submit": "Újabb felhasználói fiók létrehozása",
+       "createacct-another-submit": "Fiók létrehozása",
        "createacct-benefit-heading": "A(z) {{SITENAME}}-t hozzád hasonló emberek készítik.",
        "createacct-benefit-body1": "{{PLURAL:$1|szerkesztés|szerkesztés}}",
        "createacct-benefit-body2": "{{PLURAL:$1|lap|lap}}",
        "passwordreset-emailtext-ip": "Valaki (vélhetően Te, a $1 IP-címről) a jelszavad visszaállítását kérte a {{SITENAME}} ($4) oldalon felvett {{PLURAL:$3|fiókban|fiókokban}}. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:\n\n$2\n\n{{PLURAL:$3|Ez az ideiglenes jelszó|Ezek az ideiglenes jelszavak}} $5 nap múlva {{PLURAL:$3|jár|járnak}} le. Jelentkezz be, és cseréld le a jelszavadat. Ha valaki más kérte az emlékeztetőt, vagy eszedbe jutott a régi jelszó, és nem akarod lecserélni a jelszavadat, hagyd figyelmen kívül ezt az üzenetet, és használd a régi jelszavadat.",
        "passwordreset-emailtext-user": "$1 felhasználó jelszó-visszaállítást kért a {{SITENAME}} ($4) oldalon felvett {{PLURAL:$3|fiókban|fiókokban}}. A következő felhasználói {{PLURAL:$3|fiók van|fiókok vannak}} hozzárendelve ehhez az e-mail címhez:\n\n$2\n\n{{PLURAL:$3|Ez az ideiglenes jelszó|Ezek az ideiglenes jelszavak}} $5 nap múlva {{PLURAL:$3|jár|járnak}} le. Jelentkezz be, és cseréld le a jelszavadat. Ha valaki más kérte az emlékeztetőt, vagy eszedbe jutott a régi jelszó, és nem akarod lecserélni a jelszavadat, hagyd figyelmen kívül ezt az üzenetet, és használd a régi jelszavadat.",
        "passwordreset-emailelement": "Felhasználónév: \n$1\n\nIdeiglenes jelszó: \n$2",
-       "passwordreset-emailsent": "Jelszó-visszaállító e-mail elküldve.",
+       "passwordreset-emailsentemail": "Ha ez egy regisztrált e-mail-cím a fiókodhoz, egy jelszó-visszaállító e-mailt küldünk.",
        "passwordreset-emailsent-capture": "Az alább látható jelszó-visszaállító e-mail lett elküldve.",
        "passwordreset-emailerror-capture": "A jelszó-visszaállító e-mail generálása megtörtént, mint az alább látszik, de elküldése a {{GENDER:$2|szerkesztőnek}} nem sikerült: $1",
-       "changeemail": "E-mail cím megváltoztatása",
+       "changeemail": "E-mail cím megváltoztatása vagy eltávolítása",
        "changeemail-header": "A fiókhoz tartozó e-mail cím megváltoztatása",
        "changeemail-no-info": "A lap közvetlen eléréséhez be kell jelentkezned.",
        "changeemail-oldemail": "Jelenlegi e-mail cím:",
        "missingsummary": "'''Emlékeztető:''' Nem adtál meg szerkesztési összefoglalót. Ha összefoglaló nélkül akarod elküldeni a szöveget, kattints újra a mentésre.",
        "selfredirect": "<strong>Figyelem:</strong> Az lapot önmagára készült átirányítani. Lehet, hogy rossz célt adtál meg, vagy rossz oldalt szerkesztesz. Ha ismét a {{int:savearticle}} gombra kattintasz, akkor az átirányítás mégis létrejön.",
        "missingcommenttext": "Kérjük, írj összefoglalót a szerkesztésedhez.",
-       "missingcommentheader": "'''Emlékeztető:''' Nem adtad meg a megjegyzés tárgyát vagy címét.\nHa ismét a „{{int:savearticle}}” gombra kattintasz, akkor a szerkesztésed nélküle lesz elmentve.",
+       "missingcommentheader": "<strong>Emlékeztető:</strong> Nem adtad meg a megjegyzés tárgyát.\nHa ismét a „{{int:savearticle}}” gombra kattintasz, akkor a szerkesztésed nélküle lesz elmentve.",
        "summary-preview": "A szerkesztési összefoglaló előnézete:",
        "subject-preview": "A téma/főcím előnézete:",
        "previewerrortext": "Hiba történt a változások előnézete megjelenítése során.",
        "mergehistory-go": "Egyesíthető szerkesztések mutatása",
        "mergehistory-submit": "Változatok egyesítése",
        "mergehistory-empty": "Nincs egyesíthető változás.",
-       "mergehistory-done": "$1 {{PLURAL:$3|egy|$3}} változata sikeresen egyesítve lett a(z) [[:$2]] lappal.",
+       "mergehistory-done": "$1 $3 változata sikeresen egyesítve lett a(z) [[:$2]] lappal.",
        "mergehistory-fail": "Nem sikerült a laptörténetek egyesítése. Kérlek, ellenőrizd újra az oldalt és a megadott időparamétereket.",
        "mergehistory-fail-toobig": "Nem lehetséges a laptörténetek egyesítése, mivel több mint $1 {{PLURAL:$1|változást}} kellene áthelyezni.",
        "mergehistory-no-source": "Nem létezik forráslap $1 néven.",
        "prefs-watchlist-token": "A figyelőlista kulcsa:",
        "prefs-misc": "Egyéb",
        "prefs-resetpass": "Jelszó megváltoztatása",
-       "prefs-changeemail": "e-mail cím megváltoztatása",
+       "prefs-changeemail": "E-mail cím megváltoztatása vagy eltávolítása",
        "prefs-setemail": "e-mail cím megadása",
        "prefs-email": "Levelezés",
        "prefs-rendering": "Lapok megjelenítése",
        "rows": "Sor",
        "columns": "Oszlop",
        "searchresultshead": "Keresés",
-       "stub-threshold": "A hivatkozások <a href=\"#\" class=\"stub\">csonkként</a> történő formázásának határa (bájtban):",
+       "stub-threshold": "A hivatkozások csonkként történő formázásának határa ($1):",
+       "stub-threshold-sample-link": "minta",
        "stub-threshold-disabled": "Kikapcsolva",
        "recentchangesdays": "A friss változtatásokban mutatott napok száma:",
        "recentchangesdays-max": "(maximum {{PLURAL:$1|egy|$1}} nap)",
        "prefs-help-prefershttps": "A beállítás a legközelebbi belépés után lép érvénybe.",
        "prefswarning-warning": "A beállításaidban tett módosítások nincsenek elmentve. Ha a $1 megnyomása nélkül hagyod el az oldalt, a beállításaid nem módosulnak.",
        "prefs-tabs-navigation-hint": "Tipp: a jobbra-balra nyilakkal navigálhatsz a fülek között.",
-       "email-address-validity-valid": "Az e-mail cím érvényesnek tűnik",
-       "email-address-validity-invalid": "Írj be egy érvényes e-mail címet",
        "userrights": "Szerkesztői jogok beállítása",
        "userrights-lookup-user": "Szerkesztőcsoportok beállítása",
        "userrights-user-editname": "Add meg a szerkesztő nevét:",
        "statistics-header-edits": "Szerkesztési statisztika",
        "statistics-header-users": "Szerkesztői statisztika",
        "statistics-header-hooks": "További statisztikák",
-       "statistics-articles": "Tartalommal rendelkező lapok",
+       "statistics-articles": "Tartalmi lapok",
        "statistics-pages": "Lapok száma",
        "statistics-pages-desc": "A wikiben található összes lap, beleértve a vitalapokat és az átirányításokat is",
        "statistics-files": "Feltöltött fájlok",
        "wlheader-showupdated": "Azok a lapok, amelyek megváltoztak, mióta utoljára megnézted őket, '''vastagítva''' láthatók.",
        "wlnote": "Alább {{PLURAL:$1|az utolsó változás|az utolsó <strong>$1</strong> változás}} látható az elmúlt {{PLURAL:$2|órában|<strong>$2</strong> órában}}, $3 $4-kor.",
        "wlshowlast": "Az elmúlt $1 órában | $2 napon történt változtatások legyenek láthatóak",
+       "watchlistall2": "bármikor",
+       "watchlist-hide": "Elrejtés",
        "watchlist-options": "A figyelőlista beállításai",
        "watching": "Figyelés...",
        "unwatching": "Figyelés befejezése...",
        "contributions": "{{GENDER:$1|Szerkesztő}} közreműködései",
        "contributions-title": "$1 közreműködései",
        "mycontris": "Közreműködések",
+       "anoncontribs": "Közreműködések",
        "contribsub2": "$1 ($2)",
        "contributions-userdoesnotexist": "Nincs regisztrálva „$1” szerkesztői azonosító.",
        "nocontribs": "Nem található a feltételeknek megfelelő változtatás.",
        "move-page-legend": "Lap átnevezése",
        "movepagetext": "Az alábbi űrlap használatával nevezhetsz át egy lapot, és helyezheted át teljes laptörténetét az új nevére.\nA régi cím az új címre való átirányítás lesz.\nFrissítheted a régi címre mutató átirányításokat, hogy azok automatikusan a megfelelő címre mutassanak;\nha nem teszed, ellenőrizd a [[Special:DoubleRedirects|dupla]] vagy [[Special:BrokenRedirects|hibás átirányításokat]].\nNeked kell biztosítanod, hogy a linkek továbbra is oda mutassanak, ahová mutatniuk kell.\n\nA lap '''nem''' nevezhető át, ha már van egy ugyanilyen című lap, hacsak nem üres vagy átirányítás, és nincs laptörténete.\nEz azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, és nem tudsz létező lapot véletlenül felülírni.\n\n'''FIGYELEM!'''\nNépszerű oldalak esetén ez drasztikus és nem várt változtatás lehet;\ngyőződj meg a folytatás előtt arról, hogy tisztában vagy a következményekkel.",
        "movepagetext-noredirectfixer": "Az alábbi űrlap használatával nevezhetsz át egy lapot, és helyezheted át teljes laptörténetét az új nevére.\nA régi cím az új címre való átirányítás lesz.\nEllenőrizd a [[Special:DoubleRedirects|dupla]] és a [[Special:BrokenRedirects|hibás átirányításoknál]], hogy a linkek továbbra is oda mutatnak, ahová mutatniuk kell.\n\nA lap '''nem''' nevezhető át, ha már van egy ugyanilyen című lap, hacsak nem üres, vagy átirányítás, aminek nincs laptörténete.\nEz azt jelenti, hogy vissza tudsz nevezni egy tévedésből átnevezett lapot, de nem tudsz egy már létező lapot véletlenül felülírni.\n\n'''Figyelem!'''\nNépszerű oldalak esetén ez drasztikus és nem várt változtatás lehet;\ngyőződj meg a folytatás előtt arról, hogy tisztában vagy-e a következményekkel.",
-       "movepagetalktext": "A laphoz tartozó vitalap automatikusan átneveződik ezzel a lappal együtt, <strong>kivéve, ha:</strong>\n*már létezik egy nem üres vitalap az új helyen,\n*nem jelölöd be a lenti pipát.\n\nEzen esetekben a vitalapot külön, kézzel kell átnevezned vagy egyesítened a kívánságaid szerint.",
+       "movepagetalktext": "Ha bejelölöd ezt a pipát, akkor a laphoz tartozó vitalap automatikusan átneveződik az új címre, kivéve ha már létezik egy nem üres vitalap az új helyen.\n\nEbben az esetben a vitalapot külön, kézzel kell átnevezned vagy egyesítened a kívánságaid szerint.",
        "moveuserpage-warning": "'''Figyelem:''' Egy felhasználólapot készülsz átmozgatni. Csak a lap lesz átmozgatva, a szerkesztő ''nem'' lesz átnevezve.",
        "movecategorypage-warning": "<strong>Figyelmeztetés:</strong> Éppen egy kategórialapot készülsz átnevezni. Figyelj arra, hogy csak a lap lesz átnevezve, az idekategorizált lapok <em>nem</em> lesznek átkategorizálva.",
        "movenologintext": "Ahhoz, hogy átnevezhess egy lapot, [[Special:UserLogin|be kell lépned]].",
        "movenosubpage": "Ez a lap nem rendelkezik allapokkal.",
        "movereason": "Indoklás:",
        "revertmove": "visszaállítás",
-       "delete_and_move": "Törlés és átnevezés",
        "delete_and_move_text": "== Törlés szükséges ==\n\nAz átnevezés céljaként megadott „[[:$1]]” szócikk már létezik.  Ha az átnevezést végre akarod hajtani, ezt a lapot törölni kell.  Valóban ezt szeretnéd?",
        "delete_and_move_confirm": "Igen, töröld a lapot",
        "delete_and_move_reason": "átnevezendő lap célneve felszabadítva „[[$1]]” számára",
        "tooltip-pt-preferences": "A beállításaid",
        "tooltip-pt-watchlist": "Az általad figyelemmel kísért oldalak utolsó változtatásai",
        "tooltip-pt-mycontris": "A közreműködéseid listája",
+       "tooltip-pt-anoncontribs": "Erről az IP-címről végrehajtott szerkesztések listája",
        "tooltip-pt-login": "Bejelentkezni javasolt, de nem kötelező.",
        "tooltip-pt-logout": "Kijelentkezés",
        "tooltip-pt-createaccount": "Arra bíztatunk, hogy hozz létre egy fiókot, és jelentkezz be, azonban ez nem kötelező",
        "svg-long-error": "Érvénytelen SVG-fájl: $1",
        "show-big-image": "Eredeti fájl",
        "show-big-image-preview": "Az előnézet mérete: $1",
+       "show-big-image-preview-differ": "Ennek a(z) $2 fájlnak ezen $3 formátumú előnézete: $1.",
        "show-big-image-other": "További {{PLURAL:$2|felbontás|felbontások}}: $1.",
        "show-big-image-size": "$1 × $2 képpont",
        "file-info-gif-looped": "ismétlődik",
        "htmlform-cloner-required": "Legalább egy érték szükséges.",
        "htmlform-title-badnamespace": "[[:$1]] nem a(z) „{{ns:$2}}” névtérben található.",
        "htmlform-title-not-creatable": "„$1” nem egy létrehozható lapcím",
-       "htmlform-title-not-exists": "[[:$1]] nem létezik.",
+       "htmlform-title-not-exists": "$1 nem létezik.",
        "htmlform-user-not-exists": "<strong>$1</strong> nem létezik.",
        "htmlform-user-not-valid": "<strong>$1</strong> nem egy érvényes felhasználónév.",
        "sqlite-has-fts": "$1 teljes szöveges keresés támogatással",
        "logentry-newusers-create2": "$1 létrehozta $3 felhasználói fiókját",
        "logentry-newusers-byemail": "Szerkesztői lap $3 néven létrehozva $1 által, jelszó kiküldve emailben.",
        "logentry-newusers-autocreate": "$1 felhasználói fiók automatikusan létrehozva",
+       "logentry-protect-protect": "$1 {{GENDER:$2|levédte}} a(z) $3 lapot $4",
        "logentry-rights-rights": "$1 megváltoztatta $3 csoporttagságát erről: $4 erre: $5",
        "logentry-rights-rights-legacy": "$1 megváltoztatta $3 csoporttagságát",
        "logentry-rights-autopromote": "$1 automatikusan előléptetve erről: $4 erre: $5",
index bd773d0..11c5b77 100644 (file)
        "nstab-template": "Կաղապար",
        "nstab-help": "Օգնության էջ",
        "nstab-category": "Կատեգորիա",
+       "mainpage-nstab": "Գլխավոր էջ",
        "nosuchaction": "Նման գործողություն չկա",
        "nosuchactiontext": "URL-ում նշված գործողությունը սխալ է։\nՀնարավոր է դուք վրիպակ եք թույլ տվել URL-ի մուտքագրման ժամանակ կամ հետևել եք սխալ հղմամբ։\nՍա կարող է նաև լինել {{SITENAME}} նախագծում օգտագործվող ծրագրի սխալ։",
        "nosuchspecialpage": "Նման սպասարկող էջ չկա",
        "createaccountreason": "Պատճառը՝",
        "createacct-reason": "Պատճառ",
        "createacct-reason-ph": "Ինչո՞ւ եք փորձում ստեղծել մեկ այլ հաշիվ",
-       "createacct-captcha": "Անվտանգության ստուգում",
-       "createacct-imgcaptcha-ph": "Մուտքագրեք վերը բերված գրվածքը",
        "createacct-submit": "Ստեղծել ձեր հաշիվը",
        "createacct-another-submit": "Ստեղծել մեկ այլ հաշիվ",
        "createacct-benefit-heading": "{{SITENAME}}՝ ստեղծվում է ձեր պես մարդկանց կողմից։",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|քննարկում]]) մասնակցի հաշիվը ստեղծված է։",
        "createaccount-title": "{{SITENAME}}. մասնակցային հաշվի ստեղծում",
        "createaccount-text": "Ինչ-որ մեկը ստեղծել է «$2» անվանմամբ մասնակցային հաշիվ «$3» գաղտնաբառով {{SITENAME}} ($4) նախագծում՝ նշելով ձեր էլ-հասցեն։ Ձեզ անհրաժեշտ է մտնել համակարգ և փոխել գաղտնաբառը։\n\nԿարող եք անտեսել այս հաղորդագրությունը, եթե հաշիվը ստեղծվել է սխալմամբ։",
-       "login-throttled": "Դուք կատարել եք չափից շատ մուտքի փորձ։\nԽնդրում ենք սպասել որոշ ժամանակ կրկին փորձելուց առաջ։",
+       "login-throttled": "Դուք կատարել եք չափից շատ մուտքի փորձ։\nԽնդրում ենք սպասել $1 կրկին փորձելուց առաջ։",
        "loginlanguagelabel": "Լեզու՝ $1",
        "pt-login": "Մուտք գործել",
        "pt-login-button": "Մտնել",
        "passwordreset-email": "Էլ-փոստի հասցեն՝",
        "passwordreset-emailtitle": "{{SITENAME}} հաշվի մանրամասները",
        "passwordreset-emailelement": "Մասնակցային անունը՝ \n$1\n\nԺամանակավոր գաղտնաբառը՝ \n$2",
-       "passwordreset-emailsent": "Ուղարկվեց հիշեցնող էլ․ նամակ։",
+       "passwordreset-emailsentemail": "Ուղարկվեց հիշեցնող էլ․ նամակ։",
        "passwordreset-emailsent-capture": "Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։",
        "passwordreset-emailerror-capture": "Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։ Սակայն մասնակցին ուղարկելը չհաջողվեց․",
        "changeemail": "Փոխել էլ. հասցեն",
        "prefs-displayrc": "Ցուցադրման ընտրանքներ",
        "prefs-displaywatchlist": "Ցուցադրման ընտրանքներ",
        "prefs-diffs": "Տարբերություններ",
-       "email-address-validity-valid": "Էլ. հասցեն վավերական է",
-       "email-address-validity-invalid": "Մուտքագրեք վավերական էլ. հասցե",
        "userrights": "Մասնակիցների իրավունքների կառավարում",
        "userrights-lookup-user": "Մասնակիցների խմբերի կառավարում",
        "userrights-user-editname": "Մուտքագրեք մասնակցի անուն.",
        "recentchanges-label-plusminus": "Էջի չափսը փոփոխվեց այսքան բայթով",
        "recentchanges-legend-heading": "'''Լեգենդ՝'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (տես նաև՝  [[Special:NewPages|նոր էջերի ցանկ]])",
+       "recentchanges-submit": "Ցույց տալ",
        "rcnotefrom": "Ստորև բերված են փոփոխությունները սկսած՝ '''$2''' (մինչև՝ '''$1''')։",
        "rclistfrom": "Ցույց տալ նոր փոփոխությունները սկսած $3 $2",
        "rcshowhideminor": "$1 չնչին խմբագրումները",
        "mostinterwikis": "Ամենաշատ միջլեզվային հղումներով էջեր",
        "mostrevisions": "Ամենաշատ վերափոխումներով հոդվածներ",
        "prefixindex": "Բոլոր էջերը ըստ սկզբնատառի",
+       "prefixindex-submit": "Ցույց տալ",
        "shortpages": "Կարճ էջեր",
        "longpages": "Երկար էջեր",
        "deadendpages": "Հղումներ չպարունակող էջեր",
        "deadendpagestext": "Հետևյալ էջերը չունեն հղումներ վիքիի այլ էջերին։",
        "protectedpages": "Պաշտպանված էջեր",
        "protectedpagesempty": "Ներկայումս չկան պաշտպանված էջեր նշված պարամետրերով։",
+       "protectedpages-submit": "Ցույց տալ էջերը",
        "protectedtitles": "Պաշտպանված անվանումներ",
+       "protectedtitles-submit": "Ցույց տալ վերնագրերը",
        "listusers": "Մասնակիցների ցանկ",
        "usereditcount": " \n$1 {{PLURAL:$1|խմբագրում|խմբագրումներ}}",
        "usercreated": "{{GENDER:$3|Ստեղծվել է}} $1-ին, ժամը $2-ին",
        "listusers-blocked": "(արգելափակված)",
        "activeusers": "Ակտիվ մասնակիցների ցանկ",
        "activeusers-noresult": "Այդպիսի մասնակիցներ չեն գտնվել։",
+       "activeusers-submit": "Ցույց տալ ակտիվ մասնակիցներին",
        "listgrouprights-members": "(անդամների ցանկ)",
        "listgrouprights-addgroup": "Ավելացնեել {{PLURAL:$2|խումբ|խմբեր}}՝  $1",
        "mailnologin": "Ուղարկման հասցե չկա",
        "wlheader-showupdated": "Էջերը, որոնք փոփոխվել են ձեր դրանց վերջին այցից հետո բերված են '''թավատառ'''։",
        "wlnote": "Ստորև բերված {{PLURAL:$1|է վերջին փոփոխությունը|են վերջին '''$1''' փոփոխությունները}} վերջին <strong>$2</strong> ժամվա ընթացքում։",
        "wlshowlast": "Ցուցադրել վերջին $1 ժամերը $2 օրերը",
+       "watchlistall2": "բոլոր",
+       "watchlist-submit": "Ցույց տալ",
        "watchlist-options": "Հսկացանկի նախընտրություններ",
        "watching": "Հսկվում է...",
        "unwatching": "Հանվում է հսկումից...",
        "whatlinkshere-hidelinks": "$1 հղում",
        "whatlinkshere-hideimages": "$1 նիշքային հղումներ",
        "whatlinkshere-filters": "Զտիչներ",
+       "whatlinkshere-submit": "Գնալ առաջ",
        "autoblockid": "Ավտոմատ արգելափակում #$1",
        "block": "Արգելափակել մասնակցին",
        "unblock": "Արգելափակումից հանել",
        "move-page": "$1 — տեղափոխում",
        "move-page-legend": "Տեղափոխել էջը",
        "movepagetext": "Ստորև բերված ձևով կարող եք վերանվանել էջը՝ միաժամանակ տեղափոխելով նրա պատմությունը նոր անվանմանը։\nՀին էջը կդառնա վերահղման էջ դեպի նոր անվանումը։\nԴուք կարող եք ավտոմատիկ կերպով թարմացնել հին անվանմանը տանող վերահղումները։\nԵթե ընտրեք չանել դա, ապա խնդրում ենք ստուգել [[Special:DoubleRedirects|կրկնակի]] կամ [[Special:BrokenRedirects|չգործող վերահղումների]] առկայությունը։\nԴուք պատասխանատու եք ստուգել, որպեսզի հղումները շարունակեն տանել այնտեղ, ուր պետք է տանեն։\n\nԻ նկատի ունեցեք, որ էջը '''չի''' տեղափոխվի, եթե նոր անվանմամբ էջ արդեն գոյություն ունի՝ բացառությամբ այն դեպքերի, երբ էջը դատարկ է կամ վերահղման էջ է, և չունի նախկին փոփոխումների պատմություն\nՍա նշանակում է, որ դուք կարող եք հետ տեղափոխել էջը հին անվանմանը, եթե տեղափոխումը կատարվել է սխալմամբ և նաև չեք կարող արդեն գոյություն ունեցող էջը վրագրել։\n\n'''ԶԳՈՒՇԱՑՈ՜ՒՄ'''\nԱյս գործողությունը կարող է ունենալ արմատական ազդեցություն ''ժողովրդական'' էջի համար։\nՇարունակելուց առաջ խնդրում ենք համոզվել նրանում, որ դուք հասկանում եք հնարավոր հետևանքները։",
-       "movepagetext-noredirectfixer": "Օգտագործելով ներքևի ձևը, դուք կարող եք վերանավանել էջը։ Այդ դեպքում էջի ողջ կտեղափոխվի նոր վերնագրի ներքո։ Հին վերնագիրը կդառնա ավտոմատ վերահղում նոր վերնագրին։ Ստուգե՛ք, արդյոք վերանվանման պատճառով չե՞ն առաջացել [[Special:DoubleRedirects|կրկնակի]] կամ [[Special:BrokenRedirects|կոտրված վերահղումներ]]։ Դուք պատասխանատու եք, որ այլ էջերի հղումները այս անվանափոխությունից հետո շարունակեն ճիշտ գործել։\n\nԷջը հնարավոր '''չի''' լինի վերանվանել, եթե նոր վերնագրով արդեն էջ գոյութուն ունի, բացի այն դեպքից, երբ այն դատարկ է կամ վերահղում է առանց պատմության։ Այսինքն սխալ անուն ընտրելու դեպքում դուք կարող եք վերադարձնել էջի նախկին անվանումը, սակայն դուք չեք կարող օգտագործել գոյություն ունեցող էջի վերնագիր։\n\n'''Ուշադրությո՛ւն'''\nԱնվանափոխությունը կարող է լուրջ խնդիրներ առաջացնել հաճախակի խմբագրվող էջի դեպքում։\nԽնդրում ենք շարունակել միայն, եթե գիտակցում եք կատարվող փոփոխության հետևանքները։",
+       "movepagetext-noredirectfixer": "Õ\95Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Õ¬Õ¸Õ¾ Õ¶Õ¥Ö\80Ö\84Ö\87Õ« Õ±Ö\87Õ¨, Õ¤Õ¸Ö\82Ö\84 Õ¯Õ¡Ö\80Õ¸Õ² Õ¥Ö\84 Õ¾Õ¥Ö\80Õ¡Õ¶Õ¡Õ¾Õ¡Õ¶Õ¥Õ¬ Õ§Õ»Õ¨Ö\89 Ô±ÕµÕ¤ Õ¤Õ¥ÕºÖ\84Õ¸Ö\82Õ´ Õ§Õ»Õ« Õ¸Õ²Õ» ÕºÕ¡Õ¿Õ´Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¨ Õ¯Õ¿Õ¥Õ²Õ¡Ö\83Õ¸Õ­Õ¾Õ« Õ¶Õ¸Ö\80 Õ¾Õ¥Ö\80Õ¶Õ¡Õ£Ö\80Õ« Õ¶Õ¥Ö\80Ö\84Õ¸Ö\89 Õ\80Õ«Õ¶ Õ¾Õ¥Ö\80Õ¶Õ¡Õ£Õ«Ö\80Õ¨ Õ¯Õ¤Õ¡Õ¼Õ¶Õ¡ Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¾Õ¥Ö\80Õ¡Õ°Õ²Õ¸Ö\82Õ´ Õ¶Õ¸Ö\80 Õ¾Õ¥Ö\80Õ¶Õ¡Õ£Ö\80Õ«Õ¶Ö\89 Õ\8dÕ¿Õ¸Ö\82Õ£Õ¥Õ\9bÖ\84, Õ¡Ö\80Õ¤ÕµÕ¸Ö\84 Õ¾Õ¥Ö\80Õ¡Õ¶Õ¾Õ¡Õ¶Õ´Õ¡Õ¶ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¸Õ¾ Õ¹Õ¥Õ\9eÕ¶ Õ¡Õ¼Õ¡Õ»Õ¡Ö\81Õ¥Õ¬ [[Special:DoubleRedirects|Õ¯Ö\80Õ¯Õ¶Õ¡Õ¯Õ«]] Õ¯Õ¡Õ´ [[Special:BrokenRedirects|Õ¯Õ¸Õ¿Ö\80Õ¾Õ¡Õ® Õ¾Õ¥Ö\80Õ¡Õ°Õ²Õ¸Ö\82Õ´Õ¶Õ¥Ö\80]]Ö\89 Ô´Õ¸Ö\82Ö\84 ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¡Õ¿Õ¸Ö\82 Õ¥Ö\84, Õ¸Ö\80 Õ¡ÕµÕ¬ Õ§Õ»Õ¥Ö\80Õ« Õ°Õ²Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨ Õ¡ÕµÕ½ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¡Ö\83Õ¸Õ­Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ«Ö\81 Õ°Õ¥Õ¿Õ¸ Õ·Õ¡Ö\80Õ¸Ö\82Õ¶Õ¡Õ¯Õ¥Õ¶ Õ³Õ«Õ·Õ¿ Õ£Õ¸Ö\80Õ®Õ¥Õ¬Ö\89\n\nÔ·Õ»Õ¨ Õ°Õ¶Õ¡Ö\80Õ¡Õ¾Õ¸Ö\80 '''Õ¹Õ«''' Õ¬Õ«Õ¶Õ« Õ¾Õ¥Ö\80Õ¡Õ¶Õ¾Õ¡Õ¶Õ¥Õ¬, Õ¥Õ©Õ¥ Õ¶Õ¸Ö\80 Õ¾Õ¥Ö\80Õ¶Õ¡Õ£Ö\80Õ¸Õ¾ Õ¡Ö\80Õ¤Õ¥Õ¶ Õ§Õ» Õ£Õ¸ÕµÕ¸Ö\82Õ©Õ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ«, Õ¢Õ¡Ö\81Õ« Õ¡ÕµÕ¶ Õ¤Õ¥ÕºÖ\84Õ«Ö\81, Õ¥Ö\80Õ¢ Õ¡ÕµÕ¶ Õ¤Õ¡Õ¿Õ¡Ö\80Õ¯ Õ§ Õ¯Õ¡Õ´ Õ¾Õ¥Ö\80Õ¡Õ°Õ²Õ¸Ö\82Õ´ Õ§ Õ¡Õ¼Õ¡Õ¶Ö\81 ÕºÕ¡Õ¿Õ´Õ¸Ö\82Õ©ÕµÕ¡Õ¶Ö\89 Ô±ÕµÕ½Õ«Õ¶Ö\84Õ¶ Õ½Õ­Õ¡Õ¬ Õ¡Õ¶Õ¸Ö\82Õ¶ Õ¨Õ¶Õ¿Ö\80Õ¥Õ¬Õ¸Ö\82 Õ¤Õ¥ÕºÖ\84Õ¸Ö\82Õ´ Õ¤Õ¸Ö\82Ö\84 Õ¯Õ¡Ö\80Õ¸Õ² Õ¥Ö\84 Õ¾Õ¥Ö\80Õ¡Õ¤Õ¡Ö\80Õ±Õ¶Õ¥Õ¬ Õ§Õ»Õ« Õ¶Õ¡Õ­Õ¯Õ«Õ¶ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö\82Õ´Õ¨, Õ½Õ¡Õ¯Õ¡ÕµÕ¶ Õ¤Õ¸Ö\82Ö\84 Õ¹Õ¥Ö\84 Õ¯Õ¡Ö\80Õ¸Õ² Ö\85Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Õ¬ Õ£Õ¸ÕµÕ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶ Õ¸Ö\82Õ¶Õ¥Ö\81Õ¸Õ² Õ§Õ»Õ« Õ¾Õ¥Ö\80Õ¶Õ¡Õ£Õ«Ö\80Ö\89\n\n'''Õ\88Ö\82Õ·Õ¡Õ¤Ö\80Õ¸Ö\82Õ©ÕµÕ¸Õ\9bÖ\82Õ¶'''\nÔ±Õ¶Õ¾Õ¡Õ¶Õ¡Ö\83Õ¸Õ­Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶Õ¨ Õ¯Õ¡Ö\80Õ¸Õ² Õ§ Õ¬Õ¸Ö\82Ö\80Õ» Õ­Õ¶Õ¤Õ«Ö\80Õ¶Õ¥Ö\80 Õ¡Õ¼Õ¡Õ»Õ¡Ö\81Õ¶Õ¥Õ¬ Õ°Õ¡Õ³Õ¡Õ­Õ¡Õ¯Õ« Õ­Õ´Õ¢Õ¡Õ£Ö\80Õ¾Õ¸Õ² Õ§Õ»Õ« Õ¤Õ¥ÕºÖ\84Õ¸Ö\82Õ´Ö\89\nÔ½Õ¶Õ¤Ö\80Õ¸Ö\82Õ´ Õ¥Õ¶Ö\84 Õ·Õ¡Ö\80Õ¸Ö\82Õ¶Õ¡Õ¯Õ¥Õ¬ Õ´Õ«Õ¡ÕµÕ¶, Õ¥Õ©Õ¥ Õ£Õ«Õ¿Õ¡Õ¯Ö\81Õ¸Ö\82Õ´ Õ¥Ö\84 Õ¯Õ¡Õ¿Õ¡Ö\80Õ¾Õ¸Õ² Ö\83Õ¸Ö\83Õ¸Õ­Õ¸Ö\82Õ©ÕµÕ¡Õ¶ Õ°Õ¥Õ¿Ö\87Õ¡Õ¶Ö\84Õ¶Õ¥Ö\80Õ¨Ö\89",
        "movepagetalktext": "Կցված քննարկման էջը ավտոմատ կտեղափոխվի էջի հետ՝ '''բացառությամբ այն դեպքերի, երբ'''.\n*Գոյություն ունի ոչ-դատարկ քննարկման էջ նոր անվանման տակ\n*Դուք հանել եք նշումը ստորև արկղից\n\nԱյսպիսի դեպքերում հարկավոր է տեղափոխել կամ միաձուլել էջերը ձեռքով, եթե դա ցանկանաք։",
        "moveuserpage-warning": "'''Զգուշացո՜ւմ՝ '''You are about to move a user page. Please note that only the page will be moved and the user will ''not'' be renamed.",
        "movenologintext": "Անհրաժեշտ է [[Special:UserLogin|մտնել համակարգ]]՝ էջը տեղափոխելու համար։",
        "movenosubpage": "Այս էջը ենթաէջեր չունի",
        "movereason": "Պատճառ.",
        "revertmove": "հետ շրջել",
-       "delete_and_move": "Ջնջել և տեղափոխել",
        "delete_and_move_text": "==Պահանջվում է ջնջում==\n\n«[[:$1]]» անվանմամբ էջ արդեն գոյություն ունի։ Ուզո՞ւմ եք այն ջնջել՝ տեղափոխումը իրականացնելու համար։",
        "delete_and_move_confirm": "Այո, ջնջել էջը",
        "delete_and_move_reason": "Ջնջված է՝ տեղափոխման տեղ ազատելու համար",
index 0a177eb..1fb05f4 100644 (file)
@@ -49,6 +49,7 @@
        "tog-watchlisthidebots": "Celar le modificationes de robots in le observatorio",
        "tog-watchlisthideminor": "Celar modificationes minor in le observatorio",
        "tog-watchlisthideliu": "Celar modificationes de usatores registrate in le observatorio",
+       "tog-watchlistreloadautomatically": "Recargar automaticamente le observatorio quando un filtro es cambiate (JavaScript requirite)",
        "tog-watchlisthideanons": "Celar modificationes de usatores anonyme in le observatorio",
        "tog-watchlisthidepatrolled": "Celar le modificationes patruliate in le observatorio",
        "tog-watchlisthidecategorization": "Celar le categorisation de paginas",
        "morenotlisted": "Iste lista non es complete.",
        "mypage": "Pagina",
        "mytalk": "Discussion",
-       "anontalk": "Discussion pro iste adresse IP",
+       "anontalk": "Discussion",
        "navigation": "Navigation",
        "and": "&#32;e",
        "qbfind": "Cercar",
        "databaseerror-query": "Consulta: $1",
        "databaseerror-function": "Function: $1",
        "databaseerror-error": "Error: $1",
+       "transaction-duration-limit-exceeded": "A fin de evitar un grande retardo de replication, iste transaction ha essite abortate perque le duration de scriptura ($1) excedeva le limite de $2 secundas.\nSi tu modifica multe elementos insimul, tenta facer plure operationes minor in loco de un grande.",
        "laggedslavemode": "Attention: Es possibile que le pagina non contine actualisationes recente.",
        "readonly": "Base de datos blocate",
        "enterlockreason": "Describe le motivo del blocada, includente un estimation\nde quando illo essera terminate",
        "missingarticle-rev": "(numero del version: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
        "readonly_lag": "Le base de datos ha essite automaticamente blocate durante que le servitores de base de datos secundari se synchronisa con le servitor principal.",
+       "nonwrite-api-promise-error": "Le capite HTTP 'Promise-Non-Write-API-Action' ha essite inviate, ma le requesta se ha dirigite a un modulo API de scriptura.",
        "internalerror": "Error interne",
        "internalerror_info": "Error interne: $1",
        "internalerror-fatal-exception": "Error irreversibile de typo \"$1\"",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Proque crea tu un altere conto?",
-       "createacct-captcha": "Controlo de securitate",
-       "createacct-imgcaptcha-ph": "Scribe le texto que tu vide hic supra",
        "createacct-submit": "Crear tu conto",
        "createacct-another-submit": "Crear conto",
        "createacct-benefit-heading": "{{SITENAME}} es facite per gente como tu.",
        "wrongpasswordempty": "Tu non entrava un contrasigno. Per favor reprova.",
        "passwordtooshort": "Le contrasignos debe continer al minus {{PLURAL:$1|1 character|$1 characteres}}.",
        "passwordtoolong": "Le contrasignos non pote esser plus longe de {{PLURAL:$1|1 character|$1 characteres}}.",
+       "passwordtoopopular": "Contrasignos habitual non pote esser usate. Per favor, elige un contrasigno plus unic.",
        "password-name-match": "Tu contrasigno debe esser differente de tu nomine de usator.",
        "password-login-forbidden": "Le uso de iste nomine de usator e contrasigno ha essite prohibite.",
        "mailmypassword": "Reinitialisar contrasigno",
        "passwordreset-emailtext-ip": "Un persona (probabilemente tu, ab le adresse IP $1) requestava le reinitialisation de tu\ncontrasigno de {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es\nassociate con iste adresse de e-mail:\n\n$2\n\nIste {{PLURAL:$3|contrasigno|contrasignos}} temporari expirara post {{PLURAL:$5|un die|$5 dies}}.\nTu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona faceva iste\nrequesta, o si tu te ha rememorate tu contrasigno original e non plus\nvole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian\ncontrasigno.",
        "passwordreset-emailtext-user": "Le usator $1 in {{SITENAME}} requestava un reinitialisation de tu contrasigno in {{SITENAME}}\n($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es associate con iste adresse de e-mail:\n\n$2\n\nIste {{PLURAL:$3|contrasigno|contrasignos}} temporari expirara post {{PLURAL:$5|un die|$5 dies}}.\nTu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona faceva iste\nrequesta, o si tu te ha rememorate tu contrasigno original e non plus\nvole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian\ncontrasigno.",
        "passwordreset-emailelement": "Nomine de usator: \n$1\n\nContrasigno temporari: \n$2",
-       "passwordreset-emailsent": "Si iste es le adresse de e-mail registrate pro tu conto, alora un message de e-mail pro le reinitialisation del contrasigno essera inviate.",
+       "passwordreset-emailsentemail": "Si iste es le adresse de e-mail registrate pro tu conto, alora un message de e-mail pro le reinitialisation del contrasigno essera inviate.",
        "passwordreset-emailsent-capture": "Un message de e-mail pro le reinitialisation del contrasigno ha essite inviate; iste message es monstrate hic infra.",
        "passwordreset-emailerror-capture": "Un e-mail pro le reinitialisation del contrasigno ha essite generate; iste message es monstrate hic infra, ma le invio al {{GENDER:$2|usator}} ha fallite: $1",
        "changeemail": "Cambiar o remover adresse de e-mail",
        "showingresultsinrange": "In basso es monstrate usque a {{PLURAL:$1|<strong>1</strong> resultato|<strong>$1</strong> resultatos}} inter #<strong>$2</strong> e #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultato <strong>$1</strong> de <strong>$3</strong>|Resultatos <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Le recerca non ha producite resultatos.",
+       "search-nonefound-thiswiki": "Le recerca non ha producite resultatos in iste sito.",
        "powersearch-legend": "Recerca avantiate",
        "powersearch-ns": "Cercar in spatios de nomines:",
        "powersearch-togglelabel": "Seliger:",
        "prefs-help-prefershttps": "Iste preferentia habera effecto a partir de tu proxime session.",
        "prefswarning-warning": "To ha facite modificationes in tu preferentias que non ha ancora essite confirmate. Si tu quita iste pagina sin cliccar sur \"$1\", tu preferentias non essera cambiate.",
        "prefs-tabs-navigation-hint": "Consilio: Tu pote usar le claves de sagitta sinistre e dextre pro navigar inter le schedas in le lista.",
-       "email-address-validity-valid": "Sembla valide",
-       "email-address-validity-invalid": "Un adresse valide es obligatori!",
        "userrights": "Gestion de derectos de usator",
        "userrights-lookup-user": "Gerer gruppos de usatores",
        "userrights-user-editname": "Entra un nomine de usator:",
        "wlheader-showupdated": "Le paginas que ha essite modificate post tu ultime visita se monstra in litteras '''grasse'''.",
        "wlnote": "Ecce le ultime {{PLURAL:$1|modification|<strong>$1</strong> modificationes}} durante le ultime {{PLURAL:$2|hora|<strong>$2</strong> horas}}, a partir del $3 a $4.",
        "wlshowlast": "Monstrar le ultime $1 horas $2 dies",
+       "watchlistall2": "toto",
+       "watchlist-hide": "Celar",
+       "wlshowtime": "Periodo de tempore a monstrar:",
+       "wlshowhideminor": "modificationes minor",
+       "wlshowhidebots": "robots",
+       "wlshowhideliu": "usatores registrate",
+       "wlshowhideanons": "usatores anonyme",
+       "wlshowhidepatr": "modificationes patruliate",
+       "wlshowhidemine": "mi modificationes",
        "watchlist-options": "Optiones del observatorio",
        "watching": "Observation in curso...",
        "unwatching": "Disobservation in curso...",
        "contributions": "Contributiones del {{GENDER:$1|usator}}",
        "contributions-title": "Contributiones del usator $1",
        "mycontris": "Contributiones",
+       "anoncontribs": "Contributiones",
        "contribsub2": "Pro {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Le conto de usator \"$1\" non es registrate.",
        "nocontribs": "Necun modification ha essite trovate secundo iste criterios.",
        "movenosubpage": "Iste pagina non ha subpaginas.",
        "movereason": "Motivo:",
        "revertmove": "reverter",
-       "delete_and_move": "Deler e renominar",
        "delete_and_move_text": "==Deletion requirite==\nLe pagina de destination \"[[:$1]]\" existe ja.\nEsque tu vole deler lo pro permitter le renomination?",
        "delete_and_move_confirm": "Si, deler le pagina",
        "delete_and_move_reason": "Delite pro permitter le renomination de \"[[$1]]\"",
        "tooltip-pt-preferences": "Mi preferentias",
        "tooltip-pt-watchlist": "Le lista de paginas del quales tu seque le modificationes",
        "tooltip-pt-mycontris": "Lista de tu contributiones",
+       "tooltip-pt-anoncontribs": "Un lista de modificationes facite per iste adresse IP",
        "tooltip-pt-login": "Nos recommenda que tu te authentica, ma non es obligatori.",
        "tooltip-pt-logout": "Clauder session",
        "tooltip-pt-createaccount": "Tu es incoragiate a crear un conto e aperir session; totevia, non es obligatori",
        "htmlform-cloner-required": "Al minus un valor es requirite.",
        "htmlform-title-badnamespace": "[[:$1]] non es in le spatio de nomines \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" non es un titulo de pagina creabile",
-       "htmlform-title-not-exists": "[[:$1]] non existe.",
+       "htmlform-title-not-exists": "$1 non existe.",
        "htmlform-user-not-exists": "<strong>$1</strong> non existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> non es un nomine de usator valide.",
        "sqlite-has-fts": "$1 con supporto de recerca de texto integre",
        "logentry-suppress-block": "$1 {{GENDER:$2|blocava}} {{GENDER:$4|$3}} con un tempore de expiration de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambiava}} le configuration del blocada de {{GENDER:$4|$3}} con un tempore de expiration de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importava}} $3 per incargamento de file",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importava}} $3 per incargamento de file ($4 {{PLURAL:$4|version|versiones}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importava}} $3 ab un altere wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importava}} $3 ab $5 ($4 {{PLURAL:$4|version|versiones}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|fusionava}} $3 in $4 (versiones usque a $5)",
        "logentry-move-move": "$1 {{GENDER:$2|renominava}} le pagina $3 a $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|renominava}} le pagina $3 a $4 sin lassar un redirection",
index 4f4a6c3..c06a6f9 100644 (file)
@@ -41,7 +41,9 @@
                        "Totosunarto",
                        "Mirws",
                        "Ilham",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "WongKentir",
+                       "Rachmat.Wahidi"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
@@ -58,7 +60,7 @@
        "tog-watchdefault": "Tambahkan halaman yang saya sunting ke daftar pantauan",
        "tog-watchmoves": "Tambahkan halaman yang saya pindahkan ke daftar pantauan",
        "tog-watchdeletion": "Tambahkan halaman yang saya hapus ke daftar pantauan",
-       "tog-watchrollback": "Tambahkan laman di mana saya telah melakukan rollback watchlist saya",
+       "tog-watchrollback": "Tambahkan laman yang pernah saya kembalikan ke dalam daftar pantauan saya",
        "tog-minordefault": "Tandai semua suntingan sebagai suntingan kecil secara baku",
        "tog-previewontop": "Perlihatkan pratayang sebelum kotak sunting dan tidak sesudahnya",
        "tog-previewonfirst": "Perlihatkan pratayang pada suntingan pertama",
        "createaccountreason": "Alasan:",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Mengapa Anda membuat akun lain",
-       "createacct-captcha": "Pemeriksaan keamanan",
-       "createacct-imgcaptcha-ph": "Masukkan teks yang Anda lihat di atas",
        "createacct-submit": "Buat akun Anda",
-       "createacct-another-submit": "Buat akun lain",
+       "createacct-another-submit": "Buat akun",
        "createacct-benefit-heading": "{{SITENAME}} dibuat oleh orang-orang seperti Anda.",
        "createacct-benefit-body1": "{{PLURAL:$1|suntingan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|halaman}}",
        "wrongpassword": "Kata sandi yang Anda masukkan salah. Silakan coba lagi.",
        "wrongpasswordempty": "Anda tidak memasukkan kata sandi. Silakan coba lagi.",
        "passwordtooshort": "Kata sandi paling tidak harus terdiri dari {{PLURAL:$1|1 karakter|$1 karakter}}.",
-       "passwordtoolong": "Passwords tidak boleh lebih dari {{PLURAL:$1|1 character|$1 characters}}.",
+       "passwordtoolong": "Passwords tidak boleh lebih dari {{PLURAL:$1|1 karakter|$1 karakter}}.",
        "password-name-match": "Kata sandi Anda harus berbeda dari nama pengguna Anda.",
        "password-login-forbidden": "Penggunaan nama pengguna dan sandi ini telah dilarang.",
        "mailmypassword": "Setel ulang kata sandi",
        "missingcommentheader": "''Peringatan:''' Anda belum memberikan subjek atau judul untuk komentar Anda. Jika Anda kembali menekan \"{{int:savearticle}}\", suntingan Anda akan disimpan tanpa komentar tersebut.",
        "summary-preview": "Pratayang ringkasan:",
        "subject-preview": "Pratayang subyek/tajuk:",
-       "previewerrortext": "Kesalahan terjadi saat mencoba meninjau perubahan anda",
+       "previewerrortext": "Kesalahan terjadi saat mencoba memperlihatkan pratayang perubahan Anda.",
        "blockedtitle": "Pengguna diblokir",
        "blockedtext": "'''Nama pengguna atau alamat IP Anda telah diblokir.'''\n\nBlokir dilakukan oleh $1.\nAlasan yang diberikan adalah ''$2''.\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAnda dapat menghubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|pengurus lainnya]] untuk membicarakan hal ini.\n\nAnda tidak dapat menggunakan fitur 'Kirim surel ke pengguna ini' kecuali Anda telah memasukkan alamat surel yang sah di [[Special:Preferences|preferensi akun]] dan Anda tidak diblokir untuk menggunakannya.\n\nAlamat IP Anda adalah $3, dan ID pemblokiran adalah $5.\nTolong sertakan salah satu atau kedua informasi ini pada setiap pertanyaan yang Anda buat.",
        "autoblockedtext": "Alamat IP Anda telah terblokir secara otomatis karena digunakan oleh pengguna lain, yang diblokir oleh $1. Pemblokiran dilakukan atas alasan:\n\n:''$2''\n\n* Diblokir sejak: $8\n* Blokir kedaluwarsa pada: $6\n* Sasaran pemblokiran: $7\n\nAnda dapat menghubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|pengurus lainnya]] untuk membicarakan hal ini.\n\nAnda tidak dapat menggunakan fitur \"kirim surel ke pengguna ini\" kecuali Anda telah memasukkan alamat surel yang sah di [[Special:Preferences|preferensi akun]] Anda dan Anda tidak diblokir untuk menggunakannya.\n\nAlamat IP Anda saat ini adalah $3, dan ID pemblokiran adalah #$5.\nTolong sertakan informasi-informasi ini dalam setiap pertanyaan Anda.",
        "rev-deleted-event": "(rincian log dihapus)",
        "rev-deleted-user-contribs": "[nama pengguna atau alamat IP dihapus - suntingan disembunyikan pada daftar kontribusi]",
        "rev-deleted-text-permission": "Revisi halaman ini telah '''dihapus'''.\nRinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan]",
-       "rev-suppressed-text-permission": "Revisi laman ini adalah <strong>suppressed</strong>. Detail dapat ditemukan di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} suppression log].",
+       "rev-suppressed-text-permission": "Revisi laman ini adalah <strong>tertunda</strong>. Detail dapat ditemukan di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} catatan penundaan].",
        "rev-deleted-text-unhide": "Revisi ini telah '''dihapus'''.\nRinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].\nSebagai seorang pengurus Anda masih dapat [$1 melihat revisi ini] jika Anda mau.",
        "rev-suppressed-text-unhide": "Revisi halaman ini telah '''disupresi'''.\nRinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log supresi].\nSebagai seorang pengurus, Anda masih dapat [$1 melihat revisi ini] jika Anda mau.",
        "rev-deleted-text-view": "Revisi ini telah '''dihapus'''.\nSebagai seorang pengurus, Anda dapat melihatnya; rinciannya mungkin tersedia di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "right-override-export-depth": "Ekspor halaman termasuk halaman-halaman terkait hingga kedalaman 5",
        "right-sendemail": "Mengirim surel ke pengguna lain",
        "right-passwordreset": "Lihat surel pengaturulangan kata sandi",
-       "right-managechangetags": "Membuat dan menghapus  [[Special:Tags|tags]] dari database",
+       "right-managechangetags": "Membuat dan menghapus [[Special:Tags|tag]] dari basis data",
        "newuserlogpage": "Log pengguna baru",
        "newuserlogpagetext": "Di bawah ini adalah log pendaftaran pengguna baru",
        "rightslog": "Log perubahan hak akses",
        "action-viewmyprivateinfo": "lihat informasi pribadi Anda",
        "action-editmyprivateinfo": "sunting informasi pribadi Anda",
        "action-editcontentmodel": "mengedit model konten sebuah halaman",
-       "action-managechangetags": "Membuat dan menghapus label dari database",
+       "action-managechangetags": "Membuat dan menghapus tag dari basis data",
        "nchanges": "$1 {{PLURAL:$1|perubahan|perubahan}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sejak kunjungan terakhir}}",
        "enhancedrc-history": "riwayat",
        "rcshowhidemine": "$1 suntingan saya",
        "rcshowhidemine-show": "Tampilkan",
        "rcshowhidemine-hide": "Sembunyikan",
+       "rcshowhidecategorization-show": "Tampilkan",
+       "rcshowhidecategorization-hide": "Sembunyikan",
        "rclinks": "Perlihatkan $1 perubahan terbaru dalam $2 hari terakhir<br />$3",
        "diff": "beda",
        "hist": "versi",
        "upload-form-label-infoform-description": "Deskripsi",
        "upload-form-label-usage-title": "Penggunaan",
        "upload-form-label-usage-filename": "Nama berkas",
-       "foreign-structured-upload-form-label-own-work": "Ini karya saya sendiri",
+       "foreign-structured-upload-form-label-own-work": "Ini adalah karya saya sendiri",
        "foreign-structured-upload-form-label-infoform-categories": "Kategori",
        "foreign-structured-upload-form-label-infoform-date": "Tanggal",
        "backend-fail-stream": "Tidak bisa mengalikan berkas $1.",
        "unusedimages": "Berkas yang tak terpakai",
        "wantedcategories": "Kategori yang diinginkan",
        "wantedpages": "Halaman yang diinginkan",
-       "wantedpages-summary": "Daftar laman tak tersedia dengan tautan pada mereka, tidak termasuk laman yang hanya memiliki penautan pengalihan pada mereka.Untuk daftar laman tak tersedia yang memiliki penautan pengalihan pada mereka, lihat [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Daftar laman yang tidak ada yang memiliki paling banyak tautan ke mereka, tidak termasuk laman pengalihan. Untuk daftar laman yang memiliki pengalihan ke mereka, lihat [[{{#special:BrokenRedirects}}|daftar pengalihan rusak]].",
        "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 akan dicantumkan dalam [[:$1]].",
        "trackingcategories-desc": "Kriteria inklusi kategori",
        "noindex-category-desc": "Halaman tidak diindeks oleh robot karena ini mempunyai kata khusus <code><nowiki>__NOINDEX__</nowiki></code> padanya dan berada dalam ruang nama yang mengizinkan penanda itu.",
        "index-category-desc": "Halaman ini memiliki <code><nowiki>__INDEX__</nowiki></code> di atasnya (dan dalam ruang nama yang mana bendera yang diperbolehkan), dan karenanya diindeks oleh robot di mana itu biasanya tidak akan.",
-       "post-expand-template-inclusion-category-desc": "Ukuran laman lebih besar dari <code>$wgMaxArticleSize</code> setelah memperluas semua template, sehingga beberapa template tidak diperluas",
-       "post-expand-template-argument-category-desc": "Laman lebih besar dari <code>$wgMaxArticleSize</code> setelah memperluas argumen template (something in triple braces, like <code>{{{Foo}}}</code>).",
+       "post-expand-template-inclusion-category-desc": "Ukuran laman lebih besar dari <code>$wgMaxArticleSize</code> setelah memperluas semua templat, sehingga beberapa templat tidak diperluas.",
+       "post-expand-template-argument-category-desc": "Laman ini lebih besar dari <code>$wgMaxArticleSize</code> setelah memperluas argumen templat (sesuatu dalam tiga kurung kurawal, misalnya <code>{{{Foo}}}</code>).",
        "expensive-parserfunction-category-desc": "Laman menggunakan terlalu banyak fungsi parser (seperti <code>#ifexist</code>). Lihat [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Laman berisi sebuah tautan file rusak (sebuah tautan untuk menanam file saat file tidak ada)",
-       "hidden-category-category-desc": "Kategori ini berisikan <code><nowiki>__HIDDENCAT__</nowiki></code> di dalam konten laman, yang mencegahnya muncul di kotak tautan kategori pada laman, secara standar.",
+       "broken-file-category-desc": "Laman berisi sebuah tautan ke berkas yang rusak (sebuah tautan untuk menampilkan berkas yang tidak ada)",
+       "hidden-category-category-desc": "Kategori ini berisi <code><nowiki>__HIDDENCAT__</nowiki></code> di dalam konten laman, yang secara baku mencegah kategori ini muncul di kotak tautan kategori pada laman tersebut.",
        "trackingcategories-nodesc": "Deskripsi tidak tersedia.",
        "trackingcategories-disabled": "Kategori dinonaktifkan",
        "mailnologin": "Tidak ada alamat surel",
        "emailccsubject": "Salinan pesan Anda untuk $1: $2",
        "emailsent": "Surel terkirim",
        "emailsenttext": "Surel Anda telah dikirimkan.",
-       "emailuserfooter": "Email ini dikirimkan dengan $1 pada $2 dengan fungsi \"{{int:emailuser}}\" pada {{SITENAME}}.",
+       "emailuserfooter": "Email ini dikirimkan oleh $1 ke $2 dengan fungsi \"{{int:emailuser}}\" di {{SITENAME}}.",
        "usermessage-summary": "Tinggalkan pesan sistem.",
        "usermessage-editor": "Penyampai pesan sistem",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlist-details": "Terdapat {{PLURAL:$1|$1 halaman|$1 halaman}} di daftar pantauan Anda, tidak termasuk halaman pembicaraan.",
        "wlheader-enotif": "Notifikasi surel diaktifkan.",
        "wlheader-showupdated": "Halaman-halaman yang telah berubah sejak kunjungan terakhir Anda ditampilkan dengan '''huruf tebal'''.",
-       "wlnote": "Dibawah {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} in the last {{PLURAL:$2|hour|<strong>$2</strong> hours}}, sebagai $3, $4.",
-       "wlshowlast": "Tampilkan terakhir $1 jam $2 hari",
+       "wlnote": "Di bawah ini adalah {{PLURAL:$1|perubahan|<strong>$1</strong> perubahan}} terakhir dalam {{PLURAL:$2|jam|<strong>$2</strong> jam}}, per $3, $4.",
+       "wlshowlast": "Tampilkan $1 jam $2 hari terakhir",
+       "watchlistall2": "semua",
+       "wlshowtime": "Tampilkan hingga:",
+       "wlshowhideminor": "suntingan kecil",
+       "wlshowhidebots": "bot",
+       "wlshowhideliu": "pengguna terdaftar",
+       "wlshowhideanons": "pengguna anonim",
+       "wlshowhidepatr": "suntingan terpatroli",
+       "wlshowhidemine": "suntingan saya",
        "watchlist-options": "Opsi daftar pantauan",
        "watching": "Memantau...",
        "unwatching": "Menghilangkan pemantauan...",
        "exbeforeblank": "isi sebelum dikosongkan: '$1'",
        "delete-confirm": "Hapus \"$1\"",
        "delete-legend": "Hapus",
-       "historywarning": "<strong>Warning:</strong> Laman yang akan anda hapus punya riwayat dengan $1 {{PLURAL:$1|revision|revisions}}:",
+       "historywarning": "<strong>Peringatan:</strong> Laman yang akan Anda hapus memiliki riwayat dengan $1 perubahan:",
        "confirmdeletetext": "Anda akan menghapus halaman atau berkas ini secara permanen berikut semua sejarahnya dari basis data. Pastikan bahwa Anda memang ingin melakukannya, mengetahui segala akibatnya, dan apa yang Anda lakukan ini adalah sejalan dengan [[{{MediaWiki:Policy-url}}|kebijakan {{SITENAME}}]].",
        "actioncomplete": "Proses selesai",
        "actionfailed": "Eksekusi gagal",
        "delete-edit-reasonlist": "Alasan penghapusan suntingan",
        "delete-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nPenghapusan halaman dengan sejarah penyuntingan yang panjang tidak diperbolehkan untuk mencegah kerusakan di {{SITENAME}}.",
        "delete-warning-toobig": "Halaman ini memiliki sejarah penyuntingan yang panjang, melebihi {{PLURAL:$1|revisi|revisi}}.\nMenghapus halaman ini dapat menyebabkan masalah dalam operasional basis data {{SITENAME}}.",
-       "deleteprotected": "Anda tidak dapat menghapus laman ini karena telah diproteksi",
+       "deleteprotected": "Anda tidak dapat menghapus laman ini karena telah dilindungi.",
        "deleting-backlinks-warning": "'''Peringatan:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Halaman lain]] mengarah atau memiliki transklusi ke halaman yang akan Anda hapus.",
        "rollback": "Kembalikan suntingan",
        "rollbacklink": "kembalikan",
        "changecontentmodel-reason-label": "Alasan:",
        "changecontentmodel-success-title": "Model konten ini telah diubah",
        "changecontentmodel-success-text": "Jenis konten [[:$1]] telah diubah",
+       "logentry-contentmodel-change-revertlink": "batalkan",
+       "logentry-contentmodel-change-revert": "batalkan",
        "protectlogpage": "Log pelindungan",
        "protectlogtext": "Di bawah ini adalah daftar perubahan terhadap perlindungan halaman.\nLihat [[Special:ProtectedPages|daftar halaman terlindungi]] untuk daftar perlindungan halaman terkini.",
        "protectedarticle": "melindungi \"[[$1]]\"",
        "sp-contributions-newbies": "Hanya dari para pengguna baru",
        "sp-contributions-newbies-sub": "Untuk pengguna baru",
        "sp-contributions-newbies-title": "Kontribusi pengguna baru",
-       "sp-contributions-blocklog": "Log pemblokiran",
+       "sp-contributions-blocklog": "log pemblokiran",
        "sp-contributions-suppresslog": "kontribusi pengguna yang disembunyikan",
        "sp-contributions-deleted": "kontribusi pengguna yang dihapus",
        "sp-contributions-uploads": "unggahan",
        "cant-move-to-user-page": "Anda tidak memiliki hak akses untuk memindahkan halaman ke suatu halaman pengguna (kecuali ke subhalaman pengguna).",
        "cant-move-category-page": "Anda tidak memiliki izin untuk memindahkan halaman kategori.",
        "cant-move-to-category-page": "Anda tidak memiliki izin untuk memindahkan halaman ke halaman kategori.",
-       "newtitle": "Ke judul baru:",
+       "newtitle": "Judul baru:",
        "move-watch": "Pantau halaman ini",
        "movepagebtn": "Pindahkan halaman",
        "pagemovedsub": "Pemindahan berhasil",
        "spam_reverting": "Membatalkan ke versi terakhir yang tak memiliki pranala ke $1",
        "spam_blanking": "Semua revisi yang memiliki pranala ke $1, kosong",
        "spam_deleting": "Semua revisi yang memiliki pranala ke $1, penghapusan",
-       "simpleantispam-label": "Pemeriksaan anti-spam.\n'''Jangan''' mengisi ini!",
+       "simpleantispam-label": "Pemeriksaan anti-spam.\n<strong>Jangan</strong> diisi!",
        "pageinfo-title": "Informasi untuk \"$1\"",
        "pageinfo-not-current": "Maaf, tidak mungkin memberikan informasi ini ke revisi lama.",
        "pageinfo-header-basic": "Informasi dasar",
        "autosumm-replace": "←Mengganti halaman dengan '$1'",
        "autoredircomment": "←Mengalihkan ke [[$1]]",
        "autosumm-new": "←Membuat halaman berisi '$1'",
+       "autosumm-newblank": "Membuat halaman kosong",
        "lag-warn-normal": "Perubahan yang lebih baru dari $1 {{PLURAL:$1|detik|detik}} mungkin tidak muncul di daftar ini.",
        "lag-warn-high": "Karenanya besarnya keterlambatan basis data server, perubahan yang lebih baru dari $1 {{PLURAL:$1|detik|detik}} mungkin tidak muncul di daftar ini.",
        "watchlistedit-normal-title": "Sunting daftar pantauan",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikel path]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skrip path]",
+       "version-libraries-library": "Perpustakaan",
+       "version-libraries-version": "Versi",
+       "version-libraries-license": "Lisensi",
+       "version-libraries-description": "Deskripsi",
+       "version-libraries-authors": "Pembuat",
        "redirect": "Pengalihan berdasarkan ID berkas, pengguna, halaman atau revisi",
        "redirect-legend": "Pengalihan ke sebuah berkas atau halaman",
        "redirect-summary": "Halaman istimewa ini beralih ke berkas (sesuai nama berkasnya), halaman (sesuai ID revisinya), atau halaman pengguna (sesuai ID numerik penggunanya). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
        "tags-tag": "Nama tag",
        "tags-display-header": "Tampilan di daftar perubahan",
        "tags-description-header": "Deskripsi lengkap atau makna",
+       "tags-source-header": "Sumber",
        "tags-active-header": "Aktif?",
        "tags-hitcount-header": "Perubahan bertag",
+       "tags-actions-header": "Tindakan",
        "tags-active-yes": "Ya",
        "tags-active-no": "Tidak",
+       "tags-source-none": "Tidak digunakan lagi",
        "tags-edit": "sunting",
        "tags-delete": "hapus",
        "tags-activate": "aktifkan",
        "tags-deactivate": "nonaktifkan",
        "tags-hitcount": "$1 {{PLURAL:$1|perubahan}}",
+       "tags-create-heading": "Buat sebuah tag baru",
+       "tags-create-reason": "Alasan:",
+       "tags-create-submit": "Buat",
+       "tags-delete-reason": "Alasan:",
+       "tags-activate-reason": "Alasan:",
+       "tags-activate-submit": "Aktifkan",
+       "tags-deactivate-reason": "Alasan:",
+       "tags-deactivate-submit": "Matikan",
+       "tags-edit-reason": "Alasan:",
        "comparepages": "Bandingkan halaman",
        "compare-page1": "Halaman 1",
        "compare-page2": "Halaman 2",
        "htmlform-cloner-create": "Tambahkan lebih banyak",
        "htmlform-cloner-delete": "Hapus",
        "htmlform-cloner-required": "Paling sedikit satu nilai diperlukan.",
+       "htmlform-title-not-exists": "$1 tidak ada.",
        "sqlite-has-fts": "$1 dengan dukungan pencarian teks lengkap",
        "sqlite-no-fts": "$1 tanpa dukungan pencarian teks lengkap",
        "logentry-delete-delete": "$1 {{GENDER:$2|menghapus}} halaman $3",
        "rightsnone": "(tidak ada)",
        "revdelete-summary": "ringkasan",
        "feedback-adding": "Menambahkan umpan balik ke halaman...",
+       "feedback-back": "Kembali",
        "feedback-bugcheck": "Hebat! Hanya periksa bahwa itu bukan satu di antara [$1 bug yang telah dikenal].",
        "feedback-bugnew": "Saya telah memeriksa. Laporkan bug baru",
        "feedback-bugornote": "Jika Anda sudah siap untuk mendeskripsikan masalah teknis secara rinci silakan [$1 melaporkan bug].\nJika 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-cancel": "Batal",
        "feedback-close": "Selesai",
+       "feedback-error-title": "Kesalahan",
        "feedback-error1": "Galat: Hasil tidak dikenal dari API",
        "feedback-error2": "Galat: Penyuntingan gagal",
        "feedback-error3": "Error: API tidak merespons",
        "feedback-subject": "Perihal:",
        "feedback-submit": "Kirim",
        "feedback-thanks": "Terima kasih! Umpan balik Anda telah dikirimkan ke halaman \"[$2 $1]\".",
+       "feedback-thanks-title": "Terima kasih!",
        "searchsuggest-search": "Cari",
        "searchsuggest-containing": "berisi...",
        "api-error-badaccess-groups": "Anda tidak diizinkan mengunggah berkas ke wiki ini.",
index 68b8cd6..54d78c3 100644 (file)
@@ -15,6 +15,7 @@
        "tog-hideminor": "Ilemmeng dagiti bassit nga inurnos manipud iti kaudian a balbaliw",
        "tog-hidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud iti kaudian a balbaliw",
        "tog-newpageshidepatrolled": "Ilemmeng dagiti napatruliaan a panid manipud iti baro a listaan ti panid",
+       "tog-hidecategorization": "Ilemmeng ti pannakaikategoria dagiti panid",
        "tog-extendwatchlist": "Ipalawa ti listaan ti bambantayan tapno maipakita amin a nasukatan, saan laeng a ti kabiitan",
        "tog-usenewrc": "Dagiti grupo a panagbaliw babaen ti panid ti kaudian a balbaliw ken listaan ti bambantayan",
        "tog-numberheadings": "Automatiko a pabilangan dagiti paulo",
@@ -44,6 +45,7 @@
        "tog-watchlisthideliu": "Ilemmeng dagiti inurnos babaen dagiti nakastrek nga agar-aramat manipud iti listaan ti bambantayan",
        "tog-watchlisthideanons": "Ilemmeng dagiti inurnos babaen dagiti di ammo nga agar-aramat manipud iti listaan ti bambantayan",
        "tog-watchlisthidepatrolled": "Ilemmeng dagiti napatruliaan nga inurnos manipud iti listaan ti bambantayan",
+       "tog-watchlisthidecategorization": "Ilemmeng ti pannakaikategoria dagiti panid",
        "tog-ccmeonemails": "Patulodandak kadagiti kopia ti esurat nga ipatulodko kadagiti sabali nga agar-aramat",
        "tog-diffonly": "Saan nga iparang ti linaon ti panid dita baba dagiti pagiddiatan",
        "tog-showhiddencats": "Ipakita dagiti nailemmeng a kategoria",
        "morenotlisted": "Daytoy a listaan ket saan a kompleto.",
        "mypage": "Panid",
        "mytalk": "Tungtungan",
-       "anontalk": "Tungtungan para iti daytoy a pagtaengan ti IP",
+       "anontalk": "Tungtungan",
        "navigation": "Pagdaliasatan",
        "and": "&#32;ken",
        "qbfind": "Biruken",
        "viewsource": "Kitaen ti taudan",
        "viewsource-title": "Kitaen ti taudan para iti $1",
        "actionthrottled": "Napabuntog ti aramid",
-       "actionthrottledtext": "Para iti pagkontra ti spam, naipatinggaka nga agramid iti daytoy a tignay iti adu unay a beses iti nasiket nga oras, ken nalabsamon daytoy a patingga.\nPangngaasi nga ipadasmo manen no madamdama.",
+       "actionthrottledtext": "Kas pangkontra iti spam, naipatinggaka nga agaramid iti daytoy a tignay iti adu unay a beses iti nabiit a panawen, ken nalabsamon daytoy a patingga.\nPangngaasi nga ipadasmo manen intono madamdama.",
        "protectedpagetext": "Nasalakniban daytoy a panid tapno mapawilan ti panagurnos wenno dagiti dadduma pay a tignay.",
        "viewsourcetext": "Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid.",
        "viewyourtext": "Mabalinmo a makita ken tuladen ti taudan dagiti <strong>inurnosmo</strong> iti daytoy panid.",
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Apay nga agparpartuatka manen iti sabali a pakabilangan",
-       "createacct-captcha": "Panagpatalged ti seguridad",
-       "createacct-imgcaptcha-ph": "Ikabil ti teksto a makitam dita ngato",
        "createacct-submit": "Partuatem ti pakabilangam",
        "createacct-another-submit": "Agpartuat iti pakabilangan",
        "createacct-benefit-heading": "Ti {{SITENAME}} ket inar-aramid babaen ti tattao a kasla kenka.",
        "passwordreset-emailtext-ip": "Adda (baka sika, ti naggapuan ti IP a pagtaengan $1) a nagkiddaw ti maysa a panangisaad manen ti kontrasenias para iti {{SITNAME}} ($4) . {{PLURAL:$3|Ti |Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ket saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloyka nga agusar ti daan a kontrasenias.",
        "passwordreset-emailtext-user": "Daytoy nga agar-aramat $1 iti {{SITENAME}} ket nagkiddaw ti maysa a panangisaad manen ti bukod a kontrasenias para iti {{SITENAME}}\n($4) . {{PLURAL:$3|Ti|Dagiti}} sumaganad a pakabilangan ti agar-aramat ket\nmainaig iti daytoy nga esurat a pagtaengan:\n\n$2\n\n{{PLURAL:$3|Daytoy temporario a kontrasenias|Dagitoy temporario a kontrasenias}} ket agpaso {{PLURAL:$5|iti maysa nga aldaw|kadagiti $5 nga aldaw}}.\nSumrekka koman tapno agpilika ti baro a kontraseniasmo tattan. No adda met sabali a nagaramid daytoy a \npanagkiddaw, wenno malagipmo ti dati a kontraseniasmo, ken saanmo a kayaten a sukatan, saanmo nga ikaskaso daytoy a mensahe ken \nagtuloykan nga agusar ti daan a kontraseniasmo.",
        "passwordreset-emailelement": "Nagan ti agar-aramat: \n$1\n\nTemporario a kontrasenias: \n$2",
-       "passwordreset-emailsent": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden.",
+       "passwordreset-emailsent": "No daytoy ket nairehistro nga adres ti esurat para iti pakabilangam, maipatulodto ti maysa nga esurat iti panangisaad manen ti kontrasenias.",
        "passwordreset-emailsent-capture": "Ti maysa nga esurat ti panangisaad manen ti kontrasenias ket naipatuloden, a naipakita dita baba.",
        "passwordreset-emailerror-capture": "Naaramid ti maysa nga esurat a panangisaad manen ti kontrasenias, a napaikita dita baba, ngem ti panangitulod kenni {{GENDER:$2|agar-aramat}} ket napaay: $1",
-       "changeemail": "Sukatan ti esurat a pagtaengan",
-       "changeemail-header": "Sukatan ti esurat a pagtaengan ti pakabilangan",
+       "changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
+       "changeemail-header": "Kompletuen daytoy a porma tapno masukatan ti adres ti esuratmo. No kayatmo a maikkat ti pannakainaig iti ania man nga adres ti esurat manipud iti pakabilangam, ibati a blanko ti baro nga adres ti esurat no ited ti porma.",
+       "changeemail-passwordrequired": "Masapulmonto nga ikabil ti kontraseniasmo tapno mapasingkedan daytoy a panagbaliw.",
        "changeemail-no-info": "Masapul a nakastrekka tapno dagus a makapan iti ditoy a panid.",
        "changeemail-oldemail": "Agdama nga esurat a pagtaengan:",
        "changeemail-newemail": "Baro nga esurat a pagtaengan:",
+       "changeemail-newemail-help": "Daytoy a pagikabilan ket nasken a blanko no kayatmo a maikkat ti adres ti esuratmo. Saanmonto a mabalin ti mangisaad manen ti nalipatan a kontrasenias ken saankanto a makaawat kadagiti esurat manipud iti daytoy a wiki no maikkat ti adres ti esurat.",
        "changeemail-none": "(awan)",
        "changeemail-password": "Ti bukodmo a kontrasenias ti {{SITENAME}}:",
        "changeemail-submit": "Sukatan ti esurat",
        "sig_tip": "Ti pirmam nga addaan iti oras ken petsa",
        "hr_tip": "Horisontal a linia (manmano laeng nga aramaten)",
        "summary": "Pakabuklan:",
-       "subject": "Suheto/paulo:",
+       "subject": "Suheto:",
        "minoredit": "Daytoy ket bassit a panagurnos",
        "watchthis": "Bantayan daytoy a panid",
        "savearticle": "Idulin ti panid",
        "missingsummary": "<strong>Palagip:</strong> Saanka a nakaited iti pakabuklan ti panagurnos.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
        "selfredirect": "<strong>Ballaag:</strong> Ibawbaw-ingmo daytoy a panid iti isu met laeng a panid.\nMabalinmo nga innaganan ti kamali a puntaan para iti baw-ing, wenno mabalin nga ur-urnosem ti kamali a panid.\nNo pindutem manen ti \"{{int:savearticle}}\" , mapartuatto lattan ti baw-ing.",
        "missingcommenttext": "Pangngaasi nga agikabil ti komentario dita baba.",
-       "missingcommentheader": "<strong>Palagip:</strong> Saanka a nakaited iti suheto/paulo para iti daytoy a komentario.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulin ti inurnosmo nga awan ti pakabuklanna.",
+       "missingcommentheader": "<strong>Palagip:</strong> Saanka pay a nakaited iti suheto para iti daytoy a komentario.\nNo pindutem manen ti \"{{int:savearticle}}\", maidulinto ti inurnosmo nga awan ti pakabuklanna.",
        "summary-preview": "Naipadas a pakabuklan:",
-       "subject-preview": "Suheto/naipadas a paulo:",
+       "subject-preview": "Naipadas a suheto:",
        "previewerrortext": "Adda napasamak a maysa a biddut bayat a nagpadpadas kadagiti binawbaliwam.",
        "blockedtitle": "Naseraan ti agar-aramat",
        "blockedtext": "<strong>Naseraan ti naganmo nga agar-aramat wenno ti IP a pagtaengam.</strong>\n\nTi serra ket inaramid babaen ni $1. \nTi rason a naited ket <em>$2</em>.\n\n* Rugi ti serra: $8\n* Panagpaso ti serra: $6\n* Naikeddeng a serraanna: $7\n\nMabalinmo a kontaken ni $1 wenno sabali pay nga [[{{MediaWiki:Grouppage-sysop}}|administrador]] no kayatmo a maipalawag daytoy a panagserra.\nDimo mabalin nga aramaten ti ramit nga esuratan daytoy nga agar-aramat malaksid no adda napudno nga esurat a pagtaengan a nainaganan iti [[Special:Preferences|pakabilangan ti kakaykayatm]] ken no saanka a naparitan nga agaramat iti daytoy.\nTi agdama nga IP a pagtaengam ket $3, ti naserraan nga ID ket #$5. \nPangngaasi nga iramanmo amin dagiti salaysay dita ngato kadagiti ania man nga aramidem nga usisa.",
        "permissionserrors": "Biddut ti pammalubos",
        "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 a {{PLURAL:$1|rason|rasrason}}:",
+       "contentmodelediterror": "Saanmo a maurnos daytoy a rebision gapu ta ti modelo ti linaon ket <code>$1</code>, ken ti agdama a linaon ti panid ket <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Ballaag: Agparpartuatka manen ti dati a naikkat a panid.</strong>\n\nUsigem koma no maitutop ti agtuloy nga agurnos iti daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti daytoy a panid ket naited ditoy para iti pakainugotan:",
        "moveddeleted-notice": "Naikkaten daytoy a panid.\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
        "moveddeleted-notice-recent": "Pasensian, daytoy a panid ket kaik-ikkat idi (iti kaunegan dagiti 24 nga oras).\nTi listaan ti pannakaikkat ken pannakaiyalis para iti panid ket naited dita baba para iti reperensia.",
        "mergehistory-go": "Ipakita dagiti mabalin a maitipon a panagurnos",
        "mergehistory-submit": "Pagtitiponen dagiti rebision",
        "mergehistory-empty": "Awan dagiti rebision ti mabalin nga itipon.",
-       "mergehistory-done": "$3 {{PLURAL:$3|a rebision|dagiti rebision}} iti $1 ket nagballigi a naitipon iti [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|a rebision|dagiti rebision}} iti $1 ket {{PLURAL:$3|naitipon|naitiponda}} iti [[:$2]].",
        "mergehistory-fail": "Saan a nakaaramid ti panagtipon ti pakasaritaan, pangngaasi a kitaen ti panid ken dagiti parametro ti oras.",
        "mergehistory-fail-toobig": "Di naaramid ti panagtipon ti pakasaritaan gapu ta ad-adu ti patingga ti $1 {{PLURAL:$1|a rebision|kadagiti rebision}} ti maiyalisto.",
        "mergehistory-no-source": "Awan ti taudan ti panid ti $1.",
        "showingresultsinrange": "Mangipakpakita aginggana {{PLURAL:$1|iti <strong>1</strong> a resulta|dagiti <strong>$1</strong> a resulta}} iti sakop ti #<strong>$2</strong> aginggana iti #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Nagbanagan a <strong>$1</strong> iti <strong>$3</strong>|Dagiti nagbanagan a <strong>$1 - $2</strong> iti <strong>$3</strong>}}",
        "search-nonefound": "Awan dagiti nagbanagan a maipada iti usisa.",
+       "search-nonefound-thiswiki": "Awan dagiti resulta a maipada iti panagusisa iti daytoy a sitio.",
        "powersearch-legend": "Napasayat a panagbiruk",
        "powersearch-ns": "Agbiruk kadagiti nagan ti espasio:",
        "powersearch-togglelabel": "Markaan:",
        "prefs-watchlist-token": "Tandaan ti listaan ti bambantayan:",
        "prefs-misc": "Sabsabali",
        "prefs-resetpass": "Sukatan ti kontrasenias",
-       "prefs-changeemail": "Sukatan ti esurat a pagtaengan",
+       "prefs-changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
        "prefs-setemail": "Isaad ti esurat a pagtaengan",
        "prefs-email": "Dagiti pagpilian ti esurat",
        "prefs-rendering": "Tabas",
        "prefs-help-recentchangescount": "Daytoy ket mangiraman iti kaudian a balbaliw, dagiti pakasaritaan ti panid, ken dagiti listaan.",
        "prefs-help-watchlist-token2": "Daytoy ti sekreto a tulbek iti pakan ti web iti listaan ti bambantayam.\nTi sinoman a makaammo daytoy ket mabalinda a basaen ti listaan ti bambantayam, isu a saanmo nga ipabingay.\nNo masapulmo, [[Special:ResetTokens|mabalinmo nga isaad manen]].",
        "savedprefs": "Naidulinen dagiti kakaykayatam.",
+       "savedrights": "Naidulinen dagiti karbengan ti agar-aramat ni {{GENDER:$1|$1}}.",
        "timezonelegend": "Sona ti oras:",
        "localtime": "Lokal nga oras:",
        "timezoneuseserverdefault": "Usaren ti kasisigud ti wiki ($1)",
        "rcshowhidemine": "$1 dagiti inurnosko",
        "rcshowhidemine-show": "Ipakita",
        "rcshowhidemine-hide": "Ilemmeng",
+       "rcshowhidecategorization": "$1 a pannakaikategoria ti panid",
+       "rcshowhidecategorization-show": "Ipakita",
+       "rcshowhidecategorization-hide": "Ilemmeng",
        "rclinks": "Ipakita dagiti naudi a $1 a sinukatan iti kallabes a $2 nga al-aldaw<br />$3",
        "diff": "dip",
        "hist": "hist",
        "recentchanges-page-added-to-category-bundled": "nainayon ti [[:$1]] ken {{PLURAL:$2|maysa a panid|$2 a pampanid}} iti kategoria",
        "recentchanges-page-removed-from-category": "naikkat ti [[:$1]] manipud iti kategoria",
        "recentchanges-page-removed-from-category-bundled": "Naikkat ti [[:$1]] ken {{PLURAL:$2|maysa a panid|$2 a pampanid}} manipud iti kategoria",
+       "autochange-username": "Automatiko a panagbaliw iti MediaWiki",
        "upload": "Agikarga iti papeles",
        "uploadbtn": "Agikarga iti papeles",
        "reuploaddesc": "Ukasen ti panagikarga ken agsubli idiay porma ti panagikarga",
        "upload-form-label-infoform-description": "Deskripsion",
        "upload-form-label-usage-title": "Panagusar",
        "upload-form-label-usage-filename": "Nagan ti papeles",
+       "foreign-structured-upload-form-label-own-work": "Daytoy ket bukodko nga obra",
+       "foreign-structured-upload-form-label-infoform-categories": "Katkategoria",
+       "foreign-structured-upload-form-label-infoform-date": "Petsa",
        "backend-fail-stream": "Saan a maipan ti papeles $1.",
        "backend-fail-backup": "Saan a makaidulin ti kapada ti papeles ti $1.",
        "backend-fail-notexists": "Awan ti papeles ti $1.",
        "wlheader-showupdated": "Dagiti panid a nasukatanen manipud ti kinaudi a panagsarungkarmo ket naipakita iti <strong>napuskol</strong>.",
        "wlnote": "Dita baba ket {{PLURAL:$1|naudi a sinukatan|dagiti naudi a <strong>$1</strong> a sinukatan}} iti napalabas {{PLURAL:$2|nga oras|a <strong>$2</strong> nga or-oras}}, manipud idi $3, $4.",
        "wlshowlast": "Ipakita dagiti naudi a $1 nga or-oras $2 nga al-aldaw",
+       "watchlistall2": "amin",
+       "watchlist-hide": "Ilemmeng",
+       "wlshowtime": "Ipakita ti naudi:",
+       "wlshowhideminor": "dagiti bassit a panagurnos",
+       "wlshowhidebots": "dagiti bot",
+       "wlshowhideliu": "dagiti nakarehistro nga agar-aramat",
+       "wlshowhideanons": "dagiti di ammo nga agar-aramat",
+       "wlshowhidepatr": "dagiti napatrulian a panagurnos",
+       "wlshowhidemine": "dagiti inurnosko",
        "watchlist-options": "Dagiti pagpilian ti listaan a bambantayan",
        "watching": "Bambantayan...",
        "unwatching": "Saanen a bantayan...",
        "contributions": "Dagiti kontribusion ti {{GENDER:$1|agar-aramat}}",
        "contributions-title": "Kontribusion ti agar-aramat para kenni $1",
        "mycontris": "Inar-aramid",
+       "anoncontribs": "Inar-aramid",
        "contribsub2": "Para kenni {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Ti pakabilangan ti agar-aramat ni \"$1\" ket saan a nakarehistro.",
        "nocontribs": "Awan ti nasarakan a nasukatan a kapada dagitoy a kriteria.",
        "cant-move-to-user-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti agar-aramat (malaksid kadagiti subpanid ti agar-aramat).",
        "cant-move-category-page": "Awan ti pammalubosmo nga agiyalis kadagiti panid ti kategoria.",
        "cant-move-to-category-page": "Awan ti pammalubosmo nga agiyalis ti panid iti panid ti kategoria.",
-       "newtitle": "Iti baro a titulo:",
+       "newtitle": "Baro a titulo:",
        "move-watch": "Bantayan ti taudan a panid ken puntaan a panid",
        "movepagebtn": "Iyalis ti panid",
        "pagemovedsub": "Balligi ti panangiyalis",
        "movenosubpage": "Daytoy a panid ket awan ti subpanidna.",
        "movereason": "Rason:",
        "revertmove": "isubli",
-       "delete_and_move": "Ikkaten ken iyalis",
        "delete_and_move_text": "== Masapul nga ikkaten ==\nTi pangipanan ti panid ket \"[[:$1]]\" addan.\nKayatmo nga ikkaten tapno makaiyaliska?",
        "delete_and_move_confirm": "Wen, ikkaten ti panid",
        "delete_and_move_reason": "Naikkat tapno mawayaan ti pannaka-iyalis manipud ti \"[[$1]]\"",
        "tooltip-pt-userpage": "Panidmo nga agar-aramat",
        "tooltip-pt-anonuserpage": "Ti panid ti agar-aramat para iti daytoy nga IP a pagtaengan a kas ur-urnosem",
        "tooltip-pt-mytalk": "Tungtungam a panid",
-       "tooltip-pt-anontalk": "Pakitungtungan a maipanggep kadagiti panagurnos manipud ti daytoy nga IP a pagtaengan",
+       "tooltip-pt-anontalk": "Pakitungtungan a maipanggep kadagiti panagurnos manipud iti daytoy nga adres ti IP",
        "tooltip-pt-preferences": "Dagiti kakaykayatam",
        "tooltip-pt-watchlist": "Listaan dagiti panid a sipsiputem para iti pannakabalbaliw",
        "tooltip-pt-mycontris": "Ti listaan dagiti kontribusionmo",
+       "tooltip-pt-anoncontribs": "Ti listaan dagiti panagurnos manipud iti daytoy nga adres ti IP",
        "tooltip-pt-login": "Maaw-awis a sumrekka; nupay kasta, daytoy ket saan a nasken",
        "tooltip-pt-logout": "Rummuar",
        "tooltip-pt-createaccount": "Maaw-awis nga agpartuatka iti pakabilangan ken sumrek; nupay kasta, daytoy ket saan a nasken",
        "htmlform-cloner-required": "Saan a basbassit ngem maysa a pateg ti masapul.",
        "htmlform-title-badnamespace": "Ti [[:$1]] ket awan iti nagan ti espasio ti \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "Saan a mabalin a mapartuat a titulo ti panid ti \"$1\"",
-       "htmlform-title-not-exists": "Awan ti [[:$1]].",
+       "htmlform-title-not-exists": "Awan ti $1.",
        "htmlform-user-not-exists": "Awan ti <strong>$1</strong>.",
        "htmlform-user-not-valid": "Saan nga umiso a nagan ti agar-aramat ti <strong>$1</strong>.",
        "sqlite-has-fts": "Ti $1 nga addaan iti suporta ti panagbiruk ti napno a teksto",
index adfe655..2ae8f63 100644 (file)
@@ -21,7 +21,8 @@
                        "Macofe",
                        "Sveinn í Felli",
                        "Jonbg",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Xð"
                ]
        },
        "tog-underline": "Undirstrika tengla:",
        "nstab-template": "Snið",
        "nstab-help": "Hjálp",
        "nstab-category": "Flokkur",
+       "mainpage-nstab": "Forsíða",
        "nosuchaction": "Aðgerð ekki til",
        "nosuchactiontext": "Aðgerðin sem veffangið tilgreinir þekkir er ekki þekkt af wiki\nÞú gætir haft slegið inn vefslóðina vitlaust eða fylgt eftir röngum tengli.\nÞetta gæti einnig verið villa í hugbúnaðinum sem er notuð á {{SITENAME}}.",
        "nosuchspecialpage": "Kerfissíðan er ekki til",
        "createaccountreason": "Ástæða:",
        "createacct-reason": "Ástæða",
        "createacct-reason-ph": "Afhverju ertu að búa til annan aðgang",
-       "createacct-captcha": "Öryggis athugun",
-       "createacct-imgcaptcha-ph": "Sláðu inn textann að ofan",
        "createacct-submit": "Búa til aðganginn",
        "createacct-another-submit": "Stofna annan aðgang",
        "createacct-benefit-heading": "{{SITENAME}} er skrifuð af fólki eins og þér.",
        "enhancedrc-history": "breytingaskrá",
        "recentchanges": "Nýlegar breytingar",
        "recentchanges-legend": "Stillingar nýlegra breytinga",
-       "recentchanges-summary": "Hér geturðu fylgst með nýjustu breytingunum.",
+       "recentchanges-summary": "Hér geturðu fylgst með nýjustu breytingunum. {{SITENAME}} inniheldur '''[[Special:NewPages|{{NUMBEROFARTICLES}}]]''' {{PLURAL:{{NUMBEROFARTICLES}}|grein|greinar}} og '''[[Special:Statistics|{{NUMBEROFEDITS}}]]''' {{PLURAL:{{NUMBEROFEDITS}}|breytingu|breytingar}}. '''[[Special:ActiveUsers|{{NUMBEROFACTIVEUSERS}}]]''' {{PLURAL:{{NUMBEROFACTIVEUSERS}}|notandi|notendur}} hafa hjálpað til í þessum mánuði.",
        "recentchanges-noresult": "Engar breytingar í uppgefna tímabilinu sem passa við þessa mælikvarða.",
        "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",
        "wlheader-showupdated": "Síðum sem hefur verið breytt síðan þú skoðaðir þær síðast eru '''feitletraðar'''.",
        "wlnote": "Hér fyrir neðan {{PLURAL:$1|er síðasta <strong>$1</strong> breyting|eru síðustu <strong>$1</strong> breytingar}} {{PLURAL:$2|síðasta <strong>$2</strong> klukkutímann|síðustu <strong>$2</strong> klukkutímana}}, frá $3, $4.",
        "wlshowlast": "Sýna síðustu $1 klukkutíma, $2 daga",
+       "watchlistall2": "allt",
        "watchlist-options": "Vaktlistastillingar",
        "watching": "Vakta...",
        "unwatching": "Afvakta...",
        "movenosubpage": "Þessi síða hefur engar undirsíður.",
        "movereason": "Ástæða:",
        "revertmove": "taka til baka",
-       "delete_and_move": "Eyða og flytja",
        "delete_and_move_text": "==Beiðni um eyðingu==\n\nSíðan „[[:$1]]“ er þegar til. Viltu eyða henni til þess að rýma til fyrir flutningi?",
        "delete_and_move_confirm": "Já, eyða síðunni",
        "delete_and_move_reason": "Eytt til að rýma til fyrir flutning frá \"[[$1]]\"",
        "tooltip-ca-nstab-main": "Sýna síðuna",
        "tooltip-ca-nstab-user": "Sýna notandasíðuna",
        "tooltip-ca-nstab-media": "Sýna margmiðlunarsíðuna",
-       "tooltip-ca-nstab-special": "Þetta er kerfissíða, þér er óhæft að breyta henni.",
+       "tooltip-ca-nstab-special": "Þetta er kerfissíða, það er ekki hægt að breyta henni.",
        "tooltip-ca-nstab-project": "Sýna verkefnasíðuna",
        "tooltip-ca-nstab-image": "Sýna skráarsíðu",
        "tooltip-ca-nstab-mediawiki": "Sýna kerfisskilaboðin",
index bb09356..52bfa3b 100644 (file)
@@ -91,7 +91,9 @@
                        "Statix64",
                        "CassiodoroVicinetti",
                        "Bultro",
-                       "Oggioniale"
+                       "Oggioniale",
+                       "Wim b",
+                       "V6rg"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "tog-watchlisthidebots": "Nascondi le modifiche dei bot negli osservati speciali",
        "tog-watchlisthideminor": "Nascondi le modifiche minori negli osservati speciali",
        "tog-watchlisthideliu": "Nascondi le modifiche degli utenti registrati negli osservati speciali",
+       "tog-watchlistreloadautomatically": "Ricarica automaticamente l'elenco degli osservati speciali ogni volta che si modifica una filtro (richiede JavaScript)",
        "tog-watchlisthideanons": "Nascondi le modifiche degli utenti anonimi negli osservati speciali",
        "tog-watchlisthidepatrolled": "Nascondi le modifiche verificate negli osservati speciali",
        "tog-watchlisthidecategorization": "Nascondi la categorizzazione delle pagine",
        "tog-prefershttps": "Usa sempre una connessione sicura quando si effettua l'accesso",
        "underline-always": "Sempre",
        "underline-never": "Mai",
-       "underline-default": "Impostazioni predefinite del browser o della skin",
+       "underline-default": "Impostazioni predefinite del browser o del tema",
        "editfont-style": "Stile del carattere nella casella di modifica:",
        "editfont-default": "Predefinito del browser",
        "editfont-monospace": "Carattere a larghezza fissa",
        "morenotlisted": "Questo elenco non è completo.",
        "mypage": "Pagina",
        "mytalk": "discussioni",
-       "anontalk": "Discussioni per questo IP",
+       "anontalk": "discussioni",
        "navigation": "Navigazione",
        "and": "&#32;e",
        "qbfind": "Trova",
        "databaseerror-query": "Query: $1",
        "databaseerror-function": "Funzione: $1",
        "databaseerror-error": "Errore: $1",
+       "transaction-duration-limit-exceeded": "Al fine di evitare un alto ritardo di replica, questa operazione è stata interrotta perché la durata di scrittura ($1) ha superato il limite di $2 secondi.\nSe si stanno modificando molti elementi alla volta, prova a fare più operazioni più piccole.",
        "laggedslavemode": "'''Attenzione:''' la pagina potrebbe non riportare gli aggiornamenti più recenti.",
        "readonly": "Database bloccato",
        "enterlockreason": "Indicare il motivo del blocco, specificando il momento in cui è presumibile che venga rimosso",
        "missingarticle-rev": "(numero della versione: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
        "readonly_lag": "Il database è stato bloccato automaticamente per consentire ai server con i database slave di sincronizzarsi con il master",
+       "nonwrite-api-promise-error": "È stata inviata l'intestazione HTTP 'Promise-Non-Write-API-Action', ma la richiesta era di un modulo API in scrittura.",
        "internalerror": "Errore interno",
        "internalerror_info": "Errore interno: $1",
        "internalerror-fatal-exception": "Errore irreversibile di tipo \"$1\"",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Perché stai creando un'altra utenza",
-       "createacct-captcha": "Controllo di sicurezza",
-       "createacct-imgcaptcha-ph": "Inserisci il testo che vedi sopra",
        "createacct-submit": "Crea la tua utenza",
        "createacct-another-submit": "Crea utenza",
        "createacct-benefit-heading": "{{SITENAME}} cresce grazie a persone come te.",
        "wrongpasswordempty": "Non è stata inserita alcuna password. Riprovare.",
        "passwordtooshort": "Le password devono contenere almeno {{PLURAL:$1|1 carattere|$1 caratteri}}.",
        "passwordtoolong": "La password non può contenere più di {{PLURAL:$1|1 carattere|$1 caratteri}}.",
+       "passwordtoopopular": "Password comuni non possono essere usate. Scegli una password più originale.",
        "password-name-match": "La password deve essere diversa dal nome utente.",
        "password-login-forbidden": "L'uso di questo nome utente e password è stato proibito.",
        "mailmypassword": "Reimposta password",
        "passwordreset-capture-help": "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
        "passwordreset-email": "Indirizzo email:",
        "passwordreset-emailtitle": "Dettagli dell'utente su {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
+       "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare ad utilizzare la tua vecchia password.",
        "passwordreset-emailtext-user": "L'utente $1 di {{SITENAME}} ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare al utilizzare la tua vecchia password.",
        "passwordreset-emailelement": "Nome utente: \n$1\n\nPassword temporanea: \n$2",
-       "passwordreset-emailsent": "Se questo è un indirizzo di posta elettronica registrato per la tua utenza, allora verrà inviata una email per reimpostare la password.",
+       "passwordreset-emailsentemail": "Se questo è un indirizzo di posta elettronica registrato per la tua utenza, allora verrà inviata una email per reimpostare la password.",
+       "passwordreset-emailsentusername": "Se c'è un corrispondente indirizzo di posta elettronica registrato, allora verrà inviata una email per reimpostare la password.",
        "passwordreset-emailsent-capture": "È stata inviata una email di reimpostazione della password, il contenuto è riportato di seguito.",
        "passwordreset-emailerror-capture": "È stata generata una email di reimpostazione della password, riportata di seguito. L'invio {{GENDER:$2|all'utente}} non è riuscito: $1",
        "changeemail": "Modifica o rimuovi indirizzo email",
        "userjspreview": "'''Questa è solo un'anteprima per provare il proprio JavaScript personale; le modifiche non sono ancora state salvate!'''",
        "sitecsspreview": "Questa è solo un'anteprima del CSS. Le modifiche non sono ancora state salvate!'''",
        "sitejspreview": "Questa è solo un'anteprima per provare il JavaScript; le modifiche non sono ancora state salvate!'''",
-       "userinvalidcssjstitle": "'''Attenzione:'''  Non esiste alcuna skin con nome \"$1\". Si noti che le pagine per i .css e .js personalizzati hanno l'iniziale del titolo minuscola, ad esempio {{ns:user}}:Esempio/vector.css e non {{ns:user}}:Esempio/Vector.css.",
+       "userinvalidcssjstitle": "<strong>Attenzione:</strong> non esiste alcun tema con nome \"$1\". Si noti che le pagine per i .css e .js personalizzati hanno l'iniziale del titolo minuscola, ad esempio {{ns:user}}:Esempio/vector.css e non {{ns:user}}:Esempio/Vector.css.",
        "updated": "(Aggiornato)",
        "note": "'''Nota:'''",
        "previewnote": "'''Ricorda che questa è solo un'anteprima.'''\nLe tue modifiche NON sono ancora state salvate!",
        "showingresultsinrange": "{{PLURAL:$1|Viene mostrato|Vengono mostrati}} sotto {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultati}} dal <strong>$2</strong> al <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> di <strong>$3</strong>|Risultati <strong>$1 - $2</strong> di <strong>$3</strong>}}",
        "search-nonefound": "La ricerca non ha prodotto risultati.",
+       "search-nonefound-thiswiki": "La ricerca non ha prodotto risultati in questo sito.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Cerca nei namespace:",
        "powersearch-togglelabel": "Seleziona:",
        "mypreferences": "preferenze",
        "prefs-edits": "Modifiche effettuate:",
        "prefsnologintext2": "Per modificare le tue preferenze è necessario effettuare l'accesso.",
-       "prefs-skin": "Aspetto grafico (skin)",
+       "prefs-skin": "Tema",
        "skin-preview": "Anteprima",
        "datedefault": "Nessuna preferenza",
        "prefs-labs": "Funzionalità sperimentali",
        "prefs-files": "File",
        "prefs-custom-css": "CSS personalizzato",
        "prefs-custom-js": "JavaScript personalizzato",
-       "prefs-common-css-js": "CSS/JavaScript condiviso per tutte le skin:",
+       "prefs-common-css-js": "CSS/JavaScript condiviso per tutti i temi:",
        "prefs-reset-intro": "È possibile usare questa pagina per reimpostare le proprie preferenze a quelle predefinite del sito.\nL'operazione non può essere annullata.",
        "prefs-emailconfirm-label": "Conferma dell'e-mail:",
        "youremail": "Indirizzo email:",
        "prefs-help-prefershttps": "Questa preferenza avrà effetto dal prossimo accesso.",
        "prefswarning-warning": "Hai fatto modifiche alle tue preferenze che non sono state ancora salvate.\nSe esci da questa pagina senza cliccare \"$1\" le preferenze non verranno aggiornate.",
        "prefs-tabs-navigation-hint": "Suggerimento: è possibile utilizzare i tasti freccia sinistra e destra per spostarsi tra le schede nell'elenco delle schede.",
-       "email-address-validity-valid": "L'indirizzo e-mail sembra valido",
-       "email-address-validity-invalid": "Inserisci un indirizzo e-mail valido",
        "userrights": "Gestione dei permessi degli utenti",
        "userrights-lookup-user": "Gestione dei gruppi utente",
        "userrights-user-editname": "Inserire il nome utente:",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vedi le [[Special:NewPages|nuove pagine]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Mostra",
        "rcnotefrom": "Di seguito {{PLURAL:$5|è elencata la modifica apportata|sono elencate le modifiche apportate}} a partire da <strong>$3, $4</strong> (mostrate fino a <strong>$1</strong>).",
        "rclistfrom": "Mostra le modifiche apportate a partire da $3 $2",
        "rcshowhideminor": "$1 le modifiche minori",
        "mostrevisions": "Pagine con più versioni",
        "prefixindex": "Indice delle pagine per lettere iniziali",
        "prefixindex-namespace": "Tutte le pagine con il prefisso del namespace $1",
+       "prefixindex-submit": "Mostra",
        "prefixindex-strip": "Nascondi prefisso nell'elenco",
        "shortpages": "Pagine più corte",
        "longpages": "Pagine più lunghe",
        "protectedpages-performer": "Protetta dall'utente",
        "protectedpages-params": "Parametri di protezione",
        "protectedpages-reason": "Motivo",
+       "protectedpages-submit": "Mostra pagine",
        "protectedpages-unknown-timestamp": "Sconosciuto",
        "protectedpages-unknown-performer": "Utente sconosciuto",
        "protectedtitles": "Titoli protetti",
        "protectedtitles-summary": "Questa pagina elenca i titoli che sono attualmente protetti dalla creazione. Per un elenco di pagine esistenti che sono protette, vedi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Al momento non esistono titoli protetti con i parametri specificati.",
+       "protectedtitles-submit": "Mostra titoli",
        "listusers": "Elenco degli utenti",
        "listusers-editsonly": "Mostra solo utenti con dei contributi",
        "listusers-creationsort": "Ordina per data di creazione",
        "usereditcount": "$1 {{PLURAL:$1|contributo|contributi}}",
        "usercreated": "{{GENDER:$3|Creato/a}} il $1 alle $2",
        "newpages": "Nuove pagine",
+       "newpages-submit": "Mostra",
        "newpages-username": "Nome utente:",
        "ancientpages": "Pagine meno recenti",
        "move": "Sposta",
        "specialloguserlabel": "Azione effettuata da:",
        "speciallogtitlelabel": "Azione effettuata su (titolo della pagina o {{ns:user}}:Nome utente):",
        "log": "Registri",
+       "logeventslist-submit": "Mostra",
        "all-logs-page": "Tutti i registri pubblici",
        "alllogstext": "Presentazione unificata di tutti i registri di {{SITENAME}}.\nÈ 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.",
        "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.",
        "categories": "Categorie",
+       "categories-submit": "Mostra",
        "categoriespagetext": "{{PLURAL:$1|La categoria indicata di seguito contiene|Le categorie indicate di seguito contengono}} pagine o file multimediali.\nLe [[Special:UnusedCategories|categorie vuote]] non sono mostrate qui.\nVedi anche le [[Special:WantedCategories|categorie richieste]].",
        "categoriesfrom": "Mostra le categorie a partire da:",
        "special-categories-sort-count": "ordina per numero",
        "activeusers-hidebots": "Nascondi i bot",
        "activeusers-hidesysops": "Nascondi gli amministratori",
        "activeusers-noresult": "Nessun utente risponde ai criteri impostati.",
+       "activeusers-submit": "Mostra utenti attivi",
        "listgrouprights": "Diritti del gruppo utente",
        "listgrouprights-summary": "Di seguito sono elencati i gruppi utente definiti per questo sito, con i diritti d'accesso loro associati.\nPotrebbero esserci [[{{MediaWiki:Listgrouprights-helppage}}|ulteriori informazioni]] sui diritti individuali.",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Diritto assegnato</span>\n* <span class=\"listgrouprights-revoked\">Diritto revocato</span>",
        "wlheader-showupdated": "Le pagine che sono state modificate dopo l'ultima visita sono evidenziate in '''grassetto'''.",
        "wlnote": "Di seguito {{PLURAL:$1|è elencata la modifica più recente apportata|sono elencate le <strong>$1</strong> modifiche più recenti apportate}} {{PLURAL:$2|nella scorsa ora|nelle scorse <strong>$2</strong> ore}}; i dati sono aggiornati alle $4 del $3.",
        "wlshowlast": "Mostra le ultime $1 ore $2 giorni",
+       "watchlistall2": "tutte",
+       "watchlist-hide": "Nascondi",
+       "watchlist-submit": "Mostra",
+       "wlshowtime": "Periodo di tempo da visualizzare:",
+       "wlshowhideminor": "modifiche minori",
+       "wlshowhidebots": "bot",
+       "wlshowhideliu": "utenti registrati",
+       "wlshowhideanons": "utenti anonimi",
+       "wlshowhidepatr": "modifiche verificate",
+       "wlshowhidemine": "mie modifiche",
        "watchlist-options": "Opzioni osservati speciali",
        "watching": "Aggiunta agli osservati speciali...",
        "unwatching": "Eliminazione dagli osservati speciali...",
        "delete-confirm": "Cancella \"$1\"",
        "delete-legend": "Cancella",
        "historywarning": "'''Attenzione:''' La pagina che stai per cancellare ha una cronologia con $1 {{PLURAL:$1|versione|versioni}}:",
+       "historyaction-submit": "Mostra",
        "confirmdeletetext": "Stai per cancellare una pagina con tutta la sua cronologia. Per cortesia, conferma che è tua intenzione procedere a tale cancellazione, che hai piena consapevolezza delle conseguenze della tua azione e che essa è conforme alle linee guida stabilite in [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Azione completata",
        "actionfailed": "Azione fallita",
        "contributions": "Contributi {{GENDER:$1|utente}}",
        "contributions-title": "Contributi di $1",
        "mycontris": "contributi",
+       "anoncontribs": "contributi",
        "contribsub2": "Per {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
        "nocontribs": "Non sono state trovate modifiche che soddisfino i criteri di ricerca.",
        "sp-contributions-logs": "registri",
        "sp-contributions-talk": "discussione",
        "sp-contributions-userrights": "gestione dei permessi",
-       "sp-contributions-blocked-notice": "Questo utente è attualmente bloccato. L'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
+       "sp-contributions-blocked-notice": "Questo utente è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "sp-contributions-blocked-notice-anon": "Questo indirizzo IP è attualmente bloccato.\nL'ultimo elemento del registro dei blocchi è riportato di seguito per informazione:",
        "sp-contributions-search": "Ricerca contributi",
        "sp-contributions-username": "Indirizzo IP o nome utente:",
        "whatlinkshere-hidelinks": "$1 collegamenti",
        "whatlinkshere-hideimages": "$1 link da file",
        "whatlinkshere-filters": "Filtri",
+       "whatlinkshere-submit": "Vai",
        "autoblockid": "Autoblocco #$1",
        "block": "Blocca utente",
        "unblock": "Sblocca utente",
        "movenosubpage": "Questa pagina non ha sottopagine.",
        "movereason": "Motivo:",
        "revertmove": "ripristina",
-       "delete_and_move": "Cancella e sposta",
        "delete_and_move_text": "==Cancellazione richiesta==\n\nLa pagina specificata come destinazione \"[[:$1]]\" esiste già. Vuoi cancellarla per proseguire con lo spostamento?",
        "delete_and_move_confirm": "Sì, sovrascrivi la pagina esistente",
        "delete_and_move_reason": "Cancellata per rendere possibile lo spostamento da \"[[$1]]\"",
        "javascripttest-pagetext-unknownframework": "Framework di test sconosciuto \"$1\".",
        "javascripttest-pagetext-unknownaction": "Azione sconosciuta \"$1\".",
        "javascripttest-pagetext-frameworks": "Per cortesia, scegli uno dei seguenti framework per i test: $1",
-       "javascripttest-pagetext-skins": "Scegli una skin con cui eseguire i test:",
+       "javascripttest-pagetext-skins": "Scegli un tema con cui eseguire i test:",
        "javascripttest-qunit-intro": "Vedi su mediawiki.org la [$1 documentazione riguardante i test].",
        "tooltip-pt-userpage": "La tua pagina utente",
        "tooltip-pt-anonuserpage": "La pagina utente di questo indirizzo IP",
        "tooltip-pt-preferences": "Le tue preferenze",
        "tooltip-pt-watchlist": "La lista delle pagine che stai tenendo sotto osservazione",
        "tooltip-pt-mycontris": "La lista dei tuoi contributi",
+       "tooltip-pt-anoncontribs": "Un elenco delle modifiche fatte da questo indirizzo IP",
        "tooltip-pt-login": "Si consiglia di effettuare l'accesso, anche se non è obbligatorio",
        "tooltip-pt-logout": "Uscita (logout)",
        "tooltip-pt-createaccount": "Si consiglia di registrarsi e di effettuare l'accesso, anche se non è obbligatorio",
        "tooltip-ca-nstab-template": "Vedi il template",
        "tooltip-ca-nstab-help": "Vedi la pagina di aiuto",
        "tooltip-ca-nstab-category": "Vedi la pagina della categoria",
-       "tooltip-minoredit": "Segnala come modifica minore",
+       "tooltip-minoredit": "Contrassegna questa modifica come minore",
        "tooltip-save": "Salva le modifiche",
        "tooltip-preview": "Anteprima delle modifiche (consigliata prima di salvare)",
        "tooltip-diff": "Guarda le modifiche apportate al testo",
        "tooltip-preferences-save": "Salva le preferenze",
        "tooltip-summary": "Inserire una breve sintesi",
        "interlanguage-link-title": "$1 - $2",
-       "common.css": "/* Gli stili CSS inseriti qui si applicano a tutte le skin */",
+       "common.css": "/* Gli stili CSS inseriti qui si applicano a tutti i temi */",
        "print.css": "/* Gli stili CSS inseriti qui si applicano all'output in stampa */",
        "noscript.css": "/ * Gli stili CSS inseriti qui si applicano agli utenti che hanno JavaScript disabilitato * /",
        "group-autoconfirmed.css": "/ * Gli stili CSS inseriti qui si applicheranno solo ad utenti autoconvalidati * /",
        "exif-datetimeexpires": "Non utilizzare dopo",
        "exif-datetimereleased": "Rilasciato il",
        "exif-originaltransmissionref": "Codice del luogo di trasmissione originaria",
-       "exif-identifier": "Identificativo",
+       "exif-identifier": "Identificatore",
        "exif-lens": "Obiettivo utilizzato",
        "exif-serialnumber": "Numero di serie della fotocamera",
        "exif-cameraownername": "Proprietario della macchina fotografica",
        "exif-compression-6": "JPEG (vecchio)",
        "exif-copyrighted-true": "Protetto da copyright",
        "exif-copyrighted-false": "Status del copyright non impostato",
+       "exif-photometricinterpretation-1": "Bianco e nero (nero è 0)",
        "exif-unknowndate": "Data sconosciuta",
        "exif-orientation-1": "Normale",
        "exif-orientation-2": "Capovolto orizzontalmente",
        "invalid-indicator-name": "<strong>Errore:</strong> attributo <code>name</code> degli indicatori dello stato della pagina non può essere vuoto.",
        "version": "Versione",
        "version-extensions": "Estensioni installate",
-       "version-skins": "Skin installate",
+       "version-skins": "Temi installati",
        "version-specialpages": "Pagine speciali",
        "version-parserhooks": "Hook del parser",
        "version-variables": "Variabili",
        "version-license": "Licenza MediaWiki",
        "version-ext-license": "Licenza",
        "version-ext-colheader-name": "Estensione",
-       "version-skin-colheader-name": "Skin",
+       "version-skin-colheader-name": "Tema",
        "version-ext-colheader-version": "Versione",
        "version-ext-colheader-license": "Licenza",
        "version-ext-colheader-description": "Descrizione",
        "htmlform-cloner-required": "È necessario almeno un valore.",
        "htmlform-title-badnamespace": "[[:$1]] non si trova nel namespace \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" è il titolo di una pagina non creabile",
-       "htmlform-title-not-exists": "[[:$1]] non esiste.",
+       "htmlform-title-not-exists": "$1 non esiste.",
        "htmlform-user-not-exists": "<strong>$1</strong> non esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non è un nome utente valido.",
        "sqlite-has-fts": "$1 con la possibilità di ricerca completa nel testo",
        "logentry-suppress-block": "$1 {{GENDER:$2|ha bloccato}} {{GENDER:$4|$3}} con una scadenza di $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|ha modificato}} le impostazioni del blocco per {{GENDER:$4|$3}} con una scadenza di $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|ha importato}} $3 tramite caricamento",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|ha importato}} $3 tramite caricamento di file ($4 {{PLURAL:$4|versione|versioni}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|ha importato}} $3 da un'altra wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|ha importato}} $3 da $5 ($4 {{PLURAL:$4|versione|versioni}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|ha unito}} $3 in $4 (versioni fino al $5)",
        "logentry-move-move": "$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ha spostato}} la pagina $3 a $4 senza lasciare redirect",
        "log-name-pagelang": "Modifiche lingua",
        "log-description-pagelang": "Questo è un registro delle modifiche alla lingua delle pagine.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|ha modificato}} la lingua della pagina $3 da $4 a $5.",
-       "default-skin-not-found": "Oops! La skin predefinita per il tuo wiki, definita in <code dir=\"ltr\">$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nLa tua installazione sembra includere {{PLURAL:$4|la seguente|le seguenti}} skin. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] per informazioni su come abilitar{{PLURAL:$4|la|le e scegliere quella predefinita}}.\n\n$2\n\n; Se hai appena installato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. Prova ad installare alcune skin dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diverse skin ed estensioni. Puoi fare copia ed incolla della directory <code dir=\"ltr\">skins/</code> da lì.\n:* Scaricando tarball di singole skin da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usando Git per scaricare le skin].\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki.\n\n; Se hai appena aggiornato MediaWiki:\n: MediaWiki 1.24 e versioni successive non abilitano più automaticamente le skin installate (vedi [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automatico skin]). Puoi copiare {{PLURAL:$5|la seguente linea|le seguenti linee}} nel <code>LocalSettings.php</code> per abilitare {{PLURAL:$5|la|tutte le}} skin {{PLURAL:$5|installata|installate}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se hai appena modificato <code>LocalSettings.php</code>:\n: Ricontrolla i nomi delle skin per errori di battitura.",
-       "default-skin-not-found-no-skins": "Oops! La skin predefinita per il tuo wiki, definita in <code>$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nNon hai skin installate.\n\n; Se hai appena installato o aggiornato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. MediaWiki 1.24 e versioni successive non include alcuna skin nel repository principale. Prova ad installare alcune skin dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diverse skin ed estensioni. Puoi fare copia ed incolla della directory <code>skins/</code> da lì.\n:* Scaricando tarball di singole skin da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usando Git per scaricare le skin].\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione skin] per informazioni su come abilitarle e scegliere quella predefinita.",
+       "default-skin-not-found": "Oops! Il tema predefinito per il tuo wiki, definito in <code dir=\"ltr\">$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nLa tua installazione sembra includere {{PLURAL:$4|il seguente|i seguenti}} temi. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione tema] per informazioni su come {{PLURAL:$4|abilitarlo|abilitarli e scegliere quello predefinito}}.\n\n$2\n\n; Se hai appena installato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. Prova ad installare alcuni temi dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diversi temi ed estensioni. Puoi fare copia ed incolla della directory <code dir=\"ltr\">skins/</code> da lì.\n:* Scaricando tarball di singoli temi da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usando Git per scaricare i temi].\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki.\n\n; Se hai appena aggiornato MediaWiki:\n: MediaWiki 1.24 e versioni successive non abilitano più automaticamente i temi installati (vedi [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manuale: rilevamento automatico temi]). Puoi copiare {{PLURAL:$5|la seguente linea|le seguenti linee}} nel <code>LocalSettings.php</code> per abilitare {{PLURAL:$5|il tema installato|tutti i temi installati}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se hai appena modificato <code>LocalSettings.php</code>:\n: Ricontrolla i nomi dei temi per errori di battitura.",
+       "default-skin-not-found-no-skins": "Oops! Il tema predefinito per il tuo wiki, definito in <code>$wgDefaultSkin</code> come <code>$1</code>, non è disponibile.\n\nNon hai temi installati.\n\n; Se hai appena installato o aggiornato MediaWiki:\n: Probabilmente lo hai installato da git, o direttamente dal codice sorgente usando qualche altro metodo. Ciò era previsto. MediaWiki 1.24 e versioni successive non include alcun tema nel repository principale. Prova ad installare alcuni temi dalla [https://www.mediawiki.org/wiki/Category:All_skins directory su mediawiki.org], tramite:\n:* Scaricando il [https://www.mediawiki.org/wiki/Download programma di installazione tarball], che viene fornito con diversi temi ed estensioni. Puoi fare copia ed incolla della directory <code>skins/</code> da lì.\n:* Scaricando tarball di singoli temi da [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Usando Git per scaricare i temi].\n: In questo modo non dovrebbe interferire con il tuo repository git se sei uno sviluppatore MediaWiki. Vedi [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manuale: configurazione temi] per informazioni su come abilitarle e scegliere quello predefinito.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (abilitata)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''disabilitata''')",
        "mediastatistics": "Statistiche relative ai file multimediali",
index 5b9f114..45d34d5 100644 (file)
                        "Otokoume",
                        "赤城。",
                        "Sujiniku",
-                       "Azeha"
+                       "Azeha",
+                       "Kana Higashikawa",
+                       "Shield-9"
                ]
        },
        "tog-underline": "リンクの下線:",
-       "tog-hideminor": "最近の更新に細部の編集を表示しない",
-       "tog-hidepatrolled": "最近の更新に巡回済みの編集を表示しない",
+       "tog-hideminor": "最近の更新に細部の編集を表示しない",
+       "tog-hidepatrolled": "最近の更新に巡回済みの編集を表示しない",
        "tog-newpageshidepatrolled": "新しいページの一覧に、巡回済みのページを表示しない",
+       "tog-hidecategorization": "ページのカテゴリ化を隠す",
        "tog-extendwatchlist": "ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示",
        "tog-usenewrc": "最近の更新とウォッチリストで、複数の変更をページごとにまとめる",
        "tog-numberheadings": "見出しに番号を自動的に振る",
        "tog-showtoolbar": "編集用のツールバーを表示",
        "tog-editondblclick": "ダブルクリックでページを編集",
        "tog-editsectiononrightclick": "節見出しの右クリックで節を編集できるようにする",
-       "tog-watchcreations": "è\87ªå\88\86ã\81\8cä½\9cæ\88\90ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\97ã\81\9fã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
-       "tog-watchdefault": "è\87ªå\88\86ã\81\8cç·¨é\9b\86ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
-       "tog-watchmoves": "è\87ªå\88\86ã\81\8c移å\8b\95ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
-       "tog-watchdeletion": "è\87ªå\88\86ã\81\8cå\89\8aé\99¤ã\81\97ã\81\9fã\83\9aã\83¼ã\82¸ã\82\84ã\83\95ã\82¡ã\82¤ã\83«ã\82\92ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¿½å\8a ",
-       "tog-watchrollback": "巻き戻したページを、ウォッチリストに追加",
-       "tog-minordefault": "ç´°é\83¨ã\81®ç·¨é\9b\86ã\81\99ã\81¹ã\81¦ã\81«ã\80\81æ\97¢å®\9aã\81§ã\83\81ã\82§ã\83\83ã\82¯ã\82\92å\85¥ã\82\8cる",
+       "tog-watchcreations": "自分が作成したページやアップロードしたファイルをウォッチリストに追加",
+       "tog-watchdefault": "自分が編集したページやファイルをウォッチリストに追加",
+       "tog-watchmoves": "自分が移動したページやファイルをウォッチリストに追加",
+       "tog-watchdeletion": "自分が削除したページやファイルをウォッチリストに追加",
+       "tog-watchrollback": "自分が巻き戻したページを、ウォッチリストに追加",
+       "tog-minordefault": "ç·¨é\9b\86ã\82\92ã\81\99ã\81¹ã\81¦æ\97¢å®\9aã\81§ç´°é\83¨ã\81®ç·¨é\9b\86ã\81¨ã\81\99る",
        "tog-previewontop": "プレビューを編集ボックスの前に配置",
        "tog-previewonfirst": "編集開始時にもプレビューを表示",
        "tog-enotifwatchlistpages": "ウォッチリストにあるページやファイルが更新されたら、メールを受け取る",
        "tog-watchlisthidebots": "ボットによる編集をウォッチリストに表示しない",
        "tog-watchlisthideminor": "細部の編集をウォッチリストに表示しない",
        "tog-watchlisthideliu": "ログイン利用者による編集をウォッチリストに表示しない",
+       "tog-watchlistreloadautomatically": "フィルタが変更されるたびに、ウォッチリストを自動的に再読み込みします(JavaScript が必要)",
        "tog-watchlisthideanons": "匿名利用者による編集をウォッチリストに表示しない",
        "tog-watchlisthidepatrolled": "巡回済みの編集をウォッチリストに表示しない",
+       "tog-watchlisthidecategorization": "ページのカテゴリ化を隠す",
        "tog-ccmeonemails": "他の利用者に送信したメールの控えを自分にも送信",
        "tog-diffonly": "差分の下にページ内容を表示しない",
        "tog-showhiddencats": "隠しカテゴリを表示",
        "tog-norollbackdiff": "巻き戻し後の差分を表示しない",
        "tog-useeditwarning": "変更を保存せずに編集画面から離れようとしたら警告",
-       "tog-prefershttps": "ログインする際、常に SSL (https) 接続を使用する",
+       "tog-prefershttps": "ログインする際、常に安全な接続を使用する",
        "underline-always": "常に付ける",
        "underline-never": "常に付けない",
        "underline-default": "外装またはブラウザーの既定値を使用",
        "morenotlisted": "この一覧は完全ではありません。",
        "mypage": "ページ",
        "mytalk": "トーク",
-       "anontalk": "このIPアドレスについての議論",
+       "anontalk": "議論",
        "navigation": "案内",
        "and": "&#32;と",
        "qbfind": "検索",
        "title-invalid-leading-colon": "指定されたページ名の先頭に、無効なコロンが含まれています。",
        "perfcached": "以下のデータはキャッシュされており、最新ではない可能性があります。最大 $1 {{PLURAL:$1|件の結果}}がキャッシュされます。",
        "perfcachedts": "以下のデータはキャッシュされており、最終更新日時は $1 です。最大 $4 {{PLURAL:$4|件の結果}}がキャッシュされます。",
-       "querypage-no-updates": "ã\83\9aã\83¼ã\82¸ã\81®æ\9b´æ\96°ã\81¯ç\84¡å\8a¹ã\81«ã\81ªã\81£ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82\n以ä¸\8bã\81®ã\83\87ã\83¼ã\82¿ã\81®æ\9b´æ\96°ã\81¯ç\8f¾å\9c¨è¡\8cã\82\8fã\82\8cã\81¦ã\81\84ません。",
+       "querypage-no-updates": "ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®æ\9b´æ\96°ã\81¯ç\8f¾å\9c¨ç\84¡å\8a¹å\8c\96ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82\n以ä¸\8bã\81®ã\83\87ã\83¼ã\82¿ã\81¯å½\93å\88\86æ\9b´æ\96°ã\81\95ã\82\8cません。",
        "viewsource": "ソースを表示",
        "viewsource-title": "$1のソースを表示",
        "actionthrottled": "操作が速度規制されました",
        "namespaceprotected": "<strong>$1</strong>名前空間にあるページを編集する権限がありません。",
        "customcssprotected": "この CSS ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
        "customjsprotected": "この JavaScript ページは他の利用者の個人設定を含んでいるため、あなたには編集する権限がありません。",
-       "mycustomcssprotected": "あなたには CSS ページを編集する権限がありません。",
-       "mycustomjsprotected": "あなたには JavaScript ページを編集する権限がありません。",
+       "mycustomcssprotected": "あなたにはこの CSS ページを編集する権限がありません。",
+       "mycustomjsprotected": "あなたにはこの JavaScript ページを編集する権限がありません。",
        "myprivateinfoprotected": "あなたには自身の非公開情報を編集する権限がありません。",
        "mypreferencesprotected": "あなたには自身の個人設定を編集する権限がありません。",
        "ns-specialprotected": "特別ページは編集できません。",
        "createacct-emailoptional": "メールアドレス (省略可能)",
        "createacct-email-ph": "メールアドレスを入力",
        "createacct-another-email-ph": "メールアドレスを入力",
-       "createaccountmail": "一時的な無作為のパスワードを生成して、指定したメールアドレスに送信",
+       "createaccountmail": "無作為な仮パスワードを生成し、指定のメールアドレスに送信",
        "createacct-realname": "本名 (省略可能)",
        "createaccountreason": "理由:",
        "createacct-reason": "理由",
        "createacct-reason-ph": "アカウントを作成する理由",
-       "createacct-captcha": "自動作成防止チェック",
-       "createacct-imgcaptcha-ph": "上に表示されている文字列を入力",
        "createacct-submit": "アカウントを作成",
        "createacct-another-submit": "アカウントを作成",
        "createacct-benefit-heading": "{{SITENAME}}は、あなたのような人々が創っています。",
        "wrongpasswordempty": "パスワードを空欄にはできません。\nもう一度やり直してください。",
        "passwordtooshort": "パスワードは {{PLURAL:$1|$1 文字}}以上にしてください。",
        "passwordtoolong": "パスワードは {{PLURAL:$1|$1 文字}}以下にしてください。",
+       "passwordtoopopular": "選択したパスワードはありきたりであるため使用することはできません。誰も思いつかないようなパスワードを選択してください。",
        "password-name-match": "パスワードは利用者名とは異なる必要があります。",
        "password-login-forbidden": "この利用者名とパスワードの使用は禁止されています。",
        "mailmypassword": "パスワードを再設定",
        "throttled-mailpassword": "パスワード再設定メールを過去 {{PLURAL:$1|$1 時間}}に送信済みです。\n悪用防止のため、パスワードの再設定は {{PLURAL:$1|$1 時間}}に 1 回のみです。",
        "mailerror": "メールを送信する際にエラーが発生しました: $1",
        "acct_creation_throttle_hit": "あなたと同じ IP アドレスでこのウィキに訪れた人が、最近 24 時間で {{PLURAL:$1|$1 アカウント}}を作成しており、これはこの期間で作成が許可されている最大数です。\nそのため、現在この IP アドレスではアカウントをこれ以上作成できません。",
-       "emailauthenticated": "メールアドレスは$2 $3に確認済みです。",
+       "emailauthenticated": "メールアドレスは$2 $3に確認済みです。",
        "emailnotauthenticated": "メールアドレスが確認されていません。\n確認されるまで、以下のいかなる機能でもメールは送信されません。",
        "noemailprefs": "これらの機能を有効にするには、個人設定でメールアドレスを登録してください。",
        "emailconfirmlink": "あなたのメールアドレスを確認",
        "login-abort-generic": "ログインに失敗しました - 中止",
        "login-migrated-generic": "あなたのアカウントは移行が完了しており、その利用者名はこのウィキにはもう存在しません。",
        "loginlanguagelabel": "言語: $1",
-       "suspicious-userlogout": "å£\8aã\82\8cã\81\9fã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81¾ã\81\9fã\81¯ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\83\97ã\83­ã\82­ã\82·ã\81«ã\82\88ã\81£ã\81¦é\80\81ä¿¡ã\81\95ã\82\8cã\81\9få\8f¯è\83½æ\80§ã\81\8cã\81\82ã\82\8bã\81\9fã\82\81ã\80\81ã\83­ã\82°ã\82¢ã\82¦ã\83\88è¦\81æ±\82ã\81¯æ\8b\92å\90¦ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82",
+       "suspicious-userlogout": "壊れたブラウザまたはキャッシュプロキシによって送信された可能性があるため、ログアウト要求は拒否されました。",
        "createacct-another-realname-tip": "本名は省略できます。\n入力すると、その利用者の著作物の帰属表示に使われます。",
        "pt-login": "ログイン",
        "pt-login-button": "ログイン",
        "passwordreset-emailtext-ip": "誰か (おそらくあなた、IP アドレス $1) が {{SITENAME}} ($4)\nでのパスワードを再設定するよう申請しました。\n以下の利用者{{PLURAL:$3|アカウント|アカウント群}}がこのメールアドレスと紐付けられています。\n\n$2\n\n{{PLURAL:$3|この仮パスワード|これらの仮パスワード}}は {{PLURAL:$5|$5 日|$5 日間}}で有効期限が切れます。\nあなたはすぐにログインして新しいパスワードを設定する必要があります。\nこれが他の誰かによる申請である場合、あるいはあなたが自分の元のパスワードを\n覚えていてそれを変更したくない場合には、このメッセージを無視して以前のパスワードを\n使用し続けることができます。",
        "passwordreset-emailtext-user": "{{SITENAME}} の利用者 $1 があなたの {{SITENAME}} ($4)\nでのパスワードを再設定するよう申請しました。\n以下の利用者{{PLURAL:$3|アカウント|アカウント群}}がこのメールアドレスと紐付けられています。\n\n$2\n\n{{PLURAL:$3|この仮パスワード|これらの仮パスワード}}は{{PLURAL:$5|$5日}}で有効期限が切れます。\nあなたは、すぐにログインして新しいパスワードを設定する必要があります。\nこの申請が他の誰かによるものの場合、あるいはあなたが自分の元のパスワードを\n覚えていて、変更したくない場合は、このメッセージを無視して\n以前のパスワードを使い続けることができます。",
        "passwordreset-emailelement": "利用者名: \n$1\n\n仮パスワード: \n$2",
-       "passwordreset-emailsent": "もし、これがあなたのアカウントのために登録されたメールアドレスである場合、これからパスワードリセットのメールが送信されます。",
+       "passwordreset-emailsentemail": "もし、これがあなたのアカウントのために登録されたメールアドレスである場合、これからパスワードリセットのメールが送信されます。",
+       "passwordreset-emailsentusername": "メールアドレスが登録されている場合は、パスワードリセットのメールが送信されます。",
        "passwordreset-emailsent-capture": "下記の内容の、パスワード再設定メールをお送りしました。",
        "passwordreset-emailerror-capture": "以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1",
        "changeemail": "メールアドレスを変更または除去",
        "permissionserrors": "権限エラー",
        "permissionserrorstext": "あなたにはこの操作を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "permissionserrorstext-withaction": "あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:",
+       "contentmodelediterror": "コンテンツモデルが <code>$1</code> であるため、この版を編集することができません。ページの現在のコンテンツモデルは <code>$2</code> です。",
        "recreate-moveddeleted-warn": "<strong>警告: 以前削除されたページを再作成しようとしています。</strong>\n\nこのページの編集を続行するのが適切かどうかご確認ください。\n参考までに、このページの削除と移動の記録を以下に示します:",
        "moveddeleted-notice": "このページは削除されています。\n参考のため、このページの削除と移動の記録を以下に表示します。",
        "moveddeleted-notice-recent": "ごめんなさい、このページは最近に削除されました (過去24時間以内)。このページについての削除と移動の記録が、参考のため、以下にて提供されています。",
        "rev-suppressed-unhide-diff": "この差分の一方の版は<strong>秘匿されています</strong>。\n[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。\nこのまま[$1 この差分を閲覧]できます。",
        "rev-deleted-diff-view": "この差分の一方の版は<strong>削除されています</strong>。\nこの差分を閲覧できます。[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]に詳細情報があるかもしれません。",
        "rev-suppressed-diff-view": "この差分の一方の版は<strong>秘匿されています</strong>。\nこの差分を閲覧できます。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
-       "rev-delundel": "表示/非表示 の変更",
+       "rev-delundel": "閲覧レベルの変更",
        "rev-showdeleted": "表示",
        "revisiondelete": "版の削除と復元",
        "revdelete-nooldid-title": "無効な対象の版",
        "showingresultsinrange": "<strong>$2</strong> 件目から<strong>$3</strong> 件目までの範囲内で最大 {{PLURAL:$1|<strong>$1</strong> 件の結果}}を表示しています。",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> 件中の <strong>$1</strong> 件目|<strong>$3</strong> 件中の <strong>$1</strong> 件目から <strong>$2</strong> 件目}}",
        "search-nonefound": "問い合わせに合致する検索結果はありませんでした。",
+       "search-nonefound-thiswiki": "このサイトでの、そのクエリに一致する結果は、何もありませんでした。",
        "powersearch-legend": "高度な検索",
        "powersearch-ns": "名前空間を指定して検索:",
        "powersearch-togglelabel": "チェックを入れる:",
        "prefs-help-prefershttps": "この設定は、次回ログインの際に反映されます。",
        "prefswarning-warning": "個人設定にまだ保存されていない変更があります。\n「$1」をクリックせずに離れた場合、個人設定は更新されません。",
        "prefs-tabs-navigation-hint": "ヒント: ← キーと → キーで、タブ一覧内のタブ間を移動できます。",
-       "email-address-validity-valid": "メールアドレスは有効のようです",
-       "email-address-validity-invalid": "有効なメールアドレスを入力してください",
        "userrights": "利用者権限を管理",
        "userrights-lookup-user": "利用者グループを管理",
        "userrights-user-editname": "利用者名を入力:",
        "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
        "newuserlogpage": "アカウント作成記録",
        "newuserlogpagetext": "以下はアカウント作成の記録です。",
-       "rightslog": "利用者権限変更記録",
+       "rightslog": "利用者権限変更記録",
        "rightslogtext": "以下は利用者権限の変更記録です。",
        "action-read": "このページの閲覧",
        "action-edit": "このページの編集",
        "action-browsearchive": "削除されたページの検索",
        "action-undelete": "このページの復元",
        "action-suppressrevision": "隠された版の確認と復元",
-       "action-suppressionlog": "この非公開記録の閲覧",
+       "action-suppressionlog": "非公開記録の閲覧",
        "action-block": "この利用者の編集ブロック",
        "action-protect": "このページの保護レベルの変更",
        "action-rollback": "特定ページを最後に編集した利用者の編集の即時巻き戻し",
        "recentchanges-legend-heading": "'''凡例:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|新しいページ一覧]]も参照)",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "recentchanges-submit": "表示",
        "rcnotefrom": "以下は<strong>$3 $4</strong>以降の{{PLURAL:$5|更新です}} (最大 <strong>$1</strong> 件)。",
        "rclistfrom": "$3の$2以降の更新を表示する",
        "rcshowhideminor": "細部の編集を$1",
        "recentchangeslinked-page": "ページ名:",
        "recentchangeslinked-to": "このページへのリンク元での変更の表示に切り替え",
        "recentchanges-page-added-to-category": "[[:$1]] カテゴリに追加",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリに追加しました",
        "recentchanges-page-removed-from-category": "[[:$1]] カテゴリから削除",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]]と他{{PLURAL:$2|1ページ|$2ページ}}をカテゴリから削除しました",
        "autochange-username": "メディアウィキ自動変更",
        "upload": "ファイルをアップロード",
        "uploadbtn": "ファイルをアップロード",
        "mostrevisions": "版の多いページ",
        "prefixindex": "先頭が同じ全ページ",
        "prefixindex-namespace": "先頭が同じ全ページ ($1名前空間)",
+       "prefixindex-submit": "表示",
        "prefixindex-strip": "一覧で接頭辞を省略",
        "shortpages": "短いページ",
        "longpages": "長いページ",
        "protectedpages-performer": "保護の実行者",
        "protectedpages-params": "保護のパラメーター",
        "protectedpages-reason": "理由",
+       "protectedpages-submit": "ページを表示",
        "protectedpages-unknown-timestamp": "不明",
        "protectedpages-unknown-performer": "不明な利用者",
        "protectedtitles": "作成保護されているページ名",
        "protectedtitles-summary": "このページでは、現時点で新規作成が禁止されているページ名を列挙します。保護されている既存のページの一覧は、[[{{#special:ProtectedPages}}|{{int:protectedpages}}]] を参照してください。",
        "protectedtitlesempty": "これらの引数で現在保護されているページはありません。",
+       "protectedtitles-submit": "タイトルを表示",
        "listusers": "利用者一覧",
        "listusers-editsonly": "投稿記録のある利用者のみを表示",
        "listusers-creationsort": "作成日順に並べ替え",
        "usereditcount": "$1 {{PLURAL:$1|回編集}}",
        "usercreated": "$1 $2 に{{GENDER:$3|作成}}",
        "newpages": "新しいページ",
+       "newpages-submit": "表示",
        "newpages-username": "利用者名:",
        "ancientpages": "最古のページ",
        "move": "移動",
        "nopagetext": "指定したページは存在しません。",
        "pager-newer-n": "{{PLURAL:$1|以後の$1件}}",
        "pager-older-n": "{{PLURAL:$1|以前の$1件}}",
-       "suppress": "秘匿する",
+       "suppress": "秘匿",
        "querypage-disabled": "パフォーマンスに悪影響を与えるおそれがあるため、この特別ページは無効になっています。",
        "apihelp": "API のヘルプ",
        "apihelp-no-such-module": "モジュール「$1」が見つかりません。",
        "specialloguserlabel": "実行者:",
        "speciallogtitlelabel": "対象 (ページ名または利用者の場合、{{ns:user}}:利用者名):",
        "log": "記録",
+       "logeventslist-submit": "表示",
        "all-logs-page": "すべての公開記録",
        "alllogstext": "{{SITENAME}}の取得できる記録をまとめて表示しています。\n記録の種類、実行した利用者 (大文字小文字は区別)、影響を受けたページ (大文字小文字は区別) による絞り込みができます。",
        "logempty": "該当する記録はありません。",
        "cachedspecial-viewing-cached-ts": "このページのキャッシュされた版を表示しています。現在の実際の版と異なる場合があります。",
        "cachedspecial-refresh-now": "最新版を表示します。",
        "categories": "カテゴリ",
-       "categoriespagetext": "以下の{{PLURAL:$1|カテゴリ}}にはページまたはメディアがあります。\n[[Special:UnusedCategories|未使用のカテゴリ]]はここには表示していません。\n[[Special:WantedCategories|望まれるカテゴリ]]も参照してください。",
+       "categories-submit": "表示",
+       "categoriespagetext": "以下の{{PLURAL:$1|カテゴリ}}にはページまたはメディアがあります。\n[[Special:UnusedCategories|使われていないカテゴリ]]はここには表示していません。\n[[Special:WantedCategories|カテゴリページが存在しないカテゴリ]]も参照してください。",
        "categoriesfrom": "最初に表示するカテゴリ:",
        "special-categories-sort-count": "項目数順に並べ替え",
        "special-categories-sort-abc": "辞書順に並べ替え",
        "activeusers-hidebots": "ボットを隠す",
        "activeusers-hidesysops": "管理者を隠す",
        "activeusers-noresult": "利用者が見つかりませんでした。",
+       "activeusers-submit": "活動中の利用者を表示",
        "listgrouprights": "利用者グループの権限",
        "listgrouprights-summary": "以下は、このウィキに登録されている利用者グループと、それぞれに割り当てられている権限の一覧です。\n個々の権限に関する更なる情報は[[{{MediaWiki:Listgrouprights-helppage}}|追加情報]]を見てください。",
        "listgrouprights-key": "凡例:\n* <span class=\"listgrouprights-granted\">与えられた権限</span>\n* <span class=\"listgrouprights-revoked\">取り消された権限</span>",
        "wlheader-showupdated": "最終訪問以降に変更されたページは、<strong>太字</strong>で表示されます。",
        "wlnote": "$3 $4 までの{{PLURAL:$2|<strong>$2</strong>時間}}になされた{{PLURAL:$1|<strong>$1</strong>件の変更}}は以下の通りです。",
        "wlshowlast": "表示する期間: $1時間、$2日間",
+       "watchlistall2": "すべて",
+       "watchlist-hide": "非表示",
+       "watchlist-submit": "表示",
+       "wlshowtime": "表示範囲:",
+       "wlshowhideminor": "細部の編集",
+       "wlshowhidebots": "ボット",
+       "wlshowhideliu": "登録利用者",
+       "wlshowhideanons": "IP利用者",
+       "wlshowhidepatr": "巡回された編集",
+       "wlshowhidemine": "自分の編集",
        "watchlist-options": "ウォッチリストのオプション",
        "watching": "ウォッチリストに追加中...",
        "unwatching": "ウォッチリストから除去中...",
        "delete-confirm": "「$1」の削除",
        "delete-legend": "削除",
        "historywarning": "<strong>警告:</strong> 削除しようとしているページには、$1版の履歴があります:",
+       "historyaction-submit": "表示",
        "confirmdeletetext": "ページをすべての履歴とともに削除しようとしています。\n本当にこの操作を行いたいか、操作の結果を理解しているか、およびこの操作が[[{{MediaWiki:Policy-url}}|方針]]に従っているかどうか、確認してください。",
        "actioncomplete": "操作を完了しました",
        "actionfailed": "操作に失敗しました",
        "contributions": "{{GENDER:$1|利用者}}の投稿記録",
        "contributions-title": "$1の投稿記録",
        "mycontris": "投稿記録",
+       "anoncontribs": "投稿記録",
        "contribsub2": "利用者: {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "利用者アカウント「$1」は登録されていません。",
        "nocontribs": "これらの条件に一致する変更は見つかりませんでした。",
        "whatlinkshere-hidelinks": "リンクを$1",
        "whatlinkshere-hideimages": "ファイルへのリンクを$1",
        "whatlinkshere-filters": "絞り込み",
+       "whatlinkshere-submit": "実行",
        "autoblockid": "自動ブロック #$1",
        "block": "利用者をブロック",
        "unblock": "利用者のブロックを解除",
        "movenosubpage": "このページに下位ページはありません。",
        "movereason": "理由:",
        "revertmove": "差し戻し",
-       "delete_and_move": "削除して移動",
        "delete_and_move_text": "== 削除が必要です ==\n移動先「[[:$1]]」は既に存在します。\n移動のためにこのページを削除しますか?",
        "delete_and_move_confirm": "はい、ページを削除します",
        "delete_and_move_reason": "「[[$1]]」からの移動のために削除",
        "tooltip-pt-preferences": "個人設定",
        "tooltip-pt-watchlist": "変更をウォッチしているページの一覧",
        "tooltip-pt-mycontris": "自分の投稿の一覧",
+       "tooltip-pt-anoncontribs": "このIPアドレスからなされた編集の一覧",
        "tooltip-pt-login": "ログインすることを推奨します。ただし、必須ではありません。",
        "tooltip-pt-logout": "ログアウト",
        "tooltip-pt-createaccount": "アカウントを作成してログインすることをお勧めしますが、必須ではありません",
        "svg-long-error": "無効な SVG ファイル: $1",
        "show-big-image": "元のファイル",
        "show-big-image-preview": "このプレビューのサイズ: $1。",
+       "show-big-image-preview-differ": "この $2 ファイルのこの $3 プレビューのサイズ: $1.",
        "show-big-image-other": "その他の{{PLURAL:$2|解像度}}: $1。",
        "show-big-image-size": "$1 × $2 ピクセル",
        "file-info-gif-looped": "ループします",
        "tags-create-warnings-below": "このタグの作成を続けますか?",
        "tags-delete-title": "タグを削除",
        "tags-delete-explanation-initial": "あなたはタグ「$1」をデータベースから削除しようとしています。",
-       "tags-delete-explanation-in-use": "ç\8f¾å\9c¨é\81©ç\94¨ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b{{PLURAL:$2|ç\89\88ã\82\84è¨\98é\8c²é \85ç\9b® $2 ä»¶}}ã\82\92å\89\8aé\99¤ã\81\97ます。",
+       "tags-delete-explanation-in-use": "ç\8f¾å\9c¨é\81©ç\94¨ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b{{PLURAL:$2|ç\89\88ã\82\84è¨\98é\8c²é \85ç\9b® $2 ä»¶}}ã\81\8bã\82\89å\89\8aé\99¤ã\81\95ã\82\8cます。",
        "tags-delete-explanation-warning": "この操作は<strong>元に戻せず</strong>、データベース管理者をもってしても<strong>取り消しは不可能</strong>です。削除するタグとして間違いがないことをもう一度しっかり確認してください。",
        "tags-delete-explanation-active": "<strong>タグ「$1」はまだ有効であり、今後も付与され続けます。</strong>これを止めるには、タグが付与されるよう設定されているところに行き、そこで無効化してください。",
        "tags-delete-reason": "理由:",
        "htmlform-cloner-required": "少なくとも 1 つの値が必要です。",
        "htmlform-title-badnamespace": "[[:$1]]は、\"{{ns:$2}}\"名前空間にありません。",
        "htmlform-title-not-creatable": "\"$1\" は、作成可能なページ名では、ありません。",
-       "htmlform-title-not-exists": "[[:$1]] は存在しません。",
+       "htmlform-title-not-exists": "$1 は存在しません。",
        "htmlform-user-not-exists": "<strong>$1</strong>は存在しません。",
        "htmlform-user-not-valid": "<strong>$1</strong>は有効な利用者名ではありません。",
        "sqlite-has-fts": "$1 (全文検索あり)",
        "logentry-suppress-reblock": "$1 が {{GENDER:$4|$3}} のブロックの期限を$5に{{GENDER:$2|変更しました}} $6",
        "logentry-import-upload": "$1 がファイルをアップロードして $3 を{{GENDER:$2|インポートしました}}",
        "logentry-import-interwiki": "$1 が他のウィキから $3 を{{GENDER:$2|インポートしました}}",
+       "logentry-import-interwiki-details": "$1 が $3 を $5 から{{GENDER:$2|取り込み}}ました ($4 {{PLURAL:$4|版}})",
        "logentry-merge-merge": "$1{{GENDER:$2|統合元}} と$3を$4に統合(改訂版を$5に掲載)",
        "logentry-move-move": "$1 がページ「$3」を「$4」に{{GENDER:$2|移動しました}}",
        "logentry-move-move-noredirect": "$1 がページ「$3」を「$4」に、リダイレクトを残さずに{{GENDER:$2|移動しました}}",
        "logentry-managetags-activate": "$1 がタグ \"$4\" の利用者およびボットによる使用を{{GENDER:$2|有効化しました}}。",
        "logentry-managetags-deactivate": "$1 がタグ \"$4\" の利用者およびボットによる使用を{{GENDER:$2|無効化しました}}。",
        "log-name-tag": "タグ記録",
-       "log-description-tag": "このページには、個々の版またはエントリーの記録から、利用者を追加または削除した[[Special:Tags|タグ]]が表示されます。編集の一部、削除、同様の操作として発生したときの操作はタグ付けされず、記録には表示されません。",
+       "log-description-tag": "このページには、個々の版または記録項目から、いつ利用者が[[Special:Tags|タグ]]を追加または削除したかが記録されます。編集、削除、または同様の操作の一部として発生したタグ付けは記録には表示されません。",
        "logentry-tag-update-add-revision": "$1 がページ $3 の版 $4 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "logentry-tag-update-add-logentry": "$1 がページ $3 の記録項目 $5 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "logentry-tag-update-remove-revision": "$1 がページ $3 の版 $4 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
        "logentry-tag-update-remove-logentry": "$1 がページ $3 の記録項目 $5 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
        "logentry-tag-update-revision": "$1 がページ「$3」の版 $4 でのタグを{{GENDER:$2|更新しました}} ($6 が{{PLURAL:$7|追加}}、$8 が{{PLURAL:$9|削除}})",
-       "logentry-tag-update-logentry": "$1 がページ「$3」のエントリー $5 での記録のタグを{{GENDER:$2|更新しました}} ($6 が{{PLURAL:$7|追加}}、$8 が{{PLURAL:$9|削除}})",
+       "logentry-tag-update-logentry": "$1 がページ「$3」の記録項目 $5 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "rightsnone": "(なし)",
        "revdelete-summary": "編集内容の要約",
        "feedback-adding": "ページへのフィードバックの追加...",
        "duration-centuries": "$1 {{PLURAL:$1|世紀}}",
        "duration-millennia": "$1{{PLURAL:$1|,000 年}}",
        "rotate-comment": "画像を時計回りに $1 {{PLURAL:$1|度}}回転",
-       "limitreport-title": "パーサーのプロファイリング データ:",
+       "limitreport-title": "構文解析のプロファイリング データ:",
        "limitreport-cputime": "CPU 時間",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|秒}}",
        "limitreport-walltime": "実時間",
        "log-name-pagelang": "言語変更記録",
        "log-description-pagelang": "これはページ言語の変更の記録です。",
        "logentry-pagelang-pagelang": "$1 がページ $3 の言語を $4 から $5 に{{GENDER:$2|変更しました}}",
-       "default-skin-not-found": "ã\81\8aã\81£ã\81¨! ã\81\82ã\81ªã\81\9fã\81®ã\82¦ã\82£ã\82­ã\81®æ\97¢å®\9aã\81®å¤\96è£\85 <code>$1</code> ã\81¨ã\81\97ã\81¦å®\9a義ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b <code>$wgDefaultSkin</code> ã\81¯å\88©ç\94¨ã\81§ã\81\8dã\81¾ã\81\9bã\82\93ã\80\82\n\nã\81\82ã\81ªã\81\9fã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81«ã\81¯ä»¥ä¸\8bã\81®{{PLURAL:$4|skin|å¤\96è£\85}}ã\81\8cå\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82{{PLURAL:$4|it|å¤\96è£\85ã\81®æ\9c\89å\8a¹å\8c\96ã\81¨æ\97¢å®\9aã\81®é\81¸æ\8a\9e}}ã\81«ã\81¤ã\81\84ã\81¦ã\81¯ã\80\81[https://www.mediawiki.org/wiki/Manual:Skin_configuration ã\83\9eã\83\8bã\83¥ã\82¢ã\83«: å¤\96è£\85設å®\9a] ã\82\92ã\81\94覧ã\81\8fã\81 ã\81\95ã\81\84ã\80\82\n\n$2\n\n; MediaWikiã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81\9fã\81°ã\81\8bã\82\8aã\81®å ´å\90\88:\n: gitã\81\8bã\82\89ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81\9fã\81\8bã\80\81ã\81\9dã\81®ä»\96ã\81®ä½\95ã\82\89ã\81\8bã\81®æ\96¹æ³\95ã\81§ã\82½ã\83¼ã\82¹ã\82³ã\83¼ã\83\89ã\81\8bã\82\89ç\9b´æ\8e¥ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81\9få ´å\90\88ã\81«ã\81¯ã\80\81ã\81\93ã\82\8cã\81¯æ\9c\9få¾\85ã\81\95ã\82\8cã\81\9fã\81¨ã\81\8aã\82\8aã\81®å\8b\95ä½\9cã\81§ã\81\99ã\80\82[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ã\81\8bã\82\89å¤\96è£\85ã\82\92ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\97ã\81¦ã\81¿ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82\n:* [https://www.mediawiki.org/wiki/Download tarball installer] ã\82\92ã\83\80ã\82¦ã\83³ã\83­ã\83¼ã\83\89ã\81\97ã\81¦ã\81¿ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82ã\81\93ã\82\8cã\81«ã\81¯ã\81\84ã\81\8fã\81¤ã\81\8bã\81®å¤\96è£\85ã\81¨æ\8b¡å¼µæ©\9fè\83½ã\81\8cå\90«ã\81¾ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82 <code>skins/</code> ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªã\81\8bã\82\89ã\82³ã\83\94ã\83¼&ã\83\9aã\83¼ã\82¹ã\83\88ã\81§ã\81\8dã\81¾ã\81\99ã\80\82\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: ã\81\82ã\81ªã\81\9fã\81\8cMediaWikié\96\8bç\99ºè\80\85ã\81®å ´å\90\88ã\80\81ã\81\93ã\82\8cã\82\92è¡\8cã\81\86ã\81\93ã\81¨ã\81§ã\81\82ã\81ªã\81\9fã\81®gitã\83ªã\83\9dã\82¸ã\83\88ã\83ªã\81«å¹²æ¸\89ã\81\99ã\82\8bã\81\93ã\81¨ã\81¯ã\81\82ã\82\8aã\81¾ã\81\9bã\82\93ã\80\82\n\n; MediaWiki ã\82\92ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\97ã\81\9få ´å\90\88:\n: MediaWiki 1.24 ä»¥é\99\8dã\81®ã\83\90ã\83¼ã\82¸ã\83§ã\83³ã\81§ã\81¯ã\80\81ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«æ¸\88ã\81¿ã\81®å¤\96è£\85ã\81¯è\87ªå\8b\95ç\9a\84ã\81«ã\81¯æ\9c\89å\8a¹ã\81«ã\81ªã\82\8aã\81¾ã\81\9bã\82\93ã\80\82 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery ã\83\9eã\83\8bã\83¥ã\82¢ã\83«:å¤\96è£\85ã\81®è\87ªå\8b\95æ\8e¢ç´¢] ã\82\92ã\81\94覧ã\81\8fã\81 ã\81\95ã\81\84\80\82<code>LocalSettings.php</code> ã\81«ä»¥ä¸\8bã\81®{{PLURAL:$5|line|è¡\8c}}ã\82\92ã\83\9aã\83¼ã\82¹ã\83\88ã\81\97ã\81¦ã\80\81ç\8f¾å\9c¨ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8b{{PLURAL:$5|skin|å¤\96è£\85}}ã\82\92æ\9c\89å\8a¹ã\81«ã\81§ã\81\8dã\81¾ã\81\99ã\80\82\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>ã\82\92ç·¨é\9b\86ã\81\97ã\81\9fã\81°ã\81\8bã\82\8aã\81®å ´å\90\88:\n: å¤\96è£\85å\90\8dã\81«æ\89\93ã\81¡é\96\93é\81\95ã\81\84ã\81\8cã\81ªã\81\84ã\81\8bå\86\8d度確èª\8dã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82",
-       "default-skin-not-found-no-skins": "おっと! <code>$1</code>で定義されている、あなたのウィキの既定の外装 (<code>$wgDefaultSkin</code>)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりか更新したばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。MediaWikiの1.24およびそれ以降は、メインのリポジトリ内には任意の外装が含まれていません。[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。, by:\n:* 個々の外装 tarballs を[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] ダウンロードすること。\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。外装の有効化と既定の選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル:外装設定] をご覧ください。",
+       "default-skin-not-found": "あなたのウィキの既定の外装 <code>$1</code> として定義されている <code>$wgDefaultSkin</code> は利用できません。\n\nあなたのインストールには以下の{{PLURAL:$4|skin|外装}}が含まれています。{{PLURAL:$4|it|外装の有効化と既定の選択}}については、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル: 外装設定] をご覧ください。\n\n$2\n\n; MediaWikiをインストールしたばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。\n:* [https://www.mediawiki.org/wiki/Download tarball installer] をダウンロードしてみてください。これにはいくつかの外装と拡張機能が含まれています。 <code>skins/</code> ディレクトリからコピー&ペーストできます。\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。\n\n; MediaWiki をアップグレードした場合:\n: MediaWiki 1.24 以降のバージョンでは、インストール済みの外装は自動的には有効になりません。 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery マニュアル:外装の自動探索] をご覧ください)。<code>LocalSettings.php</code> に以下の{{PLURAL:$5|line|行}}をペーストして、現在インストールされている{{PLURAL:$5|skin|外装}}を有効にできます。\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>を編集したばかりの場合:\n: 外装名に打ち間違いがないか再度確認してください。",
+       "default-skin-not-found-no-skins": "<code>$1</code>で定義されている、あなたのウィキの既定の外装 (<code>$wgDefaultSkin</code>)は利用できません。\n\n外装をインストールしていません。\n\n; MediaWikiをインストールしたばかりか更新したばかりの場合:\n: gitからインストールしたか、その他の何らかの方法でソースコードから直接インストールした場合には、これは期待されたとおりの動作です。MediaWikiの1.24およびそれ以降は、メインのリポジトリ内には任意の外装が含まれていません。[https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] から外装をインストールしてみてください。, by:\n:* 個々の外装 tarballs を[https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] ダウンロードすること。\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: あなたがMediaWiki開発者の場合、これを行うことであなたのgitリポジトリに干渉することはありません。外装の有効化と既定の選択についての情報は、[https://www.mediawiki.org/wiki/Manual:Skin_configuration マニュアル:外装設定] をご覧ください。",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (有効)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''無効''')",
        "mediastatistics": "メディア統計",
index 2e1c848..37e963d 100644 (file)
        "createacct-emailoptional": "E-mailadress (walgfri)",
        "createacct-email-ph": "Intast dej e-mailadress",
        "createacct-another-email-ph": "Intast e-mailadress",
-       "createacct-captcha": "Sikerhedskontroll",
-       "createacct-imgcaptcha-ph": "Intast wenlist öwestoenje tekst",
        "createacct-submit": "Oprett det konto",
        "createacct-benefit-heading": "{{SITENAME}} laws å menske som du.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigiireng|redigiirenge}}",
        "unwatch": "Fjän öwewågneng",
        "watchlist-details": "Du har $1 {{PLURAL:$1|side|sider}} på din åvervågnengsliste (øn diskusjesider).",
        "wlshowlast": "Ves de seneste $1 têmer $2 dåg",
+       "watchlistall2": "åle",
        "watching": "Tilfye öwewågneng...",
        "unwatching": "Fjäne öwewågneng...",
        "deletepage": "Slett siid",
        "blanknamespace": "(Hwoet)",
        "contributions": "{{GENDER:$1|Brugebidraw}}",
        "mycontris": "Bidraw",
+       "anoncontribs": "Bidraw",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "uctop": "(siensti)",
        "month": "Månj:",
index 9c082b8..f5afec6 100644 (file)
        "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Kenapa sampeyan nggawe akun liyane",
-       "createacct-captcha": "Periksa kamanan",
-       "createacct-imgcaptcha-ph": "Lebokna tulisan ing dhuwur",
        "createacct-submit": "Gawé akun",
        "createacct-another-submit": "Gawé akun anyar",
        "createacct-benefit-heading": "{{SITENAME}} digawe karo wong-wong kaya sampeyan.",
index 01e467f..2ba2c7e 100644 (file)
        "createaccountreason": "მიზეზი:",
        "createacct-reason": "მიზეზი",
        "createacct-reason-ph": "რატომ ქმნით ახალ ანგარიშს?",
-       "createacct-captcha": "უსაფრთხოების შემოწმება",
-       "createacct-imgcaptcha-ph": "შეიყვანეთ ზემოთ მოცემული ტექსტი",
        "createacct-submit": "შექმენით თქვენი ანგარიში",
        "createacct-another-submit": "ანგარიშის შექმნა",
        "createacct-benefit-heading": "{{SITENAME}} შექმნილია თქვენნაირი ადამიანების მიერ.",
        "passwordreset-emailtext-ip": "ვიღაცამ (შესაძლოა თქვენ, ამ IP-მისამართიდან $1) მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "passwordreset-emailtext-user": "მომხმარებელმა $1 პროექტიდან {{SITENAME}} მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "passwordreset-emailelement": "მომხმარებლის სახელი: \n$1\n\nდროებითი პაროლი: \n$2",
-       "passwordreset-emailsent": "პაროლის თავიდან დასაყენებელი ელ.ფოსტა გაიგზავნა.",
+       "passwordreset-emailsentemail": "პაროლის თავიდან დასაყენებელი ელ.ფოსტა გაიგზავნა.",
        "passwordreset-emailsent-capture": "ქვემოთ ნაჩვენები პაროლის თავიდან დასაყენებელი წერილი გაიგზავნა.",
        "passwordreset-emailerror-capture": "ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც {{GENDER:$2|მომხმარებელთან}} ვერ მოხერხდა: $1 გამო",
-       "changeemail": "ელ-ფოსტის მისამართის შეცვლა",
+       "changeemail": "ელ-ფოსტის მისამართის შეცვლა ან წაშლა",
        "changeemail-header": "ანგარიშის ელ-ფოსტის მისამართის შეცვლა",
        "changeemail-no-info": "თქვენ ავტირიზებული უნდა იყოთ ამ გვერდთან უშუალო წვდომისთვის.",
        "changeemail-oldemail": "ელ-ფოსტის ამჟამინდელი მისამართი:",
        "templatesused": "ამ გვერდზე გამოყენებული {{PLURAL:$1|თარგი|თარგები}}:",
        "templatesusedpreview": "{{PLURAL:$1|თარგი, რომელიც|თარგები, რომლებიც}} წინასწარ გადახედვის გვერდზეა გამოყენებული:",
        "templatesusedsection": "ამ სექციაში გამოყენებული {{PLURAL:$1|თარგი|თარგები}}:",
-       "template-protected": "(დაცული)",
+       "template-protected": "(დაცული)",
        "template-semiprotected": "(ნახევრად დაცული)",
        "hiddencategories": "ეს გვერდი გაერთიანებულია $1 დამალულ კატეგორიაში.",
        "edittools": "<!-- აქ განთავსებული ტექსტი ნაჩვენები იქნება რედაქტირებისა და ატვირთვის ფორმების ქვეშ. -->",
        "prefs-watchlist-token": "კონტროლის სიის ტოკენი:",
        "prefs-misc": "სხვადასხვა",
        "prefs-resetpass": "შეცვალეთ პაროლი",
-       "prefs-changeemail": "á\83\94á\83\9a\83¤á\83\9dá\83¡á\83¢á\83\98á\83¡ á\83¨á\83\94á\83ªá\83\95ლა",
+       "prefs-changeemail": "á\83\94á\83\9a\83¤á\83\9dá\83¡á\83¢á\83\98á\83¡ á\83\9bá\83\98á\83¡á\83\90á\83\9bá\83\90á\83 á\83\97á\83\98á\83¡ á\83¨á\83\94á\83ªá\83\95á\83\9aá\83\90 á\83\90á\83\9c á\83¬á\83\90á\83¨ლა",
        "prefs-setemail": "ელ-ფოსტის მისამართის დაყენება",
        "prefs-email": "ელ-ფოსტის პარამეტრები",
        "prefs-rendering": "იერსახე",
        "rows": "რიგები:",
        "columns": "სვეტები",
        "searchresultshead": "ძიება",
-       "stub-threshold": "გაფორმების გასაუმჯობესებლად <a href=\"#\" class=\"stub\"> მოცემულია ესკიზების ბმულები</a> (ბაიტებში):",
+       "stub-threshold": "გაფორმების გასაუმჯობესებლად მოცემულია ესკიზის ბმული ($1):",
        "stub-threshold-sample-link": "მაგალითი",
        "stub-threshold-disabled": "გათიშულია",
        "recentchangesdays": "ბოლო ცვლილებებში საჩვენებელი დღეები:",
        "prefs-help-recentchangescount": "შეიცავს ახალ შესწორებებს, გვერდების ისტორიებს, ჟურნალებს.",
        "prefs-help-watchlist-token2": "ეს არის საიდუმლო გასაღები თქვენი კონტროლის სიის ვებ-არხისთვის. ნებისმიერს, ვინც იცის ის, შეუძლია წაიკითხოს თქვენი კონტროლის სია, ამიტომ არ გაუზიაროთ იგი სხვებს. [[Special:ResetTokens|თქვენ შეგიძლიათ ჩამოყაროთ ის]].",
        "savedprefs": "თქვენ მიერ შერჩეული პარამეტრები დამახსოვრებულია.",
+       "savedrights": "მომხმარებლის {{GENDER:$1|$1}} უფლებები შენახულია",
        "timezonelegend": "სასაათო სარტყელი:",
        "localtime": "ადგილობრივი დრო:",
        "timezoneuseserverdefault": "გამოიყენე ნაგულისხმევი პარამეტრები ($1)",
        "prefs-help-prefershttps": "ამ კონფიგურაციის არჩევა შედეგს გამოიღებს შემდგომი ავტორიზაციის შედმეგ.",
        "prefswarning-warning": "თქვენ შეიტანეთ ცვლილება თქვენ პარამეტრებში, რომელიც ჯერ კიდევ არ არის შენახული. თუ თქვენ დატოვებთ ამ გვერდს და არ დააჭერთ \"$1\"-ს, პარამეტრები არ იქნება განახლებული.",
        "prefs-tabs-navigation-hint": "რჩევა: თქვენ შეგიძლიათ გამოიყენოთ ისრის კლავიშები მარცხნივ ან მარჯვნივ ჩანართებსა და ჩანართბის სიას შორის არსებული გადასვლებისათვის",
-       "email-address-validity-valid": "ელ-ფოსტის მისამართი სწორად გამოიყურება",
-       "email-address-validity-invalid": "მიუთითეთ სწორი ელ-ფოსტის მისამართი",
        "userrights": "მომხმარებელთა უფლებების მართვა",
        "userrights-lookup-user": "მომხმარებელთა ჯგუფების მართვა",
        "userrights-user-editname": "შეიტანეთ მომხმარებლის სახელი:",
        "group-bot": "რობოტები",
        "group-sysop": "ადმინისტრატორები",
        "group-bureaucrat": "ბიუროკრატები",
-       "group-suppress": "á\83\96á\83\94á\83\93á\83\90á\83\9bá\83®á\83\94á\83\93á\83\95á\83\94á\83\9aები",
+       "group-suppress": "á\83 á\83\94á\83\95á\83\98á\83\96á\83\9dá\83 ები",
        "group-all": "(ყველა)",
        "group-user-member": "{{GENDER:$1|მომხმარებელი}}",
        "group-autoconfirmed-member": "{{GENDER:$1|ავტომატურად დადასტურებული მომხმარებელი}}",
        "grouppage-bot": "{{ns:project}}:რობოტები",
        "grouppage-sysop": "{{ns:project}}:ადმინისტრატორები",
        "grouppage-bureaucrat": "{{ns:project}}:ბიუროკრატები",
-       "grouppage-suppress": "{{ns:project}}:á\83\96á\83\94á\83\93á\83\90á\83\9bá\83®á\83\94á\83\93á\83\95á\83\94á\83\9aები",
+       "grouppage-suppress": "{{ns:project}}:á\83 á\83\94á\83\95á\83\98á\83\96á\83\9dá\83 ები",
        "right-read": "გვერდების წაკითხვა",
        "right-edit": "გვერდების რედაქტირება",
        "right-createpage": "გვერდების შექმნა (არა განხილვის გვერდებისა)",
        "rcshowhidemine": "ჩემი რედაქტირების $1",
        "rcshowhidemine-show": "ჩვენება",
        "rcshowhidemine-hide": "დამალვა",
+       "rcshowhidecategorization-show": "ჩვენება",
+       "rcshowhidecategorization-hide": "დამალვა",
        "rclinks": "ბოლო $1 ცვლილების ჩვენება უკანასკნელი $2 დღის მანძილზე<br />$3",
        "diff": "განსხ.",
        "hist": "ისტ.",
        "boteditletter": "რ",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 მომხმარებლის/ები კონტროლი]",
-       "rc_categories": "á\83\9bá\83®á\83\9dá\83\9aá\83\9dá\83\93 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\94á\83\91á\83\98á\83\93á\83\90á\83\9c (á\83\92á\83\90á\83\9cá\83\90á\83ªá\83\90á\83\9aá\83\99á\83\94á\83\95á\83\94á\83\97 \"|\"-á\83\98á\83¡ á\83\9bá\83\98á\83®á\83\94á\83\93á\83\95á\83\98á\83\97)",
+       "rc_categories": "á\83\9bá\83®á\83\9dá\83\9aá\83\9dá\83\93 á\83\99á\83\90á\83¢á\83\94á\83\92á\83\9dá\83 á\83\98á\83\94á\83\91á\83\98á\83\93á\83\90á\83\9c (á\83\92á\83\90á\83\9bá\83§á\83\9dá\83¤á\83\98 â\80\9e\80\9c)",
        "rc_categories_any": "არჩეულიდან ნებისმიერი",
        "rc-change-size": "$1",
        "rc-change-size-new": "ზომა ცვლილების შემდეგ არის: {{PLURAL:$1|ბაიტი|ბაიტი}}",
        "foreign-structured-upload-form-label-own-work": "ეს ჩემი პირადი ნამუშევარია",
        "foreign-structured-upload-form-label-infoform-categories": "კატეგორიები",
        "foreign-structured-upload-form-label-infoform-date": "თარიღი",
+       "foreign-structured-upload-form-label-own-work-message-shared": "მე ვადასტურებ, რომ ამ ფაილზე საავტორო უფლებების მფლობელი ვარ და ვთანხმდები ამ ფაილის შეუქცევადად განთავსებაზე ვიკისაწყობში [https://creativecommons.org/licenses/by-sa/4.0/deed.ka Creative Commons Attribution-ShareAlike 4.0] ლიცენზიით, აგრეთვე ვეთანხმები [https://wikimediafoundation.org/wiki/Terms_of_Use გამოყენების წესებს].",
        "backend-fail-stream": "ფაილი $1 ტრანსლირება ვერ მოხერხდა.",
        "backend-fail-backup": "ფაილი $1 სარეზერვო ასლის გაკეთება ვერ მოხერხდა.",
        "backend-fail-notexists": "ფაილი $1 არ არსებობს.",
        "wlheader-showupdated": "თქვენი ბოლო ვიზიტის შემდეგ შეცვლილი გვერდები, აღნიშნულია '''მუქად'''.",
        "wlnote": "ქვემოთ {{PLURAL:$1|ნაჩვენებია ბოლო ცვლილება|ნაჩვენებია ბოლო '''$1''' ცვლილება}} უკანასკნელი {{PLURAL:$2|საათის|'''$2''' საათის}} მანძილზე, $3, $4 მდგომარეობით.",
        "wlshowlast": "ბოლო $1 საათის $2 დღის ჩვენება",
+       "watchlistall2": "ყველა",
+       "wlshowtime": "აჩვენე უკანასკნელი:",
+       "wlshowhideminor": "მცირე რედაქტირების",
+       "wlshowhidebots": "რობოტების",
+       "wlshowhideliu": "რეგისტრირებული მომხმარებლების",
+       "wlshowhideanons": "ანონიმური მომხმარებლების",
+       "wlshowhidemine": "ჩემი რედაქტირება",
        "watchlist-options": "კონტროლის სიის პარამეტრები",
        "watching": "კონტროლებადი...",
        "unwatching": "არაკონტროლირებადი...",
        "logentry-contentmodel-change-revert": "დაბრუნება",
        "protectlogpage": "დაცვის ისტორია",
        "protectlogtext": "ქვემოთ წარმოდგენილია გვერდის დაცვის დონის ცვლილებების სია. \nიხილეთ ასევე [[Special:ProtectedPages|დაცული გვერდების სია]] ამ მომენტისთვის.",
-       "protectedarticle": "დაცულია გვერდი: „[[$1]]“",
+       "protectedarticle": "დაცულია გვერდი „[[$1]]“",
        "modifiedarticleprotection": "შეცვლილია დაცვის დონე გვერდისთვის „[[$1]]“",
        "unprotectedarticle": "„[[$1]]“-დან დაცვა მოხსნილია",
        "movedarticleprotection": "დაცვის პარამეტრების გადატანა გვერდიდან „[[$2]]“ გვერდზე „[[$1]]“",
        "undeletepagetext": "მომდევნო {{PLURAL:$1|გვერდი|$1 გვერდი}} წაშლილია, მაგრამ ჯერ კიდევ არქივშია და შესაძლებელია აღდგენა.\nარქივი შესაძლებელია პერიოდულად გასუფთავდეს.",
        "undelete-fieldset-title": "წინა ვერსიის აღდგენა",
        "undeleteextrahelp": "ამ გვერდის ისტორიის მთლიანად აღსადგენად დატოვეთ ყველა მოსანიშნი უჯრა ცარიელი და დააჭირეთ '''''{{int:undeletebtn}}'''''.\nნაწილობრივი აღდგენისათვის მონიშნეთ გვერდის ის ვერსიები, რომელთა აღდგენაც გსურთ და დააჭირეთ '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 ვერსიები დაარქივებულია",
+       "undeleterevisions": "$1 {{PLURAL:$1|ვერსია|ვერსია}} დაარქივებულია",
        "undeletehistory": "თუ გვერდს აღადგენთ, ყველა ვერსია აღდგება ისტორიაში.\nთუ ახალი გვერდი იგივე სახელით მისი წაშლის შემდეგ უკვე შეიქმნა, აღდგენილი ვერსიები გამოჩნდება წინა ისტორიაში.",
        "undeleterevdel": "აღდგენა არ შესრულდება, თუ ის გამოიწვევს გვერდის ბოლო ვერსიის ან ფაილის ნაწილობრივ წაშლას.\nასეთ შემთხვევაში თქვენ უნდა მოხსნათ ნიშნული ან აჩვენოთ ბოლო წაშლილი ვერსიები.",
        "undeletehistorynoadmin": "ეს სტატია წაშლილია. წაშლის მიზეზი ნაჩვენებია მოკლე ანოტაციაში ქვემოთ, იმ მომხმარებელთა დეტალებთან ერთად ვინც რედაქტირება გაუკეთა ამ გვერდს წაშლის წინ. იმ წაშლილი ტექსტების აქტუალური ვერსიები მიღწევადია მხოლოდ ადმინისტრატორებისათვის.",
        "contributions": "{{GENDER:$1|მომხმარებლის}} წვლილი",
        "contributions-title": "მომხმარებლის წვლილი $1",
        "mycontris": "წვლილი",
+       "anoncontribs": "წვლილი",
        "contribsub2": "მომხმარებელი {{GENDER:$3|$1}} წვლილი ($2)",
        "contributions-userdoesnotexist": "მომხმარებლის ანგარიში „$1“ არ არის რეგისტრირებული.",
        "nocontribs": "ძებნისას მითითებული პარამეტრების შესაბამისი არც ერთი ცვლილება ნაპოვნი არ არის",
        "cant-move-to-user-page": "თქვენ ვერ გადაიტანთ მომხმარებლის გვერდებს (გარდა მომხმარებელთა ქვეგვერდებისა)",
        "cant-move-category-page": "თქვენ არ გაქვთ კატეგორიის გვერდების გადამისამართების უფლება",
        "cant-move-to-category-page": "თქვენ არ გაქვთ გვერდების გადამისამართების უფლება კატეგორიის გვერდებში",
-       "newtitle": "ახალი სათაური",
+       "newtitle": "ახალი სათაური:",
        "move-watch": "ამ გვერდის კონტროლი",
        "movepagebtn": "გვერდის გადატანა",
        "pagemovedsub": "გადატანა შესრულებულია",
        "movenosubpage": "ამ გვერდს არა აქვს ქვეგვერდები",
        "movereason": "მიზეზი:",
        "revertmove": "გაუქმება",
-       "delete_and_move": "წაშლა და გადატანა",
        "delete_and_move_text": "==საჭიროა წაშლა==\n\nსტატია დასახელებით „[[:$1]]“ უკვე არსებობს. გსურთ მისი წაშლა გადატანისთვის ადგილის დასათმობად?",
        "delete_and_move_confirm": "დიახ, წაშალეთ ეს გვერდი",
        "delete_and_move_reason": "წაშლილია „[[$1]]“-დან გადატანისთვის ადგილის დასათმობად",
        "tooltip-pt-preferences": "თქვენი კონფიგურაცია",
        "tooltip-pt-watchlist": "გვერდების სია, რომელთა ცვლილებებს თქვენ უთვალთვალებთ",
        "tooltip-pt-mycontris": "თქვენი წვლილის სია",
+       "tooltip-pt-anoncontribs": "რედაქტირებების სია შესრულებული ამ IP მისამართიდან",
        "tooltip-pt-login": "სასურველია დარეგისტრირდეთ, თუმცა აუცილებელია არაა.",
        "tooltip-pt-logout": "გასვლა",
        "tooltip-pt-createaccount": "ჩვენ გთავაზობთ, შექმნათ ანგარიში და შეხვიდეთ სისტემაში; თუმცა ეს არ არის აუცილებელი",
        "markedaspatrolledtext": "არჩეული ვერსია [[:$1]] მონიშნულია როგორც პატრულირებული",
        "rcpatroldisabled": "ბოლო ცვლილებების პატრულირება აკრძალულია",
        "rcpatroldisabledtext": "ბოლო ცვლილებების პატრულირების შესაძლებლობა ამ მომენტისთვის გათიშულია",
-       "markedaspatrollederror": "á\83¨á\83\94á\83£á\83«á\83\9aá\83\94á\83\91á\83\94á\83\9aá\83\98á\83\90 á\83\90á\83\9b á\83¡á\83¢á\83\90á\83¢á\83\98á\83\98á\83¡ á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\95á\83\9cá\83\90 á\83\9eá\83\90á\83¢á\83 á\83£á\83\9aá\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\90á\83\93.",
+       "markedaspatrollederror": "á\83\94á\83¡ á\83¡á\83¢á\83\90á\83¢á\83\98á\83\90 á\83\9eá\83\90á\83¢á\83 á\83£á\83\9aá\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\90á\83\93 á\83\95á\83\94á\83  á\83\9bá\83\9dá\83\98á\83\9cá\83\98á\83¨á\83\9cá\83\90.",
        "markedaspatrollederrortext": "თქვენ უნდა მონიშნოთ ვერსია, რომელიც პატრულირებულად ჩაითვლება.",
        "markedaspatrollederror-noautopatrol": "თქვენ ვერ მონიშნავთ თქვენივე შესწორებებს პატრულირებულად.",
        "markedaspatrollednotify": "ეს ცვლილება გვერდზე „$1“ პატრულირებულად მოინიშნა.",
        "htmlform-cloner-create": "მეტის დამატება",
        "htmlform-cloner-delete": "წაშლა",
        "htmlform-cloner-required": "აუცილებელია სულ მცირე ერთი მნიშვნელობა.",
-       "htmlform-title-not-exists": "[[:$1]] არ არსებობს.",
+       "htmlform-title-not-exists": "$1 არ არსებობს.",
        "htmlform-user-not-exists": "<strong>$1</strong> არ არსებობს.",
        "htmlform-user-not-valid": "<strong>$1</strong> არ არის სწორი მომხმარებლის სახელი.",
        "sqlite-has-fts": "$1 სრული ტექსტის ძიების მხარდაჭერით",
index e06f053..4b97c43 100644 (file)
        "tog-hidepatrolled": "موجودہ وختہ بیرو تبدیلیان موژار گشتی ترمیماتن کھوشتاؤے",
        "tog-newpageshidepatrolled": "جدید صفحاتی فہرستہ گشتی صفحاتن کھوشاوے",
        "tog-extendwatchlist": "زیرِنظرفہرستو پھیلاؤ  کورے تاکہ ھیارا تھمامو ترمیمات غیچھی گیانی، نہ کہ صرفی تازہ ترین",
-       "tog-usenewrc": "اÙ\81زÙ\88دÛ\81 Ø­Ø§Ù\84Û\8cÛ\81 ØªØ¨Ø¯Û\8cÙ\84Û\8cاÙ\86 Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Ù\88رÛ\92 (JavaScript Ø¶Ø±Ù\88رت Ø¨Ù\88Û\8c)",
+       "tog-usenewrc": "حاÙ\84Û\8cÛ\81 ØªØ¨Ø¯Û\8cÙ\84Û\8cاÙ\86 Ø§Ù\88Ú\86Û\92 Ø²Û\8cر Ù\86ظر Ù\81Û\81رستÛ\81 ØªØ¨Ø¯Û\8cÙ\84Û\8cاÙ\86 Ø¨Ù\84حاظ ØµÙ\81Ø­Û\81 Ú¯Ø±Ù\88Û\81 Ø¨Ù\86دÛ\8c Ú©Ù\88رÛ\92",
        "tog-numberheadings": "سرخیانتے تان لمبار دیت",
-       "tog-showtoolbar": "تدÙ\88Û\8cÙ\86Û\8c Ø§Ù\88زارداÙ\86Ù\86 Ù¾Ø´Ø§Ø¤Û\92 ( JavaScript Ø¶Ø±Ù\88رت Ø¨Ù\88Û\8c)",
-       "tog-editondblclick": "کلکہ صفحاتن  ترمیم (JavaScript ضرورت بوی)",
+       "tog-showtoolbar": "ترÙ\85Û\8cÙ\85 Ú©Ù\88رÛ\8cÚ©Ù\88 Ø§Ù\88زاراÙ\86 Ù¾Ø´Ø§Ù\88Û\92",
+       "tog-editondblclick": "جو کلکہ صفحاتن ترمیم کورے",
        "tog-editsectiononrightclick": "سطری عنواناتا فروسکی کلکو ذریعا سطری ترمیم کاریو فعال ساؤزاوے",
        "tog-watchcreations": "مہ مرتب کاردو صفحاتن مہ  زیرِنظرفہرستہ شامل کورے",
        "tog-watchdefault": "مہ ترمیم کاردو صفحاتن مہ  زیرِنظرفہرستہ شامل کورے",
@@ -41,6 +41,9 @@
        "tog-ccmeonemails": "دیگر ممبراننتے ارسال کاردو بشلی کغازان نقلان متے انزاوے",
        "tog-diffonly": "مختلفاتن موڑا صفحو مشمولاتن مو پشاوے",
        "tog-showhiddencats": "پوشیدہ(کھوشت) زمرہ جاتن پشاوے",
+       "tog-norollbackdiff": "Undo کوریکار آچی فرقو ختم کورے",
+       "tog-useeditwarning": "غیر محفوظ تبدیلیان کی پیچھیتام متے لو دیت",
+       "tog-prefershttps": "لاگ ان ہال بیکو موژی ہمیشہ محفوظ کنیکشن استعمال کورے",
        "underline-always": "ہمیش",
        "underline-never": "کیاوت دی نو",
        "underline-default": "براوزرو طے شدہ",
        "june-date": "$1 جون",
        "july-date": "$1 جولائی",
        "august-date": "$1 اگست",
-       "september-date": "ستمبر",
+       "september-date": "$1 دسمبر",
        "october-date": "$1 اکتوبر",
        "november-date": "$1 نومبر",
        "december-date": "$1 دسمبر",
        "searcharticle": "Go/بوغے",
        "history": "تاریخچہ ء صفحہ",
        "history_short": "تاریخچہ",
+       "updatedmarker": "مہ آخری گیکا پت نوغ",
        "printableversion": "قابل طبع نسخہ",
        "permalink": "مستقل لنک",
        "print": "طباعت",
        "view-pool-error": "معذرت: تمام سرورا موجودہ وختہ اِضافی بوجھ شیر.\nبو زیادہ صارفین موجودہ وختہ ھیہ صفحو لاڑینیان \nبرائے مہربانی! صفحو لوڑیکو بچے دوبارہ کوشش کوریکاری پروشٹی پھوکرو انتظار کورے.\n\n$1",
        "generic-pool-error": "معذرت: تمام سرورا موجودہ وختہ اِضافی بوجھ شیر.\nبو زیادہ صارفین موجودہ وختہ ھیہ صفحو لاڑینیان \nبرائے مہربانی! صفحو لوڑیکو بچے دوبارہ کوشش کوریکاری پروشٹی پھوکرو انتظار کورے.\n\n$1",
        "pool-errorunknown": "نامعلوم خطا",
+       "poolcounter-usage-error": "استعمالہ خامی: $1",
        "aboutsite": "تعارف {{SITENAME}}",
        "aboutpage": "Project:کھوار ویکیپیڈیو تعارف",
        "copyright": "تمام مواد $1 تحتہ میانسار شیر",
        "disclaimers": "اعلانات",
        "disclaimerpage": "Project:عام اعلان",
        "edithelp": "مدد براۓ ترمیم",
+       "helppage-top-gethelp": "مدد",
        "mainpage": "آویلو صفحہ",
        "mainpage-description": "سرورق",
        "policy-url": "Project:حکمتِ عملی",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "retrievedfrom": "‘‘$1’’ نقل کاردو",
        "youhavenewmessages": "تہ بچے ای $1 شیر۔ ($2)",
+       "newmessageslinkplural": "{{PLURAL:$1|نوغ پیغام|999=نوغ پیغاماتs}}",
+       "newmessagesdifflinkplural": "آخری {{PLURAL:$1|تبدیلی|تبدیلی}}",
        "youhavenewmessagesmulti": "ء$1 تہ بچے نوغ نوغ پیغامات شینی",
        "editsection": "ترمیم",
        "editold": "ترمیم",
        "hidetoc": "کھوشتاوے",
        "collapsible-collapse": "خاتمہ/Collapse",
        "collapsible-expand": "فراخ کورے",
+       "confirmable-confirm": "کیا {{GENDER:$1|تتے}} ھیہ لوو یقین شیرا؟",
        "confirmable-yes": "Yes/دی",
        "confirmable-no": "نو",
        "thisisdeleted": "لوڑے  یا بحال کورے $1",
        "feed-rss": "آر ایس ایس",
        "red-link-title": "\n$1 (صفحہ موجود نیکی)",
        "sort-descending": "ترتیب نزولی",
+       "sort-ascending": "ترتیب صعودی",
        "nstab-main": "صفحہ",
        "nstab-user": "یوزرو صفحہ",
        "nstab-media": "صفحۂ میڈیا",
        "nstab-template": "سانچہ",
        "nstab-help": "مدد",
        "nstab-category": "زمرہ",
+       "mainpage-nstab": "آویلو صفحہ",
        "nosuchaction": "کیہ دی عمل نیکی",
        "nosuchactiontext": "URL ووشکیاری مختص کاردو عمل درست نو.\nتہ URL غلط نیویشیتاو، یا کیہ غیر صحیح ربطو پیرویو کوری آسوس.\n{{ھموش نامہ SITENAME زیرِ استعمال مصنع لطیفا چاریو نشاندہیو دی اندیشہ شیر}}.",
        "nosuchspecialpage": "کیہ ہش خاص صفحہ نیکی",
        "nospecialpagetext": "\"<big>'''تو ای ناقص خاص صفحہو بچے درخاس کوری آسوس.'''</big>\n\n{{درست خاص صفحاتن ای فھرست  [[Special:SpecialPages|{{int:specialpages}}]]  لوڑیکو بوس}}.\"",
        "error": "Error/خطاء",
        "databaseerror": "خطائے ڈیٹابیس",
+       "databaseerror-text": "ڈیٹا بیس کیوریا خامی پیدا بیتی شیر.\nھیہ سافٹ ویئراای مسئلہ (بگ)و نشاندیکو بوس.",
+       "databaseerror-textcl": "ڈیٹا بیس کیوریا خامی پیدا بیتی شیر.",
+       "databaseerror-query": "کیوری: $1",
+       "databaseerror-function": "فنکشن: $ 1",
+       "databaseerror-error": "خرابی: $ 1",
        "laggedslavemode": "Warning: Page may not contain recent updates.\nخبردار: منکھن شیر کہ صفحہا موجودہ بتاریخہ جات شامل نو بونی",
        "readonly": "ڈیٹابیسا قلف لیگی شیر",
        "enterlockreason": "قلفو بچے کیہ وجہ درج کورے، بشمولِ تخمینہ کہ قلفو کیاوت کھولاو کورونو بوئے",
        "filerenameerror": "مسلو \"$1\" و \"$2\" خور نم دیونو نو ھوی",
        "filedeleteerror": "مسلو \"$1\" حذف کورونو نو ھوی",
        "directorycreateerror": "رہنامچہ \"$1\" تخلیق کورونو نو ھوی",
+       "directoryreadonlyerror": "ڈائریکٹری \"$1\" صرف ریکو بچے.",
+       "directorynotreadableerror": "ڈائریکٹری \"$1\" ریکو قابلا نیکی.",
        "filenotfound": "مسلو \"$1\" تلاش کورونو نو ھوی",
        "unexpected": "غیرمتوقع قدر: \"$1\"=\"$2\"",
        "formerror": "خطا: کغاز انځینو نو ھوی",
        "badarticleerror": "ھیہ صفحہا ھیہ عمل انجام دیونو نو ھوی۔",
        "cannotdelete": "صفحہو $1 ڈیلیٹ کورونو نو ھوی۔ (ھیہ منکھن شیر کہ ھمو پروشٹی تان کا ڈیلیٹ کوری آسور۔)",
+       "cannotdelete-title": "صفحہ بوغین نو بوئے \"$1\"",
+       "delete-hook-aborted": "حذف شدگی روکا کورونو ہوئے\nوضاحت کورونو نو ہوئے",
        "badtitle": "خراب عنوان",
        "badtitletext": "'درخاس شدہ صفحہو عنوان ناقص، خالی، یا کیہ غلط ربط شدہ بین لسانی یا بین ویکی عنوان شیر.\nشاید ھیارا ای یا زیات ھݰ حروف موجود شینی کہ ھیت عنوانا استعمال نو بونیان.',",
        "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.",
        "querypage-no-updates": "ھیہ صفحہو بچے بتاریخات فی الحال ناقابل ساوزینو بیتی شینی. \nھمو ڈیٹا ھنیسے تازہ کورونو نو بوئے",
        "viewsource": "مسودو لوڑے",
+       "viewsource-title": "$1 و مسودو لوڑے",
        "actionthrottledtext": "بطورِ ای ضدسپم تدبیر، تہ مختصار وختہ کئی دفعہ ھیہ کورومو کوریکو وجھین محدود کورونو ہوئے، وا تو ھیہ حدو پار کوری آسوس.\nبراہِ کرم، ای کما میلیٹ آچہ کھوشش کورے",
        "protectedpagetext": "ھیہ صفحہو تدویناری محفوظ لاکھیکو بچے قلف لیگینو بیتی شیر",
        "viewsourcetext": "تو صرف مضمونو لوڑیکو بوس وا ھو نقل کوریکو بوس:",
+       "viewyourtext": "تو ھیہ موادو لوڑیکو بوس وا ھمو کاپی کوریکو بوس <strong>تہ  ترامیم</strong> ھیہ صفحہا۔",
        "protectedinterface": "ھیہ صفحہ مصنع‌لطیفو بچے سطح‌البینی متن فراہم کورویان، وا  ناجائزاستعمالو سدِبابو بچے ھمو قلف لیگینو بیتی شیر",
        "editinginterface": "\"'''خبردار:''' تو ای ھش صفحہو تدوینو کوروسان کہ ھیہ مصنع‌لطیفو بچے سطح‌البینی متن فراہم کورویان۔ ھیہ صفحہا کاردو ترمیم، دیگر ممبارانن بچے سطح‌البینو تبدیل کوروی۔\nبراہِ کرم، ترجمہ کوریکو بچے  [//translatewiki.net/wiki/Main_Page?setlang=en '''بیٹاویکی'''] (میڈیاویکی مقامیانی منصوبو) استعمال کورے.\",",
+       "translateinterface": "تمام ویکیپیڈا تبدیلی یا شامل کوریکو بچے، ھمو استعمال کورے [//translatewiki.net/ translatewiki.net]، میڈیا ویکی دارالترجمہ.",
        "namespaceprotected": "\"تتے '''$1''' فضائے نامہ صفحاتن تدوینو کوریکو اِجازت نیکی.\",",
+       "mycustomcssprotected": "تے ھیہ سی ایس ایس (CSS) صفحہا ترمیم کوریکو اختیار نیکی۔",
+       "mycustomjsprotected": "تتے ھیہ جاوا اسکپرٹ (JavaScript) صفحہا ترمیم کوریکو اختیار نیکی۔",
+       "myprivateinfoprotected": "تتے ھمی ذاتی معلواتہ (private information) ترمیم کویکو اختیار نیکی۔",
+       "mypreferencesprotected": "تتے تان ھمی ترجیحاتہ (preferences) ترمیم کوریکو اختیار نیکی۔",
        "ns-specialprotected": "خاص صفحاتن تدوین کوریکو اجازت نیکی",
        "titleprotected": "ھیہ عنوانو [[User:$1|$1]] تخلیق کوریکاری محفوظ کوری آسور.\nوجہ ھیہ شیر: \"''$2''\"",
        "virus-badscanner": "\"خراب وضعیت: نوژان وائرسی مفراس: ''$1''\",",
        "yourname": "اسمِ رکنیت",
        "userlogin-yourname": "اسمِ رکنیت",
        "userlogin-yourname-ph": "تان صارف نام درج کورے",
+       "createacct-another-username-ph": "صارف نامو درج کورے",
        "yourpassword": "کلمۂ شناخت(پاسورڈ)",
        "userlogin-yourpassword": "کلمۂ شناخت(پاسورڈ)",
        "userlogin-yourpassword-ph": "تان پاس ورڈو داخل کورے",
        "remembermypassword": "ھیہ براوزیرا مہ داخلِ نوشتگی معلوماتن یاد لاکھے (زیاتاری زیات $1 {{PLURAL:$1|بس|بسان}} بچے)",
        "userlogin-remembermypassword": "مہ داخل بہچاوے",
        "yourdomainname": "تہ ڈومین",
+       "password-change-forbidden": "تتے ھیہ ویکیپیڈیا تان پاس روڈو تبدیل کوریکو اختیار نیکی",
        "externaldberror": "یا تھے توثیقی ڈیٹابیسا خطا واقع بیتی شیر یا تتے بیریو کھاتو بتاریخ کوریکو اِجازت نیکی",
        "login": "داخل بوس",
        "nav-login-createaccount": "کھاتہ کھولاو کورے یا اندراج کورے",
        "userlogin-resetlink": "آوا داخل بیکو بچے تان تفصیلاتن روخڅی اسوم",
        "userlogin-resetpassword-link": "کلمہء شناختو روخڅیتام؟",
        "userlogin-helplink2": "لاگن کوراوا مدد کورے",
+       "userlogin-createanother": "کھاتہ ساوزاوے",
+       "createacct-emailrequired": "ای میل پتہ",
        "createacct-emailoptional": "ای میل ایڈریس (اختیاری)",
        "createacct-email-ph": "تان ای میلو داخل کورے",
-       "createaccountmail": "بذریعۂ بشلی ڈاک",
+       "createacct-another-email-ph": "تان ای میلو داخل کورے",
+       "createaccountmail": "عارضی پاسورڈ استعمال کورے وا ھورو ای میلا انزاوے",
+       "createacct-realname": "اصلی نام (اختیاری)",
        "createaccountreason": "وجہ:",
-       "createacct-captcha": "حفاظتی تدبیر",
-       "createacct-imgcaptcha-ph": "تو توری لوڑی نیویشے",
+       "createacct-reason": "وجہ",
+       "createacct-reason-ph": "تو ڈبل کھاتہ کھیوتے ساوزیسان؟",
        "createacct-submit": "کھاتہ ساوزاوے",
+       "createacct-another-submit": "کھاتہ ساوزاوے",
        "createacct-benefit-heading": "{{SITENAME}} تہ غون روئے ایڈٹ کورونیان.",
        "createacct-benefit-body1": "{{PLURAL:$1|ترمیم|ترامیم}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|صفحہ|صفحات}}",
        "badretype": "درج شدہ کلمۂ شناخت اصلو مطابقت نو لاکھویان",
        "userexists": "تو کہ نامو کہ درج کوری آسوس ھیس پروشٹیاری استعمالہ شیر۔ مختلف نام استعمال کورے",
        "loginerror": "داخلا غلطی",
+       "createacct-error": "اکاونٹ کھولاو کوریکا نقص شیر",
        "createaccounterror": "کھاتہ $1 ساوزینو نو بویان",
        "noname": "تو تان صحیح اسم صارفو داخل نو آرو",
        "loginsuccesstitle": "داخلہ کامیاب",
        "listgrouprights-namespaceprotection-namespace": "نامو ژاغہ:",
        "emailuser": "ممباروت بشلی کغاز انڅاوے",
        "emailuser-title-notarget": "ای میل صارف",
-       "emailpage": "ممباروت بشلی کغاز انځاوے",
        "emailusername": "ممبارو نم",
        "emailusernamesubmit": "داخل کورے",
        "emailfrom": "ری",
        "unwatch": "زیرنظرمنسوخ",
        "watchlist-details": " تہ زیرِنظرفہرستا {{PLURAL:$1|$1 صفحہ شیر|$1 صفحات شینی}}، ھیارا تبادلۂ خیالو صفحاتن تعداد شامل نیکی.",
        "wlshowlast": "پشاوے آخری $1 گھنٹو $2 آنوسو",
+       "watchlistall2": "سف",
        "watchlist-options": "واچ لسٹ آپشن",
        "watching": "زیر نظر",
        "unwatching": "منسوخ",
        "contributions": " $1 صارفو حصہ",
        "contributions-title": "$1 صارفو حصہ",
        "mycontris": "مہ حصہ",
+       "anoncontribs": "آرٹیکلز",
        "contribsub2": "براۓ $1 ($2)",
        "uctop": "(ٹیکہ)",
        "month": "مس (وا ھیغاری پروشٹی):",
        "block-log-flags-nocreate": "کھاتہ کھولاو کوریکو سورا پاوپندی شیر",
        "ipb_expiry_invalid": "Expiry ٹیم غلط شیر.",
        "move-page-legend": "مـنـتـقـل کـورے",
-       "movearticle": "مـنـتـقـل کـورے",
        "newtitle": "نوغ عنوان",
        "move-watch": "صفحہ زیر نظر",
        "movepagebtn": "منتقل",
index 50f6572..ca6843b 100644 (file)
        "newwindow": "(zerrê pençerê dê newey de beno ra)",
        "cancel": "Bıtexelne",
        "moredotdotdot": "Jêde...",
-       "mypage": "Pela mı",
+       "mypage": "Pele",
        "mytalk": "Hurênayişê mı",
        "anontalk": "Pela hurênaisê ni ''IP''y",
        "navigation": "Pusula",
        "nlinks": "$1 {{PLURAL:$1|gire|girey}}",
        "nmembers": "$1 {{PLURAL:$1|eza|ezay}}",
        "nrevisions": "$1 {{PLURAL:$1|çım-ra-viarnais|çım-ra-viarnaişi}}",
-       "nviews": "$1 {{PLURAL:$1|vênais|vênaişi}}",
        "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "prefixindex": "Peli pêro be verbend",
        "shortpages": "Pelê kılmi",
        "listgrouprights-addgroup-all": "Heme grubu ilawe ke",
        "listgrouprights-removegroup-all": "Heme grubu wedare",
        "emailuser": "Nê karberi rê e-poste bırusne",
-       "emailpage": "Karberi rê e-poste bırusne",
        "emailfrom": "Kami ra:",
        "emailto": "Kami rê:",
        "emailsubject": "Mewzu:",
        "unwatch": "Şêr meke",
        "watchlist-details": "Pelunê hurênaişi ra qêri {{PLURAL:$1|$1 pele lista şêrkerdişi dera|$1 peli lista şêrkerdişi derê}}.",
        "wlshowlast": "$1 saetunê $2 rozunê peyênu bıasne",
+       "watchlistall2": "pêro",
        "watchlist-options": "Alternatifê lista şêrkerdene",
        "watching": "Şêr ke…",
        "unwatching": "Şêr meke…",
        "ipb_expiry_invalid": "Xêlê zeman nêvêreno.",
        "movepagetext": "Ebe gurênayena formê cêrêni namê jü pele vurino, qeydê cıyê verêni pêro tede sonê be namê newey ser.\nNamewo khan jü pela de cihetiyê be namê neweyi cêna.\nTı şikina ita de cihetu otomatikman hetê namê oricinali ser rocane kerê.\nEke tı nêwazena otomatikman bıkerê, gunê [[Special:DoubleRedirects|cihetunê çıftu]] ya ki [[Special:BrokenRedirects|cihetunê nêvêrdeyu]] pêroyine be ho duz kerê.\nHo vira meke ke be na vurnaiso ke tı kena, gurênayisê girêwu be cawunê rastu pêroyine ra tı mesula.\n\nDiqet ke, namê neweyi de hora ke jü made esto, vurnayisê nameyi <strong>nêbeno</strong>, wa no ke thalo ya ki jü cihetiserberdiso u vurnayisê huyo verên çino. No yeno na mana ke tı şikina namê jü pele peyser bıcêrê, koti ra ke namê aye vuriyo, beno ke to ğelet kerd û zobina ki qarısê pela de bine nêbena.\n\n<strong>Teme!</strong>\nNo vurnayis beno ke serba jü pela populere neticunê nêbiyawu biyaro meydan;\nkerem ke, verê vurnayişi neticunê biyawu biya be çımu ver.",
        "movepagetalktext": "Na pela hurênaişia ke tedera otomatikmen kırışina be namê newey, hama nê halu ra '''qêri''':\n*Jü pela hurênaişia pırre bınê namê newey de hora esta, ya ki\n*Qutiya bınêne to nêçinıte we.\n\nNê halu de, tı gunê pele ebe dest berê ya ki ser kerê eke wajiye.",
-       "movearticle": "Pele bere:",
        "newtitle": "Ebe nameo newe:",
        "move-watch": "Na pele de şêr ke",
        "movepagebtn": "Pele bere",
        "specialpages-group-pages": "Listê pelun",
        "specialpages-group-pagetools": "Hacetê pele",
        "specialpages-group-wiki": "Daê ''Wiki''y u haceti",
-       "specialpages-group-redirects": "Newe-vırastena pelunê xususiyun",
+       "specialpages-group-redirects": "Pelê sersıkıtışiyê xısusiyi",
        "specialpages-group-spam": "Hacetê ''spam''i",
        "blankpage": "Pela thale",
        "external_image_whitelist": "  #no satır zey xo verde/raverde<pre>\n#parçeyê ifadeya rêzbiyayeyani (têna zerreyê ıney de // ) u çıtayo/çiyo zi mende cêr de têare kerê.\n#ney URL ya (hotlink) resmê teberi de hemcıta benî.\n#Ê yê ke hemcıt (eşleşmek-hemçift) biyê zey resımi asenî, eqsê hal de zi zey gıreyê resmi aseno.\nsatır ê ke pê ney # # destpêkenê zey mışore/mıjore muamele vineno.\n#herfa gırd û qıci ferq nêkeno\n\n#parçeyê ifadeya rêzbiyayeyani bıerzê serê ney satıri. no satır zey xo verde/raverde </pre>",
index e904f3b..a19fea6 100644 (file)
@@ -20,6 +20,7 @@
        "tog-hideminor": "Жуықтағы өзгерістерден шағын өңдемелерді жасыру",
        "tog-hidepatrolled": "Тексерілген өңдеулерді жуықтағы өзгерістер тізімінде көрсетпеу",
        "tog-newpageshidepatrolled": "Тексерілген беттерді жаңа беттер тізімінде жасыру",
+       "tog-hidecategorization": "Беттерді санаттауларды жасыру",
        "tog-extendwatchlist": "Бақылау тізімді ұлғайтып барлық өзгерістерді көрсету, ең соңғыларды ғана емес",
        "tog-usenewrc": "Жуықтағы өзгерістер және бақылау тізімінде беті бойынша өзгерістерді топтау",
        "tog-numberheadings": "Мазмұн тақырыптарын автоматты нөмірлеу",
@@ -49,6 +50,7 @@
        "tog-watchlisthideliu": "Бақылау тізіміндегі кірген қатысушылардың өңдеулерін көрсетпеу",
        "tog-watchlisthideanons": "Бақылау тізіміндегі аноним қатысушылардың өңдеулерін көрсетпеу",
        "tog-watchlisthidepatrolled": "Бақылау тізімінде тексерілген өңдеулерді көрсетпеу",
+       "tog-watchlisthidecategorization": "Беттерді санаттауларды жасыру",
        "tog-ccmeonemails": "Басқа қатысушыға жіберген хатымның есесін өзіме жөнелту",
        "tog-diffonly": "Нұсқалар айырмашылықтарының астында бет мағлұматын көрсетпеу",
        "tog-showhiddencats": "Жасырын санаттарды көрсету",
        "category-file-count-limited": "Ағымдағы санатта келесі $1 файл бар.",
        "listingcontinuesabbrev": "(жалғ.)",
        "index-category": "Индекстелген беттер",
-       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмеген беттер",
+       "noindex-category": "Ð\98ндекÑ\81Ñ\82елмейÑ\82Ñ\96н беттер",
        "broken-file-category": "Ақаулы файлдық сілтемелері бар беттер",
        "about": "Жоба туралы",
        "article": "Мағлұмат беті",
        "morenotlisted": "Бұл тізім толық емес.",
        "mypage": "Жеке бет",
        "mytalk": "Талқылау",
-       "anontalk": "IP талқылауы",
+       "anontalk": "Талқылау",
        "navigation": "Бағыттау",
        "and": "&#32;және",
        "qbfind": "Табу",
        "createaccountreason": "Себебі:",
        "createacct-reason": "Себебі:",
        "createacct-reason-ph": "Неге басқа тіркегі жасамақшысыз",
-       "createacct-captcha": "Құпиялық тексеруі",
-       "createacct-imgcaptcha-ph": "Жоғарыдағы мәтінді енгізіңіз",
        "createacct-submit": "Тіркелгіңізді жасаңыз",
        "createacct-another-submit": "Тіркелгі жасау",
        "createacct-benefit-heading": "{{SITENAME}} сіздермен жасалады.",
        "passwordreset-emailtext-ip": "Әлде кім (мүмкін сіз болуыңыз, $1 IP адресінен) {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунты|аккаунттары}} осы электронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз  бұрынғы құпия сөзіңізді еске түсірсеңіз және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрынғы құпия сөзді қолдана беруіңізге болады.",
        "passwordreset-emailtext-user": "$1 есімді қатысушы {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунт|аккаунттар}} осы електронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз  бұрынғы құпия сөзіңізді еске түсірсеңіз, және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрыңғы құпия сөзді қолдана беруіңізге болады.",
        "passwordreset-emailelement": "Қатысушы есімі: \n$1\n\nУақытша құпия сөз: \n$2",
-       "passwordreset-emailsent": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді.",
+       "passwordreset-emailsentemail": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді.",
        "passwordreset-emailsent-capture": "Құпия сөзді өзгерту электронды пошта арқылы жөнелтілді, ол төменде көрсетілген.",
        "passwordreset-emailerror-capture": "Құпиясөзді өзгерту электрон хаты жасалды, ол төменде көрсетілген, бірақ ол {{GENDER:$2|қатысушыға}} жөнелтілмеді: $1",
        "changeemail": "Е-пошта мекенжайын өзгерту немесе аластау",
        "changeemail-password": "{{SITENAME}} жобасындағы құпия сөзіңіз:",
        "changeemail-submit": "Е-поштаны өзгерту",
        "changeemail-throttled": "Сіз жақында кіруге тым көп әрекет жасадыңыз.\nҚайта байқап көру үшін $1 уақыт күте тұрыңыз.",
+       "changeemail-nochange": "Басқа жаңа email мекенжайын енгізіңіз.",
        "resettokens": "Байрақшаны ысыру",
        "resettokens-text": "Мұнда сіз құпия дерекке қатысты тіркелгіңізге қатынауға рұқсат ететін байрақшаны ысыра аласыз.\n\nЕгер сіздің тіркелгіңіз бұзылған болса, егер сіз абайсызда қандай да біреумен бөліссеңіз, сіз мұны істеуіңіз керек.",
        "resettokens-no-tokens": "Мұнда ысыруға байрақша жоқ.",
        "session_fail_preview_html": "<strong>Кешіріңіз! Сессия деректері жоғалуы салдарынан өңдемеңізді бітіре алмаймыз.</strong>\n\n<em>Сондықтан {{SITENAME}} жобасында қам HTML қосылған, JavaScript шабуылдардан қорғану үшін алдын ала қарап шығу жасырылған.</em>\n\n<strong>Егер бұл өңдеме адал ниетті әрекет болса қайта байқап көріңіз.</strong> \nЕгер бұл әлі істемесе [[Special:UserLogout|шығуды]] және қайта кіруді байқап көріңіз.",
        "token_suffix_mismatch": "<strong>Өңдемеңіз тайдырылды, себебі тұтынғышыңыз өңдеме деректер бумасындағы тыныс белгілерін бүлдіртті.\nБет мәтіні бүлінбеу үшін өңдемеңіз тайдырылады.</strong>\nБұл кей уақытта қатесі толған веб-негізінде тіркелуі жоқ прокси-серверді пайдаланған болуы мүмкін.",
        "edit_form_incomplete": "<strong>Өңдеу пішінінің кейбір бөліктері серверге жетпеді; өңдемелеріңіздің бұзылмағандығына екі рет бақылау жүргізіңіз және қайта байқап көріңіз.</strong>",
-       "editing": "Өңделуде: $1",
+       "editing": "$1 бетін өңдеп жатырсыз",
        "creating": "Жаңадан бастау: $1",
-       "editingsection": "Өңделуде: $1 (бөлімі)",
-       "editingcomment": "Өңделуде: $1 (жаңа бөлім)",
+       "editingsection": "$1 бетінің бөлімін өңдеп жатырсыз",
+       "editingcomment": "$1 бетін өңдеп жатырсыз (жаңа бөлім)",
        "editconflict": "Өңдемелер қақтығысы: $1",
        "explainconflict": "Осы бетті сіз өңдей бастағанда басқа біреу бетті өзгерткен.\nЖоғарғы мәтін аумағында қазіргі уақытта бар бет мәтінінен тұрады.\nТөменгі мәтін аумағында сіздің өзгертулеріңіз көрсетіледі.\nӨзгертуіңізді бар мәтінге біріктіруге тура келеді.\n«{{int:savearticle}}» батырмасын басқанда </strong>тек</strong> жоғарғы мәтін аумағы сақталады.",
        "yourtext": "Мәтініңіз",
        "prefs-watchlist-token": "Бақылау тізімінің белгісі:",
        "prefs-misc": "Әрқилы",
        "prefs-resetpass": "Құпия сөзді өзгерту",
-       "prefs-changeemail": "E-mail мекен-жайын өзгерту",
+       "prefs-changeemail": "E-mail мекенжайын өзгерту немесе алып тастау",
        "prefs-setemail": "E-mail мекен-жайын жөндеу",
        "prefs-email": "Е-пошта баптаулары",
        "prefs-rendering": "Сырт көрініс",
        "rows": "Жолдар:",
        "columns": "Бағандар:",
        "searchresultshead": "Іздеу",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">Бастама сілтемесін</a> пішімдеу табалдырығы (байт):",
+       "stub-threshold": "Бастама сілтемесін пішімдеу табалдырығы ($1):",
        "stub-threshold-sample-link": "қарапайым",
        "stub-threshold-disabled": "Ажыратылған",
        "recentchangesdays": "Жуықтағы өзгерістерде көрсетілетін күн саны:",
        "prefs-help-prefershttps": "Бұл баптауды келесі кіргеніңізде әсерін көре аласыз.",
        "prefswarning-warning": "Сіз баптауларыңыздағы жасаған өзгерістеріңіз сақталмайды.\nЕгер сіз «$1» дегенді баспай бұл беттен кетсеңіз баптауларыңыз жаңартылмайды.",
        "prefs-tabs-navigation-hint": "Кеңес: Сіз қойындылар тізімінде қойындылар арасында жылжу үшін сол жақ және оң жақ көрсеткі пернелерін пайдалануыңызға болады.",
-       "email-address-validity-valid": "Е-почта мекенжайы жарамдылығы анықталды",
-       "email-address-validity-invalid": "Жарамсыз электронды пошта мекен-жайын енгізіңіз",
        "userrights": "Қатысушы құқықтарын реттеу",
        "userrights-lookup-user": "Қатысушы топтарын реттеу",
        "userrights-user-editname": "Қатысушы атын енгізіңіз:",
        "group-bot": "Боттар",
        "group-sysop": "Әкімшілер",
        "group-bureaucrat": "Бітікшілер",
-       "group-suppress": "ШеÑ\82Ñ\82еÑ\82Ñ\83Ñ\88Ñ\96леÑ\80",
+       "group-suppress": "Ð\91аÑ\81Ñ\82Ñ\8bÑ\80Ñ\83Ñ\88Ñ\8b",
        "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|шеттетуші}}",
+       "group-suppress-member": "{{GENDER:$1|бастырушы}}",
        "grouppage-user": "{{ns:project}}:Қатысушылар",
        "grouppage-autoconfirmed": "{{ns:project}}:Өздіктіқұпталған қатысушылар",
        "grouppage-bot": "{{ns:project}}:Боттар",
        "grouppage-sysop": "{{ns:project}}:Әкімшілер",
        "grouppage-bureaucrat": "{{ns:project}}:Бітікшілер",
-       "grouppage-suppress": "{{ns:project}}:ШеÑ\82Ñ\82еÑ\82Ñ\83Ñ\88Ñ\96леÑ\80",
+       "grouppage-suppress": "{{ns:project}}:Ð\91аÑ\81Ñ\82Ñ\8bÑ\80Ñ\83",
        "right-read": "Беттерді оқу",
        "right-edit": "Беттерді өңдеу",
        "right-createpage": "Беттерді бастау (талқылау емес беттерді бастау)",
        "right-hideuser": "Баршадан жасырып, қатысушы атын бұғаттау",
        "right-ipblock-exempt": "IP бұғаттауларды, өзбұғаттауларды және ауқым бұғаттауларды орағыту",
        "right-proxyunbannable": "Прокси серверлердің өзбұғаттауларын орағыту",
-       "right-unblockself": "Бұғаттаудан шығару",
+       "right-unblockself": "Өзін бұғатынан шығару",
        "right-protect": "Қорғау деңгейлерін өзгерту және баулы-қорғаулы беттерді өңдеу",
        "right-editprotected": "Қорғалған беттерді өңдеу \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Қорғалған беттерді өңдеу \"{{int:protect-level-autoconfirmed}}\"",
        "action-mergehistory": "Бұл беттің өзгеріс тарихын қосу",
        "action-userrights": "Қатысушылардың барлық құқықтарын өзгерту",
        "action-userrights-interwiki": "Басқа уикилердегі қатысушылардың құқықтарын өзгерту",
-       "action-siteadmin": "Дерекқорды бұғаттау немесе бұғаттан шығару",
+       "action-siteadmin": "Дерекқорды құлыптау және құлыптауын өшіру",
        "action-sendemail": "электронды хаттарды жіберу",
        "action-editmywatchlist": "бақылауыңызды өңдеу",
        "action-viewmywatchlist": "бақылау тізіміңізді қарау",
        "rcshowhidemine": "Өңдемелерімді $1",
        "rcshowhidemine-show": "көрсету",
        "rcshowhidemine-hide": "жасыру",
+       "rcshowhidecategorization": "Бет санаттауларын $1",
+       "rcshowhidecategorization-show": "Көрсету",
+       "rcshowhidecategorization-hide": "Жасыру",
        "rclinks": "Соңғы $2 күнде болған соңғы $1 өзгерісті көрсет<br />$3",
        "diff": "айырм",
        "hist": "тарихы",
        "recentchangeslinked-page": "Бет атауы:",
        "recentchangeslinked-to": "Керісінше, келтірілген бетке сілтейтін беттердегі өзгерістерді көрсет",
        "recentchanges-page-added-to-category": "[[:$1]] бетіне санат қосты",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] және {{PLURAL:$2|бір бет|$2 бет}} санатқа қосылды",
+       "recentchanges-page-removed-from-category": "[[:$1]] санаттан алынды",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] және {{PLURAL:$2|бір бет|$2 бет}} санаттан алынды",
+       "autochange-username": "МедиаУики өздікті өзгерісі",
        "upload": "Файл жүктеу",
        "uploadbtn": "Файлды жүктеу",
        "reuploaddesc": "Жүктеу пішініне қайта келу.",
        "filerevert-legend": "Файлды қайтару",
        "filerevert-intro": "Сіз  '''[[Media:$1|$1]]''' дегенді [$3, $2 кезіндегі $4 нұсқасына] қайтарудасыз.",
        "filerevert-comment": "Себебі:",
-       "filerevert-defaultcomment": "$2, $1 кезіндегі нұсқасына қайтарылды",
+       "filerevert-defaultcomment": "$2, $1 ($3) кезіндегі нұсқасына қайтарылды",
        "filerevert-submit": "Қайтару",
        "filerevert-success": "'''[[Media:$1|$1]]''' деген [$3, $2 кезіндегі $4 нұсқасына] қайтарылды.",
        "filerevert-badversion": "Келтірілген уақыт белгісімен бұл файлдың алдыңғы жергілікті нұсқасы жоқ.",
        "mimesearch-summary": "Бұл бетте файлдарды MIME түрімен сүзгілеуі қосылған.\nКірісі: мағлұмат_түрі/түр_тарауы не мағлұмат_түрі/*, мысалы <code>image/jpeg</code>.",
        "mimetype": "MIME түрі:",
        "download": "Түсіріп алу",
-       "unwatchedpages": "Бақыланылмаған беттер",
+       "unwatchedpages": "Бақыланбаған беттер",
        "listredirects": "Айдағыш бет тізімі",
        "listduplicatedfiles": "Телнұсқалы файлдар тізімі",
        "listduplicatedfiles-summary": "Бұл кейбір басқа файлдың ең соңғы нұсқалы файлдың ең соңғы телнұсқасы файлдардың тізімі. Тек жергілікті файлдар есептелінеді.",
        "specialpage-empty": "Бұл сұраныс бойынша нәтиже жоқ.",
        "lonelypages": "Еш беттен сілтелмеген беттер",
        "lonelypagestext": "Келесі беттерге {{SITENAME}} жобасындағы басқа беттерінің ішіндегі кірікбеттер сілтемейді.",
-       "uncategorizedpages": "СанаÑ\82Ñ\81Ñ\8bз беттер",
+       "uncategorizedpages": "СанаÑ\82Ñ\82алмаÒ\93ан беттер",
        "uncategorizedcategories": "Санатсыз санаттар",
        "uncategorizedimages": "Санатсыз файлдар",
        "uncategorizedtemplates": "Санатсыз үлгілер",
        "unusedimages": "Пайдаланылмаған файлдар",
        "wantedcategories": "Басталмаған санаттар",
        "wantedpages": "Басталмаған беттер",
-       "wantedpages-summary": "Оларға тек бағыттап сілтейтін беттерді қоспағанда, өте көп сілтенген жоқ беттер тізімі. Оларға бағыттап жоқ беттерге сілтейтін тізім үшін келесі бетті қараңыз: [[{{#special:BrokenRedirects}}]].",
+       "wantedpages-summary": "Оларға тек бағыттап сілтейтін беттерді қоспағанда, өте көп сілтенген әзірге басталмаған беттер тізімі. Жойылған беттерге сілтейтін тізім үшін келесі бетті қараңыз: [[{{#special:BrokenRedirects}}|жарамсыз айдағыштар тізімі]].",
        "wantedpages-badtitle": "Нәтиже жиынындағы жарамсыз атау: $1",
        "wantedfiles": "Басталмаған файлдар",
        "wantedfiletext-cat": "Келесі файлдар қолданылған бірақ жоқ. Бар болғанына қарамастан файлдар сыртқы қорларда тізімделген болуы мүмкін. Кез келген осындай жарамсыз боямалар <del>үстінен сызылып</del> белгіленеді. Сонымен қатар, бар емес файлдарды ендіру беттері [[:$1]] бетінде тізімделген.",
        "listusers-noresult": "Қатысушы табылған жоқ.",
        "listusers-blocked": "(бұғатталған)",
        "activeusers": "Белсенді қатысушылар тізімі",
-       "activeusers-intro": "Ð\91ұл Ñ\82Ñ\96зÑ\96м Ñ\81оңÒ\93Ñ\8b $1 {{PLURAL:$1|күнде|күнде}} Ò\9bандай Ð´Ð° Ð±Ñ\96Ñ\80 Ñ\96Ñ\81\99Ñ\80екеÑ\82 Ð¶Ð°Ñ\81аÒ\93ан Ò\9bаÑ\82Ñ\8bÑ\81Ñ\83Ñ\88Ñ\8bлаÑ\80 Ñ\82Ñ\96зÑ\96мÑ\96.",
+       "activeusers-intro": "Бұл соңғы $1 {{PLURAL:$1|күнде|күнде}} қандай да бір іс-әрекет жасаған қатысушылар тізімі.",
        "activeusers-count": "соңғы {{PLURAL:$3|күнде|$3 күнде}} $1 {{PLURAL:$1|әрекет|әрекет}}",
        "activeusers-from": "Мынадан басталатын қатысушыларды көрсет:",
        "activeusers-hidebots": "Боттарды жасыру",
        "wlheader-showupdated": "Соңғы келіп-кетуіңізден бері өзгертілген беттер '''жуан''' қаріпімен көрсетіледі.",
        "wlnote": "Төменде $3, $4 кезіне дейінгі соңғы {{PLURAL:$2|сағатта|<strong>$2</strong>  сағатта}} болған, {{PLURAL:$1|жуықтағы өзгеріс|жуықтағы <strong>$1</strong>  өзгеріс}} көрсетіледі.",
        "wlshowlast": "Соңғы $1 сағаттағы, $2 күндегіні көрсету",
+       "watchlistall2": "барлық",
+       "watchlist-hide": "Жасыру",
+       "wlshowtime": "Соңғысын көрсету:",
+       "wlshowhideminor": "шағын өңдемелер",
+       "wlshowhidebots": "боттар",
+       "wlshowhideliu": "тіркелген қатысушылар",
+       "wlshowhideanons": "анонимді қатысушылар",
+       "wlshowhidepatr": "тексерілген өңдемелер",
+       "wlshowhidemine": "өңдемелерім",
        "watchlist-options": "Бақылау тізімінің баптаулары",
        "watching": "Бақылауда…",
        "unwatching": "Бақыламауда…",
        "deletepage": "Бетті жою",
        "confirm": "Құптау",
        "excontent": "болған мағлұматы: $1",
-       "excontentauthor": "болған мағлұматы (тек «[[Special:Contributions/$2|$2]]» үлесі): $1",
+       "excontentauthor": "болған мағлұматы: «$1» және тек «[[Special:Contributions/$2|$2]]» ([[User talk:$2|талқ]]) үлесі",
        "exbeforeblank": "тазарту алдындағы болған мағлұматы: $1",
        "delete-confirm": "«$1» дегенді жою",
        "delete-legend": "Жою",
        "contributions": "{{GENDER:$1|Қатысушы}} үлестері",
        "contributions-title": "$1 есімді қатысушының үлесі",
        "mycontris": "Үлесім",
+       "anoncontribs": "Үлесім",
        "contribsub2": "{{GENDER:$3|$1}} ($2) үлесі",
        "contributions-userdoesnotexist": "«$1» қатысушы акаунты тіркелмеді.",
        "nocontribs": "Осы іздеу шартына сәйкес өзгерістер табылған жоқ.",
        "ipblocklist-empty": "Бұғаттау тізімі бос.",
        "ipblocklist-no-results": "Сұратылған IP мекенжай немесе қатысушы аты бұғатталмаған.",
        "blocklink": "бұғаттау",
-       "unblocklink": "бұғатынан шығару",
+       "unblocklink": "бұғатынан босату",
        "change-blocklink": "бұғаттауын өзгерту",
        "contribslink": "үлесі",
        "emaillink": "хат жіберу",
        "cant-move-to-user-page": "Бетті қатысушы бетіне жылжытуға рұқсатыңыз жоқ (төменгі беттерін қоспағанда).",
        "cant-move-category-page": "Сізде санат беттерінің атауын өзгертуге рұқсатыңыз жоқ.",
        "cant-move-to-category-page": "Сізде бетті санат бетіне жылжытуға рұқсатыңыз жоқ.",
-       "newtitle": "Ð\96аңа Ð±ÐµÑ\82 Ð°Ñ\82аÑ\83Ñ\8b:",
+       "newtitle": "Жаңа атауы:",
        "move-watch": "Бұл бетті бақылау",
        "movepagebtn": "Бетті жылжыту",
        "pagemovedsub": "Бет жылжытылды",
        "movenosubpage": "Бұл бетте төменгі беттері жоқ.",
        "movereason": "Жылжытудың себебі:",
        "revertmove": "қайтару",
-       "delete_and_move": "Жою және жылжыту",
        "delete_and_move_text": "== Жоюды қажет етеді ==\nТағайындалған «[[:$1]]» беті әлдеқашан бар.\nЖылжытуға жол беру үшін бұны жойғыңыз келе ме?",
        "delete_and_move_confirm": "Иә, бұл бетті жой",
        "delete_and_move_reason": "«[[$1]]» дегеннен жылжытуға жол беру үшін жойылған",
        "tooltip-pt-preferences": "Бапталымдарым",
        "tooltip-pt-watchlist": "Өзгерістерін бақылап тұрған беттер тізімім.",
        "tooltip-pt-mycontris": "Өңдеулеріңіздің тізімі",
+       "tooltip-pt-anoncontribs": "Бұл IP мекенжаймен жасаған өңдемелер тізімі",
        "tooltip-pt-login": "Кіруіңізді ұсынамыз, ол міндетті емес.",
        "tooltip-pt-logout": "Шығу",
        "tooltip-pt-createaccount": "Біз сізге есептік жазба бастауды және кіруді ұсынамыз,ол міндетті емес.",
        "tooltip-ca-nstab-main": "Мағлұмат бетін қарау",
        "tooltip-ca-nstab-user": "Қатысушы бетін қарау",
        "tooltip-ca-nstab-media": "Медиа бетін қарау",
-       "tooltip-ca-nstab-special": "Ð\91ұл Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82, Ð±ÐµÑ\82Ñ\82Ñ\96Ò£ Ó©Ð·Ñ\96 Ó©Ò£Ð´ÐµÐ»Ñ\96нбейді.",
+       "tooltip-ca-nstab-special": "Ð\91ұл Ð°Ñ\80найÑ\8b Ð±ÐµÑ\82, Ð¾Ð» Ó©Ò£Ð´ÐµÐ»Ð¼ейді.",
        "tooltip-ca-nstab-project": "Жоба бетін қарау",
        "tooltip-ca-nstab-image": "Файл бетін қарау",
        "tooltip-ca-nstab-mediawiki": "Жүйе хабарын қарау",
        "htmlform-cloner-required": "Кемінде бір мән қажет етеді.",
        "htmlform-title-badnamespace": "[[:$1]] беті «{{ns:$2}}» есім кеңістігінде емес.",
        "htmlform-title-not-creatable": "«$1» беті бастауға болатын бет атауы емес",
-       "htmlform-title-not-exists": "[[:$1]] беті жоқ.",
+       "htmlform-title-not-exists": "$1 беті жоқ.",
        "htmlform-user-not-exists": "<strong>$1</strong> есімді қатысушы жоқ.",
        "htmlform-user-not-valid": "<strong>$1</strong> жарамды қатысушы есімі емес.",
        "sqlite-has-fts": "$1 дегенмен барлық мәтінде іздеуді қолдайды",
        "logentry-newusers-byemail": "$1 $3 деген аккаунт {{GENDER:$2|тіркеді}} және құпия сөзі е-пошта арқылы жіберілді",
        "logentry-newusers-autocreate": "$1 қатысушы аккаунтын автоматты түрде {{GENDER:$2|тіркеді}}",
        "logentry-protect-move_prot": "$1 protection settings from $4 дегеннен $3 дегенге қорғалу баптауларын {{GENDER:$2|жылжытты}}",
+       "logentry-protect-protect": "$1 $3 бетін {{GENDER:$2|қорғады}}  $4",
        "logentry-rights-rights": "$1 $3 үшін топ мүшелігін $4 дегеннен $5 дегенге {{GENDER:$2|өзгертті}}",
        "logentry-rights-rights-legacy": "$1 $3 үшін топ мүшелігін {{GENDER:$2|өзгертті}}",
        "logentry-rights-autopromote": "$1 $4 дегенен $5 дегенге автоматты түрде {{GENDER:$2|деңгейі көтерілген}}",
index 4a042ed..2a957a0 100644 (file)
        "viewsource": "មើល​កូដ",
        "viewsource-title": "មើលកូដរបស់ $1",
        "actionthrottled": "សកម្មភាពត្រូវបានកម្រិត",
-       "actionthrottledtext": "ក្រោមវិធានការប្រឆាំងស្ប៉ាម​ អ្នកត្រូវបាន​គេកំហិតមិនឱ្យ​ធ្វើសកម្មភាពនេះ​ច្រើនដងពេកទេ​ក្នុងរយៈពេលខ្លីមួយ។\n\nសូមព្យាយាមម្ដងទៀតក្នុងរយៈពេលប៉ុន្មាននាទីទៀត។",
+       "actionthrottledtext": "ក្រោមវិធានការប្រឆាំងស្ប៉ាម​ អ្នកត្រូវបាន​គេកំហិតមិនឱ្យ​ធ្វើសកម្មភាពនេះ​ច្រើនដងពេកទេ​ក្នុងរយៈពេលខ្លីមួយ តែអ្នកបានធ្វើលើសចំនួនកំហិត។\n\nសូមព្យាយាមម្ដងទៀតក្នុងរយៈពេលប៉ុន្មាននាទីទៀត។",
        "protectedpagetext": "ទំព័រនេះបានត្រូវការពារមិនឱ្យកែប្រែ​ឬធ្វើសកម្មភាពផ្សេងទៀតលើវា។",
        "viewsourcetext": "អ្នកអាចមើលនិងចម្លងកូដរបស់ទំព័រនេះ។",
        "viewyourtext": "អ្នកអាចមើលនិងចម្លងកូដរបស់<strong>ការកែប្រែរបស់អ្នក</strong>មកកាន់ទំព័រនេះ។",
        "createaccountreason": "មូលហេតុ៖",
        "createacct-reason": "មូលហេតុ",
        "createacct-reason-ph": "មូលហេតុដែលអ្នកចង់បង្កើតគណនីមួយទៀត",
-       "createacct-captcha": "ត្រួតពិនិត្យសុវត្ថិភាព",
-       "createacct-imgcaptcha-ph": "បញ្ចូលឃ្លាដែលអ្នកឃើញខាងលើ",
        "createacct-submit": "បង្កើតគណនីរបស់អ្នក",
        "createacct-another-submit": "បង្កើតគណនី",
        "createacct-benefit-heading": "{{SITENAME}} ត្រូវបង្កើតឡើងដោយបុគ្គលស្ម័គ្រចិត្តដូចជាអ្នកជាដើម។",
        "passwordreset-emailtext-ip": "មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកសម្រាប់ {{SITENAME}} ($4)។ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះ\nមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "passwordreset-emailtext-user": "អ្នកប្រើប្រាស់ $1 នៅក្នុង {{SITENAME}} បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកនៅក្នុង {{SITENAME}} ($4)។\n {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "passwordreset-emailelement": "អត្តនាម៖ \n$1\n\nពាក្យសម្ងាត់បណ្ដោះអាសន្ន៖ \n$2",
-       "passwordreset-emailsent": "á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e½á\9e\99á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85á\9e á\9e¾á\9e\99។",
+       "passwordreset-emailsent": "á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e\93á\9f\81á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\8aá\9f\82á\9e\9bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\85á\9e»á\9f\87á\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\82á\9e\8eá\9e\93á\9e¸á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\93á\9f\84á\9f\87á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\9fá\9f\92á\9e\8aá\9e¶á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\98á\9e½á\9e\99á\9e\93á\9e¹á\9e\84á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\95á\9f\92á\9e\89á\9e¾á\9e\91á\9f\85។",
        "passwordreset-emailsent-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានផ្ញើទៅហើយ។",
        "passwordreset-emailerror-capture": "អ៊ីមែលស្ដារពាក្យសម្ងាត់មួយដូចបង្ហាញខាងក្រោមត្រូវបានបង្កើតហើយ ប៉ុន្តែការផ្ញើទៅកាន់ {{GENDER:$2|អ្នកប្រើប្រាស់}}មិនបានសំរេចទេ៖ $1",
-       "changeemail": "ផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល",
-       "changeemail-header": "á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\82á\9e\8eá\9e\93á\9e¸á\9e\93á\9f\81á\9f\87",
+       "changeemail": "á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¬á\9e\9bá\9e»á\9e\94á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9b",
+       "changeemail-header": "á\9e\9fá\9e¼á\9e\98á\9e\94á\9f\86á\9e\96á\9f\81á\9e\89á\9e\9fá\9f\86á\9e\8eá\9e»á\9f\86á\9e\94á\9f\82á\9e\94á\9e\94á\9e\91á\9e\93á\9f\81á\9f\87á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9f\94 á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80á\9e\85á\9e\84á\9f\8bá\9e\9bá\9e»á\9e\94á\9e\80á\9e¶á\9e\9aá\9e\8fá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e¢á\9f\8aá\9e¸á\9e\98á\9f\82á\9e\9bá\9e\96á\9e¸á\9e\82á\9e\8eá\9e\93á\9e¸á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\9fá\9e¼á\9e\98á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\94á\9f\92á\9e\9aá\9e¡á\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93á\9e\90á\9f\92á\9e\98á\9e¸á\9e¢á\9f\84á\9e\99á\9e\93á\9f\85á\9e\91á\9f\86á\9e\93á\9f\81á\9e\9aá\9e\96á\9f\81á\9e\9bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9f\81á\9e\85á\9e\8aá\9e¶á\9e\80á\9f\8bá\9e\9fá\9f\86á\9e\8eá\9e»á\9f\86á\9e\94á\9f\82á\9e\94á\9e\94á\9e\91á\9f\94",
        "changeemail-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "changeemail-oldemail": "អាសយដ្ឋានអ៊ីមែលបច្ចុប្បន្ន៖",
        "changeemail-newemail": "អាសយដ្ឋានអ៊ីមែលថ្មី៖",
        "upload-form-label-infoform-description": "ការ​ពិពណ៌នា",
        "upload-form-label-usage-title": "បម្រើបម្រាស់",
        "upload-form-label-usage-filename": "ឈ្មោះឯកសារ",
+       "foreign-structured-upload-form-label-own-work": "នេះជាការងារផ្ទាល់ខ្លួនរបស់ខ្ញុំ",
+       "foreign-structured-upload-form-label-infoform-categories": "ចំណាត់ថ្នាក់ក្រុម",
+       "foreign-structured-upload-form-label-infoform-date": "កាលបរិច្ឆេទ",
        "backend-fail-notexists": "គ្មានឯកសារ \"$1\" ទេ។",
        "backend-fail-notsame": "ឯកសារដែលមិនដូចគ្នាបេះបិទមួយមានរួចហើយនៅ \"$1\"។",
        "backend-fail-delete": "មិនអាចលុបឯកសារ \"$1\" បានទេ។",
        "cant-move-to-user-page": "អ្នកគ្មានការអនុញ្ញាតអោយប្ដូរទីតាំងទំព័រមួយទៅកាន់ទំព័រអ្នកប្រើប្រាស់មួយទេ (លើកលែងតែទៅកាន់ទំព័ររងមួយ)។",
        "cant-move-category-page": "អ្នកមិនត្រូវបាន​អនុញ្ញាត​ឱ្យ​ប្តូរទីតាំងទំព័រចំណាត់ថ្នាក់ក្រុម​ទេ។",
        "cant-move-to-category-page": "អ្នកគ្មានការអនុញ្ញាតអោយប្ដូរទីតាំងទំព័រមួយទៅកាន់ទំព័រចំណាត់ថ្នាក់ក្រុមមួយទេ។",
-       "newtitle": "á\9e\91á\9f\85á\9e\85á\9f\86á\9e\8eá\9e\84á\9e\87á\9e¾á\9e\84á\9e\90á\9f\92á\9e\98á\9e¸á\9f\96",
+       "newtitle": "ចំណងជើងថ្មី៖",
        "move-watch": "តាមដានទំព័រនេះ",
        "movepagebtn": "ប្ដូរទីតាំង",
        "pagemovedsub": "ប្ដូរទីតាំងដោយជោគជ័យ",
        "tooltip-ca-nstab-main": "មើលទំព័រមាតិកា",
        "tooltip-ca-nstab-user": "មើលទំព័រអ្នកប្រើប្រាស់",
        "tooltip-ca-nstab-media": "មើលទំព័រមេឌា",
-       "tooltip-ca-nstab-special": "á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fâ\80\8bá\9f\94 á\9e¢á\9f\92á\9e\93á\9e\80á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9f\81á\9f\87បានទេ។",
+       "tooltip-ca-nstab-special": "á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fâ\80\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82បានទេ។",
        "tooltip-ca-nstab-project": "មើលទំព័រគម្រោង",
        "tooltip-ca-nstab-image": "មើលទំព័រ​ឯកសារ",
        "tooltip-ca-nstab-mediawiki": "មើលសាររបស់ប្រព័ន្ធ",
index f809817..be67aa4 100644 (file)
        "nstab-template": "ಟೆಂಪ್ಲೇಟು",
        "nstab-help": "ಸಹಾಯ",
        "nstab-category": "ವರ್ಗ",
+       "mainpage-nstab": "ಮುಖ್ಯ ಪುಟ",
        "nosuchaction": "ಆ ರೀತಿಯ ಕೃತ್ಯ ಯಾವುದೂ ಇಲ್ಲ",
        "nosuchactiontext": "ಈ URL ನೇಮಿಸಿದ ಕೃತ್ಯವು ಈ ವಿಕಿಯಿಂದ ಗುರುತಿಸಬಲ್ಲದಲ್ಲ",
        "nosuchspecialpage": "ಆ ಹೆಸರಿನ ವಿಶೇಷ ಪುಟ ಇಲ್ಲ",
        "createaccountreason": "ಕಾರಣ:",
        "createacct-reason": "ಕಾರಣ",
        "createacct-reason-ph": "ನೀವು ಯಾಕೆ ಇನ್ನು ಒಂದು ಖಾತ ಮಾಡುತ ಇದ್ದೀರಿ ?",
-       "createacct-captcha": "ಸುರಕ್ಷೆ ನಿಗ್ರಹಿಸು.",
-       "createacct-imgcaptcha-ph": "ಮೇಲೆ ಕಾಣುವಂತ ಶಬ್ದಗಳು ಮತ್ತು ಅಂಕಗಳನ್ನು ಬರೆಯಿರಿ.",
        "createacct-submit": "ಖಾತೆಯನ್ನು ಸೃಷ್ಟಿಸಿ",
        "createacct-another-submit": "ಇನ್ನು ಒಂದು ಖಾತ ಮಾಡಿ",
        "createacct-benefit-heading": "{{SITENAME}} ನಿಮ್ಮನ್ತವೆ ಜನರಿಂದ ಮಾಡಿದು",
        "passwordreset-username": "ಬಳಕೆದಾರ ಹೆಸರು:",
        "passwordreset-domain": "ಕ್ಷೇತ್ರ:",
        "passwordreset-email": "ಇ-ಮೇಲ್ ವಿಳಾಸ:",
-       "passwordreset-emailsent": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿದ ಮಿಂಚಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.",
+       "passwordreset-emailsentemail": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿದ ಮಿಂಚಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ.",
        "passwordreset-emailsent-capture": "ಪ್ರವೇಶಪದವನ್ನು ಪುನಃಸ್ಥಾಪಿಸಿದ ಮಿಂಚಂಚೆಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ,ಇದನ್ನು ಈ ಕೆಳಗೆ ತೋರಿಸಲಾಗಿದೆ.",
        "changeemail": "ಮಿಂಚಂಚೆ ವಿಳಾಸವನ್ನು ಬದಲಾಯಿಸಿ",
        "changeemail-no-info": "ನೀವು ಈ ಪುಟವನ್ನು ನೇರತಲುಪಲು ಲಾಗಿನ್ ಆಗಿರುವುದು ಆವಶ್ಯಕ.",
        "prefs-advancedwatchlist": "ಪರಿಣತ ಇಚ್ಛೆಗಳು",
        "prefs-displayrc": "ಪ್ರದರ್ಶನ ಆಯ್ಕೆಗಳು",
        "prefs-displaywatchlist": "ಪ್ರದರ್ಶನ ಆಯ್ಕೆಗಳು",
-       "email-address-validity-valid": "ಮಿಂಚಂಚೆ ವಿಳಾಸವು ಸಿಂಧುವೆಂದು ತೋರುತ್ತದೆ",
-       "email-address-validity-invalid": "ಸಿಂಧುವಾದ ಮಿಂಚಂಚೆ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ",
        "userrights": "ಬಳಕೆದಾರ ಹಕ್ಕುಗಳ ನಿರ್ವಹಣೆ",
        "userrights-lookup-user": "ಬಳಕೆದಾರ ಗುಂಪುಗಳನ್ನು ನಿರ್ವಹಿಸು",
        "userrights-user-editname": "ಬಳಕೆದಾರ ಹೆಸರನ್ನು ಸೂಚಿಸಿ:",
        "wlheader-enotif": "ಮಿಂಚಂಚೆ ಸೂಚನೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.",
        "wlheader-showupdated": "ನೀವು ಕೊನೆಯ ಬಾರಿ ಭೇಟಿ ನೀಡಿದ ನಂತರ ಬದಲಾವಣೆಗಳು ಆಗಿರುವ ಪುಟಗಳು '''ದಪ್ಪ ಅಕ್ಷರಗಳಲ್ಲಿ''' ತೋರಿಸಲಾಗಿದೆ",
        "wlshowlast": "ಕೊನೆಯ $1 ಗಂಟೆ $2 ದಿನಗಳು  ಅನ್ನು ತೋರಿಸು",
+       "watchlistall2": "ಎಲ್ಲಾ",
        "watchlist-options": "ವೀಕ್ಷಣಾಪಟ್ಟಿ ಆಯ್ಕೆಗಳು",
        "watching": "ವೀಕ್ಷಣೆಗೆ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...",
        "unwatching": "ವೀಕ್ಷಣೆಯಿಂದ ತೆಗೆಯಲಾಗುತ್ತಿದೆ...",
        "movelogpagetext": "ಸ್ಥಳಾಂತರಿಸಲಾಗಿರುವ ಪುಟಗಳ ಪಟ್ಟಿ ಕೆಳಗಿದೆ.",
        "movereason": "ಕಾರಣ:",
        "revertmove": "ಹಿಂದಿನಂತಾಗಿಸು",
-       "delete_and_move": "ಅಳಿಸು ಮತ್ತು ಸ್ಥಳಾಂತರಿಸು",
        "delete_and_move_text": "==ಅಳಿಸುವಿಕೆ ಬೇಕಾಗಿದೆ==\nಸ್ಥಳಾಂತರಿಬೇಕೆಂದಿರುವ ಪುಟ \"[[:$1]]\" ಆಗಲೆ ಅಸ್ಥಿತ್ವದಲ್ಲಿ ಇದೆ.\nಸ್ಥಳಾಂತರಿಕೆಗೆ ಜಾಗ ಮಾಡಲು ಆ ಪುಟವನ್ನು ಅಳಿಸಬೇಕೆ?",
        "delete_and_move_confirm": "ಹೌದು, ಪುಟವನ್ನು ಅಳಿಸಿ",
        "delete_and_move_reason": "ಸ್ಥಳಾಂತರಿಕೆಗೆ ಜಾಗ ಮಾಡಲು ಪುಟವನ್ನು ಅಳಿಸಲಾಯಿತು",
        "htmlform-selectorother-other": "ಇತರ",
        "htmlform-no": "ಇಲ್ಲ",
        "htmlform-yes": "ಹೌದು",
-       "htmlform-title-not-exists": "[[:$1]] ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.",
+       "htmlform-title-not-exists": "$1 ಅಸ್ತಿತ್ವದಲ್ಲಿಲ್ಲ.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ಅಳಿಸಲಾಯಿತು}} ಪುಟ $3",
        "revdelete-restricted": "ನಿರ್ವಾಹಕರಿಗೆ ನಿಬಂಧನೆಗಳನ್ನು ಅನ್ವಯಿಸಲಾಯಿತು",
        "revdelete-unrestricted": "ನಿರ್ವಾಹಕರ ನಿಬಂಧನೆಗಳನ್ನು ತೆಗೆಯಲಾಯಿತು",
index 52aea4a..02f811e 100644 (file)
@@ -54,7 +54,8 @@
                        "Hwangjy9",
                        "Kurousagi",
                        "Macofe",
-                       "Yearning"
+                       "Yearning",
+                       "고솜"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "morenotlisted": "이 목록은 완성되지 않았습니다.",
        "mypage": "문서",
        "mytalk": "토론",
-       "anontalk": "이 IP 주소의 사용자와 토론",
+       "anontalk": "토론",
        "navigation": "둘러보기",
        "and": ",",
        "qbfind": "찾기",
        "missing-article": "데이터베이스에서 \"$1\" 문서의 $2 텍스트를 찾지 못했습니다.\n\n삭제된 문서의 오래된 차이나 역사 링크를 보려고 시도할 때 이러한 문제가 발생할 수 있습니다.\n\n그렇지 않다면, 소프트웨어에 버그가 발생했을 수도 있습니다.\n[[Special:ListUsers/sysop|관리자]]에게 URL을 참조하여 알려주세요.",
        "missingarticle-rev": "(판번호: $1)",
        "missingarticle-diff": "(차이: $1, $2)",
-       "readonly_lag": "슬레이브 데이터베이스가 마스터 서버의 자료를 새로 고치는 중입니다. 데이터베이스가 자동으로 잠겨 있습니다.",
+       "readonly_lag": "슬레이브 데이터베이스가 마스터 서버의 자료를 새로 고치는 중입니다. 데이터베이스가 자동으로 잠겨져 있습니다",
        "internalerror": "내부 오류",
        "internalerror_info": "내부 오류: $1",
        "internalerror-fatal-exception": "종류 \"$1\"에서 심각한 오류",
        "createaccountreason": "이유:",
        "createacct-reason": "이유",
        "createacct-reason-ph": "왜 다른 계정을 만들어야 합니까",
-       "createacct-captcha": "보안 검사",
-       "createacct-imgcaptcha-ph": "위에 보이는 텍스트를 입력하세요",
        "createacct-submit": "계정 만들기",
        "createacct-another-submit": "계정 만들기",
        "createacct-benefit-heading": "{{SITENAME}} 프로젝트는 여러분과 같은 사람들이 만듭니다.",
        "passwordreset-emailtext-ip": "$1 IP 주소를 사용하는 누군가가 아마 자신이 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4)의 사용자 $1이 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailelement": "사용자 이름: \n$1\n\n임시 비밀번호: \n$2",
-       "passwordreset-emailsent": "당신의 계정에 등록된 이메일 주소가 있다면, 비밀번호 재설정 메일이 전해질 것입니다.",
+       "passwordreset-emailsentemail": "당신의 계정에 등록된 이메일 주소가 있다면, 비밀번호 재설정 메일이 전해질 것입니다.",
        "passwordreset-emailsent-capture": "비밀번호 재설정 이메일이 발송되었으며, 아래에 나타나 있습니다.",
        "passwordreset-emailerror-capture": "비밀번호 재설정 이메일이 생성되어 아래에 보여져 있지만, {{GENDER:$2|사용자}}에게 발송하는 데에는 실패했습니다: $1",
        "changeemail": "이메일 주소를 바꾸거나 제거하기",
        "blockedtext": "'''사용자 계정 또는 IP 주소가 차단되었습니다.'''\n\n차단한 사람은 $1입니다.\n차단한 이유는 다음과 같습니다: $2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 '이메일 보내기' 기능을 사용할 수 있습니다. 또 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n현재 당신의 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "autoblockedtext": "당신의 IP 주소는 $1 사용자가 차단한 사용자가 사용했던 IP이기 때문에 자동으로 차단되었습니다.\n차단된 이유는 다음과 같습니다:\n\n:$2\n\n* 차단이 시작된 시간: $8\n* 차단이 끝나는 시간: $6\n* 차단된 사용자: $7\n\n$1 또는 [[{{MediaWiki:Grouppage-sysop}}|다른 관리자]]에게 차단에 대해 문의할 수 있습니다.\n\n[[Special:Preferences|계정 환경 설정]]에 올바른 이메일 주소가 있어야만 \"이메일 보내기\" 기능을 사용할 수 있습니다. 또한 이메일 보내기 기능이 차단되어 있으면 이메일을 보낼 수 없습니다.\n\n현재 IP 주소는 $3이고, 차단 ID는 #$5입니다.\n문의할 때에 이 정보를 같이 알려주세요.",
        "blockednoreason": "이유를 입력하지 않음",
-       "whitelistedittext": "문서를 편집하기 전에  $1해야 합니다.",
+       "whitelistedittext": "문서를 편집하기 전에 $1해야 합니다.",
        "confirmedittext": "문서를 고치려면 이메일 인증 절차가 필요합니다.\n[[Special:Preferences|사용자 환경 설정]]에서 이메일 주소를 입력하고 이메일 주소 인증을 해주시기 바랍니다.",
        "nosuchsectiontitle": "문단을 찾을 수 없음",
        "nosuchsectiontext": "존재하지 않는 문단을 편집하려 했습니다.\n이 문서를 보는 동안 문단이 이동되었거나 삭제되었을 수 있습니다.",
        "nonunicodebrowser": "<strong>경고: 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다.</strong>\n아스키가 아닌 문자가 16진수 코드로 나타날 수 있습니다.",
        "editingold": "<strong>경고: 이 문서의 오래된 판을 편집하고 있습니다.</strong>\n이것을 저장하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.",
        "yourdiff": "차이",
-       "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
+       "copyrightwarning": "{{SITENAME}}에서의 모든 기여는 $2 라이선스로 배포된다는 점을 유의해 주세요 (자세한 내용에 대해서는 $1 문서를 읽어주세요).\n만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.\n<strong>저작권이 있는 내용을 허가 없이 저장하지 마세요!</strong>",
        "copyrightwarning2": "{{SITENAME}}에서의 모든 기여는 다른 사용자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요.\n만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.<br />\n또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 내용에 대해서는 $1 문서를 읽어 주세요).\n'''저작권이 있는 내용을 허가 없이 저장하지 마세요!'''",
        "editpage-cannot-use-custom-model": "이 문서의 콘텐츠 모델은 변경될 수 없습니다.",
        "longpageerror": "'''오류: 문서의 크기가 {{PLURAL:$1|$1킬로바이트}}로 최대 크기인 {{PLURAL:$2|$2킬로바이트}}보다 큽니다.'''\n저장할 수 없습니다.",
-       "readonlywarning": "'''경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.'''\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n잠근 관리자가 남긴 설명은 다음과 같습니다: $1",
+       "readonlywarning": "<strong>경고: 데이터베이스가 관리를 위해 잠겨 있습니다. 따라서 문서를 편집한 내용을 지금 저장할 수 없습니다.</strong>\n편집 내용을 복사하여 붙여넣기 등을 사용하여 일단 다른 곳에 저장한 후, 나중에 다시 시도해 주세요.\n\n잠근 관리자가 남긴 설명은 다음과 같습니다: $1",
        "protectedpagewarning": "<strong>경고: 이 문서는 관리자 권한이 있는 사용자만 편집할 수 있도록 보호되어 있습니다.</strong>\n이 문서의 최근 기록을 참조하십시오:",
-       "semiprotectedpagewarning": "<strong>참고:</strong> 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 잠겨 있습니다.\n이 문서의 최근 기록을 참조하십시오:",
-       "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 잠겨 있어 관리자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
-       "titleprotectedwarning": "<strong>경고: 이 문서는 잠겨 있어, 문서를 만드려면 [[Special:ListGroupRights|특정 권한]]이 필요합니다.</strong>\n아래 문서의 최근 기록을 참조하십시오:",
+       "semiprotectedpagewarning": "<strong>참고:</strong> 이 문서는 계정을 등록한 사용자만이 편집할 수 있도록 보호되어 있습니다.\n이 문서의 최근 기록을 참조하십시오:",
+       "cascadeprotectedwarning": "<strong>경고:</strong> 이 문서는 보호되어 있어 관리자만 편집할 수 있습니다. 연쇄적 보호가 걸린 다음 {{PLURAL:$1|문서}}에서 이 문서를 사용하고 있습니다:",
+       "titleprotectedwarning": "<strong>경고: 이 문서는 보호되어 있어, 문서를 만드려면 [[Special:ListGroupRights|특정한 권한]]이 필요합니다.</strong>\n아래 문서의 최근 기록을 참조하십시오:",
        "templatesused": "이 문서에서 사용한 {{PLURAL:$1|틀}}:",
        "templatesusedpreview": "이 미리 보기에서 사용하고 있는 {{PLURAL:$1|틀}}:",
        "templatesusedsection": "이 문단에서 사용하고 있는 {{PLURAL:$1|틀}}:",
        "permissionserrors": "권한 오류",
        "permissionserrorstext": "해당 명령을 수행할 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해보세요:",
        "permissionserrorstext-withaction": "$2 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해주세요:",
-       "recreate-moveddeleted-warn": "<strong>경고: ì\82­ì \9cë\90\9c ë¬¸ì\84\9c를 ë\8b¤ì\8b\9c ë§\8cë\93¤ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤.</strong>\n\nì\9d´ ë¬¸ì\84\9c를 ê³\84ì\86\8d í\8e¸ì§\91í\95\98ë\8a\94 ê²\83ì\9d´ ì \81í\95©í\95\9c ê²\83ì\9d¸ì§\80 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\ní\8e¸ì\9d\98를 ì\9c\84í\95´ ì\82­ì \9cì\99\80 ì\98®ê¸°ê¸° 기록을 다음과 같이 제공합니다:",
+       "recreate-moveddeleted-warn": "<strong>경고: ì\82­ì \9cë\90\9c ë¬¸ì\84\9c를 ë\8b¤ì\8b\9c ë§\8cë\93¤ê³  ì\9e\88ì\8aµë\8b\88ë\8b¤.</strong>\n\nì\9d´ ë¬¸ì\84\9c를 ê³\84ì\86\8d í\8e¸ì§\91í\95\98ë\8a\94 ê²\83ì\9d´ ì \81í\95©í\95\9c ê²\83ì\9d¸ì§\80 í\99\95ì\9d¸í\95´ì£¼ì\84¸ì\9a\94.\ní\8e¸ì\9d\98를 ì\9c\84í\95´ ì\82­ì \9cì\99\80 ì\9d´ë\8f\99 기록을 다음과 같이 제공합니다:",
        "moveddeleted-notice": "이 문서는 삭제되었습니다.\n이 문서의 삭제 및 이동 기록은 다음과 같습니다.",
        "moveddeleted-notice-recent": "죄송합니다, 이 문서는 최근 (24시간 내)에 삭제된 적이 있습니다.\n삭제와 이동 기록이 참고를 위해 남겨져 있습니다.",
        "log-fulllog": "전체 기록 보기",
        "content-model-css": "CSS",
        "content-json-empty-object": "빈 오브젝트",
        "content-json-empty-array": "빈 배열",
+       "duplicate-args-warning": "<strong>경고:</strong> [[:$1]] 문서는 [[:$2]]에 \"$3\" 변수를 하나보다 더 많이 입력했습니다. 마지막으로 주어진 값만이 유효합니다.",
        "duplicate-args-category": "중복된 인수를 사용한 틀의 호출을 포함한 문서",
        "duplicate-args-category-desc": "문서에 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>나 <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>와 같은, 인수를 중복하여 사용한 틀 호출을 포함합니다.",
        "expensive-parserfunction-warning": "<strong>경고:</strong> 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.\n\n$2개 보다 적게 {{PLURAL:$2|써야}} 하지만 {{PLURAL:$1|지금은 $1개를 쓰고 있습니다}}.",
        "mergehistory-empty": "합칠 수 있는 판이 없습니다.",
        "mergehistory-done": "$1 문서의 {{PLURAL:$3|판}} $3개{{PLURAL:$3|가}} [[:$2]]에 성공적으로 합쳐졌습니다.",
        "mergehistory-fail": "역사 합치기를 수행할 수 없습니다, 문서와 시간 변수를 다시 확인하세요.",
-       "mergehistory-fail-toobig": "ì\98®ê¸°려는 {{PLURAL:$1|판}} $1개 제한보다 많이 역사 병합을 수행할 수 없습니다.",
+       "mergehistory-fail-toobig": "ì\9d´ë\8f\99í\95\98려는 {{PLURAL:$1|판}} $1개 제한보다 많이 역사 병합을 수행할 수 없습니다.",
        "mergehistory-no-source": "원본인 $1 문서가 존재하지 않습니다.",
        "mergehistory-no-destination": "대상인 $1 문서가 존재하지 않습니다.",
        "mergehistory-invalid-source": "원본 문서는 올바른 제목이어야 합니다.",
        "showingresultsinrange": "#<strong>$2</strong>부터 #<strong>$3</strong>까지의 범위에서 <strong>$1</strong>개의 {{PLURAL:$1|결과}}가 아래에 보입니다.",
        "search-showingresults": "{{PLURAL:$4|결과 <strong>$3</strong>개 중 <strong>$1</strong>개|결과 <strong>$3</strong>개 중 <strong>$1 - $2</strong>개}}",
        "search-nonefound": "검색어와 일치하는 결과가 없습니다.",
+       "search-nonefound-thiswiki": "이 사이트에서 검색어와 일치하는 결과가 없습니다.",
        "powersearch-legend": "고급 검색",
        "powersearch-ns": "다음 이름공간에서 검색:",
        "powersearch-togglelabel": "확인:",
        "powersearch-togglenone": "모두 제외",
        "powersearch-remember": "향후 검색에 선택 기억하기",
        "search-external": "바깥 검색",
-       "searchdisabled": "{{SITENAME}} 검색이 비활성화되어 있습니다.\n검색이 작동하지 않는 동안에는 Google을 통해 검색할 수 있습니다.\n검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
+       "searchdisabled": "{{SITENAME}} 검색이 비활성화되어 있습니다.\n검색이 작동하지 않는 동안 Google을 통해 검색할 수 있습니다.\n검색 엔진의 내용은 최신이 아닐 수 있다는 점을 참고하세요.",
        "search-error": "검색하는 동안 오류가 발생했습니다: $1",
        "preferences": "사용자 환경 설정",
        "mypreferences": "환경 설정",
        "prefs-help-prefershttps": "이 사용자 환경 설정은 다음 로그인부터 적용됩니다.",
        "prefswarning-warning": "사용자 환경 설정에서 바뀐 것이 아직 저장되어 있지 않습니다.\n사용자 환경 설정에서 \"$1\"을 클릭하지 않고 이 페이지를 떠나면 바뀌지 않습니다.",
        "prefs-tabs-navigation-hint": "팁: 탭 목록에서 탭 사이를 둘러보려면 왼쪽과 오른쪽 화살표 키를 사용할 수 있습니다.",
-       "email-address-validity-valid": "이메일 주소가 올바른 것으로 보입니다",
-       "email-address-validity-invalid": "올바른 이메일 주소를 입력하세요",
        "userrights": "사용자 권한 관리",
        "userrights-lookup-user": "사용자 권한 관리",
        "userrights-user-editname": "사용자 이름 입력:",
        "right-createtalk": "토론 문서 만들기",
        "right-createaccount": "새 사용자 계정 만들기",
        "right-minoredit": "사소한 편집으로 표시",
-       "right-move": "문ì\84\9c ì\98®ê¸°ê¸°",
-       "right-move-subpages": "문ì\84\9cì\99\80 í\95\98ì\9c\84 ë¬¸ì\84\9c ì\98®ê¸°기",
-       "right-move-rootuserpages": "ìµ\9cì\83\81ì\9c\84 ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c ì\98®ê¸°ê¸°",
-       "right-move-categorypages": "ë¶\84ë¥\98 ë¬¸ì\84\9c ì\98®ê¸°ê¸°",
-       "right-movefile": "í\8c\8cì\9d¼ ì\98®ê¸°ê¸°",
+       "right-move": "문ì\84\9c ì\9d´ë\8f\99",
+       "right-move-subpages": "문ì\84\9cì\99\80 í\95\98ì\9c\84 ë¬¸ì\84\9c ì\9d´ë\8f\99í\95\98기",
+       "right-move-rootuserpages": "ìµ\9cì\83\81ì\9c\84 ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c ì\9d´ë\8f\99",
+       "right-move-categorypages": "ë¶\84ë¥\98 ë¬¸ì\84\9c ì\9d´ë\8f\99",
+       "right-movefile": "í\8c\8cì\9d¼ ì\9d´ë\8f\99",
        "right-suppressredirect": "문서을 옮길 때 원래 문서 이름으로 된 넘겨주기를 만들지 않기",
        "right-upload": "파일 올리기",
        "right-reupload": "이미 존재하는 파일을 다시 올리기",
        "action-createaccount": "새 계정 만들기",
        "action-history": "이 문서의 역사 보기",
        "action-minoredit": "이 편집을 사소한 편집으로 표시하기",
-       "action-move": "ì\9d´ ë¬¸ì\84\9c ì\98®ê¸°ê¸°",
-       "action-move-subpages": "ì\9d´ ë¬¸ì\84\9cì\99\80 í\95\98ì\9c\84 ë¬¸ì\84\9c를 í\95¨ê»\98 ì\98®ê¸°기",
+       "action-move": "ì\9d´ ë¬¸ì\84\9c ì\9d´ë\8f\99",
+       "action-move-subpages": "ì\9d´ ë¬¸ì\84\9cì\99\80 í\95\98ì\9c\84 ë¬¸ì\84\9c를 í\95¨ê»\98 ì\9d´ë\8f\99í\95\98기",
        "action-move-rootuserpages": "최상위 사용자 문서를 이동할",
-       "action-move-categorypages": "ë¶\84ë¥\98 ë¬¸ì\84\9c ì\98®ê¸°ê¸°",
-       "action-movefile": "ì\9d´ í\8c\8cì\9d¼ì\9d\84 ì\98®ê¸°ê¸°",
+       "action-move-categorypages": "ë¶\84ë¥\98 ë¬¸ì\84\9c ì\9d´ë\8f\99",
+       "action-movefile": "ì\9d´ í\8c\8cì\9d¼ì\9d\84 ì\9d´ë\8f\99",
        "action-upload": "이 파일을 올리기",
        "action-reupload": "이미 존재하는 파일 덮어쓰기",
        "action-reupload-shared": "공용 저장소의 파일을 무시하고 저장할",
        "upload_directory_missing": "파일 올리기용 디렉터리($1)가 없고 웹 서버가 만들지 못했습니다.",
        "upload_directory_read_only": "파일 저장 디렉터리($1)에 쓰기 권한이 없습니다.",
        "uploaderror": "올리기 오류",
-       "upload-recreate-warning": "<strong>경고: í\95´ë\8b¹ ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c í\8c\8cì\9d¼ì\9d´ ì\82­ì \9cë\90\98ì\97\88ê±°ë\82\98 ì\98®ê²¨ì¡\8cì\8aµë\8b\88ë\8b¤.</strong>\n\ní\8e¸ì\9d\98를 ì\9c\84í\95´ ì\9d´ ë¬¸ì\84\9cì\97\90 ë\8c\80í\95\9c ì\82­ì \9cì\99\80 ì\98®ê¸°ê¸° 기록을 다음과 같이 제공합니다:",
+       "upload-recreate-warning": "<strong>경고: í\95´ë\8b¹ ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c í\8c\8cì\9d¼ì\9d´ ì\82­ì \9cë\90\98ì\97\88ê±°ë\82\98 ì\9d´ë\8f\99ë\90\98ì\97\88ì\8aµë\8b\88ë\8b¤.</strong>\n\ní\8e¸ì\9d\98를 ì\9c\84í\95´ ì\9d´ ë¬¸ì\84\9cì\97\90 ë\8c\80í\95\9c ì\82­ì \9cì\99\80 ì\9d´ë\8f\99 기록을 다음과 같이 제공합니다:",
        "uploadtext": "파일을 올리기 위해서는 아래의 양식을 채워주세요.\n[[Special:FileList|파일 목록]]에서 이전에 올라온 파일을 검색할 수 있습니다. [[Special:Log/upload|올리기 기록]]에는 파일이 올라온 기록이 남습니다. 삭제 기록은 [[Special:Log/delete|삭제 기록]]에서 볼 수 있습니다.\n\n문서에 파일을 넣으려면 아래 방법 중 하나를 사용하세요.\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' 파일의 온전한 모양을 사용하고자 할 때\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200픽셀|섬네일|왼쪽|설명]]</nowiki></code>''' 파일의 너비를 200픽셀로 하고 왼쪽 정렬하며 '설명' 이라는 주석을 파일 밑에 달 때\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' 파일을 직접 보여주지 않고 파일로 바로 링크할 때",
        "upload-permitted": "허용된 파일 {{PLURAL:$2|형식}}: $1",
        "upload-preferred": "권장 파일 {{PLURAL:$2|형식}}: $1",
        "backend-fail-alreadyexists": "\"$1\" 파일이 이미 존재합니다.",
        "backend-fail-store": "\"$1\" 파일을 \"$2\" 경로에 저장하지 못했습니다.",
        "backend-fail-copy": "\"$1\" 파일을 \"$2\" 경로에 복사하지 못했습니다.",
-       "backend-fail-move": "\"$1\" í\8c\8cì\9d¼ì\9d\84 \"$2\" ê²½ë¡\9cë¡\9c ì\98®ê¸°지 못했습니다.",
+       "backend-fail-move": "\"$1\" í\8c\8cì\9d¼ì\9d\84 \"$2\" ê²½ë¡\9cë¡\9c ì\9d´ë\8f\99í\95\98지 못했습니다.",
        "backend-fail-opentemp": "임시 파일을 열 수 없습니다.",
        "backend-fail-writetemp": "임시 파일을 쓸 수 없습니다.",
        "backend-fail-closetemp": "임시 파일을 닫을 수 없습니다.",
        "pageswithprop-prophidden-binary": "숨겨진 이진 속성 값 ($1)",
        "doubleredirects": "이중 넘겨주기 목록",
        "doubleredirectstext": "이 문서는 다른 넘겨주기 문서로 넘겨주고 있는 문서의 목록입니다.\n매 줄에는 첫 번째 문서와 두 번째 문서의 링크가 있습니다. 그리고 보통 첫 번째 문서가 넘겨주어야 할 \"실제\" 문서인 두 번째 넘겨주기의 대상이 있습니다.\n<del>취소선이 그어진</del> 부분은 이미 해결되었습니다.",
-       "double-redirect-fixed-move": "[[$1]] ë¬¸ì\84\9c를 ì\98®ê²¼ì\8aµë\8b\88ë\8b¤.\nì\9d´ ë¬¸ì\84\9cë\8a\94 ì\9d´ì \9c [[$2]] ë¬¸ì\84\9cë¡\9c ì\9e\90ë\8f\99ì\9c¼ë¡\9c ë°\94꾸고 넘겨줍니다.",
+       "double-redirect-fixed-move": "[[$1]] ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95\98ì\98\80ì\8aµë\8b\88ë\8b¤.\nì\9d´ ë¬¸ì\84\9cë\8a\94 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ì\88\98ì \95ë\90\98ì\97\88ì\9c¼ë©° ì\9d´ì \9c [[$2]] ë¬¸ì\84\9cë¡\9c ì\9e\90ë\8f\99ì\9c¼ë¡\9c 넘겨줍니다.",
        "double-redirect-fixed-maintenance": "유지 보수 작업에서 [[$1]]에서 [[$2]](으)로 이중 넘겨주기를 자동으로 고치고 있습니다.",
        "double-redirect-fixer": "넘겨주기 수리꾼",
        "brokenredirects": "끊긴 넘겨주기 목록",
        "newpages-username": "사용자 이름:",
        "ancientpages": "오래된 문서 목록",
        "move": "이동",
-       "movethispage": "ì\9d´ ë¬¸ì\84\9c ì\98®ê¸°기",
+       "movethispage": "ì\9d´ ë¬¸ì\84\9c ì\9d´ë\8f\99í\95\98기",
        "unusedimagestext": "다음은 어떠한 문서도 사용하지 않는 파일의 목록입니다.\n다른 사이트에서 URL 접근을 통해 파일을 사용할 수 있기 때문에, 아래 목록에 있는 파일도 실제로 사용 중일 가능성이 있다는 점을 주의해주세요.",
        "unusedcategoriestext": "사용하지 않는 분류 문서의 목록입니다.",
        "notargettitle": "해당하는 문서 없음",
        "wlheader-showupdated": "마지막으로 방문한 이후에 바뀐 문서는 '''굵은 글씨'''로 보입니다.",
        "wlnote": "$3 $4 기준으로, 아래에 최근 {{PLURAL:$2|한 시간|<strong>$2</strong>시간}} 동안 {{PLURAL:$1|마지막 바뀜이|마지막 바뀜 <strong>$1</strong>개가}} 있습니다.",
        "wlshowlast": "최근 $1시간 $2일 동안의 바뀜 보기",
+       "watchlistall2": "모두",
+       "watchlist-hide": "숨기기",
+       "wlshowtime": "주시할 기간:",
+       "wlshowhideminor": "사소한 편집",
+       "wlshowhidebots": "봇",
+       "wlshowhideliu": "등록된 사용자",
+       "wlshowhideanons": "익명 사용자",
+       "wlshowhidemine": "내 편집",
        "watchlist-options": "주시문서 목록 설정",
        "watching": "주시 추가 중…",
        "unwatching": "주시 해제 중…",
        "enotif_impersonal_salutation": "{{SITENAME}} 사용자",
        "enotif_subject_deleted": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|삭제했습니다}}",
        "enotif_subject_created": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|만들었습니다}}",
-       "enotif_subject_moved": "{{SITENAME}} $1 ë¬¸ì\84\9c를 $2 ì\82¬ì\9a©ì\9e\90ê°\80 {{GENDER:$2|ì\98®ê²¼습니다}}",
+       "enotif_subject_moved": "{{SITENAME}} $1 ë¬¸ì\84\9c를 $2 ì\82¬ì\9a©ì\9e\90ê°\80 {{GENDER:$2|ì\9d´ë\8f\99í\95\98ì\98\80습니다}}",
        "enotif_subject_restored": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|되살렸습니다}}",
        "enotif_subject_changed": "{{SITENAME}} $1 문서를 $2 사용자가 {{GENDER:$2|바꾸었습니다}}",
        "enotif_body_intro_deleted": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|삭제했으며}} $3 에서 볼 수 있습니다.",
        "enotif_body_intro_created": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|만들었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
-       "enotif_body_intro_moved": "{{SITENAME}} $1 ë¬¸ì\84\9c를 $PAGEEDITDATEì\97\90 $2 ì\82¬ì\9a©ì\9e\90ê°\80 {{GENDER:$2|ì\98®ê²¼으며}} 현재 판은 $3 에서 볼 수 있습니다.",
+       "enotif_body_intro_moved": "{{SITENAME}} $1 ë¬¸ì\84\9c를 $PAGEEDITDATEì\97\90 $2 ì\82¬ì\9a©ì\9e\90ê°\80 {{GENDER:$2|ì\9d´ë\8f\99í\95\98ì\98\80으며}} 현재 판은 $3 에서 볼 수 있습니다.",
        "enotif_body_intro_restored": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.",
        "enotif_body_intro_changed": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
        "enotif_lastvisited": "마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1 을 보세요.",
        "delete-edit-reasonlist": "삭제 이유 편집",
        "delete-toobig": "이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 이상 있습니다.\n{{SITENAME}}에 의도하지 않은 혼란을 줄 수 있기 때문에 이런 문서의 삭제는 제한됩니다.",
        "delete-warning-toobig": "이 문서에는 {{PLURAL:$1|편집 역사}}가 $1개 있습니다.\n편집 역사가 긴 문서를 삭제하면 {{SITENAME}} 데이터베이스 동작에 큰 영향을 줄 수 있습니다.\n주의해 주세요.",
-       "deleteprotected": "이 문서가 잠겨 있기 때문에 삭제할 수 없습니다.",
+       "deleteprotected": "이 문서가 보호되어 있기 때문에 삭제할 수 없습니다.",
        "deleting-backlinks-warning": "'''경고:''' 삭제하려는 문서가 [[Special:WhatLinksHere/{{FULLPAGENAME}}|다른 문서]]에 링크되어 있거나 끼워져 있습니다.",
        "rollback": "편집 되돌리기",
        "rollbacklink": "되돌리기",
        "protectedarticle": "사용자가 \"[[$1]]\" 문서를 보호했습니다",
        "modifiedarticleprotection": "사용자가 \"[[$1]]\" 문서의 보호 설정을 바꿨습니다",
        "unprotectedarticle": "사용자가 \"[[$1]]\" 문서를 보호 해제했습니다",
-       "movedarticleprotection": "ì\82¬ì\9a©ì\9e\90ê°\80 ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 \"[[$2]]\"ì\97\90ì\84\9c \"[[$1]]\"ì\9c¼ë¡\9c ì\98®ê²¼습니다",
+       "movedarticleprotection": "ì\82¬ì\9a©ì\9e\90ê°\80 ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 \"[[$2]]\"ì\97\90ì\84\9c \"[[$1]]\"ì\9c¼ë¡\9c ì\9d´ë\8f\99í\96\88습니다",
        "protect-title": "\"$1\" 보호하기",
        "protect-title-notallowed": "\"$1\" 문서의 보호 수준 보기",
        "prot_1movedto2": "[[$1]] 문서를 [[$2]] 문서로 옮김",
        "maximum-size": "최대 크기:",
        "pagesize": "(바이트)",
        "restriction-edit": "편집",
-       "restriction-move": "ì\98®ê¸°ê¸°",
+       "restriction-move": "ì\9d´ë\8f\99",
        "restriction-create": "만들기",
        "restriction-upload": "올리기",
        "restriction-level-sysop": "보호됨",
        "contributions": "{{GENDER:$1|사용자}} 기여",
        "contributions-title": "$1 사용자의 기여",
        "mycontris": "기여",
+       "anoncontribs": "기여",
        "contribsub2": "{{GENDER:$3|$1}}($2)의 기여",
        "contributions-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
        "nocontribs": "지정한 조건과 일치하는 바뀜을 찾을 수 없습니다.",
        "lockfilenotwritable": "데이터베이스 잠금 파일에 쓰기 권한이 없습니다.\n데이터베이스를 잠그거나 잠금 해제하려면, 웹 서버에서 이 파일의 쓰기 권한을 설정해야 합니다.",
        "databasenotlocked": "데이터베이스가 잠겨 있지 않습니다.",
        "lockedbyandtime": "({{GENDER:$1|$1}} 사용자가 $2 $3에 잠금)",
-       "move-page": "$1 ì\98®ê¸°ê¸°",
-       "move-page-legend": "문ì\84\9c ì\98®ê¸°ê¸°",
+       "move-page": "$1 ì\9d´ë\8f\99",
+       "move-page-legend": "문ì\84\9c ì\9d´ë\8f\99",
        "movepagetext": "아래 양식을 채워 문서의 이름을 바꾸고 모든 역사를 새 이름으로 된 문서로 옮길 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 되고,\n원래 이름을 가리키는 넘겨주기는 자동으로 갱신됩니다.\n만약 이 설정을 선택하지 않았다면 [[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 이동한 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
-       "movepagetext-noredirectfixer": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94꾸고 ëª¨ë\93  ì\97­ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c ë¬¸ì\84\9cë¡\9c ì\98®ê¸¸ 수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 됩니다.\n[[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 옮긴 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
-       "movepagetalktext": "ì²´í\81¬í\95\98ë©´, ë\94¸ë¦° í\86 ë¡  ë¬¸ì\84\9cê°\80 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ì\98®ê²¨ì§\91ë\8b\88ë\8b¤. ë\8b¤ë§\8c, ë¹\84ì\96´ì\9e\88ì§\80 ì\95\8aì\9d\80 í\86 ë¡  ë¬¸ì\84\9cê°\80 ì\9e\88ë\8b¤ë©´ ì\98®ê²¨ì§\80ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.\n\nì\9d´ë\9f¬í\95\9c ê²½ì\9a°ì\97\90ë\8a\94, ì\88\98ë\8f\99ì\9c¼ë¡\9c ì\98®ê¸°거나 합쳐야 합니다.",
-       "moveuserpage-warning": "<strong>경고:</strong> ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c를 ì\98®ê¸°ë ¤ 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 <strong>않는다</strong>는 점을 참고하세요.",
-       "movecategorypage-warning": "<strong>경고:</strong> ë¶\84ë¥\98 ë¬¸ì\84\9c를 ì\98®ê¸°ë ¤ê³  í\95©ë\8b\88ë\8b¤. í\95´ë\8b¹ ë¬¸ì\84\9cë§\8c ì\98®ê²¨ì§\80고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
+       "movepagetext-noredirectfixer": "ì\95\84ë\9e\98 ì\96\91ì\8b\9dì\9d\84 ì±\84ì\9b\8c ë¬¸ì\84\9cì\9d\98 ì\9d´ë¦\84ì\9d\84 ë°\94꾸고 ëª¨ë\93  ì\97­ì\82¬ë¥¼ ì\83\88 ì\9d´ë¦\84ì\9c¼ë¡\9c ë\90\9c ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\95  수 있습니다.\n원래의 문서는 새 문서로 넘겨주는 링크로만 남게 됩니다.\n[[Special:DoubleRedirects|이중 넘겨주기]]와 [[Special:BrokenRedirects|끊긴 넘겨주기]]를 확인해주세요.\n당신은 링크와 가리키는 대상이 서로 일치하도록 해야 할 책임이 있습니다.\n\n만약 이미 있는 문서의 이름을 새 이름으로 입력했을 때는 그 문서가 넘겨주기 문서이고 문서 역사가 없어야만 이동이 됩니다. 그렇지 않을 경우에는 이동되지 <strong>않습니다</strong>.\n이것은 실수로 옮긴 문서를 되돌릴 수는 있지만, 이미 존재하는 문서 위에 덮어씌울 수는 없다는 것을 의미합니다.\n\n<strong>주의!</strong>\n자주 사용하는 문서를 이동하면 해결하기 어려운 문제를 일으킬 수도 있습니다.\n이동하기 전에 반드시 이 문서를 이동해도 문제가 없는지 확인해주세요.",
+       "movepagetalktext": "ì²´í\81¬í\95\98ë©´, ë\94¸ë¦° í\86 ë¡  ë¬¸ì\84\9cê°\80 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ì\9d´ë\8f\99ë\90©ë\8b\88ë\8b¤. ë\8b¤ë§\8c, ë¹\84ì\96´ì\9e\88ì§\80 ì\95\8aì\9d\80 í\86 ë¡  ë¬¸ì\84\9cê°\80 ì\9e\88ë\8b¤ë©´ ì\9d´ë\8f\99ë\90\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.\n\nì\9d´ë\9f¬í\95\9c ê²½ì\9a°ì\97\90ë\8a\94, ì\88\98ë\8f\99ì\9c¼ë¡\9c ì\9d´ë\8f\99í\95\98거나 합쳐야 합니다.",
+       "moveuserpage-warning": "<strong>경고:</strong> ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95\98려고 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 <strong>않는다</strong>는 점을 참고하세요.",
+       "movecategorypage-warning": "<strong>경고:</strong> ë¶\84ë¥\98 ë¬¸ì\84\9c를 ì\9d´ë\8f\99í\95\98려고 í\95©ë\8b\88ë\8b¤. í\95´ë\8b¹ ë¬¸ì\84\9cë§\8c ì\9d´ë\8f\99ë\90\98고 옛 분류에 있는 문서는 새 분류 안에 다시 분류되지 <em>않음</em>을 참고하세요.",
        "movenologintext": "문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.",
        "movenotallowed": "문서를 옮길 권한이 없습니다.",
        "movenotallowedfile": "파일을 옮길 권한이 없습니다.",
        "cant-move-to-category-page": "문서를 분류 문서로 옮길 권한이 없습니다.",
        "newtitle": "새 제목:",
        "move-watch": "원래 문서와 대상 문서를 주시하기",
-       "movepagebtn": "문ì\84\9c ì\98®ê¸°ê¸°",
-       "pagemovedsub": "ì\98®ê¸°ê¸° 성공",
-       "movepage-moved": "'''\"$1\" ë¬¸ì\84\9c를 \"$2\" ë¬¸ì\84\9cë¡\9c ì\98®ê²¼습니다.'''",
+       "movepagebtn": "문ì\84\9c ì\9d´ë\8f\99",
+       "pagemovedsub": "ì\9d´ë\8f\99 성공",
+       "movepage-moved": "'''\"$1\" ë¬¸ì\84\9c를 \"$2\" ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\96\88습니다.'''",
        "movepage-moved-redirect": "넘겨주기 문서를 만들었습니다.",
        "movepage-moved-noredirect": "넘겨주기 문서를 남기지 않았습니다.",
        "articleexists": "문서가 이미 존재하거나 이름이 올바르지 않습니다.\n다른 이름을 선택하세요.",
        "cantmove-titleprotected": "새로운 제목으로 문서를 만드는 것이 금지되어 있어 문서를 옮길 수 없습니다",
-       "movetalk": "ë\94¸ë¦° í\86 ë¡  ë¬¸ì\84\9cë\8f\84 ì\98®ê¸°기",
-       "move-subpages": "í\95\98ì\9c\84 ë¬¸ì\84\9cë\8f\84 ì\98®ê¸°ê¸° ($1개까지)",
-       "move-talk-subpages": "í\86 ë¡  ë¬¸ì\84\9cì\9d\98 í\95\98ì\9c\84 ë¬¸ì\84\9cë\8f\84 ì\98®ê¸°기 ($1개까지)",
+       "movetalk": "ë\94¸ë¦° í\86 ë¡  ë¬¸ì\84\9cë\8f\84 ì\9d´ë\8f\99í\95\98기",
+       "move-subpages": "í\95\98ì\9c\84 ë¬¸ì\84\9cë\8f\84 ì\9d´ë\8f\99 ($1개까지)",
+       "move-talk-subpages": "í\86 ë¡  ë¬¸ì\84\9cì\9d\98 í\95\98ì\9c\84 ë¬¸ì\84\9cë\8f\84 ì\9d´ë\8f\99í\95\98기 ($1개까지)",
        "movepage-page-exists": "$1 문서가 이미 존재하므로 자동으로 덮어쓸 수 없습니다.",
-       "movepage-page-moved": "\"$1\" ë¬¸ì\84\9c를 \"$2\" ë¬¸ì\84\9cë¡\9c ì\98®ê²¼습니다.",
+       "movepage-page-moved": "\"$1\" ë¬¸ì\84\9c를 \"$2\" ë¬¸ì\84\9cë¡\9c ì\9d´ë\8f\99í\96\88습니다.",
        "movepage-page-unmoved": "$1 문서를 $2 문서로 옮길 수 없습니다.",
-       "movepage-max-pages": "{{PLURAL:$1|문ì\84\9c}}를 ìµ\9cë\8c\80 $1ê°\9c ì\98®ê²¼ì\9c¼ë©° ë\82\98머ì§\80 ë¬¸ì\84\9cë\8a\94 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ì\98®ê¸°지 않습니다.",
+       "movepage-max-pages": "{{PLURAL:$1|문ì\84\9c}}를 ìµ\9cë\8c\80 $1ê°\9c ì\9d´ë\8f\99í\96\88ì\9c¼ë©° ë\82\98머ì§\80 ë¬¸ì\84\9cë\8a\94 ì\9e\90ë\8f\99ì\9c¼ë¡\9c ì\9d´ë\8f\99í\95\98지 않습니다.",
        "movelogpage": "옮기기 기록",
        "movelogpagetext": "아래는 옮겨진 모든 문서의 목록입니다.",
        "movesubpage": "{{PLURAL:$1|하위 문서}}",
        "movenosubpage": "이 문서에는 하위 문서가 존재하지 않습니다.",
        "movereason": "이유:",
        "revertmove": "되돌리기",
-       "delete_and_move": "삭제하고 옮기기",
        "delete_and_move_text": "== 삭제 필요 ==\n이동하려는 제목으로 된 \"[[:$1]]\" 문서가 이미 존재합니다.\n삭제하고 이동할까요?",
        "delete_and_move_confirm": "네. 문서를 삭제합니다",
        "delete_and_move_reason": "\"[[$1]]\"에서 문서를 이동하기 위해 삭제함",
        "imageinvalidfilename": "새 파일 이름이 잘못되었습니다.",
        "fix-double-redirects": "원래 제목을 가리키는 넘겨주기를 새로 고침",
        "move-leave-redirect": "옮긴 뒤 넘겨주기를 남기기",
-       "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 잠겨 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
-       "semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 ì\9e ê²¨ ì\9e\88ì\8aµë\8b\88ë\8b¤.\nìµ\9cê·¼ ê¸°ë¡\9d ë\82´ì\9a©ì\9d\84 ì°¸ì¡°ë¥¼ ì\9c\84í\95´ ì\95\84ë\9e\98ì\97\90 ì \9cê³µí\95©ë\8b\88ë\8b¤:",
-       "move-over-sharedrepo": "== í\8c\8cì\9d¼ì\9d´ ì¡´ì\9e¬í\95¨ ==\n[[:$1]] í\8c\8cì\9d¼ì\9d´ ê³µì\9a© ì \80ì\9e¥ì\86\8cì\97\90 ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\9d´ ì\9d´ë¦\84ì\9c¼ë¡\9c í\8c\8cì\9d¼ì\9d\84 ì\98®ê¸°면 공용의 파일을 덮어쓰게 될 것입니다.",
+       "protectedpagemovewarning": "<strong>경고:</strong> 이 문서는 관리자만 이동할 수 있도록 보호되어 있습니다.\n최근 기록을 참조를 위해 아래에 제공합니다:",
+       "semiprotectedpagemovewarning": "<strong>참고:</strong> 이 문서는 등록된 사용자만이 이동할 수 있도록 ë³´í\98¸ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.\nìµ\9cê·¼ ê¸°ë¡\9d ë\82´ì\9a©ì\9d´ ì°¸ì¡°ë¥¼ ì\9c\84í\95´ ì\95\84ë\9e\98ì\97\90 ì \9cê³µë\90©ë\8b\88ë\8b¤:",
+       "move-over-sharedrepo": "== í\8c\8cì\9d¼ì\9d´ ì¡´ì\9e¬í\95¨ ==\n[[:$1]] í\8c\8cì\9d¼ì\9d´ ê³µì\9a© ì \80ì\9e¥ì\86\8cì\97\90 ì\9e\88ì\8aµë\8b\88ë\8b¤. ì\9d´ ì\9d´ë¦\84ì\9c¼ë¡\9c í\8c\8cì\9d¼ì\9d\84 ì\9d´ë\8f\99í\95\98면 공용의 파일을 덮어쓰게 될 것입니다.",
        "file-exists-sharedrepo": "선택한 파일 이름은 공용 저장소에서 사용 중입니다.\n다른 이름을 선택하세요.",
        "export": "문서 내보내기",
        "exporttext": "특정 문서와 그 문서의 편집 역사를 XML 파일로 만들 수 있습니다. 이렇게 만들어진 파일은 다른 미디어위키에서 [[Special:Import|문서 가져오기]] 기능을 통해 가져갈 수 있습니다.\n\n문서를 내보내려면, 내보내려는 문서 제목을 한 줄에 하나씩 입력해주세요. 그리고 문서의 전체 역사가 필요한지, 혹은 현재 버전만이 필요한지를 선택해 주세요.\n\n특정 문서를 내보내려면, 예를 들어 \"[[{{MediaWiki:Mainpage}}]]\" 문서를 내보내려면 [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] 링크를 사용할 수도 있습니다.",
        "tooltip-pt-preferences": "사용자 환경 설정",
        "tooltip-pt-watchlist": "주시문서에 대한 바뀜 목록",
        "tooltip-pt-mycontris": "내 기여의 목록",
+       "tooltip-pt-anoncontribs": "이 IP 주소의 편집 목록",
        "tooltip-pt-login": "꼭 로그인해야 하는 것은 아니지만, 로그인을 권장합니다.",
        "tooltip-pt-logout": "로그아웃",
        "tooltip-pt-createaccount": "계정을 만들고 로그인하는 것이 좋습니다; 하지만, 필수는 아닙니다",
        "tooltip-ca-talk": "문서의 내용에 대한 토론 문서",
        "tooltip-ca-edit": "이 문서 편집하기",
        "tooltip-ca-addsection": "문단 추가하기",
-       "tooltip-ca-viewsource": "이 문서가 잠겨 있습니다.\n문서의 원본을 볼 수 있습니다.",
+       "tooltip-ca-viewsource": "이 문서가 보호되어 있습니다.\n문서의 원본을 볼 수 있습니다.",
        "tooltip-ca-history": "문서의 과거 판",
        "tooltip-ca-protect": "문서 보호하기",
        "tooltip-ca-unprotect": "이 문서의 보호 설정을 바꾸기",
        "tooltip-ca-delete": "문서 삭제하기",
        "tooltip-ca-undelete": "삭제되기 전에 이 문서의 완료한 편집 되살리기",
-       "tooltip-ca-move": "ì\9d´ ë¬¸ì\84\9c ì\98®ê¸°ê¸°",
+       "tooltip-ca-move": "ì\9d´ ë¬¸ì\84\9c ì\9d´ë\8f\99",
        "tooltip-ca-watch": "이 문서를 주시문서 목록에 추가",
        "tooltip-ca-unwatch": "이 문서를 주시문서 목록에서 제거",
        "tooltip-search": "{{SITENAME}} 검색",
        "htmlform-cloner-required": "적어도 하나의 값이 필요합니다.",
        "htmlform-title-badnamespace": "[[:$1]] 문서는 \"{{ns:$2}}\" 이름공간에 없습니다.",
        "htmlform-title-not-creatable": "\"$1\"은 만들 수 없는 문서 제목입니다.",
-       "htmlform-title-not-exists": "[[:$1]] 문서는 존재하지 않습니다.",
+       "htmlform-title-not-exists": "$1 문서는 존재하지 않습니다.",
        "htmlform-user-not-exists": "<strong>$1</strong> 문서는 존재하지 않습니다.",
        "htmlform-user-not-valid": "<strong>$1</strong>은 올바른 사용자 이름이 아닙니다.",
        "sqlite-has-fts": "$1 (본문 전체 검색 지원)",
        "logentry-import-upload": "$1 사용자가 $3 문서를 파일 올리기로 {{GENDER:$2|가져왔습니다}}",
        "logentry-import-interwiki": "$1 사용자가 $3을 다른 위키에서 {{GENDER:$2|가져왔습니다}}",
        "logentry-merge-merge": "$1 사용자가 $3 문서를 $4 안에 {{GENDER:$2|병합했습니다}} (판은 $5까지)",
-       "logentry-move-move": "$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 $4 ë¬¸ì\84\9cë¡\9c {{GENDER:$2|ì\98®ê²¼습니다}}",
+       "logentry-move-move": "$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 $4 ë¬¸ì\84\9cë¡\9c {{GENDER:$2|ì\9d´ë\8f\99í\96\88습니다}}",
        "logentry-move-move-noredirect": "$1 사용자가 $3 문서를 넘겨주기를 만들지 않고 $4 문서로 {{GENDER:$2|옮겼습니다}}",
-       "logentry-move-move_redir": "$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 $4 ë¬¸ì\84\9cë¡\9c {{GENDER:$2|ì\98®ê¸°면서}} 넘겨주기를 덮어썼습니다",
-       "logentry-move-move_redir-noredirect": "$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 $4 ë¬¸ì\84\9cë¡\9c ë\84\98겨주기를 ë\82¨ê¸°ì§\80 ì\95\8aê³  {{GENDER:$2|ì\98®ê¸°ë©´ì\84\9c}} ì\98®ê¸¸ 대상에 있던 넘겨주기를 덮어썼습니다",
+       "logentry-move-move_redir": "$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 $4 ë¬¸ì\84\9cë¡\9c {{GENDER:$2|ì\9d´ë\8f\99í\95\98면서}} 넘겨주기를 덮어썼습니다",
+       "logentry-move-move_redir-noredirect": "$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 $4 ë¬¸ì\84\9cë¡\9c ë\84\98겨주기를 ë\82¨ê¸°ì§\80 ì\95\8aê³  {{GENDER:$2|ì\9d´ë\8f\99í\95\98ë©´ì\84\9c}} ì\9d´ë\8f\99í\95  대상에 있던 넘겨주기를 덮어썼습니다",
        "logentry-patrol-patrol": "$1 사용자가 $3 문서의 $4판을 점검한 것으로 {{GENDER:$2|표시했습니다}}",
        "logentry-patrol-patrol-auto": "$1 사용자가 자동적으로 $3 문서의 $4판을 점검한 것으로 {{GENDER:$2|표시했습니다}}",
        "logentry-newusers-newusers": "$1 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "logentry-newusers-create2": "$1 사용자가 $3 사용자 계정을 {{GENDER:$2|만들었습니다}}",
        "logentry-newusers-byemail": "$3 사용자 계정을 $1님이 {{GENDER:$2|만들었고}} 비밀번호는 이메일로 보냈습니다",
        "logentry-newusers-autocreate": "$1 사용자 계정을 자동으로 {{GENDER:$2|만들었습니다}}",
-       "logentry-protect-move_prot": "$1 ì\82¬ì\9a©ì\9e\90ê°\80 ë³´í\98¸ ì\84¤ì \95ì\9d\84 $4ì\97\90ì\84\9c $3ì\9c¼ë¡\9c {{GENDER:$2|ì\98®ê²¼습니다}}",
+       "logentry-protect-move_prot": "$1 ì\82¬ì\9a©ì\9e\90ê°\80 ë³´í\98¸ ì\84¤ì \95ì\9d\84 $4ì\97\90ì\84\9c $3ì\9c¼ë¡\9c {{GENDER:$2|ì\9d´ë\8f\99í\96\88습니다}}",
        "logentry-protect-unprotect": "$1 사용자가 $3 문서의 보호를 {{GENDER:$2|해제했습니다}}",
        "logentry-protect-protect": "$1 사용자가 $3 문서를 {{GENDER:$2|보호했습니다}} $4",
        "logentry-protect-protect-cascade": "$1 사용자가 $3 문서를 {{GENDER:$2|보호했습니다}} $4 [연쇄적]",
index 5958156..81ed4e7 100644 (file)
@@ -16,6 +16,7 @@
        "tog-hideminor": "Dun de klein Mini-Änderonge (<strong>M</strong>) en de Leß met de „{{lcfirst:{{int:Recentchanges}}}}“ <strong>nit</strong> aanzeije",
        "tog-hidepatrolled": "Dun de nohjeloorte Änderunge en de „{{int:recentchanges}}“ eez ens <strong>nit</strong> aanzeije",
        "tog-newpageshidepatrolled": "Dun de nohjeloorte Änderunge en de Leß „{{int:newpages}}“ eez ens <strong>nit</strong> aanzeije",
+       "tog-hidecategorization": "Donn de Sigge nit ennohdene",
        "tog-extendwatchlist": "Verjrößer de Oppaßleß för jede Aat vun müjjeliche Ännderonge ze zeije, nit alleijns  de neuste.",
        "tog-usenewrc": "De Änderonge en de „{{int:Recentchanges}}“ un en de Oppaßleß en Jroppe zesammevaße.",
        "tog-numberheadings": "Dun de Üvverschrefte automatisch nummereere",
        "tog-watchlisthidebots": "Dun jedes Mohl dä Bots ehr Änderonge <strong>nit</strong> en minger Oppaßleß zeije",
        "tog-watchlisthideminor": "Donn jehdes Mohl de klein Mini-Ännderonge <strong>nit</strong> en minger Oppaßleß zeije",
        "tog-watchlisthideliu": "Enjeloggte Metmaacher ier Änderonge jehdesmohl <strong>nit</strong> en minger Oppaßleß aanzeije",
+       "tog-watchlistreloadautomatically": "Don de Oppaßleß automattesch neu lahde, wann ene Flter verändert wohd (bruch JavaSkrepp)",
        "tog-watchlisthideanons": "Nahmelohse Metmaacher ier Änderonge jehdesmohl <strong>nit</strong> en minger Oppaßleß aanzeije.",
        "tog-watchlisthidepatrolled": "Donn de nohjelohrte Oppaßleß et eez ens <strong>nit</strong> en minger Oppaßleß aanzeije.",
+       "tog-watchlisthidecategorization": "Donn de Sigge nit ennohdene",
        "tog-ccmeonemails": "Scheck mer en Kopie, wann ich en <i lang=\"en\">e-mail</i> an ene andere Metmaacher scheck",
        "tog-diffonly": "Zeich beim Versione Verjliche nur de Ungerscheide aan (ävver pack nit noch de janze Sigg dodronger)",
        "tog-showhiddencats": "Donn de verschtoche Saachjroppe aanzeije",
        "morenotlisted": "Et jeiht noch wigger&nbsp;…",
        "mypage": "Metmaachersigg",
        "mytalk": "Klaafsigg",
-       "anontalk": "Klaaf för de IP-Adress",
+       "anontalk": "Klaaf för ene nahmelohse Metmaacher",
        "navigation": "Jangk noh de",
        "and": ", un",
        "qbfind": "Fingk",
        "actions": "Akßjuhne",
        "namespaces": "Appachtemangs",
        "variants": "Variante",
-       "navigation-heading": "Menü för et Navijeere",
+       "navigation-heading": "Navijehre",
        "errorpagetitle": "Fähler",
        "returnto": "Jangk widder noh: „$1“.",
        "tagline": "Uß {{GRAMMAR:Dativ | {{ucfirst:{{SITENAME}}}}}}",
        "history_short": "Väsjohne",
        "updatedmarker": "(jeändert)",
        "printableversion": "För ze Dröcke",
-       "permalink": "Ne Permalink noh heh",
+       "permalink": "Permalengk noh heh",
        "print": "Drocke",
-       "view": "Beloore",
+       "view": "Belohre",
        "view-foreign": "Op $1 beloohre",
        "edit": "Ändere",
        "edit-local": "Aanmärkonge heh em Wikki beärbeide",
        "create": "Aanlähje",
        "create-local": "Aanmärkonge heh em Wikki derbei donn",
-       "editthispage": "De Sigg ändere",
+       "editthispage": "De Sigg änndere",
        "create-this-page": "Neu aanläje",
        "delete": "Fottschmieße",
        "deletethispage": "De Sigg fottschmieße",
        "no-null-revision": "Mer kunnte kein onveränderte neue Väsjohn vun dä Sigg „$1“ aanlääje.",
        "badtitle": "Verkihrte Üvverschreff",
        "badtitletext": "De Üvverschreff es esu nit en Ohdenong. Et moß jät dren schtonn.\nEt künnt sin, dat ein vun de schpezjäll Zeijsche dren schteiht,\nwat en Üvverschrefte nit älaub es.\nEt künnt ußsinn, wie ene EngerWikiLenk,\ndat jeiht ävver nit.\nMoß De reparehre.",
-       "title-invalid-empty": "De jewönschter Övverschrevv vun dä Sigg es läddesch, udder et es blohs e Appachtemang aam Aanfang dren.",
+       "title-invalid-empty": "De Övverschrevv vun dä jewönschte Sigg es läddesch, udder et es blohs e Appachtemang aam Aanfang dren.",
        "title-invalid-utf8": "En dä jewönschte Övverschreff för di Sigg es ene kapodde <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Däm Unicode singe Universal Coded Character Set + Transformation Format—8-Bit\">UTF-8</i>-Anndeijl.",
        "title-invalid-interwiki": "En dä jewönschte Övverschrevv es ene Engerwikkilengk dren, un dä kam_mer doh nit bruche.",
        "title-invalid-talk-namespace": "De jewönschte Övverschreff för di Sigg wöhr för en Klaafsigg, di et nit jävve kann.",
        "title-invalid-relative": "Di jewönschte Övverschreff sühd uß, wi ene rellatihve Pahd. Esu en Övverschreffte lohße mer nit zoh, weil se met de mihzde Brausere nit afjerohfe wähde künne.",
        "title-invalid-magic-tilde": "En dä jewönschte Övverschreff för di Sigg es de Reih uß 4 Tilde (<nowiki>~~~</nowiki>) un di es onjöltesch.",
        "title-invalid-too-long": "Di jewönschte Övverschreff för di Sigg es zoh lang. Se darref nit mih wi {{PLURAL:$1|ein|$1|kei}} <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\">Byte{{PLURAL:$1||s|}}</i> lang sin, em Kohd <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"Däm Unicode singe Universal Coded Character Set + Transformation Format—8-Bit\">UTF-8</i>.",
-       "title-invalid-leading-colon": "En dä jewönschter Övverschrevv för di Sigg es ene onjöllteje Dubbelpungk aam Aanfang dren.",
+       "title-invalid-leading-colon": "En dä Övverschrevv för heh di Sigg es ene onjöllteje Dubbelpungk aam Aanfang dren.",
        "perfcached": "Di Dahte heh noh kumme uss_em Zweschespeischer (<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„Zwescheschpeijscher “\">cache</i>) un künnte nit mih janz de allerneuste sin.\n{{PLURAL:$1|Bloß ein Antwoot es|Nit mih wi $1 Antwoote sin|Kein Antwoot es}} doh faßjehallde un ze han.",
        "perfcachedts": "De Daate heenoh kumme usem Zweschespeicher (<i lang=\"en\">cache</i>) un woodte aam $2 öm $3 opjenumme. Se künnte nit janz de allerneuste sin.\n{{PLURAL:$4|Bloß ein Antwoot es|Nit mih wi $4 Antwoote sind|Kein Antwoot es}} doh ze han.",
        "querypage-no-updates": "'''Heh di Sigg weed nit mih op ene neue Schtand jebraat.'''",
        "mypreferencesprotected": "Do häs nit dat Rääsch, Ding Enschtällonge ze verändere.",
        "ns-specialprotected": "{{int:nstab-special}}e künne mer nit ändere.",
        "titleprotected": "Di Övverschreff för en Sigg eß fum [[User:$1]] verbodde woode, un der Jrond wohr: ''„$2“''",
-       "filereadonlyerror": "Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.\n\nDä Wiki_Köbes dovun hät beim Deeschmaache als Jrond aanjejovve: „$3“",
+       "filereadonlyerror": "Mer künne di Dattei „$1“ nit ändere, weil dä Dateijebeshtand „$2“ bloß för ze Lässe doh es.\n\nDä Verantwootlesche doför hät beim Deeschmaache als Jrond aanjejovve: „$3“",
        "invalidtitle-knownnamespace": "„$3“ es en onjöltijje Övverschreff för em Appachtemang „$2“",
        "invalidtitle-unknownnamespace": "„$2“ es sn onjöltijje Övverschreff em onbikannte Appachtemang met dä Nommer $1",
        "exception-nologin": "Nit enjelogg",
        "createaccountreason": "Jrond:",
        "createacct-reason": "Der Jrond udder Aanlaß",
        "createacct-reason-ph": "Woröm deihs De noch ene Zohjang aanlääje?",
-       "createacct-captcha": "Zor Sescherheit",
-       "createacct-imgcaptcha-ph": "Jiv dä Täx en, dä De heh drövver sühs!",
        "createacct-submit": "Lohß Jonn!",
        "createacct-another-submit": "Donn jäz enne zohsäzlejje Zohjang aanlääje",
        "createacct-benefit-heading": "{{ucfirst:{{GRAMMAR:Nominative|{{ucfirst:{{SITENAME}}}}}}}} weed vun Minsche wi Dir jemaat.",
        "wrongpasswordempty": "Dat Passwood ka'mer nit fottlooße. Jetz muss De et noch ens versöke.",
        "passwordtooshort": "En Paßwööter {{PLURAL:$1|moß|möße|moß}} winnichstens {{PLURAL:$1|ei|$1|kei}} Zeiche, {{PLURAL:$1|Zeffer|Zeffere|Zeffere}}, udder Bochstave dren sin.",
        "passwordtoolong": "Paßwööter künnne nit länge sin wi {{PLURAL:$1|ein|$1|Noll}} Zeische.",
+       "passwordtoopopular": "Esu en jewöhnejje Paßwööter nämme mer nit aan. Söhk Der jädd uß, wat nit jehder_ein alle nahßlangs nemmp.",
        "password-name-match": "Ding Poßwoot moß anders wi Dinge Name als ene Metmaacher sin.",
        "password-login-forbidden": "Dä Zohjang met däm Metmaacher-Name un däm Paßwoot es verbodde.",
        "mailmypassword": "Lohß jonn!",
        "passwordreset-emailtext-ip": "Do künns et sällver jewääse sin, öhnswää em Internet hät vun dä IP-Adräß $1 öm\ne neu Paßwoot jefrooch, för Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
        "passwordreset-emailtext-user": "Dä Metmaacher $1 vun {{GRAMMAR:Dativ|{{SITENAME}}}} hät öm e neu Paßwoot jefrooch,\nför Dinge Zohjäng op {{GRAMMAR:Akkusativ|{{SITENAME}}}}\n$4\nHeh {{PLURAL:$3|dä Metmaacher hät|di Metmaacher han|hät keine Metmaacher}} Ding e-mail Addräß:\n\n$2\n\n{{PLURAL:$3|Dat Zweschepaßwoot leuf|Di Zweschepaßwööter loufe|Kein Zweschepaßwoot leuf}} en {{PLURAL:$5|enem Daach|$5 Dääsch|keinem Daach}} uß.\nDonn Desch jäz enlogge, un e neu Paßwoot faßlääje. Wann ene Andere wi\nDo dat heh aanjestüßße hät, udder wann De Desch widder aan Ding Paßwoot\nentsenne kanns, un et nimmih ändere wells, udder es suwwisu weiß, dann\nmoß De jäz jaa nix donn, un kanns Ding Paßwoot wigger bruche.",
        "passwordreset-emailelement": "Metmaacher Name: \n$1\n\nEijmohl-Paßwoot: \n$2",
-       "passwordreset-emailsent": "Wann dat en ennjedrahre <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för der Zohjang heh verschek, öm e neu Paßwoot ze krijje.",
+       "passwordreset-emailsentemail": "Wann dat en ennjedrahre <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß vun Der es, dann weed en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> för der Zohjang heh verschek, öm e neu Paßwoot ze krijje.",
        "passwordreset-emailsent-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh es verschek woode. Heh dronger kanns De se lässe.",
        "passwordreset-emailerror-capture": "En <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> met Aanjahbe zom neue Paßwoot för der Zohjang heh sullt verschek wääde, ävver dat Verscheke aan {{GENDER:$2|dä|dat|dä Metmaacher|de|dat}} $2 hät nit jeflup: $1",
        "changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
        "changeemail-header": "Donn heh dat Fommulaa ußfölle, öm Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze ändere. Wann De en Adräß loß wähde wells, maach dat Fäld läddesch, ih dat De dat Fommolaa loß scheks.",
-       "changeemail-passwordrequired": "Do moÃ\9f Ding PaÃ\9fwood enjävve, Ã¶m di Ã¤nderong ze beschtähteje.",
+       "changeemail-passwordrequired": "Do moÃ\9f Ding PaÃ\9fwood enjävve, Ã¶m di Ã\84nderong ze beschtähteje.",
        "changeemail-no-info": "Do mööts ald enjelogg sin, öm tiräk op di Sigg jonn ze dörve",
        "changeemail-oldemail": "Ding Address för de <i lang=\"en\">e-mail</i> es jäz:",
        "changeemail-newemail": "Ding neue Address för de <i lang=\"en\">e-mail</i> sull wääde:",
        "yourdiff": "Ungerscheide",
        "copyrightwarning": "Ding Beijdrähsch schtonn onger de $2, süch $1. Wann De nit han wells, dat Dinge Täx ömjemohdelt weed, un söns wohin verdeilt, dun en heh nit schpeischere. Mem Avspeischere sähs De och zo, dat et vun Dir selvs es, un/udder Do dat Rääch häs, en heh zo verbreide. Wann et nit schtemmp, udder Do kanns et nit nohwiese, kann Desch dat en dr Bau bränge!",
        "copyrightwarning2": "De Beijdrähsch {{GRAMMAR:en|{{SITENAME}}}} künne vun andere Metmaacher ömjemodelt\nudder fottjeschmeße wähde. Wann Der dat nit rääch es, schriiv nix. Et es och nühdesch, dat et vun Der selvs es, oder dat Do dat Rääsch häs, et heh öffentlich wigger ze jävve. Süch $1. Wann et nit schtemmp, oder Do kanns et nit nohwihse, künnt Desch dat en der Bou bränge!",
+       "editpage-cannot-use-custom-model": "Et Ennhalldsmodäll för heh di Sigg km_mer nit veränndere.",
        "longpageerror": "'''Janz schlemme Fähler:'''\nDä Tex, dä De heh jescheck häs, dä es {{PLURAL:$1|ein|$1|kei}} Kilobyte jruuß.\nDat {{PLURAL:$2|es mieh wie ei|sin mieh wie $2|es kei}} Kilobyte. Dat künne mer nit speichere!",
        "readonlywarning": "<strong>Opjepass:<strong>\nDe Daatebank es jesperrt woode, wo Do ald am Ändere wohs.\nDä.\nJetz kanns De Ding Änderunge nit mih faßhallde lohße.\nDun se bei Dir om Rechner faßhalde un versöhg et schpäder noch ens.\n\nNävvebei, dä Datenbank-Köbes hät för et Sperre och ene Jrund aanjejovve: $1",
        "protectedpagewarning": "<strong>Opjepass: Di Sigg heh es jähje Veränderonge jeschöz. Blohß de Wikki-Köbeße künne se änndere.</strong>\nHeh kütt der neuste Enndraach em Logbohch för di Sigg:",
        "permissionserrors": "Dat jeit nit, dat darfs De nit.",
        "permissionserrorstext": "Do häs nit dat Rääch, dat ze maache, {{PLURAL:$1|dä Jrund es:|de Jründe sin:|oohne Jrund.}}",
        "permissionserrorstext-withaction": "Do häs nit dat Rääch $2, {{PLURAL:$1|dä Jrond es:|de Jrönde sin:|ävver ohne aanjävbahre Jrond.}}",
-       "contentmodelediterror": "Di Väsjohn km_mer nit änndere, weil its content model is <code>$1</code>, but the current content model of the page is <code>$2</code>.",
+       "contentmodelediterror": "Di Väsjohn kam_mer nit änndere, weil its content model is <code>$1</code>, but the current content model of the page is <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Opjepaß:''' Do bes om bäste Wääsch, en Sigg neu aanzelähje, di doför ald ens fottjeschmeße woode wohr.\n\nBes förseschtesch un övverlääsch Der, of dat en johde Ideh es, di Sigg widder opzemaache. Domet De Bescheid weiß, heh de Endrääsh em Logbohch vum Sigge-Ömnänne, un em Logbohch vum Sigge-Fottschmihße mem Jrond, woröm di Sigg dohmohls fottjeschmeße woode es:",
        "moveddeleted-notice": "Heh di Sigg es fottjeschmeße.\nE Schtök uß dä Logböhscher fum Sigge_Fottschmihße un fum Sigge-Ömnänne för di Sigg kütt jäz, en dä Hoffnung, dat dat hellef.",
        "moveddeleted-notice-recent": "Schahd, di Sigg wohd en de läzde 24 Schtonde fottjeschmeße.\nDe Enndrähsch för heh di Sigg em Logbohch fum Sigge Fottschmiiße un Ömnänne küntt heh för zom Nohlohre.",
        "showingresultsinrange": "{{PLURAL:$1|<strong>Ein</strong> Saachjropp|<strong>$1</strong> Saachjroppe|Kein Saachjropp}}, vun Nommer <strong>$2</strong> bes Nommer <strong>$3</strong> {{PLURAL:$1|weed|wääde|weed}} heh opjeleß.",
        "search-showingresults": "{{PLURAL:$4|Heh es dä <strong>$1</strong>-te vun <strong>$3</strong> Träffere.|Träffer Nommero <strong>$1 bes $2</strong> vun <strong>$3</strong> Träffer.|Jevonge woodt woodt nix.}}",
        "search-nonefound": "Mer han nix zopaß jefonge för Ding Aanfrohch.",
+       "search-nonefound-thiswiki": "Mer han en heh dä ẞait nix zopaß jefonge för Ding Aanfrohch.",
        "powersearch-legend": "Extra Söhke",
        "powersearch-ns": "Söök en de Apachtemangs:",
        "powersearch-togglelabel": "&nbsp;",
        "prefsnologintext2": "Donn ennlogge, öm Ding Enschtällonge ze verändere.",
        "prefs-skin": "Et Ußsinn",
        "skin-preview": "Vör-Ansich",
-       "datedefault": "Ejaal - kein Vörliebe",
+       "datedefault": "Ejahl",
        "prefs-labs": "Neu Saache zom Ußprobeere, di künnte noch nit akeraat fluppe",
        "prefs-user-pages": "Metmaachersigge",
        "prefs-personal": "De Ennschtällonge",
        "right-editmywatchlist": "De eije Oppaßleß ändere. Opjepaß: e paa Axjuhne donn Sigge en di Less_eren, och der ohne dat Rääsch.",
        "right-viewmyprivateinfo": "ding eije päsöhnlesche Dahte belohre, wi de Adräß för de <i lang=\"en\" xml:lang=\"en\">e-mail</i> udder Dinge ääschte Nahme",
        "right-editmyprivateinfo": "ding eije päsöhnlesche Dahte ändere, wi de Adräß för de <i lang=\"en\" xml:lang=\"en\">e-mail</i> udder der ääschte Nahme",
-       "right-editmyoptions": "De eije Enschtällonge ändere",
+       "right-editmyoptions": "De eije Enschtällonge änndere",
        "right-rollback": "All de letzte Ännderonge vum läzde Metmaacher aan ene Sigg retuhr maache",
        "right-markbotedits": "Retuhr jenumme Ännderonge als Ännderonge vun Bots makkehre",
        "right-noratelimit": "Kein Beschränkonge dorsch Jränze (<i lang=\"en\">[http://www.mediawiki.org/wiki/Manual:%24wgRateLimits $wgRateLimits]</i>)",
        "rcshowhidebots": "de Bots ehr Änderonge $1",
        "rcshowhidebots-show": "aanzeije",
        "rcshowhidebots-hide": "verschteihsche",
-       "rcshowhideliu": "$1 de aanjemällte Metmaacher ehr Änderonge",
+       "rcshowhideliu": "de aanjemällte Metmaacher ehr Änderonge $1",
        "rcshowhideliu-show": "aanzeije",
        "rcshowhideliu-hide": "verschteihsche",
-       "rcshowhideanons": "$1 de nahmelohse Metmaacher ehr Änderonge",
+       "rcshowhideanons": "de nahmelohse Metmaacher ehr Änderonge $1",
        "rcshowhideanons-show": "aanzeije",
        "rcshowhideanons-hide": "verschteihsche",
        "rcshowhidepatr": "de nohjeluhrte Änderonge $1",
        "rcshowhidemine": "ming eije Änderonge $1",
        "rcshowhidemine-show": "aanzeije",
        "rcshowhidemine-hide": "verschteihsche",
+       "rcshowhidecategorization": "De Sigge ier Ennohdenong $1",
+       "rcshowhidecategorization-show": "Aanzeije!",
+       "rcshowhidecategorization-hide": "Verschteische!",
        "rclinks": "Zeisch de läzde {{int:pipe-separator}}$1{{int:pipe-separator}} Änderonge us de läzde {{int:pipe-separator}}$2{{int:pipe-separator}} Däch, un dun {{int:pipe-separator}} $3.",
        "diff": "Ongerscheid",
        "hist": "Väsjohne",
-       "hide": "Ußblände!",
+       "hide": "ußblände!",
        "show": "Zeije:",
        "minoreditletter": "M",
        "newpageletter": "N",
        "foreign-structured-upload-form-label-own-work": "dat es ming eije Wärk",
        "foreign-structured-upload-form-label-infoform-categories": "Saachjroppe",
        "foreign-structured-upload-form-label-infoform-date": "Dattum",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei de Rähjelle {{ucfirst:{{GRAMMAR:vun|{{ucfirst:{{SITENAME}}}}}}}} ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
        "foreign-structured-upload-form-label-not-own-work-local-local": "Do künnts edd och ens met dä [[Special:Upload|Schtandatt-Sigg zom Huhlahde]] versöhke welle.",
        "foreign-structured-upload-form-label-own-work-message-default": "Esch verschtonn, dadd esch en en jemeinsamme Sammlong huh aam lahde ben un dadd sesch dat met dä Bedengonge un de Lezänzbedengonge heh verdräht.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Wann De di Dattei nit en de jemeinsamme Sammlong vun Datteule huh lahde kanns un derbei de Rähjelle ennhalde, dann maach heh nit wigger, un probehr ene anndere Wähsch.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Wann dat noh dä Rähjelle doh jeiht, kanns De och probehre, [[Special:Upload|di Dattei {{GRAMMAR:em|{{ucfirst:{{SITENAME}}}}}} huhzelahde]]",
        "backend-fail-stream": "Mer kunnte di Dattei $1 nit övverdraare.",
        "backend-fail-backup": "Mer kunnte kein Sescherongskopih vun dä Dattei $1 maache.",
        "backend-fail-notexists": "En Dattei $1 jidd et nit.",
        "mostinterwikis": "Atikkele met de miehste Engerwikilengks",
        "mostrevisions": "Atikkele met de mihste Änderonge",
        "prefixindex": "Alle Sigge, dänne ehr Nahme med enem beschtemmpte Wood udder Täx aanfängk",
-       "prefixindex-namespace": "All Sigge med enem beschtemmpte Aanfang (Appachtemang $1 )",
+       "prefixindex-namespace": "Alle Sigge med enem beschtemmpte Aanfang em Appachtemang „$1“",
        "prefixindex-strip": "Donn der jemeinsamme Aanfang vun dä Tetelle en dä Leß fottlohße.",
        "shortpages": "Atikele zoteet vun koot noh lang",
        "longpages": "Atikele zoteet vun lang noh koot",
        "log-title-wildcard": "Sök noh Titelle, di aanfange met …",
        "showhideselectedlogentries": "Ußjesöhk Endrääsch verschteische udder zeije",
        "log-edit-tags": "Donn de Makehronge vun de ußjesöhk Enndrähsch em Logbohch beärbeide",
-       "allpages": "All Sigge",
+       "allpages": "Alle Sigge",
        "nextpage": "De nächste Sigg: „$1“",
        "prevpage": "Vörijje Sigg ($1)",
        "allpagesfrom": "Sigge aanzeije av däm Nahme:",
        "allpagesto": "Sigge aanzeije bes:",
        "allarticles": "All Atikkele",
-       "allinnamespace": "All Sigge (Em Appachtemeng „$1“)",
+       "allinnamespace": "Alle Sigge em Appachtemeng „$1“",
        "allpagessubmit": "Lohß Jonn!",
        "allpagesprefix": "Sigge zeije, wo dä Name aanfängk met:",
        "allpagesbadtitle": "Dä Siggenahme es nit ze jebruche. Dä hät e Köözel för en Schprohch uder för ene Engerwikki_Lengk am Aanfang, uder et kütt e Zeijsche dren för, wat en SiggenaHme nit jeiht, velleijsch och mih wie\neins vun all dämm op eimohl.",
        "wlheader-showupdated": "Wann se Einer jeändert hätt, zickdäm De se et letzte Mol aanjeluurt häs, sin di Sigge <strong>extra markeet</strong>.",
        "wlnote": "{{PLURAL:$1|Hee es de läzde Änderong uß|Hee sin de läzde <strong>$1</strong> Änderonge uß|Mer han kein Änderonge en}} de läzde {{PLURAL:$2|Stund|<strong>$2</strong> Stunde|<strong>noll</strong> Stunde}} zigg em $3 öm $4 Uhr.",
        "wlshowlast": "Zeisch de läzde $1 Schtunde, $2 Dähsch aan.",
+       "watchlistall2": "all",
+       "watchlist-hide": "Verschtisch",
+       "wlshowhideminor": "klein Minni-Änderonge",
+       "wlshowhidebots": "de Bots ehr Änderonge",
+       "wlshowhideliu": "de ennjeloggte Metmaacher ier Änderonge",
+       "wlshowhideanons": "de nahmelohse Metmaacher ier Änderonge",
+       "wlshowhidepatr": "de nohjelohrte Änderonge",
+       "wlshowhidemine": "ming eije Änderonge",
        "watchlist-options": "Eijeschaffte fun de Oppassless",
        "watching": "Drobb oppaßße…",
        "unwatching": "Nimmih drobb oppaßße",
        "rollback-success": "De Änderungen vum $1 zeröckjenumme, un dobei de letzte Version vum $2 widder jehollt.",
        "sessionfailure-title": "Fähler met dä Daate vum Enlogge",
        "sessionfailure": "Et jov wall e täschnesch Problehm met Dingem Login. Dröm ham_mer dat us Vörseesch jäz nix jemaht, domet mer nit velleich Ding Änderong däm verkihrte Metmaacher ongerjubele. Jangk zeröck un versöhk et noch ens.",
+       "changecontentmodel": "Et Modäll vum Ennhald vun ene Sigg verändere",
+       "changecontentmodel-legend": "Et Modäll vum Ennhald",
        "changecontentmodel-title-label": "Dä Sigg ier Övverschreff",
+       "changecontentmodel-model-label": "Et neuje Modäll för der Enhalld",
        "changecontentmodel-reason-label": "Der Jrond:",
+       "changecontentmodel-success-title": "Et Modäll för der Enhalld wohd veränndert",
+       "changecontentmodel-success-text": "Et Modäll för der Enhalld vun dä Sigg „[[:$1]]“ wohd veränndert",
        "logentry-contentmodel-change-revertlink": "retuhr_nämme",
        "logentry-contentmodel-change-revert": "retuhr_nämme",
        "protectlogpage": "Logbohch vum Sigge Schötze",
        "contributions": "{{GENDER:$1|Däm Metmaacher|Däm|Däm Metmaacher|Dä Metmaacherėn|Däm}} $1 {{GENDER:$1|singe|singe|singe|iere|singe}} Beijdrähsch",
        "contributions-title": "Beijdrähsch fum $1",
        "mycontris": "Beijdrähsch",
+       "anoncontribs": "Beijdrähsch",
        "contribsub2": "För {{GENDER:$3|dä|et|dä Metmaacher|de|dat}} $1: $1 ($2)",
        "contributions-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ ham_mer nit.",
        "nocontribs": "Mer han kein Änderunge jefonge, en de Logböcher, di do paße dähte.",
        "whatlinkshere-prev": "de vörijje {{PLURAL:$1||$1|noll}} zeije",
        "whatlinkshere-next": "de nächste {{PLURAL:$1||$1|noll}} zeije",
        "whatlinkshere-links": "← Links",
-       "whatlinkshere-hideredirs": "$1 de Ömleidonge",
-       "whatlinkshere-hidetrans": "$1 de Oproofe",
-       "whatlinkshere-hidelinks": "$1 de nommale Lengks",
+       "whatlinkshere-hideredirs": "de Ömleijdonge $1",
+       "whatlinkshere-hidetrans": "de Oproofe $1",
+       "whatlinkshere-hidelinks": "de nommahle Lengks $1",
        "whatlinkshere-hideimages": "$1 de Lengks op Datteihje",
        "whatlinkshere-filters": "Ußsööke",
        "autoblockid": "Automattesche Sperr Nommer $1",
        "movenosubpage": "Di Sigg hät kei Ongersigge.",
        "movereason": "Aanlass:",
        "revertmove": "Et Ömnänne zerök_nämme",
-       "delete_and_move": "Fottschmieße un Ömnenne",
        "delete_and_move_text": "== Dä! Dubbelte Name ==\nDi Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg ömnenne ze künne?",
        "delete_and_move_confirm": "Jo, dun di Sigg fottschmieße.",
        "delete_and_move_reason": "Fottjeschmeße, öm di Sigg „[[$1]]“ ömbenänne ze künne.",
        "allmessages-filter-legend": "Ußsöhke — wat för en Täxte o Nohreeshte aazeije?",
        "allmessages-filter": "Zohshtand:",
        "allmessages-filter-unmodified": "nit jeändert",
-       "allmessages-filter-all": "ejaal",
+       "allmessages-filter-all": "ejahl",
        "allmessages-filter-modified": "heh em Wiki jeändert",
        "allmessages-prefix": "Nahme fängk aan met:",
        "allmessages-language": "Schprohch:",
        "exif-urgency-low": "Klein ($1)",
        "exif-urgency-high": "Huh ($1)",
        "exif-urgency-other": "Selfs faßjelaat ($1)",
-       "namespacesall": "all",
+       "namespacesall": "alle",
        "monthsall": "all",
        "confirmemail": "E-Mail Adress bestätije",
        "confirmemail_noemail": "En [[Special:Preferences|Ding Ennschtällonge]] es kein öhntlije Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>.",
        "htmlform-cloner-required": "Winnischsdens eine Wääd es nühdesch.",
        "htmlform-title-badnamespace": "[[:$1]] es nit em Appachetmang „{{ns:$2}}“.",
        "htmlform-title-not-creatable": "„$1“ en kein Övverschreff, för di me en Sigg aanlähje künnt",
-       "htmlform-title-not-exists": "[[:$1]] jidd_et nit.",
+       "htmlform-title-not-exists": "$1 jidd_et nit.",
        "htmlform-user-not-exists": "<strong>$1</strong> jidd_et nit.",
        "htmlform-user-not-valid": "<strong>$1</strong> es keine jöltejje Nahme för ene Metmaacher.",
        "sqlite-has-fts": "Version $1 (un kann en janze Täxte söhke)",
index ed1dac4..84c1c0b 100644 (file)
@@ -15,7 +15,8 @@
                        "Welathêja",
                        "아라",
                        "Bikarhêner",
-                       "Uygar"
+                       "Uygar",
+                       "MikaelF"
                ]
        },
        "tog-underline": "Xetekê di bin girêdanê de çêke:",
        "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î.\n\n$1",
        "pool-errorunknown": "Çewtiyeke nenas",
-       "poolcounter-usage-error": "Çewtîyê bikaranînê: $1",
+       "poolcounter-usage-error": "Çewtiya bikaranînê: $1",
        "aboutsite": "Der barê {{SITENAME}} de",
        "aboutpage": "Project:Der barê",
        "copyright": "Naverok di $1 de derbasdar e.",
        "userlogin-yourpassword-ph": "Şîfreya xwe binivîse",
        "createacct-yourpassword-ph": "Şîfreya xwe binivîse",
        "yourpasswordagain": "Şîfreyê dîsa binivîse:",
-       "createacct-yourpasswordagain": "Şîfreye bipejirîne",
-       "createacct-yourpasswordagain-ph": "Şîfreyê ji nû ve têkeve",
+       "createacct-yourpasswordagain": "Şîfreyê bipejirîne",
+       "createacct-yourpasswordagain-ph": "Şîfreyê ji nû ve binivîse",
        "remembermypassword": "Şifreya min di her têketina min de bîne bîra xwe (herî zêde $1 {{PLURAL:$1|rojekê|rojan}})",
        "userlogin-remembermypassword": "Min têketî bihêle",
        "userlogin-signwithsecure": "Girêdana parastî bikarbîne",
        "userloginnocreate": "Têkeve",
        "logout": "Derkeve",
        "userlogout": "Derkeve",
-       "notloggedin": "Xwe tomar nekir",
+       "notloggedin": "Tu ne têketî yî",
        "userlogin-noaccount": "Hesabekî te nîne?",
        "userlogin-joinproject": "Tevlî {{SITENAME}} bibe",
        "nologin": "Hesabê te nîne? $1.",
        "gotaccount": "Hesabê te heye? $1.",
        "gotaccountlink": "Têkeve",
        "userlogin-resetlink": "Te agahiyên hesabê xwe ji bîr kirin?",
-       "userlogin-resetpassword-link": "Te şîfreye xwe jibîrkir?",
+       "userlogin-resetpassword-link": "Te şîfreya xwe ji bîr kir?",
        "userlogin-helplink2": "Alîkariya têketinê",
-       "userlogin-createanother": "Hesabek din çeke",
+       "userlogin-createanother": "Hesabekî din çêke",
        "createacct-emailrequired": "E-name",
        "createacct-emailoptional": "E-name",
        "createacct-email-ph": "E-nameya xwe binivîse",
-       "createacct-another-email-ph": "E-nameya xwe têkeve",
-       "createaccountmail": "Şîfreyek ji bo ji bo demeke kin bikarbînin û ji navnîşana hatiye diyarkirin re e-nameyek bişînin.",
+       "createacct-another-email-ph": "E-nameya xwe binivîse",
+       "createaccountmail": "Şîfreyeke demkî bikar bîne û wê ji navnîşana hatiye diyarkirin re bişîne.",
        "createacct-realname": "Navê te ya rast (Ko tu bixwazi bikeve, pêdivî nîne)",
        "createaccountreason": "Sedem:",
        "createacct-reason": "Sedem",
-       "createacct-reason-ph": "Çima hesabek din çedikîy",
-       "createacct-captcha": "Kontrola asayîşê",
-       "createacct-imgcaptcha-ph": "Nivîsa ku tu li jor dibînî binivîse",
+       "createacct-reason-ph": "Çima hesabekî din çêdikî",
        "createacct-submit": "Hesabê xwe biafirîne",
-       "createacct-another-submit": "Hesabek çêke",
-       "createacct-benefit-heading": "{{SITENAME}} ji alî mirovên wek te tê çêkirin.",
+       "createacct-another-submit": "Hesabekî çêke",
+       "createacct-benefit-heading": "{{SITENAME}} ji aliyê mirovên wek te ve tê çêkirin.",
        "createacct-benefit-body1": "{{PLURAL:$1|guhertin}}",
        "createacct-benefit-body2": "{{PLURAL:$1|rûpel}}",
        "badretype": "Her du şîfreyên ku te nivîsîn li hevdu nayên.",
        "userexists": "Ev navî bikarhênerî berê tê bikaranîn. Xêra xwe navekî din dake.",
        "loginerror": "Çewtiya têketinê",
-       "createacct-error": "Çewtîya çêkirine hesabê",
+       "createacct-error": "Çewtiya çêkirina hesabî",
        "createaccounterror": "Hesab nikare were çêkirin: $1",
        "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.",
+       "noname": "Navê ku te nivîsand ne derbasdar e.",
        "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!)",
        "passwordreset-email": "Navnîşana e-nameyê:",
        "passwordreset-emailtitle": "Hûragahiyên hesab li ser {{SITENAME}}",
        "passwordreset-emailelement": "Navê bikarhêner:\n$1\n\nŞîfreya niha:\n$2",
-       "passwordreset-emailsent": "E-nameyeke bibîrxistinê hate şandin.",
+       "passwordreset-emailsentemail": "E-nameyeke bibîrxistinê hate şandin.",
        "changeemail": "Navnîşana enameya xwe biguherîne an rabike",
        "changeemail-oldemail": "Navnîşana E-nameya niha:",
        "changeemail-newemail": "Navnîşana e-nameya nû:",
        "prefs-displayrc": "Vebijarkan nîşan bide",
        "prefs-displaywatchlist": "Vebijarkan nîşan bide",
        "prefs-diffs": "Cudahî",
-       "email-address-validity-valid": "E-name derbasdar e",
-       "email-address-validity-invalid": "E-nameyeke derbasdar binivîse",
        "userrights": "Îdarekirina mafên bikarhêneran",
        "userrights-lookup-user": "Birêvebirina koman",
        "userrights-user-editname": "Navekî bikarhêneriyê binivîse:",
        "wlheader-showupdated": "Ev rûpela hatî guhertin dema te lê meyzand bi '''nivîsa stûr''' tê xuyakirin.",
        "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  nîşan bide",
+       "watchlistall2": "hemû",
        "watchlist-options": "Vebijarkên lîsteya şopandinê",
        "watching": "Tê şopandin...",
        "unwatching": "Nay şopandin…",
        "movenosubpage": "Binrûpelên vê rûpelê tune ne.",
        "movereason": "Sedem:",
        "revertmove": "şûnde vegerîne",
-       "delete_and_move": "Jêbibe û nav biguherîne",
        "delete_and_move_text": "== Jêbirin gireke ==\n\nRûpela \"[[:$1]]\" berê heye. Tu rast dixazê wê jêbibê ji bo navguherandinê ra?",
        "delete_and_move_confirm": "Erê, rûpelê jê bibe",
        "delete_and_move_reason": "Jêbir ji bo navguherandinê",
index c322162..9433184 100644 (file)
@@ -24,7 +24,9 @@
                        "아라",
                        "Lesgles",
                        "StevenJ81",
-                       "Macofe"
+                       "Macofe",
+                       "Xð",
+                       "Laurentianus"
                ]
        },
        "tog-underline": "Versores linea denotandi:",
        "viewhelppage": "Videre auxilium",
        "categorypage": "Videre categoriam",
        "viewtalkpage": "Videre disputationem",
-       "otherlanguages": "Linguis aliis",
+       "otherlanguages": "In aliis linguis",
        "redirectedfrom": "(Redirectum de $1)",
        "redirectpagesub": "Pagina redirectionis",
        "lastmodifiedat": "Ultima mutatio: $2, $1.",
        "nstab-template": "Formula",
        "nstab-help": "Auxilium",
        "nstab-category": "Categoria",
+       "mainpage-nstab": "Pagina prima",
        "nosuchaction": "Actio non est",
        "nosuchactiontext": "Actio in URL designata non agnoscitur a hoc vici.",
        "nosuchspecialpage": "Pagina specialis non est",
        "namespaceprotected": "Tibi non licet paginas spatii nominalis '''$1''' recensere.",
        "ns-specialprotected": "Paginae speciales recenseri non possunt.",
        "titleprotected": "Hic titulus protectus est ab usore [[User:$1|$1]] ne creetur.\nRatio data est \"''$2''\".",
-       "exception-nologin": "Conventum non apertum",
-       "exception-nologin-text": "Ad hanc paginam recensendam conventum aperire oportet",
+       "exception-nologin": "Nomen datum non est",
+       "exception-nologin-text": "Ad hanc paginam recensendam nomen dari oportet.",
        "virus-badscanner": "Configuratio mala: scrutator virorum ignotus: ''$1''",
        "virus-scanfailed": "scrutinium fefellit (codex $1)",
        "virus-unknownscanner": "antivirus incognitus:",
-       "logouttext": "'''Conventum tuum conclusum est.'''\n\nNota bene paginas fortasse videantur quasi tuum conventum esset apertum, priusquam navigatrum purgaveris.",
+       "logouttext": "'''Secessisti a Vicipedia.'''\n\nNota bene, paginae fortasse videantur quasi nomen tuum dedisses, priusquam navigatrum purgaveris.",
        "welcomeuser": "Salve, $1!",
        "welcomecreation-msg": "Ratio tua creata est.\nNoli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusative|{{SITENAME}}}} mutare.",
        "yourname": "Nomen usoris:",
        "createacct-yourpasswordagain": "Tesseram confirmare",
        "createacct-yourpasswordagain-ph": "Tesseram iterum inscribe",
        "remembermypassword": "Tesseram meam hoc in navigatro inter conventa memento ({{PLURAL:$1|die|diebus}} $1 tenus)",
+       "userlogin-remembermypassword": "Nomen meum retineatur",
        "yourdomainname": "Regnum tuum:",
-       "login": "Conventum aperire",
-       "nav-login-createaccount": "Conventum aperire / conventum creare",
-       "userlogin": "Conventum aperire / conventum creare",
-       "userloginnocreate": "Conventum aperire",
-       "logout": "Conventum concludere",
-       "userlogout": "Conventum concludere",
-       "notloggedin": "Conventum non est apertum",
+       "login": "Nomen dare",
+       "nav-login-createaccount": "Nomen dare / Nomen sibi imponere",
+       "userlogin": "Nomen dare / Nomen sibi imponere",
+       "userloginnocreate": "Nomen dare",
+       "logout": "Secedere",
+       "userlogout": "Secedere",
+       "notloggedin": "Nomen datum non est",
        "userlogin-noaccount": "Num rationem non habes?",
        "nologin": "Num rationem non habes? $1.",
        "nologinlink": "Eam crea",
        "createaccount": "Rationem novam creare",
        "gotaccount": "Habesne iam rationem? '''$1'''.",
-       "gotaccountlink": "Conventum aperi",
+       "gotaccountlink": "Nomen da",
        "userlogin-resetlink": "Num tesserae tuae oblitus es?",
-       "userlogin-resetpassword-link": "Num tesserae oblivisceris?",
+       "userlogin-resetpassword-link": "Num tesserae oblitus es?",
        "createacct-emailrequired": "Inscriptio electronica",
        "createacct-emailoptional": "Inscriptio electronica (non necesse)",
        "createacct-email-ph": "Inscriptionem electronicam tuam inscribe",
        "createaccountreason": "Causa:",
        "createacct-reason": "Causa",
        "createacct-reason-ph": "Cur aliam rationem creas",
-       "createacct-imgcaptcha-ph": "Textum quem supra vidis inscribe",
        "createacct-submit": "Rationem tuam creare",
        "createacct-another-submit": "Aliam rationem creare",
        "createacct-benefit-body1": "{{PLURAL:$1|recensio|recensiones}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pagina|paginae}}",
        "badretype": "Tesserae quas scripsisti inter se non congruunt.",
        "userexists": "Nomen usoris quod selegisti iam est.\nNomen usoris alium selige.",
-       "loginerror": "Error factus est in aperiendo conventum",
+       "loginerror": "Aliquis error factus est in nomine dando",
        "createacct-error": "Error in ratione creanda",
        "createaccounterror": "Rationem creare non potuit: $1",
-       "nocookiesnew": "Ratio usoris creata est, sed conventum non apertum est. {{SITENAME}} ''Cookies'' utitur in usorum conventa aperiendo. Cookies tua debiles sunt. Eis potestatem fac, tum conventum aperi cum nomine usoris tesseraque tua nova.",
+       "nocookiesnew": "Ratio usoris creata est, sed nomen non est datum. Nam in nominibus dandis {{SITENAME}} ''Cookies'' utitur. Quae apud te vetantur. Cookies admitte, tum nomen novum cum tessera nova da!",
        "nocookieslogin": "{{SITENAME}} ''Cookies'' in conventis collatorum aperiendis adhibentur. ''Cookies'' tua debilitata sunt. Eis potestatem fac, tum conare denuo.",
        "noname": "Nomen usoris ratum non designavisti.",
-       "loginsuccesstitle": "Conventum prospere apertum est",
+       "loginsuccesstitle": "Nomen feliciter datum est",
        "loginsuccess": "'''Apud {{grammar:accusative|{{SITENAME}}}} agnosceris nomine \"$1\".'''",
        "nosuchuser": "Usor \"$1\" non est.\nConfirma orthographiam (cave litteras maiusculas minusculasque), aut [[Special:UserLogin/signup|novam rationem crea]].",
        "nosuchusershort": "Usor \"$1\" non est.\nConfirma orthographiam.",
        "wrongpasswordempty": "Tesseram vacuam scripsisti. Conare denuo.",
        "mailmypassword": "Tesseram novam per litteras electronicas petere",
        "passwordremindertitle": "Nova tessera apud {{grammar:accusative|{{SITENAME}}}}",
-       "passwordremindertext": "Aliquis (tu probabiliter, ex loco IP $1)\ntesseram novam petivit pro {{grammar:ablative|{{SITENAME}}}} ($4).\nTessera temporaria usoris \"$2\" creata est: \"$3\".\nSi vis, conventum aperias et statim tesseram tuam mutes.\nTessera temporaria exibit {{PLURAL:$5|unam diem|$5 dies}}.\n\nSi non ipse hanc petitionem fecisti, aut si tesserae tuae\nmeministi et etiam nolis eam mutare, potes hunc nuntium\nignorare, et tessera seni uti continuare.",
+       "passwordremindertext": "Aliquis (haud scio an tute ipse, ex loco IP $1)\ntesseram novam petivit pro {{grammar:ablative|{{SITENAME}}}} ($4).\nTessera temporaria usori \"$2\" creata est: \"$3\".\nSi voles, nomen da et statim tesseram tuam muta!\nTessera temporaria valebit {{PLURAL:$5|unam diem|$5 dies}}.\n\nQuodsi tesseram novam non ipse petivisti vel si tesserae tuae\ninterim in mentem venit neque tu eam mutari voles,\nnegligas hunc nuntium. Licet pergere, ut solitus es.",
        "noemail": "Nulla inscriptio electronica invenitur per usorem \"$1\".",
        "mailerror": "Error in litteras electronicas inmittendas: $1",
        "acct_creation_throttle_hit": "Ex loco IP tuo, die proximo iam {{PLURAL:$1|una ratio creata est|rationes $1 creatae sunt}}.\nPlurimas non licet creare. Ergo, ex hoc loco IP rationes plurimas hodie creari non possunt.",
        "accountcreated": "Ratio creata",
        "accountcreatedtext": "Ratio pro usore [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|disputatio]]) creata est.",
        "createaccount-title": "Ratio creata apud {{grammar:accusative|{{SITENAME}}}}",
-       "createaccount-text": "Aliquis creavit rationem pro inscriptione electronica tua apud {{grammar:accusative|{{SITENAME}}}} ($4). Nomen usoris est \"$2\" et tessera est \"$3\". Conventum aperias et statim tesseram tuam mutes.\n\nHunc nuntium ignorare potes, si nolis hac ratione uti.",
-       "login-abort-generic": "Conventum aperire non contigit - Desitum",
+       "createaccount-text": "Aliquis inscriptioni electronicae tuae rationem creavit apud {{grammar:accusative|{{SITENAME}}}} ($4). Nomen usoris est \"$2\" et tessera est \"$3\". Quod nomen dare velis et tesseram statim mutare.\n\nLicet hunc nuntium neglegere, si nolis hac ratione uti.",
+       "login-abort-generic": "Non contigit nomen dare - Desitum",
        "loginlanguagelabel": "Lingua: $1",
-       "pt-login": "Conventum aperire",
-       "pt-login-button": "Conventum aperire",
+       "pt-login": "Nomen dare",
+       "pt-login-button": "Nomen dare",
        "pt-createaccount": "Conventum creare",
-       "pt-userlogout": "Conventum concludere",
+       "pt-userlogout": "Secedere",
        "changepassword": "Tesseram mutare",
        "resetpass_header": "Tesseram rationis mutare",
        "oldpassword": "Tessera vetus:",
        "newpassword": "Tessera nova:",
        "retypenew": "Adfirmare tesseram novam:",
-       "resetpass_submit": "Tesseram mutare et conventum aperire",
+       "resetpass_submit": "Tesseram mutare et nomen dare",
        "changepassword-success": "Tessera tua prospere mutata est.",
        "resetpass_forbidden": "Tesserae mutari non possunt",
-       "resetpass-no-info": "Necesse est conventum aperire ad hanc paginam adhibendum.",
+       "resetpass-no-info": "Ad hanc paginam adeundam necesse est nomen dare.",
        "resetpass-submit-loggedin": "Tesseram mutare",
        "resetpass-submit-cancel": "Dimittere",
        "resetpass-temp-password": "Tessera temporaria:",
        "preview": "Praevidere",
        "showpreview": "Monstrare praevisum",
        "showdiff": "Mutata ostendere",
-       "anoneditwarning": "'''Monitio:''' Conventum tuum non apertum. Locus IP tuus in historia huius paginae notabitur.",
-       "anonpreviewwarning": "''Conventum tuum non apertum. Si servas, locus IP tuus in historia huius paginae notabitur.''",
+       "anoneditwarning": "'''Monitio:''' Nomen tuum non dedisti. In recensendo locus IP tuus in historia huius paginae notabitur. Quodsi <strong>[$1 nomen tuum dederis]</strong> vel <strong>[$2 nomen tibi imposueris]</strong>, quaecumque recensebis, isti nomini attribuentur.",
+       "anonpreviewwarning": "''Nomen tuum non dedisti. Quodsi servas, locus IP tuus in historia huius paginae notabitur.''",
        "missingcommenttext": "Sententiam subter inscribe.",
        "summary-preview": "Praevisum summarii:",
        "subject-preview": "Praevisum rei/tituli:",
        "confirmedittext": "Tua inscriptio electronica est adfirmanda priusquam paginas recenseas. Quaesumus eam selige et adfirma per tuas [[Special:Preferences|praeferentias]].",
        "nosuchsectiontitle": "Haec pars inveniri non potest",
        "nosuchsectiontext": "Partem inexistentem recensere conaris.\nFortasse aliquis hanc partem movit vel delevit.",
-       "loginreqtitle": "Conventum aperiendum",
-       "loginreqlink": "conventum aperire",
+       "loginreqtitle": "Nomen dare necesse est",
+       "loginreqlink": "Nomen dare",
        "loginreqpagetext": "Necesse est tibi $1 priusquam paginas alias legas.",
        "accmailtitle": "Tessera missa est.",
        "accmailtext": "Tessera nova usoris [[User talk:$1|$1]] ad $2 missa est. Convento aperto, tessera hic potest mutari: ''[[Special:ChangePassword|tesseram mutare]]''.",
        "newarticle": "(Nova)",
        "newarticletext": "Per nexum progressus es ad paginam quae nondum exsistit.\nNovam paginam si vis creare, in capsam infra praebitam scribe.\n(Vide [$1 paginam auxilii] si plura cognoscere vis.)\nSi hic es propter errorem, solum '''Retrorsum''' in navigatro tuo preme.",
-       "anontalkpagetext": "----''Haec est pagina disputationis usoris anonymi, solum a loco IP suo noti. Memento locos IP aliquando mutaturos, et a usoribus multis fortasse adhibitos. Si es usor ignotus, et tibi querulae sine causa datae sunt, conventum [[Special:UserLogin/signup|crea]] vel [[Special:UserLogin|aperi]] ad confusionem futuram evitendam.''",
+       "anontalkpagetext": "----''Haec est pagina disputationis usoris anonymi vel potius loci IP cuiusdam. Memento locos IP interdum mutari et ab usoribus vel pluribus adhiberi. Si ipse sis usor ignotus et ex improviso invenias querulas aliquas, nomen tibi [[Special:UserLogin/signup|impone]] vel [[Special:UserLogin|nomen tuum da]], ut decetero confusionem effugias!''",
        "noarticletext": "Hac in pagina non sunt litterae.\nPotes [[Special:Search/{{PAGENAME}}|hanc rem in aliis paginis quaerere]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} acta huius paginae videre]\naut [{{fullurl:{{FULLPAGENAME}}|action=edit}} hanc paginam creare]</span>.",
        "noarticletext-nopermission": "Hac in pagina non sunt litterae.\nPotes [[Special:Search/{{PAGENAME}}|hanc rem in aliis paginis quaerere]] aut <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} acta huius paginae videre], sed tibi non licet hanc paginam creare.",
        "userpage-userdoesnotexist": "Usor \"<nowiki>$1</nowiki>\" non est. Visne re vera hanc paginam creare vel recensere?",
        "searchprofile-advanced": "Callidissime",
        "searchprofile-articles-tooltip": "Quaerere in $1",
        "searchprofile-images-tooltip": "Fasciculos quaerere",
-       "searchprofile-everything-tooltip": "Omnia perscrutari (etiam paginae disputationis)",
+       "searchprofile-everything-tooltip": "Perscrutari omnia (etiam disputationes)",
        "searchprofile-advanced-tooltip": "In spatiis nominalibus accommotis quaerere",
        "search-result-size": "$1 ({{PLURAL:$2|1 verbum|$2 verba}})",
        "search-redirect": "(redirectio $1)",
        "enhancedrc-history": "Historia",
        "recentchanges": "Nuper mutata",
        "recentchanges-legend": "Indicis paginarum nuper mutatarum praeferentiae",
-       "recentchanges-summary": "Inspice mutationes recentes huic vici in hac pagina.",
+       "recentchanges-summary": "Ecce mutationes recentes.",
        "recentchanges-feed-description": "Nuper mutata Viciae hoc in fluxu observare.",
-       "recentchanges-label-newpage": "Haec recensio paginam novam creavit",
+       "recentchanges-label-newpage": "Pagina nova creata est",
        "recentchanges-label-minor": "Haec est recensio minor",
        "recentchanges-label-bot": "Hanc recensionem automaton fecit",
        "recentchanges-label-unpatrolled": "Haec recensio nondum est examinata",
-       "recentchanges-label-plusminus": "Magnitudo paginae per istam copiam octetorum mutata est",
+       "recentchanges-label-plusminus": "Tot octetis magnitudo paginae mutata est.",
+       "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide etiam [[Special:NewPages|indicem paginarum novarum]])",
        "rcnotefrom": "Subter sunt '''$1''' nuperrime mutata in proxima '''$2''' die.",
        "rclistfrom": "Monstrare mutata nova incipiens ab $3 $2",
        "upload": "Fasciculum imponere",
        "uploadbtn": "Fasciculum imponere",
        "reuploaddesc": "Siste imponere et ad imponendi formam redi",
-       "uploadnologin": "Conventum non est apertum",
+       "uploadnologin": "Nomen tuum non dedisti",
        "uploadnologintext": "Necesse est tibi $1 priusquam fasciculos imponas.",
        "uploaderror": "Imponendi erratum",
        "uploadtext": "Utere formam subter ad fasciculos imponendos.\nUt fasciculos antea impositos videas aut quaeras, adi ad [[Special:FileList|indicem fasciculorum impositorum]]. Fasciculi impositi et deleti quoque in [[Special:Log/upload|notatione fasciculorum impositorum]] notantur.\n\nAd fasciculum in pagina includendum, utere nexu:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fasciculus.jpg]]</nowiki></code>''' aut\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fasciculus.png|verba alia]]</nowiki></code>''' aut\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fasciculus.ogg]]</nowiki></code>''' pro nexum ad fasciculum directum.",
        "unusedtemplateswlh": "nexus alii",
        "randompage": "Pagina fortuita",
        "randompage-nopages": "Non est ulla pagina {{PLURAL:$2|hoc in spatio nominale|in his spatiis nominalibus}}: $1.",
+       "randomincategory-category": "Categoria:",
        "randomincategory-submit": "Ire",
        "randomredirect": "Redirectio fortuita",
        "randomredirect-nopages": "Non est ulla redirectio in spatio nominali \"$1\".",
        "mywatchlist": "Paginae observatae",
        "watchlistfor2": "Pro $1 $2",
        "nowatchlist": "Sunt nullas paginas in indice tuo paginarum observatarum.",
-       "watchlistanontext": "Necesse est conventum aperire ad indicem paginarum observatarum inspiciendum vel recensendum.",
-       "watchnologin": "Conventum non est apertum",
+       "watchlistanontext": "Ad inspiciendum vel recensendum indicem paginarum observatarum necesse est nomen dare.",
+       "watchnologin": "Nomen datum non est",
        "addedwatchtext": "Pagina \"[[:$1]]\" in [[Special:Watchlist|paginas tuas observatas]] addita est.\nMutationes posthac huic paginae et paginae disputationis ibi notabuntur.",
        "removedwatchtext": "Pagina \"[[:$1]]\" ex [[Special:Watchlist|indice paginarum observatarum]] remota est.",
        "watch": "Observare",
        "unwatchthispage": "Non iam observare",
        "notanarticle": "Res non est",
        "notvisiblerev": "Emendatio deleta est",
-       "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginae}} in indice paginarum observatarum tuarum, sine paginis disputationis.",
+       "watchlist-details": "{{PLURAL:$1|$1 paginam|$1 paginas}} observas.",
+       "wlheader-showupdated": "Paginae nondum a te inspectae typis crassioribus ostenduntur.",
        "wlnote": "Subter {{PLURAL:$1|est mutatio proxima|sunt '''$1''' mutationes proximae}} in {{PLURAL:$2|proxima hora|proximis '''$2''' horis}} ex $4, $3.",
        "wlshowlast": "Monstrare proximas $1 horas $2 dies",
+       "watchlistall2": "omnes",
        "watchlist-options": "Indicis paginarum observatarum praeferentiae",
        "watching": "Custodiens...",
        "unwatching": "Decustodiens...",
        "movepagetext": "Formam inferam utere ad paginam renominandum et ad historiam eius ad nomen novum movendum.\nTitulus vetus paginam redirectionis ad titulum novum fiet.\nNexus ad paginam veterem non mutabuntur;\nredirectiones [[Special:DoubleRedirects|duplices]] vel [[Special:BrokenRedirects|fractas]] quaerere et figere debebis.\n\nPagina '''non''' movebitur si pagina sub titulo novo iam est, nisi est vacua aut pagina redirectionis et nullam historiam habet.\n\n'''MONITUM!'''\nHaec mutatio vehemens et improvisa potest esse pro pagina populare;\nadfirma te consequentias intellegere antequam procedis.",
        "movepagetalktext": "Pagina disputationis huius paginae, si est, etiam necessario motabitur '''nisi''':\n\n*Disputatio sub paginae novae nomine contenta habet, aut\n*Capsam subter non nota.\n\nErgo manu necesse disputationes motare vel contribuere erit, si vis.",
        "moveuserpage-warning": "'''Monitio:''' Si paginam usoris moves, solum pagina movetur, usor '''non''' renominatur.",
-       "movenologintext": "Rationem usoris habere et [[Special:UserLogin|conventum aperire]] debes ad movendum paginam.",
+       "movenologintext": "Rationem usoris habeas et [[Special:UserLogin|nomen des]] necesse est, ut paginaem movere liceat.",
        "movenotallowed": "Tibi non licet paginas movere.",
        "movenotallowedfile": "Tibi non licet fasciculos movere.",
        "cant-move-user-page": "Tibi non licet paginas usorum movere (solum eorum subpaginas).",
        "movenosubpage": "Huic paginae non sunt subpaginae.",
        "movereason": "Causa:",
        "revertmove": "reverti",
-       "delete_and_move": "Delere et movere",
        "delete_and_move_text": "==Deletio necesse est==\nPaginae nomen petitum \"[[:$1]]\" iam existit. Vin tu eam delere ut pagina illic moveatur?",
        "delete_and_move_confirm": "Ita, paginam delere",
        "delete_and_move_reason": "Deleta ut moveatur ex \"[[$1]]\"",
        "tooltip-pt-preferences": "Praeferentiae tuae",
        "tooltip-pt-watchlist": "Paginae quas observas ut earum mutationes facilius videas",
        "tooltip-pt-mycontris": "Index conlationum tuarum",
-       "tooltip-pt-login": "Te conventum aperire hortamur, non autem requisitum",
-       "tooltip-pt-logout": "Conventum concludere",
+       "tooltip-pt-login": "Te nomen dare hortamur neque cogimus",
+       "tooltip-pt-logout": "Secedere",
        "tooltip-pt-createaccount": "Hortamur ut conventum crees, sed non est necesse",
        "tooltip-ca-talk": "Disputatio de hac pagina",
        "tooltip-ca-edit": "Hanc paginam recensere potes. Quaesumus praevisum inspice antequam servas.",
        "tooltip-ca-addsection": "Novam partem creare",
-       "tooltip-ca-viewsource": "Haec pagina protecta est. Fontem inspicere potes.",
+       "tooltip-ca-viewsource": "Haec pagina protecta est. Inspicere quidem fontem licet.",
        "tooltip-ca-history": "Emendationes veteres huius paginae",
        "tooltip-ca-protect": "Protegere hanc paginam",
        "tooltip-ca-delete": "Delere hanc paginam",
        "confirmemail_sendfailed": "Litteras electronicas adfirmationis non potuimus mittere.\nInspice inscriptionem tuam electronicam ut litteras prohibitas invenias.\n\nNuntius reddidit: $1",
        "confirmemail_invalid": "Codex adfirmationis invalidus. Fortasse id exitum est.",
        "confirmemail_needlogin": "Necesse est tibi $1 ut inscriptionem tuam electronicam adfirmes.",
-       "confirmemail_success": "Tua inscriptio electronica adfirmata est.\nLibenter [[Special:UserLogin|conventum aperias]] utarisque {{grammar:ablative|{{SITENAME}}}}.",
+       "confirmemail_success": "Inscriptio electronica confirmata est.\n[[Special:UserLogin|Nomen tuum dare]] et {{grammar:ablative|{{SITENAME}}}} frui licet.",
        "confirmemail_loggedin": "Inscriptio tua electronica iam adfirmata est.",
        "confirmemail_subject": "{{SITENAME}} - Adfirmatio inscriptionis electronicae",
        "confirmemail_body": "Aliquis (probabiliter tu, ex loco IP $1)\nrationem \"$2\" creavit sub hac inscriptione electronica apud {{grammar:accusative|{{SITENAME}}}}.\n\nUt adfirmas te esse ipsum et proprietates inscriptionum electronicarum licere fieri apud {{grammar:accusative|{{SITENAME}}}}, hunc nexum aperi in tuo navigatro interretiali:\n\n$3\n\nSi *non* tu hoc fecisti, hunc nexum sequere\nad adfirmationem inscriptionis electronicae abrogandum:\n\n$5\n\nHic codex adfirmationis exibit $4.",
        "fileduplicatesearch-info": "$1 × $2 elementa imaginalia<br />Magnitudo fasciculi: $3<br />Typus MIME: $4",
        "specialpages": "Paginae speciales",
        "specialpages-group-other": "Aliae paginae speciales",
-       "specialpages-group-login": "Conventum aperire / creare",
+       "specialpages-group-login": "Nomen dare / sibi imponere",
        "specialpages-group-users": "Usores eorumque potestates",
        "specialpages-group-pages": "Indices paginarum",
        "specialpages-group-pagetools": "Instrumenta paginarum",
        "api-error-filename-tooshort": "Nomen fasciculi brevius est.",
        "api-error-filetype-banned": "Talia genera fasciculorum permissa non sunt.",
        "api-error-illegal-filename": "Nomen fasciculi permissum non est.",
-       "api-error-mustbeloggedin": "Ad fasciculos inmittendos conventum aperire necesse est.",
+       "api-error-mustbeloggedin": "Ad fasciculos deferendos nomen des necesse est.",
        "api-error-unknownerror": "Error incognitus: \"$1\".",
        "expandtemplates": "Formulas resolvere",
        "special-characters-group-latin": "Latinum",
index 05b6d26..59cdf77 100644 (file)
        "mar": "Mar",
        "apr": "Abr",
        "may": "May",
-       "jun": "Juñ",
+       "jun": "Jun",
        "jul": "Jul",
        "aug": "Ago",
        "sep": "Set",
        "recentchanges-label-bot": "Este trocamiento era hecho por la parte de un bot",
        "recentchanges-label-unpatrolled": "Este trocamiento no fue patrullado daínda",
        "recentchanges-legend-plusminus": "(''±123'')",
-       "rcnotefrom": "Debasho se amostran los trokamientos desde '''$2''' (amostrados fina <b>$1</b>)",
+       "rcnotefrom": "Debasho se amostran {{PLURAL:$5|el trokamiento|los trokamientos}} desde '''$2''' (amostrados fina <b>$1</b>)",
        "rclistfrom": "Amostrar los trocamientos muevos empeçando el $3 $2",
        "rcshowhideminor": "$1 trocamientos chiquiticos",
        "rcshowhidebots": "$1 botes",
        "unwatch": "dexa de cudiar",
        "watchlist-details": "{{PLURAL:$1|$1 hoja|$1 hojas}} en tu lista de escogidas, sin contar las de la diskussión.",
        "wlshowlast": "Ver los trocamientos de las últimas $1 oras, $2 días",
+       "watchlistall2": "todos",
        "watchlist-options": "Opciones de la lista de escogidas",
        "watching": "Cudiando...",
        "unwatching": "Dexando de cudiar...",
index d4f0b14..7e63ab7 100644 (file)
        "morenotlisted": "Dës Lëscht ass net komplett.",
        "mypage": "Säit",
        "mytalk": "Diskussioun",
-       "anontalk": "Diskussioun fir dës IP Adress",
+       "anontalk": "Diskussioun",
        "navigation": "Navigatioun",
        "and": "&#32;a(n)",
        "qbfind": "Fannen",
        "createaccountreason": "Grond:",
        "createacct-reason": "Grond",
        "createacct-reason-ph": "Fir wat Dir een anere Benotzerkonnt uleet",
-       "createacct-captcha": "Sécherheets-Check",
-       "createacct-imgcaptcha-ph": "Gitt den Text an deen Dir hei driwwer gesitt",
        "createacct-submit": "Äre Benotzerkont uleeën",
        "createacct-another-submit": "Benotzerkont uleeën",
        "createacct-benefit-heading": "{{SITENAME}} gëtt vu Leit wéi Iech gemaach.",
        "passwordreset-emailtext-ip": "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:\n\n$2\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailtext-user": "De Benotzer $1 vu(n) {{SITENAME}} huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont|D'Benutzerkonte}} \n\n$2\n\n{{PLURAL:$3|ass|si}} mat dëser E-Mail-Adress verbonn.\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailelement": "Benotzernumm: \n$1\n\nTemporärt Passwuert: \n$2",
-       "passwordreset-emailsent": "Wann dëst eng registréiert E-Mailadress vun Ärem benotzerkont ass da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
+       "passwordreset-emailsentemail": "Wann dëst eng registréiert E-Mailadress vun Ärem benotzerkont ass da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
        "passwordreset-emailsent-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner.",
        "passwordreset-emailerror-capture": "Eng Mail fir d'Passwuert zréckzesetze gouf geschéckt, Dir gesitt se hei drënner, awer de {{GENDER:$2|Benotzer}} konnt se net kréien: $1",
        "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
        "prefs-help-prefershttps": "Dës Astellung gëtt déi nächste Kéier wierksam wou Dir Iech ageloggt.",
        "prefswarning-warning": "Dir hutt Ännerunge vun Ären Astellunge gemaach, déi nach net gespäichert goufen.\n\nWann Dir vun dëser Säit erof gitt ouni op \"$1\" ze klicken, da ginn Är Astellungen net aktualiséiert.",
        "prefs-tabs-navigation-hint": "Tipp: Dir kënnt d'Feiler no lénks an no riets benotze fir tëscht den Tabs an der Lëscht vun den Tabs ze navigéieren.",
-       "email-address-validity-valid": "D'E-Mail-Adress schéngt valabel ze sinn",
-       "email-address-validity-invalid": "Gitt eng valabel E-Mail-Adress an",
        "userrights": "Benotzerrechterverwaltung",
        "userrights-lookup-user": "Benotzergruppe verwalten",
        "userrights-user-editname": "Benotzernumm uginn:",
        "recentchanges-legend-heading": "'''Legend:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kuckt och [[Special:NewPages|Lëscht vun den neie Säiten]])",
        "recentchanges-legend-plusminus": "''(±123)''",
+       "recentchanges-submit": "Weisen",
        "rcnotefrom": "Hei drënner {{PLURAL:$5|gëtt d'Ännerung|ginn d'Ännerungen}} zanter <strong>$3, $4</strong> (maximal <strong>$1</strong> Ännerunge gi gewisen).",
        "rclistfrom": "Nei Ännerunge vum $3 $2 u weisen",
        "rcshowhideminor": "Kleng Ännerunge $1",
        "uploaddisabledtext": "D'Eropluede vu Fichieren ass ausgeschalt.",
        "php-uploaddisabledtext": "D'Eropluede vu Fichieren ass am PHP desaktivéiert. Kuckt w.e.g. d'Astellung ''file_uploads'' no.",
        "uploadscripted": "An dësem Fichier ass HTML- oder Scriptcode, dee vun engem Webbrowser falsch interpretéiert kéint ginn.",
+       "upload-scripted-pi-callback": "Et ass net méiglech XML-Fichieren eropzelueden an deenen XML-Stylesheet Instruktioune fir d'Verschaffen drastinn",
        "uploadscriptednamespace": "An dësem SVG-Fichier ass en illegalen Nummraum \"$1\"",
        "uploadinvalidxml": "Den XML am eropgelueden Fichier konnt net verschafft ginn.",
        "uploadvirus": "An dësem Fichier ass ee Virus! Detailer: $1",
        "mostrevisions": "Säite mat de meeschte Versiounen",
        "prefixindex": "All Säite mat Prefix",
        "prefixindex-namespace": "All Säite mat Prefix (Nummraum $1)",
+       "prefixindex-submit": "Weisen",
        "prefixindex-strip": "Prefix an der Lëscht ewechhuelen",
        "shortpages": "Kuerz Säiten",
        "longpages": "Laang Säiten",
        "protectedpages-performer": "Spär duerch de Benotzer",
        "protectedpages-params": "Parameter vun der Spär",
        "protectedpages-reason": "Grond",
+       "protectedpages-submit": "Säite weisen",
        "protectedpages-unknown-timestamp": "Onbekannt",
        "protectedpages-unknown-performer": "Onbekannte Benotzer",
        "protectedtitles": "Gespaarten Titel",
        "protectedtitles-summary": "Op dëser Säit stinn all déi Säiten déi elo gespaart si fir ugefaang ze ginn. D'Lëscht vun de Säiten déi gespaart sinn: [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Elo si mat de Parameteren déi Dir uginn hutt keng Säite fir neit Uleeë gespaart.",
+       "protectedtitles-submit": "Titele weisen",
        "listusers": "Benotzerlëscht",
        "listusers-editsonly": "Nëmme Benotzer mat Ännerunge weisen",
        "listusers-creationsort": "Nom Datum vum Uleeën zortéieren",
        "usereditcount": "$1 {{PLURAL:$1|Ännerung|Ännerungen}}",
        "usercreated": "{{GENDER:$3|De(n)|D'}} $1 ëm $2 Auer ugeluecht",
        "newpages": "Nei Säiten",
+       "newpages-submit": "Weisen",
        "newpages-username": "Benotzernumm:",
        "ancientpages": "Eelst Säiten",
        "move": "Réckelen",
        "specialloguserlabel": "Aktive Benotzer:",
        "speciallogtitlelabel": "Zil (Titel oder {{ns:user}}:Benotzernumm fir e Benotzer):",
        "log": "Logbicher",
+       "logeventslist-submit": "Weisen",
        "all-logs-page": "All ëffentlech Logbicher",
        "alllogstext": "Dëst ass eng kombinéiert Lëscht vu Logbicher op {{SITENAME}}.\nDir kënnt d'Siche limitéieren wann Dir e Log-Typ, e Benotzernumm (case-senisitive) oder déi gefrote Säit (och case-senisitive) agitt.",
        "logempty": "Näischt fonnt.",
        "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.",
        "categories": "Kategorien",
+       "categories-submit": "Weisen",
        "categoriespagetext": "Dës {{PLURAL:$1|Kategorie huet|Kategorien hu}} Säiten oder Medien.\n[[Special:UnusedCategories|Netbenotzt Kategorië]] ginn hei net gewisen.\nKuckt och [[Special:WantedCategories|Gewënscht Kategorien]].",
        "categoriesfrom": "Weis Kategorien ugefaange bei:",
        "special-categories-sort-count": "no der Zuel zortéieren",
        "activeusers-hidebots": "Botte verstoppen",
        "activeusers-hidesysops": "Administrateure verstoppen",
        "activeusers-noresult": "Keng Benotzer fonnt.",
+       "activeusers-submit": "Aktiv Benotzer weisen",
        "listgrouprights": "Rechter vun de Benotzergruppen",
        "listgrouprights-summary": "Dëst ass eng Lëscht vun den op dëser Wiki definéierte Benotzergruppen an den domat verbonnene Rechter.\nEt ginn [[{{MediaWiki:Listgrouprights-helppage}}|zousätzlech Informatiounen]] iwwer individuell Benotzerrechter.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Recht dat zouerkannt gouf</span>\n* <span class=\"listgrouprights-revoked\">Recht dat ofgeholl gouf</span>",
        "wlheader-showupdated": "Säiten déi zanter Ärer leschter Visite geännert goufen, si '''fett''' geschriwwen",
        "wlnote": "Hei {{PLURAL:$1|ass déi lescht Ännerung|sinn déi lescht <strong>$1</strong> Ännerunge}} vun {{PLURAL:$2|der leschter Stonn|de leschte(n) <strong>$2</strong> Stonnen}}, Stand: $3 ëm $4 Auer.",
        "wlshowlast": "Déi lescht $1 Stonnen $2 Deeg weisen",
+       "watchlistall2": "all",
+       "watchlist-hide": "Verstoppen",
+       "watchlist-submit": "Weisen",
+       "wlshowtime": "Zäitraum dee gewise gëtt:",
+       "wlshowhideminor": "kleng Ännerungen",
+       "wlshowhidebots": "Botten",
+       "wlshowhideliu": "registréiert Benotzer",
+       "wlshowhideanons": "anonym Benotzer",
+       "wlshowhidepatr": "iwwerwaacht Ännerungen",
+       "wlshowhidemine": "meng Ännerungen",
        "watchlist-options": "Optioune vun der Iwwerwaachungslëscht",
        "watching": "Iwwerwaachen …",
        "unwatching": "Net méi iwwerwaachen …",
        "delete-confirm": "Läsche vu(n) \"$1\"",
        "delete-legend": "Läschen",
        "historywarning": "<strong>Opgepasst:</strong> D'Säit déi Dir läsche wëllt huet en Historique mat $1 {{PLURAL:$1|Versioun|Versiounen}}:",
+       "historyaction-submit": "Weisen",
        "confirmdeletetext": "Dir sidd am Gaang, eng Säit mat hirem kompletten Historique vollstänneg aus der Datebank ze läschen.\nW.e.g. confirméiert, datt Dir dëst wierklech wëllt, datt Dir d'Konsequenze verstitt, an datt dat Ganzt am Aklang mat de [[{{MediaWiki:Policy-url}}|Richtlinne]] geschitt.",
        "actioncomplete": "Aktioun ofgeschloss",
        "actionfailed": "Aktioun huet net funktionéiert",
        "protect-expiring": "bis $1 (UTC)",
        "protect-expiring-local": "bis $1",
        "protect-expiry-indefinite": "net definéiert",
-       "protect-cascade": "Kaskade-Spär – alleguerten d'Schablounen déi an dës Säit agebonne si ginn och gespaart.",
+       "protect-cascade": "Kaskade-Spär – alleguer d'Schablounen déi an dës Säit agebonne si ginn och gespaart.",
        "protect-cantedit": "Dir kënnt d'Spär vun dëser Säit net änneren, well Dir net déi néideg Rechter hutt fir déi Säit z'änneren.",
        "protect-othertime": "Aner Zäit:",
        "protect-othertime-op": "aner Zäit",
        "restriction-upload": "Eroplueden",
        "restriction-level-sysop": "ganz gespaart",
        "restriction-level-autoconfirmed": "hallef gespaart (nëmmen ugemellt Benotzer déi net nei sinn)",
-       "restriction-level-all": "alleguerten",
+       "restriction-level-all": "alleguer",
        "undelete": "Geläscht Säite restauréieren",
        "undeletepage": "Geläscht Säite kucken a restauréieren",
        "undeletepagetitle": "'''Op dëser Lëscht sti geläscht Versioune vun [[:$1]]'''.",
        "contributions": "{{GENDER:$1|Benotzer}}kontributiounen",
        "contributions-title": "Kontributioune vum $1",
        "mycontris": "Kontributiounen",
+       "anoncontribs": "Kontributiounen",
        "contribsub2": "Fir {{GENDER:$3|den $1|d'$1|de Benotzer $1}} ($2)",
        "contributions-userdoesnotexist": "De Benotzerkont \"$1\" ass net registréiert.",
        "nocontribs": "Et goufe keng Ännerunge fonnt, déi dëse Kritèren entspriechen.",
        "whatlinkshere-hidelinks": "Linken $1",
        "whatlinkshere-hideimages": "Linken op Fichiere $1",
        "whatlinkshere-filters": "Filteren",
+       "whatlinkshere-submit": "Lass",
        "autoblockid": "Automatesch Spär #$1",
        "block": "Benotzer spären",
        "unblock": "D'Spär vum Benotzer ophiewen",
        "movenosubpage": "Dës Säit huet keng Ënnersäiten.",
        "movereason": "Grond:",
        "revertmove": "zréck réckelen",
-       "delete_and_move": "Läschen a réckelen",
        "delete_and_move_text": "== Läsche vun der Destinatiounssäit néideg ==\nD'Säit \"[[:$1]]\" existéiert schonn. \nWëll Dir se läsche fir d'Réckelen ze erméiglechen?",
        "delete_and_move_confirm": "Jo, läsch d'Säit",
        "delete_and_move_reason": "Geläscht fir Plaz ze maache fir \"[[$1]]\" heihin ze réckelen",
        "htmlform-cloner-delete": "Ewechhuelen",
        "htmlform-cloner-required": "Mindestens ee Wäert ass obligatoresch.",
        "htmlform-title-badnamespace": "[[:$1]] ass net am Nummraum \"{{ns:$2}}\".",
-       "htmlform-title-not-exists": "[[:$1]] gëtt et net.",
+       "htmlform-title-not-exists": "$1 gëtt et net.",
        "htmlform-user-not-exists": "<strong>$1</strong> gëtt et net.",
        "htmlform-user-not-valid": "<strong>$1</strong> ass kee valabele Benotzernumm.",
        "sqlite-has-fts": "$1 ënnerstëtzt d'Volltextsich",
index 34241d1..ee7dfd2 100644 (file)
@@ -8,48 +8,61 @@
                        "Malafaya",
                        "Urhixidur",
                        "ZeneizeForesto",
-                       "아라"
+                       "아라",
+                       "V6rg",
+                       "C.R."
                ]
        },
        "tog-underline": "Sottolineâ i collegamenti",
        "tog-hideminor": "asconde e modifiche minori inte ùrtime modifiche",
        "tog-hidepatrolled": "Ascondi e modifiche verificæ inte ùrtime modifiche",
        "tog-newpageshidepatrolled": "Ascondi e paggine verificæ da  l'elenco de paggine ciù reçenti",
+       "tog-hidecategorization": "Ascondi a categorizzassion de paggine",
        "tog-extendwatchlist": "mostra tùtte e modifiche a-i osservæ speciali, non solo l'urtima",
-       "tog-usenewrc": "Ammuggia pe paggina e modifiche in urtime modifiche e sotta oservaçion (serve o Javascript)",
+       "tog-usenewrc": "Amuggia pe paggina e modiffiche in urtime modifiche e sotta oservaçion",
        "tog-numberheadings": "Nùmeraçion aotomàtica di tìtoli de seçión",
-       "tog-showtoolbar": "Fanni vedde a barra di strumenti de modìffica (serve JavaScript)",
-       "tog-editondblclick": "Modifica e paggine co-o doggio clic (serve Javascrpt)",
-       "tog-editsectiononrightclick": "Modifica e seçión co-o clic drito in sciô tìtolo (serve Javascipt)",
+       "tog-showtoolbar": "Fanni vedde a bara di strumenti de modìffica",
+       "tog-editondblclick": "Modiffica e paggine co-o doggio clic",
+       "tog-editsectiononrightclick": "Permetti de modificâ e seçioin co-o clic drito in sciô tìtolo",
        "tog-watchcreations": "Azonzi e paggine che creo e i file che carrego a-i oservæ speciâli",
        "tog-watchdefault": "Azonzi e paggine e i files che modiffico a-i mæ sotta oservaçion",
        "tog-watchmoves": "Azonzi e paggine e i file che mescio a-i mæ sotta oservaçion",
        "tog-watchdeletion": "Azonzi e paggine e i files che scancello a-i mæ sotta oservaçion",
+       "tog-watchrollback": "Azonzi a-i sotta osservassion e paggine dovve ho fæto un rollback",
        "tog-minordefault": "Indica de longo comme menô e modiffiche",
        "tog-previewontop": "Veddi l'anteprimma de d'äto a-o spaçio pe cangiâ",
        "tog-previewonfirst": "Veddi l'anteprimma a-o primmo cangiamento",
        "tog-enotifwatchlistpages": "Famme savéi via e-mail quande 'na paggina o in file inti mæ osservæ a ven cangiâ.",
-       "tog-enotifusertalkpages": "Màndime un messaggio e-mail se gh'é de-e modìffiche inta pagina de discuscion da mæ pagina d'utente.",
+       "tog-enotifusertalkpages": "Màndime un'e-mail se gh'é de modìffiche inta mæ pagina de discuscion.",
        "tog-enotifminoredits": "Inviami una email pe e modifiche menoî ascì de pagine e di file",
-       "tog-enotifrevealaddr": "Mostra o mæ indirizzo e-mail inti messaggi de notifica",
+       "tog-enotifrevealaddr": "Mostra o mæ addresso inte e-mail de notiffica",
        "tog-shownumberswatching": "Mostra o numero di utenti che tegnan d'oeuggio sta pagina",
        "tog-oldsig": "Firma attuale:",
        "tog-fancysig": "Tratta a firma comme wikitesto (sensa un collegamento aotomatico)",
-       "tog-uselivepreview": "Doeuvia l'anteprimma in diretta (ghe voeu o JavaScript)(sperimentâ)",
+       "tog-uselivepreview": "Abillita a fonsion de l'anteprimma in diretta",
+       "tog-forceeditsummary": "Domanda conferma se o campo ogetto o l'è veuo",
        "tog-watchlisthideown": "Ascondi e mæ modiffiche da-a lista che tegno d'oeuggio",
        "tog-watchlisthidebots": "Ascondi e modiffiche di bot da-a lista che tegno d'oeuggio",
        "tog-watchlisthideminor": "Ascondi e modiffiche menoî da-a lista che tegno d'oeuggio",
        "tog-watchlisthideliu": "Ascondi e modiffiche di utenti intræ da-a lista che tegno d'oeuggio",
+       "tog-watchlistreloadautomatically": "Recarrega aotomaticamente a lista di oservæ quande vegne cangiòu un filtro (ghe veu o JavaScript)",
        "tog-watchlisthideanons": "Ascondi e modiffiche di utenti anonnimi da-a lista che tegno d'oeuggio",
        "tog-watchlisthidepatrolled": "Ascondi e modiffiche za controllæ da-a lista che tegno d'oeuggio",
+       "tog-watchlisthidecategorization": "Ascondi a categorizzassion de paggine",
        "tog-ccmeonemails": "Mandime 'na coppia de e-mail che mando a-i atri utenti",
        "tog-diffonly": "No mostrâ o contegnuo da paggina sotta o confronto tra verscioin",
        "tog-showhiddencats": "Fa vedde e categorîe ascose",
        "tog-norollbackdiff": "Ometti o confronto tra verscioin doppo ch'ho fæto o ripristino",
        "tog-useeditwarning": "Avertime se lascio 'na paggina de modiffica sens'avei sarvou i cangi",
+       "tog-prefershttps": "Deuvia sempre una connescion segua quande se intra",
        "underline-always": "Sempre",
        "underline-never": "Mâi",
+       "underline-default": "Impostassioin predefinie do navegatô o da skin",
        "editfont-style": "Stile do carattere de l'aera de modiffica",
+       "editfont-default": "Predefinio do navegatô",
+       "editfont-monospace": "Carattere a larghessa fissa",
+       "editfont-sansserif": "Carattere sans-serif",
+       "editfont-serif": "Carattere serif",
        "sunday": "Domenega",
        "monday": "Lunedì",
        "tuesday": "Martedì",
        "may-date": "$1 mazzo",
        "june-date": "$1 zugno",
        "july-date": "$1 luggio",
+       "august-date": "{{PLURAL:$1|1°|$1}} agosto",
        "september-date": "$1 setenbre",
        "october-date": "$1 otobre",
+       "november-date": "{{PLURAL:$1|1°|$1}} novembre",
        "december-date": "$1 dexenbre",
        "pagecategories": "{{PLURAL:$1|Categorîa|Categorîe}}",
        "category_header": "Pàgine inta categorîa \"$1\"",
        "noindex-category": "Pàgine sénsa indiçe",
        "broken-file-category": "Paggine con di colegamenti a di file che no ghe son",
        "about": "Informaçioìn",
-       "article": "Pagina de i contenùi",
+       "article": "Pagina di contegnùi",
        "newwindow": "(O s'arve inte 'n âtro barcon)",
        "cancel": "Scancella",
        "moredotdotdot": "De ciû...",
-       "morenotlisted": "Atro...",
+       "morenotlisted": "Questa lista a no l'è completa.",
        "mypage": "Paggina",
        "mytalk": "Discuscioin",
-       "anontalk": "Discuscion pe questo indirisso IP",
+       "anontalk": "Discuscion pe questo addresso IP",
        "navigation": "Navegaçión",
        "and": "&#32;e",
        "qbfind": "Attrêuva",
        "printableversion": "Verscion da stanpâ",
        "permalink": "Ingancio fisso",
        "print": "Stampa",
+       "view": "Visualizza",
+       "view-foreign": "Amia insce $1",
        "edit": "Càngia",
+       "edit-local": "Modifica descrission locale",
        "create": "Crea",
+       "create-local": "Azonzi descrission locale",
        "editthispage": "Modificâ 'sta pagina",
        "create-this-page": "Crea 'sta paggina",
        "delete": "Scancella",
        "deletethispage": "Scassa 'sta paggina",
        "undeletethispage": "Recuppera sta paggina",
        "undelete_short": "Recuppera {{PLURAL:$1|una revixon|$1 revixoin}}",
+       "viewdeleted_short": "{{PLURAL:$1|una modiffica cançelâ|$1 modiffiche cançelæ}}",
        "protect": "Protezi",
        "protect_change": "cangia",
        "protectthispage": "Proteze 'sta paggina.",
        "specialpage": "Pagina speçiâ",
        "personaltools": "Strùmenti personâli",
        "articlepage": "Veddi a voxe",
-       "talk": "Ciæti",
+       "talk": "Discuscion",
        "views": "Vìxite",
        "toolbox": "Arneixi",
        "userpage": "Veddi a paggina utente",
-       "projectpage": "Veddi a pagina de o progetto",
+       "projectpage": "Veddi a paggina de servissio",
        "imagepage": "Vizualizza a paggina do file",
        "mediawikipage": "Vizualizza o messaggio",
        "templatepage": "Vizualizza o modello",
        "viewhelppage": "Vizualizza a paggina d'agiutto",
        "categorypage": "Veddi a paggina da categoria",
        "viewtalkpage": "Veddi o ciæto",
-       "otherlanguages": "In âtre lengóe",
+       "otherlanguages": "In âtre lengoe",
        "redirectedfrom": "(Rendirissou da $1)",
        "redirectpagesub": "Paggina de rindirissamento",
+       "redirectto": "Rendirissa a:",
        "lastmodifiedat": "Sta pagina a l'è stæta cangiâ l'urtima votta a e $2 do $1.",
        "viewcount": "'Sta paggina a l'è stæta vista {{PLURAL:$1|solo 'na vòtta|$1 vòtte}}.",
        "protectedpage": "Paggina protetta",
        "jumptonavigation": "Navegaçión",
        "jumptosearch": "çerca",
        "view-pool-error": "Scuza ma a-o momento i server sono stracarreghi.\nTroppi utenti çercan d' amiâ sta paggina.\nAspeta quarche menuto primma de çercâ torna d'accede a sta pagina.\n\n$1",
+       "generic-pool-error": "Scuza ma a-o momento i server sono stracarreghi.\nTroppi utenti çercan d' amiâ sta risorsa.\nAspeta quarche menuto primma de çercâ torna d'accede a sta risorsa.",
+       "pool-timeout": "Tempo descheito aspêtando o sblocco",
+       "pool-queuefull": "A coa do pool a l'è pin-a",
        "pool-errorunknown": "Aro sconosciuo",
+       "pool-servererror": "O servissio contatô di pool o no l'è disponibile ($1).",
+       "poolcounter-usage-error": "Errô d'utilizzo: $1",
        "aboutsite": "Informaçioìn in sciô {{SITENAME}}",
        "aboutpage": "Project:Informaçioìn",
-       "copyright": "O contegnûo o se peu trovâ a $1.",
+       "copyright": "O contegno o l'è disponibile in base a-a liçensa $1, se no diversamente speçificou.",
        "copyrightpage": "{{ns:project}}:Driti d'autô",
        "currentevents": "Atualitæ",
        "currentevents-url": "Project:Atualitæ",
        "disclaimers": "Avertense",
        "disclaimerpage": "Project:Avertense generâli",
        "edithelp": "Agiùtto",
+       "helppage-top-gethelp": "Agiutto",
        "mainpage": "Pàgina prinçipâ",
        "mainpage-description": "Pagina prinçipâ",
        "policy-url": "Project:Lezzi",
        "youhavenewmessages": "Ti gh'æ $1 ($2).",
        "youhavenewmessagesfromusers": "Ti g'hæ $1 da {{PLURAL:$3|un atro utente|$3 utenti}} ($2).",
        "youhavenewmessagesmanyusers": "Ti g'hæ $1 da tanti utenti ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|un noeuvo messaggio|noeuvi messaggi}}",
-       "newmessagesdifflinkplural": "{{PLURAL:$1|urtima modifica|urtime modifiche}}",
-       "youhavenewmessagesmulti": "Ti t'æ neuvi messaggi in scia $1",
+       "newmessageslinkplural": "{{PLURAL:$1|un neuvo messaggio|999=neuvi messaggi}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|urtima modiffica|999=urtime modiffiche}}",
+       "youhavenewmessagesmulti": "Ti g'hæ di neuvi messaggi in sce $1",
        "editsection": "Càngia",
        "editold": "càngia",
        "viewsourceold": "veddi a sorgénte",
        "hidetoc": "Asconde",
        "collapsible-collapse": "Comprimmi",
        "collapsible-expand": "Espandi",
+       "confirmable-confirm": "T'ê {{GENDER:$1|seguo|segua}}?",
+       "confirmable-yes": "Sci",
+       "confirmable-no": "No",
        "thisisdeleted": "Amia o ripristina $1?",
        "viewdeleted": "Vedde $1?",
        "restorelink": "{{PLURAL:$1|una modifica scancelâ|$1 modifiche scancelæ}}",
        "feedlinks": "Feed:",
        "feed-invalid": "Modalitæ de sottoscriçion do feed non vallida.",
+       "feed-unavailable": "No son disponibili feed",
        "site-rss-feed": "Feed RSS de $1",
        "site-atom-feed": "Feed Atom de $1",
        "page-rss-feed": "Feed RSS pe \"$1\"",
        "nstab-media": "File murtimediâ",
        "nstab-special": "Pàgina speçiâ",
        "nstab-project": "Paggina de servissio",
-       "nstab-image": "Archivio",
+       "nstab-image": "File",
        "nstab-mediawiki": "Messaggio",
        "nstab-template": "Template",
        "nstab-help": "Agiûtto",
        "nstab-category": "Categorîa",
+       "mainpage-nstab": "Paggina prinçipâ",
        "nosuchaction": "No se poeu",
        "nosuchactiontext": "L'açion specificâ inta URL a no l'è vallida.\nO che t'hæ scrito mâ, o che donque l'ea sbaliou o colegamento.\nO magara gh'è 'na cammoa into software doeuviou da {{SITENAME}}.",
        "nosuchspecialpage": "Sta paggina speciale a no gh'è",
+       "nospecialpagetext": "<strong>A paggina speciale domandâ a no l'è stæta riconosciua.</strong>\n\nA lista de paggine speciale vallide a se treuva in [[Special:SpecialPages|Lista de paggine speciale]].",
        "error": "Errô",
-       "databaseerror": "Errô da a base de i dæti",
+       "databaseerror": "Errô do database",
+       "databaseerror-text": "L'è ocorso un errô inte 'na çerchia in sciô database. \nO porriæ indicâ un bug into software.",
+       "databaseerror-textcl": "L'è ocorso un aro inte 'na query in sciô database",
+       "databaseerror-query": "Query: $1",
+       "databaseerror-function": "Fonsion: $1",
+       "databaseerror-error": "Errô: $1",
+       "laggedslavemode": "'''Attension:''' a paggina a porriæ no riportâ i aggiornamenti ciù reçenti.",
        "readonly": "Database bloccòu",
        "enterlockreason": "Scrivi o motivo do blocco, e 'na stimma de quande o saiâ rimosso",
-       "missing-article": "O database o no l'à trovòu o testo di 'na pàgina che ghe saiêiva dovûa êse  co-o nómme de \"$1\" $2.\n\nSpésse vòtte questo o sucede quande a vegne riciamâ, da stöia ò dò-u confronto tra revixioìn, in colegaménto a 'na pàgina scancelâ, a in confronto tra revixioìn che no ghe son ciù ò a in confronto tra revixioìn sénsa ciù a stöia.\n\nSe coscì no fîse l'é probabile che t'aggi scoverto 'n erô into software MediaWiki.\nPe favô ti peu segnalâ quello che l'é sucesso a in [[Special:ListUsers/sysop|aministratô]] dîndo  l'URL in questión.",
+       "readonlytext": "Po-u momento o database o l'è bloccou a-e neuve azonte e modiffiche, foscia pe 'na manutension ordenaia do database, doppo a quæ o saiâ torna accescibile.\n\nL'amministratô ch'o l'ha misso o blocco o l'ha dæto sta spiegassion: $1",
+       "missing-article": "O database o no l'à trovòu o testo de 'na pàgina ch'a ghe saiêiva dovûa êse co-o nómme de \"$1\" $2.\n\nSpésse vòtte questo o sucede quande a vegne reciamâ, da-a stöia ò dò-u confronto tra revixioìn, in colegaménto a 'na pàgina scancelâ, a in confronto tra revixioìn che no ghe son ciù ò a in confronto tra revixioìn sénsa ciù a stöia.\n\nSe coscì no fîse l'é probabile che t'aggi scoverto 'n erô into software MediaWiki.\nPe favô ti peu segnalâ quello che l'é sucesso a in [[Special:ListUsers/sysop|aministratô]] dindo  l'URL in questión.",
        "missingarticle-rev": "(nùmero da revixón: $1)",
+       "missingarticle-diff": "(Diff: $1, $2)",
+       "readonly_lag": "O database o l'è stæto bloccou automaticamente pe consentî a-i server co-i database slave de sincronizzase co-o master",
+       "nonwrite-api-promise-error": " L'intestassion HTTP 'Promise-Non-Write-API-Action' a l'è stæta inviâ, ma a recesta a l'ea de 'n modulo API in scrittua.",
        "internalerror": "Errô interno",
-       "filecopyerror": "Non ho potùo copiâ o papê \"$1\" in te \"$2\".",
-       "filedeleteerror": "Non ho potùo scassâ o papê \"$1\".",
-       "filenotfound": "Non ho trovoö o papê \"$1\".",
+       "internalerror_info": "Errô interno: $1",
+       "internalerror-fatal-exception": "Eccession fatale de tipo \"$1\"",
+       "filecopyerror": "Non ho posciuo copiâ o file \"$1\" in te \"$2\".",
+       "filerenameerror": "No ho posciuo rinominâ o file \"$1\" in \"$2\".",
+       "filedeleteerror": "Non ho posciùo scassâ o file \"$1\".",
+       "directorycreateerror": "Imposcibile creâ a directory \"$1\".",
+       "directoryreadonlyerror": "A directory \"$1\" a l'è de sola lettua.",
+       "directorynotreadableerror": "A directory \"$1\" a no l'è lezibbile.",
+       "filenotfound": "Non ho trovou o file \"$1\".",
+       "unexpected": "Valô imprevisto: \"$1\"=\"$2\".",
+       "formerror": "Errô: imposcibbile inviâ o formulaio",
        "badarticleerror": "L'açion che ti te veu fâ a non l'è permissa in sta pagina.",
-       "cannotdelete": "Non çe peu scassâ a pagina o o papê. (o peu ese za stæto scassoö da quarchedun ätro).",
+       "cannotdelete": "Non se peu scassâ a paggina ò o file  \"$1\" . O porriæ ese za stæto scassòu da quarchedun atro.",
+       "cannotdelete-title": "Imposcibbile scassâ a paggina \"$1\"",
+       "delete-hook-aborted": "A scassaxon a l'è stæta annullâ dall'hook.\nO no l'ha dæto arcun-a spiegassion.",
+       "no-null-revision": "No l'è stæto poscibbile creâ una verscion nulla pe-a paggina \"$1\"",
        "badtitle": "O tìtolo o no l'è corretto.",
        "badtitletext": "O tittolo da paggina çercâ o l'è vêuo, sballiòu o con caratteri no accettæ, oppû o deriva da 'n errô inti collegamenti inter-lengoa o inter-wiki.",
+       "title-invalid-empty": "O tittolo da paggina domandâ o l'è veuo ò o contene solo che-o nomme de un namespace.",
+       "title-invalid-utf8": "O tittolo da paggina domandâ o conten una sequensa UTF-8 non vallida.",
+       "title-invalid-interwiki": "O tittolo da pagginadomandâ o conten un collegamento interwiki ch'o no peu ese deuviòu inti tittoli.",
+       "title-invalid-talk-namespace": "O tittolo da paggina domandâ o fa rifeimento a 'na paggina de discusscion ch'a no peu existe.",
+       "title-invalid-characters": "O tittolo da paggina domandâ o conten di caratteri invallidi: \"$1\".",
+       "title-invalid-relative": "O tittolo o conten un percorso relativo (./, ../). Tæ tittoli no son vallidi, perché risultian soventi irazonzibbili quande gestii da-o navegatô de l'utente.",
+       "title-invalid-magic-tilde": "O tittolo da paggina domandâ o no l'è vallido in quante o conten a succescion speciale de tirde (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "O tittolo da paggina domandâ o l'è troppo longo. O no peu ese ciù longo de {{PLURAL:$1|byte}} in codifica UTF-8.",
+       "title-invalid-leading-colon": "O tittolo da paggina domandâ o no l'è vallido perchè o comensa con doî ponti.",
+       "perfcached": "I dæti chì apreuvo son estræti da 'na coppia ''cache'' do database, e porrieivan no ese agiornæ. Un mascimo de {{PLURAL:$1|un risultou o l'è disponibbile|$1 risultæ son disponibbili}} into cache.",
+       "perfcachedts": "I dæti chì apreuvo son estræti da una coppia ''cache'' do database, o quæ urtimo agiornamento o remonta a-o $1. Un mascimo de {{PLURAL:$4|un risultou o l'è disponibbile|$4 risultæ son disponibili}} into cache.",
+       "querypage-no-updates": "I aggiornamenti da paggina son temporaniamente sospeixi. I dæti in essa contegnui no saian aggiornæ.",
        "viewsource": "Veddi a fonte",
-       "protectedpagetext": "'Sta paggina a l'è stæta protezûa pe impedîghe a modiffica.",
-       "viewsourcetext": "O l'è poscibbile vedde e copiâ o còddice sorgente de 'sta paggina:",
+       "viewsource-title": "Visualizza sorgente de $1",
+       "actionthrottled": "Assion ritardâ",
+       "actionthrottledtext": "Comme mesua de segueça contra o spam, l'esecuçion de çerte açioin a l'è limitâ a un nummero mascimo de votte inte 'n determinòu periodo de tempo, limmite che ti t'hæ superòu. Se prega de riprovâ tra quarche menuto.",
+       "protectedpagetext": "Sta paggina a l'è stæta protezûa pe impedîne a modiffica ò di atre açioin.",
+       "viewsourcetext": "L'è poscibbile amiâ e copiâ a sorgente de sta paggina.",
+       "viewyourtext": "L'è poscibbile amiâ e copiâ a sorgente de <strong>teu modiffiche</strong> a sta paggina.",
+       "protectedinterface": "Sta paggina a conten un elemento ch'o fa parte de l'interfaccia utente do software de sto scito e a l'è protetta pe evitâ poscibbili abuxi.\nPe azonze o modificâ e tradussioin vallide insce tutti i wiki, deuvia [//translatewiki.net/ translatewiki.net], o progetto de localizzassion de MediaWiki.",
+       "editinginterface": "<strong>Attension:</strong> o scrito de sta paggina o fa parte de l'interfaccia utente do software de questo scito. Tutte e modiffiche apportæ a questa paggina se riflettan in scî messaggi visualizzæ pe tutti i utenti in sce questo wiki.",
+       "translateinterface": "Pe azonze ò modificâ e tradussioin vallide insce tutti i wiki, deuvia [//translatewiki.net/ translatewiki.net], o progetto MediaWiki pe-a localizzassion.",
+       "cascadeprotected": "Insce sta paggina no l'è poscibbile effettuâ modiffiche perché a l'è inclusa {{PLURAL:$1|inta paggina indicâ de seguito, ch'a l'è stæta protetta|inte paggine indicæ de seguito, ch'en stæte protette}} selessionando a protession \"ricorsciva\":\n$2",
+       "namespaceprotected": "No ti g'hæ i permissi necessai pe modificâ e paggine do namespace '''$1'''.",
+       "customcssprotected": "No ti g'hæ i permissi pe cangiâ sta pagina CSS percose a conten e impostaçioin personale de 'n atro utente.",
        "customjsprotected": "No ti gh'æ i permessi pe cangiâ sta pagina de JavaScript percose a contegne e impostaçioin personæ de 'n atro utente",
+       "mycustomcssprotected": "No ti g'hæ i permissi pe cangiâ sta paggina CSS.",
+       "mycustomjsprotected": "No ti g'hæ o permisso pe modificâ sta paggina JavaScript .",
+       "myprivateinfoprotected": "No ti g'hæ o permisso pe modificâ i teu dæti personali.",
+       "mypreferencesprotected": "No ti g'hæ o permisso pe modificâ e teu preferense.",
        "ns-specialprotected": "No se pœu modificâ e paggine speciali",
        "titleprotected": "A creaçion de 'na paggina con sto tittolo a l'è stæta bloccâ da [[User:$1|$1]].\nA raxon a l'è: ''$2''.",
+       "filereadonlyerror": "N'ho posciuo modificâ o file \"$1\" perché o repository de file \"$2\" o l'è in modalitæ de sola lettua.\n\nL'amministratô ch'o l'ha bloccòu o l'ha fornio sta motivaçion: \"$3\".",
+       "invalidtitle-knownnamespace": "Tittolo non vallido con namespace \"$2\" e testo \"$3\"",
+       "invalidtitle-unknownnamespace": "Tittolo non vallido con namespace sconosciuo \"$1\" e testo \"$2\"",
        "exception-nologin": "No t'ê introu",
-       "exception-nologin-text": "Pe sta paggina ò sta açion ti gh'æ da effettuâ l'accesso inte sta wiki.",
+       "exception-nologin-text": "Pe poei anâ a sta paggina o fâ st'açion, primma ti g'hæ da intrâ.",
+       "exception-nologin-text-manual": "Pe piaxei $1 pe poei accede a sta paggina o açion.",
+       "virus-badscanner": "Errô de configuaçion: antivirus sconosciuo: ''$1''",
        "virus-scanfailed": "scansion fallia (codice $1)",
        "virus-unknownscanner": "antivirus sconosciuo:",
+       "logouttext": "'''Sciortîa effettuâ.'''\n\nDanni a mente che gh'è de paggine che porrieivan continuâ a pai comme se a sciortîa a no foise avegnua, pe scin che no ti nettezzi a cache do to navegatô.",
+       "welcomeuser": "Benvegnuo, $1!",
+       "welcomecreation-msg": "L'utensa a l'è stæta creâ correttamente.\nSe ti veu ti peu personalizzâ e [[Special:Preferences|preferençe de {{SITENAME}}]].",
        "yourname": "Nomme",
+       "userlogin-yourname": "Nomme utente",
+       "userlogin-yourname-ph": "Scrivi o teu nomme utente",
+       "createacct-another-username-ph": "Scrivi o teu nomme utente",
        "yourpassword": "Pòula segretta:",
+       "userlogin-yourpassword": "Pòula segretta:",
+       "userlogin-yourpassword-ph": "Scrivi a tu poula segretta.",
+       "createacct-yourpassword-ph": "Scrivi 'na poula segretta.",
        "yourpasswordagain": "Riscrivi a pòula segrétta:",
        "createacct-yourpasswordagain": "Conferma a password",
        "createacct-yourpasswordagain-ph": "Conferma a password un'atra votta",
        "userlogin-signwithsecure": "Adoeuvia una conescion segua",
        "yourdomainname": "Indirisso do scito:",
        "password-change-forbidden": "No ti peu cangiâ poula segretta in questa wiki.",
+       "externaldberror": "Gh'è stæto un aro co-ol server de autenticaçion esterno, oppû no ti g'hæ i aotorizzaçioin pe aggiornâ o to accesso esterno.",
        "login": "Intra",
        "nav-login-createaccount": "Intra / Registrate",
        "userlogin": "Intra / Registrite",
        "logout": "Sciorti",
        "userlogout": "Sciorti",
        "notloggedin": "No t'ê introu",
+       "userlogin-noaccount": "No ti t'ê ancon registrou?",
+       "userlogin-joinproject": "Registrite insce {{SITENAME}}",
        "nologin": "No ti gh'æ ancon in acesso? '''$1'''.",
        "nologinlink": "Creâ 'n' utensa",
        "createaccount": "Crea 'n nêuvo account",
        "gotaccount": "Ti ghe l'æ za 'n' utensa? '''$1'''.",
        "gotaccountlink": "Intra",
        "userlogin-resetlink": "T'æ ascordòu i teu dæti de acesso?",
-       "userlogin-resetpassword-link": "Reimposta a to password",
+       "userlogin-resetpassword-link": "T'hæ miga ascordou a teu poula segretta?",
+       "userlogin-helplink2": "Agiutto pe intrâ",
+       "userlogin-loggedin": "Ti t'ê zà connesso comme {{GENDER:$1|$1}}.\nUsa o formulaio sottostante pe accede comme 'n atro utente.",
+       "userlogin-createanother": "Crea 'n atra utensa",
+       "createacct-emailrequired": "Addresso e-mail:",
+       "createacct-emailoptional": "Adresso email (opsionale)",
+       "createacct-email-ph": "Scrivi o teu adresso email",
+       "createacct-another-email-ph": "Scrivi o teu adresso email",
        "createaccountmail": "Doeuvia una password temporanea abrettio e mandila a l'adresso de posta elettronica speçificou",
+       "createacct-realname": "Nomme reale (opçionâ)",
        "createaccountreason": "Raxon:",
-       "createacct-imgcaptcha-ph": "Scrivi quello che ti veddi de d'ato",
+       "createacct-reason": "Raxon",
+       "createacct-reason-ph": "Perché t'ê apreuvo a creâ un'atra utensa",
        "createacct-submit": "Crea a to utensa",
-       "createacct-another-submit": "Crea un'atra utensa",
+       "createacct-another-submit": "Crea utensa",
+       "createacct-benefit-heading": "{{SITENAME}} o l'è realizzou da de gente comme ti.",
+       "createacct-benefit-body1": "{{PLURAL:$1|modiffica|modiffiche}}",
        "createacct-benefit-body2": "{{PLURAL:$1|paggina|paggine}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuiou|contribuioei}}",
        "badretype": "E paròlle d'ordine che t'hæ scrîo son despægie.",
+       "usernameinprogress": "A creassion de 'n utensa con questo nomme a l'è zà in corso.\nSe prega de aspêtâ.",
        "userexists": "O nomme ûtente inserîo o l'è za doeuviao.<br />\nÇernine 'n âtro.",
        "loginerror": "Errô inte l'accesso",
        "createacct-error": "Errô inta la creaçion de l'utença",
        "createaccounterror": "Imposcibbile creâ l'account: $1",
+       "nocookiesnew": "L'utensa a l'è stæta creâ, ma ti no t'ê intròu. {{SITENAME}} o deuvia i cookie pe lasciâ intrâ i utenti e ti ti ghe l'hæ disattivæ.\nRipreuva a intrâ co-o to nomme utente e poula segretta apen-a creæ doppo avei attivòu i cookie.",
+       "nocookieslogin": "Pe intrâ in {{SITENAME}} bezeugna aveighe i cookie attivæ. Ti ti ghe l'hæ disattivæ. Pe piaxei attîvili e preuva torna a intrâ.",
+       "nocookiesfornew": "L'utensa a no l'è stæta creâ, perché n'emmo posciuo confermâ a so sorgente.\nAsseguite d'avei attivòu i cookie, recarrega sta paggina e ripreuva.",
        "noname": "O nomme d'ûtente o l'è sballiòu.",
        "loginsuccesstitle": "Accesso effettuòu",
        "loginsuccess": "'''O collegamento a-o server de {{SITENAME}} co-o nomme d'ûtente \"$1\" o l'è attivo.'''",
-       "nosuchuser": "No gh'è nisciûn ûtente con quello nomme \"$1\". Verificâ o nomme inserîo ò creâ 'n nêuvo accesso.",
+       "nosuchuser": "No gh'è nisciun utente de nomme \"$1\".\nI nommi utente son senscibbili a-e maiuscole.\nVerifica o nomme inserîo ò [[Special:UserLogin/signup|crea una neuva utensa]].",
        "nosuchusershort": "No gh'è nisciûn ûtente con quello nomme \"$1\". Verificâ o nomme inserîo.",
-       "nouserspecified": "O se deive inserî 'n nomme d'ûtente.",
+       "nouserspecified": "Ti g'hæ da specificâ un nomme utente.",
        "login-userblocked": "St'utente o l'è bloccou. Accesso negou.",
        "wrongpassword": "Ti gh'æ scrîo 'na paròlla d'ordine sbaliâ. Tenta torna.",
        "wrongpasswordempty": "No ti g'hæ scrîo nisciûnn-a paròlla d'ordine. Tenta torna.",
        "passwordtooshort": "E password devan aveighe aomanco {{PLURAL:$1|1 carattere|$1 caratteri}}.",
+       "passwordtoolong": "A poula segretta a no peu contegnî ciù de {{PLURAL:$1|1 carattere|$1 caratteri}}.",
+       "passwordtoopopular": "No se peu deuviâ de paole segrette troppo ordenaie. Pe piaxei çernitene un-a ciu particolâ.",
        "password-name-match": "A password a dev'ese despægia da-o nomme utente.",
        "password-login-forbidden": "L'utilizzo de sto nomme utente e password o l'è stæto proibio.",
-       "mailmypassword": "Invia 'na nêuva paròlla segrétta a-a mæ e-mail",
+       "mailmypassword": "Reimposta a poula segretta",
        "passwordremindertitle": "Servissio Password Reminder (nêuva paròlla d'ordine temporannia) de {{SITENAME}}",
-       "passwordremindertext": "Quarchedûn (probabilmente ti, con indirisso IP $1) o l'ha domandòu l'invîo de 'na nêuva paròlla d'ordine pe l'accesso a {{SITENAME}} ($4).\nA paròlla d'ordine pe l'ûtente \"$2\" a l'è stæta impostâ a \"$3\".\nSe conseggia de fâ l'accesso quanto primma e cangiâ a paròlla d'ordine immediatamente.\nSe no ti ê stæto ti a fâ 'sta domanda, oppûre se ti t'hæ ritrovòu a têu paròlla d'ordine e no ti vêu cangiâla ciû, ti pêu ignorâ 'sto messaggio e andâ avanti deuviando a vegia paròlla d'ordine.",
+       "passwordremindertext": "Quarchedûn (probabilmente ti, con addresso IP $1) o l'ha domandòu l'invîo de 'na nêuva poula segretta pe l'accesso a {{SITENAME}} ($4).\nA poula segretta temporannia pe l'utente \"$2\" a l'è stæta impostâ a \"$3\".\nSe l'è questo che ti voeivi, intra òua e cangia subbito a poula segretta. A poula segretta temporannia a descazziâ doppo {{PLURAL:$5|un giorno|$5 giorni}}.\n\nSe no t'ê stæto ti a fâ 'sta recesta, oppûre se ti t'ê aregordòu da teu poula segretta e no ti veu ciu cangiâla , ti peu ignorâ sto messaggio e andâ avanti deuviando a vegia poula segretta.",
        "noemail": "No gh'è nisciûn indirisso e-mail registròu pe l'ûtente \"$1\".",
        "noemailcreate": "Ti devi dâ un addresso e-mail vallido.",
        "passwordsent": "Ûnn-a nêuva paròlla d'ordine a l'è stæta inviâa a l'indirisso e-mail registròu pe l'ûtente \"$1\".\nPe piaxei, fa 'n accesso appenn-a ti a ghe reçeivi.",
-       "blocked-mailpassword": "O teu indirisso IP o l'è affirmoö, e pe sta razon o non se peu usâ a funscion de remandâ a pòula segretta.",
-       "eauthentsent": "'N messaggio e-mail de confermassion o l'è stæto inviòu a l'indirisso indicòu.\nPe abilitâ l'invîo de messaggi e-mail pe quest'accesso, o se deive seguî l'istrûssioîn indicæ, coscì ti confermi che ti t'è o legittimo propietâjo de l'indirisso.",
+       "blocked-mailpassword": "O teu addresso IP o l'è bloccòu, e pe sta raxon non se peu usâ a funsion de recuppero da pòula segretta, pe prevegnî di abuxi.",
+       "eauthentsent": "Un messaggio e-mail de conferma o l'è stæto inviòu a l'addresso indicòu.\nPe abilitâ l'invîo de messaggi e-mail pe quest'utensa, se deve seguî e instrussioin indicæ, pe confermâ che ti t'ê o legittimo propietâio de l'utensa.",
+       "throttled-mailpassword": "Un'e-mail de reimpostassione da poula segretta a l'è zà stæta inviâ da meno de {{PLURAL:$1|1 oa|$1 oe}}.\nPe prevegnî di abuxi, a fonsion de reimpostassion da poula segretta a peu vese deuviâ solo che 'na votta ogni {{PLURAL:$1|oa|$1 oe}}.",
        "mailerror": "Errô inte l'invio do messaggio: $1",
-       "acct_creation_throttle_hit": "Ne dispiâxe, ma t'hæ zà creòu $1 accesci. No ti pêu creâne ciû!",
-       "emailauthenticated": "O teu indirisso de posta elettronica o l'è stæto autenticou o $2 a $3.",
+       "acct_creation_throttle_hit": "{{PLURAL:$1|1 registraçion a l'è zà stæta effettuâ|$1 registraçioin son zà stæte effettuæ}} da quarcun co-o to mæximo addresso IP inte l'urtimo giorno: o l'è o mascimo consentio inte questo periodo de tempo.\nPerçò, i utenti ch'adeuvian sto addresso IP pe-o momento no peuan registrase.",
+       "emailauthenticated": "O teu adresso e-mail o l'è stæto aotenticòu o $2 a $3.",
+       "emailnotauthenticated": "L'adresso de posta elettronica o no l'è stæto ancon confermòu.\nNo saian inviæ messaggi e-mail pe-e funçioin elencæ chì de sotta.",
        "noemailprefs": "Pe attivâ ste fonçioin ti g'hæ da mette n'adresso e-mail inte preferençe.",
        "emailconfirmlink": "Conferma o teu indirisso de posta elettronega",
-       "accountcreated": "Graçie pe esëte registroö!!!",
+       "invalidemailaddress": "L'adresso e-mail indicòu o l'ha un formato non vallido. Inseisci un adresso valido o donque sveua a casella.",
+       "cannotchangeemail": "I adressi e-mail no peuan ese modificæ in sce sto wiki.",
+       "emaildisabled": "Sto scito o no peu inviâ messaggi de posta eletronnica.",
+       "accountcreated": "Graçie pe êsite registròu!",
        "accountcreatedtext": "L'utensa pe [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|msg]]) a l'é stæta creâ.",
        "createaccount-title": "Creaçion de 'n conto pe {{SITENAME}}",
+       "createaccount-text": "Quarcun o l'ha creòu un utensa pe quest'adresso e-mail a {{SITENAME}} ($4) a nomme de $2, co-a poula segretta \"$3\".\nTi doviesci intrâ e cangiâ subbito a to poula segretta.\n\nSe quest'utensa a l'è stæta creâ pe sballio, no stanni a dâ a mente a sto messaggio.",
+       "login-throttled": "T'hæ çercòu de intrâ troppe votte tutt'assemme.\nPe piaxei aspeta $1 primma de provâ torna.",
        "login-abort-generic": "O to accesso o no l'ha avuo successo - Abortio",
+       "login-migrated-generic": "A teu utensa a l'è stæta migrâ, e o to nomme utente in sce questo wiki o no l'existe ciù.",
        "loginlanguagelabel": "Lengoa: $1",
+       "suspicious-userlogout": "A teu recesta de desconescion a l'è stæta refuâ perché a pâ  mandâ da un navegatô non funçionante o un proxy de caching.",
+       "createacct-another-realname-tip": "O nomme veo o l'è opçionâ.\nSe ti çerni de inseilo, o saiâ deuviòu pe attribuî a l'aotô a paternitæ di contengnui inviæ.",
+       "pt-login": "Intra",
+       "pt-login-button": "Intra",
+       "pt-createaccount": "Registrite",
+       "pt-userlogout": "Sciorti",
+       "php-mail-error-unknown": "Errô sconosciuo intaa funçion PHP mail()",
        "user-mail-no-addy": "T'hæ çercou de mandâ un' e-mail sensa mettighe l'adresso",
        "user-mail-no-body": "T'hæ çercou de mandâ un'e-mail troppo curta o proppio voeua",
        "changepassword": "Cangiâ a pòula segretta",
-       "resetpass_announce": "T'ê introu co in codiçe temporanio de l'e-mail.Pe completâ l'accesso ti devi çerne 'na neuva poula segretta chì:",
+       "resetpass_announce": "Pe completâ l'accesso ti devi çerne 'na neuva poula segretta.",
        "resetpass_header": "Cangia a pòula segretta do conto",
        "oldpassword": "Vegia poula segretta",
        "newpassword": "Neuva poula segretta",
        "retypenew": "Ripette a nêuva paròlla d'ordine:",
        "resetpass_submit": "Çerni a poula segretta e intra",
        "changepassword-success": "O cangio de password o l'é anæto ben!",
+       "changepassword-throttled": "T'hæ çercòu de intrâ troppe votte tutt'assemme.\nPe piaxei aspeta $1 primma de provâ torna.",
        "resetpass_forbidden": "No l'é poscìbile cangiâ e paròlle segrétte",
+       "resetpass-no-info": "Pe anâ direttamente a sta paggina, primma ti g'hæ da intrâ .",
        "resetpass-submit-loggedin": "Cangia a password",
        "resetpass-submit-cancel": "Anulla",
+       "resetpass-wrong-oldpass": "Poula segretta temporannia o attuale non vallida.\nA poula segretta a porriæ za ese stæta cangiâ, oppû una poula segretta neuva a porriæ ese stæta domandâ.",
+       "resetpass-recycled": "Pe piaxei reimposta a to poula segretta con un-a despægia da quella attuale.",
+       "resetpass-temp-emailed": "T'ê intròu co-in codiçe temporannio, inviòu via e-mail. Pe completâ l'accesso, ti g'hæ da impostâ una neuva poula segretta chì:",
+       "resetpass-temp-password": "Poula segretta temporannia:",
+       "resetpass-abort-generic": "A modiffica da poula segretta a l'è stæta interotta da un'estenscion.",
+       "resetpass-expired": "A to poula segretta a l'è descheita. Pe piaxei impòstine un-a neuva pe intrâ.",
+       "resetpass-expired-soft": "A to poula segretta a l'è descheita e a g'ha da ese reimpostâ. Pe piaxei çèrnine un-a neuva òua ò clicca in sce \"{{int:resetpass-submit-cancel}}\" pe reimpostâla ciu tardi.",
+       "resetpass-validity-soft": "A to poula segretta a no l'è vallida: $1\n\nPe piaxei çèrnine un-a neuva òua, ò clicca in sce \"{{int:resetpass-submit-cancel}}\" pe reimpostala ciu tardi.",
+       "passwordreset": "Reimposta a poula segretta",
+       "passwordreset-text-one": "Compilla sto formulaio pe riçeive a teu poula segretta temporannia via e-mail.",
+       "passwordreset-text-many": "{{PLURAL:$1|Compilla un di campi pe riçeive una poula segretta temporannia via e-mail.}}",
+       "passwordreset-disabled": "A reimpostaçion de poule segrette a l'è stæta disabilitâ in sce sta wiki",
+       "passwordreset-emaildisabled": "E funçionalitæ de posta elettronnica son stæte disabilitæ in sce sta wiki.",
        "passwordreset-username": "Nomme utente",
+       "passwordreset-domain": "Dominnio:",
+       "passwordreset-capture": "Visualizzâ o contegnuo do messaggio e-mail?",
+       "passwordreset-capture-help": "Se ti seleçion-i sta casella, l'e-mail (co-a poula segretta temporannia), o saiâ mostròu a ti, oltre ch'a ese inviòu a l'utente.",
        "passwordreset-email": "Addresso e-mail:",
        "passwordreset-emailtitle": "Dettaggi account sciu {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Quarcun (probabilmente ti, con adresso IP $1) o l'ha domandòu l'invio de 'na neuva poula segretta per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associòu|I utenti associæ}} a sto addresso e-mail son:\n\n$2\n\n{{PLURAL:$3|Questa poula segretta temporannia a descazziâ|Queste poule segrette temporannie descazzian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una neuva poula segretta oua. \n\nSe no t'ê stæto ti a fâ a domanda, ò se ti t'hæ aregordòu a poula segretta originale e no ti veu ciù cangiâla, ti peu ignorâ sto messaggio e continuâ a deuviâ a teu vegia poula segretta.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPoula segretta temporannia: \n$2",
-       "changeemail": "Cangia l'adresso e-mail",
+       "passwordreset-emailsentemail": "Se questo o l'è un addresso de posta elettronnica registròu pe-a teu utensa, alloa saiâ inviâ un'e-mail pe reimpostâ a poula segretta.",
+       "passwordreset-emailsent-capture": "L'è stæto inviòu un'e-mail de reimpostaçion da poula segretta, o contegnuo o l'è riportòu chì appreuvo.",
+       "passwordreset-emailerror-capture": "L'è stæto generòu un'e-mail de reimpostaçion da poula segretta, riportà chì appreuvo. L'invio {{GENDER:$2|a l'utente}} o no l'è ariêscîo: $1",
+       "changeemail": "Cangia o elimmina l'adresso e-mail",
+       "changeemail-header": "Completa sto formulaio pe cangiâ o to adresso e-mail. Se ti veu rimeuve l'associaçion de quasesegge addresso e-mail da-a teu utensa, lascia io neuvo addresso e-mail veuo quande ti invii o formulaio.",
+       "changeemail-passwordrequired": "Saiâ necessaio insei a poula segretta pe confermâ a modiffica.",
+       "changeemail-no-info": "Pe anâ direttamente a sta paggina, primma ti g'hæ da intrâ .",
+       "changeemail-oldemail": "Addresso e-mail corrente:",
        "changeemail-newemail": "Noeuvo adresso e-mail",
+       "changeemail-newemail-help": "Sto campo dev'ese lasciòu veuo se ti veu rimeuve o to addresso e-mail. No ti saiæ in graddo de reimpostâ 'na poula segretta desmentegâ e ti no riçeviæ e-mail da questo wiki, se l'adresso de posta elettronnica o ven rimosso.",
        "changeemail-none": "(nisciun)",
        "changeemail-password": "A to password pe {{SITENAME}}:",
        "changeemail-submit": "Cangia e-mail",
+       "changeemail-throttled": "T'hæ çercòu de intrâ troppe votte.\nPe piaxei aspeta $1 primma de provâ torna.",
+       "changeemail-nochange": "Pe piaxei inseisci un neuvo addresso e-mail.",
+       "resettokens": "Reimposta token",
+       "resettokens-text": "Chì ti peu reimpostâ e ciave che permettav l'accesso a di determinæ dæti privæ associæ a-a teu utensa.\n\nTi doviesci falo se ti l'hæ accidentalmente condivise con quarcun o se-a teu utensa a l'è stæta compromissa.",
+       "resettokens-no-tokens": "Token da reimpostâ no ghe n'è.",
+       "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (oua o l'è: $2)",
+       "resettokens-watchlist-token": "Token pe-o feed web (Atom/RSS) de [[Special:Watchlist|modiffiche a-e paggine inti teu sott'oservaçion]]",
+       "resettokens-done": "Token reimpostæ.",
+       "resettokens-resetbutton": "Reimposta token selessionæ",
        "bold_sample": "Grascetto",
        "bold_tip": "Grascetto",
        "italic_sample": "Testo in corscivo",
        "image_tip": "Incorpora file",
        "media_sample": "Exempio.ogg",
        "media_tip": "Colegaménto a file moltimediâ",
-       "sig_tip": "Firma con data e ôa",
+       "sig_tip": "Firma con dæta e ôa",
        "hr_tip": "Linnia orizontâ",
        "summary": "Oggetto:",
-       "subject": "Argomento (tittolo):",
+       "subject": "Sogetto:",
        "minoredit": "Cangiamento minô (m)",
        "watchthis": "Metti sotta oservaçion",
        "savearticle": "Sarva a pàgina",
        "preview": "Anteprìmma",
        "showpreview": "Veddi l'anteprimma",
        "showdiff": "Veddi i cangiamenti",
-       "anoneditwarning": "'''Attension:''' No t'ê intròu. Inta stoia di cangiamenti da paggina ghe saiâ misso o têu adresso IP.",
+       "blankarticle": "<strong>Attençion:</strong> a paggina che ti çerchi a l'è veua.\nCliccando torna in sce \"{{int:savearticle}}\", a paggina a saiâ creâ sensa contegnui.",
+       "anoneditwarning": "<strong>Attension:</strong> No t'ê introu. Se ti fæ di cangi o teu adresso IP o saiâ vixibile pubbricamente. Se <strong>[$1 ti intri]</strong> ò <strong>[$2 ti crei un'utensa]</strong>, e teu modifiche saian attribuie a-o teu nomme utente, insemme a di atri benefiççi.",
        "anonpreviewwarning": "No t'hæ fæto l'accesso. Se ti sarvi inta stoia da paggina ghe saiâ solo o to adresso IP",
+       "missingsummary": "<strong>Aregòrdite:</strong> no t'hæ specificòu l'oggetto de questa modiffica. Sciaccando torna \"{{int:savearticle}}\", a modiffica a saiâ sarvâ sensa.",
+       "selfredirect": "<strong>Attençion:</strong> t'ê apreuvo a rendirissâ sta paggina a lê mæxima.\nFoscia t'hæ sballiòu a indicâ a destinaçion pe-o redirect, ò donque ti modiffichi a paggina sbaliâ.\nSe ti clicchi torna \"{{int:savearticle}}\", o redirect o saiâ creòu comunque.",
        "missingcommenttext": "Scrivi un commento chi de sotta",
+       "missingcommentheader": "<strong>Aregòrdite:</strong> no t'hæ specificòu o soggetto de sto commento. Sciaccando torna \"{{int:savearticle}}\", a modiffica a saiâ sarvâ sensa.",
        "summary-preview": "Anteprimma oggetto:",
+       "subject-preview": "Anteprimma do soggetto:",
+       "previewerrortext": "Gh'è stæto un errô mentre se çercava de mostrâ l'anteprimma.",
        "blockedtitle": "L'utente o l'é bloccòu",
        "blockedtext": "''''O to nomme utente ò adresso IP o l'è stæto bloccòu.'''\n\nO blòcco o l'è stæto fæto da $1. A raxon dæta a l'è ''$2''.\n\n* Iniçio do blocco: $8\n* Fin do blocco: $6\n* Utente blocou: $7\n\nL'è poscibbile contattâ $1 o un âtro [[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discûtte inscio blòcco.\nNo ti poeu doeuviâ o comando \"Manda un'e-mail a st'ûtente\" se no ti g'hæ 'n adresso e-mail registròu inte to [[Special:Preferences|preferençe]] e se no t'ê stæto bloccòu ascì.\nO to adresso IP o l'è $3, e o to blòcco ID o l'è #$5.\nPe piaxei, pe domandâ informaçioin, speçifficali tutti doî.",
-       "autoblockedtext": "O têu indirisso IP o l'è stæto bloccòu outomaticamente perché o l'ea za ûsòu da 'n âtro ûtente, bloccòu da $1.\nA raxon dæta a l'è stæta:\n\n:''$2''\n\n* Inissio do blòcco: $8\n* Fin do blòcco: $6\n\nTi pêu contattâ $1 ou 'n âtro\n[[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe parlâ inscio blòcco.\n\nDagghe a mente a che no ti pêu ûsâ o comando \"manda na littia elettronega a sto utente\" se non ti g'hæ 'n indirisso de posta elettronega registroö in te têu [[Special:Preferences|preferense]] e se o no l'è stæto bloccòu ascì.\n\nO têu blòcco ID o l'è $5. Pe piaxei metti 'sto ID in tûtte e domande che ti fæ.",
+       "autoblockedtext": "O teu addresso IP o l'è stæto bloccòu outomaticamente perché o l'ea za usòu da 'n âtro utente, bloccòu da $1.\nA raxon dæta a l'è stæta:\n\n:''$2''\n\n* Prinsippio do blòcco: $8\n* Fin do blòcco: $6\n\nTi peu contattâ $1 ò un âtro\n[[{{MediaWiki:Grouppage-sysop}}|amministratô]] pe discutte o blòcco.\n\nDanni a mente a che no ti pêu ûsâ o comando \"manda 'na e-mail a sto utente\" se non ti g'hæ 'n addresso de posta elettronega registròu in te têu [[Special:Preferences|preferense]] e se ti no t'ê stæto bloccòu ascì.\n\nO to adresso IP o l'è $3, e o to blòcco ID o l'è #$5. Pe piaxei, pe domandâ informaçioin, speçifficali tutti doî.",
+       "blockednoreason": "nisciun-a motivaçion dæta",
        "whitelistedittext": "Pe cangia sta pagina devvi $1.",
+       "confirmedittext": "Pe ese abilitæ a-a modiffica de paggine bezeugna confermâ o proppio addresso e-mail. Pe impostâ e confermâ l'adresso servîse de [[Special:Preferences|preferençe]].",
+       "nosuchsectiontitle": "Imposcibbile trovâ a seçion",
+       "nosuchsectiontext": "T'hæ çercòu de modificâ una seçion inexistente.\nA porriæ ese stæta mesciâ ò eliminâ mentre ti t'amiavi a paggina.",
        "loginreqtitle": "Besêugna registrâse primma de modificâ 'sta paggina.",
        "loginreqlink": "intra",
        "loginreqpagetext": "Pe amiâ di atre paggine gh'è da $1",
        "accmailtitle": "Pòula segretta spedïa",
-       "accmailtext": "Una password abrettio pe [[User talk:$1|$1]] a l'è stæta mandâ a $2.\n\nSta password a poeu ese cangiâ inta paggina pe ''[[Special:ChangePassword|cangiâ a password]]'' subbito doppo l'acesso.",
+       "accmailtext": "Una poula segretta generâ abrettio pe [[User talk:$1|$1]] a l'è stæta mandâ a $2.\n\nSta poula segretta a peu ese cangiâ inta paggina pe ''[[Special:ChangePassword|cangiâ a poula segretta]]'' subbito doppo l'accesso.",
        "newarticle": "(Nêuvo)",
        "newarticletext": "Sto colegaménto o corisponde a 'na pàgina ch'a no l'existe ancon.\n\nSe se vêu creâ a pàgina òua, se pêu comensâ a scrive into spàçio chì sotta.\n(amia e [$1 paggine d'agiûtto] pe ciû informaçioìn).\n\nSe t'ê intròu chì pe sballio,  sciacca '''Inderê''' into navegatô.",
        "anontalkpagetext": "----\n''Sta chì a l'è a paggina de discuscion de un utente anonnimo, ch'o no l'ha ancon creou un'utensa o comunque o no a doeuvia oua. Pe identificâlo l'è quindi necessaio doeuviâ o nummero do so adresso IP. I adresci IP poeuan però ese condivixi da ciù utenti. Se t'ê un utente anonimo e ti ritegni che i commenti inte sta pagina no se riferiscian a ti, [[Special:UserLogin/signup|crea una noeuva utensa]] o donque [[Special:UserLogin|intra con quella che ti g'hæ za]] pe evitâ de chì avanti de ese confuzo con di atri utenti anonnimi .''",
-       "noarticletext": "Inte sto momento a pagina çercâ a l'è vêua. O l'è poscibbile [[Special:Search/{{PAGENAME}}|çercâ 'sto tittolo]] inte âtre pagine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pagina òua].",
+       "noarticletext": "Po-u momento a pagina çercâ a l'è vêua. L'è poscibbile [[Special:Search/{{PAGENAME}}|çercâ 'sto tittolo]] inte âtre pagine do scîto opû [{{fullurl:{{FULLPAGENAME}}|action=edit}} cangiâ a pagina òua].",
        "noarticletext-nopermission": "Òua a pàgina çercâ a l'è vêua. L'è poscìbile [[Special:Search/{{PAGENAME}}|çercâ sto tìtolo]] inte di âtre pàgine do scîto o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} çercâ inti registri corelæ]</span>, ma no ti gh'hæ i outorizzaçioin pe creâ sta paggina.",
+       "missing-revision": "La verscion #$1 da paggina \"{{FULLPAGENAME}}\" a no l'esiste.\n\nQuesto succede solitamente se inta stoia ti sciacchi un vegio ingancio a una paggina scassâ.\n\nI dettaggi peuan ese attrovæ into [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de scançellaçioin].",
+       "userpage-userdoesnotexist": "L'utensa \"$1\" a no corisponde a un utente registròu.\nTi veu davei creâ o modificâ sta paggina?",
        "userpage-userdoesnotexist-view": "L'utensa \"$1\" a no l'è registrâ.",
+       "blocked-notice-logextract": "St'utente o l'è attualmente bloccòu.\nL'urtimo elemento into registro di blocchi o l'è riportòu chì appreuvo pe informassion:",
+       "clearyourcache": "<strong>Notta:</strong> doppo avei sarvou, poriæ ese necessaio nettezâ a cache do proppio navegatô pe vedde i cangiamenti. \n*<strong>Firefox / Safari:</strong> tegnî sciacou o tasto de maiuscole <em>Shift</em> e cliccâ <em>Riecarrega</em>, oppû premme <em>Ctrl-F5</em> ò <em>Ctrl-R</em> (<em>⌘-R</em> insce Mac)\n*<strong>Google Chrome:</strong> premme <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> insce un Mac)\n*<strong>Internet Explorer:</strong> tegnî sciacou o tasto <em>Ctrl</em> e cliccâ <em>Aggiorna</em>, oppû premme <em>Ctrl-F5</em>\n*<strong>Opera:</strong> svuâ completamente a cache da-o menu <em>Strumenti → Preferençe</em>",
+       "usercssyoucanpreview": "'''Suggerimento:''' adeuvia o pomello 'Amia l'anteprimma' per provâ o to neuvo CSS primma de sarvâlo.",
+       "userjsyoucanpreview": "'''Suggerimento:''' adeuvia o pomello 'Amia l'anteprimma' per provâ o to neuvo JavaScript primma de sarvâlo.",
+       "usercsspreview": "'''Questa a l'è solo un'anteprimma do proppio CSS personâ. E modiffiche no son ancon stæte sarvæ!'''",
+       "userjspreview": "'''Questa a l'è solo un'anteprimma do proppio  JavaScript personâ. E modiffiche no son ancon stæte sarvæ!'''",
+       "sitecsspreview": "'''Questa a l'è solo un'anteprimma do CSS. E modiffiche no son ancon stæte sarvæ!'''",
+       "sitejspreview": "'''Questa a l'è solo un'anteprimma pe provâ o JavaScript; e modiffiche no son ancon stæte sarvæ!'''",
+       "userinvalidcssjstitle": "<strong>Attension:</strong> no existe arcun tema con nomme \"$1\". E paggine pe-i .css e .js personalizzæ g'han o tittolo minuscolo, presempio {{ns:user}}:Esempio/vector.css e no {{ns:user}}:Esempio/Vector.css.",
+       "updated": "(Aggiornòu)",
+       "note": "'''Notta:'''",
        "previewnote": "'''Questa chì a l'è solo 'n'anteprimma; i cangiamenti no son ancon stæti sarvæ!'''",
+       "continue-editing": "Vanni a l'area de modiffica",
+       "previewconflict": "L'anteprimma a mostra o scrito presente inta casella de modiffica de d'ato coscì comme o l'apaiâ se ti çerni de sarvalo òua.",
+       "session_fail_preview": "'''N'emmo posciuo elaborâ a modiffica a caosa da pèrdia di dæti relativi a-a sescion.'''\nRitenta.\nSe-o problema o persciste, preuva a [[Special:UserLogout|sciortî]] e a intrâ torna.'''",
+       "edit_form_incomplete": "'''De parte do formulaio de modiffica n'han razonto o server; controlla che e modiffiche seggian intatte e ripreuva.'''",
        "editing": "Modiffica de $1",
+       "creating": "T'ê apreuvo a creâ $1",
        "editingsection": "Càngio de $1 (seçión)",
+       "editingcomment": "Càngio de $1 (neuva seçion)",
+       "editconflict": "Conflito d'ediçion: $1",
+       "explainconflict": "Un atro utente o l'ha sarvòu una neuva verscion da paggina de mentre che t'êi apreuvo a cangiâla.\nA casella de modiffica de d'ato a conten o scrito da paggina coscì comm'o l'è òua.\nE teu modiffiche son invece mostræ inta casella de modiffica de sotta.\nTi g'hæ da stramuâ e teu modiffiche inta casella de d'ato.\nSciaccando o pomello '{{int:savearticle}}', o saiâ sarvòu '''solo''' o scrito contegnuo inta casella de d'ato.",
        "yourtext": "O teu testo",
+       "storedversion": "La verscion memorizzâ",
+       "nonunicodebrowser": "'''Attençion: o teu navegatô o no l'è compatibbile co-i caratteri Unicode.''' Pe consentî a modiffica de paggine sença problemi, i caratteri non ASCII saian vixualizzæ inta casella de modiffica sotto forma de codiçi esadeximæ.'''",
+       "editingold": "<strong>Attençion: t'ê apreuvo a modificâ una verscion non aggiornâ da paggina.</strong>\nSarvandola coscì, tutti i cangi fæti doppo sta verscion saian sorvescriti.",
        "yourdiff": "Differense",
        "copyrightwarning": "Nota: Tùtte e contribuçioìn a {{SITENAME}} van conscideræ comme rilasciæ drento a-i termini da licensa d'ûso $2 (veddi $1 pe savéine de ciù).\nSe no ti veu che i testi teu pêuan esse modificæ da quarchedùn sensa limitaçioìn, no mandâli a {{SITENAME}}.<br />\nInviando o testo ti diciâri, sott'a teu responsabilitæ, ch'o l'é stæto scrîto da ti personalmente oppure ch'o l'é stæto piggiòu da 'na fonte de pùbrico domìnio òu anàlogamente lìbea.<br />\n'''NO INVI MATERIÂLE COVERTO DA DRÎTI D'AUTÔ SENSA OUTORIZAÇION!'''",
+       "editpage-cannot-use-custom-model": "O modello do contegnuo de sta paggina o no peu ese modificòu.",
+       "longpageerror": "'''Errô: o scrito inviou o l'è longo {{PLURAL:$1|1|$1}} kilobyte, ciu che-o mascimo consentio de ({{PLURAL:$2|1|$2}} kilobyte).'''\nNo se peu sarvâ.",
+       "protectedpagewarning": "'''Attençion: questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala.'''\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referença:",
+       "semiprotectedpagewarning": "'''Notta:''' Questa paggina a l'è stæta bloccä de moddo che solo i utenti registræ possan modificâla.\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referensa:",
+       "cascadeprotectedwarning": "'''Attençion:''' Questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala da-o momento ch'a l'é inclusa seleçionando a proteçion \"ricorsciva\" {{PLURAL:$1|inta paggina|inte paggine}}:",
+       "titleprotectedwarning": "'''Attension: Questa paggina a l'è stæta bloccâ de moddo che seggian necessai [[Special:ListGroupRights|di driti speciffichi]] pe creâla.'''\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referensa:",
        "templatesused": "{{PLURAL:$1|Template dêuviòu|Template dêuviæ}} in sta pàgina:",
-       "templatesusedpreview": "Template dêuviæ inte 'st'anteprimma:",
+       "templatesusedpreview": "{{PLURAL:$1|Template deuviou|Template deuviæ}} in te st'anteprimma:",
+       "templatesusedsection": "{{PLURAL:$1|Template deuviòu|Template deuviæ}} in questa seçion:",
        "template-protected": "(protezûo)",
        "template-semiprotected": "(semiprotezûo)",
        "hiddencategories": "Sta pàgina a fa parte de {{PLURAL:$1|1 categoria ascoza|$1 categorie ascoze}}:",
-       "nocreatetext": "A poscibilitæ de creâ nêuve paggine insce {{SITENAME}} a l'è stæta limitâ solo a-i ûtenti registræ.\nO se pêu tornâ inderê e modificâ 'na paggina escistente, oppûre [[Special:UserLogin|intrâ ò creâ 'n accesso nêuvo]].",
+       "nocreatetext": "A poscibilitæ de creâ nêuve paggine insce {{SITENAME}} a l'è stæta limitâ solo a-i ûtenti registræ.\nSe pêu tornâ inderê e modificâ 'na paggina existente, oppûre [[Special:UserLogin|intrâ ò creâ 'n accesso nêuvo]].",
+       "nocreate-loggedin": "No ti g'hæ i permissi pe creâ de paggine neuve.",
+       "sectioneditnotsupported-title": "Modiffica de seçioin non supportâ",
+       "sectioneditnotsupported-text": "A modiffica de seçioin a no l'è supportâ in questa paggina.",
+       "permissionserrors": "No ti g'hæ o permisso",
+       "permissionserrorstext": "No ti g'hæ i permissi pe fâlo, pe  {{PLURAL:$1|questa raxon|queste raxoin}}:",
        "permissionserrorstext-withaction": "No ti g'hæ i permìssi pe $2 pe {{PLURAL:$1|sta raxon|ste raxoìn}}:",
+       "contentmodelediterror": "No ti peu modificâ sta verscion da-o momento che o so modello de contegnuo o l'è <code>$1</code>, mentre o corrente modello de contegnuo da paggina o l'è <code>$2</code>.",
        "recreate-moveddeleted-warn": "Atençión: ti stæ pe ricreâ 'na pàgina zà scancelâ into passòu.'''\n\nConsciddera se l'è o caxo de continoâ  a cangiâ 'sta pàgina.\nPe comoditæ e cancellaçioìn e i stramui son pubricæ chì sotta:",
        "moveddeleted-notice": "Sta pàgina a l'é stæta scancelâ.\nA lista de scancelaçioìn e di stramui son riportæ chi de sotta pe informaçión.",
+       "moveddeleted-notice-recent": "Spiaxenti, sta paggina a l'è stæta scassâ reçentemente (inte urtime 24 oe).\n\nE açioin de cançellaçion e spostamento pe questa paggina son disponibile chì appreuvo pe referença.",
+       "log-fulllog": "Amîa o log completo",
+       "edit-hook-aborted": "A modifica a l'è stæta annullâ da l'hook.\nO no l'ha dæto arcun-a spiegassion.",
+       "edit-gone-missing": "Imposcibbile aggiornâ a paggina.\nPâ ch'a segge stæta scassâ.",
+       "edit-conflict": "Conflito d'ediçion.",
+       "edit-no-change": "A modiffica a l'è stæta ignorâ za che o scrito o no l'è cangiòu.",
+       "postedit-confirmation-created": "A paggina a l'è stæta creâ.",
+       "postedit-confirmation-restored": "A paggina a l'è stæta ripristinâ.",
+       "postedit-confirmation-saved": "A modiffica a l'è stæta sarvâ.",
+       "edit-already-exists": "Imposcibbile creâ una neyva paggina.\nA l'existe zà.",
+       "defaultmessagetext": "Scrito do messaggio predefinio",
+       "content-failed-to-parse": "Imposcibbile analizzâ $2 pe-o modello $1: $3",
+       "invalid-content-data": "Dæti contegnui non vallidi",
+       "content-not-allowed-here": "Contegnuo in \"$1\" non consentio inta paggina [[$2]]",
+       "editwarning-warning": "Lasciâ sta paggina porriæ caosâ a perdia de tutte e modiffiche fæte.\nSe ti t'hê introu, ti peu disattivâ st'aviso inta seçion \"{{int:prefs-editing}}\" de teu preferençe.",
+       "editpage-notsupportedcontentformat-title": "Formato contegnuo non supportou",
+       "editpage-notsupportedcontentformat-text": "O formato do contegnuo $1 o no l'è supportou da-o modello de contegnuo $2.",
+       "content-model-wikitext": "wikitesto",
+       "content-model-text": "testo normale",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Ogetto veuo",
+       "content-json-empty-array": "Array veuo",
+       "duplicate-args-warning": "<strong>Avvertensa:</strong> [[:$1]] o ciamma [[:$2]] con ciù de un valô pe-o parammetro \"$3\".  Solo l'urtimo valô fornio o saiâ deuviou.",
+       "duplicate-args-category": "Paggine che ciamman i template deuviando di parammetri duplicæ",
+       "duplicate-args-category-desc": "A paggina a conten de ciamæ a di template ch'adeuvian di argomenti duplicæ, comme presempio <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ò <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": "'''Attençion:''' Questa paggina a conten troppe ciamæ a-e fonçioin de parser .\n\nA doviæ aveighene meno de $2, a-o momento ghe n'è $1.",
+       "expensive-parserfunction-category": "Paggine con troppe ciamæ a-e fonçioin de parser .",
        "post-expand-template-inclusion-warning": "'''Atento:''' a dimensción di template che t'æ misso a l'é tròppo grande.\nQuarchedun di teu template o no saiâ incluzo.",
        "post-expand-template-inclusion-category": "Pàgine con di template che gh'àn a dimensción ciù âta do limite mascimo",
        "post-expand-template-argument-warning": "'''Atençión:''' sta pàgina a contegne un ò ciù argomenti di template che son tròppo gràndi pe êse espansi. Sti argomenti no saiàn fæti védde.",
        "post-expand-template-argument-category": "Pàgine con di template che ghe mancàn di argoménti",
-       "cantcreateaccounttitle": "Non çe peu registrâ o utente",
-       "cantcreateaccount-text": "A registrascion de utenti da questo indirisso IP (<b>$1</b>) a l'è stæta affermaä da [[User:$3|$3]].\n\nA razon dæta a l'è ''$2''",
+       "parser-template-loop-warning": "Rilevou loop do template: [[$1]]",
+       "parser-template-recursion-depth-warning": "Limmite de ricorscion into template superòu($1)",
+       "language-converter-depth-warning": "Limmite de profonditæ do convertitô de lengoa superòu ($1)",
+       "node-count-exceeded-category": "Paggine dovve l'è superòu o nummero di groppi.",
+       "node-count-exceeded-category-desc": "A paggina suppera o nummero mascimo de groppi.",
+       "node-count-exceeded-warning": "Sta paggina a l'ha superòu o nummero di groppi.",
+       "expansion-depth-exceeded-category": "Paggine inte quæ s'è superòu a profonditæ d'espanscion",
+       "expansion-depth-exceeded-category-desc": "A paggina a suppera a profonditæ mascima d'espanscion.",
+       "expansion-depth-exceeded-warning": "Sta paggine a l'ha superòu a profonditæ d'espanscion",
+       "parser-unstrip-loop-warning": "Rilevou ciclo de Unstrip",
+       "parser-unstrip-recursion-limit": "Superæ i limmiti de ricorscion de Unstrip ($1)",
+       "converter-manual-rule-error": "Rilevou errô inta reggola manoâ de converscion da lengoa",
+       "undo-success": "Questa modiffica a peu ese anullâ.\nControlla e differençe mostræ chì de sotta fra e doe verscioin pe ese seguo che-o contegnuo o corisponde a quante dexidiou, e quindi sarvâ e modiffiche pe completâ a proçedûa d'anullamento.",
+       "undo-failure": "Imposcibbile anullâ a modiffica a caosa de un conflito con de modiffiche intermeddie.",
+       "undo-norev": "A modiffica a no peu ese anullâ perché a no l'existe ò donque a l'è stæta scassâ.",
+       "undo-nochange": "Pâ che-a modiffica a sæ zà stæta anullâ.",
+       "undo-summary": "Annullou a modiffica $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discuscion]])",
+       "undo-summary-username-hidden": "Anullou a modiffica $1 de un utente ascoso",
+       "cantcreateaccounttitle": "Non se peu registrâ l'utente",
+       "cantcreateaccount-text": "A registrassion da questo addresso IP (<b>$1</b>) a l'è stæta bloccâ da [[User:$3|$3]].\n\nA raxon dæta a l'è ''$2''",
+       "cantcreateaccount-range-text": "A registraçion da di addressi IP inte l'intervallo '''$1''', ch'o  l'includde o teu ('''$4'''), a l'è stæta bloccâ da [[User:$3|$3]].\n\nA raxon dæta da $3 a l'è ''$2''",
        "viewpagelogs": "Veddi i log relativi a 'sta paggina.",
+       "nohistory": "A stoia de verscioin de sta paggina a no gh'è.",
        "currentrev": "Verscion attuâle",
-       "currentrev-asof": "Ùrtima revixón de-e $1",
+       "currentrev-asof": "Ùrtima revixón do $1",
        "revisionasof": "Verscion do $1",
-       "revision-info": "Verscion do $1 de $2",
+       "revision-info": "Verscion do $1 de {{GENDER:$6|$2}}$7",
        "previousrevision": "← Verscion meno recente",
        "nextrevision": "Revixon ciù nêuva →",
        "currentrevisionlink": "Ûrtima revixon",
        "history-show-deleted": "Sôlo scancelæ",
        "histfirst": "primma",
        "histlast": "urtima",
+       "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "historyempty": "(vêua)",
-       "history-feed-title": "Stöia de e revisioin",
+       "history-feed-title": "Stöia de revixioin",
+       "history-feed-description": "Stoia da paggina insce sto scito",
        "history-feed-item-nocomment": "$1 o $2",
+       "history-feed-empty": "A paggina domandâ a no l'existe; porriæ ese stæta scassâ da-o scito o rinominâ. Amîa inta [[Special:Search|paggina de riçerca]] se ghe ne foise de neuve.",
+       "history-edit-tags": "Modiffica i etichette de verscioin seleçionæ",
+       "rev-deleted-comment": "(Ogetto da modiffica rimosso)",
+       "rev-deleted-user": "(nomme utente rimosso)",
+       "rev-deleted-event": "(dettaggi do registro rimossi)",
+       "rev-deleted-user-contribs": "[nomme utente ò addresso IP rimosso - modiffica ascosa da-a stoia]",
+       "rev-deleted-text-permission": "Questa verscion da paggina a l'è stæta '''scassâ'''.\nConsurta o [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log de cançellaçioin] pe-i dettaggi.",
+       "rev-suppressed-text-permission": "Questa verscion da paggina a l'è stæta '''sopressa'''.\nConsurta a [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lista de soprescioin] pe-i dettaggi.",
+       "rev-deleted-text-unhide": "Questa verscion da paggina a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.\nA-i aministratoî l'è ancon consentio de [$1 visualizzâ sta verscion] se necessaio.",
+       "rev-suppressed-text-unhide": "Questa verscion da paggina a l'è stæta '''rimossa'''.\nConsurta a [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} lista de rimoçion] pe-i dettaggi.\nA-i aministratoî l'è ancon consentio de [$1 visualizzâ sta verscion] se necessaio.",
+       "rev-deleted-text-view": "Questa verscion da paggina a l'è stæta '''scassâ'''.\nTi ti peu amiala; consurta a [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} lista de rimoçion] pe-i dettaggi.",
+       "rev-suppressed-text-view": "Questa verscion da paggina a l'è stæta '''sopressa'''.\nTi ti peu amiâla; consurta a [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} lista de soprescioin] pe-i dettaggi.",
+       "rev-deleted-no-diff": "No ti peu amiâ sto diff percose un-a de verscioin a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.",
+       "rev-suppressed-no-diff": "No ti peu fâ sto confronto tra verscioin perché un-a a l'è stæta '''scassâ'''.",
+       "rev-deleted-unhide-diff": "Un-a de verscioin de sto confronto a l'è stæta '''scassâ'''.\nConsurta a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} lista de cançellaçioin] pe-i dettaggi.\nTi ti peu ancon [$1 fâ sto confronto] se necessaio.",
        "rev-delundel": "fanni védde/ascondi",
-       "revdelete-radio-set": "Sci",
+       "rev-showdeleted": "mostra",
+       "revisiondelete": "Scassa ò ripristina verscioin",
+       "revdelete-nooldid-title": "Verscion non specificâ",
+       "revdelete-no-file": "O file specificou o no l'existe.",
+       "revdelete-show-file-confirm": "T'ê seguo de voei amiâ a verscion scassâ do file \"<nowiki>$1</nowiki>\" do $2 a $3?",
+       "revdelete-show-file-submit": "Sci",
+       "revdelete-selected-text": "{{PLURAL:$1|Verscion seleçionâ|Verscioin seleçionæ}} de [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Verscion seleçionata|Verscioin seleçionæ}} do file [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|Evento do registro seleçionou|Eventi do registro seleçionou}}:",
+       "revdelete-legend": "Imposta e limitaçioin de vixibilitæ:",
+       "revdelete-hide-text": "Testo da verscion",
+       "revdelete-hide-image": "Ascondi i contegnui do file",
+       "revdelete-hide-name": "Ascondi obiettivo e parammetri",
+       "revdelete-hide-comment": "Oggetto da modiffica",
+       "revdelete-hide-user": "Nomme ò addresso IP de l'outô",
+       "revdelete-hide-restricted": "Ascondi i dæti a-i amministratoî ascì",
+       "revdelete-radio-same": "(no cangiâ)",
+       "revdelete-radio-set": "Ascoso",
+       "revdelete-radio-unset": "Vixibbile",
+       "revdelete-suppress": "Ascondi i dæti a-i amministratoî ascì",
+       "revdelete-unsuppress": "Elimmina e limitaçioin in scê verscioin ripristinæ",
+       "revdelete-log": "Raxon:",
+       "revdelete-submit": "Applica {{PLURAL:$1|a-a verscion seleçionâ|a-e verscioin seleçionæ}}",
+       "revdelete-success": "'''Vixibilitæ da verscion agiornâ con successo.'''",
+       "revdelete-failure": "'''A vixibilitæ da verscion a no peu ese agiornâ:'''\n$1",
+       "logdelete-success": "'''Registro de vixibilitæ impostou con successo.'''",
+       "logdelete-failure": "No s'è posciuo impostâ o registro de vixibilitæ: $1",
        "revdel-restore": "càngia a vixibilitæ",
+       "pagehist": "Stoia da paggina",
+       "deletedhist": "Stoia scassâ",
+       "revdelete-hide-current": "Imposcibbile asconde l'ogetto con dæta $1 $2 in quanto o l'è a verscion attuale.",
+       "revdelete-show-no-access": "Imposcibbile mostrâ l'ogetto con dæta $1 $2 in quanto o l'è stæto identificou comme \"riservou\" e no se dispon-e do relativo accesso.",
+       "revdelete-modify-no-access": "Imposcibbile modificâ l'ogetto con dæta $1 $2 in quanto o l'è stæto identificou comme \"riservou\" e no se dispon-e do relativo accesso.",
+       "revdelete-modify-missing": "Imposcibbile modificâ l'ogetto con ID $1: into database o no gh'è!",
+       "revdelete-no-change": "'''Attençion:''' l'ogetto con dæta $1 $2 o l'aveiva zà e impostaçioin de vixibilitæ domandæ.",
+       "revdelete-reason-dropdown": "* Raxoin ciù comun-e pe-o scassamento\n** Violaçion do drito d'outô\n** Commenti ò informaçioin personæ inappropiæ\n** Nomme utente inappropiou\n** Informaçion potençialmente diffamatoia",
+       "revdelete-otherreason": "Un atro motivo:",
+       "revdelete-reasonotherlist": "Un'atra raxon",
+       "revdelete-edit-reasonlist": "Modiffica e raxoin do scassamento",
+       "revdelete-offender": "Aotô da verscion:",
+       "suppressionlog": "Registro de sopprescioin",
+       "mergehistory": "Union de stoie da paggina",
+       "mergehistory-box": "Unisci a stoia de doe paggine:",
+       "mergehistory-from": "Paggina d'origgine:",
+       "mergehistory-into": "Paggina de destinaçion:",
+       "mergehistory-list": "Stoia a-a quæ se peu applicâ l'union",
+       "mergehistory-merge": "L'è poscibbile unî e verscioin de [[:$1]] indicæ chì appreuvo a-a stoia de [[:$2]]. Deuvia a colonna co-i pomelli de opçion pe unî tutte e verscioin scin a-a dæta e oa indicæ. \nNotta che deuviando i pomelli de navegaçion, sta colonna a saiâ azerâ.",
+       "mergehistory-go": "Mostra e modiffiche che peuan ese unie",
+       "mergehistory-submit": "Unisci e verscioin",
+       "mergehistory-empty": "Nisciun-a verscion da unî.",
+       "mergehistory-done": "{{PLURAL:$3|Una verscion de $1 a l'è stæta unia|$3 vercsioin de $1 son stæte unie}} a-a stoia de [[:$2]].",
+       "mergehistory-fail": "Imposcibbile unî e stoie. Verificâ a paggina e i parammetri temporali.",
+       "mergehistory-fail-toobig": "Imposcibbile eseguî l'union da stoia essendoghe ciu che o limmite de $1 {{PLURAL:$1|verscion|verscioin}} da mesciâ.",
+       "mergehistory-no-source": "A paggina d'origgine $1 a no l'existe.",
+       "mergehistory-no-destination": "A paggina de destinaçion $1 a no l'existe.",
+       "mergehistory-invalid-source": "A paggina d'origgine a deve aveighe un tittolo vallido.",
+       "mergehistory-invalid-destination": "A paggina de destinaçion a deve aveighe un tittolo vallido.",
+       "mergehistory-autocomment": "Union de [[:$1]] in [[:$2]]",
+       "mergehistory-comment": "Union de [[:$1]] in [[:$2]]: $3",
+       "mergehistory-same-destination": "A paggina d'origgine e quella de destinaçion no peuan ese a mæxima",
+       "mergehistory-reason": "Raxon:",
+       "mergelog": "Unioin",
        "revertmerge": "Anùlla union",
+       "mergelogpagetext": "Chì de sotta 'na lista di urtime unioin de 'na stoia co-in atra",
        "history-title": "Stöia de revixoìn de \"$1\"",
+       "difference-title": "$1: differense tra e verscioin",
+       "difference-title-multipage": "$1 e $2: differençe tra-e paggine",
+       "difference-multipage": "(Differençe tra-e paggine)",
        "lineno": "Linia $1:",
        "compareselectedversions": "Confronta e verscioîn selessionæ",
+       "showhideselectedversions": "Mostra/ascondi verscioin seleçionæ",
        "editundo": "Anùlla",
+       "diff-empty": "(Nisciun-a diferença)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de 'n mæximo utente {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
+       "diff-multi-otherusers": "({{PLURAL:$1|Una verscion intermedia|$1 De verscioin intermedie}} de {{PLURAL:$2|'n atro utente|$2 utenti}} {{PLURAL:$1|a no l'è mostrâ|no son mostræ}})",
+       "diff-multi-manyusers": "({{PLURAL:$1|Una verscion intermedia|$1 verscioin intermedie}} de ciu che $2 {{PLURAL:$2|utente|utenti}} non {{PLURAL:$1|mostrâ|mostræ}})",
        "searchresults": "Resultati da reçerca",
        "searchresults-title": "Rezoltati da riçerca de \"$1\"",
+       "titlematches": "Corispondençe into tittolo de paggine",
+       "textmatches": "Corispondençe into scrito de paggine",
+       "notextmatches": "Nisciun-a corispondença into scrito de paggine",
        "prevn": "Precedenti {{PLURAL:$1|$1}}",
        "nextn": "Proscima {{PLURAL:$1|$1}}",
+       "prev-page": "paggina precedente",
+       "next-page": "paggina succesciva",
        "prevn-title": "{{PLURAL:$1|rezoltato precedénte|rezoltati precedénti}}",
        "nextn-title": "Pròscimo $1 {{PLURAL:$1|rezoltato|rezoltati}}",
        "shown-title": "Fanni védde {{PLURAL:$1|in rizoltato|$1 rizoltati}} pe pàgina",
        "viewprevnext": "Veddi ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Inte questa wiki gh'è za 'na pàgina co-o nómme \"[[:$1]]\"'''",
-       "searchmenu-new": "Crea a pagina \"[[:$1]]\" insce questo scito",
+       "searchmenu-new": "<strong>Crea a paggina \"[[:$1]]\" insce questo wiki!</strong> {{PLURAL:$2|0=|Amia ascì a paggina trovâ co-a teu riçerca|Amia ascì i risultæ da riçerca}}",
        "searchprofile-articles": "Pàgina di contegnûi",
        "searchprofile-images": "Moltimedia",
        "searchprofile-everything": "Tùtto",
        "search-result-category-size": "{{PLURAL:$1|1 utente|$1 utenti}} ({{PLURAL:$2|1 sottocategoria|$2 sottocategorie}}, {{PLURAL:$3|1 file|$3 file}})",
        "search-redirect": "(redirect $1)",
        "search-section": "(seçión $1)",
+       "search-category": "(categoria $1)",
+       "search-file-match": "(corrispondença into contegnuo do file)",
        "search-suggest": "Fòscia ti voéivi: $1",
+       "search-rewritten": "Mostro i risultæ pe $1. Atrimenti, çerca $2.",
+       "search-interwiki-caption": "Progetti fræ",
+       "search-interwiki-default": "Risultæ da $1:",
+       "search-interwiki-more": "(atro)",
+       "search-relatedarticle": "corelæ",
        "searchrelated": "corelæ",
        "searchall": "tùtti",
+       "showingresults": "Chì appreuvo se mostra a-o mascimo {{PLURAL:$1|'''1''' risultou|'''$1''' risultæ}} a partî da-o nummero '''$2'''.",
+       "showingresultsinrange": "Chì sotta se mostra scin a {{PLURAL:$1|<strong>1</strong> risultou|<strong>$1</strong> risultæ}} da-o <strong>$2</strong> a-o <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|Risultou <strong>$1</strong> de <strong>$3</strong>|Risultæ <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "Mi n'ho atrovòu ninte",
+       "search-nonefound-thiswiki": "Mi n'ho atrovòu ninte",
+       "powersearch-legend": "Riçerca avançâ",
+       "powersearch-ns": "Çerca inti namespace:",
+       "powersearch-togglelabel": "Seleçion-a:",
+       "powersearch-toggleall": "Tutti",
+       "powersearch-togglenone": "Nisciun",
+       "powersearch-remember": "Aregordite a seleçion pe-e proscime riçerche",
+       "search-external": "Riçerca esterna",
+       "searchdisabled": "La riçerca de {{SITENAME}} a no l'è attiva. Into fra tempo ti peu çercâ in sce Google. \nNotta che i seu indexi di contegnui de {{SITENAME}} porrieivan no ese aggiornæ.)",
+       "search-error": "S'è verificou 'n errô durante a riçerca: $1",
        "preferences": "Preferençe",
        "mypreferences": "Preferençe",
+       "prefs-edits": "Modiffiche effettuæ:",
+       "prefsnologintext2": "Pe modificâ e teu preferençe l'è necessaio effettuâ l'intrata.",
+       "prefs-skin": "Pelle",
        "skin-preview": "Anteprimma",
+       "datedefault": "Nisciun-a preferença",
+       "prefs-labs": "Fonçionalitæ sperimentale",
+       "prefs-user-pages": "Paggine utente",
+       "prefs-personal": "Profî utente",
+       "prefs-rc": "Ùrtimi cangiamenti",
+       "prefs-watchlist": "Sotta oservaçion",
+       "prefs-editwatchlist": "Modiffica a lista sotta oservaçion",
+       "prefs-editwatchlist-label": "Modiffica e paggine da teu lista sotta oservaçion:",
+       "prefs-editwatchlist-edit": "Amia e rimeuvi tittoli in sciâ teu lista sotta oservaçion",
+       "prefs-editwatchlist-raw": "Modiffica a lista sotta oservaçion in formato testo",
+       "prefs-editwatchlist-clear": "Scassa a teu lista sotta oservaçion",
+       "prefs-watchlist-days": "Nummero de giorni da fâ vedde inta lista sotta oservaçion",
+       "prefs-watchlist-days-max": "Mascimo $1 {{PLURAL:$1|giorno|giorni}}",
+       "prefs-watchlist-edits": "Nummero de cangi da fâ vedde co-e fonçioin avançæ:",
+       "prefs-watchlist-edits-max": "Nummero mascimo: 1000",
+       "prefs-watchlist-token": "Token lista sotta oservaçion:",
+       "prefs-misc": "Varrie",
+       "prefs-resetpass": "Cangia a pòula segretta",
+       "prefs-changeemail": "Cangia ò rimeuvi l'adresso e-mail",
+       "prefs-setemail": "imposta un adresso email",
+       "prefs-email": "Opçioin email",
+       "prefs-rendering": "Aspetto",
        "saveprefs": "Sarva",
+       "restoreprefs": "Ripristina e impostaçioin predefinie (in tutte e seçioin)",
        "prefs-editing": "Cangia",
+       "rows": "Righe:",
+       "columns": "Colonne:",
        "searchresultshead": "Çerca",
-       "timezonelegend": "Oùa",
+       "stub-threshold": "Limmite pe-i collegamenti a-i sboççi ($1):",
+       "stub-threshold-sample-link": "esempio",
+       "stub-threshold-disabled": "disattivou",
+       "recentchangesdays": "Nummero de giorni da mostrâ inti urtime modiffiche:",
+       "recentchangesdays-max": "Mascimo $1 {{PLURAL:$1|giorno|giorni}}",
+       "recentchangescount": "Nummero de modiffiche da mostrâ pe difetto:",
+       "prefs-help-recentchangescount": "Comprende i urtime modiffiche, paggine de stoie e registri.",
+       "savedprefs": "E teu preferençe son stæte sarvæ.",
+       "savedrights": "I driti utente de {{GENDER:$1|$1}} son stæti sarvæ.",
+       "timezonelegend": "Fuso oraio:",
+       "localtime": "Oa locale:",
+       "timezoneuseserverdefault": "Adeuvia l'oa predefinia do wiki ($1)",
+       "timezoneuseoffset": "Atro (speciffica a differensa)",
+       "servertime": "Oa do server:",
+       "guesstimezone": "Deuvia l'oa do navegatô",
+       "timezoneregion-africa": "Affrica",
+       "timezoneregion-america": "Amerrica",
+       "timezoneregion-antarctica": "Antartide",
+       "timezoneregion-arctic": "Artide",
+       "timezoneregion-asia": "Axia",
+       "timezoneregion-atlantic": "Oçeano Atlantego",
+       "timezoneregion-australia": "Aostrallia",
+       "timezoneregion-europe": "Euiropa",
+       "timezoneregion-indian": "Oçeano Indian",
+       "timezoneregion-pacific": "Oçeano Paxiffego",
        "allowemail": "Permitti a posta elettronega da ätri utenti",
+       "prefs-searchoptions": "Çerca",
+       "prefs-namespaces": "Namespace:",
        "default": "Predefinïo",
-       "prefs-files": "Papê",
+       "prefs-files": "File",
+       "prefs-custom-css": "CSS personalizzou",
+       "prefs-custom-js": "JavaScript personalizzou",
+       "prefs-common-css-js": "CSS/JavaScript condiviso pe tutte e pelle:",
+       "prefs-emailconfirm-label": "Conferma de l'e-mail:",
        "youremail": "Indirìsso email:",
-       "username": "Nomme d'utente",
+       "username": "{{GENDER:$1|Nomme utente}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Membro}} {{PLURAL:$1|do gruppo|di gruppi}}:",
+       "prefs-registration": "Dæta de registraçion:",
        "yourrealname": "Nomme vêo:",
        "yourlanguage": "Léngoa:",
-       "yourvariant": "Differensa",
-       "yournick": "Nommeaggio:",
+       "yourvariant": "Variante da lengoa do contegnuo:",
+       "prefs-help-variant": "A variante o grafia co-a quæ ti prefeisci che e paggine do wiki seggian mostræ.",
+       "yournick": "Nomiagio:",
        "badsig": "Errô in ta firma; controlla i comandi HTML.",
-       "badsiglength": "O nommeaggio o l'é tròppo lóngo; o dêve avéi meno de $1 caratteri.",
+       "badsiglength": "A firma scelta a l'è troppo longa.\nA non deve passâ $1 {{PLURAL:$1|carattere|caratteri}}.",
        "email": "Posta elettronega",
        "prefs-help-realname": "* Nomme vëo (opsionâ): se o se scellie de scrivilo, o sajà dêuviòu pe ascrivighe a paternitæ di contegnûi inviæ.",
        "prefs-help-email": "L'email a no l'é obligatöia, ma a te permette de reçéive a paròlla segrétta se ti l'ascòrdi.",
-       "prefs-help-email-others": "Ti ti peu scélie ascì de lasciâ che i âtri te contattan via e-mail co-in ingancio da-a to pàgina utente ò de discoscion sénsa rivelâ a to e-mail quande i atri utenti te contattan.",
+       "prefs-help-email-others": "Ti ti peu scélie ascì de lasciâ che i âtri te contattan via e-mail co-in ingancio da-a to pàgina utente ò de discuscion sénsa rivelâ a to e-mail quande i atri utenti te contattan.",
+       "prefs-help-email-required": "L'addresso email o ghe veu.",
+       "prefs-info": "Informaçioin de base",
+       "prefs-i18n": "Internaçionalizzaçion",
+       "prefs-signature": "Firma",
+       "prefs-dateformat": "Formato da dæta",
+       "prefs-timeoffset": "Oe de differença",
+       "prefs-advancedediting": "Opçioin generæ",
+       "prefs-editor": "Editô",
+       "prefs-preview": "Anteprimma",
+       "prefs-advancedrc": "Opçioin avançæ",
+       "prefs-advancedrendering": "Opçioin avançæ",
+       "prefs-advancedsearchoptions": "Opçioin avançæ",
+       "prefs-advancedwatchlist": "Opçioin avançæ",
+       "prefs-displayrc": "Opçioin de visualizzaçion",
+       "prefs-displaywatchlist": "Opçioin de visualizzaçion",
+       "prefs-tokenwatchlist": "Token",
+       "prefs-diffs": "Differençe",
+       "prefs-help-prefershttps": "Questa preferença a l'aviâ effetto da-o proscimo accesso.",
+       "userrights-reason": "Raxon:",
+       "userrights-no-interwiki": "No ti g'hæ i permissi pe modificâ i driti di utenti insce di atre wiki.",
+       "userrights-nodatabase": "O database $1 o no l'esiste ò o no l'è un database locale.",
+       "userrights-nologin": "Pe assegnâ di driti a-i utenti ti g'hæ da [[Special:UserLogin|intrâ]] comme amministratô.",
+       "userrights-notallowed": "No ti g'hæ o permisso de azonze ò rimeuve i driti di utenti.",
+       "userrights-changeable-col": "Gruppi che ti peu modificâ",
+       "userrights-unchangeable-col": "Gruppi che no ti peu modificâ",
+       "userrights-conflict": "Conflito de modiffica di driti utente! Pe piaxei controlla e conferma e teu modiffiche.",
+       "userrights-removed-self": "T'hæ rimosso con successo i teu driti. E quindi, no ti saiæ ciù in grou de accede a questa paggina.",
+       "group": "Gruppo:",
        "group-user": "Ûtenti",
+       "group-autoconfirmed": "Utenti aotoconfermæ",
+       "group-bot": "Bot",
+       "group-sysop": "Amministratoî",
+       "group-bureaucrat": "Buroccrati",
+       "group-suppress": "Soppressoî",
+       "group-all": "(tutti)",
+       "group-user-member": "{{GENDER:$1|utente}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|utente aotoconfermou|utente aotoconfermâ|utente aotoconfermou/â}}",
+       "group-bot-member": "{{GENDER:$1|bot}}",
+       "group-sysop-member": "{{GENDER:$1|amministratô|amministratrixe|amministratô/trixe}}",
+       "group-bureaucrat-member": "{{GENDER:$1|buroccrate}}",
+       "group-suppress-member": "{{GENDER:$1|soppressô|soppressôa}}",
+       "grouppage-user": "{{ns:project}}:Utenti",
+       "grouppage-autoconfirmed": "{{ns:project}}:Utenti autoconfermæ",
+       "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Amministratoî",
+       "grouppage-bureaucrat": "{{ns:project}}:Buroccrati",
+       "grouppage-suppress": "{{ns:project}}:Soppressoî",
+       "right-writeapi": "Deuvia l'API in scrittua",
        "newuserlogpage": "Nêuvi utenti",
        "rightslog": "Diritti d'ûtente",
        "action-edit": "càngia sta pàgina",
+       "action-undelete": "Recuppera sta paggina",
+       "action-suppressrevision": "rivedde e ripristinâ e modiffiche ascose",
        "nchanges": "$1 {{PLURAL:$1|modiffica|modiffiche}}",
+       "enhancedrc-history": "cronologia",
        "recentchanges": "Ùrtimi cangiamenti",
        "recentchanges-legend": "Opçioin di ùrtimi cangiaménti",
        "recentchanges-summary": "Questa pàgina a g'ha di càngi ciù reçenti a-i contegnûi do scîto.",
        "recentchanges-label-minor": "Cangiamento minô (m)",
        "recentchanges-label-bot": "Sto cangiaménto o l'à fæto in bot",
        "recentchanges-label-unpatrolled": "Sto cangiaménto o no l'é stæto ancón verificòu",
+       "recentchanges-label-plusminus": "Variassion da paggina in nummero de byte",
+       "recentchanges-legend-heading": "'''Legenda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (veddi e [[Special:NewPages|neuve paggine]])",
        "rcnotefrom": "Chì sotta gh'è i cangiamenti fæti comensando da '''$2''' (scin a '''$1''').",
        "rclistfrom": "Fanni vedde e modiffiche apportæ partindo da $3 $2",
        "rcshowhideminor": "$1 cangiaménti minoi",
+       "rcshowhideminor-show": "Fanni vedde",
+       "rcshowhideminor-hide": "Ascondi",
        "rcshowhidebots": "$1 bot",
-       "rcshowhideliu": "$1 utenti registræ",
+       "rcshowhidebots-show": "Fanni vedde",
+       "rcshowhidebots-hide": "Ascondi",
+       "rcshowhideliu": "$1 i utenti registræ",
+       "rcshowhideliu-hide": "Ascondi",
        "rcshowhideanons": "$1 utenti anonnimi",
+       "rcshowhideanons-show": "Fanni vedde",
+       "rcshowhideanons-hide": "Ascondi",
        "rcshowhidepatr": "$1 i cangiaménti controllæ",
        "rcshowhidemine": "$1 i mæ cangiamenti",
+       "rcshowhidemine-show": "Fanni vedde",
+       "rcshowhidemine-hide": "Ascondi",
        "rclinks": "Fanni vedde i $1 cangiaménti ciù reçenti fæti inti ùrtimi $2 giorni<br />$3",
        "diff": "diff",
        "hist": "stö",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc_categories_any": "Quarsevêuggia",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} doppo a modiffica",
        "rc-enhanced-expand": "Fanni védde detaggi (serve JavaScript)",
        "rc-enhanced-hide": "Ascondi detaggi",
        "recentchangeslinked": "Cangiamenti correlæ",
        "recentchangeslinked-page": "Nómme da pàgina:",
        "recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàgine colegæ a-a pàgina specificâ",
        "upload": "Carrega 'n file",
-       "uploadbtn": "Carega 'n archivvio",
+       "uploadbtn": "Carrega 'n file",
        "uploadlogpage": "Log di file caregæ",
-       "filename": "Nomme do papê",
+       "filename": "Nomme do file",
        "filedesc": "Detaggi",
        "filesource": "Reixe:",
-       "badfilename": "O nomme do papê o l'è stæto cangioö in \"$1\".",
+       "badfilename": "O nomme do file o l'è stæto cangiòu in \"$1\".",
        "fileexists": "Un papê co sto nomme o existe de zà, pe piaxei da unn'euggiâ a <strong>[[:$1]]</strong> se non ti tei seguo de voleilo cangiâ.\n[[$1|thumb]]",
        "fileexists-forbidden": "Un papê co sto nomme o existe de zà, pe piaxei vanni in derrê e carega sto papê co un ätro nomme. [[File:$1|thumb|center|$1]]",
-       "savefile": "Sarva o papê",
+       "savefile": "Sarva o file",
        "uploaddisabledtext": "In {{SITENAME}} non se peu caregâ de papê.",
-       "uploadvirus": "O papê gha un virus!! Dettaggi: $1",
-       "sourcefilename": "Nomme do papê d'origine:",
-       "destfilename": "Nomme do papê de destin:",
+       "uploadvirus": "Questo file o conten un virus! Dettaggi: $1",
+       "sourcefilename": "Nomme do file d'origgine:",
+       "destfilename": "Nomme do file de destinassion:",
        "upload-file-error": "Errô interno",
        "license": "Licensa:",
        "license-header": "Licensa",
        "nolicense": "Nisciûnn-a liçensa indicâa",
        "listfiles_search_for": "Çerca pe nomme de l'imàgine:",
-       "imgfile": "papê",
+       "imgfile": "file",
        "listfiles": "Lista d'archivvi",
        "listfiles_date": "Dæta",
        "file-anchor-link": "file",
-       "filehist": "Stöia de l'archivio",
-       "filehist-help": "Sciacca insce data/ôa pe amiâ o file comm'o s'apresentâva into momento indicòu.",
+       "filehist": "Stöia do file",
+       "filehist-help": "Sciacca insce dæta/ôa pe amiâ o file comm'o s'apresentâva into momento indicòu.",
        "filehist-revert": "Ripristina",
        "filehist-current": "Corrente",
        "filehist-datetime": "Dæta/Ôa",
        "filehist-dimensions": "Dimenscioin",
        "filehist-filesize": "Dimension de l'archivvio",
        "filehist-comment": "Coménti",
-       "imagelinks": "Ûzo de l'archivio",
+       "imagelinks": "Ûzo do file",
        "linkstoimage": "{{PLURAL:$1|A segoente pàgina a contegne|E segoenti $1 pàgine contegnan}} colegaménti a-o file:",
        "nolinkstoimage": "No gh'è nisciûnn-a pàgina collegâ con 'sto file.",
        "sharedupload": "'St'archivvio o l'è condiviso; sajeiva a dî c'o pêu ese dêuviòu da ciû progetti wiki.",
        "sharedupload-desc-here": "Sto file o vegne da $1 e o peu êse dêuviòu inti âtri progetti.\nChì apreuvo ti peu védde a descriçión inta [$2 pàgina de descriçión do file].",
-       "uploadnewversion-linktext": "Carega 'na nêuva verscion de 'st'archivvio chì",
+       "uploadnewversion-linktext": "Carrega 'na neuva verscion de sto file",
+       "upload-disallowed-here": "Imposcibbile sorvescrive sto file.",
        "filedelete-submit": "Scassa",
        "mimesearch": "Çerca MIME",
        "listredirects": "Lista de rindirissamenti",
        "booksources": "Fonte libraie",
        "booksources-search-legend": "Çerca e fonti",
        "booksources-isbn": "Codice ISBN:",
-       "booksources-text": "De sotta unn-a lista de ingançi a ätri sciti che vendan neuvi e vegi libbri, e che peuvre avei informaçioin in sci libbri che ti te çerchi",
+       "booksources-search": "Çerca",
+       "booksources-text": "De sotta unn-a lista de inganci a di ätri sciti che vendan libbri neuvi e vegi e che porrieivan avei ciu informaçioin in scî libbri che ti te çerchi",
        "specialloguserlabel": "Ûtente:",
        "speciallogtitlelabel": "Tittolo:",
        "log": "Log",
        "allinnamespace": "Tutte e pagine ($1 namespace)",
        "allpagessubmit": "Vanni",
        "allpagesprefix": "Fanni vedde e paggine che inissian con:",
-       "allpagesbadtitle": "O titolo pe a pagina o non va ben, o o tegne de i prefissi interlingua o interwiki. O peu tegne un o ciù caratteri non permissi in ti titoli ascì.",
+       "allpagesbadtitle": "O tittolo dæto a-a paggina o non va ben, òpû o conten di prefissi inter-lengua o inter-wiki. O porriæ ascì contegnî un o ciù caratteri che inti tittoli no se peuan deuviâ.",
        "allpages-bad-ns": "\"$1\" o no ghe in {{SITENAME}}.",
        "categories": "Categorîe",
        "special-categories-sort-count": "ordenâ pe nûmmero",
        "unwatch": "Leva da sott'oservaçion",
        "watchlist-details": "A lista d'oservaçión speçiâle a contegne {{PLURAL:$1|ina pàgina (co-a seu pàgina de discusción)|$1 de pàgine (co-e so pàgine de discusción)}}.",
        "wlshowlast": "Famme vedde e ûrtime $1 ôe $2 giorni",
+       "watchlistall2": "Tùtti",
        "watchlist-options": "Inpostaçioìn di oservæ speciâli",
        "watching": "Inti osservæ speçiâli...",
        "unwatching": "Scassâ da-i osservæ speçiâli",
        "confirmdeletetext": "Ti stæ pe scassâ pe sempre da-o database 'na paggina ò 'n'immaggine, assemme a tûtta a sêu cronologîa. Pe cortexia, conferma che davvei ti vêu andâ avanti con quella cancellassion, che ti capisci perfettamente e conseguense de 'st'assion e che a s'adatta a-e linnie guidda stabilîe in [[{{MediaWiki:Policy-url}}]].",
        "actioncomplete": "Açion completâ",
        "actionfailed": "Açión falîa",
-       "deletedtext": "A paggina \"$1\" a l'è stæta scassâa. Consûltâ o $2 pe 'na lista de-e paggine scassæ de reçente.",
+       "deletedtext": "A paggina \"$1\" a l'è stæta scassâ. Consultâ o $2 pe 'na lista de paggine scassæ de reçente.",
        "dellogpage": "Registro de cose scassæ",
        "deletecomment": "Raxon:",
        "deleteotherreason": "Ûn âtro motivo",
        "deletereasonotherlist": "Ûnn'âtra raxon",
        "rollbacklink": "rollback",
-       "cantrollback": "O no se pêu tornâ inderê; l'ûtente ch'à fæto quelle modiffiche o l'è stæto l'ûnico contribûente.",
+       "rollbacklinkcount": "rollback de {{PLURAL:$1|una modiffica|$1 modiffiche}}",
+       "cantrollback": "No se peu tornâ inderê; l'utente ch'o l'ha fæto quelle modiffiche o l'è stæto l'unico contribuente.",
        "alreadyrolled": "O no se peû tornâ inderê a-i ûrtimi cangiamenti da pagina [[:$1]]\nda [[User:$2|$2]] ([[User talk:$2|Ciæti]]); quarche âtro\no l'à cangiâ ò o l'è zà tornòu inderê.\nL'ûrtimo cangiamento o ghe l'à fæto [[User:$3|$3]] ([[User talk:$3|Ciæti]]).",
        "revertpage": "E modificaçioin de [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciæti]]) son stæte eliminæ; riportæ a verscion de primma de [[User:$1|$1]]",
        "protectlogpage": "Protessioin",
        "protectcomment": "Raxon:",
        "protectexpiry": "Scadensa:",
        "protect_expiry_invalid": "Scadensa invalida.",
-       "protect_expiry_old": "Data de scadensa into passòu.",
+       "protect_expiry_old": "Dæta de scadensa into passòu.",
        "protect-text": "Chì o l'è poscibbile vedde e modificâ o livello de protession pe-a paggina '''$1'''.",
        "protect-locked-access": "No ti g'hæ permisso pe modificâ i livelli de protession da paggina.\nQueste son e impostassioîn correnti pe 'sta paggina ('''$1'''):",
        "protect-cascadeon": "Pe-o momento 'sta paggina chì a l'è bloccâa perché a l'è inclûsa {{PLURAL:$1|inta paggina indicâa apprêuvo, pe-a quæ|inte paggine indicæ apprêuvo, pe-e quæ}} a l'è attiva a protession recorsciva. O se pêu modificâ o livello de protession individuâle da paggina, ma l'impostassioîn derivanti da-a protession recorsciva no sajàn modificæ.",
        "restriction-edit": "Cangia",
        "restriction-move": "Mescia",
        "restriction-level-all": "Tutti i livelli",
-       "undelete": "Repiggio de i dæti: veddi e pagine che son stæte scassæ",
+       "undelete": "Amîa e paggine scassæ",
        "undeletebtn": "Ristorâ",
        "undeletelink": "fanni védde/repìggia",
        "undeleteviewlink": "fanni védde",
        "cannotundelete": "O repiggio de i dæti o non l'è riuscïo (i peun ese za stæti repiggiæ da quarchedun ätro).",
-       "undelete-bad-store-key": "No se peu repiggiâ o papê con a data $1: o papê o l'éja za stæto scassoö.",
-       "undelete-cleanup-error": "Errô repiggiando i dæti do papê \"$1\".",
-       "undelete-error-short": "Errô repiggiando i dæti do papê \"$1\".",
-       "undelete-error-long": "Ghe son stæti de i errôi cuando se repiggiavan i dæti de o papê:\n\n$1",
+       "undelete-bad-store-key": "No se peu repiggiâ o file co-a dæta $1: o file o no gh'ea za ciu primma d'ese scassou.",
+       "undelete-cleanup-error": "Errô into scassâ o file d'archivio non utilizzòu \"$1\".",
+       "undelete-error-short": "Errô repiggiando i dæti do file \"$1\".",
+       "undelete-error-long": "Gh'è stæto di erroî inte l'annullâ a cançellaçion do file:\n\n$1",
        "namespace": "Namespace:",
        "invert": "Invertî a seleçión",
+       "tooltip-invert": "Selession-a sta casella pe asconde e modiffiche a-e paggine a l'interno do namespace selessionou (e o namespace associou, se selessionou)",
+       "namespace_association": "Namespace associou",
+       "tooltip-namespace_association": "Selession-a sta casella pe includde ascì a paggina de discuscion ò l'oggetto do namespace associou co-o namespace selessionou",
        "blanknamespace": "(Prinçipâ)",
        "contributions": "Contribuçioin {{GENDER:$1|utente}}",
        "contributions-title": "Contribuçioìn de $1",
        "mycontris": "Contribuçioin",
+       "anoncontribs": "Contribuçioin",
        "contribsub2": "Pe $1 ($2)",
        "uctop": "(ûrtima pe-a paggina)",
        "month": "Partindo da-o meize (e precedénti):",
        "ipbreason": "Raxon:",
        "ipboptions": "2 ôe:2 hours,1 giorno:1 day,3 giorni:3 days,1 settemann-a:1 week,2 settemann-e:2 weeks,1 meise:1 month,3 meixi:3 months,6 meixi:6 months,1 anno:1 year,infinîo:infinite",
        "badipaddress": "Indirisso IP non valido",
-       "blockipsuccesssub": "Affermaçion arriescïa",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] o l'è stæto affermoö.\n<br />Veddi [[Special:BlockList|Lista de i indirissi IP affermæ]] te cangia e affermaçioin.",
+       "blockipsuccesssub": "Blocco ariêscîo",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] o l'è stæto bloccou.\n<br />Veddi [[Special:BlockList|Lista di addressi IP bloccæ]] pe vedde i blocchi attivi.",
        "ipblocklist": "Utenti blocæ",
-       "anononlyblock": "Non ti tè registroö. Non ti peu fanni de i cangiamenti! (Registräse o non vegne ninte!)",
-       "emailblock": "posta elettronega affermaä",
-       "ipblocklist-empty": "A lista de e affermaçioin a l'è veua.",
+       "anononlyblock": "Solo anonnimi",
+       "emailblock": "posta elettronega bloccâ",
+       "ipblocklist-empty": "A lista di blocchi a l'è veua.",
        "blocklink": "Blocca",
        "unblocklink": "sblòcca",
        "change-blocklink": "càngia blòcco",
        "block-log-flags-nocreate": "Neuve registrascioin non son permisse",
        "block-log-flags-noautoblock": "O blocco automatego o non l'è attïvo",
        "block-log-flags-noemail": "A posta elettronega a non l'è attïva",
-       "databasenotlocked": "A base de i dæti a non l'è serrâ.",
+       "databasenotlocked": "O database o no l'è bloccòu.",
        "move-page-legend": "Mescia a paggina",
        "movepagetext": "Chì o se pêu dâ 'n nêuvo nomme a 'na paggina, stramûando tûtta a sêu cronologîa a-o nêuvo nomme.\nA paggina attuâle a fa outomaticamente 'n rindirissamento a-o nêuvo tittolo.\nI collegamenti escistenti no sajàn aggiornæ; veriffica che 'sto stramûo o no l'agge creòu doggi rindirissamenti ò rindirissamenti sballiæ.\nA responsabilitæ pe tegnî i collegamenti sempre donde deivan andâ a l'è têu.\n\nA paggina a '''no''' sajà stramûâa se ghe foisse zà ûnn-a co-o nêuvo nomme, a meno c'a no segge vêua ò fæta solo da 'n rindirissamento a-a vegia e a no l'agge verscioîn preçedenti.\nIn caso de stramûo sballiòu o se pêu tornâ sûbbito a-o vegio tittolo, e o no l'è poscibbile sorvescrive pe errô 'na paggina zà escistente.\n\n'''ATTENSION:'''\n'N cangiamento coscì grande o porieiva creâ di controtempi e problemmi, sorvetûtto pe-e paggine ciû viscitæ.\nPensa ben e conseguense de 'sto stramûo primma d'andâ avanti!",
-       "movepagetalktext": "A corispondente paggina de discûxon a sajà stramûâa outomaticamente insemme a-a paggina prinçipâ, '''eççetto inti seguenti câxi''':\n\n* Che o stramûo da paggina o segge tra namespace diversci\n* Che inta corispondensa do nêuvo tittolo ghe segge zà 'na paggina de discûxon (no vêua)\n* Che a cascetta chì sotta a segge stæta deselessionâa.\n\nInte 'sti câxi, se o se vêu fâ coscì, o se deive stramûâ ò azzonze manualmente e informassioîn contegnûe inta paggina de discûxon.",
-       "movearticle": "Stramûâ a paggina",
+       "movepagetalktext": "Se ti seleçion-i questa casella, a corispondente paggina de discuscion a saiâ mesciâ aotomaticamente a-o neuvo tittolo, a meno che existe zà una paggina de discuscion ch'a no segge veua.\n\nInte sti caxi, ti doviæ mesciâ o unî manoalmente a paggina, se proppio ti veu.",
        "newtitle": "Nêuvo tittolo:",
        "move-watch": "Azzonze a li osservæ speçiâli",
        "movepagebtn": "Stramûâ a paggina",
        "pagemovedsub": "Remescio fæto",
        "articleexists": "Ghe n'æmmo zà 'na paggina con 'sto nomme, oppûre quello che ti g'hæ scelto o no l'è permisso. Cangia nomme.",
-       "movetalk": "Stramûâ anche a paggina de discûxon",
+       "movetalk": "Mescia a paggina de discuscion ascì.",
        "movelogpage": "Lista di stramûi",
        "movereason": "Raxon",
        "revertmove": "Ristorâ",
-       "delete_and_move": "Scassa e mescia",
        "delete_and_move_confirm": "Scì, scassa a pagina",
        "delete_and_move_reason": "Levoö pe fâ röso pe un remescio",
        "export": "Espòrta pàgine",
        "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' o non ti te peu vedde, perchè '''$wgUseDatabaseMessages''' o non l'è attivo.",
        "allmessages-language": "Lengua:",
        "thumbnail-more": "Ciù grande",
-       "filemissing": "O papê non ghe!",
+       "filemissing": "O file o no gh'è!",
        "thumbnail_error": "Errô inta creassion da miniatûa: $1",
        "thumbnail_invalid_params": "Parametri da a imàginetta non validi",
        "importlogpage": "Importassioîn",
        "tooltip-pt-userpage": "A teu pagina utilizatô",
        "tooltip-pt-mytalk": "E mæ discûscioîn",
        "tooltip-pt-preferences": "E mæ preferense",
-       "tooltip-pt-watchlist": "A lista de-e pagine che ti æ sotta osservaçion",
+       "tooltip-pt-watchlist": "A lista de pagine che ti g'hæ sotta osservaçion",
        "tooltip-pt-mycontris": "E mæ contribuçioìn",
        "tooltip-pt-login": "Consegemmo a registraçión, ma a no l'è obrigatoia.",
-       "tooltip-pt-logout": "Sciortîa (logout)",
+       "tooltip-pt-logout": "Sciorti",
+       "tooltip-pt-createaccount": "Se conseggia de registrase e de intrâ, sciben che no segge obligatoio",
        "tooltip-ca-talk": "Discuscion riguardo a sta paggina.",
-       "tooltip-ca-edit": "Ti pêu modificâ sta paggina. Pe piaxei dêuvia o pomello d'anteprimma primma de sarvâla.",
+       "tooltip-ca-edit": "Modiffica sta paggina.",
        "tooltip-ca-addsection": "Inça 'na seçión nêuva",
        "tooltip-ca-viewsource": "'Sta pagina a l'è protetta, ma ti peu védde o sêu còdice sorgente.",
        "tooltip-ca-history": "Verscioìn précedenti da pàgina",
        "tooltip-n-mainpage-description": "Vìxita a pàgina prinçipâ",
        "tooltip-n-portal": "Descriçión do progetto, cöse se peu fâ, donde trovâ e cöse",
        "tooltip-n-currentevents": "Informaçioìn in sci fæti d'atualitæ",
-       "tooltip-n-recentchanges": "L'ùrtimi cangiaménti into scîto",
+       "tooltip-n-recentchanges": "ùrtimi cangiaménti into scîto",
        "tooltip-n-randompage": "Fanni vedde 'na pagina a brettio.",
        "tooltip-n-help": "Pagine d'agiùtto",
        "tooltip-t-whatlinkshere": "Lista de tùtte e pagine che son colegæ a sta chì.",
        "tooltip-feed-atom": "Feed Atom pe sta pàgina",
        "tooltip-t-contributions": "Lista de contribûssioîn de quest'utente",
        "tooltip-t-emailuser": "Invia 'n messaggio e-mail a quest'utente",
-       "tooltip-t-upload": "Carega inmàgini ò archivi moltimedia",
+       "tooltip-t-upload": "Carrega di file murtimediali",
        "tooltip-t-specialpages": "Lista de tùtte e pagine speçiâli",
        "tooltip-t-print": "Versción da stànpa pe sta pàgina",
        "tooltip-t-permalink": "Colegaménto fisso a sta revixión da pàgina",
        "tooltip-ca-nstab-user": "Veddi a pàgina d'utente",
        "tooltip-ca-nstab-special": "Sta chi l'è 'na pàgina speciâle e a no peu êse cangiâ",
        "tooltip-ca-nstab-project": "Veddi a paggina de servissio",
-       "tooltip-ca-nstab-image": "Va a védde a pagina de l'inmàgine",
+       "tooltip-ca-nstab-image": "Veddi a paggina do file",
        "tooltip-ca-nstab-template": "Veddi o template",
        "tooltip-ca-nstab-help": "Veddi a paggina d'agiûtto",
        "tooltip-ca-nstab-category": "Veddi a paggina da categorîa",
        "tooltip-diff": "Ammîa e modiffiche che t'æ fæto a-o testo.",
        "tooltip-compareselectedversions": "Amia e diferense tra e doê verscioìn seleçionæ de sta paggina chì.",
        "tooltip-watch": "Azónzi sta pàgina a-a têu lista d'osservæ speçiâli",
-       "tooltip-rollback": "\"Rollback\" scancella i cangiaménti de sta pàgina de l'ùrtimo ch'o l'à fæto 'n càngio co-in click do ràtto",
-       "tooltip-undo": "\"Anùlla\" o permette de anulâ sto cangiaménto e o l'arve o modolo de cangiaménto into modalitæ anteprìmma. Ti peu ascì métte a raxón inte l'ogetto do cangiaménto.",
+       "tooltip-rollback": "\"Rollback\" annulla e modiffiche a sta pagina de l'urtimo contributô co-in solo clic.",
+       "tooltip-undo": "\"Anùlla\" o permette de anulâ sto cangiaménto e o l'arve o modulo de cangiaménto inta modalitæ anteprìmma. Ti peu ascì métte a raxón inte l'ogetto do cangiaménto.",
        "tooltip-summary": "Scrîvi 'na scintexi",
-       "common.css": "/** o codiçe css scrïo chie o vegne azzounto in tutte e pagine */",
+       "common.css": "/** i stili css scriti chie se applicana tutte e skin */",
        "anonymous": "Utente anonimmo de {{SITENAME}}",
        "lastmodifiedatby": "Sta pagina a l'è stæta cangiâ l'urtima votta a e $2 do $1 da $3.",
+       "simpleantispam-label": "Controllo anti-spam.\n<strong>NO</strong> impîlo!",
        "pageinfo-language": "Lengua do contegnuo da paggina",
+       "pageinfo-toolboxlink": "Informassioin in sciâ paggina",
        "pageinfo-contentpage-yes": "Sci",
        "pageinfo-protect-cascading-yes": "Sci",
        "previousdiff": "← Diferensa precedénte",
        "file-info-size": "$1 × $2 pixel, dimenscioîn: $3, tippo MIME: $4",
        "file-nohires": "No ghe son verscioìn a rezoluçion ciù âta.",
        "svg-long-desc": "file in formato SVG, dimenscioìn nominâli $1 × $2 pixel, dimenscioin do file: $3",
-       "show-big-image": "Verscion a ata resolûçion",
+       "show-big-image": "File originâ",
+       "show-big-image-preview": "Dimenscioin de questa anteprimma: $1.",
+       "show-big-image-other": "{{PLURAL:$2|Atra risolussion|Atre risolussioin}}: $1.",
+       "show-big-image-size": "$1 × $2 pixel",
        "newimages": "Gallerîa de nêuvi archivvi",
        "ilsubmit": "Çerca",
        "bydate": "pe dâta",
        "metadata-help": "Sto file o contegne de informaçioìn in ciù, fòscia misse da-a fotocamera ò dò-u scansô dêuviòu pe creâla ò digitalizâla. Se o file o l'è stæto cangiòu, çerti detàggi porieivan no corisponde a-i cangi aportæ.",
        "metadata-expand": "Fâ vedde dettaggi",
        "metadata-collapse": "Asconde dettaggi",
-       "metadata-fields": "I cànpi relativi a-i metadati EXIF elencæ inte 'sto messaggio saiàn in sciâ pàgina de l'inmàgine quande a tabella di metadati a saiâ inta forma cùrta. Cómme predefinîo, i âtri cànpi saiàn ascozi.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
-       "exif-datetime": "Data e öa do cangiamento do papê",
+       "metadata-fields": "I cànpi relativi a-i metadæti EXIF elencæ inte 'sto messaggio saiàn in sciâ pàgina de l'inmàgine quande a tabella di metadæti a saiâ inta forma cùrta. Cómme predefinîo, i âtri cànpi saiàn ascoxi.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-orientation": "Orientamento",
+       "exif-xresolution": "Risoluçion orizzontâ",
+       "exif-yresolution": "Risoluçion verticâ",
+       "exif-datetime": "Dæta e öa da modiffica do file",
+       "exif-make": "Produttô fotocamera",
+       "exif-model": "Modello fotocamera",
+       "exif-software": "Software",
        "exif-artist": "Autô",
        "exif-copyright": "Diritti d'autô de",
-       "exif-filesource": "Reixe do papê",
+       "exif-exifversion": "Verscion do formato Exif",
+       "exif-colorspace": "Spassio di coî",
+       "exif-datetimeoriginal": "Dæta e oa de creassion di dæti",
+       "exif-datetimedigitized": "Dæta e oa de digitalizzaçion",
+       "exif-filesource": "Origgine do file",
        "exif-languagecode": "Lengua",
+       "exif-orientation-1": "Normale",
        "namespacesall": "Tùtti",
        "monthsall": "tutti",
        "imgmultipageprev": "← Pagina de primma",
        "watchlisttools-view": "Veddi e modiffiche pertinenti",
        "watchlisttools-edit": "Veddi e modiffica a lista",
        "watchlisttools-raw": "Modiffica a lista in formato testo",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|discuscioin]])",
        "duplicate-defaultsort": "Atençión: a ciâve de ordinaménto predefinîa \"$2\" a sostitoisce quella de primma \"$1\".",
        "version": "Verscion",
        "specialpages": "Pagine speçiâli",
        "external_image_whitelist": " #Lascia sta riga comm'a l'é<pre>\n#Inseisci i pessi de esprescioìn regolari (sôlo a pàrte ch'a va fra e //) chì sotta\n#Ste chi saiàn misse a confronto co-i indirìssi URL de inmàgini esterne (hotlinked)\n#E corispondense saiàn mostræ cómme inmàgini, donca saiâ mostròu sôlo in colegaménto\n#E righe che començan con # son conscideræ coménti\n#A diferensa tra maioscole e minoscole a no l'è scignificatîva\n\n#Inseisci sovia sta rîga tùtti i frammenti de regex. Lascia sta rîga ezattamente comm'a l'é</pre>",
-       "tag-filter": "Filtra pe [[Special:Tags|etichetta]]:"
+       "tag-filter": "Filtra pe [[Special:Tags|etichetta]]:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etichetta|Etichette}}]]: $2)",
+       "logentry-delete-delete": "$1 {{GENDER:$2|o l'ha scassou}} a paggina $3",
+       "logentry-move-move": "$1 {{GENDER:$2|o l'ha mesciou}} a paggina $3 a $4",
+       "logentry-newusers-create": "L'utensa $1 a l'è stæta {{GENDER:$2|creâ}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|o l'ha caregou}} $3",
+       "searchsuggest-search": "Çerca"
 }
diff --git a/languages/i18n/lki.json b/languages/i18n/lki.json
new file mode 100644 (file)
index 0000000..9ef193b
--- /dev/null
@@ -0,0 +1,3401 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Arash71",
+                       "Hosseinblue",
+                       "Lakzon",
+                       "Mjbmr"
+               ]
+       },
+       "tog-underline": ":خط کیشائن ئۀ ژئر پئؤن",
+       "tog-hideminor": "تغییرات گؤجر ئه رزگ-فئرست تغیرات اخیر ئآشاریا بوو",
+       "tog-hidepatrolled": "دسکاریۀل گه دیار بینۀ ئژ فئرست-رزگ تغییرات اخیر بشارا",
+       "tog-newpageshidepatrolled": "وڵگۀل گه دیار بینۀ ئژ فئرست-رزگ ولگۀل تازۀ بشارا",
+       "tog-hidecategorization": "Hide categorization of pages",
+       "tog-extendwatchlist": " کؤل رزگ-فئرست الؤن(آلشت)کریال-تغیرات نیشان دۀ،نۀ هر تنیا دؤمائنۀل",
+       "tog-usenewrc": "تنیا آڵؤن(آلشتی)کریال تازۀ ؤ لیست پئگیریۀل رزگ بنی-گروه بندی کۀ",
+       "tog-numberheadings": "شؤمارۀ  نئ خودکار سروڵگۀل-عناوین",
+       "tog-showtoolbar": "دیار دائن ابزار دسکاری",
+       "tog-editondblclick": "دسکاری ولگۀل ئۀ دؤ گل کلیک کردن",
+       "tog-editsectiononrightclick": "دسکاری کردن راسال-بخشۀل ئۀ کلیک راست کردن ئۀرؤی سرولگۀل باج کار",
+       "tog-watchcreations": "وڵگۀلئ گه مَسازم ؤ پرؤندۀلئ گه مۀنم اضافۀ که فئرست سئرکردنۀل",
+       "tog-watchdefault": "ولگۀل ؤ پرؤندۀلئ گه دسکاری مۀکم بنه نؤم فئرست سئرکردن",
+       "tog-watchmoves": "ولگۀل ؤ پرؤندۀلئ گه هئزۀ مۀم-جابجا مۀکم بنه نؤم فئرست سئرکردن",
+       "tog-watchdeletion": "ولگۀل ؤ پرؤندۀلئ گه پاکۀ مۀکم بنه نؤم فئرست سئرکردن",
+       "tog-watchrollback": "ولگۀل گه ماره ما-بازگردانی مۀکم بنه نؤم فئرست سئرکردن",
+       "tog-minordefault": "کؤڵ دسکاری بیۀل به عنؤان پئش فرض عڵامت بۀرن",
+       "tog-previewontop": "پیش نمایش وهِ رئ جعبۀ نمایش نیشؤن به",
+       "tog-previewonfirst": "پئش نمایش-ورئ سئرکردن ئۀ اؤڵئن دسکاری نیشؤن به",
+       "tog-enotifwatchlistpages": "ئۀر وڵگۀ یا پرؤندئه ئژ فئرست-رزگ پی‌گیری‌ۀلم دسکاری بی نامه ئۀرا مه کِلّ کۀ",
+       "tog-enotifusertalkpages": "هۀنئگه-وختئ گه ئۀ وڵگۀ گپ کابریم تغییر کریا نامه ئۀرا مه کِل کۀ",
+       "tog-enotifminoredits": "ئۀر تغییرۀل-آڵؤنۀل(آلشتۀل)گؤجۀریجی ئۀر وڵگۀل ؤ پرؤندۀلم کریا نامه ئۀرا مه کِل کۀ",
+       "tog-enotifrevealaddr": "نیشانی ایمیل مه ئۀر ایمیل‌ل حاوواڵ رۀسن نیشؤن دۀ",
+       "tog-shownumberswatching": "گلۀ شؤماری-شؤمار کاربۀل پی‌گیر نیشان دۀ",
+       "tog-oldsig": ":امضائ گه ایسۀ درینئ",
+       "tog-fancysig": "(امضا چؤی ویکی‌متن بوو(بدون پئؤن خودکار نیائن",
+       "tog-uselivepreview": "استفاده از پیش‌نمایش زنده",
+       "tog-forceeditsummary": "هۀنئ گه-وختئ که خؤلاصۀ دسکاریم نَنیؤیسائۀ خۀؤۀ رم کۀ",
+       "tog-watchlisthideown": "دسکاریۀل ووژم ئژ فئرست سئرکردن بشارآ",
+       "tog-watchlisthidebots": "دسکاریۀل ربات ئژ فئرست سئرکردن بشآرا",
+       "tog-watchlisthideminor": "دسکاریۀل گؤجۀر ئژ فئرست سئرکردن بشارآ",
+       "tog-watchlisthideliu": "دسکاری کاربرۀلئ گه هۀتۀنئ نؤم سیستم ئۀ فئرست سئرکردن بشارآ",
+       "tog-watchlistreloadautomatically": "Reload the watchlist automatically whenever a filter is changed (JavaScript required)",
+       "tog-watchlisthideanons": "دةسکاری کاربرةل ناشنا ئة لیست نمائش بشارآ",
+       "tog-watchlisthidepatrolled": "دسکاریۀل گشت خورده-سئرکریا ئژ فئرست سئرکردن بشآرا",
+       "tog-watchlisthidecategorization": "نهفتن رده‌بندی صفحه‌ها",
+       "tog-ccmeonemails": "رؤی نؤیسیائ  ئژ نامۀلئگه کِلۀ مِه هۀم کاربرۀل-بهرۀگرۀل ئۀرا ووژم کِل که",
+       "tog-diffonly": "محتوا وةڵگة، ئة ژئر تفاوت دیار ناوو/نمایش ندهد",
+       "tog-showhiddencats": "دسۀل-رزگۀل آشاریآ نیشؤن دۀ",
+       "tog-norollbackdiff": "دؤما واگردانی تفاوت نیشؤن نه",
+       "tog-useeditwarning": "وخت ئه درچئن  ولگۀ دسکاری ئۀر دسکاریۀل ذخیرل نؤیمئ داشت هؤشدارمۀ بئدۀ",
+       "tog-prefershttps": "همؤیشۀ ئۀرا ئۀ نؤم سیستم هۀتن ئژ اتصالۀل امن بهرۀ بگر-استفادۀ کۀ",
+       "underline-always": "همؤیشۀ",
+       "underline-never": "هؤیچ وخت",
+       "underline-default": "پوسته یا مِه نِی کۀر پیش‌فرض",
+       "editfont-style": ":شئؤۀ قلم جعبهٔ دسکاری",
+       "editfont-default": "پیشفرض مِه نِی کۀر",
+       "editfont-monospace": "قلم ئۀ ۋاصلۀ ثابت",
+       "editfont-sansserif": "قلم بئ گوشۀ",
+       "editfont-serif": "قلم گوشۀ دار",
+       "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": "مانگه سێه/آذر",
+       "january-date": "$1 ژانویه",
+       "february-date": "$1 فوریه",
+       "march-date": "$1 مارس",
+       "april-date": "$1 آوریل",
+       "may-date": "$1 می",
+       "june-date": "$1 ژوئن",
+       "july-date": "ژولای $1",
+       "august-date": "$1 اگوست",
+       "september-date": "$1 سپتامبر",
+       "october-date": "$1 اکتبر",
+       "november-date": "$1 نوامبر",
+       "december-date": "$1 دسامبر",
+       "pagecategories": "{{PLURAL:$1|رده|ردۀل}}",
+       "category_header": "\"وۀلگۀل  ردهٔ \"$1",
+       "subcategories": "ژیر رده ل",
+       "category-media-header": "\"پۀروۀندۀل ردهٔ \"$1",
+       "category-empty": "<em>این رده در حال حاضر حاوی هیچ صفحه یا پرونده‌ای نیست.</em>",
+       "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 صفحه}} در این رده قرار {{PLURAL:$1|دارد|دارند}}؛ این رده در کل حاوی $2 صفحه است.}}",
+       "category-article-count-limited": "{{PLURAL:$1|صفحهٔ|$1 صفحهٔ}} زیر در ردهٔ فعلی قرار دارند.",
+       "category-file-count": "{{PLURAL:$2|This category contains only the following file.|The following {{PLURAL:$1|file is|$1 files are}} in this category, out of $2 total.}}",
+       "category-file-count-limited": "{{PLURAL:$1|پروندهٔ|$1 پروندهٔ}} زیر در ردهٔ فعلی قرار دارند.",
+       "listingcontinuesabbrev": "(ادامه)",
+       "index-category": "صفحه‌های نمایه‌شده",
+       "noindex-category": "صفحه‌های نمایه‌نشده",
+       "broken-file-category": "صفحه‌های دارای پیوند خراب به پرونده",
+       "about": "دۀربارۀ",
+       "article": "وةڵگة محتوایی",
+       "newwindow": "(واز کردن ئۀر دۀروۀچۀ جدید)",
+       "cancel": "ئآهووسانن/لغو",
+       "moredotdotdot": "...ویشتر/فرةتر",
+       "morenotlisted": "لیست کامل نیۀ",
+       "mypage": "وةڵگة/پەڕە",
+       "mytalk": "قسۀ-گۀپ",
+       "anontalk": "قسۀ-گۀپ",
+       "navigation": "ناوبری",
+       "and": "&#32;و",
+       "qbfind": "پیاکردن-ئادین",
+       "qbbrowse": "مِنِی -گۀشتن",
+       "qbedit": "دسکاری",
+       "qbpageoptions": "ئئ وةڵگة",
+       "qbmyoptions": "وۀلگۀل مِ",
+       "faq": "پرسش‌های متداول",
+       "faqpage": "Project:پرسش‌های متداول",
+       "actions": "کارۀل",
+       "namespaces": "فضای نامۀل",
+       "variants": "قصۀ کِرۀل",
+       "navigation-heading": "منوی ناوبری",
+       "errorpagetitle": "خطا",
+       "returnto": "بازگشت به $1",
+       "tagline": "دۀربارۀ {{SITENAME}}",
+       "help": "یاری کردن",
+       "search": "گئردین/مهِ نی",
+       "searchbutton": "گئردین/مهِ نی",
+       "go": "بِچۆ",
+       "searcharticle": "بِچۆ",
+       "history": "تاریخ وةڵگة",
+       "history_short": "تاریخچه",
+       "updatedmarker": "به‌روزشده از آخرین باری که سرزده‌ام",
+       "printableversion": "نؤسخۀ قاوول چاپ",
+       "permalink": "پیوۀند دائمی",
+       "print": "چاپ",
+       "view": "دیین/سئرکردن",
+       "view-foreign": "مشاهده در $1",
+       "edit": "دةسکاری",
+       "edit-local": "ویرایش توضیحات محلی",
+       "create": "دؤِرس کردن/سازین",
+       "create-local": "افزودن توضیحات محلی",
+       "editthispage": "ئئ وةڵگۀ دةسکاری کةن",
+       "create-this-page": "دؤرِس کردن ئئ وةڵگة",
+       "delete": "حۀذف کردن/پاک کردن",
+       "deletethispage": "حذف این صفحه",
+       "undeletethispage": "بازگردانی ئئ وةڵگة",
+       "undelete_short": "احیای {{PLURAL:$1|یإ دةسکاری|$1 دةسکاری}}",
+       "viewdeleted_short": "نمایش {{PLURAL:$1|یک ویرایش حذف‌شده|$1 ویرایش حذف‌شده}}",
+       "protect": "پروژۀ",
+       "protect_change": "تغییر/آلِشت",
+       "protectthispage": "محافظت إژ ئئ وةڵگة",
+       "unprotect": "تغییر محافظت",
+       "unprotectthispage": "تغییر محافظت ئئ وةڵگة",
+       "newpage": "وةڵگة  تازۀ",
+       "talkpage": "گةپ دةربارة ئئ وةڵگة",
+       "talkpagelinktext": "قسۀ-گۀپ",
+       "specialpage": "وةڵگة/پةرة  ویژة",
+       "personaltools": "ابزارۀل ووژی/شخصی",
+       "articlepage": "نمایش مةقاڵة",
+       "talk": "قسۀل-گۀپۀل",
+       "views": "دیین/سئرکردن",
+       "toolbox": "ابزارۀل",
+       "userpage": "وةڵگة کاربۀر بؤین",
+       "projectpage": "وةڵگة پروژۀ بوین",
+       "imagepage": "وةڵگة پرونده بؤین",
+       "mediawikipage": "نمایش وةڵگة پیغام",
+       "templatepage": "نمایش وةڵگة الگو",
+       "viewhelppage": "نمایش وةڵگة هؤمیاری",
+       "categorypage": "نمایش وةڵگة رده/ڕِزگ",
+       "viewtalkpage": "نمایش وةڵگة  گةپ ؤ گفت",
+       "otherlanguages": "وۀ زوونۀلئ تر",
+       "redirectedfrom": "(تغییرمسیر إژ $1)",
+       "redirectpagesub": "وةڵگة تغییرمسیر",
+       "redirectto": ":تغییر مسیر به",
+       "lastmodifiedat": ".ئئ وۀلگۀآخرین گِل ئۀ $1 سات $2 تۀغیر گِرتیۀسئ",
+       "viewcount": "إژ ئئ وةڵگة  {{PLURAL:$1|یإ گِل|$1$1چةن گِل}} بازدید بیة.",
+       "protectedpage": "وةڵگة محافظت/پڵؤم بیة",
+       "jumpto": ":وازآ کردن/پریدن وۀ",
+       "jumptonavigation": "ناوبری",
+       "jumptosearch": "گئردین/مهِ نی",
+       "view-pool-error": "متأسفانه سرورها در حال حاضر دچار بار اضافی هستند.\nتعداد زیادی از کاربران دارند تلاش می‌کنند که این صفحه را ببینند.\nلطفاً قبل از تلاش دوباره برای دیدن این صفحه مدتی صبر کنید.\n\n$1",
+       "generic-pool-error": "متأسفانه سرورها در حال حاضر دچار بار اضافی هستند.\nتعداد زیادی از کاربران دارند تلاش می‌کنند که این صفحه را ببینند.\nلطفاً قبل از تلاش دوباره برای دیدن این صفحه مدتی صبر کنید.",
+       "pool-timeout": "اتمام مهلت انتظار برای قفل",
+       "pool-queuefull": "صف مخزن پر است",
+       "pool-errorunknown": "خطای نادیاری/ناشنا",
+       "pool-servererror": ".$1 پول سنتر سرویس در دسترس نیست",
+       "poolcounter-usage-error": "خطای استفاده: $1",
+       "aboutsite": "دۀربارۀ {{SITENAME}}",
+       "aboutpage": "Project:درباره",
+       "copyright": " محتوایۀل هانإ ژئرنظر اجازه‌نامهٔ $1 مۀگۀر یۀگإ خلاف یۀ بوشرئ/ذکر بو",
+       "copyrightpage": "{{ns:project}}:حق تکثیر",
+       "currentevents": "رویدادۀل ایسۀ",
+       "currentevents-url": "Project:رویدادةل ایسة",
+       "disclaimers": "دروو نامه -تکذیب نامه",
+       "disclaimerpage": "Project:تکذیب‌نامهٔ عمومی",
+       "edithelp": "راهنمای دۀسکاری کردن",
+       "helppage-top-gethelp": "راهنما",
+       "mainpage": "سەر پەڕە",
+       "mainpage-description": "سەر پەڕە",
+       "policy-url": "Project:سیاستةل",
+       "portal": "دۀروازۀ کاربرۀل",
+       "portal-url": "Project:دۀروازۀ کاربرۀل",
+       "privacy": "أمنیۀت رازداری",
+       "privacypage": "Project:سیاست راز ئاشاردن",
+       "badaccess": "خطای دسترسی",
+       "badaccess-group0": "هؤمة اجازة کارێ گإ گستِتانة نئرینان",
+       "badaccess-groups": "عملی که درخواست کرده‌اید منحصر به کاربران {{PLURAL:$2|این گروه|این گروه‌ها}} است: $1.",
+       "versionrequired": "نسخهٔ $1 از نرم‌افزار مدیاویکی لازم است",
+       "versionrequiredtext": "برای دیدن این صفحه به نسخهٔ $1 از نرم‌افزار مدیاویکی نیاز دارید.\nبه [[Special:Version|این صفحه]] مراجعه کنید.",
+       "ok": "خوو/ باشد",
+       "retrievedfrom": "إژ \"$1\" گیریائۀ",
+       "youhavenewmessages": "{{PLURAL:$3|درین}}$1$2",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|هؤمة}} $1 د {{PLURAL:$3|کاربةرێ تِر|$3 کاربةر}}دِرین($2).",
+       "youhavenewmessagesmanyusers": "شما از تعدادی کاربر $1 دارید ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|پیغام جدید|999=پیامةل تازه}}",
+       "newmessagesdifflinkplural": "{{formatnum:$1}} {{PLURAL:$1|تغییر|999=تغییر}} اخیر",
+       "youhavenewmessagesmulti": ".پیغامةل جدیدی ئة $1 درین",
+       "editsection": "دةسکاری",
+       "editold": "دةسکاری",
+       "viewsourceold": "سئرکردن بِنچۀک/مۀنبۀع",
+       "editlink": "دةسکاری",
+       "viewsourcelink": "سئرکردن بِنچۀک/مۀنبۀع",
+       "editsectionhint": "دۀسکاری بۀخش: $1",
+       "toc": "محتویات",
+       "showtoc": "نیشان دائن",
+       "hidetoc": "ئآشاردن-پنهان کردن",
+       "collapsible-collapse": "آشاردِن",
+       "collapsible-expand": "کلنگاکردن/گسترش",
+       "confirmable-confirm": "{{GENDER:$1|هؤمة}} مطمئن هئینان؟",
+       "confirmable-yes": "أرێ-بةلئ",
+       "confirmable-no": "نة-نةخئر",
+       "thisisdeleted": "نمایش یا احیای $1؟",
+       "viewdeleted": "دیئن$1?",
+       "restorelink": "{{PLURAL:$1|یإ گِل دةسکاری حةذف بیة$1 دةسکاری حةذف بیة}}",
+       "feedlinks": ":حاوواڵ خوةن",
+       "feed-invalid": "نوع خوراک خبرخوان مجاز نیست.",
+       "feed-unavailable": ":حاوواڵ خوةنةل وة دةسترس نیئِن",
+       "site-rss-feed": "خوراک آراس‌اس برای $1",
+       "site-atom-feed": " $1 أرا atom هاوول خوۀن",
+       "page-rss-feed": "خوراک آراس‌اس برای «$1»",
+       "page-atom-feed": " $1 أرا atom هاوول خوۀن",
+       "red-link-title": "$1(ئئ وۀلگۀ نیۀسئ)",
+       "sort-descending": "مرتب‌سازی نزولی",
+       "sort-ascending": "مرتب‌سازی صعودی",
+       "nstab-main": "وةڵگة/پەڕە",
+       "nstab-user": "وۀلگۀ کاربۀر",
+       "nstab-media": "وةڵگة رسانه",
+       "nstab-special": "وۀلگۀ/پۀرۀ ویژۀ",
+       "nstab-project": "وۀلگۀ پروژۀ",
+       "nstab-image": "فایل",
+       "nstab-mediawiki": "پیغام",
+       "nstab-template": "نمونه",
+       "nstab-help": "وۀلگۀل راهنما",
+       "nstab-category": "رِزگ -دۀسۀ",
+       "mainpage-nstab": "سەر پەڕە",
+       "nosuchaction": "چنین عملی وجود نئرێ",
+       "nosuchactiontext": "عمل مشخص‌شده در نشانی اینترنتی نامجاز است.\nممکن است نشانی اینترنتی را اشتباه وارد کرده باشید یا پیوند مشکل‌داری را دنبال کرده باشید.\nهمچنین ممکن است ایرادی در نرم‌افزار استفاده‌شده در {{SITENAME}} وجود داشته باشد.",
+       "nosuchspecialpage": "چنین صفحهٔ ویژه‌ای وجود ندارد",
+       "nospecialpagetext": "<strong>شما یک صفحهٔ ویژهٔ نامجاز را درخواست کرده‌اید.</strong>\n\nفهرستی از صفحه‌های ویژهٔ مجاز در [[Special:SpecialPages|{{int:specialpages}}]] وجود دارد.",
+       "error": "خطا",
+       "databaseerror": "خطای پایگاه داده",
+       "databaseerror-text": "مشکلی در پایگاه‌داده‌ها رخ داده است. \nاین ممکن است نشان‌دهندهٔ ایرادی در نرم‌افزار باشد.",
+       "databaseerror-textcl": "یک خطای پرس‌وجوی پایگاه داده‌های رخ داده است.",
+       "databaseerror-query": "پرس‌ و جو: $1",
+       "databaseerror-function": "تابع: $1",
+       "databaseerror-error": "خطا: $1",
+       "transaction-duration-limit-exceeded": "In order to avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 second limit.\nIf you are changing many items at once, trying doing multiple smaller operations instead.",
+       "laggedslavemode": "'''هشدار:''' صفحه ممکن است به‌روزرسانی‌های اخیر را شامل نشود.",
+       "readonly": "پایگاه داده قفل بیة",
+       "enterlockreason": "دلیلی برای قفل کردن ذکر کنید، که حاوی تقریبی از زمانی باشد که قفل برداشته خواهد شد",
+       "readonlytext": "پایگاه داده در حال حاضر در برابر تغییرات و ایجاد صفحات قفل شده‌است؛ این وضعیت احتمالاً به خاطر بهینه‌سازی و رسیدگی‌های معمول است که پس از آن وضع به حالت عادی بازخواهد گشت.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
+       "missing-article": "پایگاه داده متن صفحهٔ با نام «$1» $2 را که باید پیدا می‌کرد نیافت.\n\nاین مشکل معمولاً به علت دنبال‌کردن یک پیوند تفاوت تاریخ‌گذشته یا تاریخچهٔ صفحه‌ای که حذف شده‌است، رخ می‌دهد.\n\nدر غیر این صورت ممکن است اشکالی در نرم‌افزار پیدا کرده باشد.\nلطفاً این مشکل را با ذکر نشانی اینترنتی به یکی از [[Special:ListUsers/sysop|مدیران]] گزارش دهید.",
+       "missingarticle-rev": "(شمارهٔ نسخه: $1)",
+       "missingarticle-diff": "(تفاوت: $1، $2)",
+       "readonly_lag": "پایگاه داده به طور خودکار قفل شده‌است تا نسخه‌های پشتیبان با نسخهٔ اصلی هماهنگ شوند",
+       "nonwrite-api-promise-error": "سرآیند اچ‌تی‌تی‌پی 'Promise-Non-Write-API-Action' ارسال شد ولی درخواست به یک رابط برنامه‌نویسی پودمان نوشتن بود.",
+       "internalerror": "خطای داخلی",
+       "internalerror_info": "خطای داخلی: $1",
+       "internalerror-fatal-exception": "نوع استثنای مخرب \"$1\"",
+       "filecopyerror": "نشد از پروندهٔ «$1» روی «$2» نسخه‌برداری شود.",
+       "filerenameerror": "نشد از پروندهٔ «$1» روی «$2» نسخه‌ برداری شود.",
+       "filedeleteerror": ".نشد پروندهٔ «$1» حذف شود",
+       "directorycreateerror": "نشد مسیر $1 را ایجاد کرد.",
+       "directoryreadonlyerror": "دایرکتوری \"$1\" فقط خواندنی است.",
+       "directorynotreadableerror": "دایرکتوری \"$1\" قابل خواندن نیست.",
+       "filenotfound": "پروندهٔ «$1» یافت نشد.",
+       "unexpected": "مقدار غیرمنتظره: «$1»=«$2».",
+       "formerror": "خطا: نمی‌توان فرم را فرستاد.",
+       "badarticleerror": "نمی‌توان این عمل را بر این صفحه انجام داد.",
+       "cannotdelete": "امکان حذف صفحه یا تصویر «$1» وجود ندارد.\nممکن است قبلاً فرد دیگری آن را حذف کرده باشد.",
+       "cannotdelete-title": "نمی‌توان صفحهٔ «$1» را حذف کرد",
+       "delete-hook-aborted": "حذف توسط قلاب لغو شد.\nتوضیحی در این مورد داده نشد.",
+       "no-null-revision": "امکان ایجاد نسخهٔ پوچ برای صفحهٔ «$1» وجود نداشت",
+       "badtitle": "عنوان گۀن/بد",
+       "badtitletext": "عنوان درخواستی نامعتبر، خالی، یا عنوانی میان‌زبانی یا میان‌ویکی‌ای با پیوند نادرست بود.\nممکن است حاوی یک یا چند نویسه باشد که نمی‌توانند در عنوان‌ها استفاده شوند.",
+       "title-invalid-empty": "عنوان صفحهٔ مورد درخواست خالی است یا فقط عنوان فضای نام ذکر شده‌است.",
+       "title-invalid-utf8": "عنوان صفحهٔ مورد نظر دارای نویسهٔ نادرست یونیکد است.",
+       "title-invalid-interwiki": "صفحهٔ درخواست شده دارای پیوند میان‌ویکی است که نمی‌تواند در عنوان‌ها استفاده شود.",
+       "title-invalid-talk-namespace": "صفحهٔ مورد درخواست به عنوان صفحهٔ بحثی که وجود ندارد، بازگشت می‌کند",
+       "title-invalid-characters": "عنوان صفحهٔ مورد درخواست نویسة نادرست «$1» دارد.",
+       "title-invalid-relative": "عنوان دارای نشانی است. عنوان نشانی‌ها (./, ../) بی‌اعتبار هستند چون معمولاً توسط مرورگر کاربران غیرقابل دسترس هستند.",
+       "title-invalid-magic-tilde": "عنوان صفحهٔ مورد درخواست دارای عبارت جادوئی بی‌اعتبار است (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": " نویسه یونیکد باشد{{PLURAL:$1|byte|bytes}} $1 عنوان صفحهٔ مورد درخواست خیلی طولانی است. نباید از",
+       "title-invalid-leading-colon": ".صفحهٔ درخواستی دارای : بی‌اعتبار در ابتدای عنوانش است",
+       "perfcached": "داده‌های زیر از حافظهٔ نهانی فراخوانی شده‌اند و ممکن است کاملاً به‌روز نباشند. حداکثر {{PLURAL:$1|یک نتیجه| $1 نتیجه}} در حافظهٔ نهانی قابل دسترس است.",
+       "perfcachedts": "داده‌های زیر از حافظهٔ نهانی فراخوانی شده‌اند و آخرین بار در $1 به‌روزرسانی شدند. حداکثر {{PLURAL:$4|یک نتیجه|$4 نتیجه}} در حافظهٔ نهانی قابل دسترس است.",
+       "querypage-no-updates": "امکان به‌روزرسانی این صفحه فعلاً غیرفعال شده‌است.\nاطلاعات این صفحه ممکن است به‌روز نباشد.",
+       "viewsource": "سئرکردن بِنچۀک/مۀنبۀع",
+       "viewsource-title": "نمایش بِنچةک ئةرا $1",
+       "actionthrottled": "جلوی عمل شما گرفته شد",
+       "actionthrottledtext": "به منظور جلوگیری از انتشار خرابکاری، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.\nلطفاً پس از چند دقیقه دوباره تلاش کنید.",
+       "protectedpagetext": ".ئئ وةڵگة ئةرا جلوگیری إژ دةسکاری یا فعالیت تر محافظت بیة",
+       "viewsourcetext": ":می‌توانید متن مبدأ این صفحه را مشاهده کنید یا از آن نسخه بردارید",
+       "viewyourtext": "می‌توانید کد مبدأ <strong>ویرایش‌هایتان</strong> در این صفحه را ببینید و کپی کنید.",
+       "protectedinterface": "این صفحه ارائه‌دهندهٔ متنی برای واسط کاربر این نرم‌افزار در این ویکی است و به منظور پیشگیری از خرابکاری محافظت شده‌است.\nبرای افزودن یا تغییر دادن ترجمه برای همهٔ ویکی‌ها، لطفاً از [//translatewiki.net/ translatewiki.net]، پروژهٔ محلی‌سازی مدیاویکی، استفاده کنید.",
+       "editinginterface": "<strong>هشدار:</strong> صفحه‌ای که ویرایش می‌کنید شامل متنی است که در واسط کاربر این نرم‌افزار به کار رفته‌است.\nتغییر این صفحه منجر به تغییر ظاهر واسط کاربر این نرم‌افزار برای دیگر کاربران خواهد شد.",
+       "translateinterface": "برای افزودن یا تغییر دادن ترجمه برای همهٔ ویکی‌ها، لطفاً از [//translatewiki.net/ translatewiki.net]، پروژهٔ محلی‌سازی مدیاویکی، استفاده کنید.",
+       "cascadeprotected": "این صفحه در مقابل ویرایش محافظت شده‌است چون در {{PLURAL:$1|صفحهٔ|صفحه‌های}} محافظت‌شدهٔ زیر که گزینهٔ «آبشاری» در {{PLURAL:$1|آن|آن‌ها}} انتخاب شده قرار گرفته‌است:\n$2",
+       "namespaceprotected": ".هؤمة اجازهٔ دةسکاری وةڵگةل فضای نام '''$1''' نئرین",
+       "customcssprotected": "هؤمة  اجازهٔ دةسکاری این صفحهٔ سی‌اس‌اس را ندارید، زیرا حاوی تنظیم‌های شخصی یک کاربر دیگر است.",
+       "customjsprotected": "شما اجازهٔ ویرایش این صفحهٔ جاوااسکریپت را ندارید، زیرا حاوی تنظیم‌های شخصی یک کاربر دیگر است.",
+       "mycustomcssprotected": "شما دارای مجوز ویرایش این صفحهٔ سی‌اس‌اس نیستید.",
+       "mycustomjsprotected": "شما دارای مجوز ویرایش این صفحهٔ جاوااسکریپت نیستید.",
+       "myprivateinfoprotected": "شما دارای مجوز ویرایش اطلاعات شخصی خود نیستید.",
+       "mypreferencesprotected": "شما دارای مجوز ویرایش تنظیمات خود نیستید.",
+       "ns-specialprotected": ".وةڵگةل ویژه غیر قابل دةسکاریِن",
+       "titleprotected": "این عنوان توسط [[User:$1|$1]] در برابر ایجاد محافظت شده‌است.\nدلیل ارائه‌شده این است: «''$2''».",
+       "filereadonlyerror": "تغییر پرونده «$1» ممکن نیست چون مخزن پرونده «$2» در حالت فقط خواندنی قرار دارد.\n\nمدیری که آن را قفل کرده چنین توضیحی را ذکر کرده:  «$3».",
+       "invalidtitle-knownnamespace": "عنوان نامعتبر با فضای نام «$2» و متن «$3»",
+       "invalidtitle-unknownnamespace": "عنوان نامعتبر با فضای نام ناشناختهٔ شمارهٔ $1 و متن «$2»",
+       "exception-nologin": "وارد سیستم نؤینۀ",
+       "exception-nologin-text": "حواهشا بوونإ سیستم تا دسترسی تان داشتوئإ ئئ وةڵگة",
+       "exception-nologin-text-manual": "لطفاً  $1  تا بتوانید به این صفحه یا عمل دسترسی داشته باشید.",
+       "virus-badscanner": "پیکربندی بد: پویشگر ویروس ناشنا/نادیاری: $1",
+       "virus-scanfailed": "  )$1 پویش ناموفق (کد",
+       "virus-unknownscanner": ":ضدویروس ناشناخته",
+       "logouttext": "'''ایسة دةر چئن هؤمة ثبت بیة.'''\nتوجه داشته باشید که تا حافظهٔ نهان مرورگرتان را پاک نکنید، بعضی از صفحات ممکن است همچنان به گونه‌ای نمایش یابند که انگار وارد شده‌اید.",
+       "welcomeuser": "خؤةش هةتینة/هاتینة $1!",
+       "welcomecreation-msg": "حساوو کاربری هؤمة دؤرس بی.\nفراموش نکنید که [[Special:Preferences|ترجیحات {{SITENAME}}]] خود را تغییر دهید.",
+       "yourname": ":نؤم کاربری",
+       "userlogin-yourname": "نؤم بهرۀگر-کاربر",
+       "userlogin-yourname-ph": "نام کاربۀری تؤن وارد کۀن",
+       "createacct-another-username-ph": "نام کاربۀری تؤن وارد کۀن",
+       "yourpassword": ":رمز عبور",
+       "userlogin-yourpassword": "رۀمز",
+       "userlogin-yourpassword-ph": "یک گذرواژه وارد کنید",
+       "createacct-yourpassword-ph": "یک گذرواژه وارد کنید",
+       "yourpasswordagain": "تکرار گذرواژه:",
+       "createacct-yourpasswordagain": "گذرواژه را دوباره وارد کنید",
+       "createacct-yourpasswordagain-ph": "گذرواژه را وارد کنید برای بار دوم",
+       "remembermypassword": "رمزعبورت وة ئئ رایانة ئةویرت/یادت بو(تابیشترإژ$1{{PLURAL:$1|رووژةل|رووژ}})",
+       "userlogin-remembermypassword": "مإ وارد  بی بیل",
+       "userlogin-signwithsecure": "إژ ورود امن استفاده کةن",
+       "yourdomainname": ":دامنهٔ شما",
+       "password-change-forbidden": ".شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید",
+       "externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
+       "login": "نؤم هۀتن سیستم",
+       "nav-login-createaccount": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
+       "userlogin": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
+       "userloginnocreate": "نؤم هۀتن سیستم",
+       "logout": "دةرچئن/خروج",
+       "userlogout": "دةرچئن/خروج",
+       "notloggedin": "وارد سیستم نؤینۀ",
+       "userlogin-noaccount": "حساوو کاربۀری نرین؟",
+       "userlogin-joinproject": "{{SITENAME}}نام نؤیسی کۀن",
+       "nologin": "حساوو کاربۀری نرین؟$1",
+       "nologinlink": "حساووئ أرا ووژتان بِسازِن",
+       "createaccount": "حساووئ أرا ووژتان بِسازِن",
+       "gotaccount": "حساوو کاربۀری دِرین؟$1",
+       "gotaccountlink": "نؤم هۀتن سیستم",
+       "userlogin-resetlink": "جزئیات ورود إ ویرتان/یادتان چئة؟",
+       "userlogin-resetpassword-link": "رۀمزۀتان  ویر/ یاد  چئۀ؟",
+       "userlogin-helplink2": "کمک با ورود",
+       "userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
+       "userlogin-createanother": "حساووئ کاربةری تِر بِسازِن",
+       "createacct-emailrequired": "نیشانی ایمیل",
+       "createacct-emailoptional": ")نشانی ایمیل (اختیاری",
+       "createacct-email-ph": "نیشانی ایمیل ووژتان بنؤیسِن",
+       "createacct-another-email-ph": "نیشانی ایمیل ووژتان بنؤیسِن",
+       "createaccountmail": "استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده",
+       "createacct-realname": "*نام راسکانی/واقعی *دل بخواهی",
+       "createaccountreason": ":دةلیل",
+       "createacct-reason": "دةلیل",
+       "createacct-reason-ph": "ئةرا حساووێ  تر مةسازین؟",
+       "createacct-submit": "حساووئ أرا ووژتان بِسازِن",
+       "createacct-another-submit": "حساووئ أرا ووژتان بِسازِن",
+       "createacct-benefit-heading": "{{SITENAME}} is made by people like you.",
+       "createacct-benefit-body1": "{{PLURAL:$1|دۀسکاری|دۀسکاریۀل}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|وۀلگۀ|وۀلگۀل}}",
+       "createacct-benefit-body3": "recent {{PLURAL:$1|contributor|contributors}}",
+       "badretype": "گذرواژةلێ گإ نۆیساتة چؤِی یةک نیِن",
+       "usernameinprogress": ". دِرێ حساوو دؤرسة مةکإ . خواهشا صبر کةن",
+       "userexists": ".نام کاربةری‌ گإ واردت کردئة قبلاً استفاده بیة\n.خواهشا نامێ تر استفادة کةن",
+       "loginerror": "خطای إ نام هةتن سیستم",
+       "createacct-error": "خطای  حساوو کاربةری سازین",
+       "createaccounterror": "نمآوو ئئ حساووة بِسازین: $1",
+       "nocookiesnew": "حساوو کاربةری سازیا، اما هؤمة أ سیستم نهةتینة/نهاتینة.\n{{SITENAME}} برای ورود کاربران به سامانه از کوکی استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید، و سپس با نام کاربری و گذرواژهٔ جدیدتان به سامانه وارد شوید.",
+       "nocookieslogin": "{{SITENAME}} برای ورود کاربران به سامانه از کوکی‌ها استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید و دوباره امتحان کنید.",
+       "nocookiesfornew": "حساوو کاربةری نةسازریا، زیرا نتوانستیم منبع آن را تأیید کنیم.\nمطمئن شوید که کوکی‌ها فعال هستند، آن‌گاه صفحه را از نو بارگیری کنید و دوباره امتحان کنید.",
+       "noname": ".هؤمة نام کاربةری معتبری دیاری نکردئة",
+       "loginsuccesstitle": "موفق بین چینإ سیستم",
+       "loginsuccess": "هؤمة ایسة هةتیإ نؤم سیستم {{SITENAME}} وۀ نام\"$1\".'",
+       "nosuchuser": "کاربةری وۀ نام «$1» ئة ائرة نیة.\nنام کاربةری وة کةڵنگی و گؤجةری حروف حساسة .\nاملای نام را بررسی کنید، یا [[Special:UserLogin/signup|یک حساب کاربری تازه بسازید]].",
+       "nosuchusershort": "هؤیچ کاربةری وة نام ''$1'' ئة ائرة نیة.\nاملایتان را وارسی کنید.",
+       "nouserspecified": ".باید یإ گِلة  نام کاربةری دیاری کئین",
+       "login-userblocked": ".ئئ کاربةرة بةسیائة. إنؤم هةتِن سیستم مجاز نیة",
+       "wrongpassword": "گذرواژه‌ای که وارد کردید نادرستة.\nخواهشا دووباره تلاش کةن.",
+       "wrongpasswordempty": "گذرواژه‌ای که وارد کرده‌اید، خالی است.\nلطفاً دوباره تلاش کنید.",
+       "passwordtooshort": "گذرواژه باید دست‌کم {{PLURAL:$1|۱ حرف|$1 حرف}} داشته باشد.",
+       "passwordtoolong": "گذرواژه نمی تواند حروفش بیشتر از {{PLURAL:$1|۱ حرف|$1 حرف}}  باشد.",
+       "passwordtoopopular": "Commonly chosen passwords cannot be used. Please choose a more unique password.",
+       "password-name-match": "گذرواژهٔ شما باید با نام کاربری شما تفاوت داشته باشد.",
+       "password-login-forbidden": "استفاده از این نام کاربری و گذرواژه ممنوع است.",
+       "mailmypassword": "دووارة رمز نؤیسائن",
+       "passwordremindertitle": "یادآور گذرواژهٔ {{SITENAME}}",
+       "passwordremindertext": "یک نفر (احتمالاً خود شما، با نشانی آی‌پی $1) گذرواژهٔ جدیدی برای حساب کاربری شما در {{SITENAME}} درخواست کرده‌است ($4). \nیک گذرواژهٔ موقت برای کاربر «$2» ساخته شده و برابر با «$3» قرار داده شده‌است.\nاگر هدفتان همین بوده‌است، اکنون باید وارد سامانه شوید و گذرواژهٔ جدیدی برگزینید.\nگذرواژهٔ موقت شما ظرف {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.\n\nاگر کس دیگری این درخواست را کرده‌است یا اینکه شما گذرواژهٔ پیشین خود را به یاد آورده‌اید و دیگر تمایلی به تغییر آن ندارید، می‌توانید این پیغام را نادیده بگیرید و همان گذرواژهٔ پیشین را به کار برید.",
+       "noemail": ".هؤیچ نیشانی ایمیلی ئةرا کاربةر «$1» ثبت نؤیة",
+       "noemailcreate": "شما باید یک آدرس ایمیل درست فراهم کنید",
+       "passwordsent": "گذرواژه‌ای جدید به آدرس ایمیل ثبت شده برای «$1» ارسال شد.\nلطفاً پس از دریافت آن، دوباره به سیستم وارد شوید.",
+       "blocked-mailpassword": "نشانی آی‌پی شما از ویرایش بازداشته شده‌است و از این رو به منظور جلوگیری از سوءاستفاده اجازهٔ بهره‌گیری از قابلیت بازیابی گذرواژه را ندارد.",
+       "eauthentsent": "یک ایمیل تأیید برای آدرس ایمیل به نشانی مورد نظر ارسال شد.\nقبل از اینکه ایمیل دیگری قابل ارسال به این آدرس باشد، باید دستورهایی که در آن ایمیل آمده است را جهت تأیید این مساله که این آدرس متعلق به شماست، اجرا کنید.",
+       "throttled-mailpassword": "یإ گِلة رمز عبور  {{PLURAL:$1| وۀ ساعت |$1 وۀساعتةل}}کِل/ارسال بیة/.\nسی نئهاگئری د أذیأت بییئن، فأقأط یئ گئل رازینە گوڤاردئن د أنجومانامە د نۊ زئنە بییە د هأر {{PLURAL:$1|ساعأت|$1 ساعأتیا}} کئل بییە.",
+       "mailerror": "خطا در ارسال ایمیل: $1",
+       "acct_creation_throttle_hit": "بازدیدکنندگان این ویکی که از نشانی آی‌پی شما استفاده می‌کنند در روز گذشته {{PLURAL:$1|یک حساب کاربری|$1 حساب کاربری}} ساخته‌اند، که بیشترین تعداد مجاز در آن بازهٔ زمانی است.\nبه همین خاطر، بازدیدکنندگانی که از این نشانی آی‌پی استفاده می‌کنند نمی‌توانند در حال حاضر حساب جدیدی بسازند.",
+       "emailauthenticated": "نشانی ایمیل شما در $2 ساعت $3 تأیید شده است.",
+       "emailnotauthenticated": "آدرس ایمیل شما هنوز تأیید نشده است.\nبرای هیچ‌یک از ویژگی‌های زیر، ایمیل ارسال نخواهد شد.",
+       "noemailprefs": "برای راه‌اندازی این قابلیت‌ها یک آدرس ایمیل در ترجیحات خود مشخص کنید.",
+       "emailconfirmlink": "نیشانی ایمیل ووژتان تأئید کةن",
+       "invalidemailaddress": "آدرس ایمیل واردشدهٔ قابل قبول نیست، چرا که دارای ساختار نامعتبری است.\nلطفاً آدرسی با ساختار صحیح وارد کنید و یا بخش مربوط را خالی بگذارید.",
+       "cannotchangeemail": "آدرس‌های ایمیل حساب کاربری در این ویکی قابل تغییر نیست.",
+       "emaildisabled": "این وب سایت قادر به ارسال ایمیل نیست.",
+       "accountcreated": "حساوو کاربةری سازیا",
+       "accountcreatedtext": "حساوو کاربةری ئةرا [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|گةپ]]) ایجاد بیة.",
+       "createaccount-title": "ایجاد حساب کاربری در {{SITENAME}}",
+       "createaccount-text": "یک نفر برای ایمیل شما یک حساب کاربری در {{SITENAME}} با نام «$2» ایجاد کرده‌است ($4)، که گذرواژهٔ آن چنین است: $3\nشما باید به سیستم وارد شوید تا گذرواژهٔ خود را تغییر بدهید.\n\nاگر این حساب اشتباهی ساخته شده است، این پیغام را نادیده بگیرید.",
+       "login-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
+       "login-abort-generic": "ورود شما ناموفق بود - خاتمهٔ ناگهانی داده شد",
+       "login-migrated-generic": "حساب کاربری شما منتقل شده‌است، و نام کاربری‌تان دیگر در این ویکی وجود ندارد.",
+       "loginlanguagelabel": "$1:زوون",
+       "suspicious-userlogout": "درخواست هؤمة ئةرا  دةرچئن إژ سیستم  رد بیة زیرا به نظر می‌رسد که این  .درخواست توسط یک مرورگر معیوب یا پروکسی میانگیر کل/ارسال بیة",
+       "createacct-another-realname-tip": "نام راسکانی/واقعی دڵ بخواهیة.\nاگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.",
+       "pt-login": "نؤم هۀتن.",
+       "pt-login-button": "نؤم هۀتن سیستم",
+       "pt-createaccount": "حساووئ أرا ووژتان بِسازِن",
+       "pt-userlogout": "دةرچئن/خروج",
+       "php-mail-error-unknown": "خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی",
+       "user-mail-no-addy": "تلاش برای ارسال ایمیل بدون آدرس ایمیل.",
+       "user-mail-no-body": "سعی کردید ایمیلی با محتوای بی‌دلیل کوتاه و یا خالی بفرستید.",
+       "changepassword": "تغییردائن رمز",
+       "resetpass_announce": "شما باید برای پایان ورود به سامانه، گذرواژهٔ جدیدی را تنظیم کنید.",
+       "resetpass_header": "تغییر گذرواژهٔ حساب کاربری",
+       "oldpassword": "گذرواژهٔ پیشین:",
+       "newpassword": "گذرواژهٔ تازه:",
+       "retypenew": "گذرواژهٔ تازه را دوباره وارد کنید",
+       "resetpass_submit": "تنظیم گذرواژه و ورود به سامانه",
+       "changepassword-success": "گذرواژهٔ شما با موفقیت تغییر داده شد!",
+       "changepassword-throttled": "شما به تازگی چندین‌بار برای ثبت ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
+       "resetpass_forbidden": "نمی‌توان گذرواژه‌ها را تغییر داد",
+       "resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
+       "resetpass-submit-loggedin": "تغییردائن رمز",
+       "resetpass-submit-cancel": "ئآهووسانن/لغو",
+       "resetpass-wrong-oldpass": "گذرواژهٔ موقت یا اخیر نامعتبر.\nممکن است که شما همینک گذرواژه‌تان را با موفقیت تغییر داده باشید یا درخواست یک گذرواژهٔ موقت تازه کرده باشید.",
+       "resetpass-recycled": "لطفاً رمز عبور خود را به چیز دیگری غیر از رمز عبور فعلی تنظیم کنید.",
+       "resetpass-temp-emailed": "شما با یک کد ایمیل شدهٔ موقت وارد شده‌اید.\nبرای پایان ورود، شما باید رمز عبور جدیدی اینجا وارد کنید:",
+       "resetpass-temp-password": ":رمز عبور موقت",
+       "resetpass-abort-generic": "تغییر گذرواژه به دست یکی از افزونه‌ها لغو شده است.",
+       "resetpass-expired": "رمز عبور شما منقضی شده‌است. لطفاً برای ورود رمز عبور جدیدی را تنظیم کنید.",
+       "resetpass-expired-soft": "رمز عبور شما منقضی شده‌است، و نیاز به تنظیم مجدد دارد. لطفاً اکنون رمز عبور جدیدی را انتخاب کنید، یا برای تنظیم مجدد آن بعدآً، دکمه \"{{int:resetpass-submit-cancel}}\" را کلیک کنید.",
+       "resetpass-validity-soft": "گذرواهٔ شما صحیح نیست: $1\n\nلطفاً یک گذرواژهٔ تازه الآن انتخاب کنید یا بر «{{int:resetpass-submit-cancel}}» کلیک کنید که دوباره آن را بعداً انتخاب کنید.",
+       "passwordreset": "بازنشانی گذرواژه",
+       "passwordreset-text-one": "برای بازنشانی گذرواژه‌تان این فرم را کامل کنید.",
+       "passwordreset-text-many": "{{PLURAL:$1|برای دریافت یک گذرواژهٔ موقت از طریق ایمیل، یکی از خانه‌ها را پر کنید.}}",
+       "passwordreset-disabled": "بازنشانی گذرواژه در این ویکی غیرفعال شده است.",
+       "passwordreset-emaildisabled": "قابلیت‌های ایمیل در این ویکی غیرفعال شده‌اند.",
+       "passwordreset-username": ":نؤم کاربری",
+       "passwordreset-domain": "دامنه:",
+       "passwordreset-capture": "ایمیل نهایی نشان داده شود؟",
+       "passwordreset-capture-help": "اگر این گزینه را علامت بزنید، ایمیل (حاوی گذرواژهٔ موقت) به شما نشان داده خواهد شد و برای کاربر نیز فرستاده خواهد شد.",
+       "passwordreset-email": ":نیشانی ایمیل",
+       "passwordreset-emailtitle": "جزئیات حساب در {{SITENAME}}",
+       "passwordreset-emailtext-ip": "یک نفر (احتمالاً شما، با نشانی آی‌پی $1) درخواست بازنشانی گذرواژه‌تان در {{SITENAME}} ($4) را کرده‌است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط هستند:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} پس از {{PLURAL:$5|یک روز|$5 روز}} باطل خواهند شد.\nشما باید هم‌اکنون ثبت ورود کنید و گذرواژه‌ای جدید برگزینید. اگر فکر می‌کنید شخص دیگری این درخواست را داده است یا اگر گذرواژهٔ اصلی‌تان را به یاد آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
+       "passwordreset-emailtext-user": "کاربر $1 از {{SITENAME}} درخواست بازنشانی گذرواژهٔ شما در {{SITENAME}} ($4) را کرده است. {{PLURAL:$3|حساب|حساب‌های}} کاربری زیر با این آدرس ایمیل مرتبط است:\n\n$2\n\n{{PLURAL:$3|این گذرواژهٔ موقت|این گذرواژه‌های موقت}} تا {{PLURAL:$5|یک روز|$5 روز}} باطل می‌شود.\nشما باید هم‌اکنون وارد شده و یک گذرواژهٔ جدید برگزینید. اگر شخص دیگری این درخواست را داده است، یا اگر گذرواژهٔ اصلی‌تان را به خاطر آوردید و دیگر نمی‌خواهید آن را تغییر دهید، می‌توانید این پیغام را نادیده بگیرید و به استفاده از گذرواژهٔ قبلی‌تان ادامه دهید.",
+       "passwordreset-emailelement": "نام کاربری: \n$1\n\nگذرواژهٔ موقت: \n$2",
+       "passwordreset-emailsentemail": "اگر ایمیلی را برای حساب کاربریتان مشخص کرده باشید، یک نامهٔ بازنشانی گذرواژه فرستاده شده‌است.",
+       "passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
+       "passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
+       "changeemail": "تغییر یا حذف نشانی ایمیل",
+       "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
+       "changeemail-passwordrequired": "برای تائید این تغییر باید گذرواژه‌تان را وارد کنید.",
+       "changeemail-no-info": ".برای دسترسی مستقیم به این صفحه شما باید به سیستم وارد شده باشید",
+       "changeemail-oldemail": ":نشانی ایمیل ایسة هؤمة",
+       "changeemail-newemail": ":نشانی ایمیل تازة",
+       "changeemail-newemail-help": "برای حذف ایمیل باید این بخش را خالی رها کنید در نتیجه امکان بازگردانی گذرواژه و دریافت ایمیل از ویکی برای شما مقدور نخواهد بود.",
+       "changeemail-none": "(هؤیچ کام)",
+       "changeemail-password": "گذرواژهٔ {{SITENAME}} هؤمة:",
+       "changeemail-submit": "تغییر ایمیل",
+       "changeemail-throttled": "شما به مراتب برای ورود تلاش کرده‌اید.\nلطفاً پیش از آنکه دوباره تلاش کنید $1 صبر کنید.",
+       "changeemail-nochange": "لطفاً رایانامهٔ جدید و متفاوتی وارد کنید.",
+       "resettokens": "بازنشانی شناساننده‌ها",
+       "resettokens-text": "شما می توانید شناساننده‌ها که اجازهٔ دسترسی به برخی داده‌های خصوصی مرتبط با حسابتان را می‌دهد بازنشانی کنید.\nدر صورتی باید این کار را انجام دهید که تصادقاً آن‌ها را با کسی در میان گذاشته‌اید یا به حسابتان نفوذ شده است.",
+       "resettokens-no-tokens": "هیچ شناساننده‌ای برای بازنشانی وجود ندارد.",
+       "resettokens-tokens": "شناساننده‌ها:",
+       "resettokens-token-label": "$1 (مقدار کنونی: $2)",
+       "resettokens-watchlist-token": "شناسانندهٔ خوراک وبِی [[Special:Watchlist|تغییرات صفحه‌هایی که پی‌گیری می‌کنید]] (اتم/آراس‌اس)",
+       "resettokens-done": "بازنشانی شناساننده‌ها.",
+       "resettokens-resetbutton": "بازشناسی شناساننده‌های گزیده‌شده.",
+       "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": " )خط افقی(از آن کم استفاده کنید",
+       "summary": "خلاصه:",
+       "subject": "عنوان:",
+       "minoredit": "یۀ دۀسکاری جزئیکۀ",
+       "watchthis": "پی‌گیری ئئ وۀلگۀ",
+       "savearticle": "ذۀخیرۀ وۀلگۀ",
+       "preview": "پیش‌نمایش",
+       "showpreview": "پیش‌نمایش",
+       "showdiff": "نمایش تغییرةل/پالانةل",
+       "blankarticle": "<strong>هشدار:</strong> شما در حال ایجاد صفحه خالی هستید.\nاگر «{{int:savearticle}}» را دوباره کلیک کنید، صفحه بدون محتوا ایجاد می‌شود.",
+       "anoneditwarning": "<strong>هشدار:</strong> شما وارد نشده‌اید. نشانی آی‌پی شما برای عموم قابل مشاهده خواهد بود اگر هر تغییری ایجاد کنید. اگر <strong>[$1 وارد شوید]</strong> یا <strong>[$2 یک حساب کاربری بسازید]</strong>، ویرایش‌هایتان به نام کاربری‌تان نسبت داده خواهد شد، همراه با مزایای دیگر.",
+       "anonpreviewwarning": "''شما به سامانه وارد نشده‌اید. ذخیره کردن باعث می‌شود که نشانی آی‌پی شما در تاریخچهٔ این صفحه ثبت گردد.''",
+       "missingsummary": "'''یادآوری:''' شما خلاصهٔ ویرایش ننوشته‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "selfredirect": "<strong>هشدار:</strong> شما در حال تغییرمسیر صفحه به خودش هستید.\nامکان دارد هدف اشتباهی را برای تغییرمسیر انتخاب کردید، یا ممکن است صفحهٔ اشتباهی را ویرایش می‌کنید.\n\nاگر بر روی \"{{int:savearticle}}\" دوباره کلیک کنید، تغییرمسیر ساخته خواهد شد.",
+       "missingcommenttext": "لطفاً توضیحی در زیر بیفزایید.",
+       "missingcommentheader": "<strong>یادآوری:</strong> شما موضوع/عنوان این یادداشت را مشخص نکرده‌اید.\nاگر دوباره دکمهٔ «{{int:savearticle}}» را فشار دهید ویرایش شما بدون آن ذخیره خواهد شد.",
+       "summary-preview": "پیش‌نمایش خلاصه:",
+       "subject-preview": ":پیش‌نمایش موضوع",
+       "previewerrortext": "در زمان تلاش برای نمایش دادن تغییرات شما، خطای رخ داد.",
+       "blockedtitle": "کاربر بسته شده‌است",
+       "blockedtext": "<strong>دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.</strong>\n\nاین قطع دسترسی توسط $1 انجام شده است.\nدلیل ارائه‌شده چنین است: <em>$2</em>\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
+       "autoblockedtext": "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.\nدلیل ارائه‌شده چنین است:\n\n:''$2''\n\n* شروع قطع دسترسی: $8\n* پایان قطع دسترسی: $6\n* کاربری هدف قطع دسترسی: $7\n\nشما می‌توانید با $1 یا [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.\nتوجه کنید که شما نمی‌توانید از قابلیت «ایمیل به این کاربر» استفاده کنید مگر آنکه نشانی ایمیل معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این قابلیت برای شما قطع نشده باشد.\nنشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.\nلطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
+       "blockednoreason": "دلیلی مشخص نشده‌است",
+       "whitelistedittext": "برای ویرایش مقاله‌ها باید $1.",
+       "confirmedittext": "شما باید، پیش از ویرایش صفحات، آدرس ایمیل خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.",
+       "nosuchsectiontitle": "چنین بخشی پیدا نشد",
+       "nosuchsectiontext": "شما تلاش کرده‌اید یک بخش در صفحه را ویرایش کنید که وجود ندارد.\nممکن است در مدتی که شما صفحه را مشاهده می‌کردید این بخش جا به جا یا حذف شده باشد.",
+       "loginreqtitle": "ورود به سامانه لازم است",
+       "loginreqlink": "نؤم هۀتن سیستم",
+       "loginreqpagetext": "برای دیدن صفحه‌های دیگر باید $1.",
+       "accmailtitle": "گذرواژه فرستاده شد.",
+       "accmailtext": "یک گذرواژهٔ تصادفی برای [[User talk:$1|$1]] به $2 فرستاده شد. می‌توان آن را از صفحهٔ ''[[Special:ChangePassword|تغییر گذرواژه]]'' که هنگام ثبت ورود نمایش می‌یابد تغییر داد.",
+       "newarticle": "(تازه)",
+       "newarticletext": "شما پیوندی را دنبال کرده‌اید و به صفحه‌ای رسیده‌اید که هنوز وجود ندارد.\nبرای ایجاد صفحه، در مستطیل زیر شروع به نوشتن کنید (برای اطلاعات بیشتر به [$1 صفحهٔ راهنما] مراجعه کنید).\nاگر به اشتباه اینجا آمده‌اید، دکمهٔ «بازگشت» مرورگرتان را بزنید.",
+       "anontalkpagetext": "----''این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم.\nچنین نشانی‌های آی‌پی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:UserLogin/signup|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].''",
+       "noarticletext": "این صفحه هم‌اکنون دارای هیچ متنی نیست.\nشما می‌توانید در صفحه‌های دیگر [[Special:Search/{{PAGENAME}}|عنوان این صفحه را جستجو کنید]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را جستجو کنید]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} این صفحه را ویرایش کنید]</span>.",
+       "noarticletext-nopermission": "این صفحه هم‌اکنون متنی ندارد.\nشما می‌توانید در دیگر صفحات [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.",
+       "missing-revision": "ویرایش #$1 از صفحهٔ «{{FULLPAGENAME}}» موجود نیست.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
+       "userpage-userdoesnotexist": "حساب کاربر «<nowiki>$1</nowiki>» ثبت نشده‌است.\nلطفاً مطمئن شوید که می‌خواهید این صفحه را ایجاد یا ویرایش کنید.",
+       "userpage-userdoesnotexist-view": "حساب کاربری «$1» ثبت نشده‌است.",
+       "blocked-notice-logextract": "دسترسی این کاربر در حال حاضر بسته است.\nآخرین مورد سیاهه قطع دسترسی در زیر آمده‌است:",
+       "clearyourcache": "<strong>نکته:</strong> پس از ذخیره‌کردن ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.\n*<strong>فایرفاکس / سافاری:</strong> کلید <em>Shift</em> را نگه دارید و روی دکمهٔ <em>Reload</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> یا <em>Ctrl-R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-R</em>)\n*<strong>گوگل کروم:</strong> کلیدهای <em>Ctrl+Shift+R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-Shift-R</em>)\n*<strong>اینترنت اکسپلورر:</strong> کلید <em>Ctrl</em> را نگه‌دارید و روی دکمهٔ <em>Refresh</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> را با هم فشار دهید\n*<strong>اپرا:</strong> حافظهٔ نهانی مرورگر را از طریق منوی <em>Tools &rarr; Preferences</em> پاک کنید",
+       "usercssyoucanpreview": "'''نکته:''' پیش از ذخیره‌کردن پرونده سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+       "userjsyoucanpreview": "'''نکته:''' پیش از ذخیره‌کردن پروندهٔ جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+       "usercsspreview": "'''فراموش مکنید که شما فقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''\n'''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
+       "userjspreview": "'''به یاد داشته باشید که شما فقط دارید جاوااسکریپت کاربری‌تان را امتحان می‌کنید/پیش‌نمایش آن را می‌بینید.'''\n'''این جاوااسکریپت هنوز ذخیره نشده‌است!'''",
+       "sitecsspreview": "'''به یاد داشته باشید که شما فقط دارید پیش‌نمایش این سی‌اس‌اس را می‌بینید.'''\n'''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
+       "sitejspreview": "'''فراموش مکنید که شما فقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''\n'''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
+       "userinvalidcssjstitle": "'''هشدار:''' پوسته‌ای به نام «$1» وجود ندارد.\nبه یاد داشته باشید که صفحه‌های شخصی ‎.css و ‎.js باید عنوانی با حروف کوچک داشته باشند؛ نمونه: {{ns:user}}:فو/vector.css در مقابل {{ns:user}}:فو/Vector.css.",
+       "updated": "(تازة سازی بیة)",
+       "note": "'''نکته:'''",
+       "previewnote": "'''به یاد داشته باشید که این فقط پیش‌نمایش است.'''\nتغییرات شما هنوز ذخیره نشده‌است!",
+       "continue-editing": "بچۆإ بةخش دةکاری",
+       "previewconflict": "این پیش‌نمایش منعکس‌کنندهٔ متن ناحیهٔ ویرایش متن بالایی است، به شکلی که اگر متن را ذخیره کنید نمایش خواهد یافت.",
+       "session_fail_preview": "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.'''\nلطفاً دوباره سعی کنید.\nاگر دوباره به همین پیام برخوردید از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
+       "session_fail_preview_html": "'''متأسفانه امکان ثبت ویرایش شما به خاطر از دست رفتن اطلاعات نشست کاربری وجود ندارد.'''\n\n''با توجه به این که در {{SITENAME}} امکان درج اچ‌تی‌ام‌ال خام فعال است، پیش‌نمایش صفحه پنهان شده تا امکان حملات مبتنی بر جاوااسکریپت وجود نداشته باشد.''\n\n'''اگر مطمئن هستید که این پیش‌نمایش یک ویرایش مجاز است، آن را تکرار کنید.'''\nاگر تکرار پیش‌نمایش نتیجه نداد، از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
+       "token_suffix_mismatch": "'''ویرایش شما ذخیره نشد، زیرا مرورگر شما نویسه‌های نقطه‌گذاری را در کد امنیتی ویرایش از هم پاشیده‌است.'''\nویرایش شما مردود شد تا از خراب شدن متن صفحه جلوگیری شود.\nگاهی این اشکال زمانی پیش می‌آید که شما از یک پروکسی تحت وب استفاده کنید.",
+       "edit_form_incomplete": "'''بعضی قسمت‌های فرم ویرایش به سرور نرسیدند؛ اطمینان حاصل کنید که ویرایش‌های شما کامل است و دوباره تلاش کنید.'''",
+       "editing": "درئ $1 دۀسکاریۀ مۀکإ",
+       "creating": "ساخت $1",
+       "editingsection": ")در حال ویرایش $1 (بخش",
+       "editingcomment": "در حال ویرایش $1 (بخش تازه)",
+       "editconflict": "تعارض ویرایشی: $1",
+       "explainconflict": "از وقتی ویرایش این صفحه را آغاز کرده‌اید شخص دیگری آن را تغییر داده است.\nناحیهٔ متنی بالایی شامل متن صفحه به شکل کنونی آن است.\nتغییرات شما در ناحیهٔ متنی پایینی نشان داده شده‌است.\nشما باید تغییراتتان را با متن کنونی ترکیب کنید.\nبا فشردن دکمهٔ «{{int:savearticle}}» <strong>فقط</strong> متن ناحیهٔ متنی بالایی ذخیره خواهد شد.",
+       "yourtext": "متن شما",
+       "storedversion": "نسخهٔ ذخیره شده",
+       "nonunicodebrowser": "'''هشدار: مرورگر شما با استانداردهای یونیکد سازگار نیست.'''\nراه حلی به کار گرفته شده تا شما بتوانید صفحات را با امنیت ویرایش کنید: کاراکترهای غیر ASCII به صورت کدهایی در مبنای شانزده به شما نشان داده می‌شوند.",
+       "editingold": "'''هشدار: شما در حال ویرایش نسخه‌ای قدیمی از این صفحه هستید.'''\nاگر ذخیره‌اش کنید، هر تغییری که پس از این نسخه انجام شده‌است از بین خواهد رفت.",
+       "yourdiff": "تفاوت‌ها",
+       "copyrightwarning": "لطفاً توجه داشته‌باشید که همهٔ مشارکت‌ها در {{SITENAME}} منتشرشده تحت $2 در نظر گرفته‌می‌شوند (برای جزئیات بیش‌تر $1 را ببینید).\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش و توزیع شوند؛ بنابراین، آنها را اینجا ارائه نکنید.<br />\nشما همچنین به ما تعهد می‌کنید که خودتان این را نوشته‌اید یا آن را از یک منبع با مالکیت عمومی یا مشابه آزاد آن برداشته‌اید (برای جزئیات بیش‌تر $1 را ببینید).\n<strong>کارهای دارای حق تکثیر را بدون اجازه ارائه نکنید!</strong>",
+       "copyrightwarning2": "لطفاً توجه داشته‌باشید که همهٔ مشارکت‌ها در {{SITENAME}} ممکن است توسط دیگر مشارکت‌کنندگان تغییر یابند، ویرایش یا حذف شوند.\nاگر نمی‌خواهید نوشته‌هایتان بی‌رحمانه ویرایش شوند؛ بنابراین، آنها را اینجا ارائه نکنید.<br />\nشما همچنین به ما تعهد می‌کنید که خودتان این را نوشته‌اید یا آن را از یک منبع با مالکیت عمومی یا مشابه آزاد آن برداشته‌اید ($1 را برای جزئیات بیشتر ببینید).\n<strong>کارهای دارای حق تکثیر را بدون اجازه ارائه نکنید!</strong>",
+       "editpage-cannot-use-custom-model": "مدل محتوای این صفحه نمی‌تواند عوض شود.",
+       "longpageerror": "'''خطا: متنی که ارسال کرده‌اید {{PULAR:$1|یک کیلوبایت|$1 کیلوبایت}} طول دارد. این مقدار از مقدار بیشینهٔ {{PLURAL:$2|یک کیلوبایت|$2 کیلوبایت}} بیشتر است.'''\nنمی‌توان آن را ذخیره کرد.",
+       "readonlywarning": "'''هشدار: پایگاه داده برای نگهداری قفل شده‌است، به همین علت هم‌اکنون نمی‌توانید ویرایش‌هایتان را ذخیره کنید.'''\nاگر می‌خواهید متن را در یک پروندهٔ متنی کپی کنید و برای آینده ذخیره‌اش کنید.\n\nمدیری که آن را قفل کرده این توضیح را ارائه کرده‌است: $1",
+       "protectedpagewarning": "'''هشدار: این صفحه قفل شده‌است تا فقط کاربران با دسترسی مدیریت بتوانند ویرایشش کنند.'''\nآخرین موارد سیاهه در زیر آمده‌است:",
+       "semiprotectedpagewarning": "'''توجه:''' این صفحه قفل شده‌است تا تنها کاربران ثبت‌نام‌کرده قادر به ویرایش آن باشند.\nآخرین موارد سیاهه در زیر آمده‌است:",
+       "cascadeprotectedwarning": "<strong>هشدار:</strong> این صفحه به علت قرارگرفتن در {{PLURAL:$1|صفحهٔ|صفحه‌های}} آبشاری-محافظت‌شدهٔ زیر قفل شده‌است تا فقط مدیران بتوانند ویرایشش کنند.",
+       "titleprotectedwarning": "'''هشدار: این صفحه به شکلی قفل شده‌است که برای ایجاد آن [[Special:ListGroupRights|اختیارات خاصی]] لازم است.'''\nآخرین موارد سیاهه در زیر آمده است:",
+       "templatesused": "{{PLURAL:$1|الگوی|الگوهای}} به‌کاررفته در این صفحه:",
+       "templatesusedpreview": "{{PLURAL:$1|الگوی|الگوهای}} استفاده شده در این پیش‌نمایش:",
+       "templatesusedsection": "{{PLURAL:$1|الگوی|الگوهای}} استفاده شده در این بخش:",
+       "template-protected": "(حفاظت‌ بی)",
+       "template-semiprotected": "(نیمه‌حفاظت‌شده)",
+       "hiddencategories": "این صفحه در {{PLURAL:$1|یک ردهٔ پنهان|$1 ردهٔ پنهان}} قرار دارد:",
+       "nocreatetext": "{{SITENAME}} قابلیت ایجاد صفحه‌های تازه را محدود کرده‌است.\nمی‌توانید بازگردید و صفحه‌ای موجود را ویرایش کنید یا اینکه  [[Special:UserLogin|به سامانه وارد شوید یا حساب کاربری ایجاد کنید]].",
+       "nocreate-loggedin": "شما اجازهٔ ایجاد صفحه‌های تازه را ندارید.",
+       "sectioneditnotsupported-title": "ویرایش بخش‌ها پشتیبانی نمی‌شود",
+       "sectioneditnotsupported-text": "این صفحه از ویرایش بخش‌ها پشتیبانی نمی‌کند.",
+       "permissionserrors": "خطای سطح دسترسی",
+       "permissionserrorstext": "شما اجازهٔ انجام این کار را به این {{PLURAL:$1|دلیل|دلایل}} ندارید:",
+       "permissionserrorstext-withaction": "You do not have permission to $2, for the following {{PLURAL:$1|reason|reasons}}:",
+       "contentmodelediterror": "امکان ویرایش این نسخه برای شما نیست چون نوع محتوای آن <code>$1</code> است و نوع محتوای کنونی صفحه <code>$2</code> است.",
+       "recreate-moveddeleted-warn": "<strong>هشدار: شما در حال ایجاد صفحه‌ای هستید که قبلاً حذف شده‌است.</strong>\n\nدر نظر داشته باشید که آیا ادامهٔ ویرایش این صفحه کار درستی‌است یا نه.\nسیاههٔ حذف و انتقال این صفحه در زیر نشان داده شده‌است:",
+       "moveddeleted-notice": "این صفحه حذف شده‌است.\nدر زیر سیاههٔ حذف و انتقال این صفحه نمایش داده شده‌است.",
+       "moveddeleted-notice-recent": "متاسفانه صفحه قبلا حذف شده‌است (در ۲۴ ساعت اخیر) \nدلیل حذف و سیاههٔ انتقال در پائین موجود است.",
+       "log-fulllog": "مشاهدهٔ سیاههٔ کامل",
+       "edit-hook-aborted": "ویرایش توسط قلاب لغو شد.\nتوضیحی در این مورد داده نشد.",
+       "edit-gone-missing": "امکان به‌روز کردن صفحه وجود ندارد.\nبه نظرمی‌رسد که صفحه حذف شده باشد.",
+       "edit-conflict": "تعارض ویرایشی.",
+       "edit-no-change": "ویرایش شما نادیده گرفته شد، زیرا تغییری در متن داده نشده بود.",
+       "postedit-confirmation-created": "وةڵگة دؤرس بیة",
+       "postedit-confirmation-restored": "صفحه بازیابی شده است.",
+       "postedit-confirmation-saved": "ویرایش شما ذخیره شد.",
+       "edit-already-exists": "امکان ساختن صفحهٔ تازه وجود ندارد.\nاین صفحه از قبل وجود داشته‌است.",
+       "defaultmessagetext": "متن پیش‌فرض پیغام",
+       "content-failed-to-parse": "عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3",
+       "invalid-content-data": "داده محتوای نامعتبر",
+       "content-not-allowed-here": "محتوای «$1» در صفحهٔ [[$2]] مجاز نیست",
+       "editwarning-warning": "خروج از این برگه ممکن است باعث شود که شما هر شانسی که به وجود آورده‌اید را از دست بدهید.\nاگر شما وارد سامانه شده‌اید، می‌توانید این هشدار را در بخش «{{int:prefs-editing}}» ترجیحاتتان غیرفعال کنید.",
+       "editpage-notsupportedcontentformat-title": "فرمت محتوا پشتیبانی نشده",
+       "editpage-notsupportedcontentformat-text": "فرمت محتوای $1 توسط مدل محتوای $2 پشتیبانی نشده‌است.",
+       "content-model-wikitext": "ویکی‌متن",
+       "content-model-text": "متنی ساده",
+       "content-model-javascript": "جاوااسکریپت",
+       "content-json-empty-object": "ابجکت خالی",
+       "content-json-empty-array": "آرایهٔ خالی",
+       "duplicate-args-warning": "<strong>هشدار:</strong> [[:$1]] [[:$2]] را با بیش از یک مقدار برای پارامتر «$3» صدا می‌زند. فقط آخرین مقدار داده شده استفاده خواهد شد.",
+       "duplicate-args-category": "صفحه‌های دارای آرگومان تکراری در فراخوانی الگو",
+       "duplicate-args-category-desc": "صفحاتی که دارای آرگومان تکراری هستند مانند، <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> یا <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
+       "expensive-parserfunction-warning": ".هشدار:''' این صفحه حاوی تعدادی زیادی فراخوانی دستورهای تجزیه‌گر است'''\n\nتعداد آن‌ها باید کمتر از $2 {{PLURAL:$2|،فراخوانی|فراخوانی}} باشد. \nواینک  ،{{PLURAL:$1|فراخوانی|فراخوانی$1}} است",
+       "expensive-parserfunction-category": "صفحه‌هایی که حاوی تعداد زیادی فراخوانی سنگین دستورهای تجزیه‌گر هستند",
+       "post-expand-template-inclusion-warning": "هشدار: الگو بیش از اندازه بزرگ است.\nبرخی الگوها ممکن است شامل نشوند.",
+       "post-expand-template-inclusion-category": "صفحه‌هایی که تعداد الگوهای به‌کاررفته در آن‌ها بیش از اندازه است",
+       "post-expand-template-argument-warning": "'''هشدار:''' این صفحه شامل دست کم یک پارامتر الگو است که بیش از اندازه بزرگ است.\nاین پارامترها نادیده گرفته شدند.",
+       "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-category-desc": "این صفحه از تعداد حداکثر اشکال فراتر رفته است.",
+       "node-count-exceeded-warning": "صفحه از حداکثر تعداد گره فراتر رفته‌است",
+       "expansion-depth-exceeded-category": "صفحه‌هایی که از حداکثر عمق بسط دادن تجاوز کرده‌اند",
+       "expansion-depth-exceeded-category-desc": "رده برای صفحاتی که در آنها از عمق گسترش فراتر رفته است.",
+       "expansion-depth-exceeded-warning": "صفحه حداکثر عمق بسط دادن تجاوز کرد",
+       "parser-unstrip-loop-warning": "حلقه در دستور unstrip پیدا شد",
+       "parser-unstrip-recursion-limit": "از حداکثر ارجاع در دستور unstrip تجاوز شد ($1)",
+       "converter-manual-rule-error": "خطا در قوانین مبدل دستی زبان",
+       "undo-success": "این ویرایش را می‌توان خنثی کرد.\nلطفاً تفاوت زیر را بررسی کنید تا تأیید کنید که این چیزی است که می‌خواهید انجام دهید، سپس تغییرات زیر را ذخیره کنید تا خنثی‌سازی ویرایش را به پایان ببرید.",
+       "undo-failure": "به علت تعارض با ویرایش‌های میانی، این ویرایش را نمی‌توان خنثی کرد.",
+       "undo-norev": "این ویرایش را نمی‌توان خنثی کرد چون وجود ندارد یا حذف شده‌است.",
+       "undo-nochange": "به نظر می‌رسد ویرایش از پیش واگردانی شده است.",
+       "undo-summary": "خنثی‌سازی ویرایش $1 توسط [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])",
+       "undo-summary-username-hidden": "خنثی‌سازی نسخهٔ $1 به دست یک کاربر پنهان‌شده",
+       "cantcreateaccounttitle": "نمی‌توان حساب باز کرد",
+       "cantcreateaccount-text": "امكان ساختن حساب کاربری از این این نشانی آی‌پی ('''$1''') توسط [[User:$3|$3]] سلب شده است.\n\nدلیل ارائه شده توسط $3 چنین است: $2",
+       "cantcreateaccount-range-text": "ایجاد حساب از آدرس آی‌پی در مجموعه‌ی '''$1'''، که شامل آدرس آی‌پی شما ('''$4''') است، توسط [[User:$3|$3]] متوقف شده‌است.\nدلیل ارائه شده توسط $3، $2 است.",
+       "viewpagelogs": "نمایش سیاهه‌های این صفحه",
+       "nohistory": "این صفحه تاریخچهٔ ویرایش ندارد.",
+       "currentrev": "نسخهٔ فعلی",
+       "currentrev-asof": "نسخهٔ کنونی تا $1",
+       "revisionasof": "نؤسخهٔ $1",
+       "revision-info": "Revision as of $1 by {{GENDER:$6|$2}}$7",
+       "previousrevision": "← ورژن کؤئنۀ/قۀدیمی",
+       "nextrevision": "نسخهٔ جدیدتر ←",
+       "currentrevisionlink": "نمایش نسخهٔ فعلی",
+       "cur": "فعلی",
+       "next": "بچؤ نووا/بعدی",
+       "last": "قبلی/دؤمائن",
+       "page_first": "إژ أؤةل",
+       "page_last": "دؤمائن/آخرین",
+       "histlegend": "انتخاب تفاوت: دکمه‌های گرد کنار ویرایش‌هایی که می‌خواهید با هم مقایسه کنید را علامت بزنید و دکمهٔ Enter را بزنید یا دکمهٔ پایین را فشار دهید.<br />\nاختصارات: '''({{int:cur}})''' = تفاوت با نسخهٔ فعلی، '''({{int:last}})''' = تفاوت با نسخهٔ قبلی، '''({{int:minoreditletter}})''' = ویرایش جزئی.",
+       "history-fieldset-title": "مرور تاریخچه",
+       "history-show-deleted": "فقط حذف‌شده",
+       "histfirst": "قدیمی ترین/کۆنەترین",
+       "histlast": "تازه ترین",
+       "historysize": "({{PLURAL:$1|۱ بایت|$1 بایت}})",
+       "historyempty": "(پةتی/حالی)",
+       "history-feed-title": "تاریخچهٔ ویرایش‌ها",
+       "history-feed-description": "تاریخچهٔ ویرایش‌های این صفحه در ویکی",
+       "history-feed-item-nocomment": "$1 در $2",
+       "history-feed-empty": "صفحهٔ درخواست شده وجود ندارد.\nممکن است که از ویکی حذف یا اینکه نامش تغییر داده شده باشد.\nصفحات تازه را برای موارد مرتبط در این ویکی [[Special:Search|جستجو کنید]].",
+       "history-edit-tags": "ویرایش برچسب نسخه‌های انتخاب شده",
+       "rev-deleted-comment": "(خلاصه ویرایش حذف شد)",
+       "rev-deleted-user": "(نام کاربری حذف شد)",
+       "rev-deleted-event": "(جزئیات سیاهه پاک شده)",
+       "rev-deleted-user-contribs": "[نام کاربری یا نشانی آی‌پی حذف شده - ویرایش مخفی شده در مشارکت‌ها]",
+       "rev-deleted-text-permission": "این ویرایش از این صفحه '''حذف شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
+       "rev-suppressed-text-permission": "این ویرایش از این صفحه '''حذف شده‌است'''.\nشما می‌توانید آن را ببینید؛ ممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
+       "rev-deleted-text-unhide": "این ویرایش از این صفحه '''حذف شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.\nشما کماکان می‌توانید در صورت تمایل [$1 این نسخه را ببینید].",
+       "rev-suppressed-text-unhide": "این ویرایش از این صفحه '''فرونشانده شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ فرونشانی] موجود باشد.\nشما کماکان می‌توانید در صورت تمایل [$1 این نسخه را ببینید].",
+       "rev-deleted-text-view": "این ویرایش از این صفحه '''حذف شده‌است'''.\nشما می‌توانید آن را ببینید؛ ممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
+       "rev-suppressed-text-view": "این دةسکاری از این صفحه '''فرونشانی شده‌است'''.\nشما می‌توانید آن را ببینید؛ ممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ فرونشانی] موجود باشد.",
+       "rev-deleted-no-diff": "شما نمی‌توانید این تفاوت را مشاهده کنید زیرا یکی از دو نسخه '''پاک شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
+       "rev-suppressed-no-diff": "شما نمی‌توانید این تفاوت را مشاهده کنید زیرا یکی از نسخه‌ها '''پاک شده‌است'''.",
+       "rev-deleted-unhide-diff": "یکی از دو نسخهٔ این تفاوت '''پاک شده‌است'''.\nممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.\nشما کماکان می‌توانید در صورت تمایل [$1 این تفاوت را ببینید].",
+       "rev-suppressed-unhide-diff": "یکی از ورژن های این تفاوت '''فرونشانی شده‌است'''.\nممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page=سیاههٔ فرونشانی{{FULLPAGENAMEE}}}}] موجود باشد.\nشما کماکان می‌توانید در صورت تمایل [$1 این تفاوت را ببینید].",
+       "rev-deleted-diff-view": "یکی از نسخه‌های این تفاوت '''پاک شده‌است'''.\nشما می‌توانید این تفاوت را ببینید؛ ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
+       "rev-suppressed-diff-view": "یکی از نسخه‌های این تفاوت '''فرونشانی شده‌است'''.\nشما می‌توانید این تفاوت را ببینید؛ ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ فرونشانی] موجود باشد.",
+       "rev-delundel": "نمایش/ئاشاردن",
+       "rev-showdeleted": "نیشان دائن",
+       "revisiondelete": "حذف/احیای نسخه‌ها",
+       "revdelete-nooldid-title": "نسخهٔ هدف مجاز نیست",
+       "revdelete-nooldid-text": "شما نسخه‌های هدف را برای انجام این عمل مشخص نکرده‌اید یا این نسخه‌ها وجود ندارند، یا این که شما می‌خواهید آخرین ورژن را پنهان کنید.",
+       "revdelete-no-file": "فایل مشخص شده وجود ندارد.",
+       "revdelete-show-file-confirm": "آیا مطمئن هستید که می‌خواهید یک نسخهٔ پاک شده از پروندهٔ «<nowiki>$1</nowiki>» مورخ $2 ساعت $3 را ببینید؟",
+       "revdelete-show-file-submit": "أرێ-بةلئ",
+       "revdelete-selected-text": "{{PLURAL:$1|نسخهٔ انتخاب‌شده|نسخه‌های انتخابی}} [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|نسخهٔ انتخاب‌شدهٔ|نسخه‌های انتخابی}} [[:$2]]:",
+       "logdelete-selected": "{{PLURAL:$1|مورد|موارد}} انتخاب شده از سیاهه:",
+       "revdelete-text-text": "مشخصات ورژن های حذف شده همچنان در تاریخچه صفحه نمایان خواهد بود ولی دسترسی به قسمت‌هایی از محتویات این نسخه‌ها برای عموم ممکن نخواهد بود.",
+       "revdelete-text-file": "نسخه‌های پاک شده همچنان در تاریخچهٔ پرونده نمایان خواهد بود ولی قسمت‌هایی از محتویات آن‌ها برای عموم غیرقابل دسترس خواهد بود.",
+       "logdelete-text": "ورژن های حذف‌شده همچنان در سیاهه‌های نمایان خواهد بود ولی قسمت‌هایی از محتویات آن‌ها غیرقابل دسترس برای عموم خواهد بود.",
+       "revdelete-text-others": "سایر مدیران هنوز می‌توانند این محتوای پنهان را ببینند و از همین راه موارد حذف شده را احیا کنند، مگر آن که محدودیت‌های دیگری اعمال گردد.",
+       "revdelete-confirm": "خواهشا تأیید کنید که می‌خواهید این کار را انجام دهید، عواقب آن را درک می‌کنید و این کار را طبق [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
+       "revdelete-suppress-text": "فرونشانی باید '''تنها''' برای موارد زیر استفاده شود:\n* اطلاعات به طور بالقوه افتراآمیز\n* اطلاعات نامناسب شخصی\n*: ''نشانی منزل، شماره تلفن، کد ملی و غیره.''",
+       "revdelete-legend": "تنظیم محدودیت‌های پیدایی",
+       "revdelete-hide-text": "متن نسخه",
+       "revdelete-hide-image": "نهفتن محتویات فایل",
+       "revdelete-hide-name": "نهفتن متغییرها و هدف",
+       "revdelete-hide-comment": "خلاصة دةسکاری",
+       "revdelete-hide-user": "نام کاربری/نشانی آی‌پی",
+       "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": "'''پیدایی ورژن ها قابل به روز کردن نیست:'''\n$1",
+       "logdelete-success": "تغییر پیدایی مورد با موفقیت انجام شد.",
+       "logdelete-failure": "'''پیدایی سیاهه‌ها قابل تنظیم نیست:'''\n$1",
+       "revdel-restore": "تغییر پیدایی",
+       "pagehist": "تاریخ وةڵگة",
+       "deletedhist": "تاریخچهٔ پاک شده",
+       "revdelete-hide-current": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه، ورژن اخیر است و قابل پنهان کردن نیست.",
+       "revdelete-show-no-access": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
+       "revdelete-modify-no-access": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: این نسخه علامت «محدودیت» دارد و شما به آن دسترسی ندارید.",
+       "revdelete-modify-missing": "خطا در پنهان کردن مورد شمارهٔ $1: این نسخه در پایگاه داده وجود ندارد!",
+       "revdelete-no-change": "'''هشدار:''' مورد مورخ $2 ساعت $1 از پیش تنظیمات پیدایی درخواست شده را دارا بود.",
+       "revdelete-concurrent-change": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: به نظر می‌رسد که در مدتی که شما برای تغییر وضعیت آن تلاش می‌کردید وضعیت آن توسط فرد دیگری تغییر یافته است.\nخواهشا سیاهه‌ها را بررسی کنید.",
+       "revdelete-only-restricted": "خطا در پنهان کردن مورد مورخ $2 ساعت $1: شما نمی‌توانید موارد را از دید مدیران پنهان کنید مگر آن که یکی دیگر از گزینه‌های پنهان‌سازی را نیز انتخاب کنید.",
+       "revdelete-reason-dropdown": "*دلایل متداول حذف\n** نقض حق تکثیر\n** اظهار نظر یا اطلاعات فردی نامناسب\n** نام کاربری نامناسب\n** اطلاعات به طور بالقوه افتراآمیز",
+       "revdelete-otherreason": ":دلیل دیگر/اضافی",
+       "revdelete-reasonotherlist": "دلیل دیگر",
+       "revdelete-edit-reasonlist": "دةسکاری دلایل حذف",
+       "revdelete-offender": "نویسنده ورژن:",
+       "suppressionlog": "سیاههٔ فرونشانی",
+       "suppressionlogtext": "در زیر فهرستی از آخرین حذف‌ها و قطع دسترسی‌هایی که حاوی محتوایی هستند که از مدیران پنهان شده‌اند را می‌بینید.\nبرای مشاهدهٔ فهرستی از قطع دسترسی‌های فعال [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.",
+       "mergehistory": "یکی کردن تاریخچه صفحات",
+       "mergehistory-header": "این صفحه به شما این امکان را می‌دهد که نسخه‌های تاریخچهٔ یک مقاله را با یک مقاله دیگر ادغام کنید.\nاطمینان حاصل کنید که این تغییر به توالی زمانی ویرایش‌ها لطمه نخواهد زد.",
+       "mergehistory-box": "ادغام ورژنهای دو صفحه:",
+       "mergehistory-from": "صفحهٔ مبدأ:",
+       "mergehistory-into": "صفحهٔ مقصد:",
+       "mergehistory-list": "تاریخچهٔ قابل ادغام",
+       "mergehistory-merge": "ورژن های زیر از [[:$1]] قابل ادغام با [[:$2]] هستند.\nاز ستون دکمه‌های رادیویی استفاده کنید تا نسخه‌هایی را که تا قبل از زمانی مشخص ایجاد شده‌اند انتخاب کنید.\nتوجه کنید که کلیک روی پیوندها سبب بازگشت ستون به حالت اولیه می‌شود.",
+       "mergehistory-go": "نمایش تاریخچه قابل ادغام",
+       "mergehistory-submit": "ادغام ورژن ها",
+       "mergehistory-empty": "هیچ‌یک از ورژن ها قابل ادغام نیستند.",
+       "mergehistory-done": "$3 نسخه از $1 در {{PLURAL:$3|ادغام شد}}به [[:$2]].",
+       "mergehistory-fail": "ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.",
+       "mergehistory-fail-toobig": "نمی‌توان ادغام تاریخچه را انجام داد که بیشتر از محدودیت $1 {{PLURAL:$1|نسخه}} انتقال داده خواهد شد.",
+       "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": ":دةلیل",
+       "mergelog": "سیاههٔ ادغام",
+       "revertmerge": "واگردانی ادغام",
+       "mergelogpagetext": "در زیر سیاههٔ آخرین موارد ادغام تاریخچهٔ یک صفحه در صفحه‌ای دیگر را می‌بینید.",
+       "history-title": "Revision history of \"$1\"",
+       "difference-title": "\"$1\" تفاوت بین نسخه‌ها",
+       "difference-title-multipage": "$1 و $2: تفاوت بین صفحات",
+       "difference-multipage": "(تفاوت بین صفحات)",
+       "lineno": ": خط $1",
+       "compareselectedversions": "مقایسهٔ ورژن های انتخاب‌شده",
+       "showhideselectedversions": "تغییر پدیداری ورژن های انتخاب‌شده",
+       "editundo": "خنثی کردن",
+       "diff-empty": "(بدون تفاوت)",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} by the same user not shown)",
+       "diff-multi-otherusers": "({{PLURAL:$1|۱ نسخهٔ میانی|$1 نسخه‌ٔ میانی}} ویرایش شده توسط {{PLURAL:$2|۱ کاربر|$2 کاربر}} نشان داده نشده)",
+       "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} ورژن میانی ویرایش شده توسط بیش از {{PLURAL:$2|یک|$2}} کاربر نشان داده نشده است)",
+       "difference-missing-revision": "{{PLURAL:$2|یإ گِلة دةسکاری|$2 دةسکاری}} إژ تفاوت ($1) {{PLURAL:$2|پیدا نؤیة |پیدا نؤیة}}.\n\nمعمولا در اثر پیوند به تاریخچه به روز نشده صفحه حذف شده است .\nمیتوانید جزئیات بیشتر را از    [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]  پیدا کنید.",
+       "searchresults": "نتایج مِنِی کردن",
+       "searchresults-title": "\"نتایج جستجو برای \"$1",
+       "titlematches": "تطبیق عنوان مقاله",
+       "textmatches": "تطبیق متن مقاله",
+       "notextmatches": "متن هیچ مقاله‌ای مطابقت ندارد",
+       "prevn": "تای قبلی{{PLURAL:$1|$1}}",
+       "nextn": "تای بعدی{{PLURAL:$1|$1}}",
+       "prev-page": "صفحهٔ قبلی",
+       "next-page": "وةڵگة تِر/بعدی",
+       "prevn-title": "پيشتر $1 {{PLURAL:$1|نتيجه|نتيجةل}}",
+       "nextn-title": "Next $1 {{PLURAL:$1|result|results}}",
+       "shown-title": "نمایش$1 {{PLURAL:$1|نتیجه|نتایج}} وۀ هۀر وۀلگۀ",
+       "viewprevnext": "($3)($2 {{int:pipe-separator}} $1)نمایش",
+       "searchmenu-exists": " {{PLURAL:$2|0=|همچنین نتایج جستجوی دیگری را ببینید.}} '''صفحه‌ای با عنوان  \"[[:$1]]\" در این ویکی وجود دارد.'''",
+       "searchmenu-new": "<strong>صفحهٔ «[[:$1]]» را در این ویکی بسازید!</strong> {{PLURAL:$2|0=همچنین صفحهٔ یافت‌شده با جستجویتان را ببینید.|همچنین نتایج جستجوی یافت‌شده را ببینید.}}",
+       "searchprofile-articles": "وۀلگۀ محتوایی",
+       "searchprofile-images": "چندرسانه‌ای",
+       "searchprofile-everything": "کؤل چئ",
+       "searchprofile-advanced": "پیشرفتۀ",
+       "searchprofile-articles-tooltip": "جستجو در $1",
+       "searchprofile-images-tooltip": "مِنِی کردن پۀروۀندۀل",
+       "searchprofile-everything-tooltip": "مِنِی کردن کؤل محتوا) (شاملا وۀلگۀل گۀپ و قسۀ",
+       "searchprofile-advanced-tooltip": "جستجو در فضاهای نام دلخواه",
+       "search-result-size": "$1 ({{PLURAL:$2|1 واژۀ|$2 واژۀل}})",
+       "search-result-category-size": "{{PLURAL:$1|یک عضو|$1 عضو}} ({{PLURAL:$2|یک زیررده|$2 زیررده}}، {{PLURAL:$3|یک پرونده|$3 پرونده}})",
+       "search-redirect": "(تغییرمسیر $1)",
+       "search-section": "(بۀخش $1)",
+       "search-category": "(رده  $1)",
+       "search-file-match": "(تشابه محتوی پرونده)",
+       "search-suggest": "نۀظۀرتان یۀ بیۀ: $1",
+       "search-rewritten": "نمایش نتایج $1. جستجوی به جای $2.",
+       "search-interwiki-caption": "پروژةل خۆئة",
+       "search-interwiki-default": "نتایج از $1 :",
+       "search-interwiki-more": "(فرةتر)",
+       "search-relatedarticle": "مرتبط",
+       "searchrelated": "مرتبط",
+       "searchall": "کؤل",
+       "showingresults": "نمایش حداکثر {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} در پایین، آغاز از شماره '''$2'''.",
+       "showingresultsinrange": "نمایش در پائین تا {{PLURAL:$1|<strong>1</strong> نتیجه|<strong>$1</strong> نتیجه}} در محدودهٔ #<strong>$2</strong> تا #<strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$4|نتایج <strong>$1</strong> از <strong>$3</strong>|نتایج <strong>$1 - $2</strong> از <strong>$3</strong>}}",
+       "search-nonefound": ".نتیجه گإ هؤمۀ إگرۀکتانۀ  پئانؤی",
+       "search-nonefound-thiswiki": "نتیجه‌ای منطبق با این درخواست در این وب‌گاه موجود نبود.",
+       "powersearch-legend": "مِنِی کردن پیشرفته",
+       "powersearch-ns": "جستجو در فضاهای نام:",
+       "powersearch-togglelabel": "بررسی:",
+       "powersearch-toggleall": "کۆل",
+       "powersearch-togglenone": "هؤیچ کام",
+       "powersearch-remember": "انتخاب را برای جستجوهای بعدی به خاطر داشته‌باش",
+       "search-external": "جستجوی خارجی",
+       "searchdisabled": "جستجو در {{SITENAME}} فعال نیست.\nموقتاً می‌توانید از جستجوی Google استفاده کنید.\nتوجه کنید که نتایج حاصل از جستجو با آن روش ممکن است به‌روز نباشند.",
+       "search-error": "خطایی هنگام جست‌وجو رخ داده است: $1",
+       "preferences": "تمارزوةل/ترجیحات",
+       "mypreferences": "تمارزوةل/ترجیحات",
+       "prefs-edits": "تعداد دةسکاریةل:",
+       "prefsnologintext2": "خواهشمند است برای تغییر تنظیمات‌تان وارد شوید.",
+       "prefs-skin": "پوسته",
+       "skin-preview": "پیش‌نمایش",
+       "datedefault": "بدون ترجیح",
+       "prefs-labs": "گزینه‌های آزمایشی",
+       "prefs-user-pages": "وةڵگةل کاربۀری",
+       "prefs-personal": "داده‌های کاربر",
+       "prefs-rc": "تۀغیرۀل/ئالشتیۀل ایسۀ",
+       "prefs-watchlist": "لیست پی‌گیریۀل",
+       "prefs-editwatchlist": "ویرایش فهرست پی‌گیری‌ها",
+       "prefs-editwatchlist-label": "ویرایش همه فهرست پیگیری‌هایتان:",
+       "prefs-editwatchlist-edit": "دیدن و حذف عنوان‌ها از فهرست پیگیری‌هایتان",
+       "prefs-editwatchlist-raw": "ویرایش فهرست خام پیگیری‌ها",
+       "prefs-editwatchlist-clear": "پاک کردن فهرست پیگیری‌هایتان",
+       "prefs-watchlist-days": "تعداد روزهایی که باید در فهرست پی‌گیری‌ها نمایش داده شود:",
+       "prefs-watchlist-days-max": "حداکثر $1 {{PLURAL:$1|روز}}",
+       "prefs-watchlist-edits": "تعداد ویرایش‌های نشان‌داده‌شده در فهرست پی‌گیری‌های گسترش‌یافته:",
+       "prefs-watchlist-edits-max": "حداکثر تعداد: ۱۰۰۰",
+       "prefs-watchlist-token": "رمز فهرست پی‌گیری:",
+       "prefs-misc": "متفرقه",
+       "prefs-resetpass": "تغییردائن رمز",
+       "prefs-changeemail": "تغییر یا حذف نشانی ایمیل",
+       "prefs-setemail": "تنظیم آدرس ایمیل",
+       "prefs-email": "گزینه‌های ایمیل",
+       "prefs-rendering": "نمایش صفحه",
+       "saveprefs": "ذخیرۀ",
+       "restoreprefs": "برگرداندن تمام تنظیمات پیش‌فرض (در تمامی قسمت‌ها)",
+       "prefs-editing": "دةسکاری کردن",
+       "rows": "تعداد سطرها:",
+       "columns": "تعداد ستون‌ها:",
+       "searchresultshead": "گئردین/مهِ نی",
+       "stub-threshold": "آستانهٔ ویرایش پیوندهای ناقص ($1):",
+       "stub-threshold-sample-link": "نمونه",
+       "stub-threshold-disabled": "غیرفعال‌سازی/إ کار کةتن",
+       "recentchangesdays": "تعداد روزهای نمایش داده‌شده در تغییرات اخیر:",
+       "recentchangesdays-max": "حداکثر $1 {{PLURAL:$1|روز}}",
+       "recentchangescount": ":تعداد پیش‌فرض ویرایش‌های نمایش یافته",
+       "prefs-help-recentchangescount": "این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.",
+       "prefs-help-watchlist-token2": "این کلید رمز خوراک وب فهرست پی‌گیری‌های شماست.\nهرکس آن را بداند می‌تواند فهرست پی‌گیری‌هایتان را بخواند، بنابراین آن را به اشتراک نگذارید. [[Special:ResetTokens|اگر لازم است آن را تغییر دهید اینجا را کلیک کنید]].",
+       "savedprefs": "ترجیحات شما ذخیره شد.",
+       "savedrights": "دسترسی کاربری {{GENDER:$1|$1}} ذخیره شده‌است.",
+       "timezonelegend": "منطقه زمانی:",
+       "localtime": "زمان محلی:",
+       "timezoneuseserverdefault": "استفاده از پیش‌فرض ویکی ($1)",
+       "timezoneuseoffset": "دیگر (اختلاف را مشخص کنید)",
+       "servertime": "زمان سرور:",
+       "guesstimezone": "از مرورگر گرفته شود",
+       "timezoneregion-africa": "ئافریقا",
+       "timezoneregion-america": "ئامریکا",
+       "timezoneregion-antarctica": "قطب جنوبی",
+       "timezoneregion-arctic": "قطب شمالی",
+       "timezoneregion-asia": "ئاسیا",
+       "timezoneregion-atlantic": "اقیانوس اطلس",
+       "timezoneregion-australia": "ئۆسترالیا",
+       "timezoneregion-europe": "اؤرووپا",
+       "timezoneregion-indian": "اؤقیانووس هند",
+       "timezoneregion-pacific": "اؤقیانوس آرام",
+       "allowemail": "امکان دریافت ایمیل از دیگر کاربران",
+       "prefs-searchoptions": "گئردین/مهِ نی",
+       "prefs-namespaces": "فضای نامۀل",
+       "default": "پیش‌فرض",
+       "prefs-files": "فایل",
+       "prefs-custom-css": "سی‌اس‌اس شخصی",
+       "prefs-custom-js": "جاوااسکریپت شخصی",
+       "prefs-common-css-js": "سی‌اس‌اس/جاوااسکریپت مشترک برای تمام پوسته‌ها:",
+       "prefs-reset-intro": "شما می‌توانید از این صفحه برای بازگرداندن تنظیمات خود به پیش‌فرض تارنما استفاده کنید.\nاین کار بازگشت‌ناپذیر است.",
+       "prefs-emailconfirm-label": "تأیید ایمیل:",
+       "youremail": "ایمیل:",
+       "username": "{{GENDER:$1|نام کاربری}}:",
+       "prefs-memberingroups": "{{GENDER:$2|أندوم}}  {{PLURAL:$1|دةسة|دةسةل}}:",
+       "prefs-registration": "زمان ثبت‌نام:",
+       "yourrealname": ":نام ڕاسکانی",
+       "yourlanguage": ":زوون",
+       "yourvariant": "گویش زبان محتوا:",
+       "prefs-help-variant": "گویش انتخابی شما برای نمایش محتوای صفحه‌ها در این ویکی",
+       "yournick": "امضای تازه:",
+       "prefs-help-signature": "نظرهای نوشته‌شده در صفحهٔ بحث باید با «<nowiki>~~~~</nowiki>» امضا شوند؛ این علامت به‌صورت خودکار به امضای شما و مهر تاریخ تبدیل خواهد شد.",
+       "badsig": "امضای خام نامجاز.\nلطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.",
+       "badsiglength": "امضای شما بیش از اندازه طولانی است.\nامضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.",
+       "yourgender": "ترجیح می‌دهید چگونه توصیف شوید؟",
+       "gender-unknown": "هنگام ذکر شما، نرم‌افزار تا جای ممکن از کلمات خنثی از نظر جنسیت استفاده خواهد",
+       "gender-male": "پیا",
+       "gender-female": "ژن",
+       "prefs-help-gender": "انجام این تنظیم اختیاری است.\nنرم‌افزار از این مقدار برای اشارهٔ صحیح به جنسیت و ذکر شما برای دیگران با استفاده از دستور زبان درست استفاده می‌کند.\nاین اطلاعات عمومی خواهند بود.",
+       "email": "ایمیل",
+       "prefs-help-realname": "نام واقعی اختیاری است.\nاگر وارد شده است هنگام ارجاع به آثارتان و انتساب آن‌ها به شما ممکن است از نام واقعی‌تان استفاده شود.",
+       "prefs-help-email": "آدرس ایمیل اختیاری است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.",
+       "prefs-help-email-others": "شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما ایمیل ارسال کنند.\nآدرس ایمیل شما زمانی که دیگران با شما تماس بگیرند فاش نمی‌شود.",
+       "prefs-help-email-required": "آدرس ایمیل اجباری است.",
+       "prefs-info": "اطلاعات اولیه",
+       "prefs-i18n": "بین‌المللی‌سازی",
+       "prefs-signature": "امضا",
+       "prefs-dateformat": "آرایش تاریخ",
+       "prefs-timeoffset": "فاصلهٔ زمانی",
+       "prefs-advancedediting": "تنظیمات عمومی",
+       "prefs-editor": "دةسکاری کةر",
+       "prefs-preview": "پیش‌نمایش",
+       "prefs-advancedrc": "گزینه‌های پیشرفته",
+       "prefs-advancedrendering": "گزینه‌های پیشرفته",
+       "prefs-advancedsearchoptions": "گزینه‌های پیشرفته",
+       "prefs-advancedwatchlist": "گزینه‌های پیشرفته",
+       "prefs-displayrc": "گزینه‌های نمایش",
+       "prefs-displaywatchlist": "گزینه‌های نمایش",
+       "prefs-tokenwatchlist": "نیشانة",
+       "prefs-diffs": "تفاوت‌ها",
+       "prefs-help-prefershttps": "تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.",
+       "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
+       "prefs-tabs-navigation-hint": "نکته: شما می توانید از کلیدهای جهت‌نمای چپ و راست برای حرکت بین زبانه‌ها در فهرست زبانه‌ها استفاده کنید.",
+       "userrights": "مدیریت اختیارات کاربر",
+       "userrights-lookup-user": "مدیریت گروه‌های کاربری",
+       "userrights-user-editname": "یک نام کاربری وارد کنید:",
+       "editusergroup": "ویرایش گروه‌های کاربری",
+       "editinguser": "تغییر اختیارات کاربری کاربر {{GENDER:$1|کاربر}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "ویرایش گروه‌های کاربری",
+       "saveusergroups": "ثبت گروه‌های کاربری",
+       "userrights-groupsmember": "عضو:",
+       "userrights-groupsmember-auto": "عضو ضمنی:",
+       "userrights-groups-help": "شما می‌توانید گروه‌هایی را که کاربر در آن قرار دارد تغییر دهید:\n* جعبهٔ علامت‌خورده نشانهٔ بودن کاربر در آن گروه است.\n* جعبهٔ خالی نشانهٔ نبودن کاربر در آن گروه است.\n* علامت * به این معنی‌است که اگر آن گروه را بیفزایید نمی‌توانید بعداً برش دارید، و برعکس.",
+       "userrights-reason": ":دةلیل",
+       "userrights-no-interwiki": "شما اجازهٔ تغییر اختیارات کاربران دیگر ویکی‌ها را ندارید.",
+       "userrights-nodatabase": "پایگاه دادهٔ $1 وجود ندارد یا محلی نیست.",
+       "userrights-nologin": "شما باید با یک حساب کاربری مدیر [[Special:UserLogin|به سامانه وارد شوید]] تا بتوانید اختیارات کاربران را تعیین کنید.",
+       "userrights-notallowed": "شما مجوز برای افزودن یا حذف حقوق کاربر را ندارید.",
+       "userrights-changeable-col": "گروه‌هایی که می‌توانید تغییر دهید",
+       "userrights-unchangeable-col": "گروه‌هایی که نمی‌توانید تغییر دهید",
+       "userrights-conflict": "تعارض دسترسی‌های کاربری! لطفاً بررسی کنید و تغییرات را تأیید کنید.",
+       "userrights-removed-self": "شما با موفقیت دسترسی‌های خود را واستاندید. به این ترتیب شما دیگر به این صفحه دسترسی ندارید.",
+       "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": "ربات",
+       "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}}:مدیرةل",
+       "grouppage-bureaucrat": "{{ns:project}}:دیوان‌سالاران",
+       "grouppage-suppress": "{{ns:project}}:فرونشانی",
+       "right-read": "خؤةنِن وةڵگةل",
+       "right-edit": ".دةسکاری وةڵگةل",
+       "right-createpage": "ایجاد صفحه (در مورد صفحه‌های غیر بحث)",
+       "right-createtalk": "یجاد صفحه‌های بحث",
+       "right-createaccount": "ایجاد حساووةل کاربةری",
+       "right-minoredit": "علامت زدن ویرایش‌ها به عنوان جزئی",
+       "right-move": "جاوواز کردن وةڵگة",
+       "right-move-subpages": "انتقال صفحات به همراه زیر‌صفحات‌شان",
+       "right-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
+       "right-move-categorypages": "انتقال صفحهٔ رده",
+       "right-movefile": "انتقال پرونده‌ها",
+       "right-suppressredirect": "انتقال صفحه بدون ایجاد تغییرمسیر از نام قبلی",
+       "right-upload": "بارنیائن فایلۀل",
+       "right-reupload": "بارگذاری دوبارهٔ پرونده‌ای که از قبل وجود دارد",
+       "right-reupload-own": "بارگذاری دوبارهٔ پرونده‌ای که پیش از این توسط همان کاربر بارگذاری شده‌است",
+       "right-reupload-shared": "باطل‌کردن محلی پرونده‌های مشترک",
+       "right-upload_by_url": "ارگذاری پرونده از یک نشانی اینترنتی",
+       "right-purge": "پاک‌کردن میانگیر صفحه بدون مشاهدهٔ صفحهٔ تأیید",
+       "right-autoconfirmed": "از محدودیت‌های سرعت آی‌پی‌-محور تاثیر نمی‌گیرد",
+       "right-bot": "تلقی‌شده به عنوان یک فرآیند خودکار",
+       "right-nominornewtalk": "ویرایش جزئی صفحه‌های بحث به شکلی که باعث اعلان پیغام تازه نشود",
+       "right-apihighlimits": "سقف بالاتر استفاده از API",
+       "right-writeapi": " نؤیسائنAPIاستفادۀ إژ",
+       "right-delete": "حۀذف وةڵگةل",
+       "right-bigdelete": "حذف صفحه‌های دارای تاریخچهٔ بزرگ",
+       "right-deletelogentry": "حذف و احیای مدخل‌های خاصی از سیاهه",
+       "right-deleterevision": "حذف و احیای نسخه‌های خاصی از صفحه",
+       "right-deletedhistory": "مشاهدهٔ موارد حذف‌شده از تاریخچه، بدون دیدن متن آن‌ها",
+       "right-deletedtext": "مشاهدهٔ متن حذف‌شده و تغییرات بین نسخه‌های حذف‌شده",
+       "right-browsearchive": "جستجوی صفحه‌های حذف‌شده",
+       "right-undelete": "بازگردانی ئئ وةڵگة",
+       "right-suppressrevision": "مشاهده  و احیای ویرایش‌هایی که از کاربران پنهان شده‌اند",
+       "right-viewsuppressed": "مشاهده نسخه‌هایی که از کاربران مخفی شده‌اند",
+       "right-suppressionlog": "مشاهدهٔ سیاهه‌های خصوصی",
+       "right-block": "قطع دسترسی ویرایشی دیگر کاربران",
+       "right-blockemail": "قطع دسترسی دیگر کاربران برای ارسال ایمیل",
+       "right-hideuser": "قطع دسترسی کاربر و پنهان کردن آن از دید عموم",
+       "right-ipblock-exempt": "تاثیر نپذیرفتن از قطع دسترسی‌های آی‌پی، خودکار یا فاصله‌ای",
+       "right-proxyunbannable": "تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسی‌ها",
+       "right-unblockself": "بازکردن دسترسی خود",
+       "right-protect": "تغییر میزان محافظت صفحات و ویرایش صفحات محافظت‌شده آبشاری",
+       "right-editprotected": "ویرایش صفحه‌های محافظت‌شده به عنوان «{{int:protect-level-sysop}}»",
+       "right-editsemiprotected": "ویرایش صفحه حفاظت‌شده به عنوان \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "ویرایش مدل محتوای یک صفحه",
+       "right-editinterface": "ویرایش واسط کاربری",
+       "right-editusercssjs": "ویرایش صفحه‌های CSS و JS دیگر کاربرها",
+       "right-editusercss": "ویرایش صفحه‌های CSS دیگر کاربرها",
+       "right-edituserjs": "ویرایش صفحه‌های JS دیگر کاربرها",
+       "right-editmyusercss": "پرونده‌های سی‌اس‌اس کاربری خود را ویرایش کنید",
+       "right-editmyuserjs": "پرونده‌های جاوااسکریپت کاربری خود را ویرایش کنید",
+       "right-viewmywatchlist": "فهرست پیگیری‌های خود را ببینید",
+       "right-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید. توجه داشته باشید برخی از اقدامات حتی بدون این دسترسی هم صفحات را اضافه می‌کنند.",
+       "right-viewmyprivateinfo": "داده‌های خصوصی خود را ببینید (مانند آدرس ایمیل و نام واقعی)",
+       "right-editmyprivateinfo": "داده‌های خصوصی خود را ویرایش کنید (مانند آدرس ایمیل و نام واقعی)",
+       "right-editmyoptions": "ویرایش ترجیحات خود",
+       "right-rollback": "واگردانی سریع ویرایش‌های آخرین کاربری که یک صفحه را ویرایش کرده‌است",
+       "right-markbotedits": "علامت زدن ویرایش‌های واگردانی‌شده به عنوان ویرایش ربات",
+       "right-noratelimit": "تاثیر نپذیرفتن از محدودیت سرعت",
+       "right-import": "واردکردن صفحه از ویکی‌های دیگر",
+       "right-importupload": "واردکردن صفحه از طریق بارگذاری پرونده",
+       "right-patrol": "گشت زدن به ویرایش‌های دیگران",
+       "right-autopatrol": "گشت زدن خودکار ویرایش‌های خودش",
+       "right-patrolmarks": "مشاهدهٔ برچسب گشت تغییرات اخیر",
+       "right-unwatchedpages": "مشاهدهٔ فهرست صفحه‌هایی که پی‌گیری نمی‌شوند",
+       "right-mergehistory": "ادغام تاریخچهٔ صفحات",
+       "right-userrights": "ویرایش تمام اختیارات کاربرها",
+       "right-userrights-interwiki": "ویرایش اختیارات کاربرهای ویکی‌های دیگر",
+       "right-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
+       "right-override-export-depth": "برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵",
+       "right-sendemail": "ارسال ایمیل به دیگر کاربران",
+       "right-passwordreset": "مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه",
+       "right-managechangetags": "ایجاد و حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
+       "right-applychangetags": "تائید [[Special:Tags|برچسب]] بر روی تغییرات یک نفر",
+       "right-changetags": "افزودن یا حذف [[Special:Tags|برچسب]] قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
+       "newuserlogpage": "سیاههٔ ایجاد کاربر",
+       "newuserlogpagetext": "این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.",
+       "rightslog": "سیاههٔ اختیارات کاربر",
+       "rightslogtext": "این سیاههٔ تغییرات اختیارات کاربر است.",
+       "action-read": "خؤةنِن ئئ وةڵگة",
+       "action-edit": "ئئ وةڵگۀ دةسکاری کةن",
+       "action-createpage": "دورس کردن وةڵگة",
+       "action-createtalk": "ایجاد صفحه‌های بحث",
+       "action-createaccount": "ایجاد این حساب کاربری",
+       "action-history": "مشاهده تاریخچه این صفحه",
+       "action-minoredit": "علامت زدن این ویرایش به عنوان جزئی",
+       "action-move": "جاوواز کردن ئئ وۀلگۀ",
+       "action-move-subpages": "انتقال این صفحه و زیرصفحه‌های آن",
+       "action-move-rootuserpages": "انتقال صفحه‌های کاربری سرشاخه",
+       "action-move-categorypages": "انتقال صفحهٔ رده",
+       "action-movefile": "جاوواز کردن ئئ وۀلگۀ",
+       "action-upload": "بارگذاری این پرونده",
+       "action-reupload": "نوشتن روی این پرونده موجود",
+       "action-reupload-shared": "باطل کردن این پرونده روی یک مخزن مشترک",
+       "action-upload_by_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": "واردکردن صفحه از ویکی‌های دیگر",
+       "action-importupload": "واردکردن صفحه از طریق بارگذاری پرونده",
+       "action-patrol": "گشت زدن ویرایش دیگران",
+       "action-autopatrol": "گشت زدن ویرایش خودتان",
+       "action-unwatchedpages": "مشاهدهٔ صفحه‌های پی‌گیری نشده",
+       "action-mergehistory": "ادغام تاریخچهٔ این صفحه",
+       "action-userrights": "ادغام تاریخچهٔ این صفحه",
+       "action-userrights-interwiki": "ویرایش اختیارات کاربری کاربران یک ویکی دیگر",
+       "action-siteadmin": "قفل‌کردن و بازکردن پایگاه داده‌ها",
+       "action-sendemail": "ایمیل کِل کۀ",
+       "action-editmywatchlist": "فهرست پیگیری‌های خود را ویرایش کنید",
+       "action-viewmywatchlist": "فهرست پیگیری‌های خود را ببینید",
+       "action-viewmyprivateinfo": "اطلاعات خصوصی خود را ببینید",
+       "action-editmyprivateinfo": "اطلاعات خصوصی خود را ویرایش کنید",
+       "action-editcontentmodel": "ویرایش مدل محتوای یک صفحه",
+       "action-managechangetags": "ایجاد و حذف تگ‌ها از پایگاه داده",
+       "action-applychangetags": "اعمال برچسب بر روی تغییرات شما",
+       "action-changetags": "افزودن یا حذف برچسب قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
+       "nchanges": "$1 {{PLURAL:$1|تغییرةل|تغییر}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|از آخرین بازدید}}",
+       "enhancedrc-history": "تاریخچه",
+       "recentchanges": "تۀغیرۀل/ئالشتیۀل ایسۀ",
+       "recentchanges-legend": "گزینه‌های تغییرات اخیر",
+       "recentchanges-summary": ".آخرین تغییرۀل ویکی ئۀ ئئ وۀلگۀ پی‌گیری کۀن",
+       "recentchanges-noresult": "هیچ تغییری در طول دورهٔ تعیین‌شده با این معیارها هم‌خوانی نداشت.",
+       "recentchanges-feed-description": "آخرین تغییرات ویکی را در این خوراک پی‌گیری کنید.",
+       "recentchanges-label-newpage": "ئئ دۀسکاریۀ وۀلگۀ تازه ساختئ",
+       "recentchanges-label-minor": "یة دةسکاری جزئیکة",
+       "recentchanges-label-bot": "ئئ دۀسکاری یۀ رباتئ انجؤم دائه",
+       "recentchanges-label-unpatrolled": "این ویرایش هنوز گشت‌زنی نشده است",
+       "recentchanges-label-plusminus": "حجم وۀلگۀ به اندازه این مقدار بایت تغییر یافته است",
+       "recentchanges-legend-heading": "'''اختصارۀل:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (همچنین به [[Special:NewPages|فهرست صفحات تازه]] نگاه کنید)",
+       "recentchanges-submit": "نیشان دائن",
+       "rcnotefrom": "در زیر تغییرات از <strong>$3, $4</strong> (تا <strong>$1</strong> {{PLURAL:$5|نشان داده شده‌است|نشان داده شده‌اند}}).",
+       "rclistfrom": "نمایش تغییرات تازه با شروع از $3 $2",
+       "rcshowhideminor": "$1 دۀسکاریۀل جزئی",
+       "rcshowhideminor-show": "نیشان دائن",
+       "rcshowhideminor-hide": "ئآشاردن-پنهان کردن",
+       "rcshowhidebots": "$1 ربات‌ها",
+       "rcshowhidebots-show": "نیشان دائن",
+       "rcshowhidebots-hide": "ئآشاردن-پنهان کردن",
+       "rcshowhideliu": "$1 کاربرۀل نام نؤیسی کِریا",
+       "rcshowhideliu-show": "نیشان دائن",
+       "rcshowhideliu-hide": "ئآشاردن-پنهان کردن",
+       "rcshowhideanons": "$1 کاربرۀل ناشنا",
+       "rcshowhideanons-show": "نیشان دائن",
+       "rcshowhideanons-hide": "ئآشاردن-پنهان کردن",
+       "rcshowhidepatr": "$1 ویرایش‌های گشت‌خورده",
+       "rcshowhidepatr-show": "نیشان دائن",
+       "rcshowhidepatr-hide": "ئآشاردن-پنهان کردن",
+       "rcshowhidemine": "$1 ویرایش‌ۀل ووژِم",
+       "rcshowhidemine-show": "نیشان دائن",
+       "rcshowhidemine-hide": "ئآشاردن-پنهان کردن",
+       "rcshowhidecategorization": "$1 رده‌بندی صفحه‌ها",
+       "rcshowhidecategorization-show": "نیشان دائن",
+       "rcshowhidecategorization-hide": "ئآشاردن-پنهان کردن",
+       "rclinks": "نمایش آخرین $1 تغییر در $2 روز اخیر<br />$3",
+       "diff": "تفاوت",
+       "hist": "تاریخچۀ",
+       "hide": "ئآشاردن-پنهان کردن",
+       "show": "نیشان دائن",
+       "minoreditletter": "جز",
+       "newpageletter": "نو",
+       "boteditletter": "ر",
+       "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": "نمایش جزئیات",
+       "rc-enhanced-hide": "نهفتن جزئیات",
+       "rc-old-title": "ایجادشده با عنوان اصلی «$1»",
+       "recentchangeslinked": "تغییرۀل مرتبط",
+       "recentchangeslinked-feed": "تغییرات مرتبط",
+       "recentchangeslinked-toolbox": "تغییرۀ مرتبط",
+       "recentchangeslinked-title": "تغییرات مرتبط با $1",
+       "recentchangeslinked-summary": "در زیر فهرستی از تغییرات اخیر صفحه‌های پیوند داده شده از این صفحه (یا اعضای رده مورد نظر) را می‌بینید.\nصفحه‌هایی که در [[Special:Watchlist|فهرست پی‌گیری‌هایتان]] باشند به صورت '''پررنگ''' نشان داده می‌شوند.",
+       "recentchangeslinked-page": ":نام وةڵگة",
+       "recentchangeslinked-to": "نمایش تغییرات صفحه‌هایی که به صفحهٔ داده‌شده پیوند دارند",
+       "recentchanges-page-added-to-category": "[[:$1]] اضافة بیة رده/ڕِزگ",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر به رده اضافه شدند",
+       "recentchanges-page-removed-from-category": "[[:$1]] إژ رده/ڕِزگ حةذف بی",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|یک صفحه|$2 صفحه}}ٔ دیگر از رده حذف شدند",
+       "autochange-username": "تغییرات خودکار مدیاویکی",
+       "upload": "بارنیائن فایل",
+       "uploadbtn": "بارنیائن فایل",
+       "reuploaddesc": "بازگشت به فرم بارگذاری",
+       "upload-tryagain": "ارسال توضیحات تغییر یافته پرونده",
+       "uploadnologin": "إ سیستم نِهةتئة/نِهاتئة",
+       "uploadnologintext": "برای بارگذاری پرونده باید $1.",
+       "upload_directory_missing": "شاخهٔ بارگذاری ($1) وجود ندارد و قابل ایجاد نیست.",
+       "upload_directory_read_only": "شاخهٔ بارگذاری ($1) از طرف سرور وب قابل نوشتن نیست.",
+       "uploaderror": "خطای بارگذاری",
+       "upload-recreate-warning": "'''هشدار: پرونده‌ای با این نام حذف یا منتقل شده است.'''\n\nبرای راحتی، سیاههٔ حذف و انتقال برای این صفحه در زیر آمده است:",
+       "uploadtext": "از فرم زیر برای بارگذاری کردن پرونده‌های جدید استفاده کنید.\nبرای دیدن پرونده‌هایی که قبلاً بارگذاری شده‌اند به [[Special:FileList|فهرست پرونده‌ها]] بروید. بارگذاری نیز مجدد در [[Special:Log/upload|سیاههٔ بارگذاری‌ها]] و حذف پرونده‌ها در [[Special:Log/delete|deletion log]] ثبت می‌شود.\n\nبعد از این که پرونده‌ای را بارگذاری کردید، به این سه شکل می‌توانید آن را در صفحات استفاده کنید:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' برای استفاده از نسخه کامل پرونده\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' برای استفاده از یک نسخه ۲۰۰ پیکسلی از پرونده درون یک جعبه در سمت چپ متن که عبارت alt text در آن به عنوان توضیح استفاده شده\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' برای ایجاد یک پیونده مستقیم به پرونده بدون نمایش پرونده",
+       "upload-permitted": "{{PLURAL:$2|نوع|انواع}} پرونده مجاز: $1.",
+       "upload-preferred": "{{PLURAL:$2|نوع|انواع}} پرونده ترجیح‌داده شده: $1.",
+       "upload-prohibited": "{{PLURAL:$2|نوع|انواع}} پرونده نامجاز: $1.",
+       "uploadlogpage": "سیاههٔ بارگذاری‌ها",
+       "uploadlogpagetext": "فهرست زیر فهرستی از آخرین بارگذاری پرونده‌ها است.\nبرای مرور دیداری [[Special:NewFiles|نگارخانهٔ پرونده‌های جدید]] را ببینید.",
+       "filename": "نام پرونده",
+       "filedesc": ":خلاصه",
+       "fileuploadsummary": "خلاصه:",
+       "filereuploadsummary": "تغییرات پرونده:",
+       "filestatus": "وضعیت حق تکثیر:",
+       "filesource": ":بِنچۀک/مۀنبۀع",
+       "ignorewarning": "چشم‌پوشی از هشدار و ذخیرهٔ پرونده.",
+       "ignorewarnings": "چشم‌پوشی از همهٔ هشدارها",
+       "minlength1": "نام پرونده دست کم باید یک حرف باشد.",
+       "illegalfilename": "نام پرونده «$1» نویسه‌هایی را شامل می‌شود که در نام صفحات مجاز نیستند.\nلطفاً نام پرونده را تغییر دهید و آن را دوباره بارگذاری کنید.",
+       "filename-toolong": "نام پرونده نباید از ۲۴۰ بایت طولانی‌تر باشد.",
+       "badfilename": "نام پرونده به «$1» تغییر کرد.",
+       "filetype-mime-mismatch": "پسوند پرونده «$1.‎» با نوع MIME آن ($2) مطابقت ندارد.",
+       "filetype-badmime": "پرونده‌هایی که نوع MIME آن‌ها $1 باشد برای بارگذاری مجاز نیستند.",
+       "filetype-bad-ie-mime": "این پرونده را نمی‌توانید بارگذاری کنید زیرا اینترنت اکسپلورر آن را به عنوان «$1» تشخیص می‌دهد، که یک نوع پروندهٔ نامجاز و احتمالاً خطرناک است.",
+       "filetype-unwanted-type": "'''«‎.‎$1»''' یک نوع پرونده ناخواسته است.\n{{PLURAL:$3|نوع پرونده ترجیح داده شده|انواع پرونده ترجیح داده شده}} از این قرار است: $2 .",
+       "filetype-banned-type": "&lrm;'''\".$1\"''' {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواعی پروندهٔ نامجاز هستند}}.\n{{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.",
+       "filetype-missing": "این پرونده پسوند (مثلاً «‎.jpg») ندارد.",
+       "empty-file": "پرونده‌ای که ارسال کردید خالی بود.",
+       "file-too-large": "پرونده‌ای که ارسال کردید بیش از اندازه بزرگ بود.",
+       "filename-tooshort": "نام پرونده بیش از اندازه کوتاه است.",
+       "filetype-banned": "این نوع پرونده ممنوع است.",
+       "verification-error": "پرونده از آزمون تأیید پرونده گذر نکرد.",
+       "hookaborted": "تغییری که می‌خواستید ایجاد کنید توسط یک قلاب افزونه خاتمه ناگهانی داده شد.",
+       "illegal-filename": "نام پرونده مجاز نیست.",
+       "overwrite": "نوشتن روی یک پرونده موجود مجاز نیست.",
+       "unknown-error": "خطای ناشناخته‌ای رخ داد.",
+       "tmp-create-error": "امکان ساخت پرونده موقت وجود نداشت.",
+       "tmp-write-error": "خطا در نوشتن پرونده موقت.",
+       "large-file": "توصیه می‌شود که پرونده‌ها بزرگتر از $1 نباشند؛\nاندازهٔ این پرونده $2 است.",
+       "largefileserver": "این پرونده از اندازه‌ای که سرور پیکربندی شده تا بپذیرد بزرگتر است.",
+       "emptyfile": "پروندهٔ بارگذاری‌شده خالی به نظر می‌رسد.\nاین مشکل ممکن است به علت خطای تایپی در نام پرونده باشد.\nلطفاً تأیید کنید که می‌خواهید این پرونده را با همین شرایط بارگذاری کنید.",
+       "windows-nonascii-filename": "این ویکی از نام پرونده با نویسه‌های خاص پشتیبانی نمی‌کند.",
+       "fileexists": "پرونده‌ای با همین نام از قبل موجود است، اگر مطمئن {{GENDER:|نیستید}} که می‌خواهید آن پرونده را تغییر دهید، لطفاً <strong>[[:$1]]</strong> را بررسی کنید.\n[[$1|thumb]]",
+       "filepageexists": "صفحهٔ توضیح برای این پرونده از قبل در <strong>[[:$1]]</strong> ایجاد شده‌است، اما پرونده‌ای با این نام وجود ندارد.\nخلاصه‌ای که وارد می‌کنید در صفحهٔ توضیح نمایش نخواهد یافت.\nبرای آن که خلاصه شما نمایش یابد، باید آن را به صورت دستی ویرایش کنید.\n[[$1|thumb]]",
+       "fileexists-extension": "پرونده‌ای با نام مشابه وجود دارد: [[$2|thumb]]\n* نام پرونده‌ای که بارگذاری می‌کردید: <strong>[[:$1]]</strong>\n* نام پرونده‌ای که از قبل موجود بود: <strong>[[:$2]]</strong>\nمی‌خواهید بیش از یک نام متمایز استفاده کنید؟",
+       "fileexists-thumbnail-yes": "به نظر می‌رسد که این پرونده، یک تصویر کوچک شده (''بندانگشتی'' یا ''thumbnail'') باشد.\n[[$1|thumb]]\nلطفاً پروندهٔ <strong>[[:$1]]</strong> را بررسی کنید.\nاگر پرونده‌ای که بررسی کردید، همین تصویر در اندازهٔ اصلی‌اش است، نیازی به بارگذاری یک نسخهٔ بندانگشتی اضافه نیست.",
+       "file-thumbnail-no": "نام پرونده با <strong>$1</strong> آغاز می‌شود.\nبه نظر می‌رسد که این پرونده، یک تصویر ''بندانگشتی'' ''(thumbnail)'' از تصویر بزرگتر اصلی باشد.\nاگر تصویر با اندازهٔ اصلی را دارید، آن را بارگذاری کنید؛ در غیر این صورت، نام پرونده را تغییر دهید.",
+       "fileexists-forbidden": "در حال حاضر، پرونده‌ای به همین نام وجود دارد، و قابل رونویسی نیست.\nاگر هم‌چنان می‌خواهید که پروندهٔ خود را بارگذاری کنید، لطفاً برگردید و نام دیگری استفاده کنید.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "در حال حاضر، پرونده‌ای با همین نام در انبارهٔ مشترک پرونده‌ها وجود دارد.\nاگر هنوز می‌خواهید پرونده خود را بار کنید، لطفاً برگردید و پروندهٔ موردنظر خود را با نام دیگری بار کنید.\n[[File:$1|thumb|center|$1]]",
+       "file-exists-duplicate": "به نظر می‌رسد این پرونده نسخه‌ای تکراری از {{PLURAL:$1|پروندهٔ|پرونده‌های}} زیر باشد:",
+       "file-deleted-duplicate": "یک پرونده نظیر این پرونده ([[:$1]]) قبلاً حذف شده‌است.\nشما باید تاریخچهٔ حذف آن پرونده را قبل از بارگذاری مجدد آن ببینید.",
+       "file-deleted-duplicate-notitle": "یک پرونده یکسان بااین پرونده قبلاً حذف شده است و عنوان متوقف شده‌است.\nشما باید از کسی که دسترسی مشاهدهٔ پرونده متوقف شده را دارد، درخواست کنید تا شرایط را قبل از بارگذاری مجدد بررسی کند.",
+       "uploadwarning": "هشدار بارگذاری",
+       "uploadwarning-text": "لطفاً توضیحات پرونده را در زیر تغییر دهید و دوباره تلاش کنید.",
+       "savefile": "ذخیرهٔ پرونده",
+       "uploaddisabled": "بارگذاری غیرفعال است.",
+       "copyuploaddisabled": "بارگذاری از طریق نشانی اینترنتی غیرفعال است.",
+       "uploaddisabledtext": "امکان بارگذاری پرونده غیرفعال است.",
+       "php-uploaddisabledtext": "بارگذاری پرونده‌های پی‌اچ‌پی غیرفعال است.\nلطفاً تنظیمات file_uploads را بررسی کنید.",
+       "uploadscripted": "این صفحه حاوی کد اچ‌تی‌ام‌ال یا اسکریپتی است که ممکن است به‌نادرست توسط مرورگر وب تفسیر شود.",
+       "upload-scripted-pi-callback": "نمی‌توان یک پرونده شامل دستورالعمل پردازش استایل‌شیت اکس‌ام‌ال بارگذاری کرد.",
+       "uploaded-script-svg": "عنصر قابل برنامه‌ریزی «$1» در پرونده بارگذاری اس‌وی‌جی یافت شد.",
+       "uploaded-hostile-svg": "سی‌اس‌اس نا امن در عنصر سبک پروندهٔ بارگذاری شدهٔ اس‌وی‌جی یافت شد.",
+       "uploaded-event-handler-on-svg": "قرار دادن ویژگی‌های مدیریت رویداد <code>$1=\"$2\"</code> در پرونده‌های اس‌وی‌جی مجاز نیست.",
+       "uploaded-href-attribute-svg": "ویژگی‌های href <code>&lt;$1 $2=\"$3\"&gt;</code> با هدف غیر محلی (برای نمونه، http://, javascript:, etc) در پرونده‌های اس‌وی‌جی مجاز نیست.",
+       "uploaded-href-unsafe-target-svg": "در پرونده SVG بارگذاری‌شده برای هدف نادرست <code>&lt;$1 $2=\"$3\"&gt;</code> برچسب href یافت شد.",
+       "uploaded-animate-svg": "برچسب  \"animate\" یافت شده ممکن است herf را تغییر دهد. از مشخصه \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> در پرونده SVG بارگذاری‌شده استفاده کنید.",
+       "uploaded-setting-event-handler-svg": "تنظیمات مشخصه گرداننده رویداد بسته شده‌است. کد <code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده بارگذاری‌شده یافت شد.",
+       "uploaded-setting-href-svg": "استفاده از برچسب \"set\" برای افزودن مشخصهٔ \"href\" به عنصر والد بسته شده",
+       "uploaded-wrong-setting-svg": "استفاده از برچسب \"set\" برای افزودن remote/data/script هدف برای هر مشخصهٔ بسته شده در پرونده SVG بارگذاری شده <code>&lt;set to=\"$1\"&gt;</code> یافت شد.",
+       "uploaded-setting-handler-svg": "پرونده SVG تنظیم شده با مشخصهٔ \"handler\"  با remote/data/script بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
+       "uploaded-remote-url-svg": "پرونده SVG تنظیم شده با remote URL بسته شده‌است. در پروندهٔ بارگذاری‌شده <code>$1=\"$2\"</code> یافت شد.",
+       "uploaded-image-filter-svg": "پالایه پرونده در نشانی:<code>&lt;$1 $2=\"$3\"&gt;</code>  در پرونده SVG بارگذاری‌شده یافت شد.",
+       "uploadscriptednamespace": "این پوشه اس‌وی‌جی شامل فضای نام غیرقانونی '$1' است",
+       "uploadinvalidxml": "XML در پروندهٔ بارگذاری‌شده نمی‌تواند تجزیه شود.",
+       "uploadvirus": "این پرونده ویروس دارد!\nجزئیات : $1",
+       "uploadjava": "این پرونده یک پرونده زیپ است که حاوی پرونده‌ای از نوع ‎‎.class جاوا است.\nبارگذاری پرونده‌های جاوا مجاز نیست، چرا که ممکن است اجازه دور زدن محدودیت‌های امنیتی را بدهند.",
+       "upload-source": "پرونده منبع",
+       "sourcefilename": ":نام اصلی وةڵگة",
+       "sourceurl": " : url بن چۀک",
+       "destfilename": "نام پروندهٔ مقصد:",
+       "upload-maxfilesize": "حداکثر اندازهٔ پرونده: $1",
+       "upload-description": "توضیحات پرونده",
+       "upload-options": "گزینه‌های بارگذاری",
+       "watchthisupload": "پی‌گیری این پرونده",
+       "filewasdeleted": "پرونده‌ای با همین نام پیشتر بارگذاری و پس از آن پاک شده‌است.\nشما باید $1 را قبل از بارگذاری مجدد آن ببینید.",
+       "filename-thumb-name": "به نظر می رسد که عنوان thumbnail است. لطفاً تصویر thumbnail  از دیگر ویکی‌ها را بارگذاری نکنید. عنوان پرونده را اصلاح کنید به صورتی که پیشوند thumbnail نداشته باشد.",
+       "filename-bad-prefix": "نام پرونده‌ای که بارگذاری می‌کنید با '''$1''' آغاز می‌شود که یک پیشوند مخصوص تصاویر ثبت شده توسط دوربین‌های دیجیتال است.\nلطفاً نامی بهتر برای پرونده برگزینید.",
+       "upload-success-subj": "بارگذاری با موفقیت انجام شد",
+       "upload-success-msg": "بارگذاری شما از [$2] موفق بود. این پرونده در اینجا قابل دسترسی است: [[:{{ns:file}}:$1]]",
+       "upload-failure-subj": "مشکل در بارگذاری",
+       "upload-failure-msg": "مشکلی در بارگذاری شما از [$2] وجود داشت:\n\n$1",
+       "upload-warning-subj": "هشدار بارگذاری",
+       "upload-warning-msg": "فرم بارگذاری مشکلی داشت [$2]. شما می‌توانید به [[Special:Upload/stash/$1|فرم بارگذاری]] بازگردید تا این اشکال را رفع کنید.",
+       "upload-proto-error": "پروتکل نادرست",
+       "upload-proto-error-text": "بارگذاری از دوردست به نشانی‌هایی که با <code dir=ltr>http://</code> یا <code dir=ltr>ftp://</code> آغاز شوند نیاز دارد.",
+       "upload-file-error": "خطای داخلی",
+       "upload-file-error-text": "هنگام تلاش برای ایجاد یک پروندهٔ  موقت در سرور یک خطای داخلی رخ داد.\nلطفاً با یک [[Special:ListUsers/sysop|مدیر]] تماس بگیرید.",
+       "upload-misc-error": "خطای نامعلوم در بارگذاری",
+       "upload-misc-error-text": "هنگام بارگذاری، خطایی نامعلوم رخ داد.\nلطفاً اطمینان حاصل کنید که نشانی اینترنتی معتبر و قابل دسترسی است و بعد دوباره تلاش کنید.\nاگر مشکل همچنان برقرار بود با یکی از [[Special:ListUsers/sysop|مدیران]] تماس بگیرید.",
+       "upload-too-many-redirects": "نشانی اینترتی حاوی تعداد بیش از اندازه‌ای تغییرمسیر است",
+       "upload-http-error": "یک خطای اچ‌تی‌تی‌پی رخ داد: $1",
+       "upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
+       "upload-dialog-title": "بارنیائن فایل",
+       "upload-dialog-button-cancel": "ئآهووسانن/لغو",
+       "upload-dialog-button-done": "انجؤم بی",
+       "upload-dialog-button-save": "ذخیرۀ",
+       "upload-dialog-button-upload": "بارگذاری بی",
+       "upload-form-label-select-file": "فایلئ انتخاب کۀ",
+       "upload-form-label-infoform-title": "جزئیات",
+       "upload-form-label-infoform-name": "نؤم",
+       "upload-form-label-infoform-description": "توضیحةل",
+       "upload-form-label-usage-title": "کاربرد",
+       "upload-form-label-usage-filename": "نؤم فایل",
+       "foreign-structured-upload-form-label-own-work": "یة کار ووژمة",
+       "foreign-structured-upload-form-label-infoform-categories": "رده ها/ڕِزگةل",
+       "foreign-structured-upload-form-label-infoform-date": "تاریخ",
+       "foreign-structured-upload-form-label-own-work-message-local": "تائید می کنم که این پرونده را تحت مجوزها و سیاست‌های {{SITENAME}} بارگذاری می‌کنم.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "اگر امکان بارگذاری پرونده تحت سیاست‌های {{SITENAME}} را ندارید، لطفاً این پنجره را ببندید و از روش‌های دیگر استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "ممکن بخواهید از [[Special:Upload|پنجرهٔ بارگذاری پیش‌فرض]] استفاده کنید.",
+       "foreign-structured-upload-form-label-own-work-message-default": "متوجهم که این پرونده را بر روی مخزن مشترک بارگذاری می‌کنم و تائید می‌کنم که تحت سیاست‌ها و مجوزهای آنجا عمل می‌کنم.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "اگر امکان بارگذاری پرونده تحت سیاست‌ها و مجوزهای مخزن اشتراک‌گذاری را ندارید، لطفاً این پنجره را ببندید و از روش‌های دیگر استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "در صورتی که نمی‌شود پرونده را تحت سیاست‌ها بارگذاری کنید ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "تصدیق می‌کنم که مالک حق تکثیر این پرونده هستم و موافق اشتراک‌گذاری آن تحت مجوز [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] هستم و موافق [https://wikimediafoundation.org/wiki/Terms_of_Use سیاست نحوهٔ استفاده] هستم.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "اگر مالک حق تکثیر این پرونده نیستید یا قصد بارگذاری تحت مجوز دیگری دارید، از [https://commons.wikimedia.org/wiki/Special:UploadWizard جادوگر بارگذاری ویکی‌انبار] استفاده کنید.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "در صورتی که سایت امکان بارگذاری پرونده را تحت سیاست‌ها بارگذاری می‌دهد ممکن است بخواهید از [[Special:Upload|پنجرهٔ بارگذاری در {{SITENAME}}]] استفاده کنید.",
+       "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-describe": "نمی‌توان فرادادهٔ پروندهٔ «$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 وجود نداشت چرا که سطح دسترسی کافی نیست یا شاخه/محفظهٔ مورد نظر وجود ندارد.",
+       "filejournal-fail-dbconnect": "امکان وصل شدن به پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.",
+       "filejournal-fail-dbquery": "امکان به روز کردن پایگاه داده دفترخانه برای پشتیبان ذخیره‌سازی «$1» وجود نداشت.",
+       "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-acquire": "امکان گرفتن قفل‌های سرور $1 وجود ندارد.",
+       "lockmanager-fail-svr-release": "امکان باز کردن قفل‌های سرور $1 وجود ندارد.",
+       "zip-file-open-error": "در هنگام باز کردن پرونده زیپ برای بررسی محتوای آن خطایی رخ داد.",
+       "zip-wrong-format": "پرونده مشخص شده یک پرونده زیپ نیست.",
+       "zip-bad": "پرونده زیپ خراب یا غیر قابل خواندن است.\nنمی‌توان محتوای آن را از نظر امنیت به درستی بررسی کرد.",
+       "zip-unsupported": "پرونده زیپ از ویژگی‌هایی استفاده می‌کند که توسط مدیاویکی پشتیبانی نمی‌شوند.\nنمی‌توان محتوای آن را از نظر امنیت به درستی بررسی کرد.",
+       "uploadstash": "انبار بارگذاری",
+       "uploadstash-summary": "این صفحه دسترسی به پرونده‌هایی که بارگذاری شده‌اند (یا در حال بارگذاری هستند) اما هنوز در ویکی منتشر نشده‌اند را فراهم می‌کند. این پرونده‌ها توسط هیچ کاربری به جز کسی که آن‌ها را بارگذاری کرده قابل دیدن نیستند.",
+       "uploadstash-clear": "پاک‌کردن پرونده‌های انبارشده",
+       "uploadstash-nofiles": "شما هیچ پروندهٔ انبارشده‌ای ندارید.",
+       "uploadstash-badtoken": "انجام این اقدام ناموفق بود، احتمالاً به این دلیل که اعتبار ویرایش شما به اتمام رسیده است. دوباره امتحان کنید.",
+       "uploadstash-errclear": "پاک‌کردن پرونده‌ها ناموفق بود.",
+       "uploadstash-refresh": "تازه کردن فهرست پرونده‌ها",
+       "invalid-chunk-offset": "جابجایی نامعتبر قطعه",
+       "img-auth-accessdenied": "منع دسترسی",
+       "img-auth-nopathinfo": "PATH_INFO موجود نیست.\nسرور شما برای ردکردن این مقدار تنظیم نشده‌است.\nممکن است مبتنی بر سی‌جی‌آی باشد و از img_auth پشتیبانی نکند.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization را ببینید.",
+       "img-auth-notindir": "مسیر درخواست شده در شاخهٔ بارگذاری تنظیم‌شده قرار ندارد.",
+       "img-auth-badtitle": "امکان ایجاد یک عنوان مجاز از «$1» وجود ندارد.",
+       "img-auth-nologinnWL": "شما به سامانه وارد نشده‌اید و «$1» در فهرست سفید قرار ندارد.",
+       "img-auth-nofile": "پرونده «$1» وجود ندارد.",
+       "img-auth-isdir": "شما تلاش کرده‌اید به شاخهٔ «$1» دسترسی پیدا کنید.\nتنها دسترسی به پرونده مجاز است.",
+       "img-auth-streaming": "در حال جاری ساختن «$1».",
+       "img-auth-public": "عملکرد img_auth.php برونداد پرونده‌ها از یک ویکی خصوصی است.\nاین ویکی به عنوان یک ویکی عمومی تنظیم شده‌است.\nبرای امنیت بهینه، img_auth.php غیرفعال است.",
+       "img-auth-noread": "کاربر دسترسی خواندن «$1» را ندارد.",
+       "http-invalid-url": "نشانی نامعتبر: $1",
+       "http-invalid-scheme": "نشانی‌های اینترنتی با طرح «$1» پشتیبانی نمی‌شوند.",
+       "http-request-error": "درخواست اچ‌تی‌تی‌پی به علت خطایی ناشناخته، ناموفق بود.",
+       "http-read-error": "خطای خواندن اچ‌تی‌تی‌پی.",
+       "http-timed-out": "مهلت درخواست اچ‌تی‌تی‌پی به سر رسید.",
+       "http-curl-error": "خطا در آوردن نشانی اینترنتی: $1",
+       "http-bad-status": "در حین درخواست اچ‌تی‌تی‌پی خطایی رخ داد: $1 $2",
+       "upload-curl-error6": "دسترسی به نشانی اینترنتی ممکن نشد",
+       "upload-curl-error6-text": "نشانی اینترنتی داده شده قابل دسترسی نیست.\nلطفاً درستی آن و اینکه تارنما برقرار است را بررسی کنید.",
+       "upload-curl-error28": "مهلت بارگذاری به سر رسید",
+       "upload-curl-error28-text": "این تارنما بیش از اندازه در پاسخ تعلل کرد.\nلطفاً بررسی کنید که آیا تارنما فعال و برخط است یا نه، سپس لختی درنگ کنید و دوباره تلاش نمایید.\nشاید بد نباشد که در زمان خلوت‌تری دوباره تلاش کنید.",
+       "license": "اجازه‌نامه:",
+       "license-header": "اجازه‌نامه",
+       "nolicense": "هیچ کدام انتخاب نشده‌است",
+       "licenses-edit": "گزینه‌های مجوز ویرایش",
+       "license-nopreview": "(پیش‌نمایش وجود ندارد)",
+       "upload_source_url": "(شما یک پرونده انتخاب از یک URL معتبر و دسترس عموم انتخاب کردید)",
+       "upload_source_file": "(پرونده‌ای از رایانهٔ شما انتخاب شده‌است)",
+       "listfiles-delete": "حۀذف کردن/پاک کردن",
+       "listfiles-summary": "این صفحهٔ ویژه تمام پرونده‌های بارگذاری‌شده را نمایش می‌دهد.",
+       "listfiles_search_for": "جستجو به دنبال نام پرونده چندرسانه‌ای:",
+       "listfiles-userdoesnotexist": "حساب کاربری «$1» ثبت نشده‌است.",
+       "imgfile": "فایل",
+       "listfiles": "فهرست پرونده‌ها",
+       "listfiles_thumb": "چنه کلئکی/گؤجۀر بی",
+       "listfiles_date": "تاریخ",
+       "listfiles_name": "نؤم",
+       "listfiles_user": "کاربۀر",
+       "listfiles_size": "اندازۀ",
+       "listfiles_description": "توضیحةل",
+       "listfiles_count": "نسخه‌ها",
+       "listfiles-show-all": "شامل نسخه‌های قدیمی عکس‌ها",
+       "listfiles-latestversion": "نسخهٔ فعلی",
+       "listfiles-latestversion-yes": "أرێ-بةلئ",
+       "listfiles-latestversion-no": "نة-نةخئر",
+       "file-anchor-link": "فایل",
+       "filehist": "تاریخ پۀروۀندۀ",
+       "filehist-help": ".روی تاریخ/زمان‌ها کلیک کنید تا نسخهٔ مربوط به آن هنگام را ببینید",
+       "filehist-deleteall": "حذف کۆل",
+       "filehist-deleteone": "حۀذف کردن/پاک کردن",
+       "filehist-revert": "واگردانی/گِلآ دائن",
+       "filehist-current": "نؤسخهٔ ایسه",
+       "filehist-datetime": "تاریخ/وۀخت",
+       "filehist-thumb": "چنه کلئکی/گؤجۀر بی",
+       "filehist-thumbtext": "عۀسگ بندانگشتی/چنۀ کلک إژ نؤسخهٔ مورخ $1",
+       "filehist-nothumb": "فاقد بندانگشتی",
+       "filehist-user": "کاربۀر",
+       "filehist-dimensions": "ابعاد",
+       "filehist-filesize": "قاووارۀ-اندازۀ پرؤندۀ",
+       "filehist-comment": "توضیح",
+       "imagelinks": "استفادۀ إژ پۀروۀنده",
+       "linkstoimage": "ژئر پیوندۀ دِرِنإ ئئ عۀسگۀ{{PLURAL:$1|وۀلگۀل$1|وۀلگۀ}}",
+       "linkstoimage-more": "بیش از $1 صفحه به این پرونده پیوند {{PLURAL:$1|دارد|دارند}}.\nفهرست زیر تنها {{PLURAL:$1|اولین پیوند|اولین $1 پیوند}} به این صفحه را نشان می‌دهد.\n[[Special:WhatLinksHere/$2|فهرست کامل]] نیز موجود است.",
+       "nolinkstoimage": ".این پرونده در هیچ صفحه‌ای به کار نرفته‌است",
+       "morelinkstoimage": "[[Special:WhatLinksHere/$1|پیوندهای دیگر]] به این پرونده را ببینید.",
+       "linkstoimage-redirect": "$1 (تغییرمسیر پرونده) $2",
+       "duplicatesoffile": "{{PLURAL:$1|پروندهٔ|پرونده‌های}} زیر نسخهٔ تکراری این پرونده {{PLURAL:$1|است|هستند}} ([[Special:FileDuplicateSearch/$2|اطلاعات بیشتر]]):",
+       "sharedupload": "این پرونده در $1 قرار دارد و ممکن است در دیگر پروژه‌ها هم استفاده شود.",
+       "sharedupload-desc-there": "این پرونده در $1 قرار دارد و ممکن است در دیگر پروژه‌ها هم استفاده شود.\nبرای اطلاعات بیشتر لطفاً [$2 صفحهٔ توضیحات پرونده] را ببینید.",
+       "sharedupload-desc-here": "این پرونده در $1 قرار دارد و ممکن است در پروژه‌های دیگر هم استفاده شود.\nتوضیحات موجود در [$2 صفحهٔ توضیحات پرونده در آنجا]، در زیر نشان داده شده‌است.",
+       "sharedupload-desc-edit": "این پرونده از $1 است و می‌تواند توسط پروژه‌های دیگر هم استفاده شود.\nاگر خواستید می‌توانید توضیحات پرونده را از [$2 صفحهٔ توضیحاتش] در آنجا ویرایش کنید.",
+       "sharedupload-desc-create": "این پرونده از $1 است و می‌تواند توسط پروژه‌های دیگر هم استفاده شود.\nاگر خواستید می‌توانید توضیحات پرونده را از [$2 صفحهٔ توضیحاتش] در آنجا ویرایش کنید.",
+       "filepage-nofile": "پرونده‌ای با این نام وجود ندارد.",
+       "filepage-nofile-link": "پرونده‌ای با این نام وجود ندارد، اما شما می‌توانید آن را [$1 بارگذاری کنید].",
+       "uploadnewversion-linktext": "بارگذاری نسخهٔ جدیدی از پرونده",
+       "shared-repo-from": "إژ $1",
+       "shared-repo": "یک مخزن مشترک",
+       "shared-repo-name-wikimediacommons": "ویکی‌انبار",
+       "upload-disallowed-here": "متأسفانه شما نمی‌توانید این پرونده را بازنویس کنید.",
+       "filerevert": "واگردانی $1",
+       "filerevert-legend": "واگردانی پرونده",
+       "filerevert-intro": "شما در حال واگردانی '''[[Media:$1|$1]]''' به [$4 نسخهٔ مورخ $2 ساعت $3] هستید.",
+       "filerevert-comment": ":دةلیل",
+       "filerevert-defaultcomment": "واگردانی به نسخهٔ $1 ساعت $2 ($3)",
+       "filerevert-submit": "بچۆ",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> به [$4 نسخهٔ مورخ $2 ساعت $3] واگردانده شد.",
+       "filerevert-badversion": "نسخهٔ قدیمی‌تری از این پرونده وجود نداشت.",
+       "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": "*دلایل متداول حذف\n** نقض حق تکثیر\n** پروندهٔ تکراری",
+       "filedelete-edit-reasonlist": "ویرایش دلایل حذف",
+       "filedelete-maintenance": "حذف و احیای پرونده‌ها در مدت نگهداری به طور موقت غیرفعال است.",
+       "filedelete-maintenance-title": "نمی‌تواند پرونده را حذف کند",
+       "mimesearch": "جستجوی بر اساس MIME",
+       "mimesearch-summary": "با کمک این صفحه شما می‌توانید پرونده‌هایی که یک نوع MIME به خصوص دارند را پیدا کنید.\nورودی: به صورت contenttype/subtype یا contenttype/*&lrm;، نظیر <code>image/jpeg</code>.",
+       "mimetype": "نوع MIME:",
+       "download": "گرتن-دانڵوود",
+       "unwatchedpages": "صفحه‌های پی‌گیری‌نشده",
+       "listredirects": "فهرست صفحه‌های تغییرمسیر",
+       "listduplicatedfiles": "فهرست همهٔ پرونده‌ها به‌همراه تکراری‌ها",
+       "listduplicatedfiles-summary": "این فهرست پرونده‌هایی با نسخه‌های اخیر این پرونده تکراری است که نسخه‌های اخبر سایر پرونده‌ها است. فقط پرونده‌های محلی در نظر گرفته شده‌اند.",
+       "listduplicatedfiles-entry": "[[:File:$1|$1]][[$3|{{PLURAL:$2|یک تکرار|$2 تکرار}}]] دارد.",
+       "unusedtemplates": "الگوهای استفاده‌نشده",
+       "unusedtemplatestext": "این صفحه همهٔ صفحاتی در فضای نام {{ns:template}} را که در هیچ صفحه‌ای به کار نرفته‌اند، فهرست می‌کند.\nبه یاد داشته باشید که پیش از پاک‌کردن این صفحات پیوندهای دیگر به آنها را هم وارسی کنید.",
+       "unusedtemplateswlh": "پیوندهای دیگر",
+       "randompage": "وةڵگة بةختةکی",
+       "randompage-nopages": "هیچ صفحه‌ای در این {{PLURAL:$2|فضای نام|فضاهای نام}} موجود نیست: $1.",
+       "randomincategory": "وةڵگة بةختةکی در رده/ڕِزگ",
+       "randomincategory-invalidcategory": "«$1» نامی معتبر برای یک ردهٔ نیست.",
+       "randomincategory-nopages": "  .وجود نئرێ[[:Category:$1|$1]]هؤیج وةڵگة وة رده/ڕِزگ",
+       "randomincategory-category": "رده/ڕِزگ:",
+       "randomincategory-legend": "وةڵگة بةختةکی در رده/ڕِزگ",
+       "randomincategory-submit": "بِچۆ",
+       "randomredirect": "تغییرمسیر تصادفی",
+       "randomredirect-nopages": "هیج صفحهٔ تغییرمسیری در فضای نام «$1» موجود نیست.",
+       "statistics": "آمارۀل",
+       "statistics-header-pages": "آمارۀل وۀلگه",
+       "statistics-header-edits": "آمار ویرایش‌ها",
+       "statistics-header-users": "آمار کاربةرةل",
+       "statistics-header-hooks": "آمارۀل بقیة",
+       "statistics-articles": "وۀلگۀ محتوایی",
+       "statistics-pages": "وةڵگةل",
+       "statistics-pages-desc": "تمام صفحه‌های این ویکی، از جمله صفحه‌های بحث، تغییرمسیر و غیره",
+       "statistics-files": "پرونده‌های بارگذاری‌شده",
+       "statistics-edits": "ویرایش صفحه‌ها از هنگامی که {{SITENAME}} راه‌اندازی شده",
+       "statistics-edits-average": "متوسط ویرایش‌ها به ازای هر صفحه",
+       "statistics-users": "[[Special:ListUsers|کاربةرةل]] نان نؤیسی کردئإ",
+       "statistics-users-active": "کاربران فعال",
+       "statistics-users-active-desc": "کاربرانی که در {{PLURAL:$1|روز|$1 روز}} قبل فعالیتی انجام داده‌اند",
+       "pageswithprop": "صفحه‌های دارای خاصیت صفحه",
+       "pageswithprop-legend": "صفحه‌های دارای خاصیت صفحه",
+       "pageswithprop-text": "این صفحه فهرستی است از صفحه‌هایی که از یک خاصیت صفحهٔ خاص استفاده می‌کنند.",
+       "pageswithprop-prop": "نام خاصیت:",
+       "pageswithprop-submit": "بِچۆ",
+       "pageswithprop-prophidden-long": "جزییات مخفی متن طولانی ($1)",
+       "pageswithprop-prophidden-binary": "جزییات مقدار مخفی باینری ($1)",
+       "doubleredirects": "تغییرمسیرهای دوتایی",
+       "doubleredirectstext": "این صفحه فهرستی از صفحه‌های تغییرمسیری را ارائه می‌کند که به صفحهٔ تغییرمسیر دیگری اشاره می‌کنند.\nهر سطر دربردارندهٔ پیوندهایی به تغییرمسیر اول و دوم و همچنین مقصد تغییرمسیر دوم است، که معمولاً صفحهٔ مقصد واقعی است و نخستین تغییرمسیر باید به آن اشاره کند.\nموارد <del>خط خورده</del> درست شده‌اند.",
+       "double-redirect-fixed-move": "[[$1]] انتقال داده شده‌است.\n\nبه صورت خودکار به‌روز شده‌است و  تغییرمسیری به [[$2]] داده شد.",
+       "double-redirect-fixed-maintenance": "رفع خودکار تغییرمسیر دوتایی از [[$1]] به [[$2]] در روند نگهداری.",
+       "double-redirect-fixer": "تعمیرکار تغییرمسیرها",
+       "brokenredirects": "تغییرمسیرهای خراب",
+       "brokenredirectstext": "تغییرمسیرهای زیر به یک صفحهٔ ناموجود پیوند دارند:",
+       "brokenredirects-edit": "دةسکاری",
+       "brokenredirects-delete": "حۀذف کردن/پاک کردن",
+       "withoutinterwiki": "صفحه‌های بدون پیوند میان‌ویکی",
+       "withoutinterwiki-summary": "این صفحات پیوندی به صفحه‌ای به زبان دیگر نمی‌دارند:",
+       "withoutinterwiki-legend": "پیشوند",
+       "withoutinterwiki-submit": "نیشان دائن",
+       "fewestrevisions": "مقاله‌های دارای کمترین شمار ویرایش",
+       "nbytes": "$1 {{PLURAL:$1|بایت|بایتۀل}}",
+       "ncategories": "$1{{PLURAL:$1|رده|رده ها}}",
+       "ninterwikis": "$1 {{PLURAL:$1|میان‌ویکیةل|میان‌ویکی}}",
+       "nlinks": "$1 {{PLURAL:$1|پیوندةل|پیوند}}",
+       "nmembers": "$1 {{PLURAL:$1|member|members}}",
+       "nmemberschanged": "$1 → $2   {{PLURAL:$2| عضو|عضو}}",
+       "nrevisions": "$1 {{PLURAL:$1| نسخه ها|نسخه}}",
+       "nimagelinks": "{{PLURAL:$1|مورد استفاده در $1 {{PLURAL:$1|صفحه ها|صفحه}}}}",
+       "ntransclusions": "در $1 {{PLURAL:$1|صفحه|صفحه ها}} استفاده بیة",
+       "specialpage-empty": "نتیجه‌ای برای این گزارش وجود ندارد.",
+       "lonelypages": "وةڵگةل یتیم",
+       "lonelypagestext": "به صفحه‌های زیر از هیچ صفحهٔ دیگری در {{SITENAME}} پیوند داده نشده‌است و در هیچ صفحهٔ دیگری گنجانده نشده‌اند.",
+       "uncategorizedpages": "صفحه‌های رده‌بندی‌نشده",
+       "uncategorizedcategories": "رده‌های رده‌بندی‌نشده",
+       "uncategorizedimages": "پرونده‌های رده‌بندی‌نشده",
+       "uncategorizedtemplates": "الگوهای رده‌بندی‌نشده",
+       "unusedcategories": "رده‌های استفاده‌نشده",
+       "unusedimages": "پرونده‌های استفاده‌نشده",
+       "wantedcategories": "رده‌های مورد نیاز",
+       "wantedpages": "وةڵگةل مورد نیاز",
+       "wantedpages-summary": "فهرست صفحه‌های ناموجود با بیشترین پیوند به آنها، به استثنای صفحه‌هایی که فقط تغییرمسیر به آنها دارند. برای یک فهرست از صفحه‌های ناموجود که تغییرمسیر به آنها دارند، [[{{#special:BrokenRedirects}}|فهرست تغییرمسیرهای شکسته]] را ببینید.",
+       "wantedpages-badtitle": "عنوان نامجاز در مجموعهٔ نتایج: $1",
+       "wantedfiles": "وةڵگةل مورد نیاز",
+       "wantedfiletext-cat": "پرونده‌های زیر استفاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا فهرست شوند. هرگونه رتبه مثبت کاذب <del>خط خواهد خورد.</del> علاوه بر این، صفحاتی که پرونده‌هایی ناموجود را در خود جای داده‌اند در [[:$1]] فهرست شده‌اند.",
+       "wantedfiletext-cat-noforeign": "پرونده‌های زیر استفاده می‌شود اما وجود ندارد. علاوه بر این، صفحاتی که پرونده‌ها در آنها وجود دارند فهرست شده‌اند در [[:$1]].",
+       "wantedfiletext-nocat": "پرونده‌های زیر استفاده می‌شوند اما موجود نیستند. همچنین ممکن است پرونده‌های مخازن خارجی با وجود موجود بودن در اینجا فهرست شوند. هرگونه رتبهٔ مثبت کاذب <del>خط خواهد خورد.</del>",
+       "wantedfiletext-nocat-noforeign": "پرونده‌های زیر استفاده می‌شوند اما وجود ندارد.",
+       "wantedtemplates": "الگوهای مورد نیاز",
+       "mostlinked": "صفحه‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
+       "mostlinkedcategories": "رده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
+       "mostlinkedtemplates": "بیشترین صفحات تراگنجانده‌شده",
+       "mostcategories": "صفحه‌های دارای بیشترین رده",
+       "mostimages": "پرونده‌هایی که بیشتر از همه به آن‌ها پیوند داده شده‌است",
+       "mostinterwikis": "صفحه‌های دارای بیشترین میان‌ویکی",
+       "mostrevisions": "صفحه‌های دارای بیشترین نسخه",
+       "prefixindex": "کۆل وةڵگةل با پیشوند",
+       "prefixindex-namespace": "کۆل وةڵگةل دارای پیشوند (فضای‌نام $1)",
+       "prefixindex-submit": "نیشان دائن",
+       "prefixindex-strip": "حذف پیشوند در فهرست",
+       "shortpages": "وةڵگةل کؤِڵ/کوتاه",
+       "longpages": "وةڵگةل دؤِڕ/دراز",
+       "deadendpages": "وةڵگةل بن بست",
+       "deadendpagestext": "صفحه‌های زیر به هیچ صفحهٔ دیگری در {{SITENAME}} پیوند ندارند.",
+       "protectedpages": "وةڵگة محافظت/پڵؤم بیة",
+       "protectedpages-indef": "فقط محافظت‌های بی‌پایان",
+       "protectedpages-summary": "در این صفحه فهرست صفحات موجود است که در حال حاضر محافظت شده اند. برای فهرست عنوان‌هایی که از ایجاد محافظت شده‌اند، به [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] مراجعه کنید.",
+       "protectedpages-cascade": "فقط محافظت‌های آبشاری",
+       "protectedpages-noredirect": "پنهان کردن تغییر مسیرها",
+       "protectedpagesempty": "در حال حاضر هیچ‌صفحه‌ای محافظت نشده‌است.",
+       "protectedpages-timestamp": "برچسب زمان",
+       "protectedpages-page": "وةڵگة/پەڕە",
+       "protectedpages-expiry": "انقضا",
+       "protectedpages-performer": "کاربر حفاظت‌کننده",
+       "protectedpages-params": "پارامترهای حفاظت",
+       "protectedpages-reason": "دةلیل",
+       "protectedpages-submit": "نمایش وةڵگةل",
+       "protectedpages-unknown-timestamp": "ناشنا/نادیار",
+       "protectedpages-unknown-performer": "کاربر ناشناس",
+       "protectedtitles": "عنوانةل محافظت/پڵؤم بیة",
+       "protectedtitles-summary": "این صفحه فهرست صفحات موجود است که در حال حاضر محافظت از ساخت شده‌اند. برای فهرست عنوان‌هایی که محافظت از ویرایش شده‌اند، به [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] مراجعه کنید.",
+       "protectedtitlesempty": "در حال حاضر هیچ عنوانی با این پارامترها محافظت نشده‌است.",
+       "protectedtitles-submit": "نمایش عناوین",
+       "listusers": "لیست کاربةرةل",
+       "listusers-editsonly": "فقط کاربرانی که ویرایش دارند را نشان بده",
+       "listusers-creationsort": "مرتب کردن بر اساس تاریخ ایجاد",
+       "listusers-desc": "ترتیب نزولی",
+       "usereditcount": "$1 {{PLURAL:$1|ویرایش ها|ویرایش}}",
+       "usercreated": "{{GENDER:$3|ایجادشده}} در تاریخ $1 در ساعت $2",
+       "newpages": "وۀلگۀ تازۀ",
+       "newpages-username": ":نؤم کاربری",
+       "ancientpages": " کۆنةترین/قدیمی ترین وةڵگةل",
+       "move": "جاوواز کرِدِن",
+       "movethispage": "جاوواز کردن ئئ وۀلگۀ",
+       "unusedimagestext": "پرونده‌های زیر موجودند اما در هیچ صفحه‌ای به کار نرفته‌اند.\nلطفاً توجه داشته باشید که دیگر وبگاه‌ها ممکن است با یک نشانی اینترنتی مستقیم به یک پرونده پیوند دهند، و با وجود این که در استفادهٔ فعال هستند در این جا فهرست شوند.",
+       "unusedcategoriestext": "این رده‌ها وجود دارند ولی هیچ مقاله یا ردهٔ دیگری از آنها استفاده نمی‌کند.",
+       "notargettitle": "مقصدی نیست",
+       "notargettext": "شما صفحهٔ یا کاربر مقصدی برای انجام این عمل روی آن مشخص نکرده‌اید.",
+       "nopagetitle": "هانة وةڵگة وجود نِئرێ",
+       "nopagetext": "صفحهٔ هدفی که شما مشخص کردید وجود ندارد.",
+       "pager-newer-n": "{{PLURAL:$1|یک مورد جدیدتر|$1 مورد جدیدتر}}",
+       "pager-older-n": "{{PLURAL:$1|پوشۀ1|پوشۀ$1}}",
+       "suppress": "سرکوب",
+       "querypage-disabled": "این صفحه ویژه به دلایل عملکردی غیرفعال شده‌است.",
+       "apihelp": "راهنمای API",
+       "apihelp-no-such-module": "پودمان \" $1 \" یافت نشد.",
+       "booksources": "منابع کتاب",
+       "booksources-search-legend": "جستجوی منابع کتاب",
+       "booksources-search": "گئردین/مهِ نی",
+       "booksources-text": "در زیر فهرستی از پیوندها به وبگاه‌های دیگر آمده‌است که کتاب‌های نو و دست دوم می‌فروشند، و همچنین ممکن است اطلاعات بیشتری راجع به کتاب مورد نظر شما داشته باشند:",
+       "booksources-invalid-isbn": "شابک داده شده مجاز به نظر نمی‌رسد؛ از جهت اشکالات هنگام کپی کردن از منبع اصلی بررسی کنید.",
+       "specialloguserlabel": "مجری:",
+       "speciallogtitlelabel": "هدف (عنوان یا {{ns:user}}:نام کاربر برای کاربر):",
+       "log": "سیاهه‌ها",
+       "all-logs-page": "تمام سیاهه‌های عمومی",
+       "alllogstext": "نمایش یک‌جای تمام سیاهه‌های موجود در {{SITENAME}}.\nمی‌توانید با انتخاب نوع سیاهه، نام کاربری (حساس به کوچکی و بزرگی حروف) و صفحه‌های تغییریافته (حساس به بزرگی و کوچکی حروف)، نمایش را محدودتر سازید.",
+       "logempty": "مورد منطبق با منظور شما در سیاهه یافت نشد.",
+       "log-title-wildcard": "صفحه‌هایی را جستجو کن که عنوانشان با این عبارت آغاز می‌شود",
+       "showhideselectedlogentries": "تغییر پدیداری موارد انتخاب‌شده سیاهه",
+       "log-edit-tags": "ویرایش برچسب سیاههٔ انتخاب شده",
+       "allpages": "کۆل وةڵگةل",
+       "nextpage": "وةڵگةبعد ($1)",
+       "prevpage": "وةڵگة قبلی ($1)",
+       "allpagesfrom": "نمایش وةڵگةل با شروع إژ:",
+       "allpagesto": "نمایش صفحات با پایان در:",
+       "allarticles": "کول وۀلگۀل",
+       "allinnamespace": "همهٔ صفحات (فضای نام $1)",
+       "allpagessubmit": "بِچۆ",
+       "allpagesprefix": "نمایش صفحه‌های دارای پیشوند:",
+       "allpagesbadtitle": "عنوان صفحهٔ داده‌شده نامعتبر است یا اینکه دارای پیشوندی بین‌زبانی یا بین‌ویکی‌ای است. ممکن است نویسه‌هایی بدارد که نمی‌توان از آنها در عنوان صفحات استفاده کرد.",
+       "allpages-bad-ns": "{{SITENAME}} دارای فضای نام «$1» نیست.",
+       "allpages-hide-redirects": "پنهان کردن تغییر مسیرها",
+       "cachedspecial-viewing-cached-ttl": "شما در حال مشاهدهٔ نسخه‌ای از این صفحه که در میانگیر قرار دارد هستید که ممکن است برای $1 قبل باشد.",
+       "cachedspecial-viewing-cached-ts": "شما در حال مشاهدهٔ نسخه‌ای از این صفحه که در میانگیر قرار دارد هستید، و این نسخه ممکن است کاملاً واقعی نباشد.",
+       "cachedspecial-refresh-now": "مشاهده آخرین.",
+       "categories": "رده‌ ل",
+       "categoriespagetext": "{{PLURAL:$1|ردهٔ|رده‌های}} زیر دارای صفحات یا پرونده‌هایی {{PLURAL:$1|است|هستند}}.\n[[Special:UnusedCategories|رده‌های استفاده‌نشده]] در اینجا نمایش داده نشده‌اند.\nهمچنین [[Special:WantedCategories|رده‌های مورد نیاز]] را ببینید.",
+       "categoriesfrom": "نمایش رده‌ها با شروع از:",
+       "special-categories-sort-count": "مرتب کردن بر اساس تعداد",
+       "special-categories-sort-abc": "مرتب کردن الفبایی",
+       "deletedcontributions": "مشارکت‌های حذف‌شده",
+       "deletedcontributions-title": "مشارکت‌های حذف‌شده",
+       "sp-deletedcontributions-contribs": "مشارکت‌ها",
+       "linksearch": "جستجوی پیوندهای بیرونی",
+       "linksearch-pat": "الگوی جستجو:",
+       "linksearch-ns": "فضای نام:",
+       "linksearch-ok": "گئردین/مهِ نی",
+       "linksearch-text": "نشانه‌هایی مانند «‎*.wikipedia.org» را می‌توان استفاده کرد.\nحداقل یک دامنه سطح بالا ، به عنوان مثال \"*.org\" نیاز دارد.<br />\n{{PLURAL:$2|پروتکل|پروتکل‌های}} پشتیبانی‌شده: $1 (پیش‌فرض برای http:// در صورت مشخص نشدن پروتکل تنظیم شده‌است).",
+       "linksearch-line": "$1 از $2 پیوند دارد",
+       "linksearch-error": "نشانه‌ها فقط در ابتدای نام میزبان اینترنتی می‌توانند استفاده شوند.",
+       "listusersfrom": "نمایش کاربران با شروع از:",
+       "listusers-submit": "نیشان دائن",
+       "listusers-noresult": "هیچ کاربری یافت نشد.",
+       "listusers-blocked": "(بسته شده)",
+       "activeusers": "فهرست کاربران فعال",
+       "activeusers-intro": "در زیر فهرستی از کاربرانی را می‌بینید که در $1 {{PLURAL:$1|روز|روزها}} گذشته فعالیتی داشته‌اند.",
+       "activeusers-count": "$1 {{PLURAL:$1|فعالیت|فعالیت ها}} در {{PLURAL:$3|روز|$3 روز}} اخیر",
+       "activeusers-from": "نمایش کاربران با آغاز از:",
+       "activeusers-hidebots": "نهفتن ربات‌ها",
+       "activeusers-hidesysops": "نهفتن مدیران",
+       "activeusers-noresult": "کاربری پیدا نشد.",
+       "activeusers-submit": "نمایش کاربةرةل فعال/کارکةر",
+       "listgrouprights": "اختیارات گروه‌های کاربری",
+       "listgrouprights-summary": "فهرست زیر شامل گروه‌های کاربری تعریف شده در این ویکی و اختیارات داده شده به آن‌ها است.\nاطلاعات بیشتر در مورد هر یک از اختیارات را در [[{{MediaWiki:Listgrouprights-helppage}}]] بیابید.",
+       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">اختیارات داده‌شده</span>\n* <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": "می‌تواند حساب خود را از تمام گروه‌ها حذف کند",
+       "listgrouprights-namespaceprotection-header": "محدودیت فضای نام",
+       "listgrouprights-namespaceprotection-namespace": "فضای نام",
+       "listgrouprights-namespaceprotection-restrictedto": "دسترسی(های) مجاز کاربر برای ویرایش",
+       "trackingcategories": "تؤرگِرتنردیابی رده/ڕِزگ\n)رده/ڕِزگ تؤرگِرتن(ردیابی",
+       "trackingcategories-summary": "این صفحه فهرست رده‌هایی ردیابی است که به‌صورت خودکار توسط مدیاویکی پر می‌شوند است. نام‌هایشان می‌تواند پس از تغییر پیام‌های سامانه‌ای مرتبط در فضای نام {{ns:8}} تغییر یابد.",
+       "trackingcategories-msg": "تؤرگِرتن(ردیابی) رده/ڕِزگ",
+       "trackingcategories-name": "نام پیغام",
+       "trackingcategories-desc": "معیارهای گنجایش رده",
+       "noindex-category-desc": "این صفحه توسط ربات‌ها فهرست‌نشده‌است به این دلیل که واژه جادویی <code><nowiki>__NOINDEX__</nowiki></code> در آن یا در فضای که پرچم مجاز است دارد.",
+       "index-category-desc": "این صفحه <code><nowiki>__INDEX__</nowiki></code> درونش دارد (و در فضای نامی است که پرچم مجاز است)، و به این دلیل توسط ربات مجاز است که به‌صورت عادی نباید می‌شد.",
+       "post-expand-template-inclusion-category-desc": "پس از گسترش همهٔ الگوها، حجم صفحه بزرگتر از <code>$wgMaxArticleSize</code> است بنابراین بعضی از الگو گسترش نیافته‌اند.",
+       "post-expand-template-argument-category-desc": "پس از گسترش یک آرگومان الگو (چیزی بین آکولادهای سه‌تایی، مانند <code>{{{Foo}}}</code>) صفحه بزرگ‌تر از <code>$wgMaxArticleSize</code> می‌شود.",
+       "expensive-parserfunction-category-desc": "توابع هزینه‌بر گران (مانند <code>#ifexist</code>) زیادی در صفجه استفاده شده‌ است. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit] را ببینید.",
+       "broken-file-category-desc": "صفحه شامل یک پیوند پرونده خراب است (پیوندی برای جاسازی‌کردن یک پرونده هنگامی که آن پرونده وجود ندارد).",
+       "hidden-category-category-desc": "رده در محتوای صفحه‌اش شامل <code><nowiki>__HIDDENCAT__</nowiki></code> است، که از به طور پیش‌فرض نشان‌دادن جعبه پیوندهای رده در صفحات جلوگیری می‌کند.",
+       "trackingcategories-nodesc": "هیچ شرحی وة دةسرةس نیة.",
+       "trackingcategories-disabled": "رده غیرفعال‌شده است",
+       "mailnologin": "نشانی‌ای از فرستنده موجود نیست",
+       "mailnologintext": "برای ارسال ایمیل به کاربران دیگر باید [[Special:UserLogin|به سیستم وارد شوید]] و آدرس ایمیل معتبری در [[Special:Preferences|ترجیحات]] خود داشته باشید.",
+       "emailuser": "ایمیل به این کاربر",
+       "emailuser-title-target": "ارسال ایمیل به این {{GENDER:$1|کاربر}}",
+       "emailuser-title-notarget": "ارسال ایمیل به کاربر",
+       "emailpagetext": "شما می‌توانید از فرم زیر برای ارسال ایمیلی به این {{GENDER:$1|کاربر}} استفاده کنید.\nنشانی ایمیلی که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستندهٔ ایمیل خواهد آمد، تا گیرنده بتواند پاسخ دهد.",
+       "defemailsubject": "ایمیل {{SITENAME}} از طرف کاربر «$1»",
+       "usermaildisabled": "ایمیل کاربر غیر قعال است",
+       "usermaildisabledtext": "شما در این ویکی نمی‌توانید به دیگر کاربران ایمیل ارسال کنید",
+       "noemailtitle": "آدرس ایمیل موجود نیست",
+       "noemailtext": "این کاربر آدرس ایمیل معتبری مشخص نکرده است.",
+       "nowikiemailtext": "این کاربر انتخاب کرده که از دیگر کاربران ایمیل دریافت نکند.",
+       "emailnotarget": "نام کاربری ناموجود یا نامعتبر برای گیرنده.",
+       "emailtarget": "نام کاربری دریافت‌کننده را وارد کنید",
+       "emailusername": ":نؤم کاربری",
+       "emailusernamesubmit": "ارسال/کِل کردن",
+       "email-legend": "ارسال ایمیل به کاربر دیگر {{SITENAME}}",
+       "emailfrom": ":إژ",
+       "emailto": "به:",
+       "emailsubject": "عنوان:",
+       "emailmessage": ":پیغام",
+       "emailsend": "كِل كردن/ارسال",
+       "emailccme": "رونوشت پیغام را برایم بفرست.",
+       "emailccsubject": "رونوشت پیغام شما به $1: $2",
+       "emailsent": "ایمیل کِل بی",
+       "emailsenttext": "پیام ایمیل شما فرستاده شد.",
+       "emailuserfooter": "این ایمیل با استفاده از ویژگی «{{int:emailuser}}» {{SITENAME}} توسط $1 به {{GENDER:$2|$2}} {{GENDER:$1|ارسال شد}}.",
+       "usermessage-summary": "گذاشتن پیغام سامانه.",
+       "usermessage-editor": "پیغام رسان سامانه",
+       "watchlist": "لیست پی‌گیریۀل",
+       "mywatchlist": "لیست پی‌گیریۀل",
+       "watchlistfor2": "برای $1 $2",
+       "nowatchlist": "در فهرست پی‌گیری‌های شما هیچ موردی نیست.",
+       "watchlistanontext": "برای مشاهده و ویرایش فهرست پی‌گیری‌های خود از  استفاده کنید.",
+       "watchnologin": "إ سیستم نِهةتئة/نِهاتئة",
+       "addwatch": "افزودن به فهرست پی‌گیری",
+       "addedwatchtext": "«[[:$1]]» و صفحهٔ بحث آن به [[Special:Watchlist|فهرست پی‌گیری‌های]] شما اضافه شد.",
+       "addedwatchtext-short": "صفحه \" $1 \" به فهرست پیگیریهای خود اضافه شده است.",
+       "removewatch": "حذف از فهرست پی‌گیری",
+       "removedwatchtext": "صفحهٔ «[[:$1]]» و صفحهٔ بحث آن از [[Special:Watchlist|فهرست پی‌گیری‌های شما]] برداشته شد.",
+       "removedwatchtext-short": "صفحهٔ \"$1\" از فهرست پیگیری‌های شما حذف شده‌است.",
+       "watch": "پی‌گیری",
+       "watchthispage": "پی‌گیری ئئ وۀلگۀ",
+       "unwatch": "توقف پی‌گیری",
+       "unwatchthispage": "توقف پی‌گیری",
+       "notanarticle": "صفحه محتوایی نیست",
+       "notvisiblerev": "آخرین نسخه توسط کاربری دیگر حذف شده‌است",
+       "watchlist-details": "بدون احتساب صفحه‌های جداگانهٔ بحث، {{PLURAL:$1|$1 صفحه|$1 صفحه ها}} در فهرست پی‌گیری‌های شما قرار {{PLURAL:$1|دارد|دارند}}.",
+       "wlheader-enotif": "ایمیل‌های اعلان فعال است.",
+       "wlheader-showupdated": "صفحه‌هایی که پس از آخرین بازدید شما تغییر کرده‌اند '''پررنگ''' نمایش داده شده‌اند.",
+       "wlnote": "در زیر {{PLURAL:$1|تغییری|<strong>$1</strong> تغییری}} که در {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} گذشته انجام شده موجود است، تاریخ آخرین بازیابی: $3، $4",
+       "wlshowlast": "نمایش آخرین $1 ساعت $2 روز",
+       "watchlistall2": "کؤل",
+       "watchlist-hide": "ئآشاردن-پنهان کردن",
+       "watchlist-submit": "نیشان دائن",
+       "wlshowtime": "دوره زمانی نمایش:",
+       "wlshowhideminor": "دۀسکاریۀل جزئی",
+       "wlshowhidebots": "ربات‌ها",
+       "wlshowhideliu": " کاربرۀل نام نؤیسی کِریا",
+       "wlshowhideanons": " کاربرۀل ناشنا/نادیاری",
+       "wlshowhidepatr": "ویرایش‌های گشت‌خورده",
+       "wlshowhidemine": "دةسکاریةل مإ",
+       "watchlist-options": "گزینه‌های پی‌گیری",
+       "watching": "...پی‌گیری",
+       "unwatching": "توقف پی‌گیری...",
+       "watcherrortext": "ایرادی در هنگام عوض کردن تنظیمات فهرست پیگیرتان برای «$1» رخ داد.",
+       "enotif_reset": "نشان‌گذاری همهٔ صفحات به عنوان بازدیدشده",
+       "enotif_impersonal_salutation": "کاربر {{SITENAME}}",
+       "enotif_subject_deleted": "{{SITENAME}} وةڵگة $1 توسط {{gender:$2|$2}} حذف بی.",
+       "enotif_subject_created": "{{SITENAME}} وةڵگة $1 توسط {{gender:$2|$2}} سازیا.",
+       "enotif_subject_moved": "{{SITENAME}} وةڵگة $1 توسط {{gender:$2|$2}} جاوواز بی.",
+       "enotif_subject_restored": "{{SITENAME}} وةڵگة $1 توسط {{gender:$2|$2}} احیا شد.",
+       "enotif_subject_changed": "{{SITENAME}} وةڵگة $1 توسط {{gender:$2|$2}} تغییر کرد.",
+       "enotif_body_intro_deleted": "صفحهٔ $1 {{SITENAME}} در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} حذف شد، $3 را ببینید.",
+       "enotif_body_intro_created": "{{SITENAME}} صفحهٔ $1 در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} ایجاد شد. $3 را برای نسخهٔ کنونی شاهده کنید.",
+       "enotif_body_intro_moved": "{{SITENAME}} صفحهٔ $1 در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} انتقال یافت، $3 را برای نسخهٔ کنونی شاهده کنید.",
+       "enotif_body_intro_restored": "{{SITENAME}} صفحهٔ $1 در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} احیا شد، $3 را برای نسخهٔ کنونی شاهده کنید.",
+       "enotif_body_intro_changed": "{{SITENAME}} صفحهٔ $1 در تاریخ $PAGEEDITDATE توسط {{gender:$2|$2}} تغییر کرد، $3 را برای نسخهٔ کنونی شاهده کنید.",
+       "enotif_lastvisited": "برای دیدن همهٔ تغییرات از آخرین باری که سر زده‌اید $1 را ببینید.",
+       "enotif_lastdiff": "برای نمایش این تغییر $1 را ببینید.",
+       "enotif_anon_editor": " کاربرۀل ناشنا/نادیاری$1",
+       "enotif_body": "$WATCHINGUSERNAME گرامی،\n\n$PAGEINTRO $NEWPAGE\n\n\nتوضیح ویراستار: $PAGESUMMARY $PAGEMINOREDIT\n\nتماس با ویراستار:\nنامه: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا هنگامی که به صفحه سر نزده‌اید، در صورت رخ‌دادنِ احتمالیِ فعالیت بیشتر، تا زمانی که در با کاربریتان در سامانه هستید، اعلانیه‌ای برای شما فرستاده نخواهد شد.\nشما همچنین می‌توانید در صفحهٔ پی‌گیری‌های خود پرچم‌های مربوط به آگاهی‌رسانی را صفر کنید همچنین می‌توانید پرچم‌های آگاهی‌سازی را بازنشانی کنید.\n\nدوستدار شما، سامانهٔ آگاهی‌رسانی {{SITENAME}}\n\n--\nبرای تغییر تنظیمات فهرست ایمیل‌های اعلان به {{canonicalurl:{{#special:EditWatchlist}}}} بروید.\n\nبرای تغییر تنظیمات فهرست پی‌گیری‌هایتان به {{canonicalurl:{{#special:EditWatchlist}}}} بروید.\n\nبرای حذف صفحه از فهرست پی‌گیری‌هایتان به $UNWATCHURL بروید.\n\nبازخورد و کمک بیشتر:\n$HELPPAGE",
+       "deletepage": "حۀذف وةڵگة",
+       "confirm": "تأیید",
+       "excontent": "محتوای وةڵگة این بود: «$1»",
+       "excontentauthor": "محتوای صفحه این بود: «$1» و تنها مشارکت‌کننده «[[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]])» بود",
+       "exbeforeblank": "محتوای صفحه قبل از خالی‌کردن این بود: «$1»",
+       "delete-confirm": "حذف «$1»",
+       "delete-legend": "حۀذف کردن/پاک کردن",
+       "historywarning": "<strong>هشدار:</strong> صفحه‌ای که در حال پاک‌کردن آن هستید دارای یک تاریخچه همراه $1 {{PLURAL:$1|بازبینی|بازبینی‌ها}} است:",
+       "confirmdeletetext": "شما در حال حذف کردن یک صفحه یا تصویر از پایگاه داده‌ها همراه با تمام تاریخچهٔ آن هستید.\nلطفاً این عمل را تأیید کنید و اطمینان حاصل کنید که عواقب این کار را می‌دانید و این عمل را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]] انجام می‌دهید.",
+       "actioncomplete": "عملكرد كامل بيه",
+       "actionfailed": "عمل ناموفق بود",
+       "deletedtext": "«$1» حذف شد.\nبرای سابقهٔ حذف‌های اخیر به $2 مراجعه کنید.",
+       "dellogpage": "سیاههٔ حذف",
+       "dellogpagetext": "فهرست زیر فهرستی از آخرین حذف‌هاست.\nهمهٔ زمان‌های نشان‌داده‌شده زمان خادم (وقت گرینویچ) است.",
+       "deletionlog": "سیاههٔ حذف",
+       "reverted": "به نسخهٔ قدیمی‌تر واگردانده شد",
+       "deletecomment": ":دةلیل",
+       "deleteotherreason": "دلیل دیگر/اضافی:",
+       "deletereasonotherlist": "دلیل دیگر",
+       "deletereason-dropdown": "*دلایل متداول حذف\n** هرزنگار\n** خرابکاری\n** نقض حق تکثیر\n** درخواست کاربر\n** تغییرمسیر شکسته",
+       "delete-edit-reasonlist": "ویرایش دلایل حذف",
+       "delete-toobig": "این صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه ها}} است.\nبه منظور جلوگیری از اختلال ناخواسته در {{SITENAME}} حذف این گونه صفحات محدود شده‌است.",
+       "delete-warning-toobig": "ین صفحه تاریخچهٔ ویرایشی بزرگی دارد، که شامل بیش از $1 {{PLURAL:$1|نسخه|نسخه ها}} است.\nحذف آن ممکن است که عملکرد پایگاه دادهٔ {{SITENAME}} را مختل کند;\nبا احتیاط ادامه دهید.",
+       "deleteprotected": "شما نمی‌توانید این صفحه را پاک کنید چون که از آن محافظت شده‌است.",
+       "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|صفحه‌های دیگری]] هستند که به صفحه‌ای که شما در حال حذف آن هستید پیوند دارند یا آن را تراگنجانیده‌اند.",
+       "rollback": "واگردانی ویرایش‌ها",
+       "rollbacklink": "واگردانی/گِلآ دائن",
+       "rollbacklinkcount": "rollback $1 {{PLURAL:$1|edit|edits}}",
+       "rollbacklinkcount-morethan": "واگردانی بیش از {{PLURAL:$1|ویرایش|ویرایش ها}}$1",
+       "rollbackfailed": "واگردانی نشد",
+       "cantrollback": "نمی‌توان ویرایش را واگرداند؛\nآخرین مشارکت‌کننده تنها مؤلف این مقاله است.",
+       "alreadyrolled": "واگردانی آخرین ویرایش [[:$1]] توسط [[User:$2|$2]] ([[User talk:$2|بحث]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ممکن نیست؛\nپیش از این شخص دیگری مقاله را ویرایش یا واگردانی کرده‌است.\n\nآخرین ویرایش توسط [[User:$3|$3]] ([[User talk:$3|بحث]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) انجام شده‌است.",
+       "editcomment": "خلاصهٔ ویرایش این بود: «''$1''».",
+       "revertpage": "ویرایش [[Special:Contributions/$2|$2]] ([[User talk:$2|بحث]]) به آخرین تغییری که [[User:$1|$1]] انجام داده بود واگردانده شد",
+       "revertpage-nouser": "ویرایش‌های انجام‌شده توسط (نام کاربری حذف شده) به آخرین ویرایش [[User:$1|$1]] واگردانی شد.",
+       "rollback-success": "ویرایش‌های $1 واگردانی شد؛\nصفحه به آخرین ویرایش $2 برگردانده شد.",
+       "sessionfailure-title": "خطای نشست کاربری",
+       "sessionfailure": "به نظر می‌رسد مشکلی در مورد نشست کاربری شما وجود دارد؛\nعمل درخواست شده در اقدامی پیشگیرانه در برابر ربوده‌شدن اطلاعات نشست کاربری، لغو شد.\nلطفاً دکمهٔ «بازگشت» را در مرورگر خود بفشارید و صفحه‌ای که از آن به اینجا رسیده‌اید را دوباره فراخوانی کنید، سپس مجدداً سعی کنید.",
+       "changecontentmodel": "ویرایش نمونه محتوای یک صفحه",
+       "changecontentmodel-legend": "تغییر نوع محتوی",
+       "changecontentmodel-title-label": "عنوان وةڵگة",
+       "changecontentmodel-model-label": "نمونه محتوای جدید",
+       "changecontentmodel-reason-label": ":دةلیل",
+       "changecontentmodel-success-title": "نمونه محتوی تغییر یافت",
+       "changecontentmodel-success-text": "نوع محتوی [[:$1]]  تغییر یافت",
+       "changecontentmodel-cannot-convert": "محتوی در [[:$1]] نمی‌تواند به گونه‌ای از $2 تبدیل شود.",
+       "changecontentmodel-nodirectediting": "نمونه محتوی $1 امکان ویرایش مستقیم را پشتیبانی نمی‌کند",
+       "log-name-contentmodel": "سیاهه تغییر نمونه محتوی",
+       "log-description-contentmodel": "رویدادهای مرتبط با نمونه محتوی‌های یک صفحه",
+       "logentry-contentmodel-change": "نمونه محتوای صفحهٔ $3 از \"$4\" به \"$5\" توسط $1 {{GENDER:$2|تغییر داده شد}}",
+       "logentry-contentmodel-change-revertlink": "واگردانی/گِلآ دائن",
+       "logentry-contentmodel-change-revert": "واگردانی/گِلآ دائن",
+       "protectlogpage": "سیاههٔ محافظت",
+       "protectlogtext": "در زیر فهرستی از تغییرات سطح محافظت صفحه‌ها آمده‌است.\n[[Special:ProtectedPages|فهرست صفحه‌های محافظت‌شده]] را برای دیدن فهرست محافظت‌های مؤثر صفحه‌ها ببینید.",
+       "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": "صفحه‌های موجود در این فضای نام، نمی‌توانند محافظت شوند.",
+       "protect-norestrictiontypes-text": "امکان محافظت این صفحه به علت نبودن نوع محدودیت، مقدور نیست.",
+       "protect-norestrictiontypes-title": "صفحهٔ غیرقابل محافظت",
+       "protect-legend": "تأیید محافظت",
+       "protectcomment": ":دةلیل",
+       "protectexpiry": "زمان سرآمدن:",
+       "protect_expiry_invalid": "زمان سرآمدن نامعتبر است.",
+       "protect_expiry_old": "زمان سرآمدن در گذشته‌است.",
+       "protect-unchain-permissions": "باز کردن سایر گزینه‌های محافظت",
+       "protect-text": "شما می‌توانید سطح محافظت صفحهٔ '''$1''' را ببینید و از اینجا آن را تغییر دهید.",
+       "protect-locked-blocked": "شما در مدتی که دسترسی‌تان قطع است نمی‌توانید سطح محافظت صفحات را تغییر دهید.\nتنظیمات فعلی صفحهٔ '''$1''' از این قرار است:",
+       "protect-locked-dblock": "به دلیل قفل شدن پایگاه داده، امکان تغییر سطح محافظت صفحه وجود ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
+       "protect-locked-access": "حساب کاربری شما اجازهٔ تغییر سطح محافظت صفحه را ندارد.\nتنظیمات فعلی صفحهٔ '''$1''' به این قرار است:",
+       "protect-cascadeon": "این صفحه در حال حاضر محافظت شده‌است زیرا در {{PLURAL:$1|صفحهٔ|صفحه‌های}} زیر که گزینهٔ محافظت آبشاری {{PLURAL:$1|آن|آن‌ها}} فعال است، گنجانده شده است.\nتغییراتی به سطح محافظت این صفحه به محافظت ابشاری تأثیر نخواهد گذاشت.",
+       "protect-default": "همهٔ کاربرها",
+       "protect-fallback": "فقط به کاربرهایی که دسترسی «$1» دارند، اجازه داده می‌شود",
+       "protect-level-autoconfirmed": "تنها کاربران تأییدشده",
+       "protect-level-sysop": "فقط مدیران",
+       "protect-summary-cascade": "آبشاری",
+       "protect-expiring": "زمان سرآمدن $1 (UTC)",
+       "protect-expiring-local": "منقضی $1",
+       "protect-expiry-indefinite": "بی‌پایان",
+       "protect-cascade": "محافظت آبشاری - از همهٔ صفحه‌هایی که در این صفحه آمده‌اند نیز محافظت می‌شود.",
+       "protect-cantedit": "شما نمی‌تواند وضعیت محافظت این صفحه را تغییر دهید، چون اجازه ویرایش آن را ندارید.",
+       "protect-othertime": "زمانی دیگر:",
+       "protect-othertime-op": "زمانی دیگر",
+       "protect-existing-expiry": "زمان انقضای موجود: $2، $3",
+       "protect-existing-expiry-infinity": "زمان انقضای موجود: بی‌نهایت",
+       "protect-otherreason": "دلیل دیگر/اضافی:",
+       "protect-otherreason-op": "دلیل دیگر",
+       "protect-dropdown": "*دلایل متداول محافظت\n** خرابکاری گسترده\n** هرزنگاری گسترده\n** جنگ ویرایشی غیر سازنده\n** صفحهٔ پر بازدید",
+       "protect-edit-reasonlist": "ویرایش دلایل محافظت",
+       "protect-expiry-options": "۱ ساعت:1 hour,۱ روز:1 day,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌پایان:infinite",
+       "restriction-type": "دسترسی:",
+       "restriction-level": "سطح محدودیت:",
+       "minimum-size": "حداقل اندازه",
+       "maximum-size": "حداکثر اندازه:",
+       "pagesize": "(بایت)",
+       "restriction-edit": "دةسکاری",
+       "restriction-move": "جاوواز کرِدِن",
+       "restriction-create": "دؤِرس کردن/سازین",
+       "restriction-upload": "بارگذاری",
+       "restriction-level-sysop": "کاملاً محافظت‌شده",
+       "restriction-level-autoconfirmed": "نیمه‌حفاظت‌شده",
+       "restriction-level-all": "هر سطحی",
+       "undelete": "احیای صفحهٔ حذف‌شده",
+       "undeletepage": "نمایش و احیای صفحه‌های حذف‌شده",
+       "undeletepagetitle": "'''آن چه در ادامه می‌آید شامل نسخه‌های حذف شدهٔ [[:$1|$1]] است'''.",
+       "viewdeletedpage": "نمایش صفحه‌های حذف‌شده",
+       "undeletepagetext": "{{PLURAL:$1|صفحهٔ زیر حدف شده|صفحه‌های زیر حذف شده‌اند}} ولی هنوز در بایگانی {{PLURAL:$1|هست|هستند}} و {{PLURAL:$1|می‌تواند احیا شود|می‌توانند احیا شوند}}.\nاین بایگانی ممکن است هر چند وقت تمیز شود.",
+       "undelete-fieldset-title": "احیای نسخه‌ها",
+       "undeleteextrahelp": "برای احیای تمام تاریخچهٔ صفحه، همهٔ جعبه‌ها را خالی رها کرده و دکمهٔ '''''{{int:undeletebtn}}''''' را کلیک کنید.\nبرای انجام احیای انتخابی، جعبه‌های متناظر با نسخه‌های مورد نظر برای احیا را علامت زده و دکمهٔ '''''{{int:undeletebtn}}''''' را کلیک کنید.",
+       "undeleterevisions": "$1 نسخه حذف {{PLURAL:$1|شده‌است|شده‌اند}}",
+       "undeletehistory": "اگر این صفحه را احیا کنید، همهٔ نسخه‌های آن در تاریخچه احیا خواهند شد.\nاگر صفحهٔ جدیدی با نام یکسان از زمان حذف ایجاد شده باشد، نسخه‌های احیاشده در تاریخچهٔ قبلی خواهند آمد.",
+       "undeleterevdel": "احیای صفحه‌های در حالتی که باعث حذف شدن بخشی از آخرین نسخهٔ صفحه یا پرونده بشود مقدور نیست.\nدر این حالت شما باید جدیدترین نسخهٔ حذف شده را نیز احیا کنید.",
+       "undeletehistorynoadmin": "این مقاله حذف شده‌است.\nدلیل حذف این مقاله به همراه مشخصات کاربرانی که قبل از حذف این صفحه را ویرایش کرده‌اند، در خلاصهٔ زیر آمده‌است.\nمتن واقعی این ویرایش‌های حذف شده فقط در دسترس مدیران است.",
+       "undelete-revision": "نسخهٔ حذف شدهٔ $1 (به تاریخ $4 ساعت $5) توسط $3:",
+       "undeleterevision-missing": "نسخه نامعتبر یا مفقود است.\nممکن است پیوندتان نادرست باشد یا اینکه نسخه از بایگانی حذف یا بازیابی شده باشد .",
+       "undelete-nodiff": "نسخهٔ قدیمی‌تری یافت نشد.",
+       "undeletebtn": "احیا",
+       "undeletelink": "نمایش/احیا",
+       "undeleteviewlink": "دیین/سئرکردن",
+       "undeleteinvert": "انتخاب بپلئ/برعۀسگ بؤ",
+       "undeletecomment": ":دةلیل",
+       "undeletedrevisions": "$1 نسخه احیا {{PLURAL:$1|شد}}",
+       "undeletedrevisions-files": "$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
+       "undeletedfiles": "$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.",
+       "cannotundelete": "احیا ناموفق بود:\n$1",
+       "undeletedpage": "'''$1 احیا شد'''\n\nبرای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به  [[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": "امکان احیای تاریخچهٔ شمارهٔ $1 وجود ندارد زیرا اطلاعات در پایگاه داده وجود ندارد.\nممکن است پیشتر احیا شده باشد.",
+       "undelete-error": "خطا صفحه غیرقابل حذف",
+       "undelete-error-short": "خطا در احیای پرونده: $1",
+       "undelete-error-long": "در زمان احیای پرونده خطا رخ داد:\n\n$1",
+       "undelete-show-file-confirm": "آیا مطمئن هستید که می‌خواهید یک نسخهٔ حذف شده از پرونده \"<nowiki>$1</nowiki>\" مورخ $2 ساعت $3 را ببینید؟",
+       "undelete-show-file-submit": "أرێ-بةلئ",
+       "namespace": "فضای نامۀل",
+       "invert": "انتخاب بپلئ/برعۀسگ بؤ",
+       "tooltip-invert": "این جعبه را علامت بزنید تا تغییرات صفحه‌های داخل فضای نام انتخاب شده (و دیگر فضاهای نام علامت زده شده) پنهان شوند",
+       "tooltip-whatlinkshere-invert": "این جعبه را برای پنهان کردن پیوند صفحاتی که فضای نامشان انتخاب شده‌است، انتخاب کنید.",
+       "namespace_association": "فضای نام مرتبط",
+       "tooltip-namespace_association": "این جعبه را علامت بزنید تا فضای نام بحث یا موضوع مرتبط با فضای نام انتخاب شده هم شامل شود",
+       "blanknamespace": "(سەر/اصلی)",
+       "contributions": "هؤمکاریۀل{{GENDER:$1|کاربۀر}}",
+       "contributions-title": "مشارکت‌های کاربری $1",
+       "mycontris": "هؤمکاری کِرۀل",
+       "anoncontribs": "هؤمکاری کِرۀل",
+       "contribsub2": "برای {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "حساب کاربری «$1» ثبت نشده‌است.",
+       "nocontribs": "هیچ تغییری با این مشخصات یافت نشد.",
+       "uctop": "(نؤسخهٔ ایسه)",
+       "month": ":)در این سال (و پیش از آن",
+       "year": ":)در این سال (و پیش از آن",
+       "sp-contributions-newbies": "فقط مشارکت‌های تازه‌کاران نمایش داده شود",
+       "sp-contributions-newbies-sub": "برای تازه‌کاران",
+       "sp-contributions-newbies-title": "مشارکت‌های کاربری برای حساب‌های تازه‌کار",
+       "sp-contributions-blocklog": "سیاههٔ بسته‌شدن‌ها",
+       "sp-contributions-suppresslog": "کمک‌های کاربر متوقف شده",
+       "sp-contributions-deleted": "مشارکت‌های حذف‌شدهٔ کاربر",
+       "sp-contributions-uploads": "بارگذاری‌ها",
+       "sp-contributions-logs": "سیاهه‌ها",
+       "sp-contributions-talk": "قسۀ-گۀپ",
+       "sp-contributions-userrights": "مدیریت اختیارات کاربر",
+       "sp-contributions-blocked-notice": "این کاربر در حال حاضر بسته شده‌است.\nآخرین سیاههٔ بسته شدن در زیر آمده‌است:",
+       "sp-contributions-blocked-notice-anon": "این نشانی آی‌پی در حال حاضر بسته است.\nآخرین سیاههٔ بسته شدن در زیر آمده‌است:",
+       "sp-contributions-search": "جستجوی مشارکت‌ها",
+       "sp-contributions-username": "نشانی آی‌پی یا نام کاربری:",
+       "sp-contributions-toponly": "فقط ویرایش‌هایی که آخرین نسخه‌اند نمایش داده شود",
+       "sp-contributions-newonly": "فقط نمایش ویرایش‌هایی که ایجاد صفحه هستند",
+       "sp-contributions-submit": "گئردین/مهِ نی",
+       "whatlinkshere": "پیوندۀل وۀ ئئ وةڵگة",
+       "whatlinkshere-title": "وۀلگۀلئ گإ  وۀ «$1» پیوۀند دِرِن",
+       "whatlinkshere-page": ":پەڕە/وةڵگة",
+       "linkshere": "The following pages link to <strong>[[:$1]]</strong>:",
+       "nolinkshere": "هیچ صفحه‌ای به '''[[:$1]]''' پیوند ندارد.",
+       "nolinkshere-ns": "هیچ صفحه‌ای از فضای نام انتخاب شده به '''[[:$1]]''' پیوند ندارد.",
+       "isredirect": "صفحهٔ تغییرمسیر",
+       "istemplate": " تراگنجانش‌ها",
+       "isimage": "پیوند پرونده",
+       "whatlinkshere-prev": "{{PLURAL:$1|previous|previous $1}}",
+       "whatlinkshere-next": "{{PLURAL:$1|next|next $1}}",
+       "whatlinkshere-links": "← پیوند",
+       "whatlinkshere-hideredirs": "$1 تغییرمسیر",
+       "whatlinkshere-hidetrans": "$1 تراگنجانش‌ها",
+       "whatlinkshere-hidelinks": "$1 پیوند",
+       "whatlinkshere-hideimages": "$1 پیوندهای پرونده",
+       "whatlinkshere-filters": "پالانۀل/فیلترۀل",
+       "whatlinkshere-submit": "بِچۆ",
+       "autoblockid": "شناسه قطع دسترسی خودکار #$1",
+       "block": "بستن کاربر.",
+       "unblock": "بازکردن کاربر",
+       "blockip": "بستن {{GENDER:$1|کاربر}}",
+       "blockip-legend": "بستن کاربر",
+       "blockiptext": "از فرم زیر برای بستن دسترسی ویرایش یک نشانی آی‌پی یا نام کاربری مشخص استفاده کنید.\nاین کار فقط فقط باید برای جلوگیری از خرابکاری و بر اساس [[{{MediaWiki:Policy-url}}|سیاست قطع دسترسی]] انجام شود.\nدلیل مشخص این کار را در زیر ذکر کنید (مثلاً با ذکر صفحه‌های به‌خصوصی که مورد خرابکاری واقع شده‌اند).",
+       "ipaddressorusername": "نشانی آی‌پی یا نام کاربری:",
+       "ipbexpiry": "زمان سرآمدن:",
+       "ipbreason": ":دةلیل",
+       "ipbreason-dropdown": "*دلایل متداول قطع دسترسی\n**واردکردن اطلاعات نادرست\n**پاک‌کردن اطلاعات مفید از صفحات\n**هرزنگاری از طریق درج مکرر پیوند به وب‌گاه‌ها\n**درج چرندیات یا نوشته‌های بی‌معنا در صفحات\n**تهدید یا ارعاب دیگر کاربران\n**سوء استفاده از چند حساب کاربری\n**نام کاربری نامناسب",
+       "ipb-hardblock": "جلوگیری از ویرایش کردن کاربران ثبت نام کرده از طریق این نشانی آی‌پی",
+       "ipbcreateaccount": "جلوگیری از ایجاد حساب",
+       "ipbemailban": "جلوگیری از ارسال ایمیل",
+       "ipbenableautoblock": "بستن  خودکار آخرین نشانی آی‌پی استفاده شده توسط کاربر و نشانی‌های دیگری که از آن‌ها برای ویرایش تلاش می‌کند",
+       "ipbsubmit": "این کاربر بسته شود",
+       "ipbother": "زمانی دیگر",
+       "ipboptions": "۲ ساعت:2 hours,۱ روز:1 day,۳ روز:3 days,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌پایان:infinite",
+       "ipbhidename": "نهفتن نام کاربری از ویرایش‌ها و فهرست‌ها",
+       "ipbwatchuser": "پی‌گیری صفحهٔ کاربری و بحث این کاربر",
+       "ipb-disableusertalk": "جلوگیری از ویرایشی صفحهً بحث توسط خود کاربر در زمانی که بسته است",
+       "ipb-change-block": "بستن دوبارهٔ کاربر با این تنظیم‌ها",
+       "ipb-confirm": "تأیید بستن",
+       "badipaddress": "نشانی آی‌پی نامجاز",
+       "blockipsuccesssub": "بستن با موفقیت انجام شد",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] بسته شد.<br />\nبرای بررسی بسته‌شده‌ها [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.",
+       "ipb-blockingself": "شما در حال بستن خودتان هستید!  آیا مطمئن هستید که می‌خواهید چنین کاری انجام دهید؟",
+       "ipb-confirmhideuser": "شما در حال بستن یک کاربر هستید که «پنهان‌سازی کاربر» برایش فعال شد‌ه‌است. این کار نام کاربر را از همهٔ فهرست‌ها و سیاهه‌ها مخفی می‌کند. آیا مطمئن هستید که می‌خواهید آن را انجام دهید؟",
+       "ipb-confirmaction": "اگر واقعاً مطمئنید که می‌خواهید آن را انجام دهید، لطفاً زمینهٔ \"{{int:ipb-confirm}}\" را در زیر بررسی کنید.",
+       "ipb-edit-dropdown": "ویرایش دلایل قطع‌دسترسی",
+       "ipb-unblock-addr": "باز کردن $1",
+       "ipb-unblock": "باز کردن نام کاربری یا نشانی آی‌پی",
+       "ipb-blocklist": "دیدن قطع دسترسی‌های موجود",
+       "ipb-blocklist-contribs": "مشارکت‌های $1",
+       "unblockip": "بازکردن کاربر",
+       "unblockiptext": "برای بازگرداندن دسترسی نوشتن به یک نشانی آی‌پی یا نام کاربری بسته‌شده از فرم زیر استفاده کنید.",
+       "ipusubmit": "باز کردن دسترسی",
+       "unblocked": "دسترسی [[User:$1|$1]] دوباره برقرار شد",
+       "unblocked-range": "$1 باز شد",
+       "unblocked-id": "قطع دسترسی شماره $1 خاتمه یافت",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] رفع قطع دسترسی شد.",
+       "blocklist": "کاربران بسته‌شده",
+       "ipblocklist": "کاربران بسته‌شده",
+       "ipblocklist-legend": "جستجوی کاربر بسته شده",
+       "blocklist-userblocks": "پنهان کردن بسته‌شدن‌های حساب",
+       "blocklist-tempblocks": "پنهان کردن بستن‌های موقت",
+       "blocklist-addressblocks": "پنهان کردن تک آی‌پی‌های بسته شده",
+       "blocklist-rangeblocks": "پنهان کردنی قطع دسترسی بازه‌ها",
+       "blocklist-timestamp": "برچسب زمان",
+       "blocklist-target": "هةدةف",
+       "blocklist-expiry": "زمان سرآمدن",
+       "blocklist-by": "مدیر قطع دسترسی کننده",
+       "blocklist-params": "پارامترهای بستن",
+       "blocklist-reason": "دةلیل",
+       "ipblocklist-submit": "گئردین/مهِ نی",
+       "ipblocklist-localblock": "قطع دسترسی محلی",
+       "ipblocklist-otherblocks": "سایر {{PLURAL:$1|بستن‌ها|بستن‌}}",
+       "infiniteblock": "بی‌پایان",
+       "expiringblock": "در $1 ساعت $2 به پایان می‌رسد",
+       "anononlyblock": "فقط کاربران گمنام",
+       "noautoblockblock": "بستن خودکار غیرفعال است",
+       "createaccountblock": "امکان ساخت حساب گرفته‌شده",
+       "emailblock": "ایمیل بسته‌شده",
+       "blocklist-nousertalk": "نمی‌تواند صفحهٔ بحث خود را ویرایش کند",
+       "ipblocklist-empty": "فهرست بسته‌شدن‌ها خالی‌است.",
+       "ipblocklist-no-results": "دسترسی حساب کاربری یا نشانی آی‌پی مورد نظر قطع نیست.",
+       "blocklink": "بۀستن",
+       "unblocklink": "باز شود",
+       "change-blocklink": "تغییر قطع دسترسی",
+       "contribslink": "هؤمکاریۀل",
+       "emaillink": "ایمیل کِل کۀ",
+       "autoblocker": "به طور خودکار بسته شد چون آی‌پی شما به تازگی توسط کاربر «[[User:$1|$1]]» استفاده شده‌است.\nدلیل قطع دسترسی $1 چنین است \"$2\"",
+       "blocklogpage": "سیاههٔ بسته‌شدن‌ها",
+       "blocklog-showlog": "دسترسی این کاربر در گذشته بسته شده‌است.\nسیاههٔ قطع دسترسی در زیر نمایش یافته است:",
+       "blocklog-showsuppresslog": "دسترسی این کاربر قبلاً بسته شده و این کاربر پنهان شده‌است.\nسیاههٔ قطع دسترسی در زیر نمایش یافته است:",
+       "blocklogentry": "«[[$1]]» را تا $2 بست $3",
+       "reblock-logentry": "تنظیمات قطع دسترسی [[$1]] را تغییر داد به پایان قطع دسترسی در $2 $3",
+       "blocklogtext": "این سیاهه‌ای از بستن و باز کردن کاربرها است.\nنشانی‌های آی‌پی که به طور خودکار بسته شده‌اند فهرست نشده‌اند.\nبرای فهرست محرومیت‌ها و بسته‌شدن‌های حال حاضر به [[Special:BlockList|فهرست بسته‌شده‌ها]] مراجعه کنید.",
+       "unblocklogentry": "$1 را باز کرد",
+       "block-log-flags-anononly": "فقط کاربران گمنام",
+       "block-log-flags-nocreate": "قابلیت ایجاد حساب غیرفعال شد",
+       "block-log-flags-noautoblock": "قطع دسترسی خودکار غیرفعال شد",
+       "block-log-flags-noemail": "ایمیل بسته‌شد",
+       "block-log-flags-nousertalk": "صفحهٔ بحث خود را نمی‌تواند ویرایش کند",
+       "block-log-flags-angry-autoblock": "قطع دسترسی خودکار پیشرفته فعال شد",
+       "block-log-flags-hiddenname": "نام کاربری پنهان",
+       "range_block_disabled": "بستن یک بازه توسط مدیران غیر فعال است.",
+       "ipb_expiry_invalid": "زمان سرآمدن نامعتبر.",
+       "ipb_expiry_temp": "قطع دسترسی کاربرهای پهنان باید همیشگی باشد.",
+       "ipb_hide_invalid": "قادر به سرکوب این حساب نیست; این بیشتر از {{PLURAL:$1|یک ویرایش|$1 ویرایش‌ها}} دارد.",
+       "ipb_already_blocked": "«$1» همین الان هم بسته‌است",
+       "ipb-needreblock": "دسترسی $1 از قبل بسته است. آیا می‌خواهید تنظیمات آن را تغییر دهید؟",
+       "ipb-otherblocks-header": "سایر {{PLURAL:$1|قطع دسترسی‌ها|قطع دسترسی‌}}",
+       "unblock-hideuser": "‫به این خاطر که حساب کاربری این کاربر مخفی شده‌است شما نمی‌توانید آن را باز کنید.‬",
+       "ipb_cant_unblock": "خطا: شناسه بسته‌شدن $1 یافت نشد. ممکن است پیشتر باز شده باشد.",
+       "ipb_blocked_as_range": "خطا: نشانی آی‌پی $1 به شکل مستقیم بسته نشده‌است و نمی‌تواند باز شود.\nاین نشانی به همراه بازه $2 بسته شده که قابل باز شدن است.",
+       "ip_range_invalid": "بازهٔ آی‌پی نامعتبر.",
+       "ip_range_toolarge": "قطع دسترسی بازه‌های بزرگتر از /$1 مجاز نیست.",
+       "proxyblocker": "مسدود کننده پروکسی",
+       "proxyblockreason": "نشانی آی‌پی شما بسته شده است چون متعلق به یک پروکسی باز است.\nلطفاً با ارائه دهندهً خدمات اینترنت خود یا پشتیبانی فنی تماس بگیرید و آنها را از این مشکل امنیتی جدی آگاه کنید.",
+       "sorbsreason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده است.",
+       "sorbs_create_account_reason": "نشانی آی‌پی شما توسط DNSBL مورد استفاده {{SITENAME}} به عنوان یک پروکسی باز گزارش شده‌است.\nشما اجازهٔ ساختن حساب کاربری ندارید.",
+       "xffblockreason": "نشانی آی‌پی در X-Forwarded-For header موجود است و پروکسی شما یا سروری که از آن استفاده می‌کنید بسته‌شده‌است. دلیل بسته‌شدن: $1",
+       "cant-see-hidden-user": "کاربری که می‌خواهید ببندید قبلاً بسته شده و پنهان گردیده است. چون شما دسترسی پنهان کردن کاربران را ندارید، نمی‌توانید قطع دسترسی کاربر را ببینید یا ویرایش کنید.",
+       "ipbblocked": "شما نمی‌توانید دسترسی دیگر کاربران را ببندید یا باز کنید زیرا دسترسی خودتان بسته است.",
+       "ipbnounblockself": "شما مجاز به باز کردن دسترسی خود نیستید.",
+       "lockdb": "قفل کردن پایگاه داده",
+       "unlockdb": "از قفل در آوردن پایگاه داده",
+       "lockdbtext": "قفل کردن پایگاه داده امکان ویرایش صفحات، تغییر تنظیمات، ویرایش پی‌گیری‌ها، و سایر تغییراتی را که نیازمند تغییری در پایگاه داده است، از همهٔ کاربران سلب می‌کند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید، و در اولین فرصت پایگاه داده را از حالت قفل شده خارج خواهید کرد.",
+       "unlockdbtext": "از قفل در آوردن پایگاه داده به تمامی کاربران اجازه می‌دهد که توانایی ویرایش صفحات، تغییر تنظیمات، تغییر پی‌گیری‌ها و هر تغییر دیگری که نیازمند تغییر در پایگاه داده باشد را دوباره به دست بیاورند.\nلطفاً تأیید کنید که همین کار را می‌خواهید انجام دهید.",
+       "lockconfirm": "بله، من جداً می‌خواهم پایگاه داده را قفل کنم.",
+       "unlockconfirm": "بله، من جداً می‌خواهم پایگاه داده را از قفل در آورم.",
+       "lockbtn": "قفل کردن پایگاه داده",
+       "unlockbtn": "از قفل درآوردن پایگاه داده",
+       "locknoconfirm": "شما در جعبهٔ تأیید تیک نزدید",
+       "lockdbsuccesssub": "قفل کردن پایگاه داده با موفقیت انجام شد",
+       "unlockdbsuccesssub": "قفل پایگاه داده برداشته شد",
+       "lockdbsuccesstext": "پایگاه داده قفل شد.\n<br />فراموش نکنید [[Special:UnlockDB|remove the lock]] که پس از اتمام نگهداری قفل را بردارید.",
+       "unlockdbsuccesstext": "پایگاه داده از قفل در آمد.",
+       "lockfilenotwritable": "قفل پایگاه داده نوشتنی نیست. برای این که بتوانید پایگاه داده را قفل یا باز کنید، باید این پرونده نوشتنی باشد.",
+       "databasenotlocked": "پایگاه داده قفل نیست.",
+       "lockedbyandtime": "(به وسیلهٔ $1 در $2 ساعت $3)",
+       "move-page": "انتقال $1",
+       "move-page-legend": "جاوواز کردن وةڵگة",
+       "movepagetext": "با استفاده از فرم زیر نام صفحه تغییر خواهد کرد، و تمام تاریخچه‌اش به نام جدید منتقل خواهد شد.\nعنوان قدیمی تبدیل به یک صفحهٔ تغییرمسیر به عنوان جدید خواهد شد.\nشما می‌توانید تغییرمسیرهایی که به عنوان اصلی اشاره دارند را به صورت خودکار به‌روزرسانی کنید.\nپیوندهای که به عنوان صفحهٔ قدیمی وجود دارند، تغییر نخواهند کرد؛ حتماً تغییرمسیرهای [[Special:DoubleRedirects|دوتایی]] یا [[Special:BrokenRedirects|خراب]] را بررسی کنید.\n'''شما''' مسئول اطمینان از این هستید که پیوندها هنوز به همان‌جایی که قرار است بروند.\n\nتوجه کنید که اگر از قبل صفحه‌ای در عنوان جدید وجود داشته باشد صفحه منتقل '''نخواهد شد'''،\nمگر این آخرین ویرایش تغییرمسیر باشد و در  تاریخچهٔ ویرایشی نداشته باشد.\nاین یعنی اگر اشتباه کردید می‌توانید صفحه را به همان جایی که از آن منتقل شده بود برگردانید، و این که نمی‌توانید روی صفحات موجود بنویسید.\n\n'''هشدار!'''\nانتقال صفحات به نام جدید ممکن است تغییر اساسی و غیرمنتظره‌ای برای صفحات محبوب باشد؛\nلطفاً مطمئن شوید که قبل از انتقال دادن صفحه، عواقب این کار را درک می‌کنید.",
+       "movepagetext-noredirectfixer": "استفاده از فرم زیر سبب تغییر نام یک صفحه و انتقال تمام تاریخچهٔ آن به نام جدید می‌شود.\nعنوان پیشین تغییرمسیری به عنوان جدید خواهد شد.\nبه خاطر داشته باشید که [[Special:DoubleRedirects|تغییرمسیرهای دوتایی]] یا [[Special:BrokenRedirects|تغییرمسیرهای خراب]] را بررسی کنید.\nشما مسئولید که مطمئن شوید پس از انتقال، پیوندها به عنوان پیشین به جایی منتهی می‌شوند که باید.\n\nتوجه کنید که اگر صفحه‌ای تحت عنوان جدید از قبل موجود باشد، انتقال انجام '''نخواهد شد'''، مگر اینکه صفحه خالی و یا تغییرمسیر باشد و تاریخچهٔ ویرایشی دیگری نداشته باشد.\nاین یعنی اگر صفحه را به نامی اشتباه منتقل کردید می‌توانید این تغییر را واگردانی کنید، اما نمی‌توانید یک صفحه را به صفحه‌ای که از قبل موجود است انتقال دهید.\n\n'''هشدار!'''\nانتقال صفحه‌های پربیننده ممکن است عملی غیرمنتظره باشد؛\nلطفاً پیش از انتقال مطمئن شوید از نتیجهٔ کار آگاهید.",
+       "movepagetalktext": "اگر این گزینه را انتخاب کنید، صفحهٔ بحث مرتبط به صورت خودکار انتقال داده می‌شود به عنوان جدید و در صورت عدم انتخاب گزینه، صفحهٔ بحث جدید یک صفحهٔ خالی خواهد بود و در این حالت، باید صفحه را بطور دستی انتقال داده و یا محتویات دو صفحه را با ویرایش ادغام کنید.",
+       "moveuserpage-warning": "'''هشدار:''' شما در حال انتقال دادن یک صفحهٔ کاربر هستید. توجه داشته باشید که تنها صفحه منتقل می‌شود و نام کاربر تغییر '''نمی‌یابد'''.",
+       "movecategorypage-warning": "<strong>هشدار:</strong> شما در حال انتقال صفحه رده هستید. لطفاً توجه داشته باشید که فقط صفحه منتقل خواهد شد و  صفحات در رده قدیمی می‌مانند و به رده جدید <em>نمی‌روند</em>.",
+       "movenologintext": "برای انتقال صفحات باید کاربر ثبت‌شده بوده و [[Special:UserLogin|به سامانه وارد شوید]].",
+       "movenotallowed": "شما اجازهٔ انتقال دادن صفحات را ندارید.",
+       "movenotallowedfile": "شما اجازهٔ انتقال پرونده‌ها را ندارید.",
+       "cant-move-user-page": "شما اجازه ندارید صفحه‌های کاربری سرشاخه را انتقال دهید.",
+       "cant-move-to-user-page": "شما اجازه ندارید که یک صفحه را به یک صفحهٔ کاربر انتقال دهید (به استثنای زیر صفحه‌های کاربری).",
+       "cant-move-category-page": "شما اجازهٔ انتقال دادن صفحهٔ رده‌ها را ندارید.",
+       "cant-move-to-category-page": "شما مجوز برای انتقال صفحه به صفحه رده ندارید.",
+       "newtitle": "عنوان تازه:",
+       "move-watch": "پی‌گیری صفحه‌های مبدأ و مقصد",
+       "movepagebtn": "جاوواز کردن وةڵگة",
+       "pagemovedsub": "انتقال با موفقیت انجام شد",
+       "movepage-moved": "'''«$1» به «$2» منتقل شد'''",
+       "movepage-moved-redirect": "یک تغییرمسیر ایجاد شد.",
+       "movepage-moved-noredirect": "از ایجاد تغییرمسیر ممانعت شد.",
+       "articleexists": "صفحه‌ای با این نام از قبل وجود دارد، یا نامی که انتخاب کرده‌اید معتبر نیست.\nلطفاً نام دیگری انتخاب کنید.",
+       "cantmove-titleprotected": "شما نمی‌توانید صفحه را به این نشانی انتقال دهید، چرا که عنوان جدید در برابر ایجاد محافظت شده‌است",
+       "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": "حداکثر تعداد صفحه‌های ممکن ($1 {{PLURAL:$1|صفحه|صفحه ها}}) که می‌توان انتقال داد منتقل شدند و صفحه‌های دیگر را نمی‌توان به طور خودکار منتقل کرد.",
+       "movelogpage": "سیاههٔ انتقال",
+       "movelogpagetext": "در زیر فهرستی از انتقال صفحات آمده‌است.",
+       "movesubpage": "{{PLURAL:$1|زیرصفحه|زیرصفحه‌ها}}",
+       "movesubpagetext": "این صفحه $1 زیرصفحه دارد که در زیر نمایش {{PLURAL:$1|یافته‌است|یافته‌اند}}.",
+       "movenosubpage": "این صفحه هیچ زیرصفحه‌ای ندارد.",
+       "movereason": ":دةلیل",
+       "revertmove": "واگردانی/گِلآ دائن",
+       "delete_and_move_text": "== نیاز به حذف ==\n\nمقالهٔ مقصد «[[:$1]]» وجود دارد. آیا می‌خواهید آن را حذف کنید تا انتقال ممکن شود؟",
+       "delete_and_move_confirm": "بله، صفحه حذف شود",
+       "delete_and_move_reason": "حذف برای ممکن‌شدن انتقال  «[[$1]]»",
+       "selfmove": "عنوان‌های صفحهٔ مبدأ و مقصد یکی است؛\nانتقال صفحه به خودش ممکن نیست.",
+       "immobile-source-namespace": "امکان انتقال صفحه‌ها در فضای نام «$1» وجود ندارد",
+       "immobile-target-namespace": "امکان انتقال صفحه‌ها به فضای نام «$1» وجود ندارد",
+       "immobile-target-namespace-iw": "پیوند میان‌ویکی هدفی مجاز برای انتقال صفحه نیست.",
+       "immobile-source-page": "این صفحه قابل انتقال نیست.",
+       "immobile-target-page": "امکان انتقال به این عنوان مقصد وجود ندارد.",
+       "bad-target-model": "مقصد مورد نظر از مدل محتوایی متفاوتی استفاده می‌کند. تبدیل $1 به $2 ممکن نیست.",
+       "imagenocrossnamespace": "امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد",
+       "nonfile-cannot-move-to-file": "امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد",
+       "imagetypemismatch": "پسوند پرونده تازه با نوع آن سازگار نیست",
+       "imageinvalidfilename": "نام پروندهٔ هدف نامجاز است",
+       "fix-double-redirects": "به روز کردن تمامی تغییرمسیرهایی که به مقالهٔ اصلی اشاره می‌کنند",
+       "move-leave-redirect": "بر جا گذاشتن یک تغییرمسیر",
+       "protectedpagemovewarning": "'''هشدار:''' این صفحه قفل شده‌است به طوری که تنها کاربران با دسترسی مدیریت می‌توانند آن را انتقال دهند.\nآخرین موارد سیاهه در زیر آمده است:",
+       "semiprotectedpagemovewarning": "'''تذکر:''' این صفحه قفل شده‌است به طوری که تنها کاربران ثبت نام کرده می‌توانند آن را انتقال دهند.\nآخرین موارد سیاهه در زیر آمده است:",
+       "move-over-sharedrepo": "== پرونده موجود است ==\n[[:$1]] در یک مخزن مشترک وجود دارد. انتقال یک پرونده به این نام باعث باطل شدن پرونده مشترک خواهد شد.",
+       "file-exists-sharedrepo": "نام پرونده انتخاب شده از قبل در یک مخزن مشترک استفاده شده‌است.\nلطفاً یک نام دیگر برگزینید.",
+       "export": "برون‌بری صفحات",
+       "exporttext": "شما می‌توانید متن و تاریخچهٔ ویرایش یک صفحهٔ مشخص یا مجموعه‌ای از صفحات را به شکل پوشیده در اکس‌ام‌ال برون‌بری کنید.\nاین اطلاعات را می‌توان در ویکی دیگری که نرم‌افزار «مدیاویکی» را اجرا می‌کند از طریق [[Special:Import|صفحهٔ درون‌ریزی]] وارد کرد.\n\nبرای برون‌بری صفحات، عنوان آن‌ها را در جعبهٔ زیر وارد کنید (در هر سطر فقط یک عنوان) و مشخص کنید که آیا نسخهٔ اخیر صفحه را به همراه نسخه‌های قدیمی‌تر و تاریخچهٔ صفحه می‌خواهید، یا تنها نسخهٔ اخیر صفحه و اطلاعات آخرین ویرایش را می‌خواهید.\n\nدر حالت دوم، شما می‌توانید از یک پیوند استفاده کنید، مثلاً [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] برای صفحهٔ «[[{{MediaWiki:Mainpage}}]]».",
+       "exportall": "برون‌بری همهٔ صفحات",
+       "exportcuronly": "فقط نسخهٔ فعلی شامل شود، نه کل تاریخچه",
+       "exportnohistory": "----\n'''توجه:''' امکان برون‌بری تاریخچهٔ کامل صفحات از طریق این صفحه به دلایل اجرایی از کار انداخته شده‌است.",
+       "exportlistauthors": "شامل فهرست کامل مشارکت‌کنندگان هر صفحه",
+       "export-submit": "در بِردن",
+       "export-addcattext": ":افزودن وةڵگةل إژ رده/ڕِزگ",
+       "export-addcat": "افزودن",
+       "export-addnstext": "افزودن صفحات از فضای نام:",
+       "export-addns": "افزودن",
+       "export-download": "ذخیره به صورت پرونده",
+       "export-templates": "شامل شدن الگوها",
+       "export-pagelinks": "شامل شدن صفحه‌های پیوند شده تا این عمق:",
+       "allmessages": "پیغام‌های سامانه",
+       "allmessagesname": "نؤم",
+       "allmessagesdefault": "متن پیش‌فرض پیغام",
+       "allmessagescurrent": "متن کنونی پیغام",
+       "allmessagestext": "این فهرستی از پیغام‌های سامانه‌ای موجود در فضای نام مدیاویکی است.\nچنانچه مایل به مشارکت در محلی‌سازی مدیاویکی هستید لطفاً [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation محلی‌سازی مدیاویکی] و [//translatewiki.net translatewiki.net] را ببینید.",
+       "allmessagesnotsupportedDB": "این صفحه نمی‌تواند استفاده شود به این دلیل که <bdi>'''$wgUseDatabaseMessages'''</bdi> غیرفعال شده‌است.",
+       "allmessages-filter-legend": "پالانۀل/فیلترۀل",
+       "allmessages-filter": "پالودن بر اساس وضعیت شخصی‌سازی:",
+       "allmessages-filter-unmodified": "تغییر نیافته",
+       "allmessages-filter-all": "کۆل",
+       "allmessages-filter-modified": "تغییر یافته",
+       "allmessages-prefix": "پالودن بر اساس پسوند:",
+       "allmessages-language": ":زوون",
+       "allmessages-filter-submit": "بِچۆ",
+       "allmessages-filter-translate": "چاوواشۀگر زوون",
+       "thumbnail-more": "کۀلنگ کِردن",
+       "filemissing": "پرونده وجود ندارد",
+       "thumbnail_error": "خطا در ایجاد بندانگشتی: $1",
+       "thumbnail_error_remote": "پیام خطای  $1 :\n$2",
+       "djvu_page_error": "صفحهٔ DjVu خارج از حدود مجاز",
+       "djvu_no_xml": "امکان پیدا کردن پروندهٔ XML برای استفادهٔ DjVu وجود نداشت.",
+       "thumbnail-temp-create": "نمی‌توان پروندهٔ بندانگشتی موقت را ساخت",
+       "thumbnail-dest-create": "نمی‌توان تصویر بندانگشتی را در مقصد ذخیره کرد",
+       "thumbnail_invalid_params": "پارامترهای نامجاز در تصویر بندانگشتی (thumbnail)",
+       "thumbnail_toobigimagearea": "پرونده‌ای با اندازهٔ بیشتر از $1",
+       "thumbnail_dest_directory": "اشکال در ایجاد پوشهٔ مقصد",
+       "thumbnail_image-type": "تصویر از نوع پشتیبانی نشده",
+       "thumbnail_gd-library": "تنظیمات ناقص کتابخانهٔ GD: عملکرد $1 وجود ندارد",
+       "thumbnail_image-missing": "پرونده به نظر گم شده‌است: $1",
+       "thumbnail_image-failure-limit": "تلاش‌های ناموفق اخیر بسیاری ($1 یا بیشتر) برای ارائهٔ این تصویر کوچک وجود داشته‌ است. لطفأ بعداً دوباره تلاش کنید.",
+       "import": "واردکردن وةڵگةل",
+       "importinterwiki": "درون‌ریزی از یک ویکی دیگر",
+       "import-interwiki-text": "یک ویکی و یک نام صفحه را انتخاب کنید تا اطلاعات از آن درون‌ریزی شود.\nتاریخ نسخه‌ها و نام ویرایش‌کنندگان ثابت خواهد ماند.\nاطلاعات مربوط به درون‌ریزی صفحات از ویکی دیگر در [[Special:Log/import|سیاههٔ درون‌ریزی‌ها]] درج خواهد شد.",
+       "import-interwiki-sourcewiki": "ویکی منبع:",
+       "import-interwiki-sourcepage": "صفحهٔ مبدأ:",
+       "import-interwiki-history": "تمام نسخه‌های تاریخچهٔ این صفحه انتقال داده شود",
+       "import-interwiki-templates": "تمام الگوها را شامل شود",
+       "import-interwiki-submit": "درون‌ریزی شود",
+       "import-mapping-default": "درون‌ریزی برای موقعیت‌های پیش‌فرض",
+       "import-mapping-namespace": "درون‌ریزی برای یک فضای نام:",
+       "import-mapping-subpage": "درون‌ریزی به عنوان زیرصفحهٔ صفحهٔ:",
+       "import-upload-filename": "نام پرونده:",
+       "import-comment": ":گةپةل/قِسةل",
+       "importtext": "لطفاً پرونده را از ویکی منبع با کمک [[Special:Export|ابزار برون‌بری]] دریافت کنید.\nسپس آن را روی دستگاه‌تان ذخیره کنید و اینجا بارگذاری نمایید.",
+       "importstart": "در حال درون‌ریزی صفحات...",
+       "import-revision-count": "$1 {{PLURAL:$1|  ویرایش ها|ویرایش}}",
+       "importnopages": "صفحه‌ای برای درون‌ریزی نیست.",
+       "imported-log-entries": "$1 {{PLURAL:$1|مورد سیاهه|مورد سیاهه ها}} درون ریزی شد.",
+       "importfailed": "درون‌ریزی صفحات شکست خورد: <nowiki>$1</nowiki>",
+       "importunknownsource": "نوع مأخذ درون‌ریزی معلوم نیست",
+       "importcantopen": "پروندهٔ درون‌ریزی صفحات باز نشد",
+       "importbadinterwiki": "پیوند میان‌ویکی نادرست",
+       "importsuccess": "درون‌ریزی با موفقیت انجام شد!",
+       "importnosources": "هیچ منبعی برای درون‌ریزی اطلاعات از ویکی‌های دیگر تعریف نشده‌است.",
+       "importnofile": "هیچ پرونده‌ای برای درون‌ریزی بارگذاری نشده‌است.",
+       "importuploaderrorsize": "در بارگذاری پروندهٔ درون‌ریزی، اشکال رخ داد.\nاندازهٔ پرونده بیشتر از حداکثر اندازهٔ مجاز است.",
+       "importuploaderrorpartial": "در بارگذاری پروندهٔ درون‌ریزی، اشکال رخ داد. پرونده به طور ناقص بارگذاری شده‌است.",
+       "importuploaderrortemp": "در بارگذاری پروندهٔ درون‌ریزی، اشکال رخ داد.\nپوشهٔ موقت پیدا نشد.",
+       "import-parse-failure": "خطا در تجزیهٔ اکس‌ام‌ال بارگذاری‌شده",
+       "import-noarticle": "صفحه‌ای برای بارگذاری وجود ندارد!",
+       "import-nonewrevisions": "نسخه‌ای درون‌ریزی نشد (همه یا در حال حاضر وجود دارند، یا به دلیل خطا‌ها نادیده گرفته شده‌اند).",
+       "xml-error-string": "$1 در سطر $2، ستون $3 (بایت $4): $5",
+       "import-upload": "بارگذاری داده اکس‌ام‌ال",
+       "import-token-mismatch": "از دست رفتن اطلاعات نشست کاربری. لطفاً دوباره امتحان کنید.",
+       "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-error-unserialize": "امکان خارج کردن نسخهٔ $2 از صفحهٔ «$1» از حالت سریال‌شده وجود نداشت. گزارش شد که نسخه از مدل محتوای $3 استفاده می‌کند که به صورت $4 سریال شده‌است.",
+       "import-error-bad-location": "بازبینی $2 با استفاده از مدل محتوای $3 نمی‌تواند در \"$1\" در این ویکی ذخیره شده باشد، از آنجایی که مدل در آن صفحه پشتیبانی نشده‌است.",
+       "import-options-wrong": "{{PLURAL:$2|جزئیات|جزئیات ها}} اشتباه: <nowiki>$1</nowiki>",
+       "import-rootpage-invalid": "با توجه به ریشه صفحه عنوان نامعتبر است.",
+       "import-rootpage-nosubpage": "فضای نام  \"$1\" صفحهٔ مبنا اجازهٔ زیرصفحه نمی‌دهد.",
+       "importlogpage": "سیاههٔ درون‌ریزی‌ها",
+       "importlogpagetext": "درون‌ریزی صفحات به همراه تاریخچهٔ ویرایش آن‌ها از ویکی‌های دیگر.",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|نسخه|نسخه ها}} واردشده",
+       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|نسخه|نسخه ها}} واردشده از $2",
+       "javascripttest": "آزمایش جاوا اسکریپت",
+       "javascripttest-pagetext-noframework": "این صفحه برای اجرای آزمایش‌های جاوا اسکریپت کنار گذاشته شده‌است.",
+       "javascripttest-pagetext-unknownframework": "چارچوب آزمایشی ناشناخته «$1».",
+       "javascripttest-pagetext-unknownaction": "تابع ناشناختهٔ \"$1\".",
+       "javascripttest-pagetext-frameworks": "لطفاً یکی از چارچوب‌های آزمایش زیر را انتخاب کنید: $1",
+       "javascripttest-pagetext-skins": "پوسته‌ای را برای اجرای آزمایش‌ها انتخاب کنید:",
+       "javascripttest-qunit-intro": "[$1 مستندات آزمایش] را در mediawiki.org ببینید.",
+       "tooltip-pt-userpage": "وةڵگة کاربۀری هؤمۀ",
+       "tooltip-pt-anonuserpage": "صفحهٔ کاربری نشانی آی‌پی‌ای که با آن ویرایش می‌کنید",
+       "tooltip-pt-mytalk": "وۀلگۀ گۀپ هؤمۀ",
+       "tooltip-pt-anontalk": "بحث پیرامون ویرایش‌های این نشانی آی‌پی",
+       "tooltip-pt-preferences": "ترجیحات ووِژم",
+       "tooltip-pt-watchlist": "فهرست صفحه‌هایی که شما تغییرات آن‌ها را پی‌گیری می‌کنید",
+       "tooltip-pt-mycontris": "فهرست مشارکت‌های شما",
+       "tooltip-pt-anoncontribs": "لیست دةسکاریةل دؤرس بی/سازریا إژ ئئ آدرس ای پی",
+       "tooltip-pt-login": "توصیه مۀکیم بونإ نام سامانه ، هۀرچۀند اجباری نیۀ",
+       "tooltip-pt-logout": "دةرچئن/خروج",
+       "tooltip-pt-createaccount": "مکئس تانۀ مۀکیم حساووئ بسازن و بونإ سامانۀ؛ هرچۀند حساوو کاربری سازین دل .بخوایۀ",
+       "tooltip-ca-talk": "گۀپ/قسۀ دۀربارۀ بنچۀک/محتوا وۀلگۀ",
+       "tooltip-ca-edit": "ئئ وۀلگۀ دۀسکاری کۀن",
+       "tooltip-ca-addsection": "بۀخش تازه بسازِن",
+       "tooltip-ca-viewsource": ".ئئ وۀلگۀ محافظۀت بیۀ\nمۀتؤنین  متن مبدأ/بنچۀک بؤینین",
+       "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": "بچؤ وۀلگۀ گإ نام راسکانی/دقیق هۀسئ",
+       "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": " وۀلگۀ بۀختۀکی  ئآوردِن",
+       "tooltip-n-help": "جای أرا پئاکردن/أدی کردن",
+       "tooltip-t-whatlinkshere": "لیست کؤل وۀلگۀل ویکی گإ پیوۀند درن ائرۀ",
+       "tooltip-t-recentchangeslinked": "تغییرۀل ایسۀ وۀلگۀلئ گإ ئئ وۀلگۀ  پیوند درئۀ  اؤِنۀ",
+       "tooltip-feed-rss": "خبرنامه آراس‌اس برای این صفحه",
+       "tooltip-feed-atom": "حاووال اتم أرا ئئ وۀلگۀ",
+       "tooltip-t-contributions": "لیست هؤمکاریۀل ئئ کاربرۀ",
+       "tooltip-t-emailuser": "ارسال ایمیل به این کاربر",
+       "tooltip-t-info": "اطلاعات بیشتر دربارهٔ این صفحه",
+       "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": "پیش‌نمایش تغییرات شما، لطفاً قبل از ذخیره‌کردن صفحه از این کلید استفاده     \nکنید",
+       "tooltip-diff": ".نمایش تغییراتی که شما در متن داده‌اید",
+       "tooltip-compareselectedversions": "دیدن تفاوت‌های دو نسخهٔ انتخاب‌شده از این صفحه",
+       "tooltip-watch": "این صفحه را به فهرست پی‌گیری‌هایتان بیفزایید.",
+       "tooltip-watchlistedit-normal-submit": "حذف عنوان‌ها",
+       "tooltip-watchlistedit-raw-submit": "بروزرسانی پی‌گیری‌ها",
+       "tooltip-recreate": "ایجاد دوبارهٔ صفحه صرف نظر از حذف شدن قبلی آن",
+       "tooltip-upload": "شروع بارگذاری",
+       "tooltip-rollback": "«واگردانی» ویرایش(های) آخرین ویرایش‌کنندهٔ این صفحه را با یک کلیک بازمی‌گرداند.",
+       "tooltip-undo": "«خنثی‌سازی» این ویرایش را خنثی می‌کند و جعبهٔ ویرایش را در حالت پیش‌نمایش باز می‌کند تا افزودن دلیل در خلاصهٔ ویرایش ممکن شود.",
+       "tooltip-preferences-save": "ذخیره کردن ترجیحات",
+       "tooltip-summary": "خلاصه‌ای وارد کنید",
+       "anonymous": "{{PLURAL:$1|کاربر|کاربران}} گمنام {{SITENAME}}",
+       "siteuser": "$1، کاربر {{SITENAME}}",
+       "anonuser": "$1 کاربر ناشناس {{SITENAME}}",
+       "lastmodifiedatby": "این صفحه آخرین بار در $2، $1 به دست $3 تغییر یافته‌است.",
+       "othercontribs": "بر اساس اثری از $1",
+       "others": "دیگران",
+       "siteusers": "$1، {{PLURAL:$2|کاربر|کاربران}} {{SITENAME}}",
+       "anonusers": "$1 {{PLURAL:$2|کاربر|کاربران}} ناشناس {{SITENAME}}",
+       "creditspage": "اعتبارات این صفحه",
+       "nocredits": "اطلاعات سازندگان این صفحه موجود نیست.",
+       "spamprotectiontitle": "پالایهٔ هرزنگاری‌ها",
+       "spamprotectiontext": "از ذخیره کردن صفحه توسط پالایهٔ هرزنگاری‌ها جلوگیری شد.\nمعمولاً این اتفاق زمانی می‌افتد که متن تازه صفحه، حاوی پیوندی به یک نشانی وب باشد که در فهرست سیاه قرار دارد.",
+       "spamprotectionmatch": "متن زیر چیزی‌است که پالایهٔ هرزه‌نگاری ما را به کارانداخت: $1",
+       "spambot_username": "هرزه‌تمیزکارِ مدیاویکی",
+       "spam_reverting": "واگردانی به آخرین نسخه‌ای که پیوندی به $1 ندارد.",
+       "spam_blanking": "تمام نسخه‌ها حاوی پیوند به $1 بود، در حال خالی کردن",
+       "spam_deleting": "تمام نسخه‌ها حاوی پیوند به $1 بود، در حال حذف",
+       "simpleantispam-label": ".بررسی ضدهرزنگاری\n<strong>نکنید</strong>!این قسمت را پر",
+       "pageinfo-title": "اطلاعات در مورد «$1»",
+       "pageinfo-not-current": "متأسفانه تهیه اطلاعات ویرایش‌های قدیمی غیرممکن است.",
+       "pageinfo-header-basic": "اطلاعات اولیه",
+       "pageinfo-header-edits": "ویرایش تاریخچه",
+       "pageinfo-header-restrictions": "حفاظت از صفحه",
+       "pageinfo-header-properties": "ويژگی‌های صفحه",
+       "pageinfo-display-title": "نمایش عنوان",
+       "pageinfo-default-sort": "کلید مرتب‌سازی پیش‌فرض",
+       "pageinfo-length": "حجم صفحه  (بایت)",
+       "pageinfo-article-id": "شناسهٔ صفحه",
+       "pageinfo-language": "زبان محتوای صفحه",
+       "pageinfo-content-model": "ساختار محتوای صفحه",
+       "pageinfo-robot-policy": "‌فهرست‌کردن توسط ربات‌ها",
+       "pageinfo-robot-index": "مجاز",
+       "pageinfo-robot-noindex": "بی صلا",
+       "pageinfo-watchers": "شمار پی‌گیری‌کنندگان صفحه",
+       "pageinfo-visiting-watchers": "تعداد پیگیری‌کنندگان صفحه که تغییرات اخیر را بازبینی کرده‌اند",
+       "pageinfo-few-watchers": "کمتر از  $1 {{PLURAL:$1| پی‌گیرها|پی‌گیر}}",
+       "pageinfo-few-visiting-watchers": "امکان دارد یا ندارد که کاربری ویرایش‌های اخیر را بازبینی کرده باشد",
+       "pageinfo-redirects-name": "تعداد تغییرمسیرها به این صفحه",
+       "pageinfo-subpages-name": "زیرصفحه‌های این صفحه",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|تغییرمسیر|تغییرمسیرها}}; $3 {{PLURAL:$3|غیرتغییرمسیر|غیرتغییرمسیر ها}})",
+       "pageinfo-firstuser": "به‌وجود آورندهٔ صفحه",
+       "pageinfo-firsttime": "زمان ایجاد صفحه",
+       "pageinfo-lastuser": "آخرین دةسکاری کةر",
+       "pageinfo-lasttime": "تاریخ آخرین ویرایش",
+       "pageinfo-edits": "شمار کلی ویرایش‌ها",
+       "pageinfo-authors": "تعداد کلی نویسندگان یکتا",
+       "pageinfo-recent-edits": "شماره ویرایش‌های اخیر (در $1 گذشته)",
+       "pageinfo-recent-authors": "تعداد نویسندگان یکتای اخیر",
+       "pageinfo-magic-words": "{{PLURAL:$1|حرف|حروف}} جادویی ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )",
+       "pageinfo-templates": "{{PLURAL:$1|الگو|الگوها}} استفاده‌شده ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|صفحهٔ|صفحه‌های}} تراگنجانش‌شده در ($1)",
+       "pageinfo-toolboxlink": "اطلاعات وۀلگۀ/پۀرۀ",
+       "pageinfo-redirectsto": "تغییرمسیر به",
+       "pageinfo-redirectsto-info": "زانستةنیةل",
+       "pageinfo-contentpage": "شمرده شده به عنوان صفحهٔ محتوایی",
+       "pageinfo-contentpage-yes": "أرێ-بةلئ",
+       "pageinfo-protect-cascading": "محافظت آبشاری از اینجا",
+       "pageinfo-protect-cascading-yes": "أرێ-بةلئ",
+       "pageinfo-protect-cascading-from": "محافظت آبشاری از",
+       "pageinfo-category-info": "اطلاعات رده",
+       "pageinfo-category-total": "تعداد کلی اعضاء",
+       "pageinfo-category-pages": "تعداد وۀلگۀل",
+       "pageinfo-category-subcats": "تعداد زیررده‌ها",
+       "pageinfo-category-files": "تعداد پرونده‌ها",
+       "markaspatrolleddiff": "برچسب گشت بزن",
+       "markaspatrolledtext": "به این صفحه برچسب گشت بزن",
+       "markedaspatrolled": "برچسب گشت زده شد",
+       "markedaspatrolledtext": "به نسخهٔ انتخاب شده از [[:$1]] برچسب گشت زده شد.",
+       "rcpatroldisabled": "گشت‌زنی تغییرات اخیر غیرفعال است",
+       "rcpatroldisabledtext": "امکان گشت‌زنی تغییرات اخیر در حال حاضر غیرفعال است.",
+       "markedaspatrollederror": "برچسب گشت زده نشد",
+       "markedaspatrollederrortext": "باید یک نسخه را مشخص کنید تا برچسب گشت بخورد.",
+       "markedaspatrollederror-noautopatrol": "شما نمی‌توانید به تغییرات انجام شده توسط خودتان برچسب گشت بزنید.",
+       "markedaspatrollednotify": "این تغییر روی $1 برچسب گشت خورد.",
+       "markedaspatrollederrornotify": "زدن برچسب گشت، ناموفق بود.",
+       "patrol-log-page": "سیاههٔ گشت",
+       "patrol-log-header": "این سیاهه‌ای از ویرایش‌های گشت‌خورده است.",
+       "log-show-hide-patrol": "$1 سیاههٔ گشت‌زنی",
+       "log-show-hide-tag": "$1 سیاهه برچسب",
+       "deletedrevision": "$1 نسخهٔ حذف شدهٔ قدیمی",
+       "filedeleteerror-short": "خطا در حذف پرونده: $1",
+       "filedeleteerror-long": "در زمان حذف پرونده خطا رخ داد:\n\n$1",
+       "filedelete-missing": "پروندهٔ $1 قابل حذف نیست چون پرونده‌ای به این نام وجود ندارد.",
+       "filedelete-old-unregistered": "نسخهٔ پروندهٔ $1 در پایگاه داده وجود ندارد.",
+       "filedelete-current-unregistered": "پرونده‌ای با نام $1 در پایگاه داده موجود نیست.",
+       "filedelete-archive-read-only": "امکان نوشتن در پوشهٔ تاریخچهٔ $1 وجود ندارد.",
+       "previousdiff": "→ تفاوت قدیمی‌تر",
+       "nextdiff": "تفاوت جدیدتر ←",
+       "mediawarning": "'''هشدار''': این پرونده ممکن است حاوی کدهای مخرب باشد.\nبا اجرای آن رایانهٔ شما ممکن است آسیب ببیند.",
+       "imagemaxsize": "محدودیت ابعاد تصویر:<br />''(برای صفحه‌های توصیف پرونده)''",
+       "thumbsize": "اندازهٔ بنداگشتی:",
+       "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 pixels, اندازه پرونده: $3, MIME type: $4, $5 {{PLURAL:$5|وةڵگة| وةڵگة }}",
+       "file-nohires": "تفکیک‌پذیری بالاتری در دسترس نیست.",
+       "svg-long-desc": "SVG file, nominally $1 × $2 pixels, file size: $3",
+       "svg-long-desc-animated": "پروندهٔ اس‌وی‌جی متحرک، با ابعاد <span dir=\"ltr\">$1 × $2</span> پیکسل، اندازهٔ پرونده: $3",
+       "svg-long-error": "پرونده SVG نامجاز: $1",
+       "show-big-image": "پۀروۀندۀ اصلی",
+       "show-big-image-preview": ". اندازهٔ این پیش‌نمایش: $1",
+       "show-big-image-preview-differ": "حجم پیش‌نمایش $3 این $2 file:$1",
+       "show-big-image-other": " . $1:تر/دیگر{{PLURAL:$2|کیفیت|کیفیتۀل}}",
+       "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": "{{PLURAL:$1|$1 {{PLURAL:$1|بارها|بار}} پخش شد}}",
+       "file-info-png-frames": "$1 {{PLURAL:$1|قاب ها|قاب}}",
+       "file-no-thumb-animation": "'''توجه: به علت مسائل فنی پیش‌نمایش پرونده به صورت متحرک نمایش داده نمی‌شود.'''",
+       "file-no-thumb-animation-gif": "'''توجه:به علت مسائل فنی پیش‌نمایش پرونده‌های GIF مانند این پرونده، به صورت متحرک نمایش داده نمی‌شود.'''",
+       "newimages": "نگارخانهٔ پرونده‌های جدید",
+       "imagelisttext": "در زیر فهرست $1 {{PLURAL:$1|تصویر|تصاویر}} که $2 مرتب شده است آمده است.",
+       "newimages-summary": "این صفحهٔ ویژه آخرین پرونده‌های بارگذاری شده را نمایش می‌دهد",
+       "newimages-legend": "پالانۀل/فیلترۀل",
+       "newimages-label": "نام پرونده (یا قسمتی از آن):",
+       "newimages-showbots": "نمایش بارگذاری‌ها توسط ربات‌ها",
+       "noimages": "چیزی برای دیدن نیست.",
+       "ilsubmit": "گئردین/مهِ نی",
+       "bydate": "از روی تاریخ",
+       "sp-newimages-showfrom": "نشان‌دادن تصویرهای جدید از $2، $1 به بعد",
+       "seconds": "{{PLURAL:$1|$1 ثانیه ها|$1 ثانیه یا}}",
+       "minutes": "{{PLURAL:$1|دقیقه ها|دقیقه}}",
+       "hours": "{{PLURAL:$1|ساعت ها|ساعت}}",
+       "days": "{{PLURAL:$1|روزها|روز}}",
+       "weeks": "{{PLURAL:$1|$1 هفته ها|$1 هفته}}",
+       "months": "{{PLURAL:$1|$1 ماه|}}",
+       "years": "{{PLURAL:$1|$1 سال|}}",
+       "ago": "$1 دؤماتر",
+       "just-now": "فقط ایسه",
+       "hours-ago": "$1 {{PLURAL:$1|ساعت |ساعتةلئ}} دماتر",
+       "minutes-ago": "$1 {{PLURAL:$1|دیقه|دیقةلئ}} دماتر",
+       "seconds-ago": "$1 {{PLURAL:$1|ثانیه|ثانیه ها}} قبل",
+       "monday-at": "دوشنبهٔ $1",
+       "tuesday-at": "سه‌شنبهٔ $1",
+       "wednesday-at": "چهارشنبهٔ $1",
+       "thursday-at": "پنج‌شنبهٔ $1",
+       "friday-at": "جمعهٔ $1",
+       "saturday-at": "شنبهٔ $1",
+       "sunday-at": "یک‌شنبهٔ $1",
+       "yesterday-at": "دیروز در $1",
+       "bad_image_list": "اطلاعات را باید اینگونه وارد کنید:\n\nفقط موارد درون فهرست (سطرهایی که با * شروع می‌شوند) در نظر گرفته می‌شوند.\nنخستین پیوند هر سطر باید پیوندی به یک پروندهٔ معیوب باشد.\nپیوندهایی بعدی در همان سطر استثنا در نظر گرفته می‌شوند.",
+       "metadata": "فراداده",
+       "metadata-help": "این پرونده حاوی اطلاعات اضافه‌ای‌است که احتمالاً دوربین دیجیتال یا پویشگری که در ایجاد یا دیجیتالی‌کردن آن به کار رفته آن را افزوده‌است. اگر پرونده از وضعیت ابتدایی‌اش تغییر داده شده باشد آنگاه ممکن است شرح و تفصیلات موجود اطلاعات تصویر را تماماً بازتاب ندهد.",
+       "metadata-expand": "نمایش جزئیات تفصیلی",
+       "metadata-collapse": "نهفتن جزئیات تفصیلی",
+       "metadata-fields": "فرادادهٔ تصویر نشان داده شده در این پیغام وقتی جدول فراداده‌های تصویر جمع شده باشد هم نمایش داده می‌شود. بقیهٔ موارد تنها زمانی نشان داده می‌شوند که جدول یاد شده باز شود.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "پهنا",
+       "exif-imagelength": "بةرزی/ارتفاع",
+       "exif-bitspersample": "نقطه در هر جزء",
+       "exif-compression": "شِمای فشرده‌سازی",
+       "exif-photometricinterpretation": "ترکیب نقاط",
+       "exif-orientation": "جهت",
+       "exif-samplesperpixel": "تعداد اجزا",
+       "exif-planarconfiguration": "آرایش داده‌ها",
+       "exif-ycbcrsubsampling": "نسبت زیرنمونهٔ Y به C",
+       "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": "ضریب اف",
+       "exif-exposureprogram": "برنامهٔ نوردهی",
+       "exif-spectralsensitivity": "حساسیت طیفی",
+       "exif-isospeedratings": "درجه‌بندی سرعت ایزو",
+       "exif-shutterspeedvalue": "سرعت آپکس شاتر",
+       "exif-aperturevalue": "انازه اپکس دیافراگم",
+       "exif-brightnessvalue": "روشنایی آپکس",
+       "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": "تعادل رنگ سفید (white balance)",
+       "exif-digitalzoomratio": "نسبت زوم دیجیتال",
+       "exif-focallengthin35mmfilm": "فاصلهٔ کانونی برای فیلم ۳۵ میلی‌متری",
+       "exif-scenecapturetype": "نوع ضبط صحنه",
+       "exif-gaincontrol": "تنظیم صحنه",
+       "exif-contrast": "کنتراست",
+       "exif-saturation": "غلظت رنگ",
+       "exif-sharpness": "وضوح",
+       "exif-devicesettingdescription": "شرح تنظیمةل دستگاه",
+       "exif-subjectdistancerange": "محدودهٔ فاصلهٔ سوژه",
+       "exif-imageuniqueid": "شناسهٔ یکتای تصویر",
+       "exif-gpsversionid": "نسخهٔ برچسب جی‌پی‌اس",
+       "exif-gpslatituderef": "عرض جغرافیایی شمالی یا جنوبی",
+       "exif-gpslatitude": "عرض جغرافیایی",
+       "exif-gpslongituderef": "طول جغرافیایی شرقی یا غربی",
+       "exif-gpslongitude": "طول جغرافیایی",
+       "exif-gpsaltituderef": "نقطهٔ مرجع ارتفاع",
+       "exif-gpsaltitude": "ارتفاع",
+       "exif-gpstimestamp": "زمان جی‌پی‌اس (ساعت اتمی)",
+       "exif-gpssatellites": "ماهواره‌های استفاده‌شده برای اندازه‌گیری",
+       "exif-gpsstatus": "وضعیت گیرنده",
+       "exif-gpsmeasuremode": "حالت اندازه‌گیری",
+       "exif-gpsdop": "دقت اندازه‌گیری",
+       "exif-gpsspeedref": "یکای سرعت",
+       "exif-gpsspeed": "سرعت گیرندهٔ جی‌پی‌اس",
+       "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": "نام ناحیهٔ جی‌پی‌اس",
+       "exif-gpsdatestamp": "تاریخ جی‌پی‌اس",
+       "exif-gpsdifferential": "تصحیح جزئی جی‌پی‌اس",
+       "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-compression-1": "غیرفشرده",
+       "exif-compression-2": "رمزگذاری سی‌سی‌آی‌تی‌تی گروه ۳ یک بعدی به روش هافمن تغییریافته روی طول",
+       "exif-compression-3": "رمزگذاری نمابر سی‌سی‌آی‌تی‌تی گروه ۳",
+       "exif-compression-4": "رمزگذاری نمابر سی‌سی‌آی‌تی‌تی گروه ۴",
+       "exif-copyrighted-true": "دارای حق تکثیر",
+       "exif-copyrighted-false": "وضعیت حق‌تکثیر تعیین نشده است",
+       "exif-unknowndate": "تاریخ نامعلوم/نادیار",
+       "exif-orientation-1": "عادی",
+       "exif-orientation-2": "افقی/لاووةلا پشت و رو بیة",
+       "exif-orientation-3": "۱۸۰ درجه چرخیده",
+       "exif-orientation-4": "عمودی پشت و روشده",
+       "exif-orientation-5": "۹۰° پادساعتگرد چرخیده و عمودی پشت و رو شده",
+       "exif-orientation-6": "۹۰° پادساعتگرد چرخیده",
+       "exif-orientation-7": "۹۰° ساعتگرد چرخیده و عمودی پشت و رو شده",
+       "exif-orientation-8": "۹۰° ساعتگرد چرخیده",
+       "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": "سایر منبةل/بِنچةکةل",
+       "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": "قاب‌بندی خودکار (Auto bracket)",
+       "exif-whitebalance-0": "تنظیم خودکار تعادل رنگ سفید (white balance)",
+       "exif-whitebalance-1": "تنظیم دستی تعادل رنگ سفید (white balance)",
+       "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": "نمای دور",
+       "exif-gpslatitude-n": "عرض جغرافیایی شمالی",
+       "exif-gpslatitude-s": "عرض جغرافیایی جنوبی",
+       "exif-gpslongitude-e": "طول جغرافیایی شرقی",
+       "exif-gpslongitude-w": "طول جغرافیایی غربی",
+       "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": "اندازه‌گیری سه‌بعدی",
+       "exif-gpsspeed-k": "کیلومتر بر ساعت",
+       "exif-gpsspeed-m": "مایل بر ساعت",
+       "exif-gpsspeed-n": "گره",
+       "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": "شؤةکی و ایووارة",
+       "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": "کةڵنگ تر إژ ۶۵۵۳۵",
+       "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)",
+       "namespacesall": "کؤل",
+       "monthsall": "کؤل",
+       "confirmemail": "نیشانی ایمیل ووژتان تأئید کةن",
+       "confirmemail_noemail": "شما در صفحهٔ [[Special:Preferences|ترجیحات کاربری]] خود آدرس ایمیل معتبری وارد نکرده‌اید.",
+       "confirmemail_text": "این ویکی، شما را ملزم به تأیید آدرس ایمیل خود، پیش از استفاده از خدمات ایمیل در اینجا می‌کند. دکمهٔ زیرین را فعال کنید تا ایمیلی تأییدی به آدرس ایمیل شما فرستاده شود. این ایمیل دربردارندهٔ پیوندی خواهد بود که حاوی یک کد است. پیوند را در مرورگر خود بار کنید کنید تا آدرس ایمیل شما تأیید شود.",
+       "confirmemail_pending": "یک کد تأییدی پیشتر برای شما به صورت ایمیل فرستاده شده است. اگر همین اواخر حساب خود را باز کرده‌اید شاید بد نباشد که پیش از درخواست یک کد جدید چند دقیقه درنگ کنید تا شاید ایمیل قبلی برسد.",
+       "confirmemail_send": "پُست‌کردن یک کد تأیید",
+       "confirmemail_sent": "یک نامهٔ تأییدی فرستاده شد.",
+       "confirmemail_oncreate": "یک کد تأییدی به آدرس ایمیل شما فرستاده شد.\nبرای واردشدن به سامانه نیازی به این کد نیست، ولی برای راه‌اندازی امکانات وابسته به ایمیل در این ویکی به آن نیاز خواهید داشت.",
+       "confirmemail_sendfailed": "ارسال ایمیل تأییدی ممکن نشد.\nنشانی ایمیل را از نظر وجود نویسه‌های نامعتبر بررسی کنید.\n\nپاسخ سیستم ارسال ایمیل: $1",
+       "confirmemail_invalid": "کد تأیید نامعتبر است. ممکن است که منقضی شده باشد.",
+       "confirmemail_needlogin": "لطفاً برای تأیید آدرس ایمیلتان $1.",
+       "confirmemail_success": "آدرس ایمیل شما تأیید شده‌است.\n\nاکنون می‌توانید [[Special:UserLogin|به سیستم وارد شوید]] و از ویکی لذت ببرید.",
+       "confirmemail_loggedin": "نشانی ایمیل شما تأیید شد.",
+       "confirmemail_subject": "تأیید نشانی ایمیل {{SITENAME}}",
+       "confirmemail_body": "یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 حساب کاربری‌ای با نام «$2» و این آدرس ایمیل در {{SITENAME}} ایجاد کرده است.\n\nبرای تأیید این که این حساب واقعاً متعلق به شماست و نیز برای فعال سازی قابلیت ایمیل {{SITENAME}} پیوند زیر را در مرورگر اینترنت خود باز کنید:\n\n$3\n\nاگر شما این حساب کاربری را ثبت *نکرده‌اید*، لطفاً پیوند زیر را\nباز کنید تا تأیید آدرس ایمیل لغو شود:\n\n$5\n\nاین کدِ تأیید در تاریخ $4 منقضی خواهد شد.",
+       "confirmemail_body_changed": "یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1 آدرس ایمیل حساب «$2» در {{SITENAME}} را تغییر داده است.\n\nبرای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ قابلیت ایمیل در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:\n\n$3\n\nاگر این حساب متعلق به شما نیست، پیوند زیر را باز کنید تا تغییر آدرس ایمیل لغو شود:\n\n$5\n\nاین تأییدیه در $4 منقضی می‌گردد.",
+       "confirmemail_body_set": "یک نفر، احتمالاً خود شما، از نشانی آی‌پی $1,\nآدرس ایمیل حساب «$2» در {{SITENAME}} را به این آدرس تغییر داده است.\n\nبرای تأیید این که این حساب واقعاً به شما تعلق دارد و فعال کردن دوبارهٔ قابلیت ایمیل در {{SITENAME}}، پیوند زیر را در مرورگرتان باز کنید:\n\n$3\n\nاگر این حساب متعلق به شما نیست، پیوند زیر را باز تا تغییر آدرس ایمیل، لغو شود:\n\n$5\n\nاین تأییدیه در $4 منقضی می‌گردد.",
+       "confirmemail_invalidated": "تأیید نشانی ایمیل لغو شد",
+       "invalidateemail": "لغو تأیید نشانی ایمیل",
+       "scarytranscludedisabled": "[تراگنجانش بین‌ویکیانه فعال نیست]",
+       "scarytranscludefailed": "[فراخوانی الگو برای $1 میسر نشد]",
+       "scarytranscludefailed-httpstatus": "[فراخوانی الگو برای $1 میسر نشد: خطای اچ‌تی‌تی‌پی $2]",
+       "scarytranscludetoolong": "[نشانی اینترنتی مورد نظر (URL) بیش از اندازه بلند بود]",
+       "deletedwhileediting": "'''هشدار''': این صفحه پس از اینکه شما آغاز به ویرایش آن کرده‌اید، حذف شده است!",
+       "confirmrecreate": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این مقاله را پس از اینکه شما آغاز به ویرایش آن نموده‌اید به دلیل زیر حذف کرده است :\n: ''$2''\nلطفاً تأیید کنید که مجدداً می‌خواهید این مقاله را بسازید.",
+       "confirmrecreate-noreason": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این صفحه را پس از شروع ویرایش‌تان پاک کرده‌است.  لطفاً تأیید کنید که شما واقعاً می‌خواهید آن را دوباره ایجاد کنید.",
+       "recreate": "دووارة دوِرس کردن",
+       "confirm_purge_button": "خوو/ باشد",
+       "confirm-purge-top": "پاک‌کردن نسخهٔ حافظهٔ نهانی (Cache) این صفحه را تأیید می‌کنید؟",
+       "confirm-purge-bottom": "خالی کردن میانگیر یک صفحه باعث می‌شود که آخرین نسخهٔ آن نمایش یابد.",
+       "confirm-watch-button": "خوو/ باشد",
+       "confirm-watch-top": "اضافۀ کردن ئئ وۀلگۀ وۀ لیست پیگیریۀل تان",
+       "confirm-unwatch-button": "خوو/ باشد",
+       "confirm-unwatch-top": " ئئ وۀلگۀ وۀ لیست پیگیریۀل تان حذف بو؟",
+       "semicolon-separator": "؛&#32;",
+       "quotation-marks": "«$1»",
+       "imgmultipageprev": "←وةڵگة پئش",
+       "imgmultipagenext": "وةڵگة تِر/بعدی→",
+       "imgmultigo": "بِچۆ!",
+       "imgmultigoto": "بچۆ وةڵگة $1",
+       "img-lang-default": "(زوون پئش فرض)",
+       "img-lang-info": "ارائه این تصویر در  $1 .  $2",
+       "img-lang-go": "بِچۆ",
+       "ascending_abbrev": "ورِ بِڵِنگی/صعودی",
+       "descending_abbrev": "ورِ هووار/نزولی",
+       "table_pager_next": "وةڵگة بعدی",
+       "table_pager_prev": "وةڵگة  پئش",
+       "table_pager_first": "وةڵگة أؤةڵئن",
+       "table_pager_last": "وةڵگة دؤمائن/آخر",
+       "table_pager_limit": "نمایش $1 مورد در هر وةڵگة",
+       "table_pager_limit_label": "تعداد موارد در هر وةڵگة :",
+       "table_pager_limit_submit": "بِچۆ",
+       "table_pager_empty": "بدون نتیجه",
+       "autosumm-blank": "وةڵگة را خالی کرد",
+       "autosumm-replace": "جایگزینی وةڵگة با '$1'",
+       "autoredircomment": "تغییرمسیر به [[$1]]",
+       "autosumm-new": "وةڵگة تازه حاوی «$1» ایجاد کرد",
+       "autosumm-newblank": "ایجاد وةڵگة خالی",
+       "lag-warn-normal": "ممکن است تغییرات تازه‌تر از $1 {{PLURAL:$1|ثانیه|ثانیه ها}} در این فهرست نشان داده نشوند.",
+       "lag-warn-high": "ممکن است، به خاطر پس‌افتادگی زیاد سرور پایگاه داده، تغییرات تازه‌تر از $1 {{PLURAL:$1|ثانیه|ثانیه ها}} در این فهرست نشان داده نشده باشند.",
+       "watchlistedit-normal-title": "دةسکاری لیست پی‌گیریةل",
+       "watchlistedit-normal-legend": "حذف عنوان‌ها از فهرست پی‌گیری‌ها",
+       "watchlistedit-normal-explain": "عنوان‌های موجود در فهرست پی‌گیری شما در زیر نشان داده شده‌اند.\nبرای حذف هر عنوان جعبهٔ کنار آن را علامت بزنید و دکمهٔ «{{int:Watchlistedit-normal-submit}}» را بفشارید.\nشما همچنین می‌توانید [[Special:EditWatchlist/raw|فهرست خام را ویرایش کنید]].",
+       "watchlistedit-normal-submit": "حذف عنوان‌ها",
+       "watchlistedit-normal-done": "$1 عنوان از فهرست پی‌گیری‌های شما حذف {{PLURAL:$1|شد|شدند}}:",
+       "watchlistedit-raw-title": "ویرایش فهرست خام پی‌گیری‌ها",
+       "watchlistedit-raw-legend": "ویرایش فهرست خام پی‌گیری‌ها",
+       "watchlistedit-raw-explain": "عنوان‌های موجود در فهرست پی‌گیری‌های شما در زیر نشان داده شده‌اند، و شما می‌توانید مواردی را حذف یا اضافه کنید؛ هر مورد در یک سطر جداگانه باید قرار بگیرد.\nدر پایان، دکمهٔ «{{int:Watchlistedit-raw-submit}}» را بفشارید.\nتوجه کنید که شما می‌توانید از [[Special:EditWatchlist|ویرایشگر استاندارد فهرست پی‌گیری‌ها]] هم استفاده کنید.",
+       "watchlistedit-raw-titles": "عنوانةل:",
+       "watchlistedit-raw-submit": "به‌روزرسانی پی‌گیری‌ها",
+       "watchlistedit-raw-done": "فهرست پی‌گیری‌های شما به روز شد.",
+       "watchlistedit-raw-added": "$1 عنوان به فهرست پی‌گیری‌ها اضافه {{PLURAL:$1|شد|شدند}}:",
+       "watchlistedit-raw-removed": "$1 عنوان حذف {{PLURAL:$1|شد|شدند}}:",
+       "watchlistedit-clear-title": "لیست پیگیری پاک بیة",
+       "watchlistedit-clear-legend": "پاکسازی فهرست پیگیری",
+       "watchlistedit-clear-explain": "همه عناوین از فهرست پیگیریهای شما حذف خواهد شد",
+       "watchlistedit-clear-titles": "عنوانةل:",
+       "watchlistedit-clear-submit": "پاک کردن فهرست پیگیریها (این دائم است!)",
+       "watchlistedit-clear-done": "فهرست پیگیریهای شما پاک شد.",
+       "watchlistedit-clear-removed": "$1 عنوان حذف {{PLURAL:$1|شد|شدند}}:",
+       "watchlistedit-too-many": "تعداد زیادی صفحه برای نمایش در اینجا وجود دارد.",
+       "watchlisttools-clear": "پاکسازی فهرست پیگیری",
+       "watchlisttools-view": "لیست پیگیریةل",
+       "watchlisttools-edit": "مشاهده و ویرایش فهرست پی‌گیری‌ها",
+       "watchlisttools-raw": "ویرایش فهرست خام پی‌گیری‌ها",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|گۀپ]])",
+       "duplicate-defaultsort": "هشدار: ترتیب پیش‌فرض «$2» ترتیب پیش‌فرض قبلی «$1» را باطل می‌کند.",
+       "duplicate-displaytitle": "<strong>هشدار:</strong> نمایش عنوان \" $2 \"باعث ابطال پیش نمایش عنوان\" $1 \" می‌شود.",
+       "invalid-indicator-name": "<strong>خطا:</strong>ویژگی های شاخص‌های وضعیت صفحهٔ <code>name</code> نباید خالی باشند.",
+       "version": "نسخه",
+       "version-extensions": "افزونه‌های نصب‌شده",
+       "version-skins": "پوسته‌های نصب شده",
+       "version-specialpages": "وةڵگة/پةرة  ویژة",
+       "version-parserhooks": "قلاب‌های تجزیه‌گر",
+       "version-variables": "متغیرها",
+       "version-antispam": "جلوگیری از هرزنامه",
+       "version-other": "بۀقیۀ",
+       "version-mediahandlers": "به‌دست‌گیرنده‌های رسانه‌ها",
+       "version-hooks": "قلاب‌ها",
+       "version-parser-extensiontags": "برچسب‌های افزونه تجزیه‌گر",
+       "version-parser-function-hooks": "قلاب‌های عملگر تجزیه‌گر",
+       "version-hook-name": "نام قلاب",
+       "version-hook-subscribedby": "وارد شده توسط",
+       "version-no-ext-name": "[بی نام]",
+       "version-license": "اجازه‌نامهٔ مدیاویکی",
+       "version-ext-license": "مجوزها",
+       "version-ext-colheader-name": "گستره‌ها",
+       "version-skin-colheader-name": "پوسته",
+       "version-ext-colheader-version": "نسخه",
+       "version-ext-colheader-license": "مجوز",
+       "version-ext-colheader-description": "توصیفات",
+       "version-ext-colheader-credits": "نویسندگان",
+       "version-license-title": "مجوز برای $1",
+       "version-license-not-found": "هیچ جزئیاتی از اطلاعات مجوز برای این گستره پیدا نشد.",
+       "version-credits-title": "اعتبارها برای $1",
+       "version-credits-not-found": "هیچ جزئیاتی از اطلاعات اعتبارها برای این گستره پیدا نشد.",
+       "version-poweredby-credits": "این ویکی توسط '''[https://www.mediawiki.org/ مدیاویکی]''' پشتیبانی می‌شود، کلیهٔ حقوق محفوظ است © 2001-$1 $2.",
+       "version-poweredby-others": "دیگران",
+       "version-poweredby-translators": "زوون چاوواشةکرةلtranslatewiki.net",
+       "version-credits-summary": "افراد زیر را به خاطر ویرایش‌هایش در [[Special:Version|مدیاویکی]] معرفی می‌نمائیم.",
+       "version-license-info": "مدیاویکی یک نرم‌افزار آزاد است. می‌توانید آن را با شرایط نگارش ۲، یا (با نظر خودتان) هر نگارش جدیدتری از پروانه جامع همگانی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده‌است، بازنشر کنید.\n\nمدیاویکی با این امید که مفید واقع شود منتشر شده‌است، ولی هیچ‌گونه ضمانتی، حتا ضمانت ضمنی تجاری یا مناسب بودن برای یک مصرف خاص را ارائه نمی‌کند. برای اطلاعات بیش‌تر، پروانه جامع همگانی گنو را مشاهده کنید.\n\nشما باید [{{SERVER}}{{SCRIPTPATH}}/COPYING یک نسخه از پروانه جامع همگانی گنو] را به همراه این برنامه دریافت کرده باشید. در غیر این صورت با 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": "نشانی اینترنتی",
+       "version-libraries": "کتابخانهٔ نصب شده",
+       "version-libraries-library": "کتاووخانة",
+       "version-libraries-version": "نسخه",
+       "version-libraries-license": "اجازه‌نامه",
+       "version-libraries-description": "توضیحةل",
+       "version-libraries-authors": "نویسندگان",
+       "redirect": "تغییرمسیر توسط پرونده، کاربر، صفحه یا شناسهٔ نسخه",
+       "redirect-legend": "تغییرمسیر به یک پرونده یا صفحه",
+       "redirect-summary": "این صفحهٔ ویژه به پرونده (نام پرونده داده‌شده)، صفحه (شماره شناسهٔ صفحه یا شماره نسخهٔ داده‌شده) یا صفحهٔ کاربری (شناسهٔ عددی کاربری داده‌شده) تغییرمسیر می‌یابد. طرز استفاده: [[{{#Special:Redirect}}/file/Example.jpg]]، \n[[{{#Special:Redirect}}/page/64308]]، [[{{#Special:Redirect}}/revision/328429]] یا [[{{#Special:Redirect}}/user/101]].",
+       "redirect-submit": "بِچۆ",
+       "redirect-lookup": "مِنِی کردن/گئردین:",
+       "redirect-value": "ارزش:",
+       "redirect-user": "شناسهٔ کاربر",
+       "redirect-page": "شناسهٔ وةڵگة",
+       "redirect-revision": "نسخهٔ وةڵگة",
+       "redirect-file": "نام پرونده",
+       "redirect-not-exists": "مقدار پیدا نشد",
+       "fileduplicatesearch": "جستجو برای پرونده‌های تکراری",
+       "fileduplicatesearch-summary": "جستجو برای پرونده‌های تکراری بر اساس مقدار درهم‌شدهٔ آن‌ها صورت می‌گیرد.",
+       "fileduplicatesearch-legend": "جستجوی موارد تکراری",
+       "fileduplicatesearch-filename": "نام پرونده:",
+       "fileduplicatesearch-submit": "گئردین/مهِ نی",
+       "fileduplicatesearch-info": "<span dir=\"ltr\">$1 × $2</span> پیکسل<br />اندازهٔ پرونده: $3<br />نوع MIME: $4",
+       "fileduplicatesearch-result-1": "پروندهٔ «$1» مورد تکراری ندارد.",
+       "fileduplicatesearch-result-n": "پروندهٔ «$1» دارای {{PLURAL:$2|یک مورد تکراری|$2 مورد تکراری}} است.",
+       "fileduplicatesearch-noresults": "پرونده‌ای با نام «$1» أ دی نؤی /پئا نؤی.",
+       "specialpages": "وۀلگۀل/پۀرۀل ویژۀ",
+       "specialpages-note-top": "شرح علائم",
+       "specialpages-note": "* صفحه‌های ویژهٔ عادی.\n* <span class=\"mw-specialpagerestricted\">صفحه‌های ویژهٔ محدودشده.</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": "داده و ابزارها",
+       "specialpages-group-redirects": "وةڵگةل ویژهٔ تغییرمسیر دهنده",
+       "specialpages-group-spam": "ابزارهای هرزنگاری",
+       "specialpages-group-developer": "ابزارهای توسعه‌دهندگان",
+       "blankpage": "وةڵگة خالی",
+       "intentionallyblankpage": "این وةڵگة به طور عمدی خالی گذاشته شده است.",
+       "external_image_whitelist": " #این سطر را همان‌گونه که هست رها کنید<pre>\n#عبارت‌های باقاعده (regex) را در زیر قرار دهید (فقط بخشی که بین // قرار می‌گیرد)\n#آن‌ها با نشانی اینترنتی تصاویر خارجی پیوند داده شده تطبیق داده می‌شوند\n#مواردی که مطابق باشند به صورت تصویر نمایش می‌یابند، و در غیر این صورت تنها یک پیوند به تصویر نمایش می‌یابد\n#سطرهایی که با # آغاز شوند به عنوان توضیحات در نظر گرفته می‌شوند\n#این سطرها به کوچکی و بزرگی حروف حساس هستند\n\n#عبارت‌های باقاعده (regex)  را زیر این سطر قرار دهید. این سطر را همان‌گونه که هست رها کنید</pre>",
+       "tags": "برچسب‌های تغییر مجاز",
+       "tag-filter": ":فیلتر کۀ[[Special:Tags|برچسب‌ۀل]]",
+       "tag-filter-submit": "پالانۀل/فیلترۀل",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|بۀرچۀسب|بۀرچۀسبۀل}}]]:$2)",
+       "tags-title": "برچسب‌ها",
+       "tags-intro": "این وةڵگة فهرستی‌است از برچسب‌هایی که نرم‌افزار با آن‌ها ویرایش‌ها را علامت‌گذری می‌کند، به همراه معانی آن‌ها.",
+       "tags-tag": "نام برچسب",
+       "tags-display-header": "نمایش در فهرست‌های تغییرات",
+       "tags-description-header": "توضیح کامل معنی",
+       "tags-source-header": "بِنچۀک/مۀنبۀع",
+       "tags-active-header": "فعال(کارکةر)؟",
+       "tags-hitcount-header": "تغییرهای برچسب‌دار",
+       "tags-actions-header": "کارۀل",
+       "tags-active-yes": "أرێ-بةلئ",
+       "tags-active-no": "نة-نةخئر",
+       "tags-source-extension": "تعریف‌شده بر پایه افزونه",
+       "tags-source-manual": "اعمال شده به صورت دستی توسط ربات‌ها یا کاربرها",
+       "tags-source-none": "دیگر استفاده نمی‌شود",
+       "tags-edit": "دةسکاری",
+       "tags-delete": "حۀذف کردن/پاک کردن",
+       "tags-activate": "فعال کردن",
+       "tags-deactivate": "غیرفعال کردن/إکار کةتن",
+       "tags-hitcount": "$1 {{PLURAL:$1|تغییرها|تغییر}}",
+       "tags-manage-no-permission": "شما اجازه مدیریت تغییر تگ‌ها را ندارید.",
+       "tags-create-heading": "ایجاد یک برچسب جدید",
+       "tags-create-explanation": "به طور پیش‌فرض، تگ‌های تازه ایجاد شده برای استفاده کاربران و ربات‌ها در دسترس قرار می‌گیرند.",
+       "tags-create-tag-name": "نام برچسب:",
+       "tags-create-reason": ":دةلیل",
+       "tags-create-submit": "دؤِرس کردن/سازین",
+       "tags-create-no-name": "نام تگ باید دیار بو.",
+       "tags-create-invalid-chars": "نام تگ‌ها نباید حاوی کاما (<code>,</code>) یا خط مورب (<code>/</code>) باشد.",
+       "tags-create-invalid-title-chars": "نام تگ‌ها نباید شامل حروفی شود که نمی‌توان از آن‌ها در عنوان صفحات استفاده کرد.",
+       "tags-create-already-exists": "تگ \"$1\" ایسة وجود دِرێ.",
+       "tags-create-warnings-above": "در هنگام ایجاد تگ \"$1\" با {{PLURAL:$2|هشدار|هشدارهای}} زیر پیش آمد:",
+       "tags-create-warnings-below": "آیا مایل به ادامه ایجاد تگ هستید؟",
+       "tags-delete-title": "حذف برچسب",
+       "tags-delete-explanation-initial": "شما در حال حذف تگ «$1» از پایگاه داده هستید.",
+       "tags-delete-explanation-in-use": "این از {{PLURAL:$2|$2 ویرایش یا ورودی سیاهه|همهٔ $2 ویرایش و/یا ورودی سیاهه}} حذف خواهد شد با وجودی که الان تائید شده‌است.",
+       "tags-delete-explanation-warning": "این عمل <strong>غیر قابل بازگشت</strong> است، حتی توسط مدیران پایگاه داده. مطمئن باشید که این همان تگی است که می‌خواهید آن‌را حذف کنید.",
+       "tags-delete-explanation-active": "<strong>برچسب \"$1\" هنوز فعال است و در آینده اعمال خواهد شد.</strong> برای جلوگیری از این اتفاق، به قسمت(‌هایی) که برچسب فعال شده رفته و از آنجا غیرفعالش کنید.",
+       "tags-delete-reason": ":دةلیل",
+       "tags-delete-submit": "این تگ را به‌صورت غیرقابل بازگشت حذف کن",
+       "tags-delete-not-allowed": "برچسب‌هایی که در یک افزونه تعریف می‌شوند قابل حذف نیستند، مگر اینکه آن افزونه در این مورد خاص این قابلیت را بدهد.",
+       "tags-delete-not-found": "تگ «$1» وجود نئرێ.",
+       "tags-delete-too-many-uses": "برچسب \"$1\" در بیش از $2 {{PLURAL:$2|نسخه|نسخه ها}} اعمال شده است و نمی‌توان آن را حذف نمود",
+       "tags-delete-warnings-after-delete": "برچسب \"$1\" با موفقیت حذف شد، اما با {{PLURAL:$2|خطای|خطاهای}} زیر همراه بود:",
+       "tags-activate-title": "فعال‌سازی برچسب",
+       "tags-activate-question": "شما در حال فعال‌سازی تگ «$1» هستید.",
+       "tags-activate-reason": ":دةلیل",
+       "tags-activate-not-allowed": "فعال‌سازی تگ «$1» ممکن نیست.",
+       "tags-activate-not-found": "تگ «$1» وجود نئرێ.",
+       "tags-activate-submit": "فعال کردن",
+       "tags-deactivate-title": "فعال‌سازی برچسب",
+       "tags-deactivate-question": "شما در حال غیرفعال‌سازی تگ «$1» هستید.",
+       "tags-deactivate-reason": ":دةلیل",
+       "tags-deactivate-not-allowed": "غیرفعال‌سازی تگ «$1» ممکن نیست.",
+       "tags-deactivate-submit": "غیرفعال کردن/إکار کةتن",
+       "tags-apply-no-permission": "دسترسی برای تغییر برچسب تغییراتتان را ندارید.",
+       "tags-apply-not-allowed-one": "اجازهٔ تائید برچسب «$1» به صورت دستی وجود ندارد.",
+       "tags-apply-not-allowed-multi": "اجازهٔ تائید {{PLURAL:$2|برچسب|برچسب ها}} به صورت دستی وجود ندارد:$1",
+       "tags-update-no-permission": "شما اجازهٔ افزودن یا حذف برچسب از خود نسخه یا سیاهه را ندارید.",
+       "tags-update-add-not-allowed-one": "اجازهٔ افزودن برچسب «$1» به صورت دستی وجود ندارد.",
+       "tags-update-add-not-allowed-multi": "اجازهٔ افزودن {{PLURAL:$2|برچسب|برچسب ها}} به صورت دستی وجود ندارد:$1",
+       "tags-update-remove-not-allowed-one": "اجازهٔ حذف برچسب «$1» به صورت دستی وجود ندارد.",
+       "tags-update-remove-not-allowed-multi": "اجازهٔ حذف {{PLURAL:$2|برچسب|برچسب ها}} به صورت دستی وجود ندارد:$1$1",
+       "tags-edit-title": "ویرایش برچسب‌ها",
+       "tags-edit-manage-link": "مدیریت برچسب‌ها",
+       "tags-edit-revision-selected": "{{PLURAL:$1|نسخهٔ انتخاب شده|نسخهٔ انتخاب شده ها}} [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|سیاههٔ انتخاب شده ها|سیاههٔ انتخاب شده}}:",
+       "tags-edit-revision-legend": "افزودن یا حذف برچسب از {{PLURAL:$1|این نسخه|همهٔ $1 نسخه‌ها}}",
+       "tags-edit-logentry-legend": "افزودن یا حذف برچسب از {{PLURAL:$1|این سیاهه|همهٔ $1 سیاهه‌ها}}",
+       "tags-edit-existing-tags": "برچسب‌های موجود:",
+       "tags-edit-existing-tags-none": "\"هؤیچ کام\"",
+       "tags-edit-new-tags": "برچسب جدید:",
+       "tags-edit-add": "افزودن این برچسب‌ها:",
+       "tags-edit-remove": "حذف این برچسب‌ها:",
+       "tags-edit-remove-all-tags": "(حذف همهٔ برچسب‌ها)",
+       "tags-edit-chosen-placeholder": "انتخاب تعدادی برچسب",
+       "tags-edit-chosen-no-results": "برچسبی برای انتخاب یافت نشد",
+       "tags-edit-reason": ":دةلیل",
+       "tags-edit-revision-submit": "اعمال تغییرات بر روی {{PLURAL:$1|این نسخه|$1 نسخه}}",
+       "tags-edit-logentry-submit": "اعمال تغییرات بر روی {{PLURAL:$1|این سیاهه|$1 سیاهه}}",
+       "tags-edit-success": "تغییرات با موفقیت اعمال شدند.",
+       "tags-edit-failure": "امکان اعمال تغییرات وجود ندارد: $1",
+       "tags-edit-nooldid-title": "نسخهٔ مقصد نادرست",
+       "tags-edit-nooldid-text": "نسخهٔ مقصد برای اعمال تابع مورد نظر را مشخص نکرده‌اید، یا نسخهٔ مورد نظر وجود ندارد.",
+       "tags-edit-none-selected": "لطفاً حداقل یک برچسب برای افزودن یا حذف انتخاب کنید.",
+       "comparepages": "مقایسة وةڵگةل",
+       "compare-page1": "وةڵگةل ۱",
+       "compare-page2": "وةڵگةل ۲",
+       "compare-rev1": "نسخهٔ ۱",
+       "compare-rev2": "نسخهٔ ۲",
+       "compare-submit": "مقایسه",
+       "compare-invalid-title": "عنوان تعیین‌شده نامعتبر است.",
+       "compare-title-not-exists": "عنوان مشخص شده وجود ندارد.",
+       "compare-revision-not-exists": "پالایهٔ مشخص شده وجود ندارد.",
+       "dberr-problems": "پوزش! این تارنما از مشکلات فنی رنج می‌برد.",
+       "dberr-again": "چند دقیقه صبر کنید و دوباره وةڵگة را بارگیری کنید.",
+       "dberr-info": "(امکان برقراری ارتباط با پایگاه داده وجود ندارد: $1)",
+       "dberr-info-hidden": "(امکان تماس با پایگاه‌داده نیست)",
+       "dberr-usegoogle": "شما در این مدت می‌توانید با استفاده از گوگل جستجو کنید.",
+       "dberr-outofdate": "توجه کنید که نمایه‌های آن‌ها از محتوای ما ممکن است به روز نباشد.",
+       "dberr-cachederror": "آن‌چه در ادامه می‌آید یک کپی از صفحهٔ درخواست شده است که در کاشه قرار دارد، و ممکن است به روز نباشد.",
+       "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": "بۀقیۀ",
+       "htmlform-no": "نة-نةخئر",
+       "htmlform-yes": "أرێ-بةلئ",
+       "htmlform-chosen-placeholder": "یإگِلة گزینة انتخاب کةن",
+       "htmlform-cloner-create": " افزودن ویشتر/فرةتر",
+       "htmlform-cloner-delete": "پاکاکردن",
+       "htmlform-cloner-required": "حداقل یک مقدار مورد نیاز است.",
+       "htmlform-title-badnamespace": "[[:$1]] در فضای نام \"{{ns:$2}}\"  موجود نیست.",
+       "htmlform-title-not-creatable": "\"$1\" عنوان قابل ایجاد نیست",
+       "htmlform-title-not-exists": "$1 وجود ندارد.",
+       "htmlform-user-not-exists": "<strong>$1</strong> وجود ندارد.",
+       "htmlform-user-not-valid": "حساوو کاربةری <strong>$1</strong> معتبر نیة.",
+       "sqlite-has-fts": "$1 با پشتیبانی از جستجو در متن کامل",
+       "sqlite-no-fts": "$1 بدون پشتیبانی از جستجو در متن کامل",
+       "logentry-delete-delete": "$1 VALGA $3{{GENDER:$2|HAZF Kerdi}}",
+       "logentry-delete-restore": "$1 وةڵگة $3 را {{GENDER:$2|احیا کرد}}",
+       "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 {{GENDER:$2|تغییر داد}}: $4",
+       "logentry-delete-revision": "$1 پیدایی {{PLURAL:$5|یک نسخه|$5 نسخه}} صفحه $3 را {{GENDER:$2|تغییر داد}}: $4",
+       "logentry-delete-event-legacy": "$1 پیدایی موارد سیاهه را در $3 {{GENDER:$2|تغییر داد}}",
+       "logentry-delete-revision-legacy": "$1 پیدایی نسخه‌های $3 را {{GENDER:$2|تغییر داد}}",
+       "logentry-suppress-delete": "$1 $3 را {{GENDER:$2| فرونشانی کرد}}",
+       "logentry-suppress-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 مخفیانه {{GENDER:$2|تغییر داد}}: $4",
+       "logentry-suppress-revision": "$1 پیدایی {{PLURAL:$5|یک نسخه|$5 نسخه}} صفحه $3 را مخفیانه {{GENDER:$2|تغییر داد}}: $4",
+       "logentry-suppress-event-legacy": "$1 پیدایی موارد سیاهه را در $3 مخفیانه {{GENDER:$2|تغییر داد}}",
+       "logentry-suppress-revision-legacy": "$1 پیدایی نسخه‌های $3 را مخفیانه {{GENDER:$2|تغییر داد}}",
+       "revdelete-content-hid": "محتوا شاردئا/پنهان کرد",
+       "revdelete-summary-hid": "خلاصه ویرایش را پنهان کرد",
+       "revdelete-uname-hid": "نام کاربری را پنهان کرد",
+       "revdelete-content-unhid": "محتوا را آشکار کرد",
+       "revdelete-summary-unhid": "خلاصه ویرایش را آشکار کرد",
+       "revdelete-uname-unhid": "نام کاربری را آشکار کرد",
+       "revdelete-restricted": "مدیران را محدود کرد",
+       "revdelete-unrestricted": "محدودیت مدیران را لغو کرد",
+       "logentry-block-block": "$1 {{GENDER:$4|$3}} را تا $5 {{GENDER:$2|بست}} $6",
+       "logentry-block-unblock": "$1 {{GENDER:$2|بازکرد}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن {{GENDER:$4|$3}} را به پایان قطع دسترسی $5 $6 تغییر داد.",
+       "logentry-suppress-block": "$1 {{GENDER:$2|بسته شد}} {{GENDER:$4|$3}} با پایان قطع دسترسی در زمان $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|تنظیمات}} بستن برای  {{GENDER:$4|$3}} به پایان قطع دسترسی  $5 $6 تغییر یافت",
+       "logentry-import-upload": "$1 $3 را توسط بارگذار پرونده {{GENDER:$2|درون‌ریزی کرد}}",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|imported}} $3 by file upload ($4 {{PLURAL:$4|revision|revisions}})",
+       "logentry-import-interwiki": "$1 $3 را از ویکی دیگر {{GENDER:$2|درون‌ریز کرد}}",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|imported}} $3 from $5 ($4 {{PLURAL:$4|revision|revisions}})",
+       "logentry-merge-merge": "$1  $3  را به  $4 {{GENDER:$2| ادغام کرد}} (نسخه تا  $5)",
+       "logentry-move-move": "$1 صفحهٔ $3 را به $4 {{GENDER:$2|منتقل کرد}}",
+       "logentry-move-move-noredirect": "$1 وةڵگة $3 را بدون برجای‌گذاشتن تغییرمسیر به $4 {{GENDER:$2|منتقل کرد}}",
+       "logentry-move-move_redir": "$1 وةڵگة $3 را به $4 که تغییرمسیر بود {{GENDER:$2|منتقل کرد}}",
+       "logentry-move-move_redir-noredirect": "$1 وةڵگة $3 را بدون برجای‌گذاشتن تغییرمسیر به $4 که تغییرمسیر بود {{GENDER:$2|منتقل کرد}}",
+       "logentry-patrol-patrol": "$1 نسخه $4 صفحه $3 را به عنوان گشت خورده {{GENDER:$2|علامت زد}}",
+       "logentry-patrol-patrol-auto": "$1 نسخهٔ $4 صفحهٔ $3 را به‌طور خودکار به عنوان گشت‌خورده {{GENDER:$2|علامت زد}}",
+       "logentry-newusers-newusers": "حساوو کاربۀری $1 {{GENDER:$2|سازیا}}",
+       "logentry-newusers-create": "حساوو کاربۀری $1 {{GENDER:$2|سازیا}}",
+       "logentry-newusers-create2": "حساوو کاربةری $3 توسط $1 {{GENDER:$2|اسازیا}}",
+       "logentry-newusers-byemail": "حساب کاربری $3 توسط $1 {{GENDER:$2|ایجاد شد}} و رمز عبور به وسیلهٔ ایمیل ارسال شد",
+       "logentry-newusers-autocreate": "حساب $1  به شکل خودکار {{GENDER:$2|ایجاد شد}}",
+       "logentry-protect-move_prot": "$1 تنظیمات محافظت را از $4 به $3 {{GENDER:$2|منتقل کرد}}",
+       "logentry-protect-unprotect": "$1 $3 را از محافظت {{GENDER:$2|خارج کرد}}",
+       "logentry-protect-protect": "$1 $3 را {{GENDER:$2|محافظت کرد}} $4",
+       "logentry-protect-protect-cascade": "$1 $3 $4 {{GENDER:$2|محافظت کرد}} [آبشاری]",
+       "logentry-protect-modify": "$1 سطح محافظت $3 را {{GENDER:$2|تغییر داد}} $4",
+       "logentry-protect-modify-cascade": "$1 سطح حفاظت برای $3 $4 را {{GENDER:$2|تغییر داد}}[آبشاری]",
+       "logentry-rights-rights": "$1 عضویت $3 را از گروه $4 به $5 {{GENDER:$2|تغییر داد}}",
+       "logentry-rights-rights-legacy": "$1 گروه عضویت $3 را {{GENDER:$2|تغییر داد}}",
+       "logentry-rights-autopromote": "$1 به طور خودکار از $4 به $5 {{GENDER:$2|ارتقاء داد}}",
+       "logentry-upload-upload": "$1 $3 را {{GENDER:$2|بارگذاری کرد}}",
+       "logentry-upload-overwrite": "$1 نسخهٔ تازه‌ای از $3 را {{GENDER:$2|بارگذاری کرد}}",
+       "logentry-upload-revert": "$1 {{GENDER:$2|بارگذاری کرد}} $3",
+       "log-name-managetags": "تاریخچه مدیریت تگ",
+       "log-description-managetags": "این وةڵگة امور مدیریتی مربوط به [[Special:Tags|برچسب‌ها]] را فهرست می‌کند. سیاهه فقط حاوی فعالیت‌هایی است که توسط یک مدیر به صورت دستی انجام شده‌اند؛ برچسب‌ها ممکن است توسط نرم‌افزار ویکی ساخته یا حذف بشوند بدون اینکه هیچ ورودی در این سیاهه ثبت گردد.",
+       "logentry-managetags-create": "$1 برچسب «$4» را {{GENDER:$2|ایجاد کرد}}",
+       "logentry-managetags-delete": "$1 برچسب را از \"$4\" {{GENDER:$2|حذف کرد}} (حذف شده از $5 {{PLURAL:$5|نسخه یا ورودی سیاهه|نسخه یا/و ورودی سیاهه}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|برچسب}} فعال شده \"$4\" برای کاربران و ربات‌ها",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|برچسب}} غیرفعال شده \"$4\" برای کاربران و ربات‌ها",
+       "log-name-tag": "سیاهه برچسب",
+       "log-description-tag": "این وةڵگة  زمانی که کاربران [[Special:Tags|برچسب]] یک نسخه یا سیاهه ورودی را افزوده‌اند یا حذف‌کرده‌اند. سیاههٔ کار بر روی برچسب‌ها زمانی که بخشی از ویرایش یا حذف یا فعالیت‌های مشابه هستند، فهرست نمی‌شود.",
+       "logentry-tag-update-add-revision": "$1 {{PLURAL:$7|برچسب|برچسب ها}} $6 به نسخهٔ $4 از صفحهٔ $3 {{GENDER:$2|افزود}}",
+       "logentry-tag-update-add-logentry": "$1 {{PLURAL:$7|برچسب|برچسب ها}} $6 به سیاههٔ $5 صفحهٔ $3 {{GENDER:$2|افزود}}",
+       "logentry-tag-update-remove-revision": "$1 {{PLURAL:$9|برچسب|برچسب ها}} $8 را از نسخهٔ $4 صفحهٔ $3 {{GENDER:$2|حذف کرد}}",
+       "logentry-tag-update-remove-logentry": "$1 {{PLURAL:$9|برچسب|برچسب ها}} $8 را از سیاههٔ $5 صفحهٔ $3 {{GENDER:$2|حذف کرد}}",
+       "logentry-tag-update-revision": "$1 برچسب نسخهٔ $4 صفحهٔ $3 را {{GENDER:$2|به‌روز کرد}} ($6 {{PLURAL:$7|افزوده‌شد}}؛ $8 {{PLURAL:$9|حذف شد}})",
+       "logentry-tag-update-logentry": "$1 برچسب سیاههٔ $5 صفحهٔ $3 را {{GENDER:$2|به‌روز کرد}} ($6 {{PLURAL:$7|افزوده‌شد}}؛ $8 {{PLURAL:$9|حذف شد}})",
+       "rightsnone": "(هؤیچ کام)",
+       "revdelete-summary": "خلاصة دةسکاری",
+       "feedback-adding": "افزودن بازخورد به وةڵگة ...",
+       "feedback-back": "گِل آوردن/برگشت",
+       "feedback-bugcheck": "عالی‌است! فقط بررسی کنید که از [$1 ایرادهای شناخته‌شده] نباشد.",
+       "feedback-bugnew": "بررسی کردم. ایرادی تازه را گزارش بده",
+       "feedback-bugornote": "اگر آماده‌اید تا مشکلی فنی را با جزئیاتش شرح دهید لطفاً [$1 یک ایراد گزارش دهید]. در غیر این صورت می‌توانید از فرم سادهٔ زیر استفاده کنید. نظر شما به همراه نام کاربری و مرورگرتان به صفحهٔ «[$3 $2]» افزوده خواهد شد.",
+       "feedback-cancel": "ئآهووسانن/لغو",
+       "feedback-close": "انجؤم بی",
+       "feedback-external-bug-report-button": "پرونده‌سازی یک عمل فنی",
+       "feedback-dialog-title": "ارسال یک بازخورد",
+       "feedback-dialog-intro": "شما می توانید از فرم زیر برای بازخورد استفاده کنید. متن شما همراه با نام کاربریتان به وةڵگة \"$1\" افزوده خواهد شد.",
+       "feedback-error-title": "خطا",
+       "feedback-error1": "خطا: پاسخ‌های ناشناخته از رابط برنامه‌نویسی نرم‌افزار",
+       "feedback-error2": "خطا: شکست در ویرایش",
+       "feedback-error3": "خطا: عدم پاسخ از رابط برنامه‌نویسی نرم‌افزار",
+       "feedback-error4": "خطا:امکان ارسال به عنوان بازخورد داده‌شده، نیست",
+       "feedback-message": ":پیغام",
+       "feedback-subject": "عنوان:",
+       "feedback-submit": "ارسال/کِل کردن",
+       "feedback-terms": "من اطلاع دارم که اطلاعات یوز ایجنتم دربارهٔ مرورگر و نسخهٔ سیستم عاملی که استفاده می‌کنم، به صورت عمومی همراه با نام کاربریم به اشتراک گذاشته می‌شود.",
+       "feedback-termsofuse": "موافق با قرار دادن بازخورد بر پایهٔ شرایط استفاده هستم.",
+       "feedback-thanks": "سپاس! بازخورد شما در وةڵگة «[$1 $2]» ثبت شد.",
+       "feedback-thanks-title": "سپاس إژ هؤمة!",
+       "feedback-useragent": "رابط کاربر:",
+       "searchsuggest-search": "گئردین/مهِ نی",
+       "searchsuggest-containing": "وةڵگةل  دربردارنده...",
+       "api-error-badaccess-groups": "شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.",
+       "api-error-badtoken": "خطای داخلی: کد امنیتی اشتباه (Bad token).",
+       "api-error-copyuploaddisabled": "بارگذاری با استفاده از نشانی اینترنتی در این کارساز غیرفعال است.",
+       "api-error-duplicate": "{{PLURAL:$1|پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت.",
+       "api-error-duplicate-archive": "{{PLURAL:$1| پروندهٔ دیگری|چند پروندهٔ دیگر}} در تارنما با محتوای یکسان وجود داشت، ولی حذف {{PLURAL:$1|شده است|شده‌اند}}.",
+       "api-error-empty-file": "پرونده‌ای که شما ارسال کردید خالی بود.",
+       "api-error-emptypage": "ایجاد وةڵگةل خالی مجاز نیست.",
+       "api-error-fetchfileerror": "خطای داخلی: در هنگام گرفتن پرونده، یک چیزی درست پیش نرفت.",
+       "api-error-fileexists-forbidden": "یک پرونده با نام \"$1\" موجود است و امکان بازنویسی نیست.",
+       "api-error-fileexists-shared-forbidden": "یک پرونده با نام \"$1\" در انبار اشتراک پرونده موجود است و امکان بازنویسی نیست.",
+       "api-error-file-too-large": "پرونده‌ای که شما ارسال کردید بیش از اندازه بزرگ بود.",
+       "api-error-filename-tooshort": "نام پرونده بیش از اندازه کوتاه است.",
+       "api-error-filetype-banned": "این نوع پرونده ممنوع است.",
+       "api-error-filetype-banned-type": "&lrm;$1 {{PLURAL:$4|یک نوع پروندهٔ نامجاز است|انواع پروندهٔ نامجاز هستند}}. {{PLURAL:$3|نوع پروندهٔ مجاز|انواع پروندهٔ مجاز}} از این قرار است: $2.",
+       "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": "خطای داخلی: درخواست باید از روش POST HTTP ارسال گردد.",
+       "api-error-noimageinfo": "بارگذاری موفق بود، ولی کارساز هیچ اطلاعاتی دربارهٔ پرونده به ما نداد.",
+       "api-error-nomodule": "خطای داخلی: پودمان بارگذاری تنظیم نشده‌است.",
+       "api-error-ok-but-empty": "خطای داخلی : پاسخی از سرور دریافت نشد.",
+       "api-error-overwrite": "جای نوشتن یک پرونده موجود مجاز نیست.",
+       "api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
+       "api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
+       "api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
+       "api-error-stashedfilenotfound": "زمانی که تلاش برای بارگذاری فایل استش بود، فایل استش یافت نشد.",
+       "api-error-stashpathinvalid": "مسیری که فایل استش در آن باید یافت می‌شد اشتباه است.",
+       "api-error-stashfilestorage": "برای ذخیرهٔ فایل استش خطایی رخ داده است.",
+       "api-error-stashzerolength": "سرور نمی‌تواند فایل استش را ذخیره کند چون حجم آن صفر است.",
+       "api-error-stashnotloggedin": "برای ذخیرهٔ فایل‌ها در بارگذاری استش باید وارد سامانه شده‌باشید.",
+       "api-error-stashwrongowner": "فایلی که در استش قصد داشتید به آن دسترسی داشته‌باشید متعلق به شما نیست.",
+       "api-error-stashnosuchfilekey": "کلیدی که در فایل استش می خواستید به آن دسترسی داشته‌باشید، وجود ندارد.",
+       "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": "ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.",
+       "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": "{{PLURAL:$1|هزار سال |$1 هزار سال}}",
+       "rotate-comment": "تصویر به دست $1 {{PLURAL:$1|درجهٔ|درجات}} ساعت‌گرد چرخانده شد",
+       "limitreport-title": "داده‌های رخ‌نمانگاری تجزیه‌کننده:",
+       "limitreport-cputime": "زمان مصرفی سی‌پی‌یو",
+       "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه ها}}",
+       "limitreport-walltime": "زمان مصرفی واقعی",
+       "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانیه|ثانیه ها}}",
+       "limitreport-ppvisitednodes": "شمارندهٔ گره بازدیدشدهٔ پیش‌پردازنده",
+       "limitreport-ppgeneratednodes": "شمارندهٔ گره تولیدی پیش‌پردازنده",
+       "limitreport-postexpandincludesize": "اندازهٔ دربرگیرنده پس از گسترش",
+       "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بایت ها|بایت}}",
+       "limitreport-templateargumentsize": "اندازه آرگومان الگو",
+       "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بایت ها|بایت}}",
+       "limitreport-expansiondepth": "بیشترین عمق گسترش",
+       "limitreport-expensivefunctioncount": "تعداد تابع تجزیه‌گر پرمصرف",
+       "expandtemplates": "بسط‌دادن الگوها",
+       "expand_templates_intro": "این صفحهٔ ویژه متنی را دریافت کرده و تمام الگوهای به‌کاررفته در آن را به طور بازگشتی بسط می‌دهد. همچنین تابع‌های تجزیه چون <code><nowiki>{{</nowiki>#language:…}}</code> و متغیرهایی چون  <code><nowiki>{{</nowiki>CURRENTDAY}}</code> را هم بسط می‌دهد — در واقع تقریباً هرچه را که داخل دوآکولاد باشد. این کار با صدازدن مرحلهٔ تجزیهٔ مربوط در خود مدیاویکی صورت می‌گیرد.",
+       "expand_templates_title": "عنوان موضوع، برای {{FULLPAGENAME}} و غیره:",
+       "expand_templates_input": "متن ورودی:",
+       "expand_templates_output": "نتیجه",
+       "expand_templates_xml_output": "خروجی XML",
+       "expand_templates_html_output": "خروجی اچ‌تی‌ام‌ال خام",
+       "expand_templates_ok": "خوو/ باشد",
+       "expand_templates_remove_comments": "پاک کردن گةپةل/قِسةل",
+       "expand_templates_remove_nowiki": "خنثی کردن تگ‌های <nowiki> در نتیجه",
+       "expand_templates_generate_xml": "نمایش درخت تجزیهٔ XML",
+       "expand_templates_generate_rawhtml": "نمایش اچ‌تی‌ام‌ال خام",
+       "expand_templates_preview": "پیش‌نمایش",
+       "expand_templates_preview_fail_html": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروع است، لطفا دوباره سعی کنید. اگر هنوز کار نمی کند، سعی کنید [[Special:UserLogout|خروج از سیستم]] را کلیک نموده و دوباره وارد شوید.",
+       "expand_templates_preview_fail_html_anon": "<em>زیرا {{SITENAME}} تا به HTML خام فعال و یک دست رفتن اطلاعات نشست وجود دارد، پیش نمایش به عنوان یک اقدام احتیاطی در برابر حملات جاوا اسکریپت پنهان است.</em>\n\n<strong>اگر این تلاش پیشنمایش مشروح است ، لطفا دوباره سعی کنید اگر هنوز کار میکند،سعی کنید  Following link is missing: [[Special:UserLogin|ورود|خروج]]را کلیک کنید و دوباره وارد شوید",
+       "pagelanguage": "وةڵگة انتخاب زوون",
+       "pagelang-name": "وةڵگة/پەڕە",
+       "pagelang-language": "زوون",
+       "pagelang-use-default": "استفاده إژ زوون پئش فرض",
+       "pagelang-select-lang": "زوون انتخاب کۀ",
+       "right-pagelang": "تغییر وةڵگة زوون",
+       "action-pagelang": "تغییر زوون وةڵگة",
+       "log-name-pagelang": "تغییر سیاههٔ زبان",
+       "log-description-pagelang": "ای پهرستنومه در بلگه زونا آلشت گرته.",
+       "logentry-pagelang-pagelang": "$1 {{GENDER:$2| تغییریافت}} زبان صفحه برای  $3  از  $4  به  $5 .",
+       "default-skin-not-found": "Whoops! The default skin for your wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> as <code>$1</code>, is not available.\n\nYour installation seems to include the following {{PLURAL:$4|skin|skins}}. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] for information how to enable {{PLURAL:$4|it|them and choose the default}}.\n\n$2\n\n; If you have just installed MediaWiki:\n: You probably installed from git, or directly from the source code using some other method. This is expected. Try installing some skins from [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory], by:\n:* Downloading the [https://www.mediawiki.org/wiki/Download tarball installer], which comes with several skins and extensions. You can copy and paste the <code>skins/</code> directory from it.\n:* Downloading individual skin tarballs from [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins Using Git to download skins].\n: Doing this should not interfere with your git repository if you're a MediaWiki developer.\n\n; If you have just upgraded MediaWiki:\n: MediaWiki 1.24 and newer no longer automatically enables installed skins (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). You can paste the following {{PLURAL:$5|line|lines}} into <code>LocalSettings.php</code> to enable {{PLURAL:$5|the|all}} installed {{PLURAL:$5|skin|skins}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; If you have just modified <code>LocalSettings.php</code>:\n: Double-check the skin names for typos.",
+       "default-skin-not-found-no-skins": "پوستهٔ پیش‌فرض برای ویکی شما تعریف‌شده در<code>$wgDefaultSkin</code> به عنوان <code>$1</code>، هست موجود نیست.\n\nشما پوسته‌ها را نصب نکرده‌اید.\n\n:اگر مدیاویکی را به‌روز یا نصب کرده‌اید:\n:ممکن است از گیت یا از کد منبع با روش‌های دیگر نصب کرده‌اید. انتظار می‌رود MediaWiki 1.24 یا جدیدتر در پوشهٔ اصلی هیچ پوسته‌ای نداشته باشند.\nسعی کنید تعدادی پوسته از [https://www.mediawiki.org/wiki/Category:All_skins پوشهٔ پوسته‌های مدیاویکی]، با:\n:*دریافت [https://www.mediawiki.org/wiki/Download نصب‌کننده تاربال]، که با چندین پوسته و افزونه هست. شما می توانید پوستهٔ <code>skins/</code> را از آن کپی و پیست کنید.\n:*کلون کردن یکی از <code dir=\"ltr\">mediawiki/skins/*</code> از مخزن در پوشهٔ <code>skins/</code> مدیاویکی‌تان.\n:اگر توسعه‌دهندهٔ مدیاویکی هستید، انجام این کار نباید تعارضی با مخزن گیت شما داشته باشد. برای اطلاعات بیشتر و فعال کردن پوسته‌ها و انتخاب آنها به عنوان پیش‌فرض [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: تنظیمات پوسته] را مشاهده کنید.",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (فعال)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''غیر فعال''')",
+       "mediastatistics": "آمار رسانه‌ها",
+       "mediastatistics-summary": "آمارها دربارهٔ نوع‌های پرونده‌ای به روزشده. این فقط شامل آخرین نسخهٔ پرونده است. نسخه‌های قدیمی یا حذف‌شده مسثنی هستند.",
+       "mediastatistics-nbytes": "{{PLURAL:$1|$1 بایت}} ($2؛ $3٪)",
+       "mediastatistics-table-mimetype": "نوع mime",
+       "mediastatistics-table-extensions": "افزونه‌های محتمل",
+       "mediastatistics-table-count": "تعداد پرونده‌ها",
+       "mediastatistics-table-totalbytes": "حجم ترکیبی",
+       "mediastatistics-header-unknown": "ناشنا/نادیار",
+       "mediastatistics-header-bitmap": "تصاویر بیت‌مپ",
+       "mediastatistics-header-drawing": "طراحی‌ها (تصاویر برداری)",
+       "mediastatistics-header-audio": "دةنگ/صدا",
+       "mediastatistics-header-video": "ویدیوةل",
+       "mediastatistics-header-multimedia": "رسانه‌های غنی",
+       "mediastatistics-header-office": "دفتر",
+       "mediastatistics-header-text": "متنی",
+       "mediastatistics-header-executable": "اجرایی",
+       "mediastatistics-header-archive": "قالب‌های فشرده",
+       "json-warn-trailing-comma": "$1 کامای در انتها از جی‌سن {{PLURAL:$1|حذف شد}}.",
+       "json-error-unknown": "مشکلی با جی‌سن بود. خطا: $1",
+       "json-error-depth": "بیشینهٔ عمق پشته رد شده است",
+       "json-error-state-mismatch": "جی‌سن نادرست یا نافض",
+       "json-error-ctrl-char": "خطای نویسهٔ کنترلی، احتمالاً به نادرستی کدگذاری شده است",
+       "json-error-syntax": "خطای نحوی",
+       "json-error-utf8": "نویسه‌های نادرست یوتی‌اف-۸، احتمالاً نادرست کدگذاری شده است",
+       "json-error-recursion": "ارجاع بازگشتی یک یا بیشتر در مقداری که کذگذاری می‌شود",
+       "json-error-inf-or-nan": "مقادیر INF یا NAN یک یا بیشتر در مقداری که کدگذاری می‌شود",
+       "json-error-unsupported-type": "یک مقداری نوعی که نمی‌تواند کدگذاری شود داده شده است",
+       "headline-anchor-title": "پیوند به این بخش",
+       "special-characters-group-latin": "لاتین",
+       "special-characters-group-latinextended": "لاتین گسترش‌یافته",
+       "special-characters-group-ipa": "آوانگاری بین‌المللی",
+       "special-characters-group-symbols": "نیشانةل",
+       "special-characters-group-greek": "یونانی",
+       "special-characters-group-cyrillic": "سیریلیک",
+       "special-characters-group-arabic": "عِرةؤی/عربی",
+       "special-characters-group-arabicextended": "عربی گسترش‌یافته",
+       "special-characters-group-persian": "فارسی",
+       "special-characters-group-hebrew": "عبری",
+       "special-characters-group-bangla": "بنگالی",
+       "special-characters-group-tamil": "تامیلی",
+       "special-characters-group-telugu": "تالوگو",
+       "special-characters-group-sinhala": "سینهالی",
+       "special-characters-group-gujarati": "گجراتی",
+       "special-characters-group-devanagari": "دیواناگرى",
+       "special-characters-group-thai": "تایلندی",
+       "special-characters-group-lao": "لائو",
+       "special-characters-group-khmer": "خمر",
+       "special-characters-title-endash": "خط فاصله/کِڕ نام تاق",
+       "special-characters-title-emdash": "خط فاصله کشیده",
+       "special-characters-title-minus": "علامت منفی",
+       "mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
+       "mw-widgets-titleinput-description-new-page": "ئئ وةڵگة هنوز/حالی وجود نِئرێ",
+       "mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
+       "api-error-blacklisted": "لطفاً یک عنوان توصیفی متفاوت انتخاب کنید."
+}
index ff22342..3c51189 100644 (file)
@@ -18,7 +18,9 @@
                        "Sprüngli",
                        "아라",
                        "Ninonino",
-                       "Macofe"
+                       "Macofe",
+                       "V6rg",
+                       "C.R."
                ]
        },
        "tog-underline": "Sutulinia i ligam",
        "createaccountreason": "Mutìf:",
        "createacct-reason": "Mutìf:",
        "createacct-reason-ph": "Che fòza che sét dré a creà 'n ótra ütènsa?",
-       "createacct-captcha": "Contròl de sigürèsa",
-       "createacct-imgcaptcha-ph": "Mèt dét el tèst che te èdet ché sura",
        "createacct-submit": "Créa la tò ütènsa",
        "createacct-another-submit": "Créa 'n ótra ütènsa",
        "createacct-benefit-heading": "{{SITENAME}} la crès gràsie a le persùne compagn de té.",
        "unwatchthispage": "Desmèt de tègner d'öcc",
        "watchlist-details": "{{PLURAL:$1|$1 pagina|$1 paginn}} tegnüü sot ögg, fö che i paginn de discüssión.",
        "wlshowlast": "Fa vidé i ültim $1 ur $2 dì",
+       "watchlistall2": "tücc",
        "watchlist-options": "Upzión lista d'ussevazión",
        "watching": "Giuntà ai pagin da ten d'ögg...",
        "unwatching": "Eliminà dai pagin da ten d'ögg...",
        "movelogpage": "Register di San Martin",
        "movereason": "Mutìf:",
        "revertmove": "Riprìstina 'mè che l'era",
-       "delete_and_move": "Scancèla e möf",
        "delete_and_move_confirm": "Sé, surascrìf la pàgina che gh'è zà",
        "export": "Espurtá pagin",
        "allmessages": "Tücc i messacc dal sistéma",
index 75d2db3..f4c44d4 100644 (file)
@@ -13,6 +13,7 @@
        "tog-hideminor": "قام کئردئن ڤیرایشتیا کوچئک مین آلئشتیا تازە",
        "tog-hidepatrolled": "قام کئردئن ڤیرایشتیا تیە دیار کئردە مین آلئشتیا تازە",
        "tog-newpageshidepatrolled": "بألگە یا تیە دیار کئردە نە مئن نومگە بألگە یا تازە قام کو",
+       "tog-hidecategorization": "قام کئردئن جأرغە کاری بألگە یا",
        "tog-extendwatchlist": "سئیل بأرگە نە سی نئشوٙ دأئن تأموٙم آلئشتیا ڤا کو نە فأقأط سی بیشتئر تازە باڤیا.",
        "tog-usenewrc": "دأسە بأنی آلئشتیا ڤا بألگە د آلئشتیا تازە و سئیل بأرگ",
        "tog-numberheadings": "سأربألگە خود شمارئشت کو",
@@ -42,6 +43,7 @@
        "tog-watchlisthideliu": "ڤبرایشتیایی نە کئ ڤئ دأس کاریاریا ڤامین ئوٙماە أنجوم گئرئتە د سئیل بأرگ نئهوٙ بأک",
        "tog-watchlisthideanons": "ڤیرایئشتیا کاریاریایی کئ نادیارئن د سئیل بأرگ نئهوٙ بأک",
        "tog-watchlisthidepatrolled": "ڤیرایشتیایی که هان د تیە رأس د سئیل بأرگ قام کو",
+       "tog-watchlisthidecategorization": "قام کئردئن جأرغە کاری بألگە یا",
        "tog-ccmeonemails": "ڤورداشتە یا أنجومانامه یا مئنە کئ سی کاریاریا هأنی کئل می کئم سیم کئل بأک",
        "tog-diffonly": "بألگە یایی کئ د ڤأر گئرتە فأرخیا هارئن دیاریشوٙ بأک",
        "tog-showhiddencats": "دأسە یا نئهوٙ بییأنئ دیاری بأک",
@@ -79,7 +81,7 @@
        "july": "جوٙلای",
        "august": "آگوست",
        "september": "سئپتامر",
-       "october": "ئوکتور",
+       "october": "ئÙ\88کتÙ\88بر",
        "november": "نوڤامر",
        "december": "دئسامر",
        "january-gen": "جانڤیە",
@@ -91,7 +93,7 @@
        "july-gen": "جوٙلای",
        "august-gen": "آگوست",
        "september-gen": "سئپتامر",
-       "october-gen": "ئوکتوڤر",
+       "october-gen": "ئوکتوبر",
        "november-gen": "نوڤامر",
        "december-gen": "دئسامر",
        "jan": "جانڤیە",
        "july-date": "جوٙلای $1",
        "august-date": "آگوست $1",
        "september-date": "سئپتامر $1",
-       "october-date": "ئوکتوڤر $1",
+       "october-date": "ئوکتوبر $1",
        "november-date": "نوڤامر $1",
        "december-date": "دئسامر $1",
        "pagecategories": "{{PLURAL:$1|}}{{PLURAL:$1|دأسە|دأسە يا}}",
        "userlogout": "د ساموٙنە دئرئوٙمائن",
        "notloggedin": "نأبوٙأ بیائیت ڤامین",
        "userlogin-noaccount": "یئ گئل حئساڤ ناریت؟",
-       "userlogin-joinproject": "ڤأصل بوٙییت {{SITENAME}}",
+       "userlogin-joinproject": "أندوم دیارگە {{SITENAME}} بوٙئیت",
        "nologin": "یئ گئل حئساڤ کاریاری ناريت؟$1",
        "nologinlink": "یئ گئل حئساڤ راس بأکیت",
        "createaccount": "حئساڤ راس بأکیت",
        "createaccountreason": "دألیل:",
        "createacct-reason": "دألیل",
        "createacct-reason-ph": "سی چی شوما داریت یئ گئل حئساڤ هأنی راس میکید",
-       "createacct-captcha": "ڤارئسی أمنیأت دار بییئن",
-       "createacct-imgcaptcha-ph": "نیسئسە یی نە کئ د ڤارو مئینیت ڤارئد بأکیت",
        "createacct-submit": "حئسأڤ خوتوٙنە راس بأکیت",
        "createacct-another-submit": "یئ گئل حئساڤ هأنی راس بأکیت",
        "createacct-benefit-heading": "{{SITENAME}}  ڤئ دأس خألکی چی شوما رأڤأندیاری بییە.",
        "createacct-benefit-body1": "{{PLURAL:$1|ڤیرایئشت|ڤیرایئشتیا}}",
        "createacct-benefit-body2": "{{PLURAL:$1|بألگە|بألگە یا}}",
-       "createacct-benefit-body3": "تازە{{PLURAL:$1|هومیار|هومیارا}}",
+       "createacct-benefit-body3": "تازە{{PLURAL:$1|هومیار|ھومیاریا}}",
        "badretype": "رازینە گوڤاردئنی کئ شمأ دأییتە هومدأنگی نارە.",
        "usernameinprogress": "رأرڤأندیاری یئ گئل حئساڤ سی ئی نوم کاریاری ھا د پیشکئرد. یئ گوری آھئرە داری بأکیت.",
        "userexists": "نوم کاریاری دە بییە ئیسئنی ڤئ کار گئرئتە بییە.\nلوطف بأکیت یئ گئل نوم هأنی نە ڤئرداریت.",
        "passwordreset-emailtext-ip": "یە کئسی(گاسی خوتوٙ، ڤا تیرنئشوٙن آی پی $1) د نۊ زئنە کئردئن رازینە گوڤاردئنئتوٙ د {{SITENAME}} حاستیتە($4).\nسی کاریار «$2» یئ گئل رازینە گوڤاردئن موڤأقتی رأڤأندیاری بییە و هومبأراڤأر «$3» ە.\nأر دالئتوٙ یە بییە ئیسئ ڤاس بیائیت ڤامین ساموٙنە و یئ گئل رازینە گوڤاردئن هأنی بئهایت.\n رازینە گوڤاردئن {{PLURAL:$3|ئی رازینە یا گوڤاردئن موڤأقأتی|ئی رازینە یا گوڤاردئن موڤأقأتی}} شوما د گات {{PLURAL:$5|یئ روٙ|$5 روٙ}} باطئل بوٙە.\n\nأر کأسی هأنی چئن حاستی داشتە یا یە کئ رازینە گوڤاردئن دئمایی شوما د ڤیرئتوٙ ئوٙما و دە نئمیهایت ڤئنە آلئشت کاری بأکیت، می توٙنیت د ئی پئیغوم تیە پوٙشی بأکیت و هأموٙ رازینە گوڤاردئن دئمایی نە بونیت د کار.",
        "passwordreset-emailtext-user": "کاریار $1 د {{SITENAME}} د نۊ زئنە کئردئن رازینە گوڤاردئن شومانە د{{SITENAME}} ($4) حاستە. {{PLURAL:$3|حئساڤ|حئساڤیا}} کاریاری کئ هان د هار و ڤا ئی تیرنئشوٙن أنجومانامە هان د ئرتئڤاط:\n\n$2\n\n رازینە گوڤاردئن {{PLURAL:$3|ئی رازینە یا گوڤاردئن موڤأقأتی|ئی رازینە یا گوڤاردئن موڤأقأتی}} شوما د گات {{PLURAL:$5|یئ روٙ|$5 روٙ}} باطئل بوٙە.\nأر کأسی هأنی چئن حاستی داشتە یا یە کئ رازینە گوڤاردئن دئمایی شوما د ڤیرئتوٙ ئوٙما و دە نئمیهایت ڤئنە آلئشت کاری بأکیت، می توٙنیت د ئی پئیغوم تیە پوٙشی بأکیت و هأموٙ رازینە گوڤاردئن دئمایی نە بونیت د کار.",
        "passwordreset-emailelement": "نوم کاریاری: \n$1\n\nرازینە گوڤاردئن موڤأقتی: \n$2",
-       "passwordreset-emailsent": "یئ گئل رازینە گوڤاردئن هأنی سی أنجومانامە کئل بییە.",
+       "passwordreset-emailsentemail": "یئ گئل رازینە گوڤاردئن هأنی سی أنجومانامە کئل بییە.",
        "passwordreset-emailsent-capture": "رازینە گوڤاردئن تازە توٙ سی أنجومانامە توٙ کئ ها د هار کئل بییە.",
        "passwordreset-emailerror-capture": "رازینە گوڤاردئن د أنجومانامە د نۊ زئنە کون کئل بییە،و ڤئ د هار دیاری میکە، ڤألی کئل بییئن ڤئ سی {{GENDER:$2|کاریار}} ناخوش سأرنجوم بییە:$1",
        "changeemail": "أنجومانامە توٙنە آلئشت کاری بأکیت",
-       "changeemail-header": "اÛ\8cÙ\85Û\8cÙ\84 Ø­Ø³Ø§Ù\88تÙ\88Ù\86Ù\87 Ø¢Ù\84شت Ø¨Ú©Û\8cد",
+       "changeemail-header": "ئÛ\8c Ù\81Ù\88رÙ\85ئ Ù\86Û\95 Ø³Û\8c Ø¢Ù\84ئشتکارÛ\8c Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99 Ù¾Ù\88ر Ø¨Ø£Ú©Û\8cت. Ø£Ø± Ù\85Û\8cھاÛ\8cت Ú¾Ø£Ø± Ø¬Ù\88Ù\99ر Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Û\8cÛ\8c Ù\86Û\95 Ø¯ Ù\85Û\8cÙ\86جا Ø­Ø¦Ø³Ø§Ú¤Ø¦ØªÙ\88Ù\99 Ù¾Ø§Ú©Ø³Ø§ Ø¨Ø£Ú©Û\8cتØ\8c Ø¬Ø§Ú¯Û\95 Ø¯Ø£Ø¦Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù\86ئ Ø¯ Ú\86ئÙ\86Û\8c Ù\81Ù\88رÙ\85Û\8c Ø­Ø§Ù\84Û\8c Ø¨Ø£Ù\86Û\8cت.",
        "changeemail-passwordrequired": "شوما سی پوشت راستکاری ئی آلئشت بایأد یئ گئل رازینە گوڤاردئن بأزئنیت.",
        "changeemail-no-info": "شوما سی یە کئ د ئی بألگە دأسرئسی داشتوٙییت باس بیاییت ڤامین.",
        "changeemail-oldemail": "تیرنئشوٙن أنجومانامە ئیسئنی:",
        "changeemail-newemail": "تیرنئشوٙن أنجومانامە تازە:",
+       "changeemail-newemail-help": "أر شوما میھایت تیرنئشوٙن أنجفونامە توٙنە ڤئرداریت چئنی جاگە یی نە بایأد حالی بأنیت. شوما. ئوٙسئ أر رازینە گورادئنئتوٙ د ڤیرتوٙ رأتە با نئمی توٙنیت د نۊ زئنەش بأکیت و ھأنی ھیچ جوٙر أنجومانامە یی د ئی ڤیکی ڤئ دأس شوما نئمی رئسە.-",
        "changeemail-none": "(هيش كوم)",
        "changeemail-password": "رازینە گوڤاردئن{{SITENAME}} شوما:",
        "changeemail-submit": "آلئشت دأئن أنجومانامە",
        "longpageerror": "<strong>خأطا:نیسئسە شوما {{PLURAL:$1|یە کئلوٙبایت|$1 کئلوبایت}} دئرازا نە دأە، کئ ڤئنوٙ د بیشتأروٙنە أنازە {{PLURAL:$2|یە کئلوبایت|$2 کئلوبایت}} گأپتأرئن.</strong>\nنأبوٙە ڤئ ئمایە با.",
        "readonlywarning": "<strong>د ڤیر داشتوٙئیت:رئسینە گا سی ڤاداشت کاری نئھاگئری بییە، سی یە نە کئ شوما ئیسە نئمی توٙنیت ڤیرایئشت کاریاتوٙنە ئمایە بأکیت.</strong>\nگاسی شوما بئھایت کئ نیسئسە خوتوٙنە د جانیا نیسئسە یی ڤوردار بئدیس بأکیت و ڤئنە سی نئھاتئر ئمایە بأکیت.\n\nدیڤوٙنداری کئ د ڤئ نئھاگئری کئردە چئنی گوتە:$1",
        "protectedpagewarning": "<strong>د ڤیر داشتوٙئیت:ئی بألگە سی یە پأر و پیم بییە کئ فأقأط کاریاریایی کئ دأسرئسی دیڤوٙنداری دارئن بأتوٙنئن دئش ڤیرایئشت کاری بأکأن..</strong>\nآخئری سیاە سی سأرچئشمە یا د ھار ئمایە کاری بییە:",
-       "semiprotectedpagewarning": "<strong>د ویر داشتویت:</strong> ای بلگه سی یه که فقط کاریاریا ثوت نام کرده تونستون دش ویرایشت بکه ن پر و پیم بیه.\nآخرین پهرستنومه دئه بیه سی سرچشمه هار نها اماییه بیه:",
+       "semiprotectedpagewarning": "<strong>د ڤیر داشتوٙئیت:</strong> ئی بألگە سی یە کئ فأقأط کاریاریا ثأڤتئنام کئردە تونئسوٙئن دئش ڤیراشتکار بأکأن پأر و پیم بییە.\nآخئری پئھرئستنوٙمە دأئە بییە سی سأرچئشمە ھاری نئھا ئمایە بییە:",
        "cascadeprotectedwarning": "<strong>زئنار:</strong> ئی بألگە ڤئ دأس کاریاریایی کئ صئلا سأردیڤوٙنکاری دارن می توٙنە ڤیرایئشت کاری بوٙە سی یە کئ ئی بألگە ڤئ رأڤئشت تاف نئمایی پأر و پیم کاری بییە {{PLURAL:$1|بألگە|بألگە یا}}:",
-       "titleprotectedwarning": "<strong>زئÙ\86ار:اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ù¾Ø± Ù\88 Ù¾Û\8cÙ\85 Ø¨Û\8cÙ\87 Ø³Û\8c Û\8cÙ\87 Ú©Ù\87[[Ù\88Û\8cجÙ\87\86Ù\88Ù\85 Ú¯Ù\87 Ø­Ù\82Ù\88Ù\82 Ú¯Ø±Ù\88|Ø­Ù\82Ù\88Ù\82 Ù\88Û\8cجÙ\87]] Ø¨Ø§Û\8cد Ù\88Ù\86Ù\87 Ø¯Ø±Ù\88س Ø¨Ú©Ù\86 .</strong>\nآخرÛ\8cÙ\86 Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 Ø¯Ø¦Ù\87 Ø¨Û\8cÙ\87 Ø³Û\8c Ø³Ø±Ú\86Ø´Ù\85Ù\87 Ø¯Ø¦Ù\86 Ù\86Ù\87ااÙ\85اÛ\8cÛ\8cÙ\87 Ø¨Û\8cÙ\87:",
-       "templatesused": "{{PLURAL:$1|چوئه|چوئه یا}} د ای بلگه وه کار گرته بیه:",
-       "templatesusedpreview": "{{PLURAL:$1|چوئه|چوئه یا}}استفاده بیه د ای پیش سیل:",
-       "templatesusedsection": "{{PLURAL:$1|چوئه|چوئه یا}} وه کار گرته بیه د ای بخش:",
+       "titleprotectedwarning": "<strong>زئÙ\86ار:ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù¾Ø£Ø± Ù\88 Ù¾Û\8cÙ\85 Ø¨Û\8cÛ\8cÛ\95 Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ [[Special:Ù\86Ù\88Ù\85Ú¯Û\95 Ø­Ù\88Ù\82Ù\88Ù\99Ù\82 Ú©Ø§Ø±Û\8cارÛ\8c Ø¬Ø£Ø±ØºÛ\95|Ø­Ù\88Ù\82Ù\88Ù\99Ù\82 Ú¤Û\8cجÛ\95]] Ø¨Ø§Û\8cأد Ú¤Ø¦Ù\86Û\95 Ø±Ø£Ú¤Ø£Ù\86دÛ\8cارÛ\8c Ø¨Ø£Ú©Ø£Ù\86.</strong>\nآخئرÛ\8c Ù¾Ø¦Ú¾Ø±Ø¦Ø³ØªÙ\86Ù\88Ù\99Ù\85Û\95 Ø¯Ø£ Ø¨Û\8cÛ\8cÛ\95 Ø³Û\8c Ø³Ø£Ø±Ú\86ئشÙ\85Û\95 Ø¯Ø£Ø¦Ù\86 Ù\86ئھا Ø¦Ù\85اÛ\8cÛ\95 Ø¨Û\8cÛ\8cÛ\95:",
+       "templatesused": "{{PLURAL:$1|چوٙأ|چوٙأ یا}} ڤئ کار گئرئتە د ئی بألگە:",
+       "templatesusedpreview": "{{PLURAL:$1|چوٙأ|چوٙأ یا}}ڤئ کار گئرئتە بییە د پیش سئیل:",
+       "templatesusedsection": "{{PLURAL:$1|چوٙأ|چوٙأ یا}} ڤئ کار گئرئتە بییە د ئی بأرجا:",
        "template-protected": "(پأر و پیم بییە)",
        "template-semiprotected": "(نئصم و نیمە پأر و پیم بییە)",
-       "hiddencategories": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ù\8aÙ\87 Ø§Ù\86دÙ\88Ù\85 Ø¯{{PLURAL:$1|1 hidden category|$1 hidden categories}}: Ù\87ئ",
+       "hiddencategories": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Û\8cئ Ú¯Ø¦Ù\84 Ø¯ Ø£Ù\86دÙ\88Ù\85Û\8cا {{PLURAL:$1|1 hidden category|$1 hidden categories}} Ú¾Û\8c:",
        "edittools-upload": "-",
-       "nocreatetext": "{{نوم مالگه}} سی راس کردن بلگه یا تازه محدود بیه.\nشما تونید روئیت وادما و بلگه ای که هئیش ویرایشت بکید ، یا [[ویجه:وامین اومائن کاریار|بیایت وامین یا یه گل حساو بسازیت]].",
+       "nocreatetext": "{{SITENAME}} سی رأڤأندیاری بألگە یا تازە نئھاگئری بییە.\nشوما می توٙنیت روئیت ڤادئما و بألگە ئی کئ بییشە ڤیرایئشت کاری بأکیت،[[Special:ڤامین ئوٙمائن کاریار|بیائیت ڤامین یا یە کئ یئ گئل حئساڤ دوروس بأکیت]].",
        "nocreate-loggedin": "شوما صئلا راس کئردئن بألگە تازە نە ناریت.",
-       "sectioneditnotsupported-title": "ویرایشت بهرجا حامین داری نبوئه",
+       "sectioneditnotsupported-title": "شوما صئلا ڤیرایئشت کاری بأرجایا نە ناریت.",
        "sectioneditnotsupported-text": "ڤیرایئشت بأرجایی د ئی بألگە نیئش.",
        "permissionserrors": "خأطا صئلا دأئن",
-       "permissionserrorstext": "Ø´Ù\85ا Ø­Ù\82 Ù\86ارÛ\8cت Ù\88Ù\86Ù\87 Ø§Ù\86جÙ\88Ù\85 Ø¨Û\8cئت, Ø³Û\8c{{PLURAL:$1|دÙ\84Û\8cÙ\84|دÙ\84Û\8cÙ\84Û\8cا}} Ù\86Ù\87ایی:",
-       "permissionserrorstext-withaction": "Ø´Ù\85ا Ø³Û\8c $2 Ø§Ø¬Ø§Ø²Ù\87 Ù\86ارÛ\8cت\nسÛ\8c Ù\86Ù\87اگرÛ\8c {{PLURAL:$1|دÙ\84Û\8cÙ\84|دلیلیا}}:",
-       "recreate-moveddeleted-warn": "'''زÙ\86Ù\87ار Ø´Ù\85ا Ø¨Ù\84Ú¯Ù\87 Ø§Û\8c Ú©Ù\87 Ù\88ادÙ\85ا Ù¾Ø§Ú©Ø³Ø§ Ø¨Û\8cÙ\87 Ù\87Ù\86Û\8c Ø±Ø§Ø³ Ú©Ø±Ø¯Û\8cتÙ\87'''\nØ´Ù\85ا Ø¨Ø§Û\8cد Ø¯Ù\88Ù\86سÙ\87 Ø¨Ø§Û\8cت Ú©Ù\87 Ø¢Û\8cا Ù\87Ù\86Û\8c Ø³Û\8c Ù\86Ù\87ا Ú¯Ø±ØªÙ\86 Ù\88Û\8cراÛ\8cشت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø®Ù\88ئÙ\87.\nپاکسا Ø¨Û\8cئÙ\86 Ù\88 Ø¬Ù\85شت Ø³Û\8c Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø³Û\8c Ù\81راغتتÙ\88 Ø¢Ù\85ادÙ\87 Ø¨Û\8cÙ\87:",
-       "moveddeleted-notice": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ù¾Ø§Ú©Ø³Ø§ Ø¨Û\8cÙ\87.\nپاکسا Ø¨Û\8cÙ\86 Ù\88 Ø¬Ù\85شت Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ø³Û\8c Ø³Ø±Ú\86Ø´Ù\85Ù\87 Ø¯Ø¦Û\8cÙ\86 Ø¢Ù\85ادÙ\87 Ø¨Û\8cÙ\87",
+       "permissionserrorstext": "Ø´Ù\88Ù\85ا Ø­Ø£Ù\82 Ù\86ارÛ\8cت Ú¤Ø¦Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85 Ø¨Ø¦Û\8cتØ\8c Ø³Û\8c{{PLURAL:$1|دأÙ\84Û\8cÙ\84|دأÙ\84Û\8cÙ\84Û\8cا}} Ù\86ئھایی:",
+       "permissionserrorstext-withaction": "Ø´Ù\88Ù\85ا Ø³Û\8c $2 ØµØ¦Ù\84ا \nÙ\86ئھاگئرÛ\8c Ù\86ارÛ\8cت {{PLURAL:$1|دأÙ\84Û\8cÙ\84|دألیلیا}}:",
+       "recreate-moveddeleted-warn": "'''د Ú¤Û\8cرئتÙ\88Ù\99 Ø¨Ø§:Ø´Ù\88Ù\85ا Ø¨Ø£Ù\84Ú¯Û\95 Û\8cÛ\8c Ú©Ø¦ Ú¾Ø§ Ú¤Ø§Ø¯Ø¦Ù\85ا Ù\88 Ù¾Ø§Ú©Ø³Ø§ Ø¨Û\8cÛ\8cÛ\95 Ø¯ Ù\86Û\8a Ø±Ø§Ø³ Ú©Ø¦Ø±Ø¯Û\8cتÛ\95.'''\nباÛ\8cأد Ø¯ Ú¤Û\8cرئتÙ\88Ù\99 Ø¨Ø§ Ú©Ø¦ Ø¢Û\8cا Ú¾Ø£Ù\86Û\8c Ù\86ئھاگئرÛ\8c Ú¤Û\8cراÛ\8cئشت Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø®Ù\88Ù\99Ø£.\nپاکسا Ú©Ø§Ø±Û\8c Ù\88 Ø¬Ø§ Ú¤Ø¦ Ø¬Ø§ Ú©Ø§Ø±Û\8c Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Û\8c Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ø¢Ø³Ø§Û\8cئشت Ø´Ù\88Ù\85ا Ø¢Ù\85ادÛ\95 Ø¨Û\8cÛ\8cÛ\95:",
+       "moveddeleted-notice": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù¾Ø§Ú©Ø³Ø§ Ø¨Û\8cÛ\8cÛ\95.\nپاکسا Ú©Ø§Ø±Û\8c Ù\88 Ø¬Ø§ Ú¤Ø¦ Ø¬Ø§ Ú©Ø§Ø±Û\8c Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Û\8c Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ø¢Ø³Ø§Û\8cئشت Ø´Ù\88Ù\85ا Ø¢Ù\85ادÛ\95 Ø¨Û\8cÛ\8cÛ\95.",
        "log-fulllog": "دیئن هأمە پئهئرستنوٙمە یا",
        "edit-hook-aborted": "ڤیرایئشت ڤا قولاڤ نئھاگئری بییە.\nھیچ توضیی سیش نی.",
-       "edit-gone-missing": "Ù\86بÙ\88ئÙ\87 Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ù\88Ù\87 Ù\87Ù\86Ú¯Ù\88Ù\85 Ø¨Ú©Û\8cت.\nÙ\88Ù\87 Ù\86ظر Ù\85Û\8cا Ú©Ù\87 Ù\88Ù\87 Ù¾Ø§Ú©Ø³Ø§ Ø¨Û\8cÙ\87.",
+       "edit-gone-missing": "Ù\86أبÙ\88Ù\99Û\95 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ú¤Ø¦ Ú¾Ø¦Ù\86Ú¯Ù\88Ù\85 Ø¨Ø£Ú©Û\8cت.\nÚ\86ئÙ\86Û\8c Ú¤Ø¦ Ù\86أظأر Ù\85Û\8cا Ú©Ø¦ Ú¤Ø¦ Ù¾Ø§Ú©Ø³Ø§ Ø¨Û\8cÛ\8cÛ\95.",
        "edit-conflict": "ری ڤئ ری کاری د ڤیرایئشت.",
-       "edit-no-change": "سی یه که آلشتیا د یه گل نیسسه دروس بیه د ویرایشت شما تیه پوشی بیه.",
+       "edit-no-change": "سی یە کئ ھیچ آلئشتکاری د نیسئسە أنجوم نأگئرئتە د ڤیرایئشتکای شوم تیە پوٙشی بییە.",
        "postedit-confirmation-created": "بألگە دوروس بییە.",
        "postedit-confirmation-restored": "بألگە د نۊ ئمایە بییە.",
        "postedit-confirmation-saved": "ڤیرایئشتئتوٙ ئمایە بی.",
-       "edit-already-exists": "Ù\86بÙ\88ئÙ\87 Û\8cÙ\87 Ú¯Ù\84 Ø¨Ù\84Ú¯Ù\87 ØªØ§Ø²Ù\87 Ø±Ø§Ø³ Ø¨Ú©Û\8cد.\nÙ\88Ù\87 Ù\87ئیش.",
-       "defaultmessagetext": "Ù\86Û\8cسسÙ\87 Ù¾Û\8cغÙ\88Ù\85 Ù¾Û\8cØ´ Ù\81رض",
-       "content-failed-to-parse": "د یک تیچیسن چیا مئن $2 د مدل $1:$3",
+       "edit-already-exists": "Ù\86أبÙ\88Ù\99Û\95 Û\8cئ Ú¯Ø¦Ù\84 Ø¨Ø£Ù\84Ú¯Û\95 ØªØ§Ø²Û\95 Ø¨Ø£Ú©Û\8cت .\nڤئ Ú¾یش.",
+       "defaultmessagetext": "Ù\86Û\8cسئسÛ\95 Ù¾Ø¦Û\8cغÙ\88Ù\85 Ù¾Û\8cØ´ Ù\81Ø£رض",
+       "content-failed-to-parse": "د یأک تیچئسئن چیا مین $2 د مودئل $1:$3",
        "invalid-content-data": "دونئسمأنی مینوٙنە نادیار",
-       "content-not-allowed-here": " Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87\"$1\" Ø³Û\8c Ø¨Ù\84Ú¯Ù\87 [[$2]] ØµÙ\84ا Ù\86Ù\87 Ø¯Ø¦Ù\87 Ø¨Û\8cÙ\87",
-       "editwarning-warning": "ار Ø§Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\86Ù\87 Ù\88Ù\84 Ø¨Ú©Û\8cت Ù\87ر Ø¢Ù\84شتÛ\8c Ú©Ù\87 Ø¯Ø¦Û\8cتÙ\87 Ù¾Ø§Ú© Ø¨Ù\88ئÙ\87.\nار Ø´Ù\85ا Ù\87اÛ\8cÛ\8cت Ù\88ا Ù\85Û\8cÙ\86Ø\8cØ´Ù\85ا Ù\85Û\8c ØªÙ\88Ù\86Û\8cت Ø§Û\8c Ø²Ø¦Ù\86ار Ù\86Ù\87 Ø¯ \"{{int:prefs-editing}}\" Ú©Ù\87 Ù\87ا Ø¯ Ø¨Ø®Ø´ Ø§Ù\88Ù\84Ù\88Û\8cتÛ\8cا Ø´Ù\85ا Ù\86اکشتگر Ø¨کیت.",
-       "editpage-notsupportedcontentformat-title": "شلک مینونه دماگری نبیه",
-       "editpage-notsupportedcontentformat-text": "وضع و بار مینونه $1 د مدل مینونه $2 حامین نبوئه.",
+       "content-not-allowed-here": " Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 \"$1\" Ø³Û\8c Ø¨Ø£Ù\84Ú¯Û\95 [[$2]] ØµØ¦Ù\84ا Ø¯Ø£ Ù\86أبÛ\8cÛ\95",
+       "editwarning-warning": "أر Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86ئ Ú¤Ø¦Ù\84 Ø¨Ø£Ú©Û\8cت Ú¾Ø£Ø± Ø¢Ù\84ئشتÛ\8c Ú©Ø¦ Ø£Ù\86جÙ\88Ù\85 Ø¯Ø£Ø¦Û\8cتÛ\95 Ù¾Ø§Ú© Ø¨Ù\88Ù\99Û\95.\nأر Ø´Ù\88Ù\85ا Ú¾Ø§Ø¦Û\8cت Ú¤Ø§Ù\85Û\8cÙ\86Ø\8c Ø´Ù\88Ù\85ا Ù\85Û\8c ØªÙ\88Ù\99Ù\86Û\8cت Ø¨ Ø²Ø¦Ù\86ار Ù\86Û\95 Ø¯ \"{{int:prefs-editing}}\" Ú©Ø¦ Ú¾Ø§ Ø¯ Ø¨Ø£Ø±Ø¬Ø§ Ú\86Û\8cا Ù\86ازار Ø´Ù\88Ù\85ا Ù\86اکÙ\88Ù\86ئشتگأر Ø¨Ø£کیت.",
+       "editpage-notsupportedcontentformat-title": "شئکل مینوٙنە حامینداری نأبییە",
+       "editpage-notsupportedcontentformat-text": "حال و بال مینوٙنە $1 د مودئل مینوٙنە $2 حامینداری نأبوٙە.",
        "content-model-wikitext": "ڤیکی نیسئسە",
        "content-model-text": "نیسئسە سادە",
        "content-model-javascript": "جاڤا ئسکئریپت",
        "undo-nochange": "وه نظر میا که ای ویرایشت د ایسنیا خومثی بیه.",
        "undo-summary": "خومثی بیئن وانئری وا $1 [[Special:Contributions/$2|$2]] ([[User talk:$2|چک چنه]])",
        "undo-summary-username-hidden": "خومثی بیئن وانئری $1 وا یه گل کاریار قام بیه",
-       "cantcreateaccounttitle": "Ù\86بÙ\88ئÙ\87 Ø­Ø³Ø§Ù\88 Ø±Ø§Ø³ Ø¨Ú©Û\8cد",
+       "cantcreateaccounttitle": "Ù\86أبÙ\88Ù\99Û\95 Ø­Ø¦Ø³Ø§Ú¤ Ø±Ø§Ø³ Ø¨Ø£Ú©Û\8cت",
        "cantcreateaccount-text": "حساو دروس بیه و ا ای تیرنشون آی پی(<strong>$1</strong>) وه دس ای [[کاریار:$3|$3]] قلف بیه.\n\n\nدلیل دئه بیه وا $3 ها د<em>$2</em>",
        "cantcreateaccount-range-text": "حساو دروس بیه وا تیرنشون آی پی که د پوشینه '''$1''' ، که وه ئم مینونه دار تیرنشون آی پی شما ئم هئ('''$4''')، وه دس [[کاریار:$3|$3]]قلف بیه.\n\nدلیل دئه بیه وا $3، \"$2\" ئه.",
        "viewpagelogs": "سئیل پئرئستنوٙمە یا ئی بألگە بأکیت",
        "nohistory": "هیچ ویرگار ویرایشتی د ای بلگه نئ.",
        "currentrev": "آخرین دوواره دیئن",
        "currentrev-asof": "آخري وانئری چی $1",
-       "revisionasof": "دوواره ديئن $1",
+       "revisionasof": "دوڤارە ديئن $1",
        "revision-info": "دوواره سیل بیه چی $1 وا $2",
        "previousrevision": "ڤانئیأری دئمایی←",
        "nextrevision": "ڤانئیأری تازە تئر",
        "mergehistory": "ویرگاریا بلگه نه یکی بکید",
        "mergehistory-header": "ای بلگه وه شما اجازه می ئه که وانیریانه ویرگار سرچشمه بلگه نه د یه گل بلگه تازه سریک سازی بکید.\nمطمئن بویت که ای آلشت د لحاظ ویرگاری د مین بلگه موندگاره.",
        "mergehistory-box": "دوواره دیئن دوبلگه ای نه سر یک سازی کو:",
-       "mergehistory-from": "بلگه سرچشمه:",
+       "mergehistory-from": "بألگە سأرچئشمە:",
        "mergehistory-into": "بلگه مقصد:",
        "mergehistory-list": "ویرگار ویرایشت سر یک سازی بیئنی",
        "mergehistory-merge": "نسقه یا هاری که د [[:$1]] وه یک شیوسنی وا[[:$2]] هئن.\nستین دگمه یا رادیویی نه به کار به ونیت سی یه که نسقه یایی نه که د گاتی دماتر دروس بینه انتخاو بکیت.\nد ویرتو با که پورسن ری پیوندیا باعث بوئه که ستین وه شکل اولیه خوش ؤرئرده.",
        "prefs-help-prefershttps": "کارگرایی ای ترجیح نها وامین اومائن نهایی شما وه کار گرته بوئه.",
        "prefswarning-warning": "آلشتیا شما ری ترجیحاتتو هنی اماییه نبیه.\nار ای بلگه نه بی یه که ری \"$1\" بپورنیت ول بکیت ترجیحیا شما اماییه نبوئن.",
        "prefs-tabs-navigation-hint": "نکته: شما می تونید د کلیتیا لادیار کن چپ و راست نه سی رئتن مین تبیا که هان د نوم گه تبیا وه کار بونیت.",
-       "email-address-validity-valid": "تیرنشون انجومانامه دیار بیه خوئه",
-       "email-address-validity-invalid": "یه گل تیرنشون انجومانامه خو وارد بکید",
-       "userrights": "حقوق دیوونداری کاریار",
-       "userrights-lookup-user": "دسه یا کاروری نه دیوون داری بکیت",
-       "userrights-user-editname": "یه گل نوم کاریاری وارد بکیت:",
-       "editusergroup": "ویرایشت گرویا کاریاری",
+       "userrights": "حوقوٙق دیڤوٙنداری کاریار",
+       "userrights-lookup-user": "جأرغە یا کاریاری نە دیڤوٙنداری بأکیت",
+       "userrights-user-editname": "یئ گئل نوم کاریاری ڤارئد بأکیت:",
+       "editusergroup": "ڤیرایئشت جأرغە یا کاریاری",
        "editinguser": "آلئشت دأئن حوقوٙق کاریاری کاریار '''[[کاریار:$1|$1]]''' $2",
-       "userrights-editusergroup": "ویرایشت گرویا کاریاری",
-       "saveusergroups": "اÙ\85اÛ\8cÛ\8cÙ\87 Ú©Ø±Ø¯Ù\86 Ú¯Ø±Ù\88یا کاریاری",
-       "userrights-groupsmember": "اندوم:",
-       "userrights-groupsmember-auto": "اÙ\86دÙ\88Ù\85 Ø¶Ù\85Ù\86Û\8c:",
+       "userrights-editusergroup": "ڤیرایئشت جأرغە یا کاریاری",
+       "saveusergroups": "ئÙ\85اÛ\8cÛ\95 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¬Ø£Ø±ØºÛ\95 یا کاریاری",
+       "userrights-groupsmember": "Ø£ندوم:",
+       "userrights-groupsmember-auto": "Ø£Ù\86دÙ\88Ù\85 Ù\86ادÛ\8cار:",
        "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "شما می تونیت دسه یای که ای کاریار ها دشو آلشت بئیتو:\n* جعوه نشودار وه ای مئنیه که کاریار ها د او دسه.\n* جعوه بی نشون وه ای مئنیه که کاریار د او دسه نئ.\n* نشون* د ای مئنیه که ار شما او دسه نه اضاف بکیتو د نهاتر نموئه ؤردارینش یا برعسگش.",
        "userrights-reason": "دألیل:",
        "group-autoconfirmed": "کاریاریا خود پوشت راس بییە",
        "group-bot": "بوتیا",
        "group-sysop": "سأردیڤوٙنکاریا",
-       "group-bureaucrat": "بروکراتیا",
+       "group-bureaucrat": "بوروکراتیا",
        "group-suppress": "تیە پایا",
        "group-all": "(هأمە)",
        "group-user-member": "{{GENDER:$1|کاریار}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|کارÛ\8cار Ø®Ù\88دانجومکار}}",
-       "group-bot-member": "{{حنس:$1|بوت}}",
-       "group-sysop-member": "{{GENDER:$1|دیووندار}}",
-       "group-bureaucrat-member": "{{GENDER:$1|بروکرات}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|کارÛ\8cار Ø®Ù\88دأنجومکار}}",
+       "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}}:کارÛ\8cار Ø®Ù\88دانجومکار",
+       "grouppage-autoconfirmed": "{{ns:project}}:کارÛ\8cار Ø®Ù\88دأنجومکار",
        "grouppage-bot": "{{ns:project}}:بوت یا",
-       "grouppage-sysop": "{{ns:project}}:دیوونداریا",
-       "grouppage-bureaucrat": "{{ns:project}}:دیوونداریا",
+       "grouppage-sysop": "{{ns:project}}:دیڤوٙنداریا",
+       "grouppage-bureaucrat": "{{ns:project}}:دیڤوٙنداریا",
        "grouppage-suppress": "{{ns:project}}:تیە پا",
-       "right-read": "حنن بلگیا",
-       "right-edit": "ویرایشت بلگیا",
+       "right-read": "حأنئن بألگە یا",
+       "right-edit": "ڤیرایئشت بألگە یا",
        "right-createpage": "بلگه یا نه راس بکیت(ونو که دشو بلگه یا چک چنه نئ)",
        "right-createtalk": "بلگه یا چک چنه نه راس بکید",
        "right-createaccount": "یه گل حساو کاروری تازه راس بکیت",
        "rcshowhidemine": "ڤیرایئشتیا مئ $1",
        "rcshowhidemine-show": "نئشوٙ دأئن",
        "rcshowhidemine-hide": "قام کئردئن",
+       "rcshowhidecategorization": "جأرغە کاری بألگە $1",
+       "rcshowhidecategorization-show": "نئشوٙ دأئن",
+       "rcshowhidecategorization-hide": "قام کئردئن",
        "rclinks": "آخرین آلشتیا $1 نشو بیه د اخرین روزیا $2",
        "diff": "فأرخ",
        "hist": "ڤیرگار",
        "boteditletter": "ب",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 دینه {{PLURAL:$1|کاریار|کاریاریا}}]",
-       "rc_categories": "دسÙ\87 Û\8cا Ù\86Ù\87 Ù\85حدÙ\88د Ú©Ù\88\88ا \"|\" Ø¬Ú¯Ø§ Ø¨Ù\88ئÙ\86",
-       "rc_categories_any": "هرکوم",
+       "rc_categories": "جأرغÛ\95 Û\8cا Ù\86Û\95 Ù\85أدÙ\88Ù\99د Ú©Ù\88(ڤا \"|\" Ø¬Ø¦Ú¯Ø§ Ø¨Ø§Ù\86)",
+       "rc_categories_any": "ھأرکوم کئ گولئ ڤورچیە بیینە",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت|بایتیا}} نئها آلئشتکاری",
        "newsectionsummary": "/* $1 */ بهرجا تازه",
        "recentchangeslinked-summary": "ای نوم گه تازه د بلگیایی که وا بلگیا ویجه هوم پیوند بینه آلشت بیه(یا سی اندومیا دسه بنی بیه)\nبلگیا یی که هان [[Special:Watchlist|your watchlist]]و گپ بینه",
        "recentchangeslinked-page": "نوم بألگە:",
        "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
+       "recentchanges-page-added-to-category": "[[:$1]]د دأسە ئضاف بی",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
+       "recentchanges-page-removed-from-category": "[[:$1]] د دأسە جئگا بی",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
+       "autochange-username": "آلئشتکاری خودأنجوم مئدیاڤیکی",
        "upload": "سوڤار کئردئن جانیا",
        "uploadbtn": "سوڤار کئردئن جانیا",
        "reuploaddesc": "سوار کردن نه انجوم شیو بکیت و د ورئردیت جابلگ سوارکرد",
        "uploaderror": "خأطا د سوڤار کئردئن",
        "upload-recreate-warning": "'''زئنار: جانیایی که وه ای نومه یا پاکسا بیه یا جا وه جا بیه.'''\n\nسی رائتی، نومگه پاکساگری و جا وه جا کردن ای بلگه ها د هار:",
        "uploadtext": "دسی دئین جانیایی که  د دماتر سوار بینه روئیت وه  [[Special:FileList|نوم گه جانیایا]] . د نو سوارکردن  د [[Special:Log/upload|نوم گه سوارکردیا]] و پاکساگری جانیایا د [[Special:Log/delete|deletion log]] جاگئر موئه.\n\nنها یه که یه گل جانیانه سوار کردیت می تونیت د سه شکل هاری وه نه د بلگه یا وه کار بونیت:\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''' سی به کار بسن نسقه کامل جانیا\n*'''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' سی به کار بسن یه گل نسقه 200 پیکسلی  د جانیایی که ها د مینه یه گل جعوه  که ها د لا چپ نیسسه که د وه عبارت alt text چی توضیح وه کار بسه بیه\n*'''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' سی دروس کردن یه گل هوم پیوند سرراست وه جانیا بی یه که جانیا دیاری بکه نوم بلگه هاری سی سوارکرد جانیایا تازه استفاده بکیت.",
-       "upload-permitted": "جورا جانیا صلادار:$1 .",
-       "upload-preferred": "جورا جانیا صلادار:$1.",
+       "upload-permitted": "جوٙرا صئلادار جانیا {{PLURAL:$2|جوٙر|جوٙرا}}:$1 .",
+       "upload-preferred": "جوٙرا حاستئنی جانیا {{PLURAL:$2|جوٙر|جوٙرا}}:$1 .",
        "upload-prohibited": "جورا جانیا صلادار:$1{{PLURAL:$2|.}}",
        "uploadlogpage": "سوارکرد",
        "uploadlogpagetext": "نومگه هاری یه گل نومگه د آخری سوارکرد جانیایا هئ.\nسی د نو سیل کردن[[Special:NewFiles|عسگدونی جانیایا تازه نه]] به ونیت.",
        "uploaddisabledtext": "سوار کرد جانیایا د کار نئ.",
        "php-uploaddisabledtext": "سوارکرد جانیایا د پی اچ پی ناکشتگر بیه.\nلطفن میزونکاری سوارکرد جانیا نه وارسی بکیت.",
        "uploadscripted": "ای بلگه مینونه دار رازینه اچ تی امل یا نیسسه یه که شایت وه ناخوشی وا دوراته نیئر واشکافت با.",
+       "upload-scripted-pi-callback": "نأبوٙە جانیایایی کئ د ڤأرگئرئتە آموختارکاری پأردازئشت بألگە یا ئیکس ئم ئلئن سوڤار بأکیت.",
        "uploadscriptednamespace": "ای جانیا اس‌ وی‌ جی نوم جا غیرقانونی '$1' داره.",
        "uploadinvalidxml": "ایکس ام الی که سوار بیه نبوئه نوتیج با.",
        "uploadvirus": "د ای جانیا ویروس هئ!\nجزیات:$1",
        "upload-too-many-redirects": "ای یو آر ال د ورگیرنه واگردونیا فرئی هئ",
        "upload-http-error": "یه گل خطا اچ تی تی پی پیش اومائه:$1",
        "upload-copy-upload-invalid-domain": "ورداشتن سوارکردیا د ای پوشگئر د دسرس نئ.",
+       "upload-dialog-title": "سوڤار کئردئن جانیا",
+       "upload-dialog-button-cancel": "أنجوم شیڤئسئن",
        "upload-dialog-button-done": "أنجوم بییە",
        "upload-dialog-button-save": "ئمایە کئردئن",
        "upload-dialog-button-upload": "سوڤار کئردئن",
+       "upload-form-label-select-file": "ئنتئخاڤ جانیا",
+       "upload-form-label-infoform-title": "جوزئیات",
        "upload-form-label-infoform-name": "نوم",
        "upload-form-label-infoform-description": "توضی",
        "upload-form-label-usage-title": "ڤئ کار گئرئتئن",
        "upload-form-label-usage-filename": "نوم جانیا",
+       "foreign-structured-upload-form-label-own-work": "یە کار مئنە",
+       "foreign-structured-upload-form-label-infoform-categories": "دأسە یا",
+       "foreign-structured-upload-form-label-infoform-date": "گات",
        "backend-fail-stream": "نبوئه جانیا\"$1\" کل بوئه.",
        "backend-fail-backup": "نبوئه سی \"$1\" پشتجا گرت.",
        "backend-fail-notexists": "جانیا $1 وجود ناره.",
        "randomincategory-nopages": "هیچ بلگه ای د ای  [[:دسه نئ:$1|$1]] دسه.",
        "randomincategory-category": "دأسە:",
        "randomincategory-legend": "بلگه بختی د ای دسه",
+       "randomincategory-submit": "رو",
        "randomredirect": "واگردونی بختکی",
        "randomredirect-nopages": "هیچ واگردونی د نومجا \"$1\" نئ.",
        "statistics": "آماريا",
        "unusedimages": "فایلیا استفاده نبیه",
        "wantedcategories": "بلگه یا حاستنی",
        "wantedpages": "بلگه یا حاستنی",
-       "wantedpages-summary": "نومگه بلگه یایی که نیئشو وا بیشتری هوم پیوند د ونو، وه جز بلگه یایی که فقط آلشت دئن لا د ونونه دارن. سی یه گل نومگه د بلگه یایی که نیئشو و آلشت دئن لا د ونونه دارن، [[{{#special:BrokenRedirects}}]] نه سیل بکیت.",
+       "wantedpages-summary": "نومگە بألگە یایی کئ نیئشوٙ ڤا بیشتئری ھومپئیڤأند د ڤئنوٙ،  ، ڤئ جوز بألگە یایی کئ فأقأط آلئشتکاری لا د ڤئنوٙنە دأرئن. سی یئ گئل نومگە د بألگە یایی کئ نیئشوٙ و آلئشتکاری لا د ڤئنوٙنە دارئن،[[{{#special:BrokenRedirects}}]] نە سئیل بأکیت.",
        "wantedpages-badtitle": "سرون نامعتور د کومله نتیجه یا:$1",
        "wantedfiles": "فایلیا حاستنی",
        "wantedfiletext-cat": "جانیایا هاری وه کار گرته بوئن ولی وجود نارن. همچنو شایت جانیایا وه دری وا یه که ایچه هیئشون نومگه کاری بینه.هر گرینج مثبت دورویی  <del>خط مئوره.</del> به اضافه یه، بلگه یایی که که جانیایا بی وجودن نه د خوشو دارن د [[:$1]] نومگه کاری بینه.",
        "booksources-text": "د هار نومگه ای د هوم پیوندیا د دیارگه یا هنی اومائه که کتاویا نو و دس دوئم می فروشن، و همچنو شایت دونسمنیا بیشتری راجع وه کتاو حاستنی شما داشتوئن:",
        "booksources-invalid-isbn": "شازک که دئه بیه معتور نئ؛ وارسی خطایا د گات ؤرداشتن د سرچشمه اولی وه کار گرته بوئه.",
        "specialloguserlabel": "انجومکار:",
-       "speciallogtitlelabel": "حاستنی(موضوع یا کاریار):",
+       "speciallogtitlelabel": "حاستئنی(داسوٙن یا نوم کاریاری سی کاریار):",
        "log": "پهرستنومه یا",
        "all-logs-page": "همه پهرستنومه یا عمومی",
        "alllogstext": "نماشت یه جا همه پهرستنومه یا که هان د{{SITENAME}}.\nمی تونید وا انتخاو نوع پهرستنومه، نوم کاریاری(حساس وه کؤچکی و گپی حرفیا) و بلگه یا آلشت کرده(حساس و گپی و کؤچکی حرنیا) نمایشت نه دیر د ویرتر بکیت.\n\n{{SITENAME}}.",
        "listgrouprights-members": "(نوم گه اندومیا)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
-       "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": "{{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-namespaceprotection-header": "محدودیت نومجا",
        "listgrouprights-namespaceprotection-namespace": "نوم جا",
        "listgrouprights-namespaceprotection-restrictedto": "دسرسیا مجاز کاریار سی ویرایشت",
-       "trackingcategories": "دما گری دسه یا",
+       "trackingcategories": "دئماگئری دأسە یا",
        "trackingcategories-summary": "ای بلگه نومگه دسه یایی دماگری بیه ئه که وه شکل خودانجوم وه دس ویکی وارسگر پر بوئن . نومیا ونو نها آلشت کردن پیغومیا سامونه ای مرتوط د نومجا {{ns:8}} آلشت دئه با.",
-       "trackingcategories-msg": "دماگری دسه",
-       "trackingcategories-name": "نوم پیغوم",
+       "trackingcategories-msg": "دئماگئری دأسە",
+       "trackingcategories-name": "نوم پئیغوم",
        "trackingcategories-desc": "جادیارکنیا گنجایشت دسه",
        "noindex-category-desc": "ای بلگه وا رباتیا نومگه کاری نبیه و سی یه کلیمه یا جادویی <code><nowiki>__NOINDEX__</nowiki></code> د وه یا د جاگه ای که بیرق مجازه دش هئ.",
        "index-category-desc": "ای بلگه<code><nowiki>__INDEX__</nowiki></code> که ها دش(و د نومجایی یه که بیرق دش مجازه)،  سی یه وا رباط ما مشگلی ناره که وه شکل عادی نباید با.",
        "trackingcategories-disabled": "دسه ناکشتگر بیه",
        "mailnologin": "هیپچ نشونی یی کل نبیه",
        "mailnologintext": "سی کل کردن انجومانامه وه کاریاریا هنی واس [[Special:UserLogin|بیایت وامین سامونه]] و تیرنشون انجومانامه معتوری د [[Special:Preferences|ترجیحات]] خوتو داشتوئیت.",
-       "emailuser": "اÛ\8c Ù\83ارÙ\88ر Ù\86Ù\87 Ø§Ù\8aÙ\85Ù\8aÙ\84 Ù\83و",
-       "emailuser-title-target": "اÛ\8cÙ\85Û\8cÙ\84 Ø³Û\8c Ø§Û\8c {{GENDER:$1|کارÙ\88ر}}",
+       "emailuser": "ئÛ\8c Ú©Ø§Ø±Û\8cار Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø§Ø±Û\8c Ú©و",
+       "emailuser-title-target": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø³Û\8c Ø¦Û\8c {{GENDER:$1|کارÛ\8cار}}",
        "emailuser-title-notarget": "أنجومانامە کاریار",
        "emailpagetext": "شما می تونیت  نوم بلگه هار نه سی کل کردن یه گل انجومانامه وه ای  {{GENDER:$1|کاریار}} وه کار بئیرت.\nتیرنشون انجومانامه یی که د [[Special:Preferences|ترجیحات کاریارتو]] دئیه ته د تیرنشون کلکار انجومانامه میا، سی یه که گیرنه بتونه جواوش بیه.",
        "defemailsubject": "{{نوم سیل جا}} ایمیل د کارور \"$1\"",
        "email-legend": "کل کردن یه گل انجومانامه سی یه گل کاریار هنی د {{SITENAME}}",
        "emailfrom": "د:",
        "emailto": "سی:",
-       "emailsubject": "سرÙ\88ن:",
-       "emailmessage": "پيغوم:",
-       "emailsend": "كل بيه",
+       "emailsubject": "داسÙ\88Ù\99ن:",
+       "emailmessage": "پئیغوٙم",
+       "emailsend": "کئل کئردئن",
        "emailccme": "یه گل وردار د پیغوم مه نه سیم ایمیل کو.",
        "emailccsubject": " پیغومتو سی $1:$2 ورداشته بی",
-       "emailsent": "اÛ\8cÙ\85Û\8cÙ\84 Ú©Ù\84 Ø¨Û\8cÙ\87",
+       "emailsent": "Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95",
        "emailsenttext": "پیغوم ایمیلی تو کل بیه.",
-       "emailuserfooter": "اÛ\8c Ø§Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù\87 Ù\88ا Ø¨Ù\87 Ú©Ø§Ø± Ú¯Ø±ØªÙ\86 Ø¯ Ø®ØµÙ\88صÛ\8cت \"Ú©Ù\84 Ú©Ø±Ø¯Ù\86 Ù\86Ù\88Ù\85Ù\87 Ø¯ Ø§Û\8c Ú©Ø§Ø±Û\8cار\"{{SITENAME}} Ù\88Ù\87 Ø¯Ø³ $1 Ø¨Ù\87 $2 Ú©ل بی.",
+       "emailuserfooter": "ئÛ\8c Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú¤Ø§ Ú¤Ø¦ Ú©Ø§Ø± Ú¯Ø¦Ø±Ø¦ØªÙ\86ئ Ø¯ Ø®Ù\88صÙ\88Ù\99صÛ\8cأت \"کئÙ\84 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ù\86Ù\88Ù\85Û\95 Ø¯ Ø¦Û\8c Ú©Ø§Ø±Û\8cار\"{{SITENAME}} Ú¤Ø¦ Ø¯Ø£Ø³ $1 Ø¯ $2 Ú©Ø¦ل بی.",
        "usermessage-summary": "رئتن د سامونه پیغوم",
        "usermessage-editor": "پیغوم فرسن سیستم",
        "usermessage-template": "ویکی وارسگر:پیغوم کاریار",
-       "watchlist": "سیل برگ",
-       "mywatchlist": "سیل برگ",
+       "watchlist": "سئیل بأرگ",
+       "mywatchlist": "سئیل بأرگ",
        "watchlistfor2": "سي $1 $2",
        "nowatchlist": "شما هیچی د سیل برگ خوتو ناریت",
        "watchlistanontext": "لطفن بیایت وامین و ویرایشتیا نه د سیل برگتو سیل بکیت.",
-       "watchnologin": "وارد نبیه",
-       "addwatch": "اضاÙ\81 Ú©Ø±Ø¯Ù\86 Ø¯ Ø³Û\8cÙ\84 Ø¨رگ",
-       "addedwatchtext": "بلگه «[[:$1]]» د [[Special:Watchlist|نومگه دماگردی]] شما اضاف بی.\nآلشتیا ای بلگه بلگه چک چنه ری وه ریش د نهاتر د ایچه نومگه کاری بوئه.",
+       "watchnologin": "ھأنی نیوٙماە ڤامین",
+       "addwatch": "ئضاÙ\81 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¯ Ø³Ø¦Û\8cÙ\84 Ø¨Ø£رگ",
+       "addedwatchtext": "بألگە «[[:$1]]» د [[Special:Watchlist|سئیل بأرگ]] شوما ئضاف بی.\nآلئشتیا ئی بألگە د بألگە چأک چئنە ری ڤئ ریشت د نئھاتئر د ئیچئ نومگە کاری با.",
        "addedwatchtext-short": "بلگه \"$1\" وه سیل برگ شما اضاف بیه.",
-       "removewatch": "جا وه جا کردن د سیل برگ",
-       "removedwatchtext": "بلگه\"[[:$1]]\" د [[Special:سیل برگ|سیل برگ خوتو]] جا وه جا بیه.",
+       "removewatch": "جا ڤئ جا کئردئن د سئیل بأرگ",
+       "removedwatchtext": "بألگە \"[[:$1]]\" د [[Special:سئیل بأرگ|سئیل بأرگ خوتوٙ]] جا ڤئ جا بییە.",
        "removedwatchtext-short": "بلگه \"$1\" د سیل برگ جا وه جا بیه.",
-       "watch": "سيل كردن",
-       "watchthispage": "ديئن ای بلگه",
-       "unwatch": "ديه نبيه",
-       "unwatchthispage": "Ù\88اداشتÙ\86 دیئن",
-       "notanarticle": "مینونه هیچ بلگه ای نئ",
+       "watch": "سئیل کئردئن",
+       "watchthispage": "دیئن ئی بألگە",
+       "unwatch": "دیە نأبییە",
+       "unwatchthispage": "Ù\86ئھاگئرÛ\8c دیئن",
+       "notanarticle": "ھیچ بألگە مینوٙنە داری نی",
        "notvisiblerev": "آخری وانئری که د دس یه کاریار هنی انجوم بیه پاکسا بیه.",
        "watchlist-details": "{{PLURAL:$1|$1 بلگه|$1 بلگیا}} د سیل برگتو هیش بلگه قسه کردن نی.",
-       "wlheader-enotif": "وارسیاری ایمیل فعال بیه.",
+       "wlheader-enotif": "ڤارئسیاری أنجومانامە کونئشتکار بییە.",
        "wlheader-showupdated": "بلگه یایی که د آخرین کرتی که شما دشو دیئن کردیته آلشت بینه د <strong>توپر</strong>نشون دئه بینه",
        "wlnote": "د هار {{PLURAL:$1|آلشت|<strong>$1</strong> آلشتی}} که د {{PLURAL:$2|ساعت|<strong>$2</strong> ساعت}} دماتر انجوم بیه هیئش، ویرگار آخرین واجوری انجام شده موجود است، ویرگار آخری واجوری: $3، $4",
        "wlshowlast": "آخرین$1 ساعتیا $2و روزیا  نشو بیئه",
-       "watchlist-options": "گزینیا سیل برگ",
-       "watching": "د حال دیئن...",
+       "watchlistall2": "ھأمە",
+       "wlshowtime": "نئشوٙ دأئن د آخأر",
+       "wlshowhideminor": "ڤیرایئشتیا فئرە کوچئک",
+       "wlshowhidebots": "بوتیا",
+       "wlshowhideliu": "کاریاریا ثأڤتئ نام کئردە",
+       "wlshowhideanons": "کاریار نادیار",
+       "wlshowhidepatr": "تیە پایی د ڤیرایئشتیا",
+       "wlshowhidemine": "ڤیرایئشتیا مئ",
+       "watchlist-options": "چیا سئیل بأرگ",
+       "watching": "د حال و بال دیئن...",
        "unwatching": "د حال ندیئن...",
        "watcherrortext": "یه گل اشگال د گات آلشت کردن میزونکاری نومگه سیل برگتو سی «$1» پیش اوما.",
        "enotif_reset": "همه بلگه یا دیئه بینه نشودار بکید",
        "enotif_body_intro_changed": "{{SITENAME}} بلگه $1 د ویرگار $PAGEEDITDATE وه دس {{gender:$2|$2}} آلشت بیه، سی وانئری ایسنی سیل $3 بکیت.",
        "enotif_lastvisited": "همه آلشتیا$1 د اوسه که شما د آخرین بار دیئته بوینیت.",
        "enotif_lastdiff": "سی دیئن ای آلشتیا $1 نه سیل بکیت.",
-       "enotif_anon_editor": "کارو ناشناس$1",
+       "enotif_anon_editor": "کاریار نادیار $1",
        "enotif_body": "$WATCHINGUSERNAME نازار،\n\n$PAGEINTRO $NEWPAGE\n\n\nتوضیح ویراشتکار: $PAGESUMMARY $PAGEMINOREDIT\n\nپیوند گرتن وا ویراشتکار:\nنومه: $PAGEEDITOR_EMAIL\nویکی: $PAGEEDITOR_WIKI\n\nتا گاتی که سر نه دئیته وه بلگه، د حال و بار پیش اومائن ائتمالی کنشتیاری بیشتر، تا گاتی که وا نوم کاریاریتو هایت د سامونه، گوته دیاری سی شما کل نبوئه.\nشما همچنی می تونید د بلگه دماگریا خوتو بیرقیا مربوط وه وارسکاری نه صفر بکیت همچنی می تونیت بیرقیا وارسکاری نه د نو نشوکاری بکیت.\n\nدوسیار شما، سامونه وارسکاری {{SITENAME}}\n\n--\nسی آلشت دئن میزونکاریا نومگه انجومانامه یا گوته دیاری روئیت وه {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nسی آلشت دئن میزونکاری نومگه دماگریاتو روئیت وه {{canonicalurl:{{#special:EditWatchlist}}}}.\n\nسی پاکساکاری بلگه د نومگه دماگریاتو روئیت د $UNWATCHURL.\n\nبازحرد و هومیاری بیشتر:\n$HELPPAGE",
        "created": "دروس بیه",
        "changed": "آلشت بیه",
-       "deletepage": "پاک کردن بلگه",
-       "confirm": "Ù\85ئÙ\83Ù\85 Ù\83ردن",
-       "excontent": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 :\"$1\" بی",
-       "excontentauthor": "Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø¨Ù\84Ú¯Ù\87 Û\8cÙ\87 Ø¨Û\8c: Â«$1» (Ù\88 ØªØ¦Ù\86ا Ù\87Ù\88Ù\85Û\8cار«[[Special:Contributions/$2|$2]]» بی)",
+       "deletepage": "پاکسا کئردئن بألگە",
+       "confirm": "Ù¾Ù\88شت Ø±Ø§Ø³ Ú©Ø§Ø±Û\8c Ú©Ø¦Ø±Ø¯Ø¦ن",
+       "excontent": "Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 :\"$1\" بی",
+       "excontentauthor": "Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¨Ø£Ù\84Ú¯Û\95 Û\8cÛ\95 Ø¨Û\8c: Â«$1» (Ù\88 ØªØ¦Ù\86Û\8cا Ú¾Ù\88Ù\85Û\8cار «[[Special:Contributions/$2|$2]]» بی)",
        "exbeforeblank": "مینونه حالی دمایی:\"$1\" بی",
-       "delete-confirm": "پاکسا Ú©Ø±Ø¯Ù\86\"$1\"",
-       "delete-legend": "پاك كردن",
+       "delete-confirm": "پاکسا Ú©Ø¦Ø±Ø¯Ø¦Ù\86 \"$1\"",
+       "delete-legend": "پاکسا کئردئن",
        "historywarning": "<strong>هشدار:</strong> بلگه یی که شما میهایت پاکساش بکیت دش یه گل ویرگارچه واگرد $1 {{PLURAL:$1|وانئری|وانئریا}} ئه:",
        "confirmdeletetext": "شما د حال و بار پاکسا کردن یه گل بلگه یا عسگ د رسینه جا واگرد همه ویرگارچه ونیت.\nلطف بکیت ای کنشتکاری نه پشت راسکاری بکیت و یه دل بوئیت که سرانجوم ای کار نه دونیت و ای کار نه مطابق وا [[{{MediaWiki:Policy-url}}|سیاستیا]] انجوم دئیته.",
        "actioncomplete": "عملكرد كامل بيه",
        "dellogpagetext": "نومگه هاری یه گل نومگه د آخری چیا پاکسا بیه هئ.",
        "deletionlog": "پهرستنومه پاک بیئن",
        "reverted": "لرسه د نزیکترین وانئری",
-       "deletecomment": "دليل:",
-       "deleteotherreason": "دليليا هنی:",
-       "deletereasonotherlist": "دلیل هنی",
+       "deletecomment": "دألیل:",
+       "deleteotherreason": "دألیلیا/ئضافی ھأنی:",
+       "deletereasonotherlist": "دألیل ھأنی",
        "deletereason-dropdown": "* دلیلیا پاکسا کردن رسم بیه\n** اسپم\n** خراوکاری\n** رعایت نبین کپی رایت\n** درحاست نیسنه\n** نهاورگشت شکست حرده",
        "delete-edit-reasonlist": "دلیلیا پاکسا کردنه نه ویرایشت بکید",
-       "delete-toobig": "اÛ\8c Ø¨Ù\84Ú¯Ù\87 Ù\88Û\8cرگارÚ\86Ù\87 Ù\88Û\8cراÛ\8cشت Ù\81رÙ\87 Ú¯Ù¾Û\8c Ø¯Ø§Ø±Ù\87Ø\8c Ú©Ù\87 Ø¯ Ù\88ر Ú¯Ø±ØªÙ\87 Ø¨Û\8cشتر Ø¯ Û\8cÙ\87 Ú¯Ù\84 Ø¯ $1 {{PLURAL:$1|Ù\86سÙ\82Ù\87\86سÙ\82Ù\87}} Ø¦Ù\87.\nسÛ\8c Û\8cÙ\87 Ú©Ù\87 Ø¯ Ø§Ø®ØªÙ\84اÙ\84 Ù\86احاستÙ\86Û\8c Ø¯ {{SITENAME}} Ù\86Ù\87اگرÛ\8c Ø¨Ø§ Ù¾Ø§Ú©Ø³Ø§ Ú©Ø±Ø¯Ù\86 Ø§Û\8c Ø¬Ù\88راÛ\8cÙ\86 Ø¨Ù\84Ú¯Ù\87 Û\8cا Ù\85حدÙ\88د Ø¨Û\8cÙ\87.c",
+       "delete-toobig": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ú¤Û\8cرگارÚ\86Û\95 Ú¤Û\8cراÛ\8cئشت Ù\81ئرÛ\95 Ú¯Ø£Ù¾Û\8c Ø¯Ø§Ø±Û\95Ø\8c Ú©Ø¦ Ø¯ Ú¤Ø£Ø± Ú¯Ø¦Ø±Ø¦ØªÛ\95 Ø¨Û\8cشتئر Ø¯ Û\8cئ Ú¯Ø¦Ù\84 Ø¯ $1 {{PLURAL:$1|Ù\86سÙ\82Ù\87\86سÙ\82Ù\87}} Ø£.\nسÛ\8c Û\8cÛ\95 Ú©Ø¦ Ø¯ Ù\86اÙ\85Û\8cزÙ\88Ù\99کارÛ\8c Ù\86احاستÛ\95 Ø¯ {{SITENAME}} Ù\86ئھاگئرÛ\8c Ø¨Ø§ Ù¾Ø§Ú©Ø³Ø§ Ú©Ø§Ø±Û\8c Ø¦Û\8c Ø¬Ù\88Ù\99ر Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ù\85أدÙ\88Ù\99د Ø¨Û\8cÛ\8cÛ\95.",
        "delete-warning-toobig": "{{PLURAL:$1|}}ای بلگه ویرگارچه ویرایشتی گپی داره، که د ور گرته بیشتر د $1 {{PLURAL:$1|نسقه|نسقه}} ئه.\nپاکسا کردن وه ممکنه که کنشتکاری رسینه جا {{SITENAME}} نه مختل بکه؛\nای کار نه وا آهره کاری نهاداری بکیت.",
        "deleteprotected": "شما نمی تونیت ای بلگه نه پاکسا بکیت سی یه که وه پر و پیم بیه.",
        "deleting-backlinks-warning": "''' هشدار:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|بلگه یا هنی]] ین که وه بلگه یی که شما د حال و بار پاکسا کردن ونیت پیوند دارن یا د وه پرگنجایشت کاری بیینه.",
        "rollback-success": "ویرایشتیا $1 پاکساگری بی؛\nبلگه وه آخری ویرایشت $2 آلشت بیه.",
        "sessionfailure-title": "شکست حردن نشینگه",
        "sessionfailure": "چنی وه نظری میا که مشکلی ها د نشتجا کاریاری شما؛\nانجومگر حاستنی سی یه که د دزیه بیین دونسمنیاتو د نشسجا کاریاری نهاگری با انجومشیو بیه.\nلطف بکیت د ری دگمه ؤرئشتن بپورنیت و بلگه یی که رسسینه دش د نو واحونی بکیت، اوسه دنو تلاش بکیت.",
-       "protectlogpage": "پر و پیم کاری کردن",
-       "protectlogtext": "د هار یه گل نومگه د آلشتیا ریتراز پر و پیم کاری بلگه یا اومائه.\n[[Special:ProtectedPages|نومگه بلگه یا پر و پیم کار بیه]] نه سی دیئن نومگه پر و پیم کاری کارگرا بلگه یا سیل بکیت.",
-       "protectedarticle": "حفاظت بيه [[$1]]",
+       "changecontentmodel": "آلئشتکاری حال و بال مینوٙنە بألگە",
+       "changecontentmodel-legend": "آلئشتکاری حال و بال مینوٙنە",
+       "changecontentmodel-title-label": "داسوٙن بألگە",
+       "changecontentmodel-model-label": "یئ گئل حال و بال تازە مینوٙنە",
+       "changecontentmodel-reason-label": "دألیل:",
+       "changecontentmodel-success-title": "حال و بال مینوٙنە آلئشتکاری بی",
+       "logentry-contentmodel-change-revertlink": "لئرنیئن",
+       "logentry-contentmodel-change-revert": "لئرنیئن",
+       "protectlogpage": "پأر و پیم کاری پئرئستنوٙمە",
+       "protectlogtext": "د ھار یئ گئل نومگە د آلئشتیا ریتئراز پأر و پیم کاری بألگە یا ئوٙماە.\n[[Special:ProtectedPages|نومگە بألگە یا پأر و پیم کاری بییە]] نە سی دیئن نومگە پأر و پیم کاری کارگئرا بألگە یا نە سئیل بأکیت.",
+       "protectedarticle": "پأر و پیم کاری بییە [[$1]]",
        "modifiedarticleprotection": "ریتراز حفاظت د \"[[$1]]\" آلشت بیه",
        "unprotectedarticle": "بلگه«[[$1]]» نه د پر و پیم دراورد",
        "movedarticleprotection": "میزونکاری پر و پیم بیین د «[[$2]]» وه «[[$1]]» جا وه جا بیه",
        "protect-norestrictiontypes-text": "امکان پر و پیم کردن ای بلگه سی یه که نوع محدودیتی ناره، وجود ناره.",
        "protect-norestrictiontypes-title": "بلگه بی حامین گر",
        "protect-legend": "پشت راس کردن حامین گری",
-       "protectcomment": "دلیل:",
+       "protectcomment": "دألیل:",
        "protectexpiry": "تموم بين:",
        "protect_expiry_invalid": "گات تموم بیین نامعتوره.",
        "protect_expiry_old": "گات تموم بیین مال دماتره.",
        "protect-locked-dblock": "سی یه که رسینه جا قلف بیه، امکان آلشت دئن ریتراز پر و پیم کاری بلگه یا د ایسه نئ.\nمیزونکاری ایسنی بلگه '''$1''' ها دی ای قرار:",
        "protect-locked-access": "حساو کاریاری شما سی آلشتکاری ریتراز پر و پیم کاری صلاداری ناره.\nمیزونکاریا ایسنی بلگه '''$1''' ها دی ای قرار:",
        "protect-cascadeon": "ای بلگه ایسنی پر و پیم کاری بیه، سی یه که د {{PLURAL:$1|بلگه|بلگه یا}} هاری که گزینه پر و پیم کاری تاف نمایی {{PLURAL:$1|وه|ونو}} کنشتکاره، اومائه.\nآلشتیایی که مال ریتراز ای بلگه ن ری پر و پیم کاری تاف نمایی کارگرایی نارن.",
-       "protect-default": "همه کاروریا اجازه دارن",
+       "protect-default": "ھأمە کاریاریا صئلا دارئن",
        "protect-fallback": "فقط کاریاریایی که وه «$1» دسرسی دارن، صلادار ای کارن",
-       "protect-level-autoconfirmed": "فقط کاریاریا که خودپشت راس بینه صلادارن",
-       "protect-level-sysop": "فقط دیوونداریا",
+       "protect-level-autoconfirmed": "فأقأط کاریاریا خود پوشت راس کاری بییە صئلا دارئن",
+       "protect-level-sysop": "فأقأط سأردیڤوٙنکاریا",
        "protect-summary-desc": "[$1=$2] ($3)",
-       "protect-summary-cascade": "د حال و بال تافنمایی",
-       "protect-expiring": "گات تموم بیین $1 (یو تی سی)",
-       "protect-expiring-local": "گات تموم بیین $1",
-       "protect-expiry-indefinite": "بی زمون",
+       "protect-summary-cascade": "د حال و بال تافنئمایی",
+       "protect-expiring": "گات تأموٙم بییئن $1 (یو تی سی)",
+       "protect-expiring-local": "گات تأموم بییئن $1",
+       "protect-expiry-indefinite": "بی گات",
        "protect-cascade": "پر و پیم بیین تافنمایی- همه بلگه یایی که هان د ای بلگه پر و پیم بوئن.",
        "protect-cantedit": "شما نمی تونیت حال و بار پر و پیم کاری ای بلگه نه آلشت بئیت، سی یه که صلا ویرایشت دئن ونه ناریت.",
-       "protect-othertime": "وخت هنی:",
-       "protect-othertime-op": "گات هنی",
-       "protect-existing-expiry": "گات تموم بیین ایسنی: $2، $3",
-       "protect-existing-expiry-infinity": "گات تموم بیین: بی گاته",
-       "protect-otherreason": "دلیل اضافی/هنی:",
-       "protect-otherreason-op": "دلیل هنی",
+       "protect-othertime": "گات ھأنی:",
+       "protect-othertime-op": "گات ھأنی",
+       "protect-existing-expiry": "گات تأموم بییئن ئیسئنی: $2، $3",
+       "protect-existing-expiry-infinity": "گات تأموم بییئن: بی گاتە",
+       "protect-otherreason": "دألیل ئضافی/ھأنی:",
+       "protect-otherreason-op": "دألیل ھأنی",
        "protect-dropdown": "*دلیلیا جاافتائه سی پر و پیم کاری\n** خراوکاری گپ کلون\n** هرزه نیسی گپ کلون\n** جئن ویرایشتی وه درد نحور\n** بلگه فره تماشاکار دار",
        "protect-edit-reasonlist": "دلیلا پر و پیم بیین ویرایشت",
        "protect-expiry-options": "1 ساعت:1 ساعت,1 روز:1 روز,1 هفته:1 هفته,2 هفته:2 هفته,1 ما:1 ما,3 ما:3 ما,6 ما:6 ما,1 سال:1 سال,بی حساو:بی حساو",
        "undeletelink": "بوين/دوواره آماده با",
        "undeleteviewlink": "ديئن",
        "undeleteinvert": "انتخاو برعسك بوئه",
-       "undeletecomment": "دليل:",
+       "undeletecomment": "دألیل:",
        "undeletedrevisions": "وانئری$1 د نو زنه{{PLURAL:$1|بی}}",
        "undeletedrevisions-files": "{{PLURAL:$1|1 وانئری|$1 وانئریا}} و{{PLURAL:$2|1 جانیا|$2 جانیا}} د نو زئنه بینه.",
        "undeletedfiles": "{{PLURAL:$1|1 جانیا|$1 جانیایا}} د نو زنه بیه",
        "undelete-search-title": "بلگه یا پاکسا بیه نه پی جوری کو",
        "undelete-search-box": "پی جوری بلگه یا پاکسا بیه",
        "undelete-search-prefix": "بلگه یایی که وا شرو بیه نشو بیه:",
-       "undelete-search-submit": "پی جوری",
+       "undelete-search-submit": "پئی جوٙری",
        "undelete-no-results": "هیچ بلگه یکی بیینی د مال دیارکن پاکسا بیه یا نئ.",
        "undelete-filename-mismatch": "نبوئه نسقه $1 نه د نو زنه بکی: نوم جانیا واش یکی نئ.",
        "undelete-bad-store-key": "نبوئه نسقه $1 نه د نو زنه بکی: جانیا وه دما د پاکسا کردن د بین رئته.",
        "undelete-error-short": "خطا پاک نبیئن جانیا:$1",
        "undelete-error-long": "د گات زنه کردن جانیا یه گل خطا پیش اوما:\n\n\n$1",
        "undelete-show-file-confirm": "آیا یه دل بئیته که میهایت یه گل نسقه پاکسا بیه د جانیا \"<nowiki>$1</nowiki>\" که ها د ویرگار $2 ساعت $3 نه سیل بکیت؟",
-       "undelete-show-file-submit": "هری",
+       "undelete-show-file-submit": "Ù\87أرÛ\8c",
        "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
        "namespace": "نوم جا:",
        "invert": "انتخاو برعسك بوئه",
        "tooltip-whatlinkshere-invert": "ای جعون نه سی نهو کردن هوم پیوند بلگه یایی که نوم جاشو انتخاو بیه، انتخاو بکیت.",
        "namespace_association": "نوم جایا یکاگرته",
        "tooltip-namespace_association": "ای جعوه نه وارسی بکیت ای جعوه د ور گرته چک چنه یا داسون نوم ورگه شریکی و نوم ورگه انتخاو بیه ئه",
-       "blanknamespace": "اصلی",
+       "blanknamespace": "Ø£صلی",
        "contributions": "{{GENDER:$1|کاریار}} هومیاریا",
-       "contributions-title": "هومياري كارور سي $1",
+       "contributions-title": "ھومیاری كاریار سی $1",
        "mycontris": "هومياریا",
        "contribsub2": "سي {{جنسيت:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "کاریار \"$1\" ثوت نام نکرده.",
        "sp-contributions-deleted": "هومیاریا پاکسا بیه کاریار",
        "sp-contributions-uploads": "سواركرديا",
        "sp-contributions-logs": "نیسنن رخ ونیا",
-       "sp-contributions-talk": "چك چنه",
+       "sp-contributions-talk": "چأک چئنە",
        "sp-contributions-userrights": "دیوونداری حقوق کاریار",
        "sp-contributions-blocked-notice": "د دسرسی ای کاریا د ایسنی نهاگری بیه.\nآخری برشت د پهرستنومه نهاگری ها د سرچشمه هاری:",
        "sp-contributions-blocked-notice-anon": "ای آی پی ایسنی دسرسی ناره.\nآخری برشت د پهرستنومه ها د سرچشمه هاری:",
        "sp-contributions-username": "نوم نشون آی پی يا نوم كاروری:",
        "sp-contributions-toponly": "فقط ویرایشتیایی که جزئه آخرین دوواره دیئن هئین نشو بیه",
        "sp-contributions-newonly": "فقط ویرایشتیایی که مال دروس کردن بلگه هیئن نشو بیه.",
-       "sp-contributions-submit": "پی جوری",
+       "sp-contributions-submit": "پئی جوٙری",
        "whatlinkshere": "كؤم هوم پیوندیا هان ايچه",
        "whatlinkshere-title": "بلگه ای که د $1 هوم پیوند بیه",
-       "whatlinkshere-page": "بلگه",
+       "whatlinkshere-page": "بألگە",
        "linkshere": "بلگیا نهایی د '''[[:$1]]''' هوم پیوند بیه",
        "nolinkshere": "هیژ بگله ای د  '''[[:$1]]''' هوم پیوند نبیه",
        "nolinkshere-ns": "هیچ بلگه ای د نومجا انتخاو بیه وه'''[[:$1]]''' هوم پیوند ناره.",
        "movenosubpage": "ای بلگه زیر بلگه نئ.",
        "movereason": "دلیل:",
        "revertmove": "لرستن",
-       "delete_and_move": "پاکسا و جا وه جا بوئه",
        "delete_and_move_text": "== پاکساکاری میها ==\n\nگوتار ها د مقصد «[[:$1]]» . آیا میهایت ونه پاکسا بکیت  تا جا وه جاکاری دروس بوئه؟",
        "delete_and_move_confirm": "هری بلگه نه پاکسا کو",
        "delete_and_move_reason": "پاکساکاری سی ممکن بیین جا وه جایی «[[$1]]»",
        "duration-days": "$1{{PLURAL:$1|روز|روزیا}}",
        "duration-weeks": "$1 {{PLURAL:$1|هفته|هفته یا}}",
        "duration-years": "$1{{PLURAL:$1| سال|سالیا}}",
-       "duration-decades": "$1 {{PLURAL:$1|دهه|دهه یا}}",
+       "duration-decades": "$1 {{PLURAL:$1|دأھە|دأھە یا}}",
        "duration-centuries": "$1 {{PLURAL:$1|سده|سده یا}}",
        "duration-millennia": "$1 {{PLURAL:$1|میلینیوم|ملینا}}",
        "rotate-comment": "عسگ وا $1 {{PLURAL:$1|گرینج|گرینج}} ساعت گرد در حرده",
index c384743..2677bbf 100644 (file)
        "february": "vasario",
        "march": "kovo",
        "april": "balandžio",
-       "may_long": "Gegužė",
+       "may_long": "gegužės",
        "june": "birželio",
        "july": "liepos",
        "august": "rugpjūčio",
        "morenotlisted": "Šis sąrašas nėra išsamus.",
        "mypage": "Puslapis",
        "mytalk": "Aptarimas",
-       "anontalk": "Šio IP aptarimas",
+       "anontalk": "Aptarimas",
        "navigation": "Naršymas",
        "and": "&#32;ir",
        "qbfind": "Paieška",
        "helppage-top-gethelp": "Pagalba",
        "mainpage": "Pagrindinis puslapis",
        "mainpage-description": "Pagrindinis puslapis",
-       "policy-url": "Projektas:Politika",
+       "policy-url": "Project:Politika",
        "portal": "Bendruomenė",
        "portal-url": "Project:Community portal",
        "privacy": "Privatumo politika",
        "missingarticle-rev": "(versija#: $1)",
        "missingarticle-diff": "(Skirt.: $1, $2)",
        "readonly_lag": "Duomenų bazė buvo automatiškai užrakinta, kol pagalbinės duomenų bazės prisivys pagrindinę",
+       "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' HTTP antraštė buvo išsiųsta, bet užklausa buvo API įrašymo moduliui.",
        "internalerror": "Vidinė klaida",
        "internalerror_info": "Vidinė klaida: $1",
        "internalerror-fatal-exception": " \"$1\" tipo lemiama išimtis",
        "createaccountreason": "Priežastis:",
        "createacct-reason": "Priežastis",
        "createacct-reason-ph": "Kodėl kuriate kitą paskyrą",
-       "createacct-captcha": "Saugumo patikrinimas",
-       "createacct-imgcaptcha-ph": "Įveskite tekstą, kurį matote aukščiau",
        "createacct-submit": "Sukurkite savo paskyrą",
        "createacct-another-submit": "Sukurti paskyrą",
        "createacct-benefit-heading": "{{SITENAME}} sukurtas žmonių kaip jūs.",
        "passwordreset-emailtext-ip": "Kažkas (tikriausiai jūs, IP adresu $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu:\n\n$2\n\n{{PLURAL:$3|Šis laikinas slaptažodis |Šie laikini slaptažodžiai}} baigs galiot po {{PLURAL:$5|vienos dienos|$5 dienų}}. \n\nJūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas kitas padarė šį prašymą arba jūs prisiminėte savo pirminį slaptažodį, ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailtext-user": "Naudotojas $1 svetainėje {{SITENAME}} sukūrė užklausą slaptažodžio priminimui svetainėje {{SITENAME}}\n($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} susieto su šiuo elektroniniu paštu $2. \n\n{{PLURAL:$3|Šis laikinas slaptažodis|Šie laikini slaptažodžiai}} baigs galioti po {{PLURAL:$5|vienos dienos|$5 dienų}}. Jūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei kažkas padarė tai be jūsų žinios arba jūs prisiminėte savo pirminį slaptažodį, ir jūs nebenorite jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailelement": "Naudotojo vardas: \n$1\n\nLaikinas slaptažodis: \n$2",
-       "passwordreset-emailsent": "Jeigu tai yra jūsų paskyros registruotas el. pašto adresas, tada slaptažodžio atkūrimo laiškas bus išsiųstas.",
+       "passwordreset-emailsentemail": "Jeigu tai yra jūsų paskyros registruotas el. pašto adresas, tada slaptažodžio atkūrimo laiškas bus išsiųstas.",
        "passwordreset-emailsent-capture": "Slaptažodžio priminimo laiškas bus išsiųstas, toks koks parodytas.",
        "passwordreset-emailerror-capture": "Priminimo elektroninis laiškas buvo sukurtas, toks, koks parodytas žemiau, bet pasiuntimas naudotojui buvo nesėkmingas: $1",
        "changeemail": "Pakeisti ar pašalinti el. pašto adresą",
        "missingsummary": "'''Priminimas:''' Jūs nenurodėte keitimo komentaro. Jei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus išsaugotas be jo.",
        "selfredirect": "<strong>Dėmesio:</strong> Jūs nukreipiate puslapį atgal į jį patį. Galbūt parinkote netinkamą nukreipimo kreipinį arba taisote ne tą straipsnį. \nJei vėl paspausite \"{{int:savearticle}}\", šis nukreipimas vis vien bus sukurtas.",
        "missingcommenttext": "Prašome įvesti komentarą.",
-       "missingcommentheader": "'''Priminimas:''' Jūs nenurodėte šio komentaro pavadinimo/antraštės.\nJei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus įrašytas be jo.",
+       "missingcommentheader": "<strong>Priminimas:</strong> Jūs nenurodėte šio komentaro antraštės.\nJei vėl paspausite „{{int:savearticle}}“, jūsų keitimas bus įrašytas be jo.",
        "summary-preview": "Komentaro peržiūra:",
        "subject-preview": "Temos peržiūra:",
        "previewerrortext": "Įvyko klaida bandant peržiūrėti jūsų pakeitimus.",
        "permissionserrors": "Teisių klaida",
        "permissionserrorstext": "Jūs neturite teisių tai daryti dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
        "permissionserrorstext-withaction": "Jūs neturite leidimo $2 dėl {{PLURAL:$1|šios priežasties|šių priežasčių}}:",
+       "contentmodelediterror": "Jūs negalite redaguoti šios versijos, nes jos turinio modelis yra <code>$1</code> ir dabartinis puslapio turinio modelis yra <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Dėmesio: Jūs atkuriate puslapį, kuris anksčiau buvo ištrintas.'''\n\nTurėtumėte nuspręsti, ar reikėtų toliau redaguoti šį puslapį.\nJūsų patogumui čia pateikiamas šio puslapio šalinimų ir perkėlimų sąrašas:",
        "moveddeleted-notice": "Šis puslapis buvo ištrintas.\nŽemiau pateikiamas puslapio šalinimų ir pervadinimų sąrašas.",
        "moveddeleted-notice-recent": "Atsiprašome, šis puslapis nesenai buvo ištrintas (per pastarąsias 24 valandas). Puslapio ištrynimo ir perkėlimo istorija yra pateikiama žemiau kaip nuoroda.",
        "showingresultsinrange": "Žemiau rodoma iki {{PLURAL:$1|<strong>1</strong> gavinio|<strong>$1</strong> gavinių}} imtyje nuo <strong>$2</strong> iki <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Davinys <strong>$1</strong> iš <strong>$3</strong>|Daviniai <strong>$1 - $2</strong> iš <strong>$3</strong>}}",
        "search-nonefound": "Nėra rezultatų, atitinkančių užklausą.",
+       "search-nonefound-thiswiki": "Nėra rezultatų atitinkančių užklausą šiame tinklapyje.",
        "powersearch-legend": "Išplėstinė paieška",
        "powersearch-ns": "Ieškoti vardų srityse:",
        "powersearch-togglelabel": "Pažymėti:",
        "prefs-help-prefershttps": "Šis nustatymas suveiks kitą kartą prisijungiant.",
        "prefswarning-warning": "Jūs atlikote savo nustatymų pakeitimus, kurie dar nebuvo išsaugoti.\nJei paliksite puslapį nepaspaudę \"$1\", jūsų nustatymai nebus atnaujinti.",
        "prefs-tabs-navigation-hint": "Patarimas: galite naudoti kairės ir dešinės rodyklių ženkliukus, kad skirtukų sąraše judėtumėte tarp skirtukų.",
-       "email-address-validity-valid": "Panašu, kad E-pašto adresas yra teisingas",
-       "email-address-validity-invalid": "Įveskite korektišką e-pašto adresą",
        "userrights": "Naudotojų teisių valdymas",
        "userrights-lookup-user": "Tvarkyti naudotojo grupes",
        "userrights-user-editname": "Įveskite naudotojo vardą:",
        "group-bot": "Robotai",
        "group-sysop": "Administratoriai",
        "group-bureaucrat": "Biurokratai",
-       "group-suppress": "Peržiūrėtojai",
+       "group-suppress": "Slopintojai",
        "group-all": "(visi)",
        "group-user-member": "{{GENDER:$1|naudotojas|naudotoja}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatiškai patvirtintas naudotojas|automatiškai patvirtinta naudotoja}}",
        "group-bot-member": "Botas",
        "group-sysop-member": "Administratorius",
        "group-bureaucrat-member": "Biurokratas",
-       "group-suppress-member": "Peržiūrėtojas",
+       "group-suppress-member": "{{GENDER:$1|slopintojas|slopintoja}}",
        "grouppage-user": "{{ns:project}}:Naudotojai",
        "grouppage-autoconfirmed": "{{ns:project}}:Automatiškai patvirtinti naudotojai",
        "grouppage-bot": "{{ns:project}}:Robotai",
        "recentchanges-label-plusminus": "Šiuo baitų skaičiumi pakeista puslapio apimtis",
        "recentchanges-legend-heading": "'''Paaiškinimai:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taip pat žiūrėkite [[Special:NewPages|naujausių straipsnių sąrašą]])",
+       "recentchanges-submit": "Rodyti",
        "rcnotefrom": "Žemiau yra {{PLURAL:$5|pakeitimas|pakeitimai}} pradedant <strong>$3, $4</strong> (rodoma iki <strong>$1</strong> pakeitimų).",
        "rclistfrom": "Rodyti naujus pakeitimus pradedant $3 $2",
        "rcshowhideminor": "$1 smulkius keitimus",
        "upload-options": "Įkėlimo nustatymai",
        "watchthisupload": "Stebėti šią rinkmeną",
        "filewasdeleted": "Failas šiuo vardu anksčiau buvo įkeltas, o paskui ištrintas. Jums reikėtų patikrinti $1 prieš bandant įkelti jį vėl.",
+       "filename-thumb-name": "Tai panašu į miniatiūros pavadinimą. Prašome neįkėlinėti miniatiūrų atgal į tą patį vikį. Kitu atveju, prašome pataisyti failo pavadinimą taip, kad jis būtų prasmingesnis ir neturėtų miniatiūros prefikso.",
        "filename-bad-prefix": "Jūsų įkeliamas failas prasideda su '''„$1“''', bet tai yra neapibūdinantis pavadinimas, dažniausiai priskirtas skaitmeninių kamerų. Prašome suteikti labiau apibūdinantį pavadinimą savo failui.",
        "upload-success-subj": "Įkelta sėkmingai",
        "upload-success-msg": "Jūsų įkėlimas iš [$2] buvo sėkmingas. Jį galima rasti čia: [[:{{ns:file}}:$1]]",
        "foreign-structured-upload-form-label-infoform-categories": "Kategorijos",
        "foreign-structured-upload-form-label-infoform-date": "Data",
        "foreign-structured-upload-form-label-own-work-message-local": "Patvirtinu, kad įkeliu šį failą su šiomis naudojimosi sąlygomis ir licencijavimo politika į {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Jeigu Jūs negalite įkelti šio failo su {{SITENAME}}  politika, prašome uždaryti dialogą ir pabandyti kitą metodą.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Jūs taip pat galite norėti išbandyti [[Special:Upload|numatytąjį įkėlimo puslapį]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Aš suprantu, kad įkeliu šį failą į dalinimosi repozitoriją. Aš patvirtinu, kad tai darau laikydamasis jų paslaugų teikimo sąlygų ir licencijavimo politikos.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Jeigu negalite įkelti šio failo su dalinimosi repozitorijos politika, prašome uždaryti šį dialogą ir bandyti kitą metodą.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Jūs taip pat galite norėti išbandyti [[Special:Upload|{{SITENAME}} įkėlimo puslapį]], jeigu šis failas gali būti įkeltas su jų politika.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Aš patvirtinu, kad man priklauso šio failo autorinės teisės ir sutinku neatšaukiamai išleisti šį failą į Wikimedia Commons su [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] licencija, ir aš sutinku su [https://wikimediafoundation.org/wiki/Terms_of_Use paslaugų teikimo sąlygomis].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Jeigu Jums nepriklauso šio failo autorinės teisės arba Jūs norite išleisti jį su kitokia licencija, apsvarstykite naudojimą [https://commons.wikimedia.org/wiki/Special:UploadWizard Commons įkėlimo vedlį].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Jūs taip pat galite norėti išbandyti [[Special:Upload|{{SITENAME}} įkėlimo puslapį]], jeigu šis puslapis leidžia failų įkėlimą pagal jų politiką.",
        "backend-fail-stream": "Negali būti apdorotas failas $1.",
        "backend-fail-backup": "Negali būti išsaugotas failas $1.",
        "backend-fail-notexists": "Failas $1 neegzistuoja.",
        "mostrevisions": "Puslapiai su daugiausiai keitimų",
        "prefixindex": "Visi puslapiai pagal pavadinimo pradžią",
        "prefixindex-namespace": "Visi puslapiai prasidedantys ($1 vardų sritis)",
+       "prefixindex-submit": "Rodyti",
        "prefixindex-strip": "Paslėpti priešdėlį gavinių sąraše",
        "shortpages": "Trumpiausi puslapiai",
        "longpages": "Ilgiausi puslapiai",
        "protectedpages-performer": "Užrakinantis naudotojas",
        "protectedpages-params": "Užrakinimo nuostatos",
        "protectedpages-reason": "Priežastis",
+       "protectedpages-submit": "Rodyti puslapius",
        "protectedpages-unknown-timestamp": "Nežinomas",
        "protectedpages-unknown-performer": "Nežinomas vartotojas",
        "protectedtitles": "Apsaugoti pavadinimai",
        "protectedtitles-summary": "Tai pavadinimų, kuriais uždrausta kurti puslapius, sąrašas. Šiuo metu užrakintų puslapių sąrašą žiūrėkite čia: [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Šiuo metu nėra jokių pavadinimų apsaugotų šiais parametrais.",
+       "protectedtitles-submit": "Rodyti pavadinimus",
        "listusers": "Naudotojų sąrašas",
        "listusers-editsonly": "Rodyti tik keitimus atlikusius naudotojus",
        "listusers-creationsort": "Rodyti pagal paskyros sukūrimo datą",
        "wlheader-showupdated": "Puslapiai pakeisti nuo tada, kai paskutinį kartą apsilankėte juose, yra pažymėti '''pastorintai'''",
        "wlnote": "{{PLURAL:$1|Rodomas '''$1''' paskutinis pakeitimas, atliktas|Rodomi '''$1''' paskutiniai pakeitimai, atlikti|Rodoma '''$1''' paskutinių pakeitimų, atliktų}} per '''$2''' {{PLURAL:$2|paskutinę valandą|paskutines valandas|paskutinių valandų}}, nuo $3 $4.",
        "wlshowlast": "Rodyti paskutinių $1 valandų, $2 dienų",
+       "watchlistall2": "visi",
+       "watchlist-hide": "Slėpti",
+       "watchlist-submit": "Rodyti",
+       "wlshowtime": "Rodyti paskutinį:",
+       "wlshowhideminor": "smulkūs pakeitimai",
+       "wlshowhidebots": "robotai",
+       "wlshowhideliu": "prisiregistravę naudotojai",
+       "wlshowhideanons": "anoniminiai naudotojai",
+       "wlshowhidepatr": "prižiūrėti pakeitimai",
+       "wlshowhidemine": "mano pakeitimai",
        "watchlist-options": "Stebimųjų sąrašo parinktys",
        "watching": "Įtraukiama į stebimųjų sąrašą...",
        "unwatching": "Šalinama iš stebimųjų sąrašo...",
        "contributions": "{{GENDER:$1|Naudotojo}} indėlis",
        "contributions-title": "{{GENDER:$1|Naudotojo|Naudotojos}} $1 indėlis",
        "mycontris": "Įnašai",
+       "anoncontribs": "Įnašai",
        "contribsub2": "Dėl {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Naudotojo paskyra „$1“ neužregistruota.",
        "nocontribs": "Jokie keitimai neatitiko šių kriterijų.",
        "whatlinkshere-hidelinks": "$1 nuorodas",
        "whatlinkshere-hideimages": "$1 failų nuorodos",
        "whatlinkshere-filters": "Filtrai",
+       "whatlinkshere-submit": "Eiti",
        "autoblockid": "Automatinis blokavimas # $1",
        "block": "Blokuoti naudotoją",
        "unblock": "Atblokuoti naudotoją",
        "movenosubpage": "Šis puslapis neturi subpuslapių.",
        "movereason": "Priežastis:",
        "revertmove": "atmesti",
-       "delete_and_move": "Ištrinti ir perkelti",
        "delete_and_move_text": "==Reikia ištrinti==\n\nPaskirties puslapis „[[:$1]]“ jau yra. Ar norite jį ištrinti, kad galėtumėte pervardinti?",
        "delete_and_move_confirm": "Taip, trinti puslapį",
        "delete_and_move_reason": "Ištrinta dėl perkėlimo iš \"[[$1]]\"",
        "tooltip-pt-preferences": "Mano nustatymai",
        "tooltip-pt-watchlist": "Puslapių sąrašas, kuriuos jūs pasirinkote stebėti",
        "tooltip-pt-mycontris": "Jūsų darytų keitimų sąrašas",
+       "tooltip-pt-anoncontribs": "Keitimų sąrašas, padarytų iš šio IP adreso",
        "tooltip-pt-login": "Rekomenduojame prisijungti, nors tai nėra privaloma",
        "tooltip-pt-logout": "Atsijungti",
        "tooltip-pt-createaccount": "Skatiname susikurti paskyrą ir prisijungti, tačiau, tai nėra privaloma",
        "htmlform-cloner-required": "Bent viena reikšmė būtina.",
        "htmlform-title-badnamespace": "[[:$1]] nėra \"{{ns:$2}}\" vardų srityje.",
        "htmlform-title-not-creatable": "\"$1\" nėra tinkamas sukūrimui puslapio pavadinimas",
-       "htmlform-title-not-exists": "[[:$1]] neegzistuoja.",
+       "htmlform-title-not-exists": "$1 neegzistuoja.",
        "htmlform-user-not-exists": "<strong>$1</strong> neegzistuoja.",
        "htmlform-user-not-valid": "<strong>$1</strong> nėra tinkamas naudotojo vardas.",
        "sqlite-has-fts": "$1 su visatekstės paieškos palaikymu",
        "logentry-suppress-block": "$1 {{GENDER:$2|užblokavo}} {{GENDER:$4|$3}}, blokavimo laikas – $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|pakeitė}} {{GENDER:$4|$3}} blokavimo nustatymus, blokavimo laikas – $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importavo}} $3 per failų keltuvą",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importavo}} $3 failo įkėlimo ($4 {{PLURAL:$4|peržiūra|peržiūros}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importavo}} $3 iš kitos viki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importavo}} $3 iš $5 ($4 {{PLURAL:$4|peržiūra|peržiūros}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|sujungė}} $3 į $4 (versijas iki $5)",
        "logentry-move-move": "$1 pervadino puslapį $3 į $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|perkėlė}} puslapį $3 į $4 be nukreipimo",
        "api-error-badtoken": "Vidinė klaida: blogai atpažinimo ženklas.",
        "api-error-copyuploaddisabled": "Siuntimas pagal URL yra išjungtas šiame serveryje.",
        "api-error-duplicate": "Jau {{PLURAL:$1|yra kitas failas|yra kiti failai}} puslapyje su tuo pačiu turiniu.",
-       "api-error-duplicate-archive": "Jau {{PLURAL:$1|buvo kitas failas|buvo kitų failų}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo|buvo}} ištrinti.",
+       "api-error-duplicate-archive": "Jau {{PLURAL:$1|buvo kitas failas|buvo kitų failų}} puslapyje su tuo pačiu turiniu, bet {{PLURAL:$1|buvo ištrintas|buvo ištrinti}}.",
        "api-error-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ą.",
index b00c78c..0b07200 100644 (file)
        "createaccountreason": "Iemesls:",
        "createacct-reason": "Iemesls",
        "createacct-reason-ph": "Kāpēc jūs veidojat citu kontu",
-       "createacct-captcha": "Drošības pārbaude",
-       "createacct-imgcaptcha-ph": "Ievadiet tekstu, kuru jūs redzat augstāk",
        "createacct-submit": "Izveidot savu kontu",
        "createacct-another-submit": "Izveidot citu dalībnieka kontu",
        "createacct-benefit-heading": "{{SITENAME}} darbojas ar tādu cilvēku kā Tu ieguldījumu.",
        "passwordreset-email": "E-pasta adrese:",
        "passwordreset-emailtitle": "Konta informācija {{SITENAME}}",
        "passwordreset-emailelement": "Lietotājvārds: \n$1\n\nPagaidu parole: \n$2",
-       "passwordreset-emailsent": "Paroles atiestatīšanas e-pasts ir nosūtīts.",
+       "passwordreset-emailsentemail": "Paroles atiestatīšanas e-pasts ir nosūtīts.",
        "passwordreset-emailsent-capture": "Atgādinājuma e-pasta ziņojums ir nosūtīts, tas parādīts zemāk.",
        "passwordreset-emailerror-capture": "Atgādinājuma e-pasta ziņojums tika izveidots, tas parādīts zemāk, bet nosūtīšana lietotājam neizdevās: $1",
        "changeemail": "Mainīt e-pasta adresi",
        "sig_tip": "Tavs paraksts ar laika atzīmi",
        "hr_tip": "Horizontāla līnija (neizmanto lieki)",
        "summary": "Kopsavilkums:",
-       "subject": "Tēma/virsraksts:",
+       "subject": "Temats:",
        "minoredit": "Maznozīmīgs labojums",
        "watchthis": "Uzraudzīt šo lapu",
        "savearticle": "Saglabāt lapu",
        "missingcommenttext": "Lūdzu, ievadi tekstu zemāk redzamajā logā!",
        "missingcommentheader": "'''Atgādinājums:''' Tu šim komentāram neesi norādījis virsrakstu/tematu.\nJa tu vēlreiz spiedīsi uz \"{{int:savearticle}}\", tavas izmaiņas tiks saglabātas bez virsraksta.",
        "summary-preview": "Kopsavilkuma pirmskats:",
-       "subject-preview": "Kopsavilkuma/virsraksta pirmskats:",
+       "subject-preview": "Temata pirmskats:",
        "blockedtitle": "Dalībnieks ir bloķēts.",
        "blockedtext": "'''Tavs lietotāja vārds vai IP adrese ir nobloķēta.'''\n\n$1 nobloķēja tavu lietotāja vārdu vai IP adresi.\nBloķējot norādītais iemesls bija: ''$2''.\n\n*Bloka sākums: $8\n*Bloka beigas: $6\n*Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|administratoru]] lai apspriestu šo bloku.\n\nPievērs uzmanību, tam, ka ja tu neesi norādījis derīgu e-pasta adresi ''[[Special:Preferences|savās izvēlēs]]'', tev nedarbosies \"sūtīt e-pastu\" iespēja.\n\nTava IP adrese ir $3 un bloka identifikators ir #$5. Lūdzu iekļauj vienu no tiem, vai abus, visos turpmākajos pieprasījumos.",
        "autoblockedtext": "Tava IP adrese ir tikusi automātiski nobloķēta, tāpēc, ka to (nupat kā) ir lietojis cits lietotājs, kuru nobloķēja $1.\nNorādītais bloķēšanas iemesls bija:\n\n:''$2''\n\n* Bloka sākums: $8\n* Bloka beigas: $6\n* Bija domāts nobloķēt: $7\n\nTu vari sazināties ar $1 vai kādu citu [[{{MediaWiki:Grouppage-sysop}}|adminu]] lai apspriestu šo bloku.\n\nAtceries, ka tu nevari lietot \"sūtīt e-pastu šim lietotājam\" iespēju, ja tu neesi norādījis derīgu e-pasta adresi savās [[Special:Preferences|lietotāja izvelēs]] un bloķējot tev nav aizbloķēta iespēja sūtīt e-pastu.\n\nTava pašreizējā IP adrese ir $3 un  bloka ID ir $5.\nLūdzu iekļauj šos visos ziņojumos, kurus sūti adminiem, apspriežot šo bloku.",
        "prefs-displaywatchlist": "Pamatuzstādījumi",
        "prefs-diffs": "Izmaiņas",
        "prefs-help-prefershttps": "Šie uzstādījumi stāsies spēkā nākamajā pievienošanās reizē.",
-       "email-address-validity-valid": "E-pasta adrese šķiet derīga",
-       "email-address-validity-invalid": "Ievadiet derīgu e-pasta adresi",
        "userrights": "Dalībnieku tiesību pārvaldība",
        "userrights-lookup-user": "Pārvaldīt dalībnieka grupas",
        "userrights-user-editname": "Ievadi lietotājvārdu:",
        "wlheader-enotif": "E-pasta paziņojumi ir ieslēgti.",
        "wlheader-showupdated": "Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
        "wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī .",
+       "watchlistall2": "visas",
        "watchlist-options": "Uzraugāmo rakstu saraksta opcijas",
        "watching": "Uzrauga...",
        "unwatching": "Neuzrauga...",
        "contributions": "{{GENDER:$1|Dalībnieka|Dalībnieces|Dalībnieka}} devums",
        "contributions-title": "Dalībnieka $1 devums",
        "mycontris": "Devums",
+       "anoncontribs": "Devums",
        "contribsub2": "Lietotājs: $1 ($2)",
        "nocontribs": "Netika atrastas izmaiņas, kas atbilstu šiem kritērijiem.",
        "uctop": "(pēdējā izmaiņa)",
        "whatlinkshere-hideimages": "$1 failu saites",
        "whatlinkshere-filters": "Filtri",
        "autoblockid": "Autobloķēšana #$1",
-       "block": "Bloķēt lietotāju",
+       "block": "Bloķēt dalībnieku",
        "unblock": "Atbloķēt lietotāju",
-       "blockip": "Bloķēt {{GENDER:$1|lietotāju}}",
-       "blockip-legend": "Bloķēt lietotāju",
+       "blockip": "Bloķēt {{GENDER:$1|dalībnieku|dalībnieci}}",
+       "blockip-legend": "Bloķēt dalībnieku",
        "blockiptext": "Šo veidni izmanto, lai bloķētu kādas IP adreses vai lietotājvārda piekļuvi wiki lapu saglabāšanai. Dari to tikai, lai novērstu vandālismu atbilstoši [[{{MediaWiki:Policy-url}}|noteikumiem]].\nNorādi konkrētu iemeslu (piemēram, linkus uz vandalizētajām lapām).",
        "ipaddressorusername": "IP adrese vai lietotājvārds",
        "ipbexpiry": "Termiņš",
        "ipbcreateaccount": "Neļaut izveidot lietotājvārdu",
        "ipbemailban": "Neļaut lietotājam sūtīt e-pastu",
        "ipbenableautoblock": "Automātiski bloķēt lietotāja pēdējo IP adresi un jebkuru IP adresi, no kuras šis lietotājs piekļūst šim wiki",
-       "ipbsubmit": "Bloķēt šo lietotāju",
+       "ipbsubmit": "Bloķēt šo dalībnieku",
        "ipbother": "Cits laiks",
        "ipboptions": "2 stundas:2 hours,1 diena:1 day,3 dienas:3 days,1 nedēļa:1 week,2 nedēļas:2 weeks,1 mēnesis:1 month,3 mēneši:3 months,6 mēneši:6 months,1 gads:1 year,uz nenoteiktu laiku:infinite",
        "ipbhidename": "Slēpt lietot'javārdu no labojumiem un sarakstiem",
        "movenosubpage": "Šai lapai nav apakšlapu.",
        "movereason": "Iemesls:",
        "revertmove": "atcelt",
-       "delete_and_move": "Dzēst un pārvietot",
        "delete_and_move_text": "==Nepieciešama dzēšana==\nMērķa lapa \"[[:$1]]\" jau eksistē.\nVai tu to gribi izdzēst, lai atbrīvotu vietu pārvietošanai?",
        "delete_and_move_confirm": "Jā, dzēst lapu",
        "delete_and_move_reason": "Izdzēsts, lai atbrīvotu vietu pārvietošanai no \"[[$1]]\"",
        "tooltip-pt-preferences": "Tavas izvēles",
        "tooltip-pt-watchlist": "Tevis uzraudzītās lapas",
        "tooltip-pt-mycontris": "Tavs devums",
+       "tooltip-pt-anoncontribs": "Labojumi, kas veikti no šīs IP adreses",
        "tooltip-pt-login": "Aicinām tevi ieiet {{grammar:lokatīvs|{{SITENAME}}}}, tomēr tas nav obligāti.",
        "tooltip-pt-logout": "Iziet",
        "tooltip-ca-talk": "Diskusija par šī raksta lapu",
        "tooltip-ca-nstab-main": "Apskatīt rakstu",
        "tooltip-ca-nstab-user": "Apskatīt dalībnieka lapu",
        "tooltip-ca-nstab-media": "Apskatīt multimediju lapu",
-       "tooltip-ca-nstab-special": "Šī ir īpašā lapa, tu nevari izmainīt pašu lapu.",
+       "tooltip-ca-nstab-special": "Šī ir īpašā lapa un to nevar mainīt.",
        "tooltip-ca-nstab-project": "Apskatīt projekta lapu",
        "tooltip-ca-nstab-image": "Apskatīt attēla lapu",
        "tooltip-ca-nstab-mediawiki": "Apskatīt sistēmas paziņojumu",
        "logentry-newusers-create": "Lietotāja konts $1 tika {{GENDER:$2|izveidots}}",
        "logentry-newusers-create2": "$1 {{GENDER:$2|izveidoja}} lietotāja kontu $3",
        "logentry-newusers-autocreate": "Lietotaja konts $1 tika {{GENDER:$2|izveidots}} automātiski",
+       "logentry-upload-upload": "$1 {{GENDER:$2|augšupielādēja}} $3",
        "logentry-upload-overwrite": "$1 augšupielādēja jaunu $3 versiju",
        "rightsnone": "(nav)",
        "revdelete-summary": "izmaiņu kopsavilkums",
index d1e3010..623ab53 100644 (file)
        "nstab-template": "模",
        "nstab-help": "助",
        "nstab-category": "類",
+       "mainpage-nstab": "卷首",
        "nosuchaction": "無可為",
        "nosuchactiontext": "此址也無",
        "nosuchspecialpage": "無此特查",
        "createaccountreason": "因:",
        "createacct-reason": "因:",
        "createacct-reason-ph": "汝另立一簿者何哉?",
-       "createacct-captcha": "安檢",
-       "createacct-imgcaptcha-ph": "輸上方文字",
        "createacct-submit": "增簿",
        "createacct-another-submit": "復立一簿",
        "createacct-benefit-heading": "吾等立{{SITENAME}}者,或黔首,或專戶。",
index 1112215..b5f54d2 100644 (file)
@@ -51,6 +51,7 @@
        "tog-watchlisthidebots": "Скриј ботовски уредувања од набљудуваните",
        "tog-watchlisthideminor": "Скриј ги ситните уредувања во набљудуваните",
        "tog-watchlisthideliu": "Скриј ги уредувањата на најавените корисници во набљудуваните",
+       "tog-watchlistreloadautomatically": "Превчитувај ги набљудувањата автоматски кога ќе се смени филтерот (бара JavaScript)",
        "tog-watchlisthideanons": "Скриј ги уредувањата од анонимни корисници во набљудуваните",
        "tog-watchlisthidepatrolled": "Скриј испатролирани уредувања од мојот список на набљудувања",
        "tog-watchlisthidecategorization": "Сокриј ја категоризацијата на страниците",
        "morenotlisted": "Овој список не е целосен.",
        "mypage": "Страница",
        "mytalk": "разговор",
-       "anontalk": "Разговор за оваа IP-адреса",
+       "anontalk": "Разговор",
        "navigation": "Навигација",
        "and": "&#32;и",
        "qbfind": "Најди",
        "databaseerror-query": "Барање: $1",
        "databaseerror-function": "Функција: $1",
        "databaseerror-error": "Грешка: $1",
+       "transaction-duration-limit-exceeded": "За да се избегне голем заостаток на одговори, трансакцијата е откажана бидејќи е надминато траењето на записот ($1), ограничено на $2 секунди.\nАко менувате повеќе ставки наеднаш, правете го тоа на повеќе наврати наместо заеднички.",
        "laggedslavemode": "Предупредување: Страницата може да не ги содржи скорешните поднови.",
        "readonly": "Базата е заклучена",
        "enterlockreason": "Внесете причина за заклучувањето, вклучувајќи и приближно време на отклучување",
        "missingarticle-rev": "(измена#: $1)",
        "missingarticle-diff": "(разлика: $1, $2)",
        "readonly_lag": "Базата е автоматски заклучена додека помошните опслужувачи не се усогласат",
+       "nonwrite-api-promise-error": "HTTP-заглавието „Promise-Non-Write-API-Action“ беше испратено, но барањето беше упатено кон записен модул на извршникот.",
        "internalerror": "Внатрешна грешка",
        "internalerror_info": "Внатрешна грешка: $1",
        "internalerror-fatal-exception": "Кобен исклучок на типот „$1“",
        "delete-hook-aborted": "Бришењето е прекинато со кука.\nНе е дадено никакво образложение.",
        "no-null-revision": "Не можев да направам нова ништовна преработка на страницата „$1“",
        "badtitle": "Неисправен наслов",
-       "badtitletext": "Ð\91аÑ\80аниоÑ\82 Ð½Ð°Ñ\81лов Ðµ Ð³Ñ\80еÑ\88ен, Ð¿Ñ\80азен Ð¸Ð»Ð¸ Ð½ÐµÐ¸Ñ\81пÑ\80авно Ð¿Ð¾Ð²Ñ\80зан Ð¼ÐµÑ\93Ñ\83Ñ\98азиÑ\87ен Ð¸Ð»Ð¸ Ð¼ÐµÑ\93Ñ\83вики наслов. \nМоже да содржи недопуштени знаци.",
+       "badtitletext": "Ð\91аÑ\80аниоÑ\82 Ð½Ð°Ñ\81лов Ðµ Ð³Ñ\80еÑ\88ен, Ð¿Ñ\80азен Ð¸Ð»Ð¸ Ð½ÐµÐ¸Ñ\81пÑ\80авно Ð¿Ð¾Ð²Ñ\80зан Ð¼ÐµÑ\93Ñ\83Ñ\98азиÑ\87ен Ð¸Ð»Ð¸ Ð¼ÐµÑ\93Ñ\83пÑ\80оекÑ\82ен наслов. \nМоже да содржи недопуштени знаци.",
        "title-invalid-empty": "Бараниот наслов е празен или го содржи само називот на именскиот простор.",
        "title-invalid-utf8": "Бараниот наслов содржи неважечка UTF-8-низа.",
        "title-invalid-interwiki": "Бараниот наслов содржи меѓујазична врска што не може да се користи во наслови.",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зошто правите друга сметка",
-       "createacct-captcha": "Безбедносна проверка",
-       "createacct-imgcaptcha-ph": "Внесете го гореприкажаниот текст",
        "createacct-submit": "Направи ја",
        "createacct-another-submit": "Создај сметка",
        "createacct-benefit-heading": "{{SITENAME}} е дело на луѓе како вас.",
        "wrongpasswordempty": "Внесената лозинка е празна. Обидете се повторно.",
        "passwordtooshort": "Лозинката мора да има најмалку {{PLURAL:$1|1 знак|$1 знаци}}.",
        "passwordtoolong": "Лозинката не треба да има повеќе од {{PLURAL:$1|1 знак|$1 знаци}}.",
+       "passwordtoopopular": "Не користете пречесто застапени лозинки. Одберете некоја поинаква од вообичаените.",
        "password-name-match": "Лозинката мора да се разликува од корисничкото име.",
        "password-login-forbidden": "Употребата на ова корисничко име и лозинка е забранета.",
        "mailmypassword": "Нова лозинка",
        "passwordreset-emailtext-ip": "Некој (веројатно вие, од IP-адресата $1) побара измена на вашата\nлозинка за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во\n{{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:\n\n$2\n\n{{PLURAL:$3|Оваа привремена лозинка ќе истече|Овие привремени лозинки ќе истечат}} во рок од {{PLURAL:$5|еден ден|$5 дена}}.\nСега треба да се најавите и да внесете нова лозинка. Ако ова барање го\nпоставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате\nда ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.",
        "passwordreset-emailtext-user": "Корисникот $1 на {{SITENAME}} побара измена на вашата лозинка на {{SITENAME}}\n($4). Оваа е-поштенска адреса е наведена во {{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:\n\n$2\n\n{{PLURAL:$3|Оваа привремена лозинка ќе истече|Овие привремени лозинки ќе истечат}} во рок од {{PLURAL:$5|еден ден|$5 дена}}.\nСега треба да се најавите и да внесете нова лозинка. Ако ова барање го\nпоставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате\nда ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.",
        "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
-       "passwordreset-emailsent": "Ако ова е регистрираната е-пошта за вашата сметка, тогаш ќе ви биде испратено писмо за задавање на нова лозинка.",
+       "passwordreset-emailsentemail": "Ако ова е регистрираната е-пошта за вашата сметка, тогаш ќе ви биде испратено писмо за задавање на нова лозинка.",
+       "passwordreset-emailsentusername": "Ако има соодветна регистрирана е-пошта, тогаш ќе ви биде испратена порака за промена на лозинката.",
        "passwordreset-emailsent-capture": "Испратено е писмо за измена на лозинката (прикажано подолу).",
        "passwordreset-emailerror-capture": "Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1",
        "changeemail": "Смени или отстрани е-пошта",
        "showingresultsinrange": "Долу {{PLURAL:$1|е прикажан до <strong>еден</strong> резултат|се прикажани до <strong>$1</strong> резултати}} во опсег од <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Резултат <strong>$1</strong> од <strong>$3</strong>|Резултати <strong>$1 - $2</strong> од <strong>$3</strong>}}",
        "search-nonefound": "Нема резултати што одговараат на бараното.",
+       "search-nonefound-thiswiki": "Нема резултати што одговараат на бараното на ова мрежно место.",
        "powersearch-legend": "Напредно пребарување",
        "powersearch-ns": "Пребарај во следниве именски простори:",
        "powersearch-togglelabel": "Одбери:",
        "prefs-help-prefershttps": "Поставката ќе се примени следниот пат кога ќе се најавите.",
        "prefswarning-warning": "Направивте промени во нагодувањата, но не ги зачувавте.\nИзмената нема да се изврши ако ја напуштите страницава без да стиснете на „$1“.",
        "prefs-tabs-navigation-hint": "Совет: Можете да ги користите стрелките на тастатурата за да преоѓате од едно на друго јазиче во списокот на јазичиња.",
-       "email-address-validity-valid": "Исправно",
-       "email-address-validity-invalid": "Се бара исправна адреса!",
        "userrights": "Раководење со кориснички права",
        "userrights-lookup-user": "Раководење со кориснички групи",
        "userrights-user-editname": "Внесете корисничко име:",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (погл. и [[Special:NewPages|списокот на нови страници]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Прикажи",
        "rcnotefrom": "Подолу {{PLURAL:$5|е прикажана промената|се прикажани промените}} почнувајќи од <strong>$3, $4</strong>  (се прикажуваат до <b>$1</b>).",
        "rclistfrom": "Прикажи нови промени почнувајќи од $3 $2",
        "rcshowhideminor": "$1 ситни промени",
        "fewestrevisions": "Статии со најмалку преработки",
        "nbytes": "$1 {{PLURAL:$1|бајт|бајти}}",
        "ncategories": "$1 {{PLURAL:$1|категорија|категории}}",
-       "ninterwikis": "$1 {{PLURAL:$1|меÑ\93Ñ\83вики|меÑ\93Ñ\83викиÑ\98а}}",
+       "ninterwikis": "$1 {{PLURAL:$1|меÑ\93Ñ\83пÑ\80оекÑ\82на|меÑ\93Ñ\83пÑ\80оекÑ\82ни}}",
        "nlinks": "$1 {{PLURAL:$1|врска|врски}}",
        "nmembers": "$1 {{PLURAL:$1|член|членови}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|член|членови}}",
        "mostlinkedtemplates": "Најмногу превметнати страници",
        "mostcategories": "Страници со најмногу категории",
        "mostimages": "Најмногу врски до податотеки",
-       "mostinterwikis": "СÑ\82Ñ\80аниÑ\86и Ñ\81о Ð½Ð°Ñ\98многÑ\83 Ð¼ÐµÑ\93Ñ\83вики",
+       "mostinterwikis": "СÑ\82Ñ\80аниÑ\86и Ñ\81о Ð½Ð°Ñ\98многÑ\83 Ð¼ÐµÑ\93Ñ\83пÑ\80оекÑ\82ни",
        "mostrevisions": "Статии со најмногу верзии",
        "prefixindex": "Сите страници (со претставка)",
        "prefixindex-namespace": "Сите страници со претставка (именски простор $1)",
+       "prefixindex-submit": "Прикажи",
        "prefixindex-strip": "Отстрани ја претставката во списокот",
        "shortpages": "Кратки страници",
        "longpages": "Долги страници",
        "protectedpages-performer": "Заштитувач",
        "protectedpages-params": "Параметри на заштитата",
        "protectedpages-reason": "Причина",
+       "protectedpages-submit": "Прикажи страници",
        "protectedpages-unknown-timestamp": "Непознато",
        "protectedpages-unknown-performer": "Непознат корисник",
        "protectedtitles": "Заштитени наслови",
        "protectedtitles-summary": "На страницата се наведени наслови што се моментално заштитени од создавање. За список на постоечки страници што се заштитени, погледајте [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Во овој момент нема заштитени наслови кои ги задоволуваат наведените критериуми.",
+       "protectedtitles-submit": "Прикажи наслови",
        "listusers": "Список на корисници",
        "listusers-editsonly": "Прикажи само корисници кои уредувале",
        "listusers-creationsort": "Подреди по датум на создавање",
        "allinnamespace": "Сите страници (именски простор $1)",
        "allpagessubmit": "Дај",
        "allpagesprefix": "Прикажи страници со претставка:",
-       "allpagesbadtitle": "Ð\94адениоÑ\82 Ð½Ð°Ñ\81лов Ðµ Ð½ÐµÐ²Ð°Ð¶ÐµÑ\87ки Ð¸Ð»Ð¸ Ð¸Ð¼Ð° Ð¼ÐµÑ\93Ñ\83Ñ\98азиÑ\87ен Ð¸Ð»Ð¸ Ð¼ÐµÑ\93Ñ\83вики-претставка. Може да содржи повеќе знаци кои не смеат да се користат во наслови.",
+       "allpagesbadtitle": "Ð\94адениоÑ\82 Ð½Ð°Ñ\81лов Ðµ Ð½ÐµÐ²Ð°Ð¶ÐµÑ\87ки Ð¸Ð»Ð¸ Ð¸Ð¼Ð° Ð¼ÐµÑ\93Ñ\83Ñ\98азиÑ\87ен Ð¸Ð»Ð¸ Ð¼ÐµÑ\93Ñ\83пÑ\80оекÑ\82на претставка. Може да содржи повеќе знаци кои не смеат да се користат во наслови.",
        "allpages-bad-ns": "Википедија не содржи именски простор „$1“.",
        "allpages-hide-redirects": "Скриј пренасочувања",
        "cachedspecial-viewing-cached-ttl": "Гледате меѓускладирана верзија на оваа страница, која може да е стара $1.",
        "activeusers-hidebots": "Скриј ботови",
        "activeusers-hidesysops": "Скриј администратори",
        "activeusers-noresult": "Не пронајдов ниеден корисник.",
+       "activeusers-submit": "Прикажи активни корисници",
        "listgrouprights": "Права на кориснички групи",
        "listgrouprights-summary": "Следи список на кориснички групи утврдени на ова вики, заедно со нивните придружни права на пристап.\nМожно е да има [[{{MediaWiki:Listgrouprights-helppage}}|дополнителни информации]] за некои права.",
        "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Доделено право</span>\n* <span class=\"listgrouprights-revoked\">Одземено право</span>",
        "wlheader-showupdated": "Страниците што се изменети од вашата последна посета се прикажани со '''задебелени''' букви",
        "wlnote": "Подолу {{PLURAL:$1|е прикажана последната промена|се прикажани последните <strong>$1</strong> промени}} во {{PLURAL:$2|последниов час|последниве <strong>$2</strong> часа}}, заклучно со $3, $4 ч.",
        "wlshowlast": "Прикажи ги последните $1 часа, $2 дена,",
+       "watchlistall2": "сè",
+       "watchlist-hide": "Скриј",
+       "watchlist-submit": "Прикажи",
+       "wlshowtime": "Период за приказ:",
+       "wlshowhideminor": "ситни уредувања",
+       "wlshowhidebots": "ботови",
+       "wlshowhideliu": "регистрирани корисници",
+       "wlshowhideanons": "анонимни корисници",
+       "wlshowhidepatr": "проверени уредувања",
+       "wlshowhidemine": "моите уредувања",
        "watchlist-options": "Поставки за список на набљудувања",
        "watching": "Набљудување...",
        "unwatching": "Отстранувам од набљудувани...",
        "contributions": "{{GENDER:$1|Придонеси на корисникот}}",
        "contributions-title": "Придонеси на корисникот $1",
        "mycontris": "придонеси",
+       "anoncontribs": "Придонеси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Корисничката сметка „$1“ не е регистрирана.",
        "nocontribs": "Не се пронајдени промени што одговараат на овој критериум.",
        "whatlinkshere-hidelinks": "$1 врски",
        "whatlinkshere-hideimages": "$1 врски кон податотека",
        "whatlinkshere-filters": "Филтри",
+       "whatlinkshere-submit": "Дај",
        "autoblockid": "Автоблок бр. $1",
        "block": "Блокирај корисник",
        "unblock": "Одблокирај корисник",
        "movenosubpage": "Оваа страница нема потстраници.",
        "movereason": "Причина:",
        "revertmove": "врати",
-       "delete_and_move": "Избриши и премести",
        "delete_and_move_text": "==Потребно бришење==\nЦелната статија „[[:$1]]“ веќе постои.\nДали сакате да ја избришете за да ослободите место за преместувањето?",
        "delete_and_move_confirm": "Да, избриши ја страницата",
        "delete_and_move_reason": "Избришано за да се ослободи место за преместувањето од „[[$1]]“",
        "selfmove": "Појдовната и целната страница се истоветни;\nне можам да преместам.",
        "immobile-source-namespace": "Не може да се преместуваат страници во именскиот простор „$1“",
        "immobile-target-namespace": "Не може да се преместуваат страници во именскиот простор „$1“",
-       "immobile-target-namespace-iw": "Ð\9cеÑ\93Ñ\83вики-врска не може да се користи за преименување на страници.",
+       "immobile-target-namespace-iw": "Ð\9cеÑ\93Ñ\83пÑ\80оекÑ\82на врска не може да се користи за преименување на страници.",
        "immobile-source-page": "Оваа страница не може да се преместува.",
        "immobile-target-page": "Не може да се премести под бараниот наслов.",
        "bad-target-model": "Саканата одредница користи друг содржински модел. Не можам да претворам од $1 во $2.",
        "importfailed": "Неуспешно внесување: $1",
        "importunknownsource": "Непознат тип за внесување",
        "importcantopen": "Не може да се отвори увезената податотека",
-       "importbadinterwiki": "Ð\9bоÑ\88а Ð¼ÐµÑ\93Ñ\83вики-врска",
+       "importbadinterwiki": "Ð\9bоÑ\88а Ð¼ÐµÑ\93Ñ\83пÑ\80оекÑ\82на врска",
        "importsuccess": "Увезувањето е завршено!",
        "importnosources": "Нема викија од кои би се извршил увоз и непосредните подигања на историја се оневозможени.",
        "importnofile": "Нема подигнато увозна податотека.",
        "import-invalid-interwiki": "Не можам да увезам од наведеното вики.",
        "import-error-edit": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја уредувате.",
        "import-error-create": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја создадете.",
-       "import-error-interwiki": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e$1â\80\9c Ð½Ðµ Ðµ Ñ\83везена Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð¸Ð¼ÐµÑ\82о Ðµ Ñ\80езеÑ\80виÑ\80ано Ð·Ð° Ð½Ð°Ð´Ð²Ð¾Ñ\80еÑ\88ни Ð²Ñ\80Ñ\81ки (меÑ\93Ñ\83вики).",
+       "import-error-interwiki": "СÑ\82Ñ\80аниÑ\86аÑ\82а â\80\9e$1â\80\9c Ð½Ðµ Ðµ Ñ\83везена Ð±Ð¸Ð´ÐµÑ\98Ñ\9cи Ð¸Ð¼ÐµÑ\82о Ðµ Ñ\80езеÑ\80виÑ\80ано Ð·Ð° Ð½Ð°Ð´Ð²Ð¾Ñ\80еÑ\88ни Ð²Ñ\80Ñ\81ки (меÑ\93Ñ\83пÑ\80оекÑ\82ни).",
        "import-error-special": "Страницата „$1“ не е увезена бидејќи припаѓа на посебен именски простор што не дозволува страници.",
        "import-error-invalid": "Страницата „$1“ не е увезена бидејќи името ѝ е неважечко на ова вики.",
        "import-error-unserialize": "Преработката $2 на страницата „$1“ не може да се отсеријализира. Утврдено е дека користи содржинскиот модел $3 што е серијализиран како $4.",
        "tooltip-pt-preferences": "Ваши нагодувања",
        "tooltip-pt-watchlist": "Список на страници кои сте избрале да ги набљудувате.",
        "tooltip-pt-mycontris": "Список на ваши придонеси",
+       "tooltip-pt-anoncontribs": "Список на уредувања направени од оваа IP-адреса",
        "tooltip-pt-login": "Ви препорачуваме да се најавите, иако тоа не е задолжително.",
        "tooltip-pt-logout": "Одјавување",
        "tooltip-pt-createaccount": "Ви препорачуваме да направите сметка и да се најавите, иако тоа не е задолжително",
        "htmlform-cloner-required": "Се бара барем една вредност.",
        "htmlform-title-badnamespace": "[[:$1]] не се наоѓа во именскиот простор „{{ns:$2}}“.",
        "htmlform-title-not-creatable": "Насловот „$1“ не може да се создава",
-       "htmlform-title-not-exists": "[[:$1]] не постои.",
+       "htmlform-title-not-exists": "$1 не постои.",
        "htmlform-user-not-exists": "<strong>$1</strong> не постои.",
        "htmlform-user-not-valid": "<strong>$1</strong> не претставува важечко корисничко име.",
        "sqlite-has-fts": "$1 со поддршка за пребарување по цели текстови",
        "logentry-suppress-block": "$1 {{GENDER:$2|го блокираше}} {{GENDER:$4|$3}} со истек $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|го измени}} блокот на {{GENDER:$4|$3}} со истек $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|ја увезе}} $3 со податотечно подигање",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|ја увезе}} $3 со подигање на податотека ($4 {{PLURAL:$4|преработка|преработки}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|ја увезе}} $3 од друго вики",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|ја увезе}} $3 од $5 ($4 {{PLURAL:$4|преработка|преработки}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|ја припои}} $3 кон $4 (преработки сè до $5)",
        "logentry-move-move": "$1 {{GENDER:$2|ја премести}} страницата $3 на $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ја премести}} страницата $3 на $4 без да остави пренасочување",
index 513811e..d5e8fda 100644 (file)
@@ -65,6 +65,7 @@
        "tog-watchlisthidebots": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് യന്ത്രങ്ങൾ വരുത്തിയ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthideminor": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് ചെറുതിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthideliu": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും ലോഗിൻ ചെയ്തിട്ടുള്ളവരുടെ തിരുത്തുകൾ മറയ്ക്കുക",
+       "tog-watchlistreloadautomatically": "ഒരു അരിപ്പയിൽ മാറ്റമുണ്ടായാൽ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം വീണ്ടുമെടുക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)",
        "tog-watchlisthideanons": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും അജ്ഞാത ഉപയോക്താക്കളുടെ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthidepatrolled": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് റോന്തുചുറ്റിയ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം മറയ്ക്കുക",
        "morenotlisted": "ഈ പട്ടിക പൂർണ്ണമല്ല.",
        "mypage": "താൾ",
        "mytalk": "സംവാദത്താൾ",
-       "anontalk": "à´\88 à´\90.പി.à´¯àµ\81à´\9fàµ\86 à´¸à´\82â\80\8cവാദതàµ\8dതാൾ",
+       "anontalk": "à´¸à´\82വാദà´\82",
        "navigation": "ഉള്ളടക്കം",
        "and": "&#32;ഒപ്പം",
        "qbfind": "കണ്ടെത്തുക",
        "createaccountreason": "കാരണം:",
        "createacct-reason": "കാരണം",
        "createacct-reason-ph": "താങ്കൾ എന്തുകൊണ്ടാണ് മറ്റൊരു അംഗത്വം എടുക്കുന്നത്",
-       "createacct-captcha": "സുരക്ഷാ പരിശോധന",
-       "createacct-imgcaptcha-ph": "മുകളിൽ കാണുന്ന എഴുത്ത് ഇവിടെ നൽകുക",
        "createacct-submit": "താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കുക",
        "createacct-another-submit": "അംഗത്വമെടുക്കുക",
        "createacct-benefit-heading": "താങ്കളെപ്പോലെയുള്ളവരാണ്  {{SITENAME}}  പടുത്തുയർത്തിയിരിക്കുന്നത്.",
        "wrongpasswordempty": "രഹസ്യവാക്ക് നൽകിയിരുന്നില്ല. വീണ്ടും ശ്രമിക്കുക.",
        "passwordtooshort": "രഹസ്യവാക്കിൽ കുറഞ്ഞതു {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} ഉണ്ടായിരിക്കണം.",
        "passwordtoolong": "രഹസ്യവാക്കിൽ പരമാവധി {{PLURAL:$1|ഒരു അക്ഷരം|$1 അക്ഷരങ്ങൾ}} മാത്രമേ പാടുള്ളു.",
+       "passwordtoopopular": "പരക്കെ ഉപയോഗിക്കുന്ന രഹസ്യവാക്കുകൾ ഉപയോഗിക്കരുത്. ദയവായി കൂടുതൽ അനന്യമായ രഹസ്യവാക്ക് തിരഞ്ഞെടുക്കുക.",
        "password-name-match": "താങ്കളുടെ രഹസ്യവാക്ക് ഉപയോക്തൃനാമത്തിൽ നിന്നും വ്യത്യസ്തമായിരിക്കണം.",
        "password-login-forbidden": "ഈ ഉപയോക്തൃനാമത്തിന്റെയും രഹസ്യവാക്കിന്റെയും ഉപയോഗം നിരോധിച്ചിരിക്കുന്നു.",
        "mailmypassword": "രഹസ്യവാക്ക് പുനഃക്രമീകരിക്കുക",
        "passwordreset-emailtext-ip": "ആരോ ഒരാൾ (മിക്കവാറും താങ്കളായിരിക്കും, $1 എന്ന ഐ.പി. വിലാസത്തിൽ നിന്നും) {{SITENAME}} സംരംഭത്തിലെ ($4) താങ്കളുടെ രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:\n\n$2\n\n\nഈ {{PLURAL:$3|താത്കാലിക രഹസ്യവാക്ക്|താത്കാലിക രഹസ്യവാക്കുകൾ}} {{PLURAL:$5|ഒരു ദിവസം|$5 ദിവസങ്ങൾ}} കൊണ്ട് കാലഹരണപ്പെട്ട് പോകുന്നവയാണ്.\nതാങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.",
        "passwordreset-emailtext-user": "{{SITENAME}} സംരംഭത്തിലെ ഉപയോക്താവായ $1 {{SITENAME}} സംരംഭത്തിലെ ($4) രഹസ്യവാക്ക് പുനർസജ്ജീകരിക്കാൻ അഭ്യർത്ഥിച്ചിരിക്കുന്നു. ഈ ഇമെയിൽ വിലാസവുമായി ബന്ധപ്പെട്ടിരിക്കുന്ന {{PLURAL:$3|അംഗത്വം|അംഗത്വങ്ങൾ}} താഴെക്കൊടുത്തിരിക്കുന്നു:\n\n$2\n\n\nഈ {{PLURAL:$3|താത്കാലിക രഹസ്യവാക്ക്|താത്കാലിക രഹസ്യവാക്കുകൾ}} {{PLURAL:$5|ഒരു ദിവസം|$5 ദിവസങ്ങൾ}} കൊണ്ട് കാലഹരണപ്പെട്ട് പോകുന്നവയാണ്.\nതാങ്കൾ ഇപ്പോൾ തന്നെ പ്രവേശിച്ച് രഹസ്യവാക്ക് മാറ്റുന്നതാണ് ഉചിതം. ഈ അഭ്യർത്ഥന മറ്റാരോ ആണ് നടത്തിയത് അല്ലെങ്കിൽ, യഥാർത്ഥ രഹസ്യവാക്ക് താങ്കൾ ഓർമ്മിക്കുകയും അത് മാറ്റാൻ ആഗ്രഹിക്കാതിരിക്കുകയും ആണെങ്കിൽ, ഈ സന്ദേശം അവഗണിച്ച് താങ്കളുടെ പഴയ രഹസ്യവാക്ക് തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്.",
        "passwordreset-emailelement": "ഉപയോക്തൃനാമം: \n$1\n\nതാത്കാലിക രഹസ്യവാക്ക്: \n$2",
-       "passwordreset-emailsent": "താങ്കളുടെ അംഗത്വവുമായി ബന്ധിപ്പിച്ചിട്ടുള്ള ഇമെയിൽ വിലാസം ഇതാണെങ്കിൽ,  രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
+       "passwordreset-emailsentemail": "താങ്കളുടെ അംഗത്വവുമായി ബന്ധിപ്പിച്ചിട്ടുള്ള ഇമെയിൽ വിലാസം ഇതാണെങ്കിൽ,  രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയക്കുന്നതാണ്.",
        "passwordreset-emailsent-capture": "രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ അയച്ചിട്ടുണ്ട്, അത് താഴെക്കൊടുക്കുന്നു.",
        "passwordreset-emailerror-capture": "താഴെക്കൊടുത്തിരിക്കുന്ന, രഹസ്യവാക്ക് പുനർസജ്ജീകരണ ഇമെയിൽ സൃഷ്ടിക്കാനായെങ്കിലും, അത് {{GENDER:$2|ഉപയോക്താവിന്}} അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു: $1",
        "changeemail": "ഇമെയിൽ വിലാസം മാറ്റുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
        "showingresultsinrange": "#<strong>$2</strong> മുതൽ #<strong>$3</strong> വരെയുള്ള പരിധിയിലെ {{PLURAL:$1|<strong>ഒരു</strong> ഫലം|<strong>$1</strong> ഫലങ്ങൾ}} താഴെ പ്രദർശിപിക്കുന്നു.",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ഫലത്തിൽ<strong>$1</strong>|<strong>$3</strong> ഫലത്തിൽ <strong>$1 മുതൽ $2</strong> വരെയുള്ളവ}}",
        "search-nonefound": "താങ്കൾ തിരഞ്ഞ പദത്തിനു യോജിച്ച ഫലങ്ങളൊന്നും ലഭിച്ചില്ല.",
+       "search-nonefound-thiswiki": "ഈ അന്വേഷണത്തിനു യോജിച്ച ഫലങ്ങളൊന്നും ഈ സൈറ്റിൽ നിന്നും ലഭിച്ചില്ല.",
        "powersearch-legend": "വിപുലീകൃത തിരച്ചിൽ",
        "powersearch-ns": "തിരയേണ്ട നാമമേഖലകൾ",
        "powersearch-togglelabel": "അടയാളപ്പെടുത്തുക:",
        "prefs-help-prefershttps": "താങ്കൾ അടുത്ത പ്രാവശ്യം പ്രവേശിക്കുമ്പോൾ ഇവ ഫലത്തിൽ വരുന്നതാണ്.",
        "prefswarning-warning": "താങ്കളുടെ ക്രമീകരണങ്ങളിൽ താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല.\n\"$1\" ഞെക്കാതെയാണ് താങ്കൾ ഈ താളിൽ നിന്നും പോകുന്നതെങ്കിൽ താങ്കളുടെ ക്രമീകരണങ്ങൾ സേവ് ചെയ്യപ്പെടുന്നതല്ല.",
        "prefs-tabs-navigation-hint": "സൂചന: ടാബുകളുടെ പട്ടികയിലെ ടാബുകളിലൂടെ നീങ്ങാൻ ഇടത്തും വലത്തും ആരോ കീകൾ ഉപയോഗിക്കാവുന്നതാണ്.",
-       "email-address-validity-valid": "സാധുതയുള്ളതെന്ന് തോന്നുന്നു",
-       "email-address-validity-invalid": "സാധുതയുള്ള വിലാസം ആവശ്യമാണ്!",
        "userrights": "ഉപയോക്തൃ അവകാശ പരിപാലനം",
        "userrights-lookup-user": "ഉപയോക്തൃസംഘങ്ങളെ പരിപാലിക്കുക",
        "userrights-user-editname": "ഒരു ഉപയോക്തൃനാമം ടൈപ്പു ചെയ്യുക:",
        "wlheader-showupdated": "താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷം മാറ്റം വന്ന താളുകൾ  '''കടുപ്പിച്ച്''' കാണിച്ചിരിക്കുന്നു",
        "wlnote": "$3, $4-നു കഴിഞ്ഞ {{PLURAL:$2|മണിക്കൂറിൽ|<strong>$2</strong> മണിക്കൂറിൽ}} നടന്ന {{PLURAL:$1|ഒരു പുതിയ മാറ്റം|<strong>$1</strong> പുതിയ മാറ്റങ്ങൾ}} താഴെ പ്രദർശിപ്പിച്ചിരിക്കുന്നു.",
        "wlshowlast": "ഒടുവിലത്തെ $1 മണിക്കൂറുകൾ $2 ദിനങ്ങൾ പ്രദർശിപ്പിക്കുക",
+       "watchlistall2": "എല്ലാം",
+       "watchlist-hide": "മറയ്ക്കുക",
+       "wlshowtime": "പ്രദർശിപ്പിക്കേണ്ട കാലാവധി:",
+       "wlshowhideminor": "ചെറുതിരുത്തുകൾ",
+       "wlshowhidebots": "യന്ത്രങ്ങൾ",
+       "wlshowhideliu": "അംഗത്വമെടുത്ത ഉപയോക്താക്കൾ",
+       "wlshowhideanons": "അജ്ഞാത ഉപയോക്താക്കൾ",
+       "wlshowhidepatr": "റോന്തു ചുറ്റിയ മാറ്റങ്ങൾ",
+       "wlshowhidemine": "എന്റെ തിരുത്തുകൾ",
        "watchlist-options": "ശ്രദ്ധിക്കുന്ന താളുകളുടെ സജ്ജീകരണങ്ങൾ",
        "watching": "ശ്രദ്ധിക്കുന്നു...",
        "unwatching": "അവഗണിക്കുന്നു...",
        "contributions": "{{GENDER:$1|ഉപയോക്താവിന്റെ}} സംഭാവനകൾ",
        "contributions-title": "$1 എന്ന ഉപയോക്താവിന്റെ സംഭാവനകൾ",
        "mycontris": "സംഭാവനകൾ",
+       "anoncontribs": "സംഭാവനകൾ",
        "contribsub2": "ഉപയോക്താവ് {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "\"$1\" എന്ന ഉപയോക്തൃ അം‌ഗത്വം നിലവിലില്ല.",
        "nocontribs": "ഈ മാനദണ്ഡങ്ങളുമായി യോജിക്കുന്ന മാറ്റങ്ങൾ ഒന്നും കണ്ടില്ല.",
        "movenosubpage": "ഈ താളിന്‌ ഉപതാളുകൾ ഇല്ല",
        "movereason": "കാരണം:",
        "revertmove": "പൂർവ്വസ്ഥിതിയിലാക്കുക",
-       "delete_and_move": "മായ്ക്കുകയും മാറ്റുകയും ചെയ്യുക",
        "delete_and_move_text": "==താൾ മായ്ക്കേണ്ടിയിരിക്കുന്നു==\n\nമാറ്റാനായി നൽകിയ \"[[:$1]]\" എന്ന താൾ നിലവിലുണ്ട്. ഈ മാറ്റം നടത്തുന്നതിനുവേണ്ടി ആ താൾ മായ്ക്കേണ്ടതുണ്ടോ?",
        "delete_and_move_confirm": "ശരി, താൾ നീക്കം ചെയ്യുക",
        "delete_and_move_reason": "\"[[$1]]\" എന്നതിൽ നിന്നും മാറ്റാനുള്ള സൗകര്യത്തിനായി മായ്ച്ചു",
        "tooltip-pt-preferences": "താങ്കളുടെ ക്രമീകരണങ്ങൾ",
        "tooltip-pt-watchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങൾ",
        "tooltip-pt-mycontris": "താങ്കളുടെ സേവനങ്ങളുടെ പട്ടിക",
+       "tooltip-pt-anoncontribs": "ഈ ഐ.പി. വിലാസത്തിൽ നിന്നും ചെയ്തിട്ടുള്ള തിരുത്തുകളുടെ പട്ടിക",
        "tooltip-pt-login": "ലോഗിൻ ചെയ്യുവാൻ താല്പര്യപ്പെടുന്നു; പക്ഷേ നിർബന്ധമല്ല",
        "tooltip-pt-logout": "ലോഗൗട്ട് ചെയ്യാനുള്ള കണ്ണി",
        "tooltip-pt-createaccount": "നിർബന്ധമില്ലെങ്കിലും, താങ്കൾ ഒരു അംഗത്വമെടുക്കണമെന്നും പ്രവേശിക്കണമെന്നും താത്പര്യപ്പെടുന്നു",
        "show-big-image": "പൂർണ്ണ വലിപ്പം",
        "show-big-image-preview": "ഈ പ്രിവ്യൂവിന്റെ വലിപ്പം: $1.",
        "show-big-image-preview-differ": "ഈ  $2 പ്രമാണത്തിന്റെ $3 പ്രിവ്യൂവിന്റെ വലിപ്പം: $1.",
-       "show-big-image-other": "à´\95àµ\82à´\9fàµ\81തൽ {{PLURAL:$2|à´±àµ\86സലàµ\82ഷൻ}}: $1.",
+       "show-big-image-other": "മറàµ\8dà´±àµ\8d {{PLURAL:$2|à´±àµ\86സലàµ\82ഷൻ|à´±àµ\86സലàµ\82à´·à´¨àµ\81à´\95ൾ}}: $1.",
        "show-big-image-size": "$1 × $2 പിക്സലുകൾ",
        "file-info-gif-looped": "പുനരാവർത്തിതം",
        "file-info-gif-frames": "{{PLURAL:$1|ഒരു ചട്ടം|$1 ചട്ടങ്ങൾ}}",
        "htmlform-cloner-required": "കുറഞ്ഞത് ഒരു വിലയെങ്കിലും നൽകിയിരിക്കണം.",
        "htmlform-title-badnamespace": "[[:$1]] ഉള്ളത് \"{{ns:$2}}\" നാമമേഖലയിലല്ല.",
        "htmlform-title-not-creatable": "\"$1\" സൃഷ്ടിക്കാനാവുന്ന തലക്കെട്ടല്ല.",
-       "htmlform-title-not-exists": "[[:$1]] നിലവിലില്ല.",
+       "htmlform-title-not-exists": "$1 നിലവിലില്ല.",
        "htmlform-user-not-exists": "<strong>$1</strong> നിലവിലില്ല.",
        "htmlform-user-not-valid": "<strong>$1</strong> സാധുതയുള്ള ഉപയോക്തൃനാമമല്ല.",
        "sqlite-has-fts": "പൂർണ്ണ-എഴുത്ത് തിരച്ചിൽ പിന്തുണയുള്ള $1",
        "logentry-newusers-byemail": "$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 {{GENDER:$2|സൃഷ്ടിച്ചിരിക്കുന്നു}}, രഹസ്യവാക്ക് ഇമെയിൽ വഴി അയച്ചു",
        "logentry-newusers-autocreate": "$1 എന്ന ഉപയോക്തൃ അംഗത്വം സ്വയം {{GENDER:$2|സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു}}",
        "logentry-protect-move_prot": "സംരക്ഷണ സജ്ജീകരണങ്ങൾ $4  എന്നതിൽ നിന്ന് $3 എന്നതിലേക്ക് $1 {{GENDER:$2|മാറ്റി}}",
+       "logentry-protect-unprotect": "$3 താളിലെ സംരക്ഷണം $1 {{GENDER:$2|നീക്കി}}",
+       "logentry-protect-protect": "$3 താൾ $1 {{GENDER:$2|സംരക്ഷിച്ചു}} $4",
+       "logentry-protect-protect-cascade": "$3 താൾ $1 {{GENDER:$2|സംരക്ഷിച്ചു}} $4 [നിർഝരിതം]",
+       "logentry-protect-modify": "$3 താളിന്റെ സംരക്ഷണതലം $1 {{GENDER:$2|മാറ്റി}} $4",
+       "logentry-protect-modify-cascade": "$3 താളിന്റെ സംരക്ഷണതലം $1 {{GENDER:$2|മാറ്റി}} $4 [നിർഝരിതം]",
        "logentry-rights-rights": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്ക്, $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-rights-rights-legacy": "$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 {{GENDER:$2|മാറ്റിയിരിക്കുന്നു}}",
        "logentry-rights-autopromote": "$1 എന്ന ഉപയോക്താവ് $4 എന്നതിൽ നിന്നും $5 എന്നതിലേയ്ക്ക് സ്വയമേവ {{GENDER:$2|ഉയർത്തപ്പെട്ടിരിക്കുന്നു}}",
index 7248767..958abe2 100644 (file)
@@ -56,6 +56,7 @@
        "tog-hideminor": "अलीकडील बदलांत छोटी संपादने लपवा",
        "tog-hidepatrolled": "पहारा दिलेली संपादने (नित्य पहाण्यात असलेली संपादने) अलीकडील बदलांमधून लपवा",
        "tog-newpageshidepatrolled": "नवीन पृष्ठ यादीतून पहारा दिलेली पाने (नित्य पहाण्यात असलेली संपादने)  लपवा",
+       "tog-hidecategorization": "पानांचे वर्गीकरण लपवा",
        "tog-extendwatchlist": "निरीक्षणसूचीत सगळे बदल दाखवा. फक्त अलीकडील नाही.",
        "tog-usenewrc": "अलीकडील बदल आणि पहाऱ्याची सूचीत मांडणी करा",
        "tog-numberheadings": "शीर्षके स्वयंक्रमांकित करा",
@@ -66,6 +67,7 @@
        "tog-watchdefault": "मी संपादित केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
        "tog-watchmoves": "मी स्थानांतर केलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
        "tog-watchdeletion": "मी वगळलेली पाने आणि संचिका माझ्या निरीक्षणसूचीत टाका",
+       "tog-watchrollback": "यात ज्या पानात मी माझ्या निरीक्षणसूचीत पुनर्परतीची (रोलबॅक) क्रिया केलेली आहे.",
        "tog-minordefault": "सर्व संपादने 'छोटा बदल' म्हणून आपोआप जतन करा.",
        "tog-previewontop": "झलक संपादन खिडकीच्या आधी दाखवा",
        "tog-previewonfirst": "पहिल्या संपादनानंतर झलक दाखवा",
        "tog-watchlisthidebots": "पहाऱ्याच्या सूचीतून सांगकाम्यांचे बदल लपवा",
        "tog-watchlisthideminor": "माझ्या पहाऱ्याच्या सूचीतून छोटे बदल लपवा",
        "tog-watchlisthideliu": "पहाऱ्याच्या सूचीतून प्रवेश केलेल्या सदस्यांची संपादने लपवा",
+       "tog-watchlistreloadautomatically": "एखादी गाळणी बदलल्यावर,निरीक्षणसूचीचे आपोआप पुनर्भारण करा(जावास्क्रिप्ट हवी)",
        "tog-watchlisthideanons": "निरीक्षणसूचीतून अनामिक सदस्यांची संपादने लपवा",
        "tog-watchlisthidepatrolled": "निरीक्षणसूचीतून तपासलेली संपादने लपवा",
+       "tog-watchlisthidecategorization": "पानांचे वर्गीकरण लपवा",
        "tog-ccmeonemails": "मी इतर सदस्यांना पाठविलेल्या ई-मेल च्या प्रती मलाही माझ्या ई-मेल पत्त्यावर पाठवा",
        "tog-diffonly": "निवडलेल्या आवृत्त्यांमधील बदल दाखवताना जुनी आवृत्ती दाखवू नका.",
        "tog-showhiddencats": "लपविलेले वर्ग दाखवा",
        "morenotlisted": "ही यादी पूर्ण नाही.",
        "mypage": "पान",
        "mytalk": "चर्चा",
-       "anontalk": "या à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयाà¤\9aà¥\87 à¤\9aरà¥\8dà¤\9aा à¤ªà¤¾à¤¨ à¤\89à¤\98डा",
+       "anontalk": "à¤\9aरà¥\8dà¤\9aा à¤ªà¤¾à¤¨",
        "navigation": "सुचालन",
        "and": "&#32;आणि",
        "qbfind": "शोधा",
        "faqpage": "Project:प्रश्नावली",
        "actions": "क्रिया",
        "namespaces": "नामविश्वे",
-       "variants": "à¤\85सà¥\8dथिरà¤\95à¥\87",
+       "variants": "à¤\9aलà¥\87(वà¥\8dहà¥\87रियà¤\82à¤\9fà¥\8dस)",
        "navigation-heading": "दिक्चालन यादी",
        "errorpagetitle": "चूक",
        "returnto": "$1 कडे परत चला.",
        "search": "शोधा",
        "searchbutton": "शोधा",
        "go": "चला",
-       "searcharticle": "शà¥\8bधा",
+       "searcharticle": "à¤\9cा",
        "history": "पानाचा इतिहास",
        "history_short": "इतिहास",
        "updatedmarker": "माझ्या शेवटच्या भेटीनंतर अद्यतन केले",
        "pool-timeout": "ताळ्यासाठी वाट पाहण्याची वेळ संपली",
        "pool-queuefull": "सर्व्हरवर ताण आहे.",
        "pool-errorunknown": "अपरिचित त्रुटी",
-       "poolcounter-usage-error": "वापर त्रूटी:$1",
-       "aboutsite": "{{SITENAME}}बद्दल",
+       "pool-servererror": "पूल काउंटर सेवा उपलब्ध नाही($1).",
+       "poolcounter-usage-error": "वापर त्रुटी:$1",
+       "aboutsite": "{{SITENAME}} बद्दल",
        "aboutpage": "Project:माहितीपृष्ठ",
        "copyright": "येथील मजकूर $1च्या अंतर्गत उपलब्ध आहे जोपर्यंत इतर नोंदी केलेल्या नाहीत.",
        "copyrightpage": "{{ns:project}}:प्रताधिकार",
        "disclaimers": "उत्तरदायित्वास नकार",
        "disclaimerpage": "Project: सर्वसाधारण उत्तरदायकत्वास नकार",
        "edithelp": "संपादन साहाय्य",
-       "helppage-top-gethelp": "मदत",
+       "helppage-top-gethelp": "साहायà¥\8dय",
        "mainpage": "मुखपृष्ठ",
        "mainpage-description": "मुखपृष्ठ",
        "policy-url": "Project:नीती",
        "viewsourceold": "स्रोत पहा",
        "editlink": "संपादन",
        "viewsourcelink": "स्रोत पहा",
-       "editsectionhint": "हà¥\8dया à¤µà¤¿à¤­à¤¾à¤\97ाà¤\9aà¥\87 à¤¸à¤\82पादन à¤\95रा: $1",
+       "editsectionhint": "या विभागाचे संपादन करा: $1",
        "toc": "अनुक्रमणिका",
        "showtoc": "दाखवा",
        "hidetoc": "लपवा",
        "feed-invalid": "अयोग्य रसद नोंदणी (Invalid subscription feed type).",
        "feed-unavailable": "सिंडीकेशन रसद उपलब्ध नाहीत",
        "site-rss-feed": "$1 आरएसएस रसद",
-       "site-atom-feed": "$1 à¤\8dटम रसद (Atom Feed)",
+       "site-atom-feed": "$1 à¤\85à¥\85टम रसद (Atom Feed)",
        "page-rss-feed": "\"$1\" आर.एस.एस.रसद (RSS Feed)",
-       "page-atom-feed": "\"$1\" à¤\8dटम रसद (Atom Feed)",
-       "feed-atom": "ॲटम",
+       "page-atom-feed": "\"$1\" à¤\85à¥\85टम रसद (Atom Feed)",
+       "feed-atom": "à¤\85à¥\85टम",
        "feed-rss": "आर.एस.एस.",
        "red-link-title": "$1 (पान अस्तित्वात नाही)",
        "sort-descending": "उतरत्या क्रमाने लावा",
        "nstab-template": "साचा",
        "nstab-help": "साहाय्य पान",
        "nstab-category": "वर्ग",
-       "mainpage-nstab": "मà¥\81à¤\96à¥\8dय à¤ªà¤¾à¤¨",
+       "mainpage-nstab": "मà¥\81à¤\96पà¥\83षà¥\8dठ",
        "nosuchaction": "अशी कृती अस्तित्वात नाही",
        "nosuchactiontext": "URL ने नमूद केलेली कृती चुकीची आहे.\nतुम्ही कदाचित URL चुकीची दिली असेल, किंवा चुकीच्या दुव्यावर टिचकी दिली असेल.\nकदाचित, ही कृती {{SITENAME}} वापरत असलेल्या सॉफ्टवेअर मधील गणकदोष \nसुद्धा दर्शवीत असेल.",
        "nosuchspecialpage": "असे कोणतेही विशेष पृष्ठ अस्तित्वात नाही",
        "nospecialpagetext": "<strong>आपण केलेली विनंती अयोग्य विशेषपानासंबंधी आहे.</strong>\n\nयोग्य विशेषपानांची यादी  [[Special:SpecialPages|{{int:specialpages}}]] येथे उपलब्ध होऊ शकते.",
        "error": "त्रुटी",
        "databaseerror": "माहितीसंग्रहातील त्रुटी",
-       "databaseerror-text": "विदाà¤\97ार à¤ªà¥\83à¤\9aà¥\8dà¤\9bा à¤¤à¥\8dरà¥\82टी घडलेली आहे.\nते संचेतनात गणकदोष असण्याची शक्यता निर्देशित करते.",
-       "databaseerror-textcl": "विदाà¤\97ार à¤ªà¥\83à¤\9aà¥\8dà¤\9bा à¤¤à¥\8dरà¥\82टी घडलेली आहे.",
+       "databaseerror-text": "विदाà¤\97ार à¤ªà¥\83à¤\9aà¥\8dà¤\9bा à¤¤à¥\8dरà¥\81टी घडलेली आहे.\nते संचेतनात गणकदोष असण्याची शक्यता निर्देशित करते.",
+       "databaseerror-textcl": "विदाà¤\97ार à¤ªà¥\83à¤\9aà¥\8dà¤\9bा à¤¤à¥\8dरà¥\81टी घडलेली आहे.",
        "databaseerror-query": "पृच्छा:$1",
        "databaseerror-function": "क्रिया: $1",
        "databaseerror-error": "त्रुटी: $1",
        "readonly_lag": "मुख्य विदागार दात्याच्या (मास्टर डाटाबेस सर्व्हर) बरोबरीने पोहचण्यास पराधीन-विदागारदात्यास (स्लेव्ह सर्व्हर) वेळ लागल्यामुळे, विदागार आपोआप बंद झाला आहे.",
        "internalerror": "अंतर्गत त्रुटी",
        "internalerror_info": "अंतर्गत त्रुटी: $1",
+       "internalerror-fatal-exception": "\"$1\"प्रकारचा घातक अपवाद",
        "filecopyerror": "\"$1\" संचिकेची \"$2\" ही प्रत करता आली नाही.",
        "filerenameerror": "\"$1\" संचिकेचे \"$2\" असे नामांतर करता आले नाही.",
        "filedeleteerror": "\"$1\" संचिका वगळता आली नाही.",
        "delete-hook-aborted": "खोडण्याची  क्रिया मधेच थांबविण्यात येत आहे.\nकोणतेही कारण देण्यात आले नाही",
        "no-null-revision": "\"$1\" या पानाची नविन रिक्त आवृत्ती निर्मिता आली नाही.",
        "badtitle": "खराब शीर्षक",
-       "badtitletext": "à¤\86पण à¤µà¤¿à¤¨à¤\82तà¥\80 à¤\95à¥\87लà¥\87लà¥\87 à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤\85यà¥\8bà¤\97à¥\8dय, à¤°à¤¿à¤\95ामà¥\87 à¤\85थवा à¤\9aà¥\81à¤\95िनà¥\87 à¤\9cà¥\8bडलà¥\87लà¥\87 à¤\86à¤\82तर-भाषिय à¤\95िà¤\82वा à¤\86à¤\82तर-विà¤\95ि à¤¶à¥\80रà¥\8dषà¤\95 à¤\86हà¥\87. à¤¤à¥\8dयात,शà¥\80रà¥\8dषà¤\95ास à¤\85यà¥\8bà¤\97à¥\8dय à¤\85शà¥\80 à¤\8fà¤\95 à¤\95िà¤\82वा à¤\85धिà¤\95 à¤\9aिनà¥\8dहे आहेत.",
+       "badtitletext": "à¤\86पण à¤µà¤¿à¤¨à¤\82तà¥\80 à¤\95à¥\87लà¥\87लà¥\87 à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤\85यà¥\8bà¤\97à¥\8dय, à¤°à¤¿à¤\95ामà¥\87 à¤\85थवा à¤\9aà¥\81à¤\95िनà¥\87 à¤\9cà¥\8bडलà¥\87लà¥\87 à¤\86à¤\82तर-भाषिय à¤\95िà¤\82वा à¤\86à¤\82तर-विà¤\95ि à¤¶à¥\80रà¥\8dषà¤\95 à¤\86हà¥\87. à¤¤à¥\8dयात,शà¥\80रà¥\8dषà¤\95ास à¤\85यà¥\8bà¤\97à¥\8dय à¤\85शà¥\80 à¤\8fà¤\95 à¤\95िà¤\82वा à¤\85धिà¤\95 à¤\85à¤\95à¥\8dषरे आहेत.",
        "title-invalid-empty": "आपण विनंति केलेले पान-शिर्षक एकतर रिकामे आहे किंवा त्यात एखाद्या नामविश्वाचे नाव आहे.",
        "title-invalid-utf8": "आपण विनंती केलेल्या पानाच्या शिर्षकात अवैध यूटिएफ-८ क्रमवारी आहेत.",
        "title-invalid-interwiki": "आपण विनंती केलेल्या पानात आंतरविकि दुवे आहेत जे शिर्षकात वापरता येउ शकत नाहीत.",
-       "title-invalid-talk-namespace": "आपण विनंति केलेले पान उपलब्ध नसलेल्या चर्च्या पानास संबोधित करते",
+       "title-invalid-talk-namespace": "आपण विनंति केलेले पान शिर्षक चर्चा पानास संदर्भांकित करते जे अस्तित्वात नाही.",
+       "title-invalid-characters": "विनंती केलेल्या पानात अवैध वर्ण आहेत:\"$1\".",
+       "title-invalid-relative": "शिर्षकास संलग्न मार्ग आहेत.संलग्न पान शिर्षके (./, ../)अवैध आहेत, कारण ते सदस्याच्या न्याहाळकाद्वारे हाताळल्यावर, अनेकदा, त्यावर पोचता येणार नाही.",
+       "title-invalid-magic-tilde": "विनंती केलेल्या पानाच्या शिर्षकात अवैध जादुई नासिक्यत्व-चिन्ह क्रमवारी(मॅजिक टिल्ड सिक्वेन्स) आहे(<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "विनंती केलेल्या पानाचे शिर्षक फारच लांबीचे आहे.यूटीएफ-८ एनकोडिंगमध्ये ते $1{{PLURAL:$1|बाईट|बाईटस्}} पेक्षा लांब नको.",
+       "title-invalid-leading-colon": "विनंती केलेल्या पानाचे शिर्षकाचे सुरुवातीस अवैध द्विबिंदुचिन्ह(:) आहे.",
        "perfcached": "खालील माहिती सयीमधील (कॅशे) असल्यामुळे ती अद्ययावत् नाही.जास्तीतजास्त {{PLURAL:$1|एक प्रतिफळ |$1 प्रतिफळे }} सयीमध्ये असतात.",
        "perfcachedts": "खालील माहिती सयीमधील (कॅशे) आहे व ती  $1 पर्यंत अद्ययावत् आहे. जास्तीतजास्त {{PLURAL:$4|एक प्रतिफळ |$4 प्रतिफळे}} सयीमध्ये असतात.",
        "querypage-no-updates": "सध्या या पानाकरिता नवी अद्यतने अनुपलब्ध केली आहेत.आत्ताच येथील विदा तरोताजा होणार नाही.",
        "viewyourtext": "तुम्ही या पानाची,<strong>तुमची संपादने</strong> पाहू शकता व त्याची प्रत करू शकता.",
        "protectedinterface": "हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.\n\nसर्व विकिंवर, अनुवाद जोडण्याकरता किंवा बदलण्याकरता अथवा शुद्धलेखन चिकित्सेकरीता , कृपया [//translatewiki.net/ translatewiki.net], या मिडियाविकि स्थानिकीकरण प्रकल्पावर जा.",
        "editinginterface": "<strong>सावधान</strong>तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.",
-       "cascadeprotected": "हे पान संपादनांपासून सुरक्षित केल्या गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} अंतर्भूत केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन पर्याय सुरु केल्यामुळे सुरक्षित आहेत:\n$2",
+       "translateinterface": "सर्व विकिंवर अनुवाद जोडण्याकरता किंवा बदलण्याकरता, कृपया [//translatewiki.net/ ट्रांसलेटविकि.नेट]चा वापर करा,जो मिडियाविकिचा स्थानिकीकरण प्रकल्प आहे.",
+       "cascadeprotected": "हे पान संपादनांपासून सुरक्षित केल्या गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} आंतरविन्यासित केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन पर्याय सुरु केल्यामुळे सुरक्षित आहेत:\n$2",
        "namespaceprotected": "'''$1''' नामविश्वातील पाने संपादण्याची आपणांस परवानगी नाही.",
        "customcssprotected": "या पानावर इतर सदस्याची वैयक्तिक मांडणी असल्यामुळे, तुम्हाला हे सीएसएस पान संपादित करण्याची परवानगी नाही.",
        "customjsprotected": "या पानावर इतर सदस्याची वैयक्तिक मांडणी असल्यामुळे, तुम्हाला हे 'जावास्क्रिप्ट' पान संपादित करण्याची परवानगी नाही.",
        "invalidtitle-knownnamespace": "\"$2\" नामविश्वात \"$3\" मजकूराचे अयोग्य शीर्षक",
        "invalidtitle-unknownnamespace": "अनोळखी नामविश्वाच्या आकड्यासह अवैध मथळा $1 व मजकूर \"$2\"",
        "exception-nologin": "सनोंद-प्रवेशित नाही",
-       "exception-nologin-text": "हà¥\87 à¤ªà¤¾à¤¨ à¤\95िà¤\82वा à¤\95à¥\8dरिया à¤\95रणà¥\8dयासाठà¥\80 à¤\86पलà¥\8dयाला à¤¯à¤¾ à¤µà¤¿à¤\95िवर [[Special:Userlogin|सनà¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शित]] असावयास हवे.",
+       "exception-nologin-text": "हà¥\87 à¤ªà¤¾à¤¨ à¤\95िà¤\82वा à¤\95à¥\8dरिया à¤\95रणà¥\8dयासाठà¥\80 à¤\86पलà¥\8dयाला à¤¸à¤¨à¥\8bà¤\82द- à¤ªà¥\8dरवà¥\87शित असावयास हवे.",
        "exception-nologin-text-manual": "हे पान किंवा क्रियेस पोचण्यास कृपया $1 करा.",
        "virus-badscanner": "खराब विन्यास (कॉन्फिगरेशन): अनोळखी व्हायरस स्कॅनर: ''$1''",
        "virus-scanfailed": "क्रमवीक्षण (स्कॅन) अयशस्वी (कोड $1)",
        "gotaccountlink": "सनोंद-प्रवेश करा",
        "userlogin-resetlink": "सनोंद-प्रवेश तपशील विसरला असाल तर येथे टिचकी मारा.",
        "userlogin-resetpassword-link": "आपला परवलीचा शब्द विसरलात?",
-       "userlogin-helplink2": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शासà¤\82बà¤\82धà¥\80 à¤®à¤¦à¤¤",
+       "userlogin-helplink2": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शासà¤\82बà¤\82धà¥\80 à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dय",
        "userlogin-loggedin": "आपण पुर्वीच {{GENDER:$1|$1}} म्हणून सनोंद प्रवेशित आहात.वेगळ्या सदस्यनावाने सनोंद प्रवेशासाठी खालील आवेदन वापरा.",
        "userlogin-createanother": "दुसरे नवीन खाते तयार करा",
        "createacct-emailrequired": "विपत्र पत्ता(ई-मेल)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "createacct-reason-ph": "आपण दुसरे खाते कां बनवीत आहात",
-       "createacct-captcha": "सुरक्षा तपासणी",
-       "createacct-imgcaptcha-ph": "वर दिसत असलेला मजकूर येथे टाका",
        "createacct-submit": "आपले खाते निर्माण करा",
        "createacct-another-submit": "खाते तयार करा",
        "createacct-benefit-heading": "{{SITENAME}} हे आपल्यासारख्याच लोकांनी बनविलेले आहे.",
        "createacct-benefit-body2": "{{PLURAL:$1|लेख}}",
        "createacct-benefit-body3": "अलीकडील {{PLURAL:$1|योगदानकर्ता|योगदानकर्ते}}",
        "badretype": "तुम्ही टाकलेले परवलीचे शब्द जुळत नाहीत.",
+       "usernameinprogress": "या सदस्यनावाचे खाते तयार करण्याचे काम प्रगतीपथावर आहे. कृपया थांबा.",
        "userexists": "तुम्ही टाकलेले सदस्यनाम पूर्वीच वापरात आहे.\nकृपया वेगळे सदस्यनाम निवडा.",
        "loginerror": "सनोंद-प्रवेशात चूक झाली आहे",
        "createacct-error": "खाते तयार करण्यात चुकी",
        "nosuchusershort": "\"$1\" या नावाचा सदस्य नाही. लिहीताना आपली चूक तर नाही ना झाली?",
        "nouserspecified": "तुम्हाला सदस्यनाव नमूद करावे लागेल.",
        "login-userblocked": "हा सदस्य ’प्रतिबंधित’ आहे. त्यास सनोंद-प्रवेशाची परवानगी नाही.",
-       "wrongpassword": "à¤\86पला à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\9aà¥\81à¤\95à¥\80à¤\9aा आहे, पुन्हा एकदा प्रयत्न करा.",
-       "wrongpasswordempty": "परवलà¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤°à¤¿à¤\95ामा à¤\86हà¥\87; à¤ªà¤°à¤¤ प्रयत्न करा.",
+       "wrongpassword": "à¤\86पण à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\9aà¥\81à¤\95à¥\80à¤\9aा à¤\9fाà¤\95ला आहे, पुन्हा एकदा प्रयत्न करा.",
+       "wrongpasswordempty": "परवलà¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤\95à¥\8bरा à¤\86हà¥\87; à¤ªà¥\81नà¥\8dहा प्रयत्न करा.",
        "passwordtooshort": "तुमच्या परवलीच्या शब्दात किमान {{PLURAL:$1|१ अक्षर |$1 अक्षरे}} हवीत.",
+       "passwordtoolong": "परवलीचा शब्द हा {{PLURAL:$1|१ वर्ण पेक्षा|$1 वर्णांपेक्षा}} लांबीचा नको.",
+       "passwordtoopopular": "सर्वसामान्यपणे वापरण्यात येणारे परवलीचे शब्द वापरल्या जाऊ शकत नाहीत.कृपया अधिक अनन्य शब्द वापरा.",
        "password-name-match": "आपला परवलीचा शब्द हा आपल्या सदस्यनावापेक्षा वेगळा हवा.",
        "password-login-forbidden": "या सदस्यनामाचा व परवलीच्या शब्दाचा वापर निषिद्ध आहे.",
        "mailmypassword": "नवीन परवलीचा शब्द पुनर्स्थापित(रिसेट) करा",
-       "passwordremindertitle": "{{SITENAME}}करिता नवा तात्पुरता परवलीचा शब्दांक.",
+       "passwordremindertitle": "{{SITENAME}}करिता नवा तात्पुरता परवलीचा शब्द",
        "passwordremindertext": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 कडून) {{SITENAME}} करिता ’नवा परवलीचा शब्दांक पाठवावा’ अशी विनंती केली आहे ($4).\n\"$2\" सदस्याकरिता तात्पुरता परवलीचा शब्दांक \"$3\" झाला आहे.\nतुम्ही आता प्रवेश करा व तुमचा परवलीचा शब्दांक बदला. तुमचा अस्थायी शब्दांक {{PLURAL:$5|एका दिवसात|$5 दिवसांत}} मृत होईल.\n\nजर ही विनंती इतर कुणी केली असेल किंवा तुम्हाला तुमचा परवलीचा शब्दांक आठवला असेल आणि तुम्ही तो आता बदलू इच्छित नसाल तर, तुम्ही हा संदेश दुर्लक्षित करून जुना परवलीचा शब्दांक वापरत राहू शकता.",
        "noemail": "\"$1\" सदस्याच्या कोणत्याही विपत्रपत्त्याची(ई-मेल)नोंद नाही.",
        "noemailcreate": "आपण वैध विरोप-पत्ता (ई-मेल ऍड्रेस) देणे आवश्यक आहे.",
        "eauthentsent": "नमूद केलेल्या ई-मेल पत्त्यावर एक निश्चितता स्वीकारक ई-मेल पाठविला गेला आहे.\nखात्यावर कोणताही इतर ई-मेल पाठविण्यापूर्वी - तो ई-मेल पत्ता तुमचाच आहे, हे सुनिश्चित करण्यासाठी - तुम्हाला त्या ई-मेल मधील सूचनांचे पालन करावे लागेल.",
        "throttled-mailpassword": "मागील {{PLURAL:$1|तासात|$1 तासांत}} परवलीचा शब्द बदलण्यासाठीची सूचना विपत्राद्वारे पाठविलेली आहे. दुरुपयोग टाळण्यासाठी, {{PLURAL:$1|एका तासामध्ये|$1 तासांमध्ये}} फक्त एकदाच सूचना दिली जाईल.",
        "mailerror": "विपत्र पाठवण्यात त्रुटी: $1",
-       "acct_creation_throttle_hit": "माफ à¤\95रा, à¤¤à¥\81मà¥\8dहà¥\80 à¤\86तà¥\8dतापरà¥\8dयà¤\82त {{PLURAL:$1|१ à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 à¤\86हà¥\87|$1 à¤\96ातà¥\80 à¤\89à¤\98डलà¥\80 à¤\86हà¥\87त}}. à¤¤à¥\81मà¥\8dहाला à¤\86णà¤\96à¥\80 à¤\96ातà¥\80 उघडता येणार नाहीत.",
+       "acct_creation_throttle_hit": "à¤\86पला à¤\85à¤\82à¤\95पतà¥\8dता à¤µà¤¾à¤ªà¤°à¥\81न à¤¯à¤¾ à¤µà¤¿à¤\95िस à¤­à¥\87à¤\9f à¤¦à¥\87णाऱà¥\8dयाà¤\82नà¥\80 à¤\95ाल {{PLURAL:$1|१ à¤\96ातà¥\87|$1 à¤\96ातà¥\80}} à¤\89à¤\98डलà¥\80 à¤\86हà¥\87त à¤¤à¥\80 à¤¯à¤¾ à¤\95ालावधà¥\80तà¥\80ल à¤®à¤¹à¤¤à¥\8dतम à¤\86हà¥\87त.\n\nतà¥\8dयाà¤\9aा à¤ªà¤°à¤¿à¤ªà¤¾à¤\95 à¤®à¥\8dहणà¥\82न à¤¸à¤§à¥\8dया à¤¹à¤¾ à¤\85à¤\82à¤\95पतà¥\8dता à¤µà¤¾à¤ªà¤°à¥\81न à¤­à¥\87à¤\9f à¤¦à¥\87णाऱà¥\8dयास à¤\85धिà¤\95 à¤\96ातà¥\87 उघडता येणार नाहीत.",
        "emailauthenticated": "तुमचा विपत्रपत्ता $2 ला $3 यावेळी तपासण्यात आला आहे.",
        "emailnotauthenticated": "तुमच्या ई-मेल पत्त्याची अद्याप निश्चिती झालेली नाही. खालील कोणत्याही फिचर्ससाठी ई-मेल पाठविला जाणार नाही.",
        "noemailprefs": "खालील सुविधा कार्यान्वित करण्यासाठी,पसंतीक्रमात ई-मेल पत्ता नमूद करा.",
        "createaccount-text": "तुमचा विपत्र पत्ता घेउन {{SITENAME}} ($4)वर \"$2\" नावाच्या कोण्या एकाने \"$3\" परवलीने खाते उघडले आहे. कृपया आपण सनोंद-प्रवेश करून आपला परवलीचा शब्द बदलावा.\n\nजर ही खातेनोंदणी चुकिने झाली असेल तर, तुम्ही या संदेशाकडे दुर्लक्ष करू शकता.",
        "login-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेकानेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
        "login-abort-generic": "तुमचा प्रवेश अयशस्वी होऊन रद्द झाला.",
+       "login-migrated-generic": "आपल्या खात्याचे स्थलांतर झाले आहे,या विकिवर आपले सदस्यनाव आता यापुढे अस्तित्वात राहणार नाही.",
        "loginlanguagelabel": "भाषा: $1",
        "suspicious-userlogout": "तुमच्या सनोंद-निर्गमनास नकार दिल्या गेला कारण असे दिसते की ती विनंती अन-अनुबंधित(डिसकनेक्टेड) न्याहाळकाद्वारे पाठवल्या गेली.",
        "createacct-another-realname-tip": "आपले खरे नाव टाकणे वैकल्पिक आहे.\nजर आपण ते द्यायचे ठरविले तर,ते आपल्या कामाचा मूळ स्रोत म्णून देण्यास वापरले जाईल.",
        "pt-createaccount": "खाते बनवा",
        "pt-userlogout": "सनोंद-निर्गम",
        "php-mail-error-unknown": "पीएचपीच्या विपत्र() पर्यायात अज्ञात चूक",
-       "user-mail-no-addy": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dया à¤µà¤¿à¤¨à¤¾ à¤\88मà¥\87ल à¤ªà¤¾à¤ à¤µà¤£à¥\8dयà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95à¥\87ला",
+       "user-mail-no-addy": "à¤\88मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dया à¤µà¤¿à¤¨à¤¾ à¤\88मà¥\87ल à¤ªà¤¾à¤ à¤µà¤¿à¤£à¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95à¥\87ला.",
        "user-mail-no-body": "रिकामे किंवा अत्यंत छोटा मजकूर असलेले विपत्र पाठविण्याचा प्रयत्न करण्यात आला",
        "changepassword": "परवलीचा शब्द बदला",
-       "resetpass_announce": "à¤\96ातà¥\8dयामधà¥\8dयà¥\87 à¤ªà¥\8dरविषà¥\8dà¤\9f à¤¹à¥\8bणà¥\87 à¤¥à¤¾à¤\82बविणà¥\8dयाà¤\95रिता à¤\95à¥\83पया à¤\86पलà¥\8dया à¤\96ातà¥\8dयाà¤\9aा à¤\95à¥\82à¤\9fशबà¥\8dद à¤¬à¤¦à¤²ा.",
+       "resetpass_announce": "सनà¥\8bà¤\82द à¤ªà¥\8dरवà¥\87श à¤ªà¥\82रà¥\8dण à¤\95रणà¥\8dयाà¤\95रिता à¤\95à¥\83पया à¤\86पला à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद à¤ªà¥\81नरà¥\8dसà¥\8dथापित à¤\95रा.",
        "resetpass_text": "<!-- मजकूर इथे लिहा -->",
        "resetpass_header": "खात्याचा परवलीचा शब्द बदला",
        "oldpassword": "जुना परवलीचा शब्दः",
        "resetpass-submit-loggedin": "परवलीचा शब्द बदला",
        "resetpass-submit-cancel": "रद्द करा",
        "resetpass-wrong-oldpass": "अवैध किंवा अस्थायी परवलीचा शब्द.\nकदाचित तुम्ही आधीच तो यशस्वीरीत्या बदलला असेल किंवा नवीन तात्पुरता परवलीचा शब्द मागवला असेल.",
+       "resetpass-recycled": "सध्याच्या परवलीच्या शब्दापेक्षा काहीतरी वेगळ्या परवलीच्या शब्दाची पुनर्स्थापना करा.",
+       "resetpass-temp-emailed": "विप्त्राद्वारे पाठविलेल्या तात्पुरत्या संकेताने आपण प्रवेश घेतला.सनोंद प्रवेश पूर्ण करण्यास, आपण येथे नविन परवलीच्या शब्दाची स्थापना करावयास हवी:",
        "resetpass-temp-password": "तात्पुरता परवलीचा शब्द",
        "resetpass-abort-generic": "परवलीचा शब्दबदल विस्तारकाद्वारे नाकारण्यात आला.",
+       "resetpass-expired": "आपला परवलीचा शब्द संपुष्टात आला.कृपया प्रवेशास नविन परवलीचा शब्द स्थापा.",
+       "resetpass-expired-soft": "आपला परवलीचा शब्द संपुष्टात आला असुन त्याची पुनर्स्थापना करणे आवश्यक आहे. कृपया आता  नविन परवलीचा शब्द निवडा किंवा नंतर पुनर्स्थापना करण्यास \"{{int:resetpass-submit-cancel}}\" येथे टिचका.",
+       "resetpass-validity-soft": "आपला परवलीचा शब्द वैध नाही:$1\n\nकृपया नविन परवलीचा शब्द निवडा किंवा नंतर पुनर्स्थापना करण्यास \"{{int:resetpass-submit-cancel}}\" येथे टिचका.",
        "passwordreset": "परवलीचा शब्द पूर्ववत करा",
        "passwordreset-text-one": "आपला परवलीचा शब्द बदलण्यास हे आवेदन भरा.",
        "passwordreset-text-many": "{{PLURAL:$1|आपला तात्पुरता परवलीचा शब्द विपत्रामार्फत प्राप्त करण्यास खालील क्षेत्रातील एखादे भरा.}}",
        "passwordreset-emailtext-ip": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 वरुन) {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\"$2\"\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "passwordreset-emailtext-user": " {{SITENAME}}वरील सदस्य $1ने {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\n\"$2\"\n\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व, जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "passwordreset-emailelement": "सदस्यनाव: \n$1\n\nअस्थायी परवलीचा शब्द: \n$2",
-       "passwordreset-emailsent": "जर हा आपल्या खात्याचा नोंदणिकृत विपत्रपत्ता असेल तर, परवलीच्या शब्दाच्या पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात येईल.",
+       "passwordreset-emailsentemail": "जर हा आपल्या खात्याचा नोंदणिकृत विपत्रपत्ता असेल तर, परवलीच्या शब्दाच्या पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात येईल.",
+       "passwordreset-emailsentusername": "जर तदनुरूप नोंदीकृत विपत्रपत्ता असेल तर, परवलीचा शब्द पुनर्स्थापन विपत्र पाठविल्या जाईल.",
        "passwordreset-emailsent-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र पाठवण्यात आले आहे जे खाली दर्शविण्यात आले आहे.",
        "passwordreset-emailerror-capture": "'परवलीचा शब्द' पुनर्स्थापनेबाबत एक विपत्र निर्माण करण्यात आले, जे खाली दर्शविण्यात आले आहे.परंतु,{{GENDER:$2|सदस्य}}ला पाठविणे असफल झाले: $1",
        "changeemail": "विपत्रपत्ता बदला किंवा हटवा",
        "changeemail-header": "आपला विपत्रपत्ता बदलण्यास हे आवेदन पूर्ण करा.जर आपणास आपल्या खात्याशी संलग्न कोणताही विपत्रपत्ता हटवायचा असेल तर,आवेदन सादर करण्यापूर्वी, नविन विपत्रपत्त्यासाठी असलेली जागा कोरी ठेवा.",
-       "changeemail-passwordrequired": "हà¥\87 à¤¬à¤¦à¤² à¤¨à¤\95à¥\8dà¤\95à¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86पणास à¤\86पला à¤¸à¤\82à¤\95à¥\87ताà¤\82à¤\95 टाकावा लागेल.",
+       "changeemail-passwordrequired": "हà¥\87 à¤¬à¤¦à¤² à¤¨à¤\95à¥\8dà¤\95à¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86पणास à¤\86पला à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद टाकावा लागेल.",
        "changeemail-no-info": "हे पान थेट बघण्यासठी तुम्हाला सनोंद-प्रवेशित असावे लागेल.",
        "changeemail-oldemail": "सध्याचा ईमेल पत्ता :",
        "changeemail-newemail": "नवा ईमेल पत्ता:",
+       "changeemail-newemail-help": "जर आपणास आपला विपत्रपत्ता(ई-मेल एड्रेस) हटवायचा असेल तर हे क्षेत्र आपण कोरे ठेवावयास हवे. जर आपण आपला विपत्रपत्ता हटविला तर, आपण विसरलेला परवलीचा शब्द पुनर्स्थापित करु शकणार नाही व या विकिवरुन आपणास विपत्रे प्राप्त होणार नाहीत.",
        "changeemail-none": "(काहीही नाही)",
-       "changeemail-password": "तà¥\81मà¤\9aा {{SITENAME}} à¤¸à¤\82à¤\95à¥\87ताà¤\82à¤\95:",
+       "changeemail-password": "तà¥\81मà¤\9aा {{SITENAME}} à¤ªà¤°à¤µà¤²à¥\80à¤\9aा à¤¶à¤¬à¥\8dद:",
        "changeemail-submit": "ईमेल बदला",
        "changeemail-throttled": "तुम्ही नुकतेच सनोंद- प्रवेशासाठी अनेक प्रयत्न केले आहेत.\nकृपया, पुन्हा प्रयत्न करण्याआधी $1 थोडी उसंत घ्या.",
+       "changeemail-nochange": "कृपया  वेगळा नविन विपत्रपत्ता टाका.",
        "resettokens": "ओळखचिन्ह(टोकन) पुनर्स्थापित करा",
        "resettokens-text": "येथे आपल्या खात्यात असलेला व्यक्तिगत मजकूरापर्यंत पोचण्यासाठी आपण ओळखचिन्ह(टोकन) पुनर्स्थापित करू शकता.\nआपण जर तो अपघाताने कोणासमवेत सहभागीला असेल किंवा आपले खात्याची आपण तडजोड केली असल्यास, हे करावयास हवे.",
        "resettokens-no-tokens": "पुनर्स्थापित करण्यासाठी कोणतीही ओळखचिन्हे नाहीत.",
        "resettokens-tokens": "ओळखचिन्हे:",
        "resettokens-token-label": "$1 (सद्य मुल्य: $2)",
-       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पलà¥\8dया à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82मधà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\9aा]] à¤µà¥\87ब à¤°à¤¸à¤¦ à¤¬à¤¿à¤²à¥\8dला (ॲटम/आरएसएस)",
+       "resettokens-watchlist-token": "[[Special:Watchlist|à¤\86पलà¥\8dया à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषणसà¥\82à¤\9aà¥\80तà¥\80ल à¤ªà¤¾à¤¨à¤¾à¤\82मधà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\9aा]] à¤µà¥\87ब à¤°à¤¸à¤¦ à¤¬à¤¿à¤²à¥\8dला (à¤\85à¥\85टम/आरएसएस)",
        "resettokens-done": "ओळखचिन्हे पुनर्स्थापन.",
        "resettokens-resetbutton": "निवडलेली ओळखचिन्हे पुनर्स्थापित करा",
        "bold_sample": "ठळक मजकूर",
        "preview": "झलक",
        "showpreview": "झलक दाखवा",
        "showdiff": "बदल दाखवा",
+       "blankarticle": "<strong>ईशारा:</strong>आपण तयार करीत असलेले पान कोरे आहे.जर आपण पुन्हा \"{{int:savearticle}}\" टिचकले तर,कोणताही आशय/मजकूर नसलेले पान तयार होईल.",
        "anoneditwarning": "<strong>इशारा:</strong> तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेले नाही.आपण काही संपादन केले तर, तुमचा अंकपत्ता (आयपी) सार्वजनिक रित्या दृष्य होईल. जर आपण <strong>[$1 सनोंद प्रवेश केला]</strong> किंवा <strong>[$2 खाते उघडले]</strong>,तर आपण केलेली संपादने ही आपल्या नांवाशी संलग्न होतील, त्याशिवाय याचे इतरही फायदे आहेत.",
        "anonpreviewwarning": "\"'''सावधान:''' तुम्ही विकिपीडियाचे सदस्य म्हणून सनोंद-प्रवेश (लॉग-इन) केलेला नाही. या पानाच्या संपादन इतिहासात तुमचा अंकपत्ता (आय.पी. ॲड्रेस) नोंदला जाईल.\"",
        "missingsummary": "'''आठवण:''' आपण संपादन सारांश पुरवलेला नाही.आपण 'जतन करा' वर पुन्हा टिचकी मारली तर, ते त्याशिवायच जतन होईल.",
+       "selfredirect": "<strong>ईशारा:</strong>आपण या पानास, त्याच पानावर पुनर्निर्देशित करीता आहात.\nआपण पुनर्निर्देशनासाठी चूकिचे लक्ष्य नमूद केले आहे किंवा आपण चूकिच्या पानाचे संपादन करीत आहात.\nजर आपण पुन्हा \"{{int:savearticle}}\" टिचकले तर, कसेहीकरुन ते पुनर्निर्देशन तयार होईल.",
        "missingcommenttext": "कृपया खाली प्रतिक्रिया भरा.",
        "missingcommentheader": "<strong>आठवण:<strong> आपण या लेखनाकरिता विषय दिलेला नाही. आपण पुन्हा \"{{int:savearticle}}\" वर टिचकले तर, तुमचे संपादन त्याशिवायच जतन होईल.",
        "summary-preview": "आढाव्याची झलक:",
        "subject-preview": "विषय झलक:",
+       "previewerrortext": "आपल्या बदलांची झलक बघण्याचे प्रयत्नादरम्यान त्रुटी उद्भवली.",
        "blockedtitle": "हा सदस्य प्रतिबंधित आहे",
        "blockedtext": "'''तुमचे सदस्यनाव अथवा IP पत्ता ब्लॉक केलेला आहे.'''\n\nहा ब्लॉक $1 यांनी केलेला आहे.\nयासाठी ''$2'' हे कारण दिलेले आहे.\n\n* ब्लॉकची सुरूवात: $8\n* ब्लॉकचा शेवट: $6\n* कुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही ह्या ब्लॉक संदर्भातील चर्चेसाठी $1 अथवा [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकांशी]] संपर्क करू शकता.\nतुम्ही जोवर वैध ई-मेल पत्ता आपल्या [[Special:Preferences|'माझ्या पसंती']] पानावर देत नाही तोवर तुम्ही ’सदस्याला ई-मेल पाठवा’ हा दुवा वापरू शकत नाही. तसेच असे करण्यापासून आपल्याला ब्लॉक केलेले नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे.\nकृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "autoblockedtext": "तुमचा आंतरजालीय अंकपत्ता आपोआप स्थगित केला आहे कारण तो इतर अशा सदस्याने वापरला, ज्याला $1ने प्रतिबंधित केले.\nआणि दिलेले कारण खालील प्रमाणे आहे\n:''$2''\nब्लॉकची सुरूवात: $8\nब्लॉकचा शेवट: $6\nकुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही $1शी संपर्क करू शकता किंवा इतर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकां पैकी]] एकाशी स्थगनाबद्दल चर्चा करू शकता.\n\n[[Special:Preferences|सदस्य पसंतीत]]त शाबीत विपत्र पत्ता नमूद असल्या शिवाय आणि तुम्हाला  तो वापरण्या पासून प्रतिबंधित केले असल्यास तुम्ही  \"या सदस्यास विपत्र पाठवा\" सुविधा  वापरू शकणार नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे. \nतुमचा स्थगन क्र $5 आहे. कृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "accmailtitle": "परवलीचा शब्द पाठविण्यात आलेला आहे.",
        "accmailtext": "[[User talk:$1|$1]] यांसाठी अनियतक्रमाने निर्मित केलेला परवलीचा शब्द $2 यांना पाठवण्यात आला आहे.\n\nया नवीन खात्यासाठीचा परवलीचा शब्द,सनोंद-प्रवेश घेतल्यावर [[Special:ChangePassword|परवलीचा शब्द बदला]] येथे बदलता येईल.",
        "newarticle": "(नवीन लेख)",
-       "newarticletext": "तà¥\81मà¥\8dहाला à¤\85पà¥\87à¤\95à¥\8dषित à¤\85सलà¥\87ला à¤²à¥\87à¤\96 à¤\85à¤\9cà¥\82न à¤²à¤¿à¤¹à¤¿à¤²à¤¾ à¤\97à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80. à¤¹à¤¾ à¤²à¥\87à¤\96 à¤²à¤¿à¤¹à¤¿à¤£à¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤ªà¥\87à¤\9fà¥\80त à¤®à¤\9cà¤\95à¥\82र à¤²à¤¿à¤¹à¤¾. à¤®à¤¦à¤¤à¥\80साठà¥\80 [$1 à¤¯à¥\87थà¥\87] à¤\9fिà¤\9aà¤\95à¥\80 à¤¦à¥\8dया.\n\nà¤\9cर à¤¯à¥\87थà¥\87 à¤\9aà¥\81à¤\95à¥\82न à¤\86ला à¤\85साल à¤¤à¤° à¤¬à¥\8dराà¤\89à¤\9dरà¤\9aà¥\8dया à¤¬à¥\85à¤\95 (back) कळीवर टिचकी द्या.",
+       "newarticletext": "à¤\86पण à¤¸à¤§à¥\8dया à¤\85सà¥\8dतितà¥\8dतà¥\8dवात à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया à¤¦à¥\81वà¥\8dयाà¤\9aा à¤®à¤¾à¤\97à¥\8bवा à¤\98à¥\87त à¤\86ला à¤\86हात.\nहà¥\87 à¤ªà¤¾à¤¨ à¤¨à¤µà¥\8dयानà¥\87 à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤ªà¥\87à¤\9fà¥\80त à¤\9fà¤\82à¤\95न à¤\95रणà¥\87 à¤¸à¥\81रà¥\81 à¤\95रा(à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80साठà¥\80 [$1 à¤¸à¤¾à¤¹à¤¾à¤¯à¥\8dय à¤ªà¤¾à¤¨] à¤¬à¤\98ा).\n\nà¤\9cर à¤\86पण à¤¯à¥\87थà¥\87 à¤\9aà¥\81à¤\95à¥\82न à¤\86ला à¤\85साल à¤¤à¤° à¤¬à¥\8dराà¤\89à¤\9dरà¤\9aà¥\8dया  <strong>परत</strong>(बà¥\85à¤\95) कळीवर टिचकी द्या.",
        "anontalkpagetext": "---- ''हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत. त्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. जर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:UserLogin| खाते तयार करा]] किंवा [[Special:UserLogin/signup|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.''",
-       "noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}} लिहू शकता]</span>.",
+       "noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}}संपादू शकता]</span>.",
        "noarticletext-nopermission": "सध्या या लेखात  काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये [[Special:Search/{{PAGENAME}}| या मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
        "missing-revision": "\"{{FULLPAGENAME}}\" या लेखाचे #$1 हे संस्करण अस्तित्वात नाही.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे असे होते.याबाबत विस्तृत माहिती  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी]येथे बघता येईल.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" सदस्य खात्याची नोंद नाही. कृपया हे पान तुम्ही संपादित किंवा नव्याने तयार करू इच्छिता काय याबद्दल विचार करा.",
        "userpage-userdoesnotexist-view": "सदस्यखाते \"$1\"  हे नोंदलेले नाही.",
-       "blocked-notice-logextract": "हा à¤¸à¤¦à¤¸à¥\8dय à¤¸à¤§à¥\8dया à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87.\nसरà¥\8dवाà¤\82त à¤¨à¤µà¥\80न à¤ªà¥\8dरतिबà¤\82धन à¤¯à¤¾à¤¦à¥\80 à¤\96ाली संदर्भासाठी दिली आहे:",
+       "blocked-notice-logextract": "हा à¤¸à¤¦à¤¸à¥\8dय à¤¸à¤§à¥\8dया à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87.\nà¤\96ालà¥\80, à¤¸à¤°à¥\8dवाà¤\82त à¤¨à¤µà¥\80नतम à¤ªà¥\8dरतिबà¤\82धन à¤¨à¥\8bà¤\82दपà¥\8dरविषà¥\8dà¤\9fी संदर्भासाठी दिली आहे:",
        "clearyourcache": "'''सूचना:''' जतन केल्यावर बदल दिसण्यासाठी तुम्हाला कदाचित न्याहाळकाची सय टाळायला लागेल. असे करण्यासाठी - \n\n*'''फायरफॉक्स / सफारी:''' साठी ''Reload'' हे टिचकतांना ''Shift'' ही कळ दाबून ठेवा, किंवा ''Ctrl-F5'' अथवा ''Ctrl-R'' कळा एकत्रितपणे दाबा (मॅकसाठी ''⌘-R'').\n\n*'''गूगल क्रोम:''' साठी ''Ctrl-Shift-R'' कळा एकत्रितपणे दाबा (मॅकसाठी ''⌘-Shift-R'')\n\n*'''इंटरनेट एक्सप्लोअरर:''' ''Refresh'' करतांना ''Ctrl'' कळ दाबून ठेवा, किंवा त्याऐवजी ''Ctrl-F5'' दाबा.\n\n*'''कॉन्क्वरर:''' '''Reload''' दाबा किंवा ''F5'' दाबा\n\n*'''ऑपेरा:''' ''Tools → Preferences'' मधून सय रिकामी करा",
        "usercssyoucanpreview": "'''टीप:'''तुमचे नवे सीएसएस जतन करण्यापूर्वी 'झलक पहा' कळ वापरा.",
        "userjsyoucanpreview": "'''टीप:''' तुमचा नवा जावास्क्रिप्ट जतन करण्यापूर्वी 'झलक पहा' कळ वापरा.",
        "token_suffix_mismatch": "'''तुमचे संपादन रद्द करण्यात आलेले आहे कारण तुमच्या क्लायंटनी तुमच्या संपादनातील उद्गारवाचक चिन्हांमध्ये (punctuation) बदल केलेले आहेत.\nपानातील मजकूर खराब होऊ नये यासाठी संपादन रद्द करण्यात आलेले आहे.\nअसे कदाचित तुम्ही अनामिक proxy वापरत असल्याने होऊ शकते.'''",
        "edit_form_incomplete": "'''तुमच्या संपादनाचा काही भाग सर्व्हरपर्यंत पोचला नाही; तुमचे संपादन पूर्ण आहे का याची पुन्हा खात्री करा व पुन्हा प्रयत्न करा.'''",
        "editing": "$1 चे संपादन होत आहे.",
-       "creating": "$1 à¤¯à¤¾ à¤²à¥\87à¤\96ाà¤\9aà¥\80 à¤¨à¤¿à¤°à¥\8dमितà¥\80 à¤¸à¥\81रà¥\82 à¤\86हà¥\87",
+       "creating": "$1 ची निर्मिती सुरू आहे",
        "editingsection": "$1 (विभाग) संपादन",
        "editingcomment": "$1 चे संपादन (प्रतिक्रिया)",
        "editconflict": "संपादन मतभेद: $1",
-       "explainconflict": "तà¥\81मà¥\8dहà¥\80 à¤¸à¤\82पादनाला à¤¸à¥\81रà¥\82वात à¤\95à¥\87लà¥\8dयानà¤\82तर à¤\87तर à¤\95à¥\8bणà¥\80तरà¥\80 à¤¬à¤¦à¤² à¤\95à¥\87ला à¤\86हà¥\87.\nवरà¥\80ल à¤ªà¤¾à¤ à¥\8dयभाà¤\97ामधà¥\8dयà¥\87 à¤¸à¤§à¥\8dया à¤\85सà¥\8dतिवात à¤\85सलà¥\87लà¥\8dया à¤ªà¥\83षà¥\8dठातà¥\80ल à¤ªà¤¾à¤ à¥\8dय à¤\86हà¥\87, à¤¤à¤° à¤¤à¥\81मà¤\9aà¥\87 à¤¬à¤¦à¤² à¤\96ालà¥\80ल à¤ªà¤¾à¤ à¥\8dयभाà¤\97ात à¤¦à¤°à¥\8dशविलà¥\87लà¥\87 à¤\86हà¥\87त.\nतà¥\81मà¥\8dहाला à¤¹à¥\87 à¤¬à¤¦à¤² à¤¸à¤§à¥\8dया à¤\85सà¥\8dतिवात à¤\85सणाऱà¥\8dया à¤ªà¤¾à¤ à¥\8dयासà¥\8bबत à¤\8fà¤\95तà¥\8dरित à¤\95रावà¥\87 à¤²à¤¾à¤\97तà¥\80ल.\n'''à¤\95à¥\87वळ''' à¤µà¤°à¥\80ल à¤ªà¤¾à¤ à¥\8dयभाà¤\97ामधà¥\8dयà¥\87 à¤\85सलà¥\87लà¥\87 à¤ªà¤¾à¤ à¥\8dय à¤¸à¤¾à¤ à¤µà¤¿à¤£à¥\8dयात à¤¯à¥\87à¤\88ल à¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 \"{{int:savearticle}}\" à¤¹à¥\80 à¤\95ळ à¤¦à¤¾à¤¬à¤²à¥\80.",
+       "explainconflict": "à¤\86पण à¤¸à¤\82पादनाला à¤¸à¥\81रà¥\82वात à¤\95à¥\87लà¥\8dयानà¤\82तर à¤\87तर à¤\95à¥\8bणà¥\80तरà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤¤ à¤¬à¤¦à¤² à¤\95à¥\87ला à¤\86हà¥\87.\nयातà¥\80ल à¤µà¤°à¤\9aà¥\8dया à¤ªà¤¾à¤ à¥\8dयभाà¤\97ामधà¥\8dयà¥\87 à¤¸à¤§à¥\8dया à¤\85सà¥\8dतिवात à¤\85सलà¥\87लà¥\8dया à¤ªà¥\83षà¥\8dठातà¥\80ल à¤ªà¤¾à¤ à¥\8dय à¤\86हà¥\87. à¤\86पलà¥\87 à¤¬à¤¦à¤² à¤¹à¥\87 à¤\96ालà¤\9aà¥\8dया à¤¬à¤¾à¤\9cà¥\82तà¥\80ल à¤ªà¤¾à¤ à¥\8dयभाà¤\97ात à¤¦à¤°à¥\8dशविलà¥\87लà¥\87 à¤\86हà¥\87त.\nà¤\86पलà¥\8dयाला à¤¹à¥\87 à¤¬à¤¦à¤² à¤¸à¤§à¥\8dया à¤\85सà¥\8dतिवात à¤\85सणाऱà¥\8dया à¤ªà¤¾à¤ à¥\8dयासà¥\8bबत à¤\8fà¤\95तà¥\8dरित à¤\95रावà¥\87 à¤²à¤¾à¤\97तà¥\80ल.\nà¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 \"{{int:savearticle}}\" à¤¹à¥\80 à¤\95ळ à¤¦à¤¾à¤¬à¤²à¥\80 à¤¤à¤°,'''à¤\95à¥\87वळ''' à¤µà¤°à¤\9aà¥\8dया à¤ªà¤¾à¤ à¥\8dयभाà¤\97ामधà¥\8dयà¥\87 à¤\85सलà¥\87लà¥\87 à¤ªà¤¾à¤ à¥\8dयà¤\9a à¤¸à¤¾à¤ à¤µà¤¿à¤£à¥\8dयात à¤¯à¥\87à¤\88ल .",
        "yourtext": "तुमचा मजकूर",
        "storedversion": "साठविलेली आवृत्ती",
        "nonunicodebrowser": "'''सावधान: तुमचा न्याहाळक युनिकोड आधारित नाही. ASCII नसलेली  अक्षरचिन्हे संपादन खिडकीत सोळाअंकी कूटसंकेत (हेक्झाडेसीमल कोड) स्वरूपात दिसण्याची, सुरक्षितपणे संपादन करू देणारी,  पळवाट उपलब्ध आहे.'''",
        "yourdiff": "फरक",
        "copyrightwarning": "{{SITENAME}} येथे केलेले कोणतेही लेखन $2 (अधिक माहितीसाठी $1 पहा) अंतर्गत मुक्त उद्घोषित केले आहे असे गृहीत धरले जाईल याची कृपया नोंद घ्यावी. आपणास आपल्या लेखनाचे मुक्त संपादन आणि मुक्त वितरण होणे पसंत नसेल तर येथे संपादन करू नये.<br />\nतुम्ही येथे लेखन करताना हे सुद्धा गृहीत धरलेले असते की येथे केलेले लेखन तुमचे स्वतःचे आणि केवळ स्वतःच्या प्रताधिकार (कॉपीराईट) मालकीचे आहे किंवा प्रताधिकाराने गठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात. '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
        "copyrightwarning2": "{{SITENAME}} येथे केलेले कोणतेही लेखन हे इतर संपादकांकरवी बदलले अथवा काढले जाऊ शकते. जर आपणास आपल्या लेखनाचे मुक्त संपादन होणे पसंत नसेल तर येथे संपादन करू नये.<br />\nतुम्ही येथे लेखन करताना हे सुद्धा गृहीत धरलेले असते की येथे केलेले लेखन तुमचे स्वतःचे आणि केवळ स्वतःच्या प्रताधिकार (कॉपीराईट) मालकीचे आहे किंवा प्रताधिकाराने गठित न होणाऱ्या सार्वजनिक ज्ञानक्षेत्रातून घेतले आहे किंवा तत्सम मुक्त स्रोतातून घेतले आहे. तुम्ही संपादन करताना तसे वचन देत आहात (अधिक माहितीसाठी $1 पहा). '''प्रताधिकारयुक्त लेखन सुयोग्य परवानगीशिवाय मुळीच चढवू/भरू नये!'''",
-       "longpageerror": "त्रूटी:आपण दिलेला मजकूर जास्तीत जास्त शक्य {{PLURAL:$2|one किलोबाईट|$2 किलोबाईट}} पेक्षा अधिक लांबीचा {{PLURAL:$1|one किलोबाईट|$1 किलोबाईट}} आहे.तो जतन केला जाऊ शकत नाही",
+       "editpage-cannot-use-custom-model": "या पानाचा आशय-आराखडा(कंटेन्ट मॉडेल) बदलता येणार नाही.",
+       "longpageerror": "<strong>त्रुटी:आपण दिलेला मजकूर जास्तीत जास्त शक्य {{PLURAL:$2|१ किलोबाईट पेक्षा|$2 किलोबाईट पेक्षा}}  अधिक लांबीचा {{PLURAL:$1|१ किलोबाईट|$1 किलोबाईट}} आहे.</strong>\nतो जतन केला जाऊ शकत नाही.",
        "readonlywarning": "'''सावधान:विदागारास अनुरक्षणासाठी(मेंटेनन्स) ताळे ठोकले आहे,त्यामुळे सध्याच तुम्ही तुमचे संपादन जतन करू शकत नाही.'''\nजर तुम्हाला हवे असेल तर नंतर उपयोग करण्याच्या दृष्टीने, तुम्ही मजकूर नक्कल करुन, पुढील संपादनासाठी ’मजकुर संचिकेत’(टेक्स्ट फाईल)चिटकवू शकता.\nविदागारास ताळे ठोकलेल्या प्रचालकांनी खालील स्पष्टीकरण दिले आहे:$1",
        "protectedpagewarning": "'''सूचना: हे सुरक्षित पान आहे. फक्त प्रचालक याच्यात बदल करू शकतात.'''",
        "semiprotectedpagewarning": "'''सूचना:''' हे पान सुरक्षित आहे. फक्त नोंदणीकृत सदस्य याच्यात बदल करू शकतात.",
-       "cascadeprotectedwarning": "'''ताकिद:''' हे पान निम्न-लिखीत निपतन-प्रतिबंधीत {{PLURAL:$1|पानात|पानांत}} आंतरभूत असल्यामुळे,केवळ प्रचालक सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
-       "titleprotectedwarning": "”’सावधान: फक्त काही सदस्यानांच [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावे म्हणून ह्या पानास ताळे आहे.'''",
+       "cascadeprotectedwarning": "<strong>ताकिद:</strong>हे पान निम्न-लिखीत निपतन-प्रतिबंधीत {{PLURAL:$1|पानात|पानांत}} आंतरभूत असल्यामुळे,केवळ प्रचालक-सुविधाप्राप्त सदस्यांनाच संपादन करता यावे असे ताळे त्यास ठोकलेले आहे :",
+       "titleprotectedwarning": "”’सावधान: फक्त काही सदस्यानांच [[Special:ListGroupRights|विशेष आधिकार]] तयार करता यावेत म्हणून या पानास ताळे आहे.'''",
        "templatesused": "या पानामध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "templatesusedpreview": "या झलकेमध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "templatesusedsection": "या विभागामध्ये {{PLURAL:$1|वापरलेला साचा|वापरलेले साचे}}:",
        "permissionserrors": "परवानगीस नकार",
        "permissionserrorstext": "खालील{{PLURAL:$1|कारणामुळे|कारणांमुळे}} तुम्हाला तसे करण्याची परवानगी नाही:",
        "permissionserrorstext-withaction": "तुम्हाला $2 क्रियेची परवानगी नाही, खालील {{PLURAL:$1|कारणासाठी|कारणांसाठी}}:",
+       "contentmodelediterror": "ही आवृत्ती आपण संपादू शकत नाही कारण त्याचा आशय-आराखडा (कंटेन्ट मॉडेल)<code>$1</code> आहे व सध्याच्या पानाचा आशय आराखडा <code>$2</code> आहे.",
        "recreate-moveddeleted-warn": "'''सूचना: पूर्वी वगळलेला लेख तुम्ही पुन्हा बनवित आहात.'''\n\nआपण याचा विचार करा कि या पानाचे संपादन यापुढे करणे योग्य आहे काय.या पानाच्या वगळण्याच्या व स्थानांतराच्या नोंदी आपल्या (कामाच्या) सुलभतेसाठी दिलेल्या आहेत:",
        "moveddeleted-notice": "हे पान वगळण्यात आलेले आहे.\nसंदर्भासाठी, वगळण्याची व स्थानांतराची नोंद खाली दिलेली आहे.",
+       "moveddeleted-notice-recent": "माफ करा,हे पान अलीकडेच (मागील २४ तासात) वगळल्या गेले आहे.हा पानाच्या वगळण्याचा व हलविण्याचा लॉग संदर्भासाठी खाली दिला आहे.",
        "log-fulllog": "पूर्ण नोंदी पहा",
        "edit-hook-aborted": "हूकद्वारे संपादन रद्द.\nकारण दिलेले नाही.",
        "edit-gone-missing": "नविन पृष्ठ अद्यतन करता आले नाही. ते वगळले असण्याची शक्यता आहे.",
        "edit-conflict": "वादग्रस्त संपादन",
        "edit-no-change": "तुमचे संपादन दुर्लक्षित करण्यात आले आहे, कारण मजकूरात काहीही बदल झालेला नाही.",
-       "postedit-confirmation-created": "पान निर्मित केले",
+       "postedit-confirmation-created": "पान निर्मित केल्या गेले आहे",
+       "postedit-confirmation-restored": "हे पान पुनर्स्थापित केल्या गेले.",
        "postedit-confirmation-saved": "आपले संपादन जतन करण्यात आले आहे.",
        "edit-already-exists": "नवीन पान तयार करता येऊ शकले नाही.\nया नावाचे पान पूर्वीच अस्तित्वात आहे.",
        "defaultmessagetext": "अविचल संदेश मजकूर",
        "invalid-content-data": "अवैध माहिती",
        "content-not-allowed-here": "\"$1\" हा आशय [[$2]] लेखावर टाकण्याची अनुमती नाही.",
        "editwarning-warning": "या पानावरुन दुसर्‍या पानावर गेल्यास, तुम्ही येथे केलेले बदल जतन होणार नाहीत.\nजर आपण सनोंद-प्रवेशित असाल तर, ही सूचना घालवण्यासाठी ''{{int:prefs-editing}}'' मधील संपादनपसंतीत बदल करा.",
+       "editpage-notsupportedcontentformat-title": "आशय प्रारुप सहाय्यीकृत नाही",
        "content-model-wikitext": "विकिमजकूर",
        "content-model-text": "साधा मजकूर",
        "content-model-javascript": "जावास्क्रिप्ट",
        "content-model-css": "सीएसएस",
+       "content-json-empty-object": "रिक्त उद्दीष्ट",
+       "content-json-empty-array": "रिकामा चतुष्कोन(array)",
+       "duplicate-args-warning": "<strong>इशारा:</strong> [[:$1]] हा [[:$2]] ला \"$3\" प्राचलासाठी, एकाधिक किंमतींसमवेत हाक देत आहे.दिलेली शेवटची किंमतच वापरल्या जाईल.",
+       "duplicate-args-category": "साचास हाक देण्यात पाने द्विरुक्त कारणमीमांसा(arguments) वापरत आहेत.",
+       "duplicate-args-category-desc": "या पानात साच्याची ती हाक(calls) आहे ज्यात द्विरुक्त कारणमिमांसेचा (arguments)वापर करण्यात आला आहे,जसे<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> किंवा <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "”’इशारा:”’ या पानावर खूप सारे खर्चीक पार्सर क्रिया कॉल्स आहेत.\n\nते $2{{PLURAL:$2|कॉल|कॉल्स}} पेक्षा कमी असायला हवेत, सध्या $1{{PLURAL:$1| $1 कॉल| $1 कॉल्स}} एवढे आहेत.",
        "expensive-parserfunction-category": "खूप सारे खर्चीक पार्सर क्रिया कॉल्स असणारी पाने",
        "post-expand-template-inclusion-warning": "<strong>ईशारा:</strong> साचे वाढविण्याची मर्यादा संपलेली आहे.\nकाही साचे वगळले जातील.",
-       "post-expand-template-inclusion-category": "अशी पाने ज्यांच्यावर साचे चढविण्याची मर्यादा संपलेली आहे",
+       "post-expand-template-inclusion-category": "à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87 à¤\9cà¥\8dयाà¤\82à¤\9aà¥\8dयावर à¤¸à¤¾à¤\9aà¥\87 à¤\9aढविणà¥\8dयाà¤\9aà¥\80 à¤\86à¤\95ार à¤®à¤°à¥\8dयादा à¤¸à¤\82पलà¥\87लà¥\80 à¤\86हà¥\87",
        "post-expand-template-argument-warning": "<strong>ईशारा:</strong> या पानावर असा एकतरी साचा आहे जो वाढविल्यास खूप मोठा होईल.\nअसे साचे वगळण्यात आलेले आहेत.",
        "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-category-desc": "या पानाने उच्चतम गाठविंदूंची (node)  मोजणीमर्यादा पार केली.",
        "node-count-exceeded-warning": "लेखाची पर्वसंधि-गणना(नोड-काऊंट)मर्यादा पार झाली",
        "expansion-depth-exceeded-category": "लेख जेथे विस्तार-तळ(एक्सपांशन डेप्थ) पार केल्या गेली",
+       "expansion-depth-exceeded-category-desc": "या पानाने उच्चतम प्रसरण-खोली(expansion depth) मर्यादा पार केली.",
        "expansion-depth-exceeded-warning": "लेखाने विस्तार-तळ(एक्सपांशन डेप्थ) पार केला",
        "parser-unstrip-loop-warning": "'अनस्ट्रिप'(अरोखीत) वलय(लुप) आढळले",
        "parser-unstrip-recursion-limit": "'अनस्ट्रिप'(अरोखीत) आवर्तन मर्यादा पार झाली ($1)",
        "undo-summary-username-hidden": "अज्ञात सदस्याची $1 आवृत्ती परतवा",
        "cantcreateaccounttitle": "खाते उघडू शकत नाही",
        "cantcreateaccount-text": "('''$1''')या आंतरजाल अंकपत्त्याकडूनच्या खाते निर्मितीस [[User:$3|$3]]ने अटकाव केला आहे.\n\n$3ने ''$2'' कारण दिले आहे.",
+       "cantcreateaccount-range-text": "'''$1'''आवाक्यातील आंतरजाल अंकपत्ते,ज्यात आपल्या ('''$4''') या अंकपत्त्याचा समावेश आहे, [[User:$3|$3]] ने त्यांच्या खाते निर्मितीस प्रतिबंध केला आहे.\n\n$3 ने ''$2''कारण दिले आहे.",
        "viewpagelogs": "या पानाच्या नोंदी पहा",
-       "nohistory": "या à¤ªà¥\83षà¥\8dठासाठà¥\80 à¤\86वà¥\83तà¥\8dतà¥\80 इतिहास अस्तित्वात नाही.",
+       "nohistory": "या à¤ªà¥\83षà¥\8dठासाठà¥\80 à¤¸à¤\82पादन इतिहास अस्तित्वात नाही.",
        "currentrev": "सध्याची आवृत्ती",
        "currentrev-asof": "$1 ची नविनतम आवृत्ती",
        "revisionasof": "$1 नुसारची आवृत्ती",
-       "revision-info": "$2ने $1चे आवर्तन",
+       "revision-info": "{{GENDER:$6|$2}}द्वारा $1चे आवर्तन",
        "previousrevision": "←मागील आवृत्ती",
        "nextrevision": "नविनतम आवृत्ती→",
        "currentrevisionlink": "सध्याची आवृत्ती",
        "history-feed-description": "विकिवरील या पानाच्या आवृत्त्यांचा इतिहास",
        "history-feed-item-nocomment": "$2 वर $1",
        "history-feed-empty": "विनंती केलेले पान अस्तित्वात नाही.\n\nते विकिवरून वगळले किंवा नाव बदललेले असण्याची शक्यता आहे.\n\nसंबधीत नव्या पानांकरिता [[Special:Search|विकिवर शोध घेण्याचा ]] प्रयत्न करा.",
+       "history-edit-tags": "निवडलेल्या आवृत्त्यांची खूणपताका संपादा",
        "rev-deleted-comment": "(संपादन सारांश वगळला)",
        "rev-deleted-user": "(सदस्यनाव वगळले)",
        "rev-deleted-event": "(क्रिया नोंद वगळली)",
        "rev-deleted-user-contribs": "[सदस्यनाव / अंकपत्ता वगळला - योगदानातुन संपादन लपविले]",
        "rev-deleted-text-permission": "या पानाची आवृत्ती सार्वजनिक विदागारातून '''वगळण्यात आली आहे'''.\n\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदीत] अधिक तपशील असण्याची शक्यता आहे.",
-       "rev-suppressed-text-permission": "या पानाची आवृत्ती '''दडपली'''.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
+       "rev-suppressed-text-permission": "या पानाची आवृत्ती  <strong>दडपली</strong> आहे.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
        "rev-deleted-text-unhide": "या पानाचे संस्करण '''वगळले'''.\n [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे याची माहिती मिळेल.\nजर आपणास पुढे जावयाचे असल्यास, अजूनही [$1 हे संस्करण बघू शकता].",
        "rev-suppressed-text-unhide": "या पानाचे संस्करण '''दडपले'''.\n [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} दडपलेले क्रमलेख] येथे याची माहिती मिळेल.\nजर आपणास पुढे जावयाचे असल्यास, अजूनही [$1 हे संस्करण बघू शकता].",
        "rev-deleted-text-view": "या पानाची आवृत्ती '''वगळण्यात आली आहे'''.\nती तुम्ही बघू शकता; अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याच्या नोंदी] येथे मिळेल.",
        "rev-suppressed-text-view": "या पानाची आवृत्ती '''दडपली'''.\nआपण ती बघू शकता; [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दडपलेल्यांचा क्रमलेख] येथे त्याची विस्तृत माहिती सापडेल.",
        "rev-deleted-no-diff": "आपण यातील फरक बघू शकत नाही कारण, त्यापैकी एक संस्करण '''वगळले''' आहे.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळल्याचा क्रमलेख] येथे त्याचा तपशील सापडेल.",
-       "rev-suppressed-no-diff": "तà¥\81मà¥\8dहà¥\80 à¤¹à¤¾ à¤«à¤°à¤\95 à¤ªà¤¾à¤¹à¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¯à¤¾ à¤\86वà¥\83तà¥\8dतà¥\8dयाà¤\82मधà¥\80ल à¤\8fà¤\95 à¤¸à¤\82सà¥\8dà¤\95रण â\80\9dâ\80\99वà¤\97ळणà¥\8dयात à¤\86लà¥\87 à¤\86हà¥\87\80\9dâ\80\99",
+       "rev-suppressed-no-diff": "à¤\86पण à¤¹à¤¾ à¤«à¤°à¤\95 à¤ªà¤¾à¤¹à¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¯à¤¾ à¤\86वà¥\83तà¥\8dतà¥\8dयाà¤\82मधà¥\80ल à¤\8fà¤\95 à¤\86वà¥\83तà¥\8dतà¥\80 <strong>वà¤\97ळणà¥\8dयात à¤\86लà¥\80 à¤\86हà¥\87</strong>.",
        "rev-deleted-unhide-diff": "या फरकाच्या आवृत्तींपैकी एक आवृत्ती  '''वगळण्यात आली आहे'''.\n[{{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}}/delete|page={{FULLPAGENAMEE}}}} वगळण्याच्या नोंदी] येथे अधिक तपशिल मिळू शकेल.",
        "revdelete-no-file": "नमूद केलेली संचिका अस्तित्वात नाही.",
        "revdelete-show-file-confirm": "तुम्ही \"<nowiki>$1</nowiki>\" या संचिकेची  $2 ला $3 वेळी  वगळलेली आवृत्ती नक्की पहाणार आहात?",
        "revdelete-show-file-submit": "होय",
+       "revdelete-selected-text": "[[:$2]] ची/च्या {{PLURAL:$1|निवडलेली आवृत्ती|निवडलेल्या आवृत्त्या}} :",
+       "revdelete-selected-file": "[[:$2]] ची/च्या {{PLURAL:$1|निवडलेली संचिका आवृत्ती|निवडलेल्या संचिका आवृत्त्या}} :",
        "logdelete-selected": "{{PLURAL:$1|निवडलेली नोंदीकृत घटना|निवडलेल्या नोंदीकृत घटना}}:",
+       "revdelete-text-text": "वगळलेल्या आवृत्त्या या पानाच्या इतिहासात दिसणार नाहीत, पण त्याच्या आशयाचा काही भाग हा सामान्याच्या पोहोचीबाहेर असेल.",
+       "revdelete-text-file": "वगळलेल्या संचिकेच्या आवृत्त्या या पानाच्या इतिहासात अद्यापही दिसतील, पण त्याच्या आशयाचा काही भाग हा सामान्याच्या पोहोचीबाहेर असेल.",
+       "logdelete-text": "वगळलेल्या नोंद-घटना या, पानाच्या नोंदीत अजूनही दिसतील, पण त्याच्या आशयाचा काही भाग हा सामान्याच्या पोहोचीबाहेर असेल.",
+       "revdelete-text-others": "अतिरिक्त बंधने स्थापिल्या गेली नसतील तर,दुसरे प्रशासक हे अजूनही लपविलेल्या आशयावर पोहोचु शकतील व त्याचे वगळणे पुनर्स्थापन करु शकतील.",
        "revdelete-confirm": "कृपया '''याची खात्री करा''' की तुम्ही जे करीत आहात, त्याचे परिणाम आपण जाणत आहात आणि, ते काम [[{{MediaWiki:Policy-url}}|मीडियाविकीच्या नीती]]नुसार आहे.",
        "revdelete-suppress-text": "लपवण्याचा वापर '''फक्त''' पुढील बाबतीत होतो:\n* उच्च दर्जाची बदनामीकारक माहिती\n* अयोग्य व्यक्तिगत माहिती\n*: ''गृहपत्ते, दूरध्वनी क्रमांक व राष्ट्रीय ओळख क्रमांक वगैरे''",
        "revdelete-legend": "दृश्य बंधने स्थापित करा",
-       "revdelete-hide-text": "à¤\86वरà¥\8dतà¥\80त à¤®à¤\9cà¤\95à¥\82र",
+       "revdelete-hide-text": "à¤\86वà¥\83तà¥\8dतà¥\80तला à¤®à¤\9cà¤\95à¥\82र à¤²à¤ªà¤µà¤¾",
        "revdelete-hide-image": "संचिका आशय लपवा",
-       "revdelete-hide-name": "à¤\95à¥\83तà¥\80 à¤\86णि à¤²à¤\95à¥\8dषà¥\8dय लपवा",
+       "revdelete-hide-name": "लà¤\95à¥\8dषà¥\8dय à¤µ à¤ªà¥\8dराà¤\9aल लपवा",
        "revdelete-hide-comment": "संपादन तपशील",
        "revdelete-hide-user": "संपादकाचे सदस्यनाव/आयपी अंकपत्ता",
        "revdelete-hide-restricted": "प्रशासकांद्वारेची माहिती दडपा तसेच ईतरांचीही",
        "revdel-restore": "दृश्यता बदला",
        "pagehist": "पानाचा इतिहास",
        "deletedhist": "वगळलेला इतिहास",
-       "revdelete-hide-current": "$1 मधील $2 या वेळचे आवर्तन लपविण्यात त्रूटी : ते सद्य पुनरावर्तन आहे.\nते लपवता येत नाही.",
-       "revdelete-show-no-access": "$2, $1 ची बाब दाखवताना अडचण: ती \"प्रतिबंधित\" खूण असलेली आहे.\nतुम्ही तिच्यापर्यंत पोचू शकत नाही.",
+       "revdelete-hide-current": "$2 या दिनांकाची बाब लपविण्यात त्रुटी, $1: हे सद्य पुनरावर्तन आहे.\nते लपवता येत नाही.",
+       "revdelete-show-no-access": "$2'दिनांकाची बाब दाखवितांना त्रुटी, $1:  त्या बाबीवर \"निर्बंधित\" अशी खूण आहे.\nआपणास त्यावर पोहोच नाही.",
        "revdelete-modify-no-access": "$2, $1 ची बाब संपादताना अडचण: ती \"प्रतिबंधित\" खूण असलेली आहे.\nतुम्ही तिच्यापर्यंत पोचू शकत नाही.",
        "revdelete-modify-missing": "बाब क्र. $1 ला संपादताना त्रुटी: ती माहितीकोषात नाही!",
        "revdelete-no-change": "'''सूचना:''' $2, $1 च्या बाबीने अगोदरच दृश्यता रुपरेषा मागितल्या आहेत.",
        "revdelete-edit-reasonlist": "वगळण्याची कारणे संपादित करा",
        "revdelete-offender": "आवर्तन निर्माता:",
        "suppressionlog": "दडपण्याची नोंद",
-       "suppressionlogtext": "à¤\96ालà¥\80ल à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¯à¤¾à¤¦à¥\80 à¤¹à¥\80 à¤µà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤µ à¤ªà¥\8dरतिबà¤\82धनाà¤\9aà¥\80 à¤\86हà¥\87 à¤\9cà¥\8dयाà¤\9aा à¤\86शय à¤¹à¤¾ à¤ªà¥\8dरशासà¤\95ाà¤\82पासà¥\82न à¤²à¤ªà¤µà¤¿à¤£à¥\8dयात à¤\86ला à¤\86हà¥\87.सधà¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\80 à¤¬à¤\82दà¥\80 à¤µ à¤ªà¥\8dरतिबà¤\82धनाà¤\82à¤\9aà¥\80   \nयादी [[Special:BlockList|प्रतिबंधनांची यादी]] बघा.",
+       "suppressionlogtext": "à¤\96ालà¥\80ल à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¯à¤¾à¤¦à¥\80 à¤¹à¥\80 à¤µà¤\97ळणà¥\8dयाà¤\9aà¥\80 à¤µ à¤ªà¥\8dरतिबà¤\82धनाà¤\9aà¥\80 à¤\86हà¥\87 à¤\9cà¥\8dयाà¤\9aा à¤\86शय à¤¹à¤¾ à¤ªà¥\8dरशासà¤\95ाà¤\82पासà¥\82न à¤²à¤ªà¤µà¤¿à¤£à¥\8dयात à¤\86ला à¤\86हà¥\87.सधà¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\8dया à¤¬à¤\82दà¥\80 à¤µ à¤ªà¥\8dरतिबà¤\82धनाà¤\82à¤\9aà¥\8dया   \nयादà¥\80साठी [[Special:BlockList|प्रतिबंधनांची यादी]] बघा.",
        "mergehistory": "पान इतिहासांचे एकत्रीकरण करा",
        "mergehistory-header": "हे पान एका स्रोत पानाचा इतिहास एखाद्या नवीन पानात समाविष्ट करू देते.\nहा बदल पानाचे ऐतिहासिक सातत्य राखेल याची दक्षता घ्या.",
        "mergehistory-box": "दोन पानांची आवर्तने संमिलीत करा:",
        "mergehistory-empty": "कोणतेही आवर्तन एकत्रित करता येत नाही.",
        "mergehistory-done": "$1 {{PLURAL:$3|चे|ची}} $3 {{PLURAL:$3|आवर्तन|आवर्तने}} [[:$2]] मध्ये यशस्वीरीत्या एकत्रित केली.",
        "mergehistory-fail": "इतिहासाचे एकत्रीकरण कार्य करू शकत नाही आहे, कृपया पान आणि वेळ प्राचलांची पुनर्तपासणी करा.",
+       "mergehistory-fail-toobig": "इतिहास एकत्रिकरण करणे शक्य झाले नाही कारण $1 मर्यादेपेक्षा अधिक {{PLURAL:$1|आवृत्ती|आवृत्त्या}} स्थानांतरीत केल्या जातील.",
        "mergehistory-no-source": "स्रोत पान $1 अस्तित्वात नाही.",
        "mergehistory-no-destination": "लक्ष्य पान $1  अस्तित्वात नाही.",
        "mergehistory-invalid-source": "स्रोत पानाचे शीर्षक वैध असणे आवश्यक आहे.",
        "showhideselectedversions": "निवडलेल्या आवृत्त्या दाखवा / लपवा",
        "editundo": "उलटवा",
        "diff-empty": "(काही फरक नाही)",
-       "diff-multi-sameuser": "({{PLURAL:$1|याच सदस्याची एक माध्यमिक आवृत्ती|$1 याच सदस्याच्या माध्यमिक आवृत्त्या}} दर्श्यविण्यात आलेल्या नाहीत)",
+       "diff-multi-sameuser": "({{PLURAL:$1|याच सदस्याची एक माध्यमिक आवृत्ती|$1 याच सदस्याच्या माध्यमिक आवृत्त्या}} दर्शविण्यात आलेल्या नाहीत)",
+       "diff-multi-otherusers": "({{PLURAL:$2|एका दुसऱ्या सदस्याची/च्या|$2 सदस्यांची/च्या}}{{PLURAL:$1|एक आंतरवर्ती आवृत्ती दर्शविली नाही|$1 आंतरवर्ती आवृत्त्या दर्शविल्या नाहीत}})",
        "diff-multi-manyusers": "{{PLURAL:$2|सदस्याची|$2 सदस्यांच्या}} ({{PLURAL:$1|आवृत्ती|$1 आवृत्त्या}} दाखवल्या नाहीत)",
        "difference-missing-revision": "या लेखाचे/ची  ($1) हे {{PLURAL:$2|संस्करण|$2 संस्करणे}} {{PLURAL:$2|सापडले नाही|सापडली नाहीत}}.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे, शक्यतोवर,असे घडु शकते.याबाबत अधिक तपशील  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी] येथे बघता येईल.",
        "searchresults": "शोध निकाल",
        "searchprofile-articles-tooltip": "$1 मध्ये शोधा",
        "searchprofile-images-tooltip": "संचिकांसाठी शोधा",
        "searchprofile-everything-tooltip": "सर्व पाने शोधा (चर्चापानांसहित)",
-       "searchprofile-advanced-tooltip": "निवडलà¥\87लà¥\8dया à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवाà¤\82मधà¥\8dयà¥\87 à¤¶à¥\8bधा:",
+       "searchprofile-advanced-tooltip": "पारà¤\82परित(à¤\95सà¥\8dà¤\9fम) à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवाà¤\82मधà¥\8dयà¥\87 à¤¶à¥\8bधा",
        "search-result-size": "$1 ({{PLURAL:$2|१ शब्द|$2 शब्द}})",
        "search-result-category-size": "{{PLURAL:$1|१ सदस्य|$1 सदस्य}} ({{PLURAL:$2|१ उपवर्ग|$2 उपवर्ग}}, {{PLURAL:$3|1 संचिका|$3 संचिका}})",
        "search-redirect": "(पुनर्निर्देशन $1)",
        "search-section": "(विभाग $1)",
+       "search-category": "(वर्ग $1)",
+       "search-file-match": "(संचिका आशयाशी अनुरुपते)",
        "search-suggest": "तुम्हाला हेच म्हणायचे का: $1",
+       "search-rewritten": "$1 साठीचे निकाल दाखवित आहे.त्याऐवजी $2 चा शोध घ्या.",
        "search-interwiki-caption": "सह प्रकल्प",
        "search-interwiki-default": "$1चे निकाल:",
        "search-interwiki-more": "(आणखी)",
        "searchall": "सर्व",
        "showingresults": "#'''$2'''पासून {{PLURAL:$1|'''1'''पर्यंतचा निकाल|'''$1'''पर्यंतचे निकाल}} खाली दाखवले आहे.",
        "showingresultsinrange": "खाली #<strong>$2</strong> ते #<strong>$3</strong> पर्यंतच्या कक्षेतील {{PLURAL:$1|<strong>१</strong> निकाल दाखविला आहे|<strong>$1</strong> निकाल दाखविले आहेत}}.",
+       "search-showingresults": "{{PLURAL:$4|Result <strong>$1</strong> of <strong>$3</strong>|निकाल <strong>$3</strong> चे<strong>$1 - $2</strong>}}",
        "search-nonefound": "दिलेल्या पृच्छेशी जुळणारे निकाल नाहीत.",
+       "search-nonefound-thiswiki": "या संकेतस्थळावर,दिलेल्या पृच्छेशी जुळणारे निकाल मिळाले नाही.",
        "powersearch-legend": "प्रगत शोध",
        "powersearch-ns": "नामविश्वांमध्ये शोधा:",
        "powersearch-togglelabel": "तपासा:",
        "powersearch-toggleall": "सर्व",
        "powersearch-togglenone": "काहीही नाही",
+       "powersearch-remember": "भविष्यातील शोधांच्या निवडींची आठवण ठेवा",
        "search-external": "बाह्य शोध",
        "searchdisabled": "{{SITENAME}} शोध अनुपलब्ध केला आहे.तो पर्यंत गूगलवरून शोध घ्या.{{SITENAME}}च्या मजकुराची त्यांची सूचिबद्धता शिळी असण्याची शक्यता असू शकते हे लक्षात घ्या.",
-       "search-error": "शà¥\8bध à¤\98à¥\87ताà¤\82ना à¤\98डलà¥\87लà¥\80 à¤¤à¥\8dरà¥\82टी:$1",
+       "search-error": "शà¥\8bध à¤\98à¥\87ताà¤\82ना à¤\98डलà¥\87लà¥\80 à¤¤à¥\8dरà¥\81टी:$1",
        "preferences": "पसंतीक्रम",
        "mypreferences": "पसंतीक्रम",
        "prefs-edits": "संपादनांची संख्या:",
-       "prefsnologintext2": "आपला पसंतीक्रम बदलण्यास $1 करा",
+       "prefsnologintext2": "आपला पसंतीक्रम बदलण्यास सनोंद प्रवेश करा.",
        "prefs-skin": "त्वचा",
        "skin-preview": "झलक",
        "datedefault": "प्राथमिकता नाही",
        "prefs-personal": "सदस्य व्यक्तिरेखा",
        "prefs-rc": "अलीकडील बदल",
        "prefs-watchlist": "निरीक्षणसूची",
+       "prefs-editwatchlist": "पहाऱ्याच्या सूचीचे संपादन करा",
+       "prefs-editwatchlist-label": "आपल्या निरीक्षणसूचीतील प्रविष्ट्या संपादन करा:",
+       "prefs-editwatchlist-edit": "आपल्या निरीक्षणसूचीतील मथळे बघा व हटवा",
+       "prefs-editwatchlist-raw": "कच्ची निरीक्षणसूची संपादित करा",
+       "prefs-editwatchlist-clear": "आपली निरीक्षणसूची साफ(क्लिअर) करा",
        "prefs-watchlist-days": "निरीक्षणसूचीमध्ये दिसणाऱ्या दिवसांची संख्या:",
        "prefs-watchlist-days-max": "जास्तीत जास्त $1 {{PLURAL:$1|दिवस|दिवस}}",
        "prefs-watchlist-edits": "वाढीव निरीक्षणसूचीमध्ये दिसणाऱ्या संपादनांची संख्या:",
        "rows": "ओळी:",
        "columns": "स्तंभ:",
        "searchresultshead": "शोध",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">अंकुरीत दुव्यांच्या</a> रचनेची नांदी (बाईट्स):",
+       "stub-threshold": "रिकाम्या पानाच्या दुव्याची अध:सीमा (Threshold) ($1):",
+       "stub-threshold-sample-link": "नमुना",
        "stub-threshold-disabled": "अक्षम केले",
        "recentchangesdays": "अलीकडील बदल मधील दाखवावयाचे दिवस:",
        "recentchangesdays-max": "जास्तीतजास्त $1 {{PLURAL:$1|दिवस}}",
        "prefs-help-recentchangescount": "यात नुकतेच झालेले बदल, पानांचे इतिहास व नोंदी या गोष्टी असतात.",
        "prefs-help-watchlist-token2": "ही आपल्या निरिक्षणसूचीच्या 'वेब फिड'ची गुप्त चाबी आहे.ज्या कोणास त्याची माहिती होईल तो आपली निरिक्षणसूची बघू शकेल,म्हणुन कोणास यात सहभागी करून घेउ नका.[[Special:ResetTokens|पुनर्स्थापनाची आपणास गरज असल्यास येथे टिचकी द्या]].",
        "savedprefs": "तुमच्या पसंती जतन केल्या आहेत.",
+       "savedrights": "{{GENDER:$1|$1}}चे सदस्याधिकार जतन केले आहेत.",
        "timezonelegend": "वेळक्षेत्र",
        "localtime": "स्थानिक वेळ:",
        "timezoneuseserverdefault": "सर्व्हर मूलस्थिती वापरा ($1)",
        "badsig": "अयोग्य कच्ची सही;HTML खुणपताका तपासा.",
        "badsiglength": "तुमची स्वाक्षरी खूप लांब आहे.\nटोपणनाव $1 {{PLURAL:$1|अक्षरापेक्षा|अक्षरांपेक्षा}} कमी लांबीचे हवे.",
        "yourgender": "आपणास कश्या प्रकारे वर्णन केल्या गेलेले आवडेल?",
-       "gender-unknown": "मà¥\80 à¤\85धिà¤\95 à¤¦à¥\87à¤\89 à¤\87à¤\9aà¥\8dà¤\9bित à¤¨à¤¾à¤¹à¥\80",
+       "gender-unknown": "à¤\86पला à¤\89लà¥\8dलà¥\87à¤\96 à¤\95रताà¤\82ना, à¤¹à¥\87 à¤¸à¤\82à¤\9aà¥\87तन, à¤\9cà¥\87थà¥\87 à¤¶à¤\95à¥\8dय à¤\86हà¥\87 à¤¤à¥\87थà¥\87, à¤²à¤¿à¤\82à¤\97ाबाबत à¤\85à¤\95à¥\8dरिय à¤¶à¤¬à¥\8dदाà¤\9aा à¤µà¤¾à¤ªà¤° à¤\95रà¥\87ल.",
        "gender-male": "तो विकिपाने संपादितो",
        "gender-female": "ती विकिपाने संपादिते",
        "prefs-help-gender": "या पसंतीक्रमास स्थापणे ऐच्छिक आहे:संचेतन याचा उपयोग आपल्यास लिंगानुसार संबोधित करण्यास करते व आपल्यास दुसऱ्यांना उल्लेखण्यास होतो. ही माहिती सार्वजनिक असेल.",
        "email": "विपत्र",
-       "prefs-help-realname": "तुमचे खरे नाव (वैकल्पिक): हे नाव दिल्यास आपले योगदान या नावाखाली नोंदले व दाखवले जाईल.",
+       "prefs-help-realname": "तुमचे खरे नाव वैकल्पिक आहे.\nते दिल्यास,त्याचा वापर आपणास आपल्या कामाचे श्रेय देण्यास होऊ शकतो.",
        "prefs-help-email": "विपत्रपत्ता वैकल्पिक आहे,परंतु,परवलीचा शब्द आपण विसरल्यास, तो  त्याच्या पुनर्स्थापनेसाठी आवश्यक आहे.",
        "prefs-help-email-others": "आपण इतरांना आपल्याशी ईमेलद्वारे संपर्क साधण्यास,आपल्या सदस्य किंवा सदस्य चर्चा पानातून दुवा देण्याचे निवडू शकता.जेंव्हा इतर आपल्याशी संपर्क साधतात तेंव्हा, आपला विपत्रपत्ता त्यांना दाखविल्या जात नाही.",
        "prefs-help-email-required": "विपत्र(ईमेल)पत्ता हवा.",
        "prefs-tokenwatchlist": "ओळखचिन्ह",
        "prefs-diffs": "फरक",
        "prefs-help-prefershttps": "हा पसंतीक्रम आपल्या पुढील सनोंद प्रवेशानंतर कार्यान्वित होईल.",
-       "email-address-validity-valid": "विपत्रपत्ता वैध दिसत आहे",
-       "email-address-validity-invalid": "वैध विपत्रपत्ता लिहा",
+       "prefswarning-warning": "आपण आपल्या पसंतीक्रमात केलेला बदल अद्याप जतन झाला नाही.जर आपण \"$1\" न टिचकता, या पानावरुन दुसरीकडे गेलात तर आपला पसंतीक्रम अद्यतन होणार नाही.",
+       "prefs-tabs-navigation-hint": "उपयुक्त सूचना:आपण कळींच्या यादीत, कळींदरम्यानच्या सुचालनास डावी व उजवी बाण-कळ वापरु शकता.",
        "userrights": "सदस्य अधिकार व्यवस्थापन",
        "userrights-lookup-user": "सदस्य गटांचे(ग्रूप्स) व्यवस्थापन करा.",
        "userrights-user-editname": "सदस्य नाव टाका:",
        "editusergroup": "सदस्याचे गट संपादित करा",
-       "editinguser": "सदसà¥\8dय '''[[User:$1|$1]]''' $2 à¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dय à¤\85धिà¤\95ारात à¤¬à¤¦à¤² à¤\95à¥\87ला à¤\9cात à¤\86हà¥\87.",
+       "editinguser": "या {{GENDER:$1|सदसà¥\8dया}}à¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dय-à¤\85धिà¤\95ारात à¤¬à¤¦à¤² à¤\95à¥\87ला à¤\9cात à¤\86हà¥\87<strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "सदस्याचे गट संपादित करा",
        "saveusergroups": "सदस्य गट जतन करा",
-       "userrights-groupsmember": "(चा) सभासद:",
-       "userrights-groupsmember-auto": "à¤\9aा à¤¨à¤¿à¤°à¥\8dविवाद सदस्य:",
+       "userrights-groupsmember": "याचा सभासद:",
+       "userrights-groupsmember-auto": "याà¤\9aा à¤\85वà¥\8dयà¤\95à¥\8dत सदस्य:",
        "userrights-groups-help": "तुम्ही एखाद्या सदस्याचे गट सदस्यत्व बदलू शकता:\n* निवडलेला चौकोन म्हणजे सदस्य त्या गटात आहे.\n* न निवडलेला चौकोन म्हणजे सदस्य त्या गटात नाही.\n* एक * चा अर्थ तुम्ही एकदा समावेश केल्यानंतर तो गट बदलू शकत नाही, किंवा काढल्यानंतर समावेश करू शकत नाही.",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "इतर विकींवरचे सदस्य अधिकार बदलण्याची परवानगी तुम्हाला नाही.",
        "grouppage-suppress": "{{ns:project}}:झापडबंद",
        "right-read": "पृष्ठे वाचा",
        "right-edit": "पाने संपादा",
-       "right-createpage": "पृष्ठे तयार करा (जी चर्चापानांव्यतिरिक्त)",
+       "right-createpage": "पृष्ठे तयार करा (जी चर्चापानांव्यतिरिक्त आहेत)",
        "right-createtalk": "चर्चा पृष्ठे तयार करा",
        "right-createaccount": "नवीन सदस्य खाती तयार करा",
        "right-minoredit": "बदल किरकोळ म्हणून जतन करा",
        "right-move": "पानांचे स्थानांतरण करा",
        "right-move-subpages": "पाने उपपानांसकट स्थानांतरीत करा",
        "right-move-rootuserpages": "मूळ सदस्यपाने हलवा",
+       "right-move-categorypages": "वर्ग पाने स्थानांतरील करा",
        "right-movefile": "संचिका हलवा",
        "right-suppressredirect": "एखाद्या पानाचे नवीन नावावर स्थानांतरण करत असताना पुनर्निर्देशन वगळा",
        "right-upload": "संचिका अपभारण करा",
        "right-deletedtext": "वगळलेला मजकूर व वगळलेल्या आवृत्त्यांमधील बदल पहा",
        "right-browsearchive": "वगळलेली पाने शोधा",
        "right-undelete": "एखादे पान पुनर्स्थापित करा",
-       "right-suppressrevision": "प्रचालकांपासून लपविलेल्या आवृत्त्या पुनरावलोकित व पुनर्स्थापित करा",
+       "right-suppressrevision": "कोणत्याही सदस्यास विशिष्ट आवृत्त्या दर्शवा,लपवा किंवा प्रगट करा",
+       "right-viewsuppressed": "कोणत्याही सदस्यापासून लपविलेल्या आवृत्त्या पहा",
        "right-suppressionlog": "खासगी नोंदी पहा",
        "right-block": "इतर सदस्यांना संपादन करण्यापासून प्रतिबंधित करा",
        "right-blockemail": "एखाद्या सदस्याला इ-मेल पाठविण्यास प्रतिबंधित करा",
        "right-proxyunbannable": "प्रॉक्सी असताना ब्लॉक्स कडे दुर्लक्ष करा",
        "right-unblockself": "कोण्या-एकास अप्रतिबंधित करा",
        "right-protect": "सुरक्षा पातळी बदलवा व निपात-प्रतिबंधित पानांचे संपादन करा",
-       "right-editprotected": " \"{{int:protect-level-sysop}}\"म्हणून नमुद केलेली सुरक्षित पाने संपादा",
+       "right-editprotected": "\"{{int:protect-level-sysop}}\"म्हणून नमुद केलेली सुरक्षित पाने संपादा",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\" म्हणून नमुद केलेली सुरक्षित पाने संपादा",
+       "right-editcontentmodel": "पानाचा आशय नमूना संपादा",
        "right-editinterface": "सदस्य पसंतीक्रम बदला",
        "right-editusercssjs": "इतर सदस्यांच्या CSS व JS संचिका संपादित करा",
        "right-editusercss": "इतर सदस्यांच्या CSS संचिका संपादित करा",
        "right-viewmyprivateinfo": "आपली स्वत:ची वैयक्तिक माहिती बघा (उदा.विपत्रपत्ता, खरे नाव)",
        "right-editmyprivateinfo": "आपली स्वत:ची वैयक्तिक माहिती संपादा (उदा.विपत्रपत्ता, खरे नाव)",
        "right-editmyoptions": "आपल्या स्वत:चा 'पसंतीक्रम' संपादा",
-       "right-rollback": "या आधीच्या सदस्याचे नुकतेच संपादन केलेले एखादे विशिष्ट पानाचे बदल लवकर आधीच्य स्थितीत न्या",
+       "right-rollback": "या आधीच्या सदस्याचे नुकतेच संपादन केलेले एखादे विशिष्ट पानाचे बदल लवकर आधीच्य स्थितीत न्या",
        "right-markbotedits": "निवडलेली संपादने सांगकाम्यांची म्हणून जतन करा",
        "right-noratelimit": "रेट लिमिट्स चा परिणाम होत नाही.",
        "right-import": "इतर विकिंमधून पाने आयात करा",
        "right-override-export-depth": "जोडलेल्या पानांचा पाचव्या पातळीपर्यंत अंतर्भाव करुन पाने निर्यात करा",
        "right-sendemail": "इतर सदस्यांना विपत्रे पाठवा",
        "right-passwordreset": "परवलीचा शब्द पुनर्स्थापित केल्याचे विपत्र पहा.",
+       "right-managechangetags": "डाटाबेस मधून [[Special:Tags|खूणपताका]] तयार करा किंवा  वगळा",
+       "right-applychangetags": "कोणाच्याही बदलास [[Special:Tags|खूणपताका]] जोडा",
+       "right-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) [[Special:Tags|खूणपताका]] जोडा अथवा हटवा",
        "newuserlogpage": "नवीन सदस्यांची नोंद",
        "newuserlogpagetext": "ही नवीन सदस्यांची नोंद यादी आहे.",
        "rightslog": "सदस्य आधिकार नोंद",
        "action-createpage": "लेख बनवा",
        "action-createtalk": "चर्चा पृष्ठे तयार करा",
        "action-createaccount": "हे सदस्यखाते तयार करा",
+       "action-history": "या पानाचा इतिहास बघा.",
        "action-minoredit": "हे संपादन 'किरकोळ' म्हणून खूण करा",
        "action-move": "हे पान स्थानांतरित करा",
        "action-move-subpages": "हे पान व त्याची उपपाने हलवा",
        "action-move-rootuserpages": "मूळ सदस्यपाने हलवा",
+       "action-move-categorypages": "वर्ग पाने स्थानांतरील करा",
        "action-movefile": "ही संचिका हलवा",
        "action-upload": "या संचिकेचे अपभारण करा",
        "action-reupload": "अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन करा",
        "action-viewmywatchlist": "'माझी निरीक्षणसूची' बघा",
        "action-viewmyprivateinfo": "आपली वैयक्तिक माहिती बघा",
        "action-editmyprivateinfo": "आपली वैयक्तिक माहिती संपादा",
+       "action-editcontentmodel": "पानाचा आशय नमूना संपादा",
+       "action-managechangetags": "डाटाबेसमध्ये खूणपतका तयार करा किंवा वगळा",
+       "action-applychangetags": "आपल्या बदलांसोबतच खूणपताका जोडा",
+       "action-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) खूणपताका जोडा अथवा हटवा",
        "nchanges": "$1 {{PLURAL:$1|बदल}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|मागील भेटीनंतर}}",
        "enhancedrc-history": "इतिहास",
        "recentchanges": "अलीकडील बदल",
-       "recentchanges-legend": "à¤\85लà¥\80à¤\95डà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\8fवजी पर्याय",
+       "recentchanges-legend": "à¤\85लà¥\80à¤\95डà¥\80ल à¤¬à¤¦à¤²à¤¾à¤\90वजी पर्याय",
        "recentchanges-summary": "या विकिवर झालेल्या सर्वात अलीकडील बदलांचा या पानावर मागोवा घ्या.",
        "recentchanges-noresult": "नमुद कालावधीतील कोणतेही बदला या निकषांशी जुळत नाहीत.",
        "recentchanges-feed-description": "या रसदीत,या विकिवर झालेल्या सर्वात अलीकडील बदलांचा मागोवा घ्या.",
        "recentchanges-label-minor": "हे एक किरकोळ संपादन आहे",
        "recentchanges-label-bot": "हे संपादन एका सांगकाम्याकडून केले गेले आहे",
        "recentchanges-label-unpatrolled": "हे संपादन अजून तपासल्या गेले नाही",
-       "recentchanges-label-plusminus": "या à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤\86à¤\95ार à¤\87तà¤\95à¥\8dया à¤¬à¤¾à¤\87à¤\9fà¥\8dस ने बदलला",
+       "recentchanges-label-plusminus": "या à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤\86à¤\95ार à¤\87तà¤\95à¥\8dया à¤¬à¤¾à¤\87à¤\9fसà¥\8d ने बदलला",
        "recentchanges-legend-heading": "'''विवरण:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नविन पानांची यादी]] हेही पाहा)",
        "recentchanges-legend-plusminus": "(''±१२३'')",
-       "rcnotefrom": "खाली <b>$2</b> पासूनचे ('''$1''' पर्यंत) बदल दाखविले आहेत.",
-       "rclistfrom": "$3 $2 नंतर केले गेलेले बदल दाखवा.",
+       "recentchanges-submit": "दाखवा",
+       "rcnotefrom": "खाली {{PLURAL:$5|हा बदल आहे|हे बदल आहेत}} <strong>$3, $4</strong>पासून ते(<strong>$1</strong>पर्यंतचे  बदल दाखविले आहेत).",
+       "rclistfrom": "$2,$3 पासून सुरुवात करुन, नविन केल्या गेलेले बदल दाखवा.",
        "rcshowhideminor": "छोटे बदल $1",
        "rcshowhideminor-show": "दाखवा",
        "rcshowhideminor-hide": "लपवा",
        "rcshowhidebots": "सांगकामे(बॉट्स) $1",
        "rcshowhidebots-show": "दाखवा",
        "rcshowhidebots-hide": "लपवा",
-       "rcshowhideliu": "$1नोंदणीकृत सदस्य",
+       "rcshowhideliu": "नोंदणीकृत सदस्य $1",
        "rcshowhideliu-show": "दाखवा",
        "rcshowhideliu-hide": "लपवा",
        "rcshowhideanons": "अनामिक सदस्य $1",
        "rcshowhidemine": "माझे बदल $1",
        "rcshowhidemine-show": "दाखवा",
        "rcshowhidemine-hide": "लपवा",
+       "rcshowhidecategorization": "$1 पान वर्गीकरण",
+       "rcshowhidecategorization-show": "दाखवा",
+       "rcshowhidecategorization-hide": "लपवा",
        "rclinks": "मागील $2 दिवसांतील $1 बदल पहा.<br />$3",
        "diff": "फरक",
-       "hist": "इति",
+       "hist": "इति.",
        "hide": "लपवा",
        "show": "दाखवा",
-       "minoreditletter": "छो",
-       "newpageletter": "न",
-       "boteditletter": "सां",
+       "minoreditletter": "छो.ब.",
+       "newpageletter": "न.पा.",
+       "boteditletter": "सां.",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|सदस्याने|सदस्यांनी}} पहारा दिलेला आहे]",
-       "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा)",
-       "rc_categories_any": "कोणतेही",
+       "rc_categories": "वर्गांपुरते मर्यादित ठेवा (\"|\"ने वेगळे करा):",
+       "rc_categories_any": "निवडलà¥\8dयापà¥\88à¤\95à¥\80 à¤\95à¥\8bणतà¥\87हà¥\80",
        "rc-change-size-new": " बदलानंतर $1 {{PLURAL:$1|बाईट|बाईटस्}}",
        "newsectionsummary": "/* $1 */ नवीन विभाग",
        "rc-enhanced-expand": "तपशील दाखवा",
        "recentchangeslinked-feed": "या पृष्ठासंबंधीचे बदल",
        "recentchangeslinked-toolbox": "या पृष्ठासंबंधीचे बदल",
        "recentchangeslinked-title": "\"$1\" च्या संदर्भातील बदल",
-       "recentchangeslinked-summary": "हे पृष्ठ एखाद्या विशिष्ट पानाशी (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी) जोडलेल्या पानांवरील बदल दर्शवते.\nतुमच्या [[Special:Watchlist|नित्य पहाण्याच्या सूचीमधील]] ही पाने '''ठळक''' दिसतील.",
+       "recentchangeslinked-summary": "हे पृष्ठ एखाद्या विशिष्ट पानाशी, (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी), जोडलेल्या पानांवरील बदल दर्शविते.\nआपल्या [[Special:Watchlist|निरीक्षणसूचीत]] ही पाने <strong>ठळक</strong> दिसतील.",
        "recentchangeslinked-page": "पृष्ठ नाव:",
        "recentchangeslinked-to": "याऐवजी दिलेल्या पानाला जोडलेल्या पानांवरील बदल दाखवा",
+       "recentchanges-page-added-to-category": "[[:$1]] वर्गास जोडले",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] व {{PLURAL:$2|एक पान वर्गास जोडले|$2 पाने वर्गास जोडलीत}}",
+       "recentchanges-page-removed-from-category": "[[:$1]] ला वर्गातून हटविले",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] व {{PLURAL:$2|एक पान वर्गातून हटविले|$2 पाने वर्गातून हटविलीत}}",
+       "autochange-username": "मिडियाविकि आपोआप बदल",
        "upload": "संचिका चढवा",
        "uploadbtn": "संचिकेचे अपभारण करा",
        "reuploaddesc": "अपभारण रद्द करुन ,अपभारणाच्या अर्जाकडे परत जा",
        "uploaderror": "अपभारणात चूक",
        "upload-recreate-warning": "'''सावधान: या नावाची संचीका वगळली अथवा स्थलांतरित करण्यात आली आहे.'''\nया पानाची वगळल्याची व स्थलांतरणाची नोंद तुमच्या सोयीसाठी येथे पुरवली आहे.:",
        "uploadtext": "खालील अर्ज नवीन संचिका चढविण्यासाठी वापरा.\nपूर्वी चढविलेल्या संचिका पाहण्यासाठी अथवा शोधण्यासाठी [[Special:FileList|चढविलेल्या संचिकांची यादी]] पहा. चढविलेल्या तसेच वगळलेल्या संचिकांची यादी पहाण्यासाठी [[Special:Log/upload|चढवलेल्या संचिकांची सूची]] व [[Special:Log/delete|वगळलेल्या संचिकांची सूची]] पहा.\n\nएखाद्या लेखात ही संचिका वापरण्यासाठी खालीलप्रमाणे दुवा द्या\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki>''',\n'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|alt text]]</nowiki>''' किंवा\n'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki>''' संचिकेला थेट दुवा देण्यासाठी वापरा.",
-       "upload-permitted": "अनुमतीत संचिका वर्ग: $1.",
-       "upload-preferred": "शà¥\8dरà¥\87यसà¥\8dà¤\95र à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¥\8dरà¤\95ार:$1.",
-       "upload-prohibited": "प्रतिबंधीत संचिका प्रकार: $1.",
+       "upload-permitted": "अनुमतीत संचिका{{PLURAL:$2|प्रकार}}: $1.",
+       "upload-preferred": "पसà¤\82तà¥\80तला à¤¸à¤\82à¤\9aिà¤\95ा {{PLURAL:$2|पà¥\8dरà¤\95ार}}:$1.",
+       "upload-prohibited": "प्रतिबंधीत संचिका {{PLURAL:$2|प्रकार}}:$1.",
        "uploadlogpage": "अपभारणाच्या नोंदी",
        "uploadlogpagetext": "नवीनतम चढवलेल्या संचिकांची यादीखाली दिलेली आहे.जास्त बघण्यासाठी [[Special:NewFiles|नविन संचिकांची दिर्घिका]] बघा.",
        "filename": "संचिकेचे नाव",
        "filetype-badmime": "विविधामाप(माईम) \"$1\" प्रकारच्या संचिका चढवण्यास परवानगी नाही.",
        "filetype-bad-ie-mime": "ही संचिका चढवता येत नाही कारण इंटरनेट एक्स्प्लोरर तिला \"$1\" म्हणून ओळखेल. हा संचिकाप्रकार प्रतिबंधित व संभाव्य धोकादायक संचिकाप्रकार आहे.",
        "filetype-unwanted-type": "'''\".$1\"''' हा अवांछित संचिका प्रकार आहे. प्राधान्याने $2 {{PLURAL:$3|या प्रकारच्या |या प्रकारांच्या}} संचिका हव्या आहेत.",
-       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|ही परवानगी नसलेल्या प्रकारची संचिका आहे.|ह्या परवानगी नसलेल्या प्रकारच्या संचिका आहेत.}} $2 {{PLURAL:$3|ही परवानगी असलेल्या प्रकारची संचिका आहे|ह्या परवानगी असलेल्या प्रकारच्या संचिका आहेत}}.",
+       "filetype-banned-type": "'''\".$1\"''' {{PLURAL:$4|ही परवानगी नसलेल्या प्रकारची संचिका आहे|या परवानगी नसलेल्या प्रकारच्या संचिका आहेत.}} $2 {{PLURAL:$3|ही परवानगी असलेल्या प्रकारची संचिका आहे|या परवानगी असलेल्या प्रकारच्या संचिका आहेत}}.",
        "filetype-missing": "या संचिकेला विस्तारक(एक्सटेंशन) दिलेले नाही (उदा. \".jpg\").",
        "empty-file": "तुम्ही प्रस्तुत केलेली संचिका रिकामी होती.",
        "file-too-large": "तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप जास्त होती.",
        "largefileserver": "सेवा संगणकावर (सर्व्हर) निर्धारित केलेल्या आकारापेक्षा या संचिकेचा आकार मोठा आहे.",
        "emptyfile": "चढवलेली संचिका रिकामी आहे.असे संचिकानाम चुकीचे लिहिल्याने होउ शकते. कृपया तुम्हाला हीच संचिका चढवायची आहे का ते तपासा.",
        "windows-nonascii-filename": "या विकिवर विशेष वर्ण असलेल्या संचिकानामाचा आधार घेता येणार नाही.",
-       "fileexists": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87, à¤\95à¥\83पया à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¬à¤¦à¤²à¤£à¥\8dयाबदà¥\8dदल à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¾à¤¶à¤\82à¤\95 à¤\85साल à¤¤à¤° <strong>[[:$1]]</strong> तपासा.\n[[$1|thumb]]",
+       "fileexists": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\86धà¥\80à¤\9a à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87, à¤\9cर à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¬à¤¦à¤²à¤£à¥\8dयाबदà¥\8dदल à¤¤à¥\81मà¥\8dहà¥\80 à¤¸à¤¾à¤¶à¤\82à¤\95 à¤\85साल à¤¤à¤°, à¤\95à¥\83पया <strong>[[:$1]]</strong>तपासा.\n[[$1|thumb]]",
        "filepageexists": "या नावाचे एक माहितीपृष्ठ (संचिका नव्हे) अगोदरच अस्तित्त्वात आहे. कृपया जर आपणांस त्यात बदल करायचा नसेल तर <strong>[[:$1]]</strong> तपासा.\n[[$1|thumb]]",
-       "fileexists-extension": "या à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87: [[$2|thumb]]\n* à¤\9aढवà¥\80त à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$1]]</strong>\n* à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$2]]</strong>\nà¤\95à¥\83पया à¤¦à¥\81सरà¥\87 à¤¨à¤¾à¤µ à¤¨à¤¿à¤µà¤¡à¤¾.",
+       "fileexists-extension": "या à¤¸à¤¾à¤°à¤\96à¥\8dया à¤¨à¤¾à¤µà¤¾à¤\9aà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤\86हà¥\87: [[$2|thumb]]\n* à¤\9aढवà¥\80त à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$1]]</strong>\n* à¤¸à¤§à¥\8dया à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤¨à¤¾à¤µ: <strong>[[:$2]]</strong>\nà¤\86पणास à¤\85धिà¤\95 à¤µà¥\88शिषà¥\8dà¤\9fà¥\8dयपà¥\82रà¥\8dण à¤¨à¤¾à¤µ à¤¨à¤¿à¤µà¤¡à¤¾à¤¯à¤\9aà¥\87 à¤\86हà¥\87 à¤\95ाय?",
        "fileexists-thumbnail-yes": "आपण चढवीत असलेली संचिका ही मोठ्या चित्राची इवलीशी प्रतिकृती ''(thumbnail)'' असण्याची शक्यता आहे. [[$1|इवलेसे]]\nकृपया <strong>[[:$1]]</strong> ही संचिका तपासा.\nजर तपासलेली संचिका ही याच आकाराची असेल तर नवीन प्रतिकृती चढविण्याची गरज नाही.",
        "file-thumbnail-no": "या संचिकेचे नाव <strong>$1</strong> पासून सुरू होत आहे. ही कदाचित झलक असू शकते.\nजर तुमच्याकडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.",
        "fileexists-forbidden": "या नावाची संचिका अगोदरच अस्तित्त्वात आहे; कृपया पुन्हा परत जाऊन ही संचिका नवीन नावाने चढवा.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "हे नाव असलेली एक संचिका शेअर्ड संचिका कोशात आधी पासून आहे; कृपया परत मागे जा आणि नवीन, वेगळ्या नावाने ही संचिका पुन्हा चढवा. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "ही संचिका खालील {{PLURAL:$1|संचिकेची|संचिकांची}} प्रत आहे:",
        "file-deleted-duplicate": "या संचिकेसारखीच् संचिका ([[:$1]]) या आधी वगळण्यात आली आहे.\nहि संचिका पुनः चढवण्यापूर्वी आपण त्या संचिकेची वगळण्याची नोंद तपासावी.",
+       "file-deleted-duplicate-notitle": "या संचिकेसम असलेली दुसरी संचिका मागे वगळण्यात आलेली आहे व त्या शीर्षकाचे दमन केले आहे.आपण,त्या संचिकेच्या पुनर्-अपभारणापूर्वी, ज्या कोणास दमन केलेली संचिका बघण्याचे अधिकार असतील त्यास, या स्थितीच्या पुनर्विलोकनाची विनंती करा.",
        "uploadwarning": "चढवताना सूचना",
        "uploadwarning-text": "कृपया खालील संचिका वर्णन संपादित करून पुनर्प्रयत्न करा.",
        "savefile": "संचिका जतन करा",
        "uploaddisabledtext": "{{SITENAME}} वर संचिका चढविण्यास बंदी घालण्यात आलेली आहे.",
        "php-uploaddisabledtext": "PHP मध्ये संचिका चढवणे प्रतिबंधित केले आहे.\nकृपया file_uploads मांडणी (setting) तपासावी.",
        "uploadscripted": "या संचिकेत HTML किंवा स्क्रिप्ट कोडचा आंतर्भाव आहे, त्याचा एखाद्या विचरकाकडून विचित्र अर्थ लावला जाऊ शकतो.",
+       "upload-scripted-pi-callback": "ज्या संचिकेत XML-stylesheet च्या प्रक्रियेचे अनुदेश असतील अशी संचिकेचे अपभारण करु शकत नाही.",
+       "uploaded-script-svg": "अपभारीलेल्या SVG संचिकेत,\"$1\" हे लेखनीय अवयव आढळले.",
+       "uploaded-hostile-svg": "अपभारीलेल्या SVG संचिकेत,असुरक्षित CSS स्टाईल अवयव आढळले.",
+       "uploadscriptednamespace": "या SVG संचिकेत \"$1\" हे अवैध नामविश्व आहे.",
        "uploadinvalidxml": "अपभारीत संचिकेतील XML पार्स करता आले नाही.",
-       "uploadvirus": "हà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87त à¤µà¥\8dहायरस आहे. अधिक माहिती: $1",
+       "uploadvirus": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87त à¤µà¤¿à¤·à¤¾à¤£à¥\82(वà¥\8dहायरस) आहे. अधिक माहिती: $1",
        "uploadjava": "ही फाईल झीप ह्या प्रकारातील आहे ज्यामधे जावा .क्लास फाईल. आहे,जावा फाईलचे अपभारणास परवानगी नाही कारण त्याने सुरक्षा-बंधने टाळल्या जाऊ शकतात.",
        "upload-source": "स्रोत संचिका",
        "sourcefilename": "स्रोत-संचिकानाम:",
        "filename-bad-prefix": "तुम्ही चढवत असलेल्या संचिकेचे नाव '''\"$1\"''' पासून सुरू होते, जे की अंकीय छाउ (कॅमेरा) ने दिलेले अवर्णनात्मक नाव आहे.कृपया तुमच्या संचिकेकरिता अधिक वर्णनात्मक नाव निवडा.",
        "upload-success-subj": "यशस्वीरीत्या अपभारित केले",
        "upload-success-msg": "तुमचे [$2] येथून अपभारण यशस्वी ठरले. ते येथे उपलब्ध आहे: [[:{{ns:file}}:$1]]",
-       "upload-failure-subj": "à¤\9aढवणà¥\8dयातà¥\80ल à¤¤à¥\8dरà¥\82à¤\9fि:",
-       "upload-failure-msg": "[$2] à¤¯à¥\87थà¥\82न à¤¤à¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात à¤\9aà¥\82à¤\95 झाली:\n\n$1",
-       "upload-warning-subj": "à¤\9aढवताना à¤¸à¥\82à¤\9aना",
-       "upload-warning-msg": "तà¥\81मà¤\9aà¥\8dया à¤\9aढवणà¥\8dयात [$2] à¤¯à¥\87थà¥\82न à¤\9aà¥\82à¤\95 झाली. तुम्ही [[Special:Upload/stash/$1|चढवण्याचा अर्ज]] पुन्हा भरून ही चूक दूर करू शकता.",
-       "upload-proto-error": "à¤\9aà¥\82à¤\95à¥\80à¤\9aा à¤¸à¤\82à¤\95à¥\87त",
-       "upload-proto-error-text": "दà¥\82रसà¥\8dथ à¤\9aढवणà¥\8dयाच्या क्रियेत <code>http://</code>पासून किंवा <code>ftp://</code>पासून सुरू होणारी URL लागतात.",
-       "upload-file-error": "à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¥\8dरà¥\82टी",
-       "upload-file-error-text": "विदादातà¥\8dयावर à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयाà¤\9aà¥\8dया à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सताना à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¤¾à¤\82तà¥\8dरिà¤\95 à¤\85डà¤\9aण à¤\86ली.कृपया [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
-       "upload-misc-error": "सà¤\82à¤\9aिà¤\95ा à¤\9aढविताना à¤®à¤¾à¤¹à¥\80त à¤¨à¤¸à¤²à¥\87लà¥\80 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\86लà¥\87लà¥\80 à¤\86हà¥\87.",
-       "upload-misc-error-text": "à¤\9aढवताना à¤\85à¤\9cà¥\8dà¤\9eात à¤¤à¤¾à¤\82तà¥\8dरिà¤\95 à¤\85डà¤\9aण à¤\86लà¥\80.à¤\95à¥\83पया à¤\86à¤\82तरà¤\9cालपतà¥\8dता à¤¸à¥\81यà¥\8bà¤\97à¥\8dय à¤\86णि à¤\89पलबà¥\8dध à¤\86हà¥\87 à¤\95ा à¤¤à¥\87 à¤¤à¤ªà¤¾à¤¸à¤¾ à¤\86णि à¤ªà¥\81नà¥\8dहा à¤ªà¥\8dरयतà¥\8dन à¤\95रा. à¤\85धिà¤\95 à¤\85डà¤\9aणà¥\80 à¤\86लà¥\8dयास à¤¤à¤° [[Special:ListUsers/sysop|पà¥\8dरà¤\9aालà¤\95ाà¤\82शà¥\80]] à¤¸à¤\82परà¥\8dà¤\95 à¤\95रा.",
+       "upload-failure-subj": "à¤\85पभारणातà¥\80ल à¤¤à¥\8dरà¥\82à¤\9fि",
+       "upload-failure-msg": "[$2] à¤¯à¥\87थà¥\82न à¤¤à¥\81मà¤\9aà¥\8dया à¤\85पभारणात à¤\85डà¤\9aण à¤¨à¤¿à¤°à¥\8dमाण झाली:\n\n$1",
+       "upload-warning-subj": "à¤\85पभारण à¤¤à¤¾à¤\95िद",
+       "upload-warning-msg": "तà¥\81मà¤\9aà¥\8dया à¤\85पभारणात [$2] à¤¯à¥\87थà¥\82न à¤\85डà¤\9aण à¤¨à¤¿à¤°à¥\8dमाण झाली. तुम्ही [[Special:Upload/stash/$1|चढवण्याचा अर्ज]] पुन्हा भरून ही चूक दूर करू शकता.",
+       "upload-proto-error": "à¤\9aà¥\82à¤\95à¥\80à¤\9aा à¤¶à¤¿à¤·à¥\8dà¤\9fाà¤\9aार",
+       "upload-proto-error-text": "दà¥\82रसà¥\8dथ à¤\85पभारणाच्या क्रियेत <code>http://</code>पासून किंवा <code>ftp://</code>पासून सुरू होणारी URL लागतात.",
+       "upload-file-error": "à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¥\8dरà¥\81टी",
+       "upload-file-error-text": "विदादातà¥\8dयावर à¤¤à¤¾à¤¤à¥\8dपà¥\81रतà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¤à¤¯à¤¾à¤° à¤\95रणà¥\8dयाà¤\9aा à¤ªà¥\8dरयतà¥\8dन à¤\95रत à¤\85सताना à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\98डली.कृपया [[Special:ListUsers/sysop|प्रचालकांशी]] संपर्क करा.",
+       "upload-misc-error": "à¤\85नà¥\8bळà¤\96à¥\80 à¤\85पभारण à¤¤à¥\8dरà¥\81à¤\9fà¥\80.",
+       "upload-misc-error-text": "à¤\85पभारणात à¤\85नà¥\8bळà¤\96à¥\80 à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\98डलà¥\80.à¤\95à¥\83पया à¤¯à¥\82à¤\86रà¤\8fल à¤µà¥\88ध à¤\86णि à¤ªà¥\8bहà¥\8bà¤\9aयà¥\8bà¤\97à¥\8dय à¤\86हà¥\87 à¤\95ा à¤¤à¥\87 à¤¤à¤ªà¤¾à¤¸à¤¾ à¤\86णि à¤ªà¥\81नà¥\8dहा à¤ªà¥\8dरयतà¥\8dन à¤\95रा. à¤\85डà¤\9aण à¤¤à¤¶à¥\80à¤\9a à¤\9fिà¤\95à¥\81न à¤°à¤¾à¤¹à¤¿à¤²à¥\8dयास,  [[Special:ListUsers/sysop|पà¥\8dरà¤\9aालà¤\95ाà¤\82शà¥\80]] à¤¸à¤\82परà¥\8dà¤\95 à¤¸à¤¾à¤§ा.",
        "upload-too-many-redirects": "या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत",
        "upload-http-error": "एक एचटीटीपी चूक उद्भवली: $1",
-       "upload-copy-upload-invalid-domain": "सà¤\82à¤\95à¥\8dरमित à¤\95à¥\87लà¥\87लà¥\80 à¤®à¤¹à¤¿à¤¤à¥\80 à¤\85धिà¤\95à¥\8dषà¥\87तà¥\8dरात à¤\89पलबà¥\8dध à¤¨à¤¾à¤¹à¥\80.",
+       "upload-copy-upload-invalid-domain": "या à¤¡à¥\8bमà¥\87नमधà¥\8dयà¥\87 à¤ªà¥\8dरत-à¤\85पभारणà¥\87 à¤\85नà¥\81पलबà¥\8dध à¤\86हà¥\87त.",
        "upload-dialog-title": "संचिकेचे अपभारण करा",
        "upload-dialog-button-cancel": "रद्द करा",
        "upload-dialog-button-done": "झाले",
        "backend-fail-hashes": "तुलना करण्यासाठी फाइल हॅशेस मिळाले नाही",
        "backend-fail-notsame": " $1 येथे यापेक्षा विभिन्न असलेली संचिका पूर्वीच विद्यमान आहे",
        "backend-fail-invalidpath": "$1 हा वैध संग्राहक-पथ नाही.",
-       "backend-fail-delete": "$1 ही संचिका (फाईल) बनवता आली नाही.",
-       "backend-fail-describe": "\"$1\" à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87साठà¥\80 à¤\86पण मेटाडाटा बदलू शकत नाही.",
+       "backend-fail-delete": "\"$1\" ही संचिका (फाईल) वगळता आली नाही.",
+       "backend-fail-describe": "\"$1\" à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87साठà¥\80 à¤\85सलà¥\87ला मेटाडाटा बदलू शकत नाही.",
        "backend-fail-alreadyexists": "$1 ही संचिका अगोदरच अस्तित्वात आहे.",
-       "backend-fail-store": "$1 ही संचिका $2मधे साठवू शकत नाही.",
-       "backend-fail-copy": "\"$1\" à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\80 \"$2\" à¤¹à¥\80 à¤ªà¥\8dरत à¤\95रता à¤\86लà¥\80 नाही.",
-       "backend-fail-move": "संचिका $1 पासून $2मधे हलवता आली नाही.",
+       "backend-fail-store": "\"$1\" ही संचिका \"$2\"मध्ये साठवू शकत नाही.",
+       "backend-fail-copy": "\"$1\" à¤¸à¤\82à¤\9aिà¤\95à¥\87स \"$2\" à¤®à¤§à¥\8dयà¥\87 à¤¨à¤\95लता à¤\86लà¥\87 नाही.",
+       "backend-fail-move": "संचिका \"$1\"ला \"$2\"मधे स्थानांतरीत करता आले नाही.",
        "backend-fail-opentemp": "तात्पुरती संचिका उघडणे जमले नाही.",
        "backend-fail-writetemp": "तात्पुरत्या संचिकेत लिहिणे जमले नाही.",
        "backend-fail-closetemp": "तात्पुरती संचिका बंद करणे जमले नाही.",
-       "backend-fail-read": "$1 ही संचिका वाचता आली नाही.",
-       "backend-fail-create": "$1 ही संचिका लिहिता आली नाही.",
+       "backend-fail-read": "\"$1\"ही संचिका वाचता आली नाही.",
+       "backend-fail-create": "\"$1\"ही संचिका लिहिता आली नाही.",
        "backend-fail-maxsize": "$1 ही संचिका लिहिता आली नाही कारण ती {{PLURAL:$2|एक बाइट|$2 बाइट्स}} पेक्षा मोठी आहे.",
        "backend-fail-readonly": "पार्श्वभौमीक साठवण \"$1\" “फक्त वाचा” अशी आहे. दिलेले कारण आहे: \"<em>$2</em>\"",
        "backend-fail-synced": "अंतर्गत पार्श्वभौमीक साठवणीतील फाईल \"$1\" विसंगत आहे.",
        "backend-fail-connect": "पार्श्वभौमीक साठा \"$1\"शी संबंध जोडू शकत नाही.",
        "backend-fail-internal": "पार्श्वभौमीक साठा \"$1\" यात अज्ञात चूक झाली आहे.",
-       "backend-fail-contenttype": "\"$1\" à¤®à¤§à¥\8dयà¥\87 à¤ à¥\87वलà¥\87लà¥\8dया à¤«à¤¾à¤\88लà¤\9aा à¤®à¤¹à¤¿à¤¤à¥\80à¤\9aा à¤ªà¥\8dरà¤\95ार à¤\95ळत à¤¨à¤¾à¤¹à¥\80",
+       "backend-fail-contenttype": "\"$1\" à¤®à¤§à¥\8dयà¥\87 à¤¸à¤¾à¤ à¤µà¤¿à¤£à¥\8dयात à¤¯à¥\87णाऱà¥\8dया à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aा à¤\86शय-पà¥\8dरà¤\95ार(à¤\95à¤\82à¤\9fà¥\87à¤\82à¤\9f à¤\9fाà¤\88प) à¤¨à¤\95à¥\8dà¤\95à¥\80 à¤\95रता à¤\86ला à¤¨à¤¾à¤¹à¥\80.",
        "backend-fail-batchsize": "पार्श्वभौमीक साठयातील बॅच $1 फाईल{{PLURAL:$1|क्रियेत|क्रियांमध्ये}}; मर्यादित कस्त $२ {{PLURAL:$2|क्रिया}} असू शकते",
        "backend-fail-usable": "अपुऱ्या परवानगीमुळे किंवा निर्देशिकेच्या/धारिकेच्या(डिरेक्टरीज/कंटेनर्स) अभावामुळे \"$1\" संचिका वाचु अथवा लिहू शकत नाही.",
        "filejournal-fail-dbconnect": "\"$1\" स्टोरेज बॅकएंडकरिता, माहिती-भांडाराच्या ज्ञानपत्रिकेशी जुळता आले नाही.",
        "lockmanager-fail-deletelock": "\"$1\" साठी लॉक फाइल वगळू शकत नाही",
        "lockmanager-fail-acquirelock": "\"$1\" साठी लॉक फाइल मिळवू शकत नाही",
        "lockmanager-fail-openlock": "\"$1\" साठी लॉक फाइल उघडू शकत नाही",
-       "lockmanager-fail-releaselock": "\"$1\" à¤¸à¤¾à¤ à¥\80 à¤²à¥\89à¤\95 à¤\89à¤\98डà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80",
+       "lockmanager-fail-releaselock": "\"$1\" à¤¸à¤¾à¤ à¥\80 à¤¤à¤¾à¤³à¤¾ à¤\89à¤\98डà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.",
        "lockmanager-fail-db-bucket": "$1 बकेट मधील कुलूप बंद डेटाबेसशी पुरेसा संपर्क होवू शकत नाही.",
-       "lockmanager-fail-db-release": "\"$1\" à¤¡à¤¾à¤\9fाबà¥\87स à¤µà¤°à¥\80ल à¤²à¥\89à¤\95 उघडू शकत नाही",
+       "lockmanager-fail-db-release": "\"$1\" à¤¡à¤¾à¤\9fाबà¥\87स à¤µà¤°à¥\80ल à¤¤à¤¾à¤³à¤¾ उघडू शकत नाही",
        "lockmanager-fail-svr-acquire": "सर्व्हर \"$1\" वरील कुलूप उघडू शकत नाही",
        "lockmanager-fail-svr-release": "सर्व्हर \"$1\" वरील् लॉक उघडू शकत नाही",
-       "zip-file-open-error": "सà¤\82à¤\9aà¥\80à¤\95ा ZIP à¤¤à¤ªà¤¾à¤¸à¤£à¥\80साठà¥\80 à¤\89à¤\98डताना à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\86ली.",
-       "zip-wrong-format": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा \"à¤\9dिप\" à¤ªà¥\8dरà¤\95ारà¤\9aà¥\80 नाही.",
+       "zip-file-open-error": "सà¤\82à¤\9aिà¤\95ा ZIP à¤¤à¤ªà¤¾à¤¸à¤£à¥\80साठà¥\80 à¤\89à¤\98डताना à¤¤à¥\8dरà¥\81à¤\9fà¥\80 à¤\89दà¥\8dभवली.",
+       "zip-wrong-format": "नमà¥\82द à¤\95à¥\87लà¥\87लà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤¹à¥\80 à¤\9dिप(ZIP)सà¤\82à¤\9aिà¤\95ा नाही.",
        "zip-bad": "ही संचिका दूषित किंवा न वाचता येणारी झिप संचिका आहे.\nती सुरक्षिततेसाठी नीट तपासता आली नाही.",
        "zip-unsupported": "ही संचिका एक ZIP संचिका आहे जी मिडीयाविकी द्वारे  (support) न केलेले ZIP वैशिष्ट्ये (features) वापरते.\nया संचिकेची सुरक्षा पडताळणी व्यवस्थितरीत्या होऊ शकत नाही.",
        "uploadstash": "चढवणे लपवा",
        "uploadstash-badtoken": "ही कृती अयशस्वी होती. कदाचित आपल्या संपादन अधिकारपत्राची (editing credentials) मुदत संपली.",
        "uploadstash-errclear": "संचिका स्वच्छ करणे अयशस्वी.",
        "uploadstash-refresh": "संचिकांची यादी ताजीतवानी करा",
-       "invalid-chunk-offset": "à¤\85à¤\97à¥\8dराहà¥\8dय चंक ऑफसेट",
+       "invalid-chunk-offset": "à¤\85वà¥\88ध चंक ऑफसेट",
        "img-auth-accessdenied": "पोहोच नाकारल्या गेली.",
-       "img-auth-nopathinfo": "मारà¥\8dà¤\97 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤\86ढळलà¥\80 à¤¨à¤¾à¤¹à¥\80.\nà¤\86पला à¤¸à¤°à¥\8dवà¥\8dहर à¤¹à¥\80 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤ªà¥\8bà¤\9aवà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.\nतà¥\8b à¤¸à¥\80à¤\9cà¥\80à¤\86य-à¤\86धारित à¤µ à¤\87मà¥\87à¤\9c_à¤\91थला à¤¸à¤®à¤°à¥\8dथन à¤¨ à¤¦à¥\87à¤\8a à¤¶à¤\95णारा à¤\85सà¥\82 à¤¶à¤\95तà¥\8b.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization à¤\95à¥\83पया हे पहा.",
-       "img-auth-notindir": "माà¤\97ितलà¥\87ला à¤®à¤¾à¤°à¥\8dà¤\97 à¤\85पलà¥\8bड à¤¨à¤¿à¤°à¥\8dदà¥\87शिà¤\95à¥\87à¤\95रà¥\80ता à¤\9cà¥\8bडलà¥\87ला नाही.",
+       "img-auth-nopathinfo": "मारà¥\8dà¤\97 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤\86ढळलà¥\80 à¤¨à¤¾à¤¹à¥\80.\nà¤\86पला à¤¸à¤°à¥\8dवà¥\8dहर à¤¹à¥\80 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤¦à¥\87णà¥\8dयास à¤\85नà¥\81नत à¤¨à¤¾à¤¹à¥\80.\nतà¥\8b à¤¸à¥\80à¤\9cà¥\80à¤\86य-à¤\86धारित à¤µ à¤\87मà¥\87à¤\9c_à¤\91थला à¤¸à¤®à¤°à¥\8dथन à¤¨ à¤¦à¥\87à¤\8a à¤¶à¤\95णारा à¤\85सà¥\82 à¤¶à¤\95तà¥\8b.\nà¤\95à¥\83पया https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization  हे पहा.",
+       "img-auth-notindir": "विनà¤\82तà¥\80 à¤\95à¥\87लà¥\87ला à¤®à¤¾à¤°à¥\8dà¤\97 à¤\85पभारण à¤¶à¤¬à¥\8dदà¤\95à¥\8bशाà¤\95रà¥\80ता à¤°à¤\9aित नाही.",
        "img-auth-badtitle": "\"$1\" पासून वैध शीर्षक बनवण्यात अयशस्वी.",
        "img-auth-nologinnWL": "तुम्ही प्रवेश घेतलेला नाही व \"$1\" श्वेतयादीत नाही.",
        "img-auth-nofile": "\"$1\" ही संचिका अस्तित्वात नाही.",
-       "img-auth-isdir": "तुम्ही $1 निदेशक वापरण्याचा प्रयत्न करत आहात.\nफक्त संचिका वापरण्याची परवानगी आहे.",
+       "img-auth-isdir": "तुम्ही \"$1\" निदेशक वापरण्याचा प्रयत्न करत आहात.\nफक्त संचिका वापरण्याची परवानगी आहे.",
        "img-auth-streaming": "स्ट्रीमिंग \"$1\".",
        "img-auth-public": "img_auth.php हे  वैयक्तिक विकीमधून  माहिती प्रदान करण्याचे कार्य करते.\nहा विकि सार्वजनिक विकि म्हणून सब्चित करण्यात आला आहे.\nकिमान सुरक्षेसाठी img_auth.php ला अक्षम केले आहे.",
        "img-auth-noread": "तुम्हाला \"$1\" वाचण्याची परवानगी नाही",
        "http-invalid-scheme": "URL सोबत \"$1\" पद्धत चालत नाही",
        "http-request-error": "एचटीटीपी मागणी अज्ञात कारणामुळे अयशस्वी.",
        "http-read-error": "एचटीटीपी वाचन त्रुटी.",
-       "http-timed-out": "विनंती वेळ सपला आहे",
+       "http-timed-out": "HTTP विनंती मुदतबाह्य झाली.",
        "http-curl-error": "आंतरजालपत्ता पकडताना चूक: $1",
        "http-bad-status": "एचटीटीपी मागणीदरम्यान एक चूक उद्भवली: $1 $2",
        "upload-curl-error6": "आंतरजाल पत्त्यापाशी पोहोचले नाही",
        "upload-curl-error6-text": "दिलेल्या URL ला पोहचू शकलो नाही.कृपया URL बरोबर असून संकेतस्थळ चालू असल्याची पुनश्च खात्री करा.",
-       "upload-curl-error28": "à¤\9aढवणà¥\8dयात à¤µà¥\87ळà¤\97à¥\87लà¥\80",
-       "upload-curl-error28-text": "संकेतस्थळाने साद देण्यात खूप जास्त वेळ घेतला आहे,कृपया थोडा वेळ थांबा आणि पुन्हा प्रयत्न करा.कदाचित तुम्ही कमी गर्दीच्या वेळात प्रयत्न करू इच्छीताल.",
+       "upload-curl-error28": "à¤\85पभारण à¤\95ालबाहà¥\8dय à¤\9dालà¥\87",
+       "upload-curl-error28-text": "संकेतस्थळाने साद देण्यात खूप जास्त वेळ घेतला आहे.\nकृपया हे तपासा कि ते संकेतस्थळ सुरु आहे.थोडा वेळ थांबा आणि पुन्हा प्रयत्न करा.\nकदाचित तुम्ही कमी गर्दीच्या वेळात प्रयत्न करू इच्छीत असाल.",
        "license": "परवाना:",
        "license-header": "परवाना:",
        "nolicense": "काही निवडलेले नाही",
        "upload_source_file": "(तुमच्या संगणकावरील एक संचिका निवडली आहे)",
        "listfiles-delete": "वगळा",
        "listfiles-summary": "हे विशेष पान सर्व अपभारिलेल्या संचिका दर्शिविते.",
-       "listfiles_search_for": "à¤\9aितà¥\8dर à¤¨à¤¾à¤µà¤¾à¤¨à¥\87 à¤¶à¥\8bध:",
+       "listfiles_search_for": "माधà¥\8dयमाà¤\9aà¥\87 à¤¨à¤¾à¤µ à¤¶à¥\8bधा:",
        "listfiles-userdoesnotexist": "सदस्यखाते \"$1\"  हे नोंदलेले नाही.",
        "imgfile": "संचिका",
-       "listfiles": "à¤\9aितà¥\8dर यादी",
+       "listfiles": "सà¤\82à¤\9aिà¤\95ा यादी",
        "listfiles_thumb": "नखुले",
        "listfiles_date": "दिनांक",
        "listfiles_name": "नाव",
        "listfiles-latestversion-no": "नाही",
        "file-anchor-link": "संचिका",
        "filehist": "संचिकेचा इतिहास",
-       "filehist-help": "सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\80 à¤¤à¥\8dयावà¥\87ळà¤\9aà¥\80 à¤\86वà¥\83तà¥\8dतà¥\80 à¤¬à¤\98णà¥\8dयासाठà¥\80 à¤¤à¥\8dया à¤¦à¤¿à¤¨à¤¾à¤\82à¤\95/वà¥\87ळà¥\87वर à¤µà¤° à¤\9fिà¤\9aà¤\95à¥\80 à¤¦à¥\8dया.",
+       "filehist-help": "संचिकेची त्यावेळची आवृत्ती बघण्यासाठी त्या दिनांक/वेळेवर टिचकी द्या.",
        "filehist-deleteall": "सर्व वगळा",
        "filehist-deleteone": "वगळा",
        "filehist-revert": "उलटवा",
        "filehist-filesize": "संचिकेचा आकार (बाईट्स)",
        "filehist-comment": "प्रतिक्रीया",
        "imagelinks": "संचिका वापर",
-       "linkstoimage": "खालील {{PLURAL:$1|पान चित्राशी जोडले आहे|$1 पाने चित्राशी जोडली आहेत}}:",
-       "linkstoimage-more": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ $1 {{PLURAL:$1|पान à¤\9cà¥\8bडलà¥\87|पानà¥\87 à¤\9cà¥\8bडलà¥\80}} à¤\86हà¥\87त.\nया à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ à¤\9cà¥\8bडलà¥\87लà¥\8dया {{PLURAL:$1|पहिलà¥\8dया à¤ªà¤¾à¤¨à¤\9aा à¤¦à¥\81वा à¤\96ालà¥\80 à¤¦à¤¿à¤²à¤¾ à¤\86हà¥\87|पहिलà¥\8dया $1 à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\87 à¤¦à¥\81वà¥\87 à¤\96ालà¥\80 à¤¦à¤¿à¤²à¥\87 à¤\86हà¥\87त}}.\n[[Special:WhatLinksHere/$2|संपुर्ण यादी]] उपलब्ध आहे.",
+       "linkstoimage": "à¤\96ालà¥\80ल {{PLURAL:$1|पान à¤\9aितà¥\8dराशà¥\80 à¤\9cà¥\8bडलà¥\87 à¤\86हà¥\87|$1 à¤ªà¤¾à¤¨à¥\87 à¤\9aितà¥\8dराà¤\82शà¥\80 à¤\9cà¥\8bडलà¥\80 à¤\86हà¥\87त}}:",
+       "linkstoimage-more": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ $1 {{PLURAL:$1|पान à¤\9cà¥\8bडलà¥\87|पानà¥\87 à¤\9cà¥\8bडलà¥\80}} à¤\86हà¥\87त.\nà¤\96ालà¥\80ल à¤¯à¤¾à¤¦à¥\80 à¤¯à¤¾ à¤¸à¤\82à¤\9aिà¤\95à¥\87 à¤²à¤¾ à¤\9cà¥\8bडलà¥\87लà¥\8dया {{PLURAL:$1|पहिलà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤¦à¥\81वा |पहिलà¥\8dया $1 à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\87 à¤¦à¥\81वà¥\87 }}दरà¥\8dशवितà¥\87.\n[[Special:WhatLinksHere/$2|संपुर्ण यादी]] उपलब्ध आहे.",
        "nolinkstoimage": "या चित्राशी जोडलेली पृष्ठे नाही आहेत.",
        "morelinkstoimage": "या संचिकेचे [[Special:WhatLinksHere/$1|अधिक दुवे]] पहा.",
        "linkstoimage-redirect": "$1 (संचिका पुनर्निर्देशन) $2",
        "duplicatesoffile": "खालील संचिका या दिलेल्या {{PLURAL:$1|संचिकेची प्रत आहे|$1 संचिकांच्या प्रती आहेत}}. [[Special:FileDuplicateSearch/$2|अधिक माहिती]]",
-       "sharedupload": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82मधà¥\8dयà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\80 à¤\97à¥\87लà¥\8dयाà¤\9aà¥\80 à¤¶à¤\95à¥\8dयता à¤\86हे.",
-       "sharedupload-desc-there": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82मधà¥\8dयà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\80 जाऊ शकते.\nअधिक माहिती साठी कृपया [$2 संचिका वर्णन पान] पहावे.",
+       "sharedupload": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82दà¥\8dवारà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\9cाà¤\8a à¤¶à¤\95ते.",
+       "sharedupload-desc-there": "हà¥\80 à¤¸à¤\82à¤\9aिà¤\95ा $1 à¤®à¤§à¥\80ल à¤\86हà¥\87 à¤µ à¤¤à¥\80 à¤\87तर à¤ªà¥\8dरà¤\95लà¥\8dपाà¤\82दà¥\8dवारà¥\87 à¤µà¤¾à¤ªà¤°à¤²à¥\8dया जाऊ शकते.\nअधिक माहिती साठी कृपया [$2 संचिका वर्णन पान] पहावे.",
        "sharedupload-desc-here": "ही संचिका $1 येथील असून ती इतर प्रकल्पात वापरलेली असू शकते.\nतिचे तेथील [$2 संचिका वर्णन पान] खाली दाखवले आहे.",
        "sharedupload-desc-edit": "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जाऊ शकते.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता.",
        "sharedupload-desc-create": "संचिका $1 मधील आहे व ती इतर प्रकल्पांमध्ये वापरली जात असल्याची शक्यता आहे.आपणास हवे असल्यास,या पानाच्या[$2 'संचिका वर्णन पान'] येथे,त्याची माहिती संपादु शकता",
        "filepage-nofile": "या नावाची संचिका अस्तित्वात नाही.",
        "filepage-nofile-link": "या नावाची संचिका अस्तित्वात नाही, पण तुम्ही ती [$1 चढवू शकता].",
-       "uploadnewversion-linktext": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\80 à¤¨à¤µà¥\80न à¤\86वà¥\83तà¥\8dतà¥\80 à¤\9aढवा",
+       "uploadnewversion-linktext": "या à¤¸à¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\8dया à¤¨à¤µà¥\80न à¤\86वà¥\83तà¥\8dतà¥\80à¤\9aà¥\87 à¤\85पभारण à¤\95रा",
        "shared-repo-from": "$1 पासून",
        "shared-repo": "एक मुक्त कोश",
        "upload-disallowed-here": "या संचिकेवर आपण पुनर्लिखाण करू शकत नाही.",
-       "filerevert": "$1 पूर्वपद",
-       "filerevert-legend": "संचिका पूर्वपदास",
+       "filerevert": "$1 पूर्वपदास न्या",
+       "filerevert-legend": "संचिका पूर्वपदास न्या",
        "filerevert-intro": "तुम्ही [$3, $2 प्रमाणे आवर्तन$4 कडे]<strong>[[Media:$1|$1]]</strong>  उलटवत आहात.",
        "filerevert-comment": "कारण:",
        "filerevert-defaultcomment": "$2, $1 च्या आवृत्तीस पूर्वपदावर ($3)",
-       "filerevert-submit": "पूर्वपद",
+       "filerevert-submit": "पूर्वपदास न्या",
        "filerevert-success": "[$3, $2 प्रमाणे आवर्तन $4]कडे<strong>[[Media:$1|$1]]</strong>उलटवण्यात आली.",
        "filerevert-badversion": "दिलेलेल्या वेळ मापनानुसार,या संचिकेकरिता कोणतीही पूर्वीची स्थानिक आवृत्ती नाही.",
        "filedelete": "$1 वगळा",
        "download": "अधिभारण करा",
        "unwatchedpages": "देखरेख नसलेली पाने",
        "listredirects": "पुनर्निर्देशनांची यादी",
+       "listduplicatedfiles": "प्रतिलिपी(डुप्लिकेट) संचिकांची यादी",
        "unusedtemplates": "न वापरलेले साचे",
        "unusedtemplatestext": "या पानावर साचा नामविश्वातील अशी सर्व पाने आहेत जी कुठल्याही पानात वापरलेली नाहीत. वगळण्यापूर्वी साच्यांना जोडणारे इतर दुवे पाहण्यास विसरू नका.",
        "unusedtemplateswlh": "इतर दुवे",
        "statistics-edits": "{{SITENAME}} च्या सुरुवातीपासूनची पानांची संपादने",
        "statistics-edits-average": "प्रतिपान सरासरी संपादने",
        "statistics-users": "नोंदणीकृत [[Special:ListUsers|सदस्य]]",
-       "statistics-users-active": "à¤\95ारà¥\8dयरत सदस्य",
-       "statistics-users-active-desc": "{{PLURAL:$1|शेवटच्या दिवसात|शेवटच्या $1 दिवसांत}} एकतरी संपादन केलेले सदस्य",
+       "statistics-users-active": "à¤\95à¥\8dरियाशà¥\80ल सदस्य",
+       "statistics-users-active-desc": "शेवटच्या{{PLURAL:$1|दिवसात|$1 दिवसांत}} एकतरी संपादन केलेले सदस्य",
        "pageswithprop": "'पृष्ठ गुणधर्म' असणारी पाने",
        "pageswithprop-legend": "पृष्ठ गुणधर्म असणारी पाने",
        "pageswithprop-text": "या पानावर अश्या पानांची यादी आहे जे एक विशिष्ट 'पृष्ठ गुणधर्म'  वापरतात.",
        "doubleredirects": "दुहेरी-पुनर्निर्देशने",
        "doubleredirectstext": "हे पान, अशा पानांची यादी पुरवते की जी पाने, दुसऱ्या पुर्ननिर्देशीत पानाकडे पुर्ननिर्देशीत झाली आहेत.प्रत्येक ओळीत पहिल्या आणि दुसऱ्या पुर्ननिर्देशनाचा दुवा दिला आहे,तसेच, दुसऱ्या  पुर्ननिर्देशनाचे लक्ष्य पान पण दिले आहे,जे मुळात ते \nलक्ष्यपान आहे ज्याकडे, पहिले पुनर्निर्देशन असावयास हवे.\n\n<del>खोडलेल्या प्रविष्टी</del>समायोजित करण्यात आलेल्या आहेत.",
        "double-redirect-fixed-move": "[[$1]] हलवले गेले आहे.\nते आता स्वयंचलितरित्या अद्यतन केल्या गेले व [[$2]] येथे निर्देशित होते.",
-       "double-redirect-fixed-maintenance": "[[$1]] ते [[$2]] हे चुकीचे पुनर्निर्देशन ठिकठाक केले.",
+       "double-redirect-fixed-maintenance": "देखभालीच्या कामादरम्यान,स्वयंचलितरित्या [[$1]]पासून ते [[$2]]ला, हे दुहेरी पुनर्निर्देशन ठिकठाक केले.",
        "double-redirect-fixer": "पुनर्निर्देशन ठिकठाक करणारा",
        "brokenredirects": "मोडकी पुनर्निर्देशने",
        "brokenredirectstext": "खालील पुनर्निर्देशने अस्तित्वात नसलेली पाने जोडतात:",
        "withoutinterwiki-legend": "उपपद",
        "withoutinterwiki-submit": "दाखवा",
        "fewestrevisions": "सगळ्यात कमी बदल असलेले लेख",
-       "nbytes": "$1 {{PLURAL:$1|बाइट}}",
-       "ncategories": "$1 {{PLURAL:$1|वर्ग|वर्ग}}",
-       "ninterwikis": "$1 {{PLURAL:$1|आंतरविकि|आंतरविकि दुवे}}",
+       "nbytes": "$1 {{PLURAL:$1|बाइट|बाइटस्}}",
+       "ncategories": "$1 {{PLURAL:$1|वर्ग}}",
+       "ninterwikis": "$1 {{PLURAL:$1|आंतरविकि}}",
        "nlinks": "$1 {{PLURAL:$1|दुवा|दुवे}}",
        "nmembers": "$1 {{PLURAL:$1|सदस्य}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|सदस्य}}",
        "lonelypagestext": "खालील पानांना {{SITENAME}}च्या इतर पानांकडून दुवा जोड झालेली नाही.",
        "uncategorizedpages": "अवर्गीकृत पाने",
        "uncategorizedcategories": "अवर्गीकृत वर्ग",
-       "uncategorizedimages": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤\9aितà¥\8dरà¥\87",
+       "uncategorizedimages": "à¤\85वरà¥\8dà¤\97à¥\80à¤\95à¥\83त à¤¸à¤\82à¤\9aिà¤\95ा",
        "uncategorizedtemplates": "अवर्गीकृत साचे",
        "unusedcategories": "न वापरलेले वर्ग",
        "unusedimages": "न वापरलेल्या संचिका",
        "wantedcategories": "पाहिजे असलेले वर्ग",
        "wantedpages": "पाहिजे असलेले लेख",
+       "wantedpages-summary": "ही,ज्यांना अधिकांश दुवे आहेत अश्या अस्तित्वात नसलेल्या पानांची यादी आहे. यात ती पाने वगळली आहेत, ज्यांना फक्त पुनर्निर्देशनाचा दुवा आहे. अस्तित्वात नसलेली पण पुनर्निर्देशनाने जोडलेली जी पाने आहेत, अश्यांच्या यादीसाठी [[{{#special:BrokenRedirects}}|मोडकी पुनर्निर्देशने असलेल्या पानांची यादी]] बघा.",
        "wantedpages-badtitle": "परिणामाच्या यादीत अवैध शीर्षक: $1",
        "wantedfiles": "पाहिजे असलेल्या संचिका",
-       "wantedfiletext-cat": "पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त. à¤¬à¤¾à¤¹à¥\87रà¥\80ल à¤ à¤¿à¤\95ाणाà¤\82à¤\9aà¥\8dया à¤«à¤¾à¤\87लà¥\8dस à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¤¾à¤¤ à¤ªà¤£ à¤\85सतà¥\80लà¤\9a à¤\85सà¥\87 à¤¨à¤¾à¤¹à¥\80. à¤\85शा à¤«à¤¾à¤\87लà¥\8dस à¤\86ढळलà¥\8dयास à¤µà¤\97ळलà¥\8dया à¤\9cातà¥\80ल. à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87 [[:$1]] à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¥\80ल.",
+       "wantedfiletext-cat": "पà¥\81ढà¥\80ल à¤«à¤¾à¤\87लà¥\8dस à¤µà¤¾à¤ªà¤°à¤²à¥\8dया à¤\85सतà¥\80ल à¤ªà¤£ à¤\86ता à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त. à¤¬à¤¾à¤¹à¥\87रà¥\80ल à¤ à¤¿à¤\95ाणाà¤\82à¤\9aà¥\8dया à¤«à¤¾à¤\87लà¥\8dस à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¤¤à¤¾à¤¤ à¤ªà¤£ à¤\85सतà¥\80लà¤\9a à¤\85सà¥\87 à¤¨à¤¾à¤¹à¥\80. à¤\85शा à¤«à¤¾à¤\87लà¥\8dस à¤\86ढळलà¥\8dयास à¤µà¤\97ळलà¥\8dया à¤\9cातà¥\80ल. à¤\85तिरिà¤\95à¥\8dतपणà¥\87,à¤\85शà¥\80 à¤ªà¤¾à¤¨à¥\87, à¤\9cà¥\8dयात à¤\9fाà¤\95लà¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा à¤\85सà¥\8dतितà¥\8dवात à¤¨à¤¾à¤¹à¥\80त,तà¥\8dयाà¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80 [[:$1]] à¤¯à¥\87थà¥\87 à¤¦à¤¿à¤¸à¥\87ल.",
        "wantedfiletext-nocat": "पुढील फाइल्स वापरल्या असतील पण आता अस्तित्वात नाहीत. बाहेरील ठिकाणांच्या फाइल्स येथे दिसतात पण असतीलच असे नाही. अशा फाइल्स आढळल्यास वगळल्या जातील.",
        "wantedtemplates": "पाहिजे असलेले साचे",
        "mostlinked": "सर्वाधिक जोडलेली पाने",
        "mostlinkedcategories": "सर्वाधिक जोडलेले वर्ग",
-       "mostlinkedtemplates": "सरà¥\8dवाधिà¤\95 à¤\9cà¥\8bडलà¥\87लà¥\87 à¤¸à¤¾à¤\9aे",
-       "mostcategories": "सरà¥\8dवाधिà¤\95 à¤µà¤°à¥\8dà¤\97à¥\80à¤\95à¥\83त पाने",
+       "mostlinkedtemplates": "सरà¥\8dवाधिà¤\95 à¤\86à¤\82तरविनà¥\8dयासित à¤ªà¤¾à¤¨े",
+       "mostcategories": "बहà¥\81तà¥\87à¤\95 à¤¸à¤°à¥\8dव à¤µà¤°à¥\8dà¤\97 à¤\85सलà¥\87लà¥\80 पाने",
        "mostimages": "सर्वाधिक जोडलेली चित्रे",
        "mostinterwikis": "सर्वाधिक आंतरविकि दुवे असणारी पाने",
        "mostrevisions": "सर्वाधिक बदललेले लेख",
        "prefixindex": "उपसर्ग असणाऱ्या लेखांची यादी",
        "prefixindex-namespace": "($1 नामविश्व) हा  उपसर्ग असणारी सर्व पाने",
+       "prefixindex-submit": "दर्शवा",
        "prefixindex-strip": "यादीतील उपसर्ग काढा",
        "shortpages": "छोटी पाने",
        "longpages": "मोठी पाने",
        "deadendpages": "टोकाची पाने",
-       "deadendpagestext": "या पानांवर या विकिवरील इतर कुठल्याही पानाला जोडणारा दुवा नाही.",
+       "deadendpagestext": "या पानांवर या {{SITENAME}}वरील इतर कुठल्याही पानाला जोडणारा दुवा नाही.",
        "protectedpages": "सुरक्षित पाने",
        "protectedpages-indef": "फक्त अनंत काळासाठी सुरक्षित केलेले",
-       "protectedpages-summary": "या पानात,अस्तित्वात असणाऱ्या संरक्षित अशा पानाची यादी आहे.नवनिर्माणापासून संरक्षित शीर्षकांच्या यादीसाठी [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] बघा.",
+       "protectedpages-summary": "या पानात,अस्तित्वात असणाऱ्या संरक्षित अशा पानाची यादी आहे.नवनिर्माणापासून संरक्षित शीर्षकांच्या यादीसाठी [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]  बघा.",
        "protectedpages-cascade": "केवळ एकामेकांवर अवलंबून कास्केडींग सुरक्षा (सुरक्षा शिडी)",
        "protectedpages-noredirect": "पुनर्निर्देशने लपवा",
        "protectedpagesempty": "सध्या या नियमावलीने कोणतीही पाने सुरक्षित केलेली नाहीत.",
        "protectedpages-performer": "सदस्याचे रक्षण करीत आहे",
        "protectedpages-params": "रक्षणाची प्राचले",
        "protectedpages-reason": "कारण",
+       "protectedpages-submit": "पाने दर्शवा",
        "protectedpages-unknown-timestamp": "अज्ञात",
        "protectedpages-unknown-performer": "अनामिक सदस्य",
        "protectedtitles": "सुरक्षीत शीर्षके",
        "protectedtitles-summary": "या पानात अशा शीर्षकांची यादी आहे, जी नविन तयार करता येउ  शकणार नाहीत.अस्तित्वात असणाऱ्या संरक्षित पानांच्या यादीसाठी [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] बघा.",
        "protectedtitlesempty": "या नियमावलीने सध्या कोणतीही शीर्षके सुरक्षित केलेली नाहीत.",
+       "protectedtitles-submit": "शीर्षके दर्शवा",
        "listusers": "सदस्यांची यादी",
        "listusers-editsonly": "फक्त संपादनांसहित सदस्य दाखवा",
        "listusers-creationsort": "निर्मितीच्या तारखेप्रमाणे लावा",
        "movethispage": "हे पान स्थानांतरित करा",
        "unusedimagestext": "कृपया लक्षात घ्या की इतर संकेतस्थळे संचिकेशी थेट दुव्याने जोडल्या असू शकतात, त्यामुळे सक्रिय उपयोगात असून सुद्धा यादीत असू शकतात.",
        "unusedcategoriestext": "खालील वर्ग पाने अस्तित्वात आहेत पण कोणतेही लेख किंवा वर्ग त्यांचा वापर करत नाहीत.",
-       "notargettitle": "à¤\95रà¥\8dम(target) नाही",
+       "notargettitle": "लà¤\95à¥\8dषà¥\8dय(à¤\9fारà¤\97à¥\87à¤\9f) नाही",
        "notargettext": "ही क्रिया करण्यासाठी तुम्ही सदस्य किंवा पृष्ठ लिहिले नाही.",
        "nopagetitle": "असे लक्ष्य पान नाही",
        "nopagetext": "तुम्ही दिलेले लक्ष्य पान अस्तित्वात नाही.",
        "pager-newer-n": "{{PLURAL:$1|नवे 1|नवे $1}}",
        "pager-older-n": "{{PLURAL:$1|जुने 1|जुने $1}}",
-       "suppress": "à¤\9dापडबà¤\82द",
+       "suppress": "दमन à¤\95रा(सपà¥\8dरà¥\87स)",
        "querypage-disabled": "हे विषेश पान कार्यमापन (performance) करणांमुळे प्रतिबंधित करण्यात आले आहे.",
+       "apihelp": "एपीआय साहाय्य",
+       "apihelp-no-such-module": "मॉड्यूल \"$1\" सापडत नाही.",
        "booksources": "पुस्तक स्रोत",
        "booksources-search-legend": "पुस्तक स्रोत शोधा",
        "booksources-search": "शोधा",
        "booksources-text": "खालील यादीत नवी आणिजुनी पुस्तके विकणाऱ्या संकेतस्थळाचे दुवे आहेत,आणि त्यात कदाचित आपण शोधू पहात असलेल्या पुस्तकाची अधिक माहिती असेल:",
        "booksources-invalid-isbn": "दिलेला आयएसबीएन वैध नाही; मूळ स्रोतातून उतरवताना झालेल्या चुकांचे निरसन करा.",
        "specialloguserlabel": "कार्यकर्ता:",
-       "speciallogtitlelabel": "à¤\89दà¥\8dदिषà¥\8dà¤\9f (लà¤\95à¥\8dष):",
+       "speciallogtitlelabel": "लà¤\95à¥\8dष (शिरà¥\8dषà¤\95 à¤\95िà¤\82वा {{ns:user}}:सदसà¥\8dयाà¤\9aà¥\87 à¤¸à¤¦à¤¸à¥\8dयनाव):",
        "log": "नोंदी",
-       "all-logs-page": "सर्व नोंदी",
+       "all-logs-page": "सरà¥\8dव à¤¸à¤¾à¤°à¥\8dवà¤\9cनिà¤\95 à¤¨à¥\8bà¤\82दà¥\80",
        "alllogstext": "{{SITENAME}}च्या सर्व नोंदीचे एकत्र दर्शन.नोंद प्रकार, सदस्यनाव किंवा बाधित पान निवडून तुम्ही तुमचे दृश्यपान मर्यादित करू शकता.",
        "logempty": "नोंदीत अशी बाब नाही.",
        "log-title-wildcard": "या मजकुरापासून सुरू होणारी शीर्षके शोधा.",
        "allpagesbadtitle": "दिलेले शीर्षक चुकीचे किंवा आंतरभाषीय किंवा आंतरविकि शब्दाने सुरू होणारे होते. त्यात एक किंवा अधिक शीर्षकात न वापरता येणारी अक्षरे असावीत.",
        "allpages-bad-ns": "{{SITENAME}}मध्ये \"$1\" हे नामविश्व नाही.",
        "allpages-hide-redirects": "पुनर्निर्देशने लपवा",
-       "cachedspecial-viewing-cached-ttl": "तà¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\95à¥\85à¤\9aडà¥\8d à¤\86वà¥\83तà¥\8dतà¥\80 à¤ªà¤¹à¤¾à¤¤ à¤\86हात. à¤ªà¤¾à¤¹à¤¤ à¤\86हात à¤¯à¤¾ à¤ªà¤¾à¤ à¤¯à¤¾ à¤\9aà¥\80 à¤\9bà¥\8bà¤\9fà¥\80  à¤\86वà¥\83तà¥\8dतà¥\80,à¤\9cà¥\80 $1 à¤\88तà¤\95à¥\80 à¤\9cà¥\81नी असू शकते.",
-       "cachedspecial-viewing-cached-ts": "तà¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\95à¥\85à¤\9aडà¥\8d à¤\86वà¥\83तà¥\8dतà¥\80 à¤ªà¤¹à¤¾à¤¤ à¤\86हात. à¤ªà¤¾à¤¹à¤¤ à¤\86हात à¤¯à¤¾ à¤ªà¤¾à¤ à¤¯à¤¾ à¤\9aà¥\80 à¤\9bà¥\8bà¤\9fà¥\80  à¤\86वà¥\83तà¥\8dतà¥\80,à¤\9cà¥\80 à¤ªà¥\81रà¥\8dणतà¤\83 à¤®à¥\81ळ आवृत्ती नसू शकते.",
-       "cachedspecial-refresh-now": "à¤\86à¤\96à¥\87रà¤\9aà¥\87 à¤¦à¥\83शà¥\8dय",
+       "cachedspecial-viewing-cached-ttl": "तà¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\95à¥\85शà¥\87मधà¥\80ल à¤\86वà¥\83तà¥\8dतà¥\80 à¤ªà¤¹à¤¾à¤¤ à¤\86हात à¤\9cà¥\80, $1 à¤\88तà¤\95à¥\80 à¤\9cà¥\82नी असू शकते.",
+       "cachedspecial-viewing-cached-ts": "तà¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤\95à¥\85शà¥\87तà¥\80ल à¤\86वà¥\83तà¥\8dतà¥\80 à¤ªà¤¹à¤¾à¤¤ à¤\86हात à¤\9cà¥\80, à¤ªà¥\81रà¥\8dणतà¤\83 à¤®à¥\82ळ आवृत्ती नसू शकते.",
+       "cachedspecial-refresh-now": "नà¥\81à¤\95तà¥\87à¤\9a à¤\95à¥\87लà¥\87लà¥\87 à¤¦à¤¾à¤\96वा.",
        "categories": "वर्ग",
        "categoriespagetext": "विकिवर खालील वर्ग {{PLURAL:$1|आहे|आहेत}}.\n[[Special:UnusedCategories|न वापरलेले वर्ग]] येथे दाखवलेले नाहीत.\nहेही पहा: [[Special:WantedCategories|पाहिजे असलेले वर्ग]].",
        "categoriesfrom": "या शब्दापासून सुरू होणारे वर्ग दाखवा:",
-       "special-categories-sort-count": "à¤\95à¥\8dरमानà¥\81सार à¤²à¤¾à¤µा",
-       "special-categories-sort-abc": "à¤\85à¤\95à¥\8dषराà¤\82पà¥\8dरमाणà¥\87 à¤²à¤¾à¤µा",
+       "special-categories-sort-count": "मà¥\8bà¤\9cणà¥\80नà¥\81सार à¤¨à¤¿à¤µà¤¡ा",
+       "special-categories-sort-abc": "à¤\85à¤\95ारविलà¥\8dहà¥\87 à¤¨à¤¿à¤µà¤¡ा",
        "deletedcontributions": "वगळलेली सदस्य संपादने",
        "deletedcontributions-title": "वगळलेली सदस्य संपादने",
        "sp-deletedcontributions-contribs": "संपादने",
        "linksearch": "बाह्य दुवे शोध",
-       "linksearch-pat": "शोधण्याचा मजकूर:",
+       "linksearch-pat": "शोध पद्धत:",
        "linksearch-ns": "नामविश्व:",
        "linksearch-ok": "शोध",
        "linksearch-text": "\"*.wikipedia.org\" सारखी वाईल्डकार्ड्स वापरायला परवानगी आहे.\nकिमान एक उच्च-स्तरिय डोमेन,उदा.- \"*.org\".<br />गरजेचे आहे.\nसहाय्याचे प्रोटोकॉल्स {{PLURAL:$2|protocol|protocols}}:  \n $1(जर कोणतेही प्रोटोकॉल्स नमूद केल्या गेले नसतील तर http://)हा डिफॉल्ट आहे.",
        "listusersfrom": "पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:",
        "listusers-submit": "दाखवा",
        "listusers-noresult": "एकही सदस्य सापडला नाही.",
-       "listusers-blocked": "(à¤\96à¤\82डित)",
-       "activeusers": "à¤\95ारà¥\8dयरत सदस्यांची यादी",
-       "activeusers-intro": "$1 {{PLURAL:$1|day|days}} मधे शेवटी काम केलेल्या सदस्यांची यादी येथे मिळेल",
+       "listusers-blocked": "(à¤\85वरà¥\8bधित)",
+       "activeusers": "à¤\95à¥\8dरियाशà¥\80ल सदस्यांची यादी",
+       "activeusers-intro": "शेवटच्या $1 {{PLURAL:$1|दिवसात}} काम केलेल्या सदस्यांची यादी येथे मिळेल",
        "activeusers-count": "शेवटच्या {{PLURAL:$3|दिवसात|$3 दिवसांत}} $1 {{PLURAL:$1|क्रिया}}",
        "activeusers-from": "पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:",
        "activeusers-hidebots": "सांगकामे लपवा",
        "activeusers-hidesysops": "प्रचालक लपवा",
        "activeusers-noresult": "एकही सदस्य सापडला नाही.",
+       "activeusers-submit": "सक्रिय सदस्य दर्शवा",
        "listgrouprights": "सदस्य गट अधिकार",
-       "listgrouprights-summary": "à¤\96ालà¥\80 à¤¯à¤¾ à¤µà¤¿à¤\95िवर à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤\97à¤\9fाà¤\82à¤\9aà¥\80 à¤¯à¤¾à¤¦à¥\80 à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤\85धिà¤\95ाराà¤\82सà¤\95à¤\9f à¤¦à¤°à¥\8dशविलà¥\87लà¥\80 à¤\86हà¥\87. à¤ªà¥\8dरतà¥\8dयà¥\87à¤\95ाà¤\9aà¥\8dया à¤\85धिà¤\95ाराà¤\82à¤\9aà¥\80 à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 [[{{MediaWiki:Listgrouprights-helppage}}|à¤\87थà¥\87]] à¤¦à¤¿à¤²à¥\87लà¥\80 à¤\86हे.",
+       "listgrouprights-summary": "या à¤µà¤¿à¤\95िवर à¤¦à¤¿à¤²à¥\87लà¥\80 à¤¸à¤¦à¤¸à¥\8dय à¤\97à¤\9fाà¤\82à¤\9aà¥\80 à¤µà¥\8dयाà¤\96à¥\8dयिà¤\95à¥\83त à¤¯à¤¾à¤¦à¥\80 à¤¤à¥\8dयाà¤\82à¤\9aà¥\8dया à¤\85धिà¤\95ाराà¤\82सà¤\95à¤\9f à¤\96ालà¥\80 à¤¦à¤°à¥\8dशविलà¥\87लà¥\80 à¤\86हà¥\87. à¤ªà¥\8dरतà¥\8dयà¥\87à¤\95ाà¤\9aà¥\8dया à¤µà¥\88यà¤\95à¥\8dतिà¤\95 à¤\85धिà¤\95ाराà¤\82à¤\9aà¥\80 [[{{MediaWiki:Listgrouprights-helppage}}|à¤\85धिà¤\95 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80]] à¤¯à¥\87थà¥\87 à¤\85सà¥\81 à¤¶à¤\95ते.",
        "listgrouprights-key": "विवरण:\n* <span class=\"listgrouprights-granted\">प्रदत्त अधिकार</span>\n* <span class=\"listgrouprights-revoked\">रद्द अधिकार</span>",
        "listgrouprights-group": "गट",
        "listgrouprights-rights": "अधिकार",
        "listgrouprights-namespaceprotection-header": "नामविश्व प्रतिबंध",
        "listgrouprights-namespaceprotection-namespace": "नामविश्व",
        "trackingcategories": "वर्ग शोधत आहोत",
+       "trackingcategories-summary": "या पानात ते रेखापथनातील वर्ग(tracking categories) आहेत, जे, मिडियाविकि संचेतनाद्वारे स्वयंचलितरित्या वसविण्यात (तयार करण्यात) आले आहेत. त्यांची नावे, {{ns:8}} नामविश्वातील संबंधित प्रणाली संदेशात फेरफार करुन, बदलविता येतात.",
        "trackingcategories-name": "संदेश नाम",
+       "trackingcategories-desc": "वर्ग अंतर्भूत करण्याचे निकष",
+       "trackingcategories-nodesc": "वर्णन उपलब्ध नाही.",
+       "trackingcategories-disabled": "वर्ग अक्षम केल्या गेला आहे",
        "mailnologin": "पाठविण्याचा पत्ता नाही",
        "mailnologintext": "इतर सदस्यांना विपत्र(ई-मेल) पाठवण्याकरिता तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असणे आणि  प्रमाणित (ई-मेल) पत्ता तुमच्या [[Special:Preferences|पसंतीत]] नमूद असणे आवश्यक आहे.",
        "emailuser": "या सदस्याला ई-मेल पाठवा",
        "emailuser-title-notarget": "विपत्र (ईमेल) उपयोगकर्ता",
        "emailpagetext": "या {{GENDER:$1|सदस्याला}}विपत्र पाठविण्यास खालील आवेदनाचा आपण वापर करु शकता.\n\nआपल्या [[Special:Preferences|पसंतीक्रमात]] नमूद केलेला विपत्रपत्ता, \"च्या कडून\" पत्त्यात येईल म्हणजे  प्राप्तकर्ता आपल्याला थेट उत्तर देऊ शकेल.",
        "defemailsubject": "{{SITENAME}} \"$1\" सदस्याकडून विपत्र",
-       "usermaildisabled": "सदसà¥\8dय à¤µà¤¿à¤ªà¤¤à¥\8dर à¤¨à¤¿à¤·à¥\8dà¤\95à¥\8dरिय आहे",
+       "usermaildisabled": "सदसà¥\8dय à¤µà¤¿à¤ªà¤¤à¥\8dर à¤\85à¤\95à¥\8dषम आहे",
        "usermaildisabledtext": "या विकिवर तुम्हाला इतर सदस्यांना विपत्रे पाठवता येत नाहीत",
        "noemailtitle": "विपत्र पत्ता नाही",
        "noemailtext": "या सदस्याने वैध विपत्र पत्ता नमूद केलेला नाही.",
        "emailccsubject": "$1 ला पाठविलेल्या आपल्या विपत्राची प्रत: $2",
        "emailsent": "विपत्र पाठवले",
        "emailsenttext": "तुमचा विपत्र संदेश पाठवण्यात आला आहे.",
-       "emailuserfooter": "$1 ने $2 ला हे विपत्र, {{SITENAME}} वरील, \"सदस्यास विपत्र पाठवा\" ही प्रक्रिया वापरुन पाठवले आहे.",
+       "emailuserfooter": "हे विपत्र,{{SITENAME}} वरील, \"{{int:emailuser}}\" ही प्रक्रिया वापरुन $1 ने {{GENDER:$2|$2}} ला {{GENDER:$1|पाठविले}} आहे.",
        "usermessage-summary": "प्रणाली संदेश देत आहे.",
        "usermessage-editor": "प्रणाली संदेशवाहक",
        "watchlist": "निरीक्षणसूची",
        "mywatchlist": "माझी निरीक्षणसूची",
        "watchlistfor2": "$1 $2 साठी",
        "nowatchlist": "तुमची पहाऱ्याची सूची रिकामी आहे.",
-       "watchlistanontext": "तुमच्या पहाऱ्याच्या सूचीमधील बाबी पाहण्याकरता किंवा संपादित करण्याकरता, कृपया $1.",
+       "watchlistanontext": "तुमच्या पहाऱ्याच्या सूचीमधील बाबी पाहण्याकरता किंवा संपादित करण्याकरता, कृपया सनोंद प्रवेश करा.",
        "watchnologin": "सनोंद-प्रवेशित नाही",
        "addwatch": "पहाऱ्याच्या सूचीमध्ये टाका",
-       "addedwatchtext": "\"[[:$1]]\"  हे पान तुमच्या  [[Special:Watchlist|'माझी निरीक्षणसूची']]मध्ये टाकले आहे. या पानावरील तसेच त्याच्या चर्चा पानावरील भविष्यातील बदल तेथे दाखवले जातील",
+       "addedwatchtext": "\"[[:$1]]\"  हे पान व त्याचे चर्चापान तुमच्या  [[Special:Watchlist|'माझी निरीक्षणसूची']] मध्ये टाकले आहे.",
+       "addedwatchtext-short": "\"$1\" हे पान आपल्या निरीक्षणसूचीत जोडण्यात आले आहे.",
        "removewatch": "पहाऱ्याच्या सूचीतून वगळा",
-       "removedwatchtext": "\"[[:$1]]\" पान तुमच्या [[Special:Watchlist|पहाऱ्याच्या सूची]]तून वगळण्यात आले आहे.",
+       "removedwatchtext": "\"[[:$1]]\" हे पान व त्याची चर्चापाने तुमच्या [[Special:Watchlist|निरीक्षण सूचीतून]] हटविण्यात आले आहे.",
+       "removedwatchtext-short": "\"$1\" हे पान आपल्या निरीक्षणसूचीतुन हटविण्यात आले आहे.",
        "watch": "पहारा",
        "watchthispage": "या पानावर बदलांसाठी लक्ष ठेवा.",
        "unwatch": "पहारा काढा",
        "unwatchthispage": "पहारा काढून टाका",
        "notanarticle": "हे आशयपान नाही",
        "notvisiblerev": "आवृत्ती वगळण्यात आलेली आहे",
-       "watchlist-details": "पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने मोजलेली नाहीत.",
+       "watchlist-details": "पहाऱ्याच्या सूचीमधील {{PLURAL:$1|$1 पान|$1 पाने}}, यात चर्चा पाने  वेगळी मोजलेली नाहीत.",
        "wlheader-enotif": "विपत्र अधिसूचना सुविधा शक्य केली.",
        "wlheader-showupdated": "ती पाने, जी आपण दिलेल्या शेवटच्या भेटीनंतर बदललेली आहेत, '''ठळक''' दाखवली आहेत.",
-       "wlnote": "खाली $3, $4 पर्यंतचे गेल्या {{PLURAL:$2| '''१''' तासातील|'''$2''' तासातील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे '''$1'''बदल दिले आहेत}}.",
-       "wlshowlast": "मागील $1 तास $2 दिवस  पहा",
+       "wlnote": "खाली $3, $4 चे गेल्या {{PLURAL:$2|तासातील|<strong>$2</strong> तासांतील}} {{PLURAL:$1|शेवटचा बदल दिला आहे|शेवटाचे<strong>$1</strong>बदल दिले आहेत}}.",
+       "wlshowlast": "मागील $1 तास $2 दिवस दाखवा",
+       "watchlistall2": "सर्व",
+       "watchlist-hide": "लपवा",
+       "watchlist-submit": "दर्शवा",
+       "wlshowtime": "शेवटचे दाखवा:",
+       "wlshowhideminor": "छोटी संपादने",
+       "wlshowhidebots": "सांगकामे",
+       "wlshowhideliu": "नोंदणीकृत सदस्य",
+       "wlshowhideanons": "अनामिक सदस्य",
+       "wlshowhidepatr": "पहारा केलेली संपादने",
+       "wlshowhidemine": "माझी संपादने",
        "watchlist-options": "पहाऱ्याच्या सूचीचे पर्याय",
        "watching": "पहारा देत आहे...",
        "unwatching": "पहारा काढत आहे...",
        "enotif_lastvisited": "तुमच्या शेवटच्या भेटीनंतरचे बदल बघण्यासाठी $1 पहा.",
        "enotif_lastdiff": "हा बदल पहाण्याकरिता $1 पहा.",
        "enotif_anon_editor": "अनामिक सदस्य $1",
-       "enotif_body": "पà¥\8dरिय $WATCHINGUSERNAME,\n\n{{SITENAME}}या à¤²à¥\87à¤\96नावाà¤\9aà¥\87 $PAGETITLE (या à¤®à¤¥à¤³à¥\8dयाà¤\9aà¥\87) à¤ªà¤¾à¤¨ $PAGEEDITOR à¤¨à¥\87 $PAGEEDITDATE ( à¤¯à¤¾ à¤¤à¤¾à¤°à¤\96à¥\87स) $CHANGEDORCREATED à¤¤à¤¯à¤¾à¤° à¤\95à¥\87लà¥\87 à¤\95िà¤\82वा à¤¬à¤¦à¤²à¤²à¥\87 à¤\86हà¥\87. à¤¸à¤§à¥\8dयाà¤\9aà¥\80 à¤\86वà¥\83तà¥\8dतà¥\80 à¤ªà¤¾à¤¹à¤£à¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤¦à¥\81वà¥\8dयावर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾.\n$PAGETITLE_URL\n\n$NEWPAGE\n\nसà¤\82पादà¤\95ाà¤\9aा à¤\86ढावा : $PAGESUMMARY $PAGEMINOREDIT\n\nया à¤¸à¤\82पादà¤\95ास à¤¸à¤\82परà¥\8dà¤\95 à¤\95रा :\nविपतà¥\8dर: $PAGEEDITOR_EMAIL\nविà¤\95ि: $PAGEEDITOR_WIKI\n\nतà¥\81मà¥\8dहà¥\80 à¤ªà¤¾à¤¨à¤¾à¤¸ à¤­à¥\87à¤\9f à¤¦à¥\87त à¤¨à¤¾à¤¹à¥\80 à¤¤à¥\8bपरà¥\8dयà¤\82त,या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤ªà¥\81ढà¥\87 à¤¹à¥\8bणाऱà¥\8dया à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤\95à¥\8dरियाà¤\82à¤\9aà¥\80 à¤\87तर à¤\95à¥\8bणतà¥\80हà¥\80 à¤µà¥\87à¤\97ळà¥\80 सूचना तुम्हाला देण्यात येणार नाही. तुमच्या निरीक्षणसूचीमध्ये असलेल्या पानांच्या सूचना-पताकांचे तुम्ही पुर्नयोजन करु शकता.\n\nतुमची मैत्रीपूर्ण {{SITENAME}} सूचना प्रणाली\n\n--\n\nतुमच्या निरीक्षणसूचीमध्ये पानांची मांडणावळ (कोंदण)तुम्ही बदलू शकता, त्यासाठी {{canonicalurl:{{#special:EditWatchlist}}}} या पानावर जा.\n\nहे पान तुमच्या निरीक्षणसूचीमधून काढून टाकण्यासाठी खालील दुव्यावर टिचकी मारा.\n$UNWATCHURL\n\nपुढील साहाय्य आणि प्रतिक्रिया:\n$HELPPAGE",
+       "enotif_body": "पà¥\8dरिय $WATCHINGUSERNAME,\n\n{{SITENAME}}या à¤²à¥\87à¤\96नावाà¤\9aà¥\87 $PAGETITLE (या à¤®à¤¥à¤³à¥\8dयाà¤\9aà¥\87) à¤ªà¤¾à¤¨ $PAGEEDITOR à¤¨à¥\87 $PAGEEDITDATE ( à¤¯à¤¾ à¤¤à¤¾à¤°à¤\96à¥\87स) $CHANGEDORCREATED à¤¤à¤¯à¤¾à¤° à¤\95à¥\87लà¥\87 à¤\95िà¤\82वा à¤¬à¤¦à¤²à¤²à¥\87 à¤\86हà¥\87. à¤¸à¤§à¥\8dयाà¤\9aà¥\80 à¤\86वà¥\83तà¥\8dतà¥\80 à¤ªà¤¾à¤¹à¤£à¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤¦à¥\81वà¥\8dयावर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾.\n$PAGETITLE_URL\n\n$NEWPAGE\n\nसà¤\82पादà¤\95ाà¤\9aा à¤\86ढावा : $PAGESUMMARY $PAGEMINOREDIT\n\nया à¤¸à¤\82पादà¤\95ास à¤¸à¤\82परà¥\8dà¤\95 à¤\95रा :\nविपतà¥\8dर: $PAGEEDITOR_EMAIL\nविà¤\95ि: $PAGEEDITOR_WIKI\n\nतà¥\81मà¥\8dहà¥\80 à¤¸à¤¨à¥\8bà¤\82द à¤ªà¥\8dरवà¥\87शà¥\81न à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤¸ à¤­à¥\87à¤\9f à¤¦à¥\87त à¤¨à¤¾à¤¹à¥\80 à¤¤à¥\8bपरà¥\8dयà¤\82त,या à¤ªà¤¾à¤¨à¤¾à¤µà¤° à¤ªà¥\81ढà¥\87 à¤¹à¥\8bणाऱà¥\8dया à¤\95à¥\8bणतà¥\8dयाहà¥\80 à¤\95à¥\8dरियाà¤\82à¤\9aà¥\80 à¤\87तर à¤\95à¥\8bणतà¥\80हà¥\80 à¤µà¥\87à¤\97ळà¥\80 à¤\85धिसूचना तुम्हाला देण्यात येणार नाही. तुमच्या निरीक्षणसूचीमध्ये असलेल्या पानांच्या सूचना-पताकांचे तुम्ही पुर्नयोजन करु शकता.\n\nतुमची मैत्रीपूर्ण {{SITENAME}} सूचना प्रणाली\n\n--\n\nतुमच्या निरीक्षणसूचीमध्ये पानांची मांडणावळ (कोंदण)तुम्ही बदलू शकता, त्यासाठी {{canonicalurl:{{#special:EditWatchlist}}}} या पानावर जा.\n\nहे पान तुमच्या निरीक्षणसूचीमधून काढून टाकण्यासाठी खालील दुव्यावर टिचकी मारा.\n$UNWATCHURL\n\nपुढील साहाय्य आणि प्रतिक्रिया:\n$HELPPAGE",
        "created": "तयार केले",
        "changed": "बदलले",
        "deletepage": "पान वगळा",
        "exbeforeblank": "वगळण्यापूर्वीचा मजकूर पुढीलप्रमाणे: '$1'",
        "delete-confirm": "\"$1\" वगळा",
        "delete-legend": "वगळा",
-       "historywarning": "<strong>à¤\88शारा:</strong> à¤¤à¥\81मà¥\8dहà¥\80 वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:",
-       "confirmdeletetext": "तà¥\81मà¥\8dहà¥\80 à¤\8fà¤\95 à¤²à¥\87à¤\96पान à¤¤à¥\8dयाà¤\9aà¥\8dया à¤¸à¤°à¥\8dव à¤\87तिहासासà¥\8bबत à¤µà¤\97ळणà¥\8dयाà¤\9aà¥\8dया à¤¤à¤¯à¤¾à¤°à¥\80त à¤\86हात.\nà¤\95à¥\83पया, à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रà¥\80त à¤\85सलà¥\87लà¥\80 à¤\95à¥\83तà¥\80 à¤¹à¥\80 à¤®à¥\80डियाविà¤\95à¥\80à¤\9aà¥\8dया [[{{MediaWiki:Policy-url}}|नà¥\80तà¥\80नà¥\81सार]] à¤\86हà¥\87 à¤¹à¥\8dयाà¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रा. à¤¤à¤¸à¥\87à¤\9a, à¤¤à¥\81मà¥\8dहà¥\80 à¤\95रà¥\80त à¤\85सलà¥\87लà¥\8dया à¤\95à¥\83तà¥\80à¤\9aà¥\87 à¤ªà¤°à¤¿à¤£à¤¾à¤®, à¤\95à¥\83तà¥\80 à¤\95रणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤\9cाणà¥\82न à¤\98à¥\8dया.",
+       "historywarning": "<strong>à¤\87शारा:</strong> à¤\86पण वगळत असलेल्या पानाला $1 {{PLURAL:$1|आवर्तनाचा|आवर्तनांचा}} इतिहास आहे:",
+       "confirmdeletetext": "à¤\86पण à¤\8fà¤\95 à¤²à¥\87à¤\96पान à¤¤à¥\8dयाà¤\9aà¥\8dया à¤¸à¤°à¥\8dव à¤\87तिहासासà¥\8bबत à¤µà¤\97ळणà¥\8dयाà¤\9aà¥\8dया à¤¤à¤¯à¤¾à¤°à¥\80त à¤\86हात.\nà¤\95à¥\83पया, à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95ि, à¤\95रà¥\80त à¤\85सलà¥\87लà¥\8dया à¤\95à¥\83तà¥\80à¤\9aà¥\87 à¤ªà¤°à¤¿à¤£à¤¾à¤®, à¤\86पण à¤\95à¥\83तà¥\80 à¤\95रणà¥\8dयापà¥\82रà¥\8dवà¥\80 à¤\9cाणà¥\82न à¤\98à¥\87तलà¥\87 à¤\86हà¥\87त à¤µ à¤\86पण à¤¹à¥\87   [[{{MediaWiki:Policy-url}}|मà¥\80डियाविà¤\95à¥\80à¤\9aà¥\8dया à¤¨à¥\80तà¥\80नà¥\81सारà¤\9a]] à¤\95रà¥\80त à¤\86हात.",
        "actioncomplete": "काम पूर्ण",
        "actionfailed": "कृती अयशस्वी झाली",
        "deletedtext": "\"$1\" हा लेख वगळला. अलीकडे वगळलेले लेख पाहण्यासाठी $2 पहा.",
        "delete-edit-reasonlist": "वगळण्याची कारणे संपादित करा",
        "delete-toobig": "या पानाला, $1 {{PLURAL:$1|आवृत्ती|आवृत्त्यां}}मुळे तयार झालेला खूप मोठा संपादन इतिहास आहे. {{SITENAME}} वर आकस्मिक होणारी उलथापालथ वाचविण्यासाठी, अश्या पानांचे वगळणे प्रतिबंधित केल्या गेले आहे.",
        "delete-warning-toobig": "या पानाला, $1 {{PLURAL:$1|आवृत्ती|आवृत्त्यां}}मुळे तयार झालेला खूप मोठा संपादन इतिहास आहे.त्याचे वगळण्याने {{SITENAME}} वर डाटाबेसच्या क्रियांची उलथापालथ होऊ शकते; सावधगिरीने पुढे जा.",
-       "deleting-backlinks-warning": "'''ईशारा:''' आपण वगळत असणाऱ्या पानास दुसरी पाने जोडलेली किंवा आंतरविन्यासित आहेत.",
+       "deleteprotected": "आपण हे पान वगळू शकत नाही कारण ते सुरक्षित केले आहे.",
+       "deleting-backlinks-warning": "'''ईशारा:'''  आपण वगळत असणाऱ्या पानास, [[Special:WhatLinksHere/{{FULLPAGENAME}}|इतर पाने]] जोडलेली किंवा आंतरविन्यासित आहेत.",
        "rollback": "बदल वेगात माघारी न्या",
        "rollbacklink": "द्रुतमाघार",
        "rollbacklinkcount": "उलटवा $1 {{PLURAL:$1|संपादन|संपादने}}",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Talk]] [[Special:Contributions/$2|{{int:contribslink}}]])चे शेवटाचे [[:$1]]वे संपादन माघारी परतवता येत नाही; पान आधीच कुणी माघारी परतवले आहे किंवा संपादित केले आहे.\n\nशेवटचे संपादन [[User:$3|$3]] ([[User talk:$3|Talk]] [[Special:Contributions/$3|{{int:contribslink}}]])-चे होते.",
        "editcomment": "संपादन सारांश \"''$1''\" होता.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|चर्चा]]) यांनी केलेले बदल [[User:$1|$1]] यांच्या आवृत्तीकडे पूर्वपदास नेले.",
-       "revertpage-nouser": "लपविलेल्या सदस्याची संपादने उलटवून मागील आवृत्तीप्रमाणे पूर्ववत केले{{GENDER:$1|[[सदस्य:$1|$1]]}}",
+       "revertpage-nouser": "लपविलेल्या सदस्याची संपादने उलटवून {{GENDER:$1|[[User:$1|$1]]}}च्या मागील आवृत्तीप्रमाणे पूर्ववत केले",
        "rollback-success": "$1 ने उलटवलेली संपादने;$2 च्या आवृत्तीस परत नेली.",
        "sessionfailure-title": "सत्र त्रुटी",
        "sessionfailure": "तुमच्या दाखल सत्रात काही समस्या दिसते;सत्र अपहारणापासून \nवाचविण्याचे दृष्टीने ही कृती रद्द केल्या गेली आहे.कृपया आपल्या विचरकाच्या \"back\" कळीवर टिचकी मारा आणि तुम्ही ज्या पानावरून आला ते पुन्हा चढवा,आणि परत प्रयत्न करा.",
        "changecontentmodel-title-label": "लेखपान शीर्ष",
        "changecontentmodel-reason-label": "कारण:",
+       "logentry-contentmodel-change-revertlink": "उलटवा",
+       "logentry-contentmodel-change-revert": "उलटवा",
        "protectlogpage": "सुरक्षा नोंदी",
        "protectlogtext": "पानांना लावलेल्या ताळ्यांची आणि ताळे उघडण्याबद्दलच्या पानाची खाली सूची दिली आहे.सध्याच्या सुरक्षित पानांबद्दलच्या माहितीकरिता [[Special:ProtectedPages|सुरक्षीत पानांची सूची]] पहा.",
        "protectedarticle": "\"[[$1]]\" सुरक्षित केला",
        "protect-locked-blocked": "तुम्ही प्रतिबंधित असताना सुरक्षा पातळी बदलू शकत नाही.येथे <strong>$1</strong> पानाकरिता सध्याची मांडणावळ आहे:",
        "protect-locked-dblock": "विदागारास ताळे लागलेले असताना सुरक्षा पातळी बदलता येत नाही.येथे <strong>$1</strong> पानाकरिता सध्याची मांडणावळ आहे:",
        "protect-locked-access": "तुम्हाला या पानाची सुरक्षा पातळी बदलण्याचे अधिकार नाहीत.\n<strong>$1</strong> या पानाची सुरक्षा पातळी पुढीलप्रमाणे:",
-       "protect-cascadeon": "हà¥\87 à¤ªà¤¾à¤¨ à¤¸à¤§à¥\8dया à¤¸à¥\81रà¤\95à¥\8dषित à¤\86हà¥\87 à¤\95ारण à¤¤à¥\87 {{PLURAL:$1|या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\8dया|या à¤ªà¤¾à¤¨à¤¾à¤\82à¤\9aà¥\8dया}} à¤¸à¥\81रà¤\95à¥\8dषा à¤¶à¤¿à¤¡à¥\80वर à¤\86हà¥\87. à¤¤à¥\81मà¥\8dहà¥\80 à¤¯à¤¾ à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤¸à¥\81रà¤\95à¥\8dषा à¤ªà¤¾à¤¤à¤³à¥\80 à¤¬à¤¦à¤²à¥\82 à¤¶à¤\95ता, à¤ªà¤£ à¤¤à¥\8dयानà¥\87 à¤¸à¥\81रà¤\95à¥\8dषाशिडà¥\80 à¤®à¤§à¥\8dयà¥\87 à¤¬à¤¦à¤² à¤¹à¥\8bणार à¤¨à¤¾à¤¹à¥\80त.",
+       "protect-cascadeon": "हà¥\87 à¤ªà¤¾à¤¨ à¤¸à¥\81रà¤\95à¥\8dषित à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤\86हà¥\87, à¤\95ारण à¤¤à¥\87 à¤\96ालà¥\80ल {{PLURAL:$1|पानात|पानाà¤\82मधà¥\8dयà¥\87}} à¤\86à¤\82तरविनà¥\8dयासित à¤\95à¥\87लà¥\87लà¥\87 à¤\86हà¥\87,{{PLURAL:$1|à¤\9cà¥\87 à¤ªà¤¾à¤¨|à¤\9cà¥\80 à¤ªà¤¾à¤¨à¥\87 }} à¤¨à¤¿à¤ªà¤¤à¤¨ à¤ªà¤°à¥\8dयाय à¤¸à¥\81रà¥\81 à¤\95à¥\87लà¥\8dयामà¥\81ळà¥\87 à¤¸à¥\81रà¤\95à¥\8dषित à¤\86हà¥\87त.या à¤ªà¤¾à¤¨à¤¾à¤\9aà¥\80 à¤¸à¥\81रà¤\95à¥\8dषापातळà¥\80 à¤¬à¤¦à¤²à¤£à¥\8dयानà¥\87 à¤¤à¥\8dयाà¤\9aà¥\80 à¤¨à¤¿à¤ªà¤¤à¤¨ à¤¸à¥\81रà¤\95à¥\8dषा à¤¬à¤¦à¤²à¤£à¤¾à¤° à¤¨à¤¾à¤¹à¥\80.",
        "protect-default": "सर्व सदस्यांना परवानगी द्या",
        "protect-fallback": "फक्त \"$1\" परवानगी असणाऱ्यांनाच परवानगी द्या",
        "protect-level-autoconfirmed": "फक्त स्वयंशाबीत (ऑटोकन्फर्म) सदस्यांनाच परवानगी आहे",
        "protect-othertime": "इतर वेळ:",
        "protect-othertime-op": "इतर वेळ",
        "protect-existing-expiry": "शेवट दिनांक: $3, $2",
+       "protect-existing-expiry-infinity": "सध्याच्या वेळेची मुदत:अनंत",
        "protect-otherreason": "इतर / अतिरिक्त कारण:",
        "protect-otherreason-op": "दुसरे कारण",
        "protect-dropdown": "* सुरक्षित करण्याची सामान्य कारणे\n** अती उपद्रव\n** अती उत्पात\n** अनुत्पादक संपादन युद्ध\n** अत्यधिक वाचकभेटींचे पान",
        "undelete-bad-store-key": "$1 वेळ दिलेली संचिका आवर्तन पुनर्स्थापित करता येत नाही:संचिका वगळण्यापूर्वी पासून मिळाली नव्हती.",
        "undelete-cleanup-error": "न वापरलेली विदा संचिका \"$1\" वगळताना त्रुटी दाखवते.",
        "undelete-missing-filearchive": "संचिका विदास्मृती ID $1 पुनर्स्थापित करू शकत नाही कारण ती विदागारात उपलब्ध नाही. ती आधीच पुनर्स्थापित केली असण्याची शक्यता सुद्धा असू शकते.",
-       "undelete-error": "पान à¤ªà¥\81नरà¥\8dसà¥\8dथापनात à¤¤à¥\8dरà¥\82टी",
-       "undelete-error-short": "सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤µà¤\97ळणà¥\87 à¤\89लà¤\9fवताना à¤¤à¥\8dरà¥\82टी: $1",
+       "undelete-error": "पान à¤ªà¥\81नरà¥\8dसà¥\8dथापनात à¤¤à¥\8dरà¥\81टी",
+       "undelete-error-short": "सà¤\82à¤\9aिà¤\95à¥\87à¤\9aà¥\87 à¤µà¤\97ळणà¥\87 à¤\89लà¤\9fवताना à¤¤à¥\8dरà¥\81टी: $1",
        "undelete-error-long": "संचिकेचे वगळणे उलटवताना त्रुटींचा अडथळा आला:\n\n$1",
        "undelete-show-file-confirm": "तुम्ही \"<nowiki>$1</nowiki>\" या संचिकेचे $2 येथून $3 वेळी असलेले आवर्तन नक्की पहाणार आहात?",
        "undelete-show-file-submit": "होय",
        "contributions": "{{GENDER:$1|सदस्य}} योगदान",
        "contributions-title": "$1 साठी सदस्य-योगदान",
        "mycontris": "योगदान",
+       "anoncontribs": "योगदान",
        "contribsub2": "{{GENDER:$3|$1}} ($2) साठी",
+       "contributions-userdoesnotexist": "सदस्यखाते \"$1\"  हे नोंदलेले नाही.",
        "nocontribs": "या मानदंडाशी जुळणारे बदल सापडले नाहीत.",
        "uctop": "(सद्य)",
        "month": "या महिन्यापासून (आणि पूर्वीचे):",
        "sp-contributions-newbies-sub": "नवशिक्यांसाठी",
        "sp-contributions-newbies-title": "नवीन खात्यांसाठी सदस्य योगदान",
        "sp-contributions-blocklog": "रोध नोंदी",
+       "sp-contributions-suppresslog": "सदस्य योगदानाचे दमन केले",
        "sp-contributions-deleted": "वगळलेली सदस्य संपादने",
        "sp-contributions-uploads": "अपभारणे",
        "sp-contributions-logs": "नोंदी",
        "sp-contributions-talk": "चर्चा",
        "sp-contributions-userrights": "सदस्य अधिकार व्यवस्थापन",
        "sp-contributions-blocked-notice": "हा सदस्य सध्या प्रतिबंधित आहे.\nसर्वांत नवीन प्रतिबंधन यादी खाली संदर्भासाठी दिली आहे:",
-       "sp-contributions-blocked-notice-anon": "हा à¤\85à¤\82à¤\95पतà¥\8dता à¤¸à¤§à¥\8dया à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87.\nसरà¥\8dवाà¤\82त à¤¨à¤µà¥\80न à¤ªà¥\8dरतिबà¤\82धन à¤¯à¤¾à¤¦à¥\80 à¤\96ाली संदर्भासाठी दिली आहे:",
+       "sp-contributions-blocked-notice-anon": "हा à¤\85à¤\82à¤\95पतà¥\8dता à¤¸à¤§à¥\8dया à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87.\nà¤\96ालà¥\80, à¤¸à¤°à¥\8dवाà¤\82त à¤¨à¤µà¥\80नतम à¤ªà¥\8dरतिबà¤\82धन à¤¨à¥\8bà¤\82दपà¥\8dरविषà¥\8dà¤\9fी संदर्भासाठी दिली आहे:",
        "sp-contributions-search": "योगदान शोधयंत्र",
        "sp-contributions-username": "आंतरजाल अंकपत्ता किंवा सदस्यनाम:",
        "sp-contributions-toponly": "केवळ नवीनतम आवर्तने असलेलीच संपादने दाखवा",
+       "sp-contributions-newonly": "ज्याने नविन पान तयार झाले, केवळ अशीच संपादने दाखवा",
        "sp-contributions-submit": "शोध",
        "whatlinkshere": "येथे काय जोडले आहे",
        "whatlinkshere-title": "\"$1\" ला जुळलेली पाने",
        "nolinkshere": "'''[[:$1]]''' येथे कोणत्याही पानांचे दुवे नाहीत.",
        "nolinkshere-ns": "निवडलेल्या नामविश्वातील कोणतीही पाने <strong>[[:$1]]</strong>ला दुवा देत नाहीत .",
        "isredirect": "पुनर्निर्देशित पान",
-       "istemplate": "मिळवा",
+       "istemplate": "à¤\86à¤\82तरà¥\8dनà¥\8dयास (à¤\9fà¥\8dराà¤\82सà¤\95à¥\8dलà¥\82à¤\9cन)",
        "isimage": "संचिका दुवा",
        "whatlinkshere-prev": "{{PLURAL:$1|पूर्वीचा|पूर्वीचे $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|पुढील|पुढील $1}}",
        "whatlinkshere-hidelinks": "$1 दुवे",
        "whatlinkshere-hideimages": "$1 संचिका दुवे",
        "whatlinkshere-filters": "गाळण्या",
+       "whatlinkshere-submit": "जा",
        "autoblockid": "स्वयंचलितपणे #$1ला प्रतिबंधित करा",
        "block": "सदस्यास प्रतिबंध करा",
        "unblock": "सदस्यप्रतिबंध काढा",
-       "blockip": "हा अंकपत्ता अडवा",
+       "blockip": "{{GENDER:$1|सदस्यास}} प्रतिबंधित करा",
        "blockip-legend": "सदस्यास प्रतिबंध करा",
        "blockiptext": "एखाद्या विशिष्ट अंकपत्त्याची किंवा सदस्याची लिहिण्याची क्षमता प्रतिबंधित  करण्याकरिता खालील सारणी वापरा.\nहे केवळ उच्छेद टाळण्याच्याच दृष्टीने आणि [[{{MediaWiki:Policy-url}}|निती]]स अनुसरून केले पाहिजे.\nखाली विशिष्ट कारण भरा(उदाहरणार्थ,ज्या पानांवर उच्छेद माजवला गेला त्यांची उद्धरणे देऊन).",
        "ipaddressorusername": "अंकपत्ता किंवा सदस्यनाम:",
        "ipb-unblock-addr": "$1चा प्रतिबंध उठवा",
        "ipb-unblock": "सदस्यनाव आणि अंकपत्त्यावरचे प्रतिबंधन उठवा",
        "ipb-blocklist": "सध्याचे प्रतिबंध पहा",
-       "ipb-blocklist-contribs": "$1 साठी सदस्याचे योगदान",
+       "ipb-blocklist-contribs": "{{GENDER:$1|$1}}साठीचे योगदान",
        "unblockip": "अंकपत्ता सोडवा",
        "unblockiptext": "खाली दिलेला फॉर्म वापरून पूर्वी अडवलेल्या अंकपत्त्याला लेखनासाठी आधिकार द्या.",
        "ipusubmit": "हा पत्ता सोडवा",
        "blocklink": "अडवा",
        "unblocklink": "रोध हटवा",
        "change-blocklink": "रोध बदला",
-       "contribslink": "योगदान",
+       "contribslink": "योगदान",
        "emaillink": "ई-मेल पाठवा.",
        "autoblocker": "स्वयंचलित प्रतिबंधन केले गेले कारण तुमचा अंकपत्ता अलीकडे \"[[User:$1|$1]]\"ने वापरला होता. $1च्या प्रतिबंधनाकरिता दिलेले कारण \"$2\" आहे",
        "blocklogpage": "रोध नोंदी",
        "ipb-needreblock": "$1 आधीच प्रतिबंधित आहे . तुम्हाला त्याची सेटींग्स बदलण्याची इच्छा आहे का ?",
        "ipb-otherblocks-header": "{{PLURAL:$1|दुसरे प्रतिबंधन|इतर प्रतिबंधने}}",
        "unblock-hideuser": "सदस्याचे नाव हे गोपनीय असल्यामुळे हे सदस्य खाते आपण गोठवू शकत नाही",
-       "ipb_cant_unblock": "तà¥\8dरà¥\82à¤\9fà¥\80: à¤ªà¥\8dरतिबà¤\82धन à¤\95à¥\8dर.$1 à¤®à¤¿à¤³à¤¾à¤²à¤¾ नाही. त्यावरील प्रतिबंधन कदाचित आधीच उठवले असेल.",
-       "ipb_blocked_as_range": "तà¥\8dरà¥\82à¤\9fà¥\80:à¤\85à¤\82à¤\95पतà¥\8dता IP $1 à¤¹à¤¾ à¤ªà¥\8dरतà¥\8dयà¤\95à¥\8dषपणà¥\87 à¤ªà¥\8dरतिबà¤\82धित à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80 à¤\86णि à¤\85पà¥\8dरतिबà¤\82धà¥\80त à¤\95रता à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80.तà¥\8b,à¤\85रà¥\8dथात,$2पलà¥\8dलà¥\8dयाà¤\9aा à¤­à¤¾à¤\97 à¤®à¥\8dहाणà¥\82न à¤¤à¥\8b à¤ªà¥\8dरतिबà¤\82धित à¤\95à¥\87लà¥\87ला à¤\86हà¥\87,à¤\9cà¥\8b à¤\95à¥\80 अप्रतिबंधीत करता येत नाही.",
+       "ipb_cant_unblock": "तà¥\8dरà¥\81à¤\9fà¥\80: à¤ªà¥\8dरतिबà¤\82धन à¤\93ळà¤\96ण $1 à¤®à¤¿à¤³à¤¾à¤²à¥\80 नाही. त्यावरील प्रतिबंधन कदाचित आधीच उठवले असेल.",
+       "ipb_blocked_as_range": "तà¥\8dरà¥\81à¤\9fà¥\80:à¤\85à¤\82à¤\95पतà¥\8dता $1 à¤¹à¤¾ à¤¥à¥\87à¤\9f à¤ªà¥\8dरतिबà¤\82धित à¤\95à¥\87लà¥\87ला à¤¨à¤¾à¤¹à¥\80 à¤\86णि (मà¥\8dहणà¥\82न à¤¤à¥\8b) à¤\85पà¥\8dरतिबà¤\82धà¥\80त à¤\95रता à¤¯à¥\87त à¤¨à¤¾à¤¹à¥\80.तà¥\8b,à¤\85रà¥\8dथातà¤\9a,$2पलà¥\8dलà¥\8dयाà¤\9aा à¤\8fà¤\95 à¤­à¤¾à¤\97 à¤®à¥\8dहणà¥\82न à¤ªà¥\8dरतिबà¤\82धित à¤\86हà¥\87,à¤\9cà¥\8b अप्रतिबंधीत करता येत नाही.",
        "ip_range_invalid": "अंकपत्ता अयोग्य टप्प्यात.",
        "ip_range_toolarge": "/$1 पेक्षा मोठ्या रेंज प्रतिबंधनाची परवानगी नाही.",
        "proxyblocker": "प्रातिनिधीक(प्रॉक्झी)प्रतिबंधक",
        "movenotallowedfile": "तुम्हाला संचिका स्थानांतरीत करण्याची परवानगी नाही.",
        "cant-move-user-page": "तुम्हाला सदस्यपान स्थानांतरीत करण्याची परवानगी नाही.(उपपानाव्यतिरिक्त)",
        "cant-move-to-user-page": "तुम्हाला एखाद्या पानास सदस्य पानांवर (सदस्य उप-पाने सोडून) घेऊन जाण्यास परवानगी नाही.",
+       "cant-move-category-page": "आपणास वर्गपाने स्थानांतराची परवानगी नाही.",
+       "cant-move-to-category-page": "आपणास एखादे पान वर्गपानात स्थानांतरणाची परवानगी नाही.",
        "newtitle": "नवीन शीर्षक:",
        "move-watch": "स्रोत पान व लक्ष  पानांवर निगराणी ठेवा",
        "movepagebtn": "स्थानांतरण करा",
        "movepage-page-moved": "$1 हे पान $2 या मथळ्याखाली स्थानांतरीत केले.",
        "movepage-page-unmoved": "$1 हे पान $2 या मथळ्याखाली स्थानांतरीत करता आलेले नाही.",
        "movepage-max-pages": "जास्तीत जास्त $1 {{PLURAL:$1|पान|पाने}} स्थानांतरीत करण्यात {{PLURAL:$1|आलेले आहे|आलेली आहेत}} व आता आणखी पाने आपोआप स्थानांतरीत होणार नाहीत.",
-       "movelogpage": "सà¥\8dथाà¤\82नाà¤\82तराà¤\9aà¥\80 à¤¨à¥\8bà¤\82द",
+       "movelogpage": "स्थानांतराची नोंद",
        "movelogpagetext": "स्थानांतरित केलेल्या पानांची यादी.",
        "movesubpage": "{{PLURAL:$1|उपपान|उपपाने}}",
        "movesubpagetext": "या पानास $1 {{PLURAL:$1|उपपान|उपपाने}} असून ती पुढे दर्शवली आहेत:",
        "movenosubpage": "या पानात उपपाने नाहीत.",
        "movereason": "कारण:",
        "revertmove": "पूर्वपदास न्या",
-       "delete_and_move": "वगळा आणि स्थानांतरित करा",
        "delete_and_move_text": "==वगळण्याची आवश्यकता==\n\nलक्ष्यपान  \"[[:$1]]\" आधीच अस्तित्वात आहे.स्थानांतराचा मार्ग मोकळा करण्याकरिता तुम्हाला ते वगळावयाचे आहे काय?",
        "delete_and_move_confirm": "होय, पान वगळा",
        "delete_and_move_reason": "\"[[$1]]\" पासून वगळून स्थानांतर केले.",
        "allmessages-filter-translate": "भाषांतर करा",
        "thumbnail-more": "मोठे करा",
        "filemissing": "संचिका अस्तित्वात नाही",
-       "thumbnail_error": "नà¤\96à¥\81लà¥\87 à¤¨à¤¿à¤°à¥\8dमाणात à¤¤à¥\8dरà¥\82टी: $1",
+       "thumbnail_error": "नà¤\96à¥\81लà¥\87 à¤¨à¤¿à¤°à¥\8dमाणात à¤¤à¥\8dरà¥\81टी: $1",
        "thumbnail_error_remote": "$1 कडून त्रुटी-संदेश:$2",
        "djvu_page_error": "टप्प्याच्या बाहेरचे DjVu पान",
        "djvu_no_xml": "DjVu संचिकेकरिता XML ओढण्यात असमर्थ",
        "thumbnail-temp-create": "तात्पुरती इवलीशी संचिका बनविता आली नाही",
        "thumbnail-dest-create": "इष्टस्थळी इवलीशी संचिका जतन करता आली नाही",
        "thumbnail_invalid_params": "इवल्याशाचित्राचा अयोग्य परिचय",
+       "thumbnail_toobigimagearea": "$1 पेक्षा जास्त आकार असणारी संचिका",
        "thumbnail_dest_directory": "लक्ष्य धारिकेच्या निर्मितीस असमर्थ",
        "thumbnail_image-type": "चित्रप्रकार समर्थित नाही",
        "thumbnail_gd-library": "$1 जी.डी. ग्रंथालयाची बांधणी अपूर्ण आहे.",
        "thumbnail_image-failure-limit": "हे नखुले देण्यासाठी नुकतेच अनेक अयशस्वी प्रयत्न($1 किंवा अधिक) केल्या गेले आहेत.कृपया नंतर पुन्हा प्रयत्न करा.",
        "import": "पाने आयात करा",
        "importinterwiki": "दुसऱ्या विकीवरुन आयात करा",
-       "import-interwiki-text": "à¤\86यात à¤\95रणà¥\8dयाà¤\95रिता à¤\8fà¤\95 à¤µà¤¿à¤\95ि à¤\86णि à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤®à¤¥à¤³à¤¾ à¤¨à¤¿à¤µà¤¡à¤¾.\nà¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\8dया à¤¤à¤¾à¤°à¤\96ा à¤\86णि à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\80 à¤¨à¤¾à¤µà¥\87 à¤\9cतन à¤\95à¥\87लà¥\80 à¤\9cातà¥\80ल.\nसरà¥\8dव à¤\86à¤\82तरविà¤\95ि à¤\86यात à¤\95à¥\8dरिया [[Special:Log/import|à¤\86यात à¤¨à¥\8bà¤\82दà¥\80त]] à¤¦à¤¾à¤\96ल à¤\95à¥\87लà¥\8dया à¤\86हà¥\87त.",
+       "import-interwiki-text": "à¤\86यात à¤\95रणà¥\8dयाà¤\95रिता à¤\8fà¤\95 à¤µà¤¿à¤\95ि à¤\86णि à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤®à¤¥à¤³à¤¾ à¤¨à¤¿à¤µà¤¡à¤¾.\nà¤\86वरà¥\8dतनाà¤\82à¤\9aà¥\8dया à¤¤à¤¾à¤°à¤\96ा à¤\86णि à¤¸à¤\82पादà¤\95ाà¤\82à¤\9aà¥\80 à¤¨à¤¾à¤µà¥\87 à¤\9cतन à¤\95à¥\87लà¥\80 à¤\9cातà¥\80ल.\nसरà¥\8dव à¤\86à¤\82तरविà¤\95ि à¤\86यात à¤\95à¥\8dरिया [[Special:Log/import|à¤\86यात à¤¨à¥\8bà¤\82दà¥\80त]] à¤¦à¤¾à¤\96ल à¤\95रणà¥\8dयात à¤¯à¥\87तात.",
        "import-interwiki-sourcewiki": "स्रोत विकि:",
        "import-interwiki-sourcepage": "स्रोत पान:",
        "import-interwiki-history": "या पानाकरिताची साऱ्या इतिहास आवर्तनांची नक्कल करा",
        "import-interwiki-templates": "साचे आंतरभूत करा",
        "import-interwiki-submit": "आयात",
+       "import-mapping-default": "अविचल स्थानांना आयात करा",
+       "import-mapping-namespace": "नामविश्वाला आयात करा:",
+       "import-mapping-subpage": "खालील पानाचे उपपान म्हणून आयात करा:",
        "import-upload-filename": "संचिकानाव:",
        "import-comment": "प्रतिक्रीया:",
        "importtext": "कृपया [[Special:Export|निर्यात सुविधा]] वापरून स्रोत विकिकडून संचिका निर्यात करा,ती तुमच्या तबकडीवर जतन करा आणि येथे चढवा.",
        "importcantopen": "आयातीत संचिका उघडणे जमले नाही",
        "importbadinterwiki": "अयोग्य आंतरविकि दुवा",
        "importsuccess": "आयात पूर्ण झाली!",
-       "importnosources": "à¤\95à¥\8bणतà¥\87हà¥\80 à¤\86à¤\82तरविà¤\95ि à¤\86यात à¤¸à¥\8dरà¥\8bत à¤µà¥\8dयà¤\95à¥\8dत à¤\95à¥\87लà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80त à¤\86णि à¤ªà¥\8dरतà¥\8dयà¤\95à¥\8dष à¤\87तिहास à¤\9aढवा à¤\85नà¥\81पलबà¥\8dध à¤\95à¥\87लà¥\87 à¤\86हà¥\87.",
+       "importnosources": "à¤\95à¥\8bणतà¥\87हà¥\80 à¤µà¤¿à¤\95ि à¤\9cà¥\8dयापासà¥\82न à¤\86यात à¤\95रावयाà¤\9aà¥\80 à¤¤à¥\87 à¤µà¥\8dयाà¤\96à¥\8dयिà¤\95à¥\83त à¤\95à¥\87लà¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80त à¤\86णि à¤ªà¥\8dरतà¥\8dयà¤\95à¥\8dष à¤\87तिहास à¤\85पभारणà¥\87 à¤\85à¤\95à¥\8dषम à¤\95à¥\87लà¥\80 à¤\86हà¥\87त.",
        "importnofile": "कोणतीही आयातीत संचिका चढवलेली नाही.",
        "importuploaderrorsize": "आयात संचिकेचे चढवणे फसले.संचिका चढवण्याच्या मान्यताप्राप्त आकारा पेक्षा मोठी आहे.",
        "importuploaderrorpartial": "आयात संचिकेचे चढवणे फसले.संचिका केवळ अर्धवटच चढू शकली.",
        "import-upload": "XML डाटा चढवा",
        "import-token-mismatch": "अधिवेशन माहितीची हानी.\nकृपया पुन्हा प्रयत्न करा.",
        "import-invalid-interwiki": "नमूद केलेल्या विकिमधून आयात करू शकत नाही.",
-       "import-error-edit": "तुम्हाला संपादनाची परवानगी नसल्याने $1 पान आयात केले गेले नाही.",
-       "import-error-create": "तुम्हाला $1 तयार करण्याची परवानगी नसल्याने ते आयात केले गेले नाही.",
-       "import-error-interwiki": "à¤\87à¤\82à¤\9fर à¤µà¤¿à¤\95à¥\80 à¤²à¤¿à¤\82à¤\95 à¤¸à¤¾à¤ à¥\80 $1 à¤ªà¤¾à¤¨ à¤\86रà¤\95à¥\8dषित à¤\95à¥\87लà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80",
-       "import-error-special": "विशà¥\87ष à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवासाठà¥\80 $1 à¤ªà¤¾à¤¨ à¤\86रà¤\95à¥\8dषित à¤\95à¥\87लà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80. à¤¯à¤¾ à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवात à¤ªà¤¾à¤¨à¥\87 à¤\85सत à¤¨à¤¾à¤¹à¥\80त.",
-       "import-error-invalid": "नाव à¤\85यà¥\8bà¤\97à¥\8dय à¤\85सलà¥\8dयानà¥\87 $1 à¤ªà¤¾à¤¨ à¤\87मà¥\8dपà¥\8bरà¥\8dà¤\9f à¤\95रà¥\82 à¤¶à¤\95त à¤¨à¤¾à¤¹à¥\80.",
+       "import-error-edit": "तुम्हाला संपादनाची परवानगी नसल्याने \"$1\" पान आयात केल्या गेले नाही.",
+       "import-error-create": "तुम्हाला पान \"$1\" तयार करण्याची परवानगी नसल्याने ते आयात केल्या गेले नाही.",
+       "import-error-interwiki": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\8dयाà¤\9aà¥\87 à¤¨à¤¾à¤µ à¤¬à¤¾à¤¹à¥\8dय à¤¦à¥\81वà¥\8dयाà¤\82साठà¥\80 (à¤\86à¤\82तरविà¤\95ि) à¤\86रà¤\95à¥\8dषित à¤\86हà¥\87.",
+       "import-error-special": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\87 à¤µà¤¿à¤¶à¥\87ष à¤¨à¤¾à¤®à¤µà¤¿à¤¶à¥\8dवात à¤\85सलà¥\8dयामà¥\81ळà¥\87 à¤¤à¥\87 à¤ªà¤¾à¤¨à¤¾à¤\82ना (साठविणà¥\8dयाà¤\9aà¥\80)परवानà¤\97à¥\80 à¤¦à¥\87त à¤¨à¤¾à¤¹à¥\80.",
+       "import-error-invalid": "पान \"$1\" à¤\86यात à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87 à¤¨à¤¾à¤¹à¥\80 à¤\95ारण à¤¤à¥\87 à¤\9cà¥\8dया à¤¨à¤¾à¤µà¤¾à¤¤ à¤\86यात à¤\95रणà¥\8dयात à¤¯à¥\87त à¤\86हà¥\87 à¤¤à¥\87 à¤¨à¤¾à¤µ à¤¯à¤¾ à¤µà¤¿à¤\95ित à¤\85वà¥\88ध à¤\86हà¥\87.",
        "import-error-unserialize": " \"$1\" पानाची $2 आवृत्ती अनुक्रमांकातून काढता आली नाही.ही आवृत्ती कंटेंट मॉडेल $3 वापरत असल्याचा व $4 म्हणून अनुक्रमांकीत झाली असल्याचा अहवाल प्राप्त झाला             आहे.",
        "import-options-wrong": "चुकिचे {{PLURAL:$2|विकल्प}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "दिलेले मूळ पान अवैध नाव आहे",
        "import-rootpage-nosubpage": "\"$1\" नामविश्वाची मुल पाने, उपपानास परवानगी देत नाही.",
        "importlogpage": "ईम्पोर्ट सूची",
        "importlogpagetext": "इतर विकिक्डून पानांची, संपादकीय इतिहासासहीत, प्रबंधकीय आयात.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|आवर्तन|आवर्तने}}",
-       "import-logentry-interwiki-detail": "$2 पासून $1 {{PLURAL:$1|आवर्तन|आवर्तने}}",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|आवर्तन|आवर्तने}}आयात केलीत",
+       "import-logentry-interwiki-detail": "$2 पासून $1 {{PLURAL:$1|आवर्तन|आवर्तने}} आयात केलीत",
        "javascripttest": "जावा स्क्रिप्ट तपासणी",
        "javascripttest-pagetext-noframework": "हे पान जावा स्क्रिप्ट तपासणी साठी सुरक्षित केले आहे",
        "javascripttest-pagetext-unknownframework": "अज्ञात तपासणीचे ठिकाण $1",
+       "javascripttest-pagetext-unknownaction": "अनोळखी क्रिया \"$1\".",
        "javascripttest-pagetext-frameworks": "कृपया टेस्टिंग साठी पुढील पैकी व्यवस्था / पद्धत निवडावी: $1",
        "javascripttest-pagetext-skins": "टेस्ट करण्यासाठी योग्य ती स्कीन निवडावी",
        "javascripttest-qunit-intro": "mediawiki.org वर [$1 testing documentation] पहा",
        "tooltip-pt-anontalk": "या अंकपत्त्यापासून झालेल्या संपादनांबद्दल चर्चा",
        "tooltip-pt-preferences": "तुमचा पसंतीक्रम",
        "tooltip-pt-watchlist": "तुम्ही पहारा दिलेल्या पानांची यादी",
-       "tooltip-pt-mycontris": "तुमच्या योगदानांची यादी",
-       "tooltip-pt-login": "आपणांस सदस्यत्व घेण्याची विनंती करण्यात येत आहे. सदस्यत्व घेणे अनिवार्य नाही.",
+       "tooltip-pt-mycontris": "आपल्या योगदानांची यादी",
+       "tooltip-pt-anoncontribs": "या अंकपत्त्यावरुन झालेले संपादन",
+       "tooltip-pt-login": "आपणांस सनोंद प्रवेशासाठी प्रोत्साहीत करण्यात येत आहे;अर्थातच, ते अनिवार्य नाही.",
        "tooltip-pt-logout": "सनोंद निर्गम",
-       "tooltip-pt-createaccount": "à¤\86मà¥\8dहà¥\80 à¤\86पणास à¤\96ातà¥\87 à¤\89à¤\98डà¥\82न à¤¸à¤¨à¥\8bà¤\82द-पà¥\8dरवà¥\87शास à¤ªà¥\8dरà¥\8bतà¥\8dसाहà¥\80त à¤\95रत à¤\86हà¥\87;पण à¤¤à¥\87 à¤\85तà¥\8dयावशà¥\8dयà¤\95 नाही.",
-       "tooltip-ca-talk": "à¤\86शय à¤ªà¤¾à¤¨à¤¾à¤¬à¤¦à¥\8dदलà¤\9aà¥\8dया चर्चा",
+       "tooltip-pt-createaccount": "à¤\86मà¥\8dहà¥\80 à¤\86पणास à¤\96ातà¥\87 à¤\89à¤\98डà¥\82न à¤¸à¤¨à¥\8bà¤\82द-पà¥\8dरवà¥\87शास à¤ªà¥\8dरà¥\8bतà¥\8dसाहà¥\80त à¤\95रत à¤\86हà¥\87;à¤\85रà¥\8dथातà¤\9a, à¤¤à¥\87 à¤\85निवारà¥\8dय नाही.",
+       "tooltip-ca-talk": "à¤\86शय à¤ªà¤¾à¤¨à¤¾à¤¬à¤¦à¥\8dदलà¤\9aà¥\80 चर्चा",
        "tooltip-ca-edit": "या पानाचे संपादन करा",
        "tooltip-ca-addsection": "नवीन विभाग सुरू करा",
        "tooltip-ca-viewsource": "हे पान सुरक्षित आहे. तुम्ही याचा स्रोत पाहू शकता.",
        "tooltip-ca-watch": "हे पान तुमच्या पहाऱ्याच्या सूचीमध्ये टाका",
        "tooltip-ca-unwatch": "हे पान पहाऱ्याच्या सूचीतून काढा.",
        "tooltip-search": "{{SITENAME}} शोधा",
-       "tooltip-search-go": "नà¥\87मà¤\95à¥\8dया à¤¯à¤¾à¤\9a à¤¨à¤¾à¤µà¤¾à¤\9aà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\95डà¥\87,तà¥\87 à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\8dयास, à¤\9aला",
+       "tooltip-search-go": "तà¥\87 à¤\85सà¥\8dतितà¥\8dवात à¤\85सलà¥\8dयास,नà¥\87मà¤\95à¥\8dया à¤¯à¤¾à¤\9a à¤¨à¤¾à¤µà¤¾à¤\9aà¥\8dया à¤ªà¤¾à¤¨à¤¾à¤\95डà¥\87 à¤\9cा",
        "tooltip-search-fulltext": "या मजकुराकरिता पान शोधा",
-       "tooltip-p-logo": "मुखपृष्ठ",
+       "tooltip-p-logo": "मुखपृष्ठाला भेट द्या",
        "tooltip-n-mainpage": "मुखपृष्ठाला भेट द्या",
        "tooltip-n-mainpage-description": "मुखपृष्ठाला भेट द्या",
-       "tooltip-n-portal": "प्रकल्पाबद्दल, तुम्ही काय करू शकता, कुठे काय सापडेल",
+       "tooltip-n-portal": "प्रकल्पाबद्दलची माहिती, तुम्ही काय करू शकता, कुठे काय सापडेल",
        "tooltip-n-currentevents": "सद्य घटनांबद्दलची माहिती",
        "tooltip-n-recentchanges": "विकिवरील अलीकडील बदलांची यादी",
        "tooltip-n-randompage": "कोणतेही अविशिष्ट पान पाहा",
        "tooltip-t-whatlinkshere": "येथे जोडलेल्या सर्व विकिपानांची यादी",
        "tooltip-t-recentchangeslinked": "या पानास जोडलेल्या सर्व पानांवरील अलीकडील बदल",
        "tooltip-feed-rss": "या पानाकरिता आर.एस.एस. रसद",
-       "tooltip-feed-atom": "या à¤ªà¤¾à¤¨à¤¾à¤\95रिता à¤\8dटम रसद",
+       "tooltip-feed-atom": "या à¤ªà¤¾à¤¨à¤¾à¤\95रिता à¤\85à¥\85टम रसद",
        "tooltip-t-contributions": "या सदस्याच्या योगदानांची यादी पहा",
        "tooltip-t-emailuser": "या सदस्याला ई-मेल पाठवा",
+       "tooltip-t-info": "या पानाबाबत अधिक माहिती",
        "tooltip-t-upload": "संचिकेचे अपभारण करा",
        "tooltip-t-specialpages": "सर्व विशेष पृष्ठांची यादी",
        "tooltip-t-print": "या पानाची छापण्यायोग्य आवृत्ती",
        "pageinfo-length": "पानाचा आकार (बाइट्समध्ये)",
        "pageinfo-article-id": "पृष्ठ-परिचय",
        "pageinfo-language": "पानाच्या मजकूराची भाषा",
+       "pageinfo-content-model": "पान आशय नमूना",
        "pageinfo-robot-policy": "यंत्रमानवाद्वारे अनुक्रमन",
        "pageinfo-robot-index": "अनुमती दिली",
        "pageinfo-robot-noindex": "अनुमती दिल्या जात नाही",
        "pageinfo-recent-authors": "सुस्पष्ट लेखकांची सध्या असलेली संख्या",
        "pageinfo-magic-words": "जादुई {{PLURAL:$1|शब्द}} ($1)",
        "pageinfo-hidden-categories": "लपविलेले {{PLURAL:$1|वर्ग}} ($1)",
-       "pageinfo-templates": "भाषाà¤\82तरà¥\8dभावित {{PLURAL:$1|साचा|साचे}} ($1)",
-       "pageinfo-transclusions": "($1) à¤µà¤°à¥\80ल à¤­à¤¾à¤·à¤¾à¤\82तरà¥\8dभावित {{PLURAL:$1|पान|पाने}}",
+       "pageinfo-templates": "à¤\86à¤\82तरविनà¥\8dयासित {{PLURAL:$1|साचा|साचे}} ($1)",
+       "pageinfo-transclusions": "($1) à¤µà¤°à¥\80ल à¤\86à¤\82तरविनà¥\8dयासित {{PLURAL:$1|पान|पाने}}",
        "pageinfo-toolboxlink": "पानाची माहिती",
        "pageinfo-redirectsto": "पुनर्निर्देशन लक्ष्यपान",
        "pageinfo-redirectsto-info": "माहिती",
        "pageinfo-protect-cascading-yes": "होय",
        "pageinfo-protect-cascading-from": "रखणे(प्रोटक्शन्स) प्रपातीत होतात (कॅस्केडिंग) येथून",
        "pageinfo-category-info": "वर्ग माहिती",
+       "pageinfo-category-total": "सदस्यांचा एकूण आकडा",
        "pageinfo-category-pages": "पानांची संख्या",
        "pageinfo-category-subcats": "उपवर्गांची संख्या",
        "pageinfo-category-files": "संचिकांची संख्या",
        "patrol-log-header": "ही पाहणीनंतरच्या निरीक्षणाची नोंद आहे.",
        "log-show-hide-patrol": "$1 गस्तीची नोंद",
        "deletedrevision": "जुनी आवृत्ती ($1) वगळली.",
-       "filedeleteerror-short": "सà¤\82à¤\9aिà¤\95ा à¤µà¤\97ळताना à¤¤à¥\8dरà¥\82टी: $1",
+       "filedeleteerror-short": "सà¤\82à¤\9aिà¤\95ा à¤µà¤\97ळताना à¤¤à¥\8dरà¥\81टी: $1",
        "filedeleteerror-long": "संचिका वगळताना त्रुटी आढळल्या:\n\n$1",
        "filedelete-missing": "संचिका \"$1\" वगळता येत नाही, कारण ती अस्तित्वात नाही.",
        "filedelete-old-unregistered": "निर्देशीत संचिका आवर्तन \"$1\" विदागारात नाही.",
        "svg-long-desc-animated": "सामान्यतः $1 × $2 पिक्सेलची असलेली संजीवक एसव्हीजी संचिका, संचिका-आकार: $3",
        "svg-long-error": "अयोग्य SVG प्रकारातील संचिका: $1",
        "show-big-image": "मूळ संचिका",
-       "show-big-image-preview": "या झलकेचा आकार: $1. पिक्सेल",
+       "show-big-image-preview": "या झलकेचा आकार: $1 पिक्सेल.",
        "show-big-image-other": "इतर {{PLURAL:$2|resolution|resolutions}}: $1.",
        "show-big-image-size": "$1 × $2 पिक्सेल",
        "file-info-gif-looped": "विळख्यात सापडलेले",
        "newimages-summary": "हे विशेष पान शेवटी चढविलेल्या संचिका दर्शविते.",
        "newimages-legend": "गाळक",
        "newimages-label": "संचिकानाम (किंवा त्याचा भाग):",
+       "newimages-showbots": "सांगकाम्याद्वारे केलेली अपभारणे दाखवा",
        "noimages": "बघण्यासारखे येथे काही नाही.",
        "ilsubmit": "शोधा",
        "bydate": "तारखेनुसार",
        "metadata-help": "या संचिकेत जास्तीची माहिती आहे. बहुधा ही संचिका बनवताना वापरलेल्या कॅमेरा किंवा स्कॅनर कडून ही माहिती जमा झाली आहे. जर या संचिकेत निर्मितीपश्चात बदल करण्यात आले असतील, तर कदाचित काही माहिती नवीन संचिकेशी पूर्णपणे जुळणार नाही.",
        "metadata-expand": "जास्तीची माहिती दाखवा",
        "metadata-collapse": "जास्तीची माहिती लपवा",
-       "metadata-fields": "या à¤¸à¤\82दà¥\87शाà¤\9aà¥\8dया à¤¯à¤¾à¤¦à¥\80तà¥\80ल à¤\9aितà¥\8dर à¤®à¥\87à¤\9fाडाà¤\9fा à¤\95à¥\8dषà¥\87तà¥\8dराà¤\82à¤\9aा à¤\85à¤\82तरà¥\8dभाव à¤\9aितà¥\8dर à¤ªà¤¾à¤¨ à¤¦à¤°à¥\8dशनात à¤¹à¥\8bà¤\88ल, à¤\9cà¥\87à¤\82वà¥\8dहा à¤®à¥\87à¤\9fाडाà¤\9fा à¤¤à¤\95à¥\8dता à¤¨à¤¿à¤ªà¤¤à¤¨ à¤¸à¥\8dथितà¥\80त à¤\85सà¥\87ल. à¤¬à¤¾à¤\95à¥\80à¤\9aà¥\80 à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤\9dाà¤\95लà¥\87लà¥\80 à¤°à¤¾à¤¹à¥\80ल.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "या à¤¸à¤\82दà¥\87शाà¤\9aà¥\8dया à¤¯à¤¾à¤¦à¥\80तà¥\80ल à¤\9aितà¥\8dर à¤®à¥\87à¤\9fाडाà¤\9fा à¤\95à¥\8dषà¥\87तà¥\8dराà¤\82à¤\9aा à¤\85à¤\82तरà¥\8dभाव à¤\9aितà¥\8dर à¤ªà¤¾à¤¨ à¤¦à¤°à¥\8dशविणà¥\8dयात à¤¹à¥\8bà¤\88ल, à¤\9cà¥\87à¤\82वà¥\8dहा à¤®à¥\87à¤\9fाडाà¤\9fा à¤¤à¤\95à¥\8dता à¤¨à¤¿à¤ªà¤¤à¤¨ à¤¸à¥\8dथितà¥\80त à¤\85सà¥\87ल. à¤\87तर à¤®à¤¾à¤¹à¤¿à¤¤à¥\80 à¤\85विà¤\9aलरितà¥\8dया à¤²à¤ªà¤µà¤¿à¤²à¥\87लà¥\80 à¤°à¤¾à¤¹à¥\80ल.\n* à¤\89तà¥\8dपादन(मà¥\87à¤\95)\n* à¤®à¥\89डà¥\87ल\n* à¤®à¥\82ळदिनाà¤\82à¤\95वà¥\87ळ\n* à¤\85नावà¥\83तà¥\8dतà¥\80वà¥\87ळ(à¤\8fà¤\95à¥\8dसà¥\8dपà¥\8bà¤\9cरà¤\9fाà¤\88म)\n* à¤\86यà¤\8fसà¤\93à¤\97तà¥\80निरà¥\8dधारण(à¤\86यà¤\8fसà¤\93सà¥\8dपà¥\80डरà¥\87à¤\9fिà¤\82à¤\97à¥\8dà¤\9c)\n* à¤\95à¥\87à¤\82दà¥\8dरवरà¥\8dतà¥\80लाà¤\82बà¥\80(फà¥\8bà¤\95ललà¥\87à¤\82à¤\97à¥\8dथ)\n* à¤\95लाà¤\95ार\n* à¤ªà¥\8dरताधिà¤\95ार\n* à¤\9aितà¥\8dरवरà¥\8dणन\n* à¤\9cà¥\80पà¥\80à¤\8fसà¤\85à¤\95à¥\8dषाà¤\82श\n* à¤\9cà¥\80पà¥\80à¤\8fसरà¥\87à¤\96ाà¤\82श\n* à¤\9cà¥\80पà¥\80à¤\8fसà¤\89नà¥\8dनतन",
        "exif-imagewidth": "रूंदी",
        "exif-imagelength": "उंची",
        "exif-bitspersample": "प्रती घटक बीट्स",
        "exif-compression": "आकुंचन योजना",
        "exif-photometricinterpretation": "चित्रांश विन्यास (पिक्सेल कॉम्पोझीशन)",
-       "exif-orientation": "वळण",
+       "exif-orientation": "à¤\85भिमà¥\81à¤\96न",
        "exif-samplesperpixel": "घटकांची संख्या",
        "exif-planarconfiguration": "विदा रचना",
        "exif-ycbcrsubsampling": "Y चे C शी  उपनमुनातपासणी (सबसॅम्पलींग) गुणोत्तर",
        "exif-ycbcrpositioning": "Y आणि C प्रतिस्थापना (पोझीशनींग)",
-       "exif-xresolution": "समाà¤\82तर रिझोल्यूशन",
+       "exif-xresolution": "à¤\86डवà¥\87 रिझोल्यूशन",
        "exif-yresolution": "उभे रिझोल्यूशन",
        "exif-stripoffsets": "चित्रविदा स्थान",
        "exif-rowsperstrip": "प्रत्येक पट्टीतील ओळींची संख्या",
        "exif-datetime": "संचिका बदल तारीख आणि वेळ",
        "exif-imagedescription": "चित्र शीर्षक",
        "exif-make": "कॅमेरा उत्पादक",
-       "exif-model": "à¤\95à¥\85मà¥\87रा à¤\89पà¤\95रण",
-       "exif-software": "वापरलà¥\87लà¥\80 à¤¸à¤\82à¤\97णन à¤\85ज्ञावली",
+       "exif-model": "à¤\95à¥\85मà¥\87रा à¤¨à¤®à¥\82ना",
+       "exif-software": "वापरलà¥\87लà¥\80 à¤¸à¤\82à¤\97णन à¤\86ज्ञावली",
        "exif-artist": "लेखक",
        "exif-copyright": "प्रताधिकार धारक",
        "exif-exifversion": "Exif आवृत्ती",
        "exif-label": "लेबल",
        "exif-datetimemetadata": "मेटाडाटाच्या शेवटच्या बदलाची तारीख",
        "exif-nickname": "चित्राचे / फोटोचे सामान्य नाव",
-       "exif-rating": "गुण (५ पैकी)",
+       "exif-rating": "गुणानुक्रम (५ पैकी)",
        "exif-rightscertificate": "अधिकार व्यवस्थापन प्रमाणपत्र",
        "exif-copyrighted": "प्रताधिकार स्थिती",
        "exif-copyrightowner": "प्रताधिकार धारक",
        "confirmemail_success": "तुमचा विपत्र (ई-मेल) पत्ता प्रमाणित झाला आहे.तुम्ही आता [[Special:UserLogin|दाखल]] होऊ शकता आणि विकिचा आनंद घेऊ शकता.",
        "confirmemail_loggedin": "तुमचा विपत्र (ई-मेल) पत्ता आता प्रमाणित झाला आहे.",
        "confirmemail_subject": "{{SITENAME}} विपत्र (ई-मेल) पत्ता प्रमाणित",
-       "confirmemail_body": "à¤\95à¥\81णà¥\80तरà¥\80, à¤¬à¤¹à¥\81तà¥\87à¤\95 à¤¤à¥\81मà¥\8dहà¥\80, $1 à¤¯à¤¾ à¤ªà¤¤à¥\8dतà¥\8dयावारà¥\82न, \"$2\" à¤\96ातà¥\87 à¤¹à¤¾ à¤\88मà¥\87ल à¤ªà¤¤à¥\8dता à¤µà¤¾à¤ªà¤°à¥\82न {{SITENAME}} à¤¯à¤¾ à¤¸à¤\82à¤\95à¥\87तसà¥\8dथळावर à¤\89à¤\98डलà¥\87 à¤\86हà¥\87.\n\nहà¥\87 à¤\96ातà¥\87 à¤\96रà¥\8bà¤\96र à¤¤à¥\81मà¤\9aà¥\87 à¤\86हà¥\87 à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86णि {{SITENAME}} à¤µà¤° à¤\88मà¥\87ल à¤ªà¤°à¥\8dयाय à¤\89तà¥\8dतà¥\87à¤\9cित (à¤\89पलबà¥\8dध) à¤\95रणà¥\8dयासाठà¥\80, à¤¹à¤¾ à¤¦à¥\81वा à¤¤à¥\81मà¤\9aà¥\8dया à¤¬à¥\8dराà¤\89à¤\9cर à¤®à¤§à¥\87 à¤\89à¤\98डा:\n\n$3\n\nà¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 *नसà¥\87ल* à¤¤à¤° à¤¹à¥\80 à¤®à¤¾à¤\97णà¥\80 à¤°à¤¦à¥\8dद à¤\95रणà¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤¦à¥\81वा à¤\89à¤\98डा:\n\n$5\n\nहा à¤¹à¤®à¥\80 à¤\95लम $4 à¤²à¤¾ à¤¨à¤·à¥\8dà¤\9f होईल.",
+       "confirmemail_body": "à¤\95à¥\81णà¥\80तरà¥\80, à¤¬à¤¹à¥\81तà¥\87à¤\95 à¤\86पणà¤\9a, $1 à¤¯à¤¾ à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयावरà¥\82न, à¤¹à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता(à¤\88मà¥\87ल) à¤µà¤¾à¤ªà¤°à¥\82न,, {{SITENAME}} à¤µà¤° \"$2\" à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 à¤\86हà¥\87.\n\nहà¥\87 à¤\96ातà¥\87 à¤\96रà¥\8bà¤\96र à¤\86पलà¥\87 à¤\86हà¥\87 à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86णि {{SITENAME}} à¤µà¤° à¤µà¤¿à¤ªà¤¤à¥\8dर à¤ªà¥\8dरारà¥\81प à¤¸à¤\95à¥\8dरिय (à¤\89पलबà¥\8dध) à¤\95रणà¥\8dयासाठà¥\80, à¤¹à¤¾ à¤¦à¥\81वा à¤¤à¥\81मà¤\9aà¥\8dया à¤¨à¥\8dयाहाळà¤\95ात(बà¥\8dराà¤\89à¤\9cर) à¤\89à¤\98डा:\n\n$3\n\nà¤\9cर à¤\86पण à¤¹à¥\87 à¤\96ातà¥\87 à¤\89à¤\98डलà¥\87 *नसà¥\87ल* à¤¤à¤° à¤¹à¤¾ à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता à¤µà¤\97ळणà¥\8dयासाठà¥\80,à¤\96ालà¥\80ल à¤¦à¥\81वा à¤\85नà¥\81सरा:\n\n$5\n\nनिशà¥\8dà¤\9aितà¥\80à¤\95रण à¤¸à¤\82à¤\95à¥\87त(à¤\95नà¥\8dफरà¥\8dमà¥\87शन à¤\95à¥\8bड) $4 à¤²à¤¾ à¤\95ालबाहà¥\8dय होईल.",
        "confirmemail_body_changed": "\n\n{{SITENAME}} या संकेतस्थळावर कुणीतरी, बहुतेक तुम्ही, $1 या अंकपत्त्यावारून, \"$2\" खात्याकरिताचा  ईमेल   आपल्या या ई-मेल पत्त्यावर बदलला आहे.\n\nहे खाते खरोखर तुमचे आहे याची खात्री करण्यासाठी आणि {{SITENAME}} वर ईमेल पर्याय उत्तेजित (उपलब्ध) करण्यासाठी, हा दुवा तुमच्या ब्राउजर मधे उघडा:\n\n$3\n\nजर तुम्ही हे खाते तुमचे *नसेल* तर ही ई-मेल पत्त्याच्या बदलाची मागणी रद्द करण्यासाठी खालील दुवा उघडा:\n\n$5\n\nहा  निश्चितीकरण संदेश  $4 ला नष्ट होईल.",
-       "confirmemail_body_set": "{{SITENAME}} à¤¯à¤¾ à¤¸à¤\82à¤\95à¥\87तसà¥\8dथळावर à¤\95à¥\81णà¥\80तरà¥\80, à¤¬à¤¹à¥\81तà¥\87à¤\95 à¤¤à¥\81मà¥\8dहà¥\80, $1 à¤¯à¤¾ à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयावरà¥\82न, \"$2\" à¤\96ातà¥\8dयाà¤\95रिताà¤\9aा  à¤\88-मà¥\87ल,  à¤\86पलà¥\8dया à¤¯à¤¾ à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dयानà¥\81सार à¤¦à¤¿à¤²à¤¾ à¤\86हà¥\87.\n\nहà¥\87 à¤\96ातà¥\87 à¤\96रà¥\8bà¤\96र à¤¤à¥\81मà¤\9aà¥\87 à¤\86हà¥\87 à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86णि {{SITENAME}} à¤µà¤° à¤\88-मà¥\87ल à¤ªà¤°à¥\8dयाय à¤\89तà¥\8dतà¥\87à¤\9cित (à¤\89पलबà¥\8dध) à¤\95रणà¥\8dयासाठà¥\80, à¤¹à¤¾ à¤¦à¥\81वा à¤¤à¥\81मà¤\9aà¥\8dया à¤¬à¥\8dराà¤\89à¤\9cर à¤®à¤§à¥\87 à¤\89à¤\98डा:\n\n$3\n\nà¤\9cर à¤¤à¥\81मà¥\8dहà¥\80 à¤¹à¥\87 à¤\96ातà¥\87 à¤¤à¥\81मà¤\9aà¥\87 *नसà¥\87ल* à¤¤à¤° à¤¹à¥\80 à¤\88-मà¥\87ल à¤ªà¤¤à¥\8dतà¥\8dयाà¤\9aà¥\8dया à¤¬à¤¦à¤²à¤¾à¤\9aà¥\80 à¤®à¤¾à¤\97णà¥\80 à¤°à¤¦à¥\8dद à¤\95रणà¥\8dयासाठà¥\80 à¤\96ालà¥\80ल à¤¦à¥\81वा à¤\89à¤\98डा:\n\n$5\n\nहा à¤\96ातà¥\8dरà¥\80à¤\95रण à¤¸à¤\82दà¥\87श  $4 à¤µà¥\87ळà¥\87त à¤¨à¤·à¥\8dà¤\9f होईल.",
+       "confirmemail_body_set": "{{SITENAME}} à¤µà¤° à¤\95à¥\81णà¥\80तरà¥\80, à¤¬à¤¹à¥\81तà¥\87à¤\95 à¤\86पणà¤\9a, $1 à¤¯à¤¾ à¤\85à¤\82à¤\95पतà¥\8dतà¥\8dयावरà¥\82न, \"$2\" à¤¯à¤¾  à¤\96ातà¥\8dयाà¤\95रिताà¤\9aा à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता (à¤\88-मà¥\87ल), à¤¯à¤¾ à¤ªà¤¤à¥\8dतà¥\8dयास à¤¸à¥\8dथापिलà¥\87ला à¤\86हà¥\87.\n\nहà¥\87 à¤\96ातà¥\87 à¤\96रà¥\8bà¤\96र à¤\86पलà¥\87à¤\9a à¤\86हà¥\87 à¤¯à¤¾à¤\9aà¥\80 à¤\96ातà¥\8dरà¥\80 à¤\95रणà¥\8dयासाठà¥\80 à¤\86णि {{SITENAME}} à¤µà¤° à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dता à¤ªà¥\8dरारà¥\81प à¤¸à¤\95à¥\8dरिय(à¤\89पलबà¥\8dध) à¤\95रणà¥\8dयासाठà¥\80, à¤¹à¤¾ à¤¦à¥\81वा à¤\86पलà¥\8dया à¤¨à¥\8dयाहाळà¤\95ात(बà¥\8dराà¤\89à¤\9cर) à¤\89à¤\98डा:\n\n$3\n\nà¤\9cर à¤¹à¥\87 à¤\96ातà¥\87 à¤\86पलà¥\87 *नसà¥\87ल* à¤¤à¤°, à¤¹à¥\80 à¤µà¤¿à¤ªà¤¤à¥\8dरपतà¥\8dयाà¤\9aà¥\87 à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤µà¤\97ळणà¥\8dयासाठà¥\80,à¤\96ालà¥\80ल à¤¦à¥\81वà¥\8dयास à¤\85नà¥\81सरा:\n\n$5\n\nहा à¤¨à¤¿à¤¶à¥\8dà¤\9aितà¥\80à¤\95रण à¤¸à¤\82à¤\95à¥\87त(à¤\95नà¥\8dफरà¥\8dमà¥\87शन à¤\95à¥\8bड) $4 à¤²à¤¾ à¤\95ालबाहà¥\8dय होईल.",
        "confirmemail_invalidated": "इ-मेल पत्ता तपासणी रद्द करण्यात आलेली आहे",
        "invalidateemail": "इ-मेल तपासणी रद्द करा",
        "scarytranscludedisabled": "[आंतरविकि आंतरन्यास अनुपलब्ध केले आहे]",
        "confirm-watch-top": "हे पान तुमच्या पहारा सूचीमध्ये टाकायचे?",
        "confirm-unwatch-button": "ठिक आहे",
        "confirm-unwatch-top": "हे पान तुमच्या नित्य पहाण्याच्या सूचीतून काढायचे?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← मागील पान",
        "imgmultipagenext": "पुढील पान →",
        "imgmultigo": "चला!",
        "lag-warn-high": "विदा विदादात्यास लागणाऱ्या अत्युच्च कालावधी मुळे, $1 {{PLURAL:$1|सेकंदापेक्षा|सेकंदांपेक्षा}} नवे बदल या सूचित कदाचित दाखवले नाही जाणार.",
        "watchlistedit-normal-title": "पहाऱ्याची सूचीचे संपादन करा",
        "watchlistedit-normal-legend": "शीर्षकपाने नित्य पहाण्याच्या सूचीतून काढा",
-       "watchlistedit-normal-explain": "तà¥\81मà¤\9aà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\80ल à¤\85à¤\82तरà¥\8dभà¥\82त à¤¨à¤¾à¤®à¤¾à¤µà¤³à¥\80 à¤\96ालà¥\80 à¤¨à¤¿à¤°à¥\8dदà¥\87शित à¤\95à¥\87लà¥\80 à¤\86हà¥\87. à¤¶à¥\80रà¥\8dषà¤\95 à¤µà¤\97ळणà¥\8dयाà¤\95रिता, à¤¤à¥\8dया à¤ªà¥\81ढà¥\80ल à¤\96िडà¤\95à¥\80 à¤¨à¤¿à¤µà¤¡à¤¾, à¤\86णि à¤¶à¥\80रà¥\8dषà¤\95 à¤µà¤\97ळावर à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. à¤¤à¥\81मà¥\8dहà¥\80 [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.",
+       "watchlistedit-normal-explain": "à¤\86पलà¥\8dया à¤ªà¤¹à¤¾à¤°à¥\8dâ\80\8dयाà¤\9aà¥\8dया à¤¸à¥\82à¤\9aà¥\80तà¥\80ल à¤¶à¥\80रà¥\8dषà¤\95à¥\87 à¤\96ालà¥\80 à¤¦à¤°à¥\8dशविणà¥\8dयात à¤\86लà¥\87लà¥\80 à¤\86हà¥\87त.à¤\8fà¤\96ादà¥\87 à¤¶à¥\80रà¥\8dषà¤\95 à¤¹à¤\9fविणà¥\8dयाà¤\95रà¥\80ता, à¤¤à¥\8dया à¤ªà¥\81ढà¥\80ल à¤ªà¥\87à¤\9fà¥\80(बà¥\89à¤\95à¥\8dस) à¤¨à¤¿à¤µà¤¡à¤¾(à¤\9aà¥\87à¤\95), à¤\86णि \"{{int:Watchlistedit-normal-submit}}\" à¤µà¤° à¤\9fिà¤\9aà¤\95à¥\80 à¤®à¤¾à¤°à¤¾. à¤\86पण [[Special:EditWatchlist/raw|कच्ची यादी सुद्धा संपादित]] करू शकता.",
        "watchlistedit-normal-submit": "शिर्षक वगळा",
        "watchlistedit-normal-done": "तुमच्या नित्य पहाण्या सूचीतून वगळलेली {{PLURAL:$1|1 शीर्षक होते |$1 शीर्षके होती }}:",
        "watchlistedit-raw-title": "कच्ची नित्य पहाण्याची सूची संपादित करा",
        "watchlistedit-clear-legend": "निरीक्षणसूची साफ करा",
        "watchlistedit-clear-explain": "आपल्या ननिरीक्षणसूचीतील सर्व शिर्षक हटविल्या जातील.",
        "watchlistedit-clear-titles": "शिर्षके:",
+       "watchlistedit-clear-submit": "निरीक्षणसूची साफ करा(हे कायमस्वरुपी आहे!)",
+       "watchlistedit-clear-done": "तुमची पहाऱ्याची सूची स्वच्छ करण्यात आली आहे.",
+       "watchlistedit-clear-removed": "{{PLURAL:$1|१ शीर्षक हटविल्या गेले|$1 शीर्षके हटविल्या गेलीत}}:",
+       "watchlistedit-too-many": "येथे दर्शविण्यासाठी खूप सारी पाने आहेत.",
        "watchlisttools-clear": "निरीक्षणसूची साफ करा",
        "watchlisttools-view": "संबंधित बदल पहा",
        "watchlisttools-edit": "पहाऱ्याची  सूची पहा आणि संपादित करा",
        "duplicate-defaultsort": "'''ताकिद:''' डिफॉल्ट सॉर्ट की \"$2\" ओवर्राइड्स अर्लीयर डिफॉल्ट सॉर्ट की \"$1\".",
        "version": "आवृत्ती",
        "version-extensions": "स्थापित विस्तार",
-       "version-skins": "त्वचा",
+       "version-skins": "à¤\87à¤\82सà¥\8dà¤\9fà¥\89ल à¤\95à¥\87लà¥\8dया à¤\97à¥\87लà¥\87लà¥\8dया à¤¤à¥\8dवà¤\9aा",
        "version-specialpages": "विशेष पाने",
        "version-parserhooks": "पृथकक अंकुश",
        "version-variables": "चल",
        "version-hook-name": "अंकुश नाव",
        "version-hook-subscribedby": "वर्गणीदार",
        "version-version": "($1)",
+       "version-no-ext-name": "[नाव नाही]",
        "version-license": "मिडियाविकि परवाना",
        "version-ext-license": "परवाना",
        "version-ext-colheader-name": "विस्तारक",
+       "version-skin-colheader-name": "त्वचा",
        "version-ext-colheader-version": "आवृत्ती",
        "version-ext-colheader-license": "परवाना",
        "version-ext-colheader-description": "वर्णन",
        "version-ext-colheader-credits": "लेखक",
        "version-license-title": "$1 साठी परवाना",
        "version-license-not-found": "या विस्तारकासाठी विस्तृत परवाना माहिती सापडली नाही.",
+       "version-credits-title": "$1साठीचे श्रेय",
+       "version-credits-not-found": "या विस्तारकासाठी विस्तृत श्रेयनिर्देशन माहिती सापडली नाही.",
        "version-poweredby-credits": "हा विकी '''[https://www.mediawiki.org/ मीडियाविकी]'''द्वारे संचालित आहे, प्रताधिकारित © २००१-$1 $2.",
        "version-poweredby-others": "इतर",
        "version-poweredby-translators": "ट्रांसलेटविकि.नेट वरील भाषांतरकार",
        "specialpages-group-wiki": "डाटा व उपकरणे",
        "specialpages-group-redirects": "पुनर्निर्देशन करणारी विशेष पृष्ठे",
        "specialpages-group-spam": "उत्पात साधने",
+       "specialpages-group-developer": "विकसक उपकरण",
        "blankpage": "रिकामे पान",
        "intentionallyblankpage": "हे पान मुद्दाम कोरे सोडण्यात आले आहे.",
        "external_image_whitelist": "#ही ओळ जशी आहे तशीच घ्या.\n#\n#.\n#\n#\n#हे केस सेन्सेटिव्ह आहे.",
        "tags-deactivate": "निष्क्रिय करा",
        "tags-hitcount": "$1 {{PLURAL:$1|बदल|बदल}}",
        "tags-create-heading": "नवीन बिल्ला तयार करा",
+       "tags-create-tag-name": "खूणपताकेचे नाव:",
        "tags-create-reason": "कारण:",
        "tags-create-submit": "निर्मित करा",
+       "tags-create-no-name": "आपण खूणपताकेचे नाव नमूद करावयास हवे.",
+       "tags-create-already-exists": "\"$1\" ही खूणपताका अगोदरच अस्तित्वात आहे.",
+       "tags-delete-title": "खूणपताका वगळा",
        "tags-delete-reason": "कारण:",
+       "tags-delete-not-found": "\"$1\" खूणपताका अस्तित्वात नाही.",
+       "tags-activate-title": "खूणपताका सक्रिय करा",
+       "tags-activate-question": "आपण \"$1\" खूणपताकेस सक्रिय करण्याच्या बेतात आहात.",
        "tags-activate-reason": "कारण:",
+       "tags-activate-not-allowed": "\"$1\" खूणपताकेस सक्रिय करणे शक्य नाही.",
+       "tags-activate-not-found": "\"$1\" खूणपताका अस्तित्वात नाही.",
        "tags-activate-submit": "सक्रीय करा",
+       "tags-deactivate-title": "खूणपताका अक्रिय करा",
+       "tags-deactivate-question": "आपण \"$1\" खूणपताकेस अक्रिय करण्याच्या बेतात आहात.",
        "tags-deactivate-reason": "कारण:",
+       "tags-deactivate-not-allowed": "\"$1\" खूणपताकेस अक्रिय करणे शक्य नाही.",
        "tags-deactivate-submit": "निष्क्रिय करा",
        "tags-edit-reason": "कारण:",
+       "tags-edit-none-selected": "जोडण्यास किंवा हटविण्यास किमान एक खूणपताका निवडा.",
        "comparepages": "पानांची तुलना करा",
        "compare-page1": "पान १",
        "compare-page2": "पान २",
        "compare-revision-not-exists": "आपण नमूद करत असलेली आवृत्ती अस्तित्वात नाही.",
        "dberr-problems": "माफ करा, हे संकेतस्थळ सध्या तांत्रिक अडचणींना सामोरे जात आहे.",
        "dberr-again": "थोडा वेळ थांबून पुन्हा पहा.",
-       "dberr-info": "( विदादाताशी संपर्क साधण्यात  असमर्थ : $1)",
-       "dberr-info-hidden": "( विदादात्याशी संपर्क साधण्यात  असमर्थ)",
+       "dberr-info": "(विदादातापर्यंत पोहोचण्यास असमर्थ: $1)",
+       "dberr-info-hidden": "(विदादातापर्यंत पोहोचण्यास असमर्थ)",
        "dberr-usegoogle": "तोपर्यंत गूगलवर शोधून पहा",
        "dberr-outofdate": "लक्षात घ्या, आमच्या मजकुराबाबत त्यांची सूची कालबाह्य असू शकते",
        "dberr-cachederror": "ही मागवलेल्या पानाची सयीतील प्रत आहे, ती अद्ययावत नसण्याची शक्यता आहे.",
        "htmlform-invalid-input": "तुम्ही दिलेल्या माहितीत काहीतरी गडबड आहे",
        "htmlform-select-badoption": "आपण नमूद करत असलेली व्हॅल्यू ग्राह्य पर्याय ठरत नाही",
        "htmlform-int-invalid": "आपण नमूद केलेली व्हॅल्यू पूर्णांक (इंटीजर) नाही.",
-       "htmlform-float-invalid": "तà¥\81मà¥\8dहà¥\80 à¤¦à¤¿à¤²à¥\87लà¥\80 à¤\95िà¤\82मत à¤\86à¤\95डा नाही.",
+       "htmlform-float-invalid": "à¤\86पण à¤¦à¤¿à¤²à¥\87लà¥\80 à¤\95िà¤\82मत à¤¹à¥\80 à¤\8fà¤\95 'सà¤\82à¤\96à¥\8dया नाही.",
        "htmlform-int-toolow": "$1 किंवा मोठा आकडा द्या.",
        "htmlform-int-toohigh": "$1 किंवा त्याहून छोटा आकडा द्या.",
        "htmlform-required": "ही किंमत आवश्यक आहे",
        "htmlform-cloner-create": "अधिक जोडा",
        "htmlform-cloner-delete": "हटवा",
        "htmlform-cloner-required": "किमान एक किंमत हवी",
-       "htmlform-title-not-exists": "[[:$1]] अस्तीत्वात नाही.",
+       "htmlform-title-badnamespace": "[[:$1]] हे \"{{ns:$2}}\" नामविश्वात नाही.",
+       "htmlform-title-not-creatable": "\"$1\" हे पान तयार करण्यासाठीचे शीर्षक नाही",
+       "htmlform-title-not-exists": "$1 अस्तीत्वात नाही.",
        "htmlform-user-not-exists": "<strong>$1</strong> अस्तीत्वात नाही.",
        "htmlform-user-not-valid": "<strong>$1</strong> हे वैध सदस्यनाम नाही.",
        "sqlite-has-fts": "पूर्ण-मजकूर शोध समर्थनासहित $1",
        "revdelete-uname-unhid": "सदस्यनाम लपवलेले नाही",
        "revdelete-restricted": "प्रबंधकांना बंधने दिली",
        "revdelete-unrestricted": "प्रबंधकांची बंधने काढली",
+       "logentry-block-block": "$1ने {{GENDER:$4|$3}} ला,$5 $6 या निवृत्तीवेळेपर्यंत   {{GENDER:$2|प्रतिबंधित केले}}",
+       "logentry-block-unblock": "$1 ने {{GENDER:$4|$3}} {{GENDER:$2|वरील प्रतिबंध हटविला}}",
+       "logentry-block-reblock": "$1 ने {{GENDER:$4|$3}}च्या प्रतिबंध मांडण्या $5 $6 या निवृत्तीवेळेसह {{GENDER:$2|बदलविल्यात}}",
+       "logentry-suppress-block": "$1 ने {{GENDER:$4|$3}}ला $5 $6 या निवृत्तीवेळेसह {{GENDER:$2|प्रतिबंधित केले}}",
+       "logentry-suppress-reblock": "$1 ने {{GENDER:$4|$3}}च्या प्रतिबंध मांडण्या $5 $6 या निवृत्तीवेळेसह {{GENDER:$2|बदलविल्यात}}",
+       "logentry-import-upload": "$1 ने संचिका अपभारणाद्वारे $3 ला {{GENDER:$2|आयात केले}}",
+       "logentry-import-upload-details": "$1 ने $3 ला संचिका अपभारणाद्वारे ($4 {{PLURAL:$4|आवृत्ती|आवृत्त्या}}){{GENDER:$2|आयात केल्या}}",
+       "logentry-import-interwiki": "$1 ने दुसऱ्या विकिमधून $3 ला {{GENDER:$2|आयात केले}}",
+       "logentry-import-interwiki-details": "$1 ने $5 पासून, $3 ला ($4 {{PLURAL:$4|आवृत्ती|आवृत्त्या}}){{GENDER:$2|आयात केल्या}}",
+       "logentry-merge-merge": "$1 ने $3 ला $4 मध्ये {{GENDER:$2|विलीन केले}}(आवृत्त्या $5 पर्यंत)",
        "logentry-move-move": "$1 ने लेख $3 वरुन $4 ला {{GENDER:$2|हलविला}}",
        "logentry-move-move-noredirect": "$1 ने मागे पुनर्निर्देशन न ठेवता लेख $3 वरुन $4 ला {{GENDER:$2|हलविला}}",
        "logentry-move-move_redir": "$1 ने पुनर्निर्देशन ठेउन लेख $3 वरुन $4 ला {{GENDER:$2|हलविला}}",
        "logentry-newusers-create2": "$3 हे सदस्यखाते $1 द्वारा {{GENDER:$2|तयार केल्या गेले}}",
        "logentry-newusers-byemail": "$3 हे सदस्यखाते $1 द्वारा {{GENDER:$2|तयार केल्या गेले}} व त्याचा परवलीचा शब्द विपत्राद्वारे पाठविल्या गेला",
        "logentry-newusers-autocreate": "सदस्यखाते $1 स्वयंचलितरित्या {{GENDER:$2|तयार झाले}}",
+       "logentry-protect-move_prot": "$1 ने सुरक्षा मांडणी $4 वरुन $3 ला {{GENDER:$2|हलविली}}",
+       "logentry-protect-unprotect": "$1 ने $3 ची सुरक्षा {{GENDER:$2|हटविली}}",
+       "logentry-protect-protect": "$1 ने $3 $4 ला {{GENDER:$2|सुरक्षित केले}}",
+       "logentry-protect-protect-cascade": "$1 ने $3 $4 [निपतन]ला {{GENDER:$2|सुरक्षित केले}}",
+       "logentry-protect-modify": "$1 ने $3 $4 ची  सुरक्षा पातळी {{GENDER:$2|बदलली}}",
+       "logentry-protect-modify-cascade": "$1 ने $3 $4 [निपतन]ची  सुरक्षा पातळी {{GENDER:$2|बदलली}}",
        "logentry-rights-rights": "$1 ने $3 साठी $4 वरुन $5 ला गट सदस्यता{{GENDER:$2|बदलली}}",
        "logentry-rights-rights-legacy": "$1 ने $3 साठी गट सदस्यता {{GENDER:$2|बदलली}}",
        "logentry-rights-autopromote": "$1 ला स्वयंचलितरित्या $4 वरुन $5 ला {{GENDER:$2|बढती दिल्या गेली}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|अपभारीत केली}} $3",
+       "logentry-upload-overwrite": "$1 ने  $3 ची एक नविन आवृत्ती {{GENDER:$2|अपभारीत केली}}",
+       "logentry-upload-revert": "$1 ने $3 ला {{GENDER:$2|अपभारीत केले}}",
+       "log-name-managetags": "खूणपताका व्यवस्थापन नोंदी",
+       "logentry-managetags-create": "$1 ने \"$4\" ही खूणपताका {{GENDER:$2|तयार केली}}",
+       "logentry-managetags-activate": "$1 ने  \"$4\" ही खूणपताका, सदस्यांसाठी व सांगकाम्यांसाठी {{GENDER:$2|सक्रिय केली}}",
+       "logentry-managetags-deactivate": "$1 ने  \"$4\" ही खूणपताका, सदस्यांसाठी व सांगकाम्यांसाठी {{GENDER:$2|अक्रिय केली}}",
+       "log-name-tag": "खूणपताका नोंदी",
        "rightsnone": "(काहीही नाही)",
        "revdelete-summary": "संपादन माहिती",
        "feedback-adding": "आपला पश्चप्रदाय (फिडबॅक)  जोडत आहोत या पानास.......",
        "feedback-bugornote": "जर आपण तांत्रिक प्रश्न  विस्तृतपणे मांडण्यास तयार असाल तर कृपया [$1 गणकदोष वृतांत] पाठवा. नपेक्षा, खाली देण्यात आलेले सोपे आवेदनपत्र वापरा. आपली टिप्पणी \"[$3 $2]\" या पानास आपले सदस्यनाव व आपण कोणता ब्राउजर वापरता यासह जोडण्यात येईल.",
        "feedback-cancel": "रद्द करा",
        "feedback-close": "झाले",
+       "feedback-dialog-title": "प्रतिक्रिया सादर करा",
        "feedback-error-title": "चूक",
        "feedback-error1": "चूक: API कडून अनोळखी परिणाम",
        "feedback-error2": "त्रुटी: संपादन रद्द",
        "feedback-message": "संदेश:",
        "feedback-subject": "विषय:",
        "feedback-submit": "सादर करा",
+       "feedback-termsofuse": "मी वापरण्याच्या अटींनुसार प्रतिक्रिया पुरविण्याचे मान्य करतो.",
        "feedback-thanks": " \"[$2 $1]\" या पानात आपला पश्चप्रदाय (फिडबॅक) टाकत आहोत.",
+       "feedback-thanks-title": "आपणास धन्यवाद!",
+       "feedback-useragent": "सदस्य प्रतिनीधी:",
        "searchsuggest-search": "शोधा",
        "searchsuggest-containing": ".......हे असलेले",
        "api-error-badaccess-groups": "आपणास ह्या विकिवर संचिका चढवण्याची परवानगी नाही",
        "api-error-file-too-large": "तुम्ही प्रस्तुत केलेली संचिका आकाराने खूप मोठी होती.",
        "api-error-filename-tooshort": "संचिकेचे नाव खूपच छोटे आहे.",
        "api-error-filetype-banned": "याप्रकारची संचिका प्रतिबंधित आहे.",
-       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|हà¥\80 à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¸à¤²à¥\87ला  à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87.|हà¥\8dया à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87त.}} $2 {{PLURAL:$3|हà¥\80 à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤\85सलà¥\87ला à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87|हà¥\8dया परवानगी असलेल्या संचिका-प्रकार आहेत}}.",
+       "api-error-filetype-banned-type": "$1 {{PLURAL:$4|हा à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¸à¤²à¥\87ला  à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87|या à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤¨à¤¸à¤²à¥\87लà¥\8dया à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87त}}. $2 {{PLURAL:$3|हा à¤ªà¤°à¤µà¤¾à¤¨à¤\97à¥\80 à¤\85सलà¥\87ला à¤¸à¤\82à¤\9aिà¤\95ा-पà¥\8dरà¤\95ार à¤\86हà¥\87|या परवानगी असलेल्या संचिका-प्रकार आहेत}}.",
        "api-error-filetype-missing": "या संचिकेस विस्तार(एक्सटेंशन) नाही.",
        "api-error-hookaborted": "तुम्ही केलेला बदल extension ने उलटवला आहे",
        "api-error-http": "अंतर्गत त्रुटी: सर्व्हरशी जोडणी होऊ शकली नाही.",
        "api-error-ok-but-empty": "आंतरिक त्रुटी : विदादाता प्रतिक्रिया देत नहीं",
        "api-error-overwrite": "अस्तित्वात असलेल्या संचिकेवर पुनर्लेखन प्रतिबंधित आहे.",
        "api-error-stashfailed": "इन्तरिक त्रुटी : विदादाता तात्पुरत्या स्वरूपाच्या संचिका जमा करण्यात अयशस्वी",
-       "api-error-publishfailed": "à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¥\8dरà¥\82टी:विदादात्यास, या तात्पुरत्या संचिकेच्या प्रकाशनास अपयश आले.",
-       "api-error-stasherror": "सà¥\8dà¤\9fà¥\85à¤\9aला à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85पभारणात à¤¤à¥\8dरà¥\82टी आली.",
+       "api-error-publishfailed": "à¤\85à¤\82तरà¥\8dà¤\97त à¤¤à¥\8dरà¥\81टी:विदादात्यास, या तात्पुरत्या संचिकेच्या प्रकाशनास अपयश आले.",
+       "api-error-stasherror": "सà¥\8dà¤\9fà¥\85à¤\9aमधà¥\8dयà¥\87 à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤\85पभारणात à¤¤à¥\8dरà¥\81टी आली.",
        "api-error-timeout": "अपेक्षित वेळेत विदागार (server)ने प्रतिसाद दिला नाही.",
        "api-error-unclassified": "एक अज्ञात चूक उद्भवली.",
        "api-error-unknown-code": "अज्ञात त्रुटी: \"$1\"",
        "expand_templates_generate_xml": "XML चा पार्स (parse) वृक्ष दाखवा",
        "expand_templates_preview": "झलक",
        "pagelang-name": "पान",
+       "pagelang-language": "भाषा",
+       "pagelang-use-default": "अविचल भाषा वापरा",
+       "pagelang-select-lang": "भाषा निवडा",
+       "right-pagelang": "पानाची भाषा बदला",
+       "action-pagelang": "पानाची असलेली भाषा बदला",
+       "log-name-pagelang": "भाषा बदल नोंदवही",
+       "log-description-pagelang": "या पानातील भाषाबदलाच्या नोंदी आहेत.",
+       "logentry-pagelang-pagelang": "$1 ने $3 करीता पानाची भाषा $4 वरुन $5 ला {{GENDER:$2|बदलली}}",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (सक्षम केला)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''अक्षम केला''')",
+       "mediastatistics": "माध्यम सांख्यिकी",
+       "mediastatistics-table-extensions": "शक्य विस्तारके",
+       "mediastatistics-table-count": "संचिकांची संख्या",
+       "mediastatistics-table-totalbytes": "एकत्रित आकार",
+       "mediastatistics-header-unknown": "अनोळखी",
        "mediastatistics-header-office": "कार्यालय",
+       "json-error-syntax": "वाक्यरचना त्रुटी",
+       "headline-anchor-title": "या विभागाचा दुवा",
        "special-characters-group-latin": "लॅटीन",
        "special-characters-group-latinextended": "विस्तारीत लॅटीन भाषा",
        "special-characters-group-ipa": "आंतरराष्ट्रीय उच्चारानुरूप अक्षरपद्धती",
        "special-characters-title-minus": "ॠण चिन्ह",
        "mw-widgets-dateinput-no-date": "कोणताही दिनांक निवडला नाही",
        "mw-widgets-titleinput-description-new-page": "अद्याप पान अस्तित्वात नाही",
+       "mw-widgets-titleinput-description-redirect": "$1ला पुनर्निर्देशित करा",
        "api-error-blacklisted": "कुपया वेगळे वर्णनात्मक शीर्षक निवडा"
 }
index 8847169..bdc2e67 100644 (file)
@@ -27,6 +27,7 @@
        "tog-hideminor": "Sembunyikan suntingan kecil daripada perubahan terkini",
        "tog-hidepatrolled": "Sembunyikan suntingan yang telah dironda daripada perubahan terkini",
        "tog-newpageshidepatrolled": "Sorokkan laman yang telah dironda daripada senarai laman baru",
+       "tog-hidecategorization": "Sorokkan pengkategorian laman",
        "tog-extendwatchlist": "Kembangkan senarai pantau untuk memaparkan semua perubahan, bukan hanya yang terkini",
        "tog-usenewrc": "Kumpulkan perubahan mengikut laman dalam perubahan terkini dan senarai pantau",
        "tog-numberheadings": "Nomborkan tajuk secara automatik",
        "tog-watchlisthidebots": "Sembunyikan suntingan bot daripada senarai pantau",
        "tog-watchlisthideminor": "Sembunyikan suntingan kecil daripada senarai pantau",
        "tog-watchlisthideliu": "Sembunyikan suntingan oleh pengguna yang telah log masuk daripada senarai pantau",
+       "tog-watchlistreloadautomatically": "Muat semula senarai pantau secara automatik setiap kali penapis berubah (perlu JavaScript)",
        "tog-watchlisthideanons": "Sembunyikan suntingan oleh pengguna tanpa nama daripada senarai pantau",
        "tog-watchlisthidepatrolled": "Sembunyikan suntingan yang telah dironda daripada senarai pantau",
+       "tog-watchlisthidecategorization": "Sorokkan pengkategorian laman",
        "tog-ccmeonemails": "Kirimkan saya salinan e-mel yang saya hantar kepada pengguna lain",
        "tog-diffonly": "Jangan tunjukkan kandungan laman di bawah perbezaan",
        "tog-showhiddencats": "Tunjukkan kategori tersembunyi",
        "category-empty": "''Kategori ini tidak mengandungi sebarang laman atau media.''",
        "hidden-categories": "{{PLURAL:$1|Kategori tersembunyi|Kategori-kategori tersembunyi}}",
        "hidden-category-category": "Kategori tersembunyi",
-       "category-subcat-count": "{{PLURAL:$2|Kategori ini mengandungi sebuah subkategori berikut.|Yang berikut ialah $1 daripada $2 buah subkategori dalam kategori ini.}}",
+       "category-subcat-count": "{{PLURAL:$2|Kategori ini hanya mempunyai subkategori berikut.|Yang berikut ialah $1 daripada $2 buah subkategori dalam kategori ini.}}",
        "category-subcat-count-limited": "Katergori ini mengandungi {{PLURAL:$1|subkategori|$1 subkategori}}.",
        "category-article-count": "{{PLURAL:$2|Kategori ini mengandungi sebuah laman berikut.|Yang berikut ialah $1 daripada $2 buah laman dalam kategori ini.}}",
        "category-article-count-limited": "{{PLURAL:$1|Laman berikut|$1 laman berikut}} kini terkandung dalam kategori terkini.",
        "morenotlisted": "Senarai ini tidak lengkap.",
        "mypage": "Halaman",
        "mytalk": "Perbincangan",
-       "anontalk": "Perbincangan bagi IP ini",
+       "anontalk": "Perbincangan",
        "navigation": "Pandu arah",
        "and": "&#32;dan",
        "qbfind": "Cari",
        "nstab-template": "Templat",
        "nstab-help": "Laman bantuan",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Laman utama",
        "nosuchaction": "Tindakan tidak dikenali",
        "nosuchactiontext": "Tindakan yang dinyatakan dalam URL ini tidak sah. Anda mungkin telah menaip URL yang salah atau mengikuti pautan yang tidak sah. Ini juga mungkin bererti terdapat pepijat dalam perisian yang digunakan oleh {{SITENAME}}.",
        "nosuchspecialpage": "Laman khas tidak wujud",
        "databaseerror-query": "Pertanyaan: $1",
        "databaseerror-function": "Fungsi: $1",
        "databaseerror-error": "Ralat: $1",
+       "transaction-duration-limit-exceeded": "Demi mengelakkan terjadinya jeda pengulangan yang tinggi, transaksi ini dibatalkan kerana tempoh menulis ($1) telah melebihi had $2 saat.",
        "laggedslavemode": "Amaran: Laman ini mungkin bukan yang terkini.",
        "readonly": "Pangkalan data dikunci",
        "enterlockreason": "Sila nyatakan sebab penguncian dan jangkaan\nbila kunci ini akan dibuka.",
        "missingarticle-rev": "(semakan $1)",
        "missingarticle-diff": "(Beza: $1, $2)",
        "readonly_lag": "Pangkalan data telah dikunci secara automatik sementara semua pelayan pangkalan data diselaraskan.",
+       "nonwrite-api-promise-error": "Pengepala 'Promise-Non-Write-API-Action' telah dihantar tetapi permintaan dibuat kepada modul menulis API.",
        "internalerror": "Ralat dalaman",
        "internalerror_info": "Ralat dalaman: $1",
        "internalerror-fatal-exception": "Pengecualian fatal jenis \"$1\"",
        "viewsource": "Lihat sumber",
        "viewsource-title": "Lihat sumber bagi $1",
        "actionthrottled": "Tindakan didikitkan",
-       "actionthrottledtext": "Untuk mencegah spam, anda dihadkan daripada melakukan tindakan ini berulang kali dalam ruang waktu yang singkat, dan anda telah melebihi had tersebut. Sila cuba lagi selepas beberapa minit.",
+       "actionthrottledtext": "Untuk mencegah penyalahgunaan, anda dihadkan daripada melakukan tindakan ini berulang kali dalam ruang waktu yang singkat, dan anda telah melebihi had tersebut. Sila cuba lagi selepas beberapa minit.",
        "protectedpagetext": "Laman ini telah dikunci untuk melarang penyuntingan atau sebarang tindakan yang lain.",
-       "viewsourcetext": "Anda boleh melihat dan menyalin sumber bagi laman ini:",
-       "viewyourtext": "Anda boleh melihat dan menyalin sumber '''suntingan anda''' kepada laman ini:",
+       "viewsourcetext": "Anda boleh melihat dan menyalin sumber bagi laman ini.",
+       "viewyourtext": "Anda boleh melihat dan menyalin sumber <strong>suntingan anda</strong> pada laman ini.",
        "protectedinterface": "Laman ini menyediakan teks antara muka bagi perisian ini, akan tetapi dikunci untuk menghalang penyalahgunaan.\nUntuk menambah atau menyunting terjemahan untuk semua wiki, sila gunakan projek penyetempatan MediaWiki, [//translatewiki.net/ translatewiki.net].",
        "editinginterface": "<strong>Amaran:</strong> Anda sedang menyunting halaman yang digunakan untuk menyediakan teks antaramuka untuk perisian berkenaan.\nSebarang suntingan ke atas halaman ini akan memberikan kesan kepada penampilan antaramuka pengguna bagi pengguna-pengguna lain wiki ini.",
        "translateinterface": "Untuk menambah atau menyunting terjemahan untuk kesemua wiki, sila gunakan [//translatewiki.net/ translatewiki.net], iaitu projek penyetempatan MediaWiki.",
-       "cascadeprotected": "Laman ini telah dilindungi daripada penyuntingan oleh pengguna selain penyelia, kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi dengan secara \"melata\": $2",
+       "cascadeprotected": "Laman ini telah dilindungi daripada disunting kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut, yang dilindungi dengan opsyen \"melata\" dipasang:\n$2",
        "namespaceprotected": "Anda tidak mempunyai keizinan untuk menyunting laman dalam ruang nama '''$1'''.",
        "customcssprotected": "Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.",
        "customjsprotected": "Anda tidak dibenarkan menyunting laman JavaScript ini kerana ia mengandungi tetapan peribadi pengguna lain.",
        "createaccountreason": "Sebab:",
        "createacct-reason": "Sebab",
        "createacct-reason-ph": "Mengapa anda membuka satu lagi akaun",
-       "createacct-captcha": "Pemeriksaan sekuriti",
-       "createacct-imgcaptcha-ph": "Isikan teks yang anda lihat di atas",
        "createacct-submit": "Wujudkan akaun anda",
-       "createacct-another-submit": "Buka akaun baru",
+       "createacct-another-submit": "Buka akaun",
        "createacct-benefit-heading": "{{SITENAME}} dijayakan oleh orang ramai seperti anda.",
        "createacct-benefit-body1": "{{PLURAL:$1|suntingan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|halaman}}",
        "createacct-benefit-body3": "{{PLURAL:$1|penyumbang}} terkini",
        "badretype": "Sila ulangi kata laluan dengan betul.",
+       "usernameinprogress": "Pembukaan akaun untuk nama pengguna ini sudah sedang dijalankan. Sila tunggu.",
        "userexists": "Nama pengguna yang diisikan telah pun digunakan.\nSila pilih nama yang lain.",
        "loginerror": "Ralat log masuk",
        "createacct-error": "Ralat pembukaan akaun",
        "wrongpasswordempty": "Kata laluan yang dimasukkan adalah kosong. Sila cuba lagi.",
        "passwordtooshort": "Kata laluan mestilah sekurang-kurangnya {{PLURAL:$1|1 aksara|$1 aksara}}.",
        "passwordtoolong": "Kata laluan tidak boleh melebihi $1 aksara.",
+       "passwordtoopopular": "Kata laluan yang biasa dipilih tidak boleh diguna. Sila pilih kata laluan yang lebih unik.",
        "password-name-match": "Kata laluan anda mesti berbeza daripada nama pengguna anda.",
        "password-login-forbidden": "Penggunaan nama pengguna dan kata laluan ini adalah dilarang.",
        "mailmypassword": "Set semula kata laluan",
        "passwordreset-emailtext-ip": "Seseorang (mungkin anda, dari alamat IP $1) telah memohon supaya kata laluan diset semula untuk {{SITENAME}} anda ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut\ndikaitkan dengan alamat e-mel ini:\n\n$2\n\n{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa $5 hari. Anda harus log masuk dan membuat kata laluan yang baru sekarang. Jika permohonan ini dibuat oleh orang lain, atau jika anda teringat kembali kata laluan asal anda dan anda tidak lagi berhasrat untuk mengubahnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.",
        "passwordreset-emailtext-user": "Pengguna $1 telah memohon supaya kata laluan diset semula untuk {{SITENAME}} anda ($4). {{PLURAL:$3|Akaun|Akaun-akaun}} pengguna yang berikut\ndikaitkan dengan alamat e-mel ini:\n\n$2\n\n{{PLURAL:$3|Kata|Kata-kata}} laluan sementara ini akan luput dalam masa $5 hari. Anda harus log masuk dan membuat kata laluan yang baru sekarang. Jika permohonan ini dibuat oleh orang lain, atau jika anda teringat kembali kata laluan asal anda dan anda tidak lagi berhasrat untuk mengubahnya, anda boleh mengabaikan pesanan ini dan terus menggunakan kata laluan lama anda.",
        "passwordreset-emailelement": "Nama pengguna: \n$1\n\nKata laluan sementara: \n$2",
-       "passwordreset-emailsent": "E-mel set semula kata laluan telah dihantar.",
+       "passwordreset-emailsentemail": "Jika ini ialah alamat e-mel yang terdaftar untuk akaun anda, maka e-mel set semula kata laluan akan dihantar.",
        "passwordreset-emailsent-capture": "E-mel set semula kata laluan telah dihantar, seperti yang dipaparkan di bawah.",
        "passwordreset-emailerror-capture": "E-mel set semula kata laluan telah dihasilkan, seperti yang dipaparkan di bawah, tetapi tidak berjaya dihantar kepada {{GENDER:$2|pengguna}} berkenaan: $1",
-       "changeemail": "Tukar alamat e-mel",
-       "changeemail-header": "Tukar alamat e-mel akaun",
+       "changeemail": "Tukar atau padamkan alamat e-mel",
+       "changeemail-header": "Lengkapkan borang ini untuk menukar alamat e-mel anda. Jika anda ingin memutuskan sebarang hubungan alamat e-mel daripada akaun anda, biarkan ruangan alamat e-mel kosong ketika menghantar borang.",
+       "changeemail-passwordrequired": "Anda akan dikehendaki memasukkan kata laluan untuk mengesahkan perubahan ini.",
        "changeemail-no-info": "Anda hendaklah log masuk terlebih dahulu untuk mencapai laman ini secara terus.",
        "changeemail-oldemail": "Alamat e-mel sekarang:",
        "changeemail-newemail": "Alamat e-mel baru:",
+       "changeemail-newemail-help": "Ruangan ini harus dibiarkan kosong jika anda mahu menggugurkan alamat e-mel anda. Anda tidak akan dapat mengeset semula kata laluan yang terlupa, bahkan tidak akan menerima e-mel daripada wiki ini jika alamat e-mel itu dipadamkan.",
        "changeemail-none": "(tiada)",
        "changeemail-password": "Kata laluan anda di {{SITENAME}}:",
        "changeemail-submit": "Tukar E-mel",
        "changeemail-throttled": "Anda telah melakukan terlalu banyak cubaan log masuk.\nSila tunggu $1 dan cuba lagi.",
+       "changeemail-nochange": "Sila taipkan alamat e-mel baru yang lain.",
        "resettokens": "Set semula token",
        "resettokens-text": "Anda boleh mengeset semula token yang membolehkan akses kepada data peribadi tertentu yang berkaitan dengan akaun anda di sini.\n\nAnda harus melakukannya jika anda tanpa sengaja mengongsinya dengan sesiapa ataupun akaun anda telah dikompromi.",
        "resettokens-no-tokens": "Tiada token untuk diset semula.",
        "sig_tip": "Tandatangan dengan cap waktu",
        "hr_tip": "Garis melintang (gunakan dengan hemat)",
        "summary": "Ringkasan:",
-       "subject": "Tajuk:",
+       "subject": "Perkara:",
        "minoredit": "Ini adalah suntingan kecil",
        "watchthis": "Pantau laman ini",
        "savearticle": "Simpan",
        "missingsummary": "'''Peringatan:''' Anda tidak menyatakan ringkasan suntingan. Klik '''Simpan''' sekali lagi untuk menyimpan suntingan ini tanpa ringkasan.",
        "selfredirect": "<strong>Amaran:</strong> Anda sedang melencongkan laman ini kepada dirinya sendiri.\nMungkin anda telah menyatakan sasaran yang salah untuk lencongan ini ataupun sedang tersalah menyunting halaman.\nJika anda mengklik \"{{int:savearticle}}\" semula, maka lencongan tetap akan dihasilkan.",
        "missingcommenttext": "Sila masukkan komen dalam ruangan di bawah.",
-       "missingcommentheader": "'''Peringatan:''' Anda tidak menyatakan tajuk bagi komen ini. Klik '''{{int:savearticle}}''' sekali lagi untuk menyimpan suntingan ini tanpa tajuk.",
+       "missingcommentheader": "<strong>Peringatan:</strong> Anda belum menyatakan tajuk perkara bagi komen ini.\nJika anda klik '''{{int:savearticle}}''' sekali lagi, suntingan anda akan tersimpan tanpa tajuk.",
        "summary-preview": "Pralihat ringkasan:",
-       "subject-preview": "Pralihat tajuk:",
+       "subject-preview": "Pralihat perkara:",
        "previewerrortext": "Ralat berlaku ketika cuba mempratayangkan hasil suntingan anda.",
        "blockedtitle": "Pengguna disekat",
        "blockedtext": "<strong>Nama pengguna atau alamat IP anda telah disekat.</strong>\n\nSekatan ini dilakukan oleh $1.\nSebab yang telah diberikan ialah <em>$2</em>.\n\n* Sekatan mula: $8\n* Sekatan tamat: $6\n* Pengguna sasaran: $7\n\nAnda boleh hubungi $1 atau [[{{MediaWiki:Grouppage-sysop}}|penyelia]] yang lain untuk membincangkan sekatan ini.\n\nSila ambil perhatian bahawa anda tidak boleh menggunakan ciri \"kirim e-mel kepada pengguna ini\" kecuali sekiranya anda telah menetapkan alamat e-mel yang sah dalam [[Special:Preferences|keutamaan pengguna]] anda dan anda tidak disekat daripada menggunakannya.\n\nAlamat IP semasa anda ialah $3, dan ID sekatan ialah #$5.\nSila sertakan maklumat-maklumat di atas dalam sebarang pertanyaan yang anda membuat.",
        "newarticle": "(Baru)",
        "newarticletext": "Anda telah mengikuti pautan ke laman yang belum wujud.\nUntuk mencipta laman ini, sila taip dalam kotak di bawah\n(lihat [$1 laman bantuan] untuk maklumat lanjut).\nJika anda tiba di sini secara tak sengaja, hanya klik butang '''back''' pada pelayar anda.",
        "anontalkpagetext": "----''Ini ialah laman perbincangan bagi pengguna tanpa nama yang belum membuka akaun atau tidak log masuk.\nOleh itu kami terpaksa menggunakan alamat IP untuk mengenal pasti pengguna tersebut. Alamat IP ini boleh dikongsi oleh ramai pengguna.\nSekiranya anda adalah seorang pengguna tanpa nama dan berasa bahawa komen yang tidak kena mengena telah ditujukan kepada anda, sila [[Special:UserLogin/signup|buka akaun baru]] atau [[Special:UserLogin|log masuk]] untuk mengelakkan sebarang kekeliruan dengan pengguna tanpa nama yang lain.''",
-       "noarticletext": "Tiada teks dalam laman ini pada masa sekarang. Anda boleh [[Special:Search/{{PAGENAME}}|mencari tajuk bagi laman ini]] dalam laman-laman lain, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log-log yang berkaitan], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} menyunting laman ini]</span>.",
+       "noarticletext": "Laman ini buat masa sekarang tidak berteks. Anda boleh [[Special:Search/{{PAGENAME}}|cari tajuk bagi laman ini]] dalam laman-laman lain, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cari log-log yang berkaitan], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} sunting laman ini]</span>.",
        "noarticletext-nopermission": "Tiada teks dalam laman ini ketika ini.\nAnda boleh [[Special:Search/{{PAGENAME}}|mencari tajuk laman ini]] dalam laman lain,\natau <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log yang berkaitan]</span>.",
        "missing-revision": "Semakan #$1 pada halaman \"{{FULLPAGENAME}}\" tidak wujud.\n\nHal ini biasanya disebabkan oleh pautan sejarah yang lapuk ke halaman yang sudah dihapuskan.\nButirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log penghapusan].",
        "userpage-userdoesnotexist": "Akaun pengguna \"<nowiki>$1</nowiki>\" tidak berdaftar. Sila pastikan sama ada anda mahu mencipta/menyunting laman ini.",
        "yourdiff": "Perbezaan",
        "copyrightwarning": "Sila ambil perhatian bahawa semua sumbangan kepada {{SITENAME}} akan dikeluarkan di bawah $2 (lihat $1 untuk butiran lanjut). Jika anda tidak mahu tulisan anda disunting sewenang-wenangnya oleh orang lain dan diedarkan secara bebas, maka jangan kirim di sini.<br />\nAnda juga berjanji bahawa ini adalah hasil kerja tangan anda sendiri, atau disalin daripada domain awam atau mana-mana sumber bebas lain.\n'''JANGAN KIRIM KARYA HAK CIPTA ORANG LAIN TANPA KEBENARAN!'''",
        "copyrightwarning2": "Sila ambil perhatian bahawa semua sumbangan terhadap {{SITENAME}} boleh disunting, diubah, atau dipadam oleh penyumbang lain. Jika anda tidak mahu tulisan anda disunting sewenang-wenangnya, maka jangan kirim di sini.<br />\nAnda juga berjanji bahawa ini adalah hasil kerja tangan anda sendiri, atau\ndisalin daripada domain awam atau mana-mana sumber bebas lain (lihat $1 untuk butiran lanjut).\n'''JANGAN KIRIM KARYA HAK CIPTA ORANG LAIN TANPA KEBENARAN!'''",
+       "editpage-cannot-use-custom-model": "Model kandungan laman ini tidak boleh diubah.",
        "longpageerror": "'''Ralat: Teks yang anda serahkan itu panjangnya {{PLURAL:$1|1|$1}} kilobait, iaitu lebih panjang daripada had maksimum {{PLURAL:$2|1|$2}} kilobait.'''\nOleh itu, ia tidak boleh disimpan.",
        "readonlywarning": "'''Amaran: Pangkalan data ini dikunci untuk tujuan penyelenggaraan , maka anda tidak akan dapat menyimpan suntingan anda buat sekarang.'''\nAnda boleh menyalin tampal teks anda pada fail teks dan menyimpannya untuk lain kali.\n\nPenyelia yang menguncinya memberikan penjelasan ini: $1",
        "protectedpagewarning": "'''Amaran: Laman ini telah dikunci supaya hanya mereka yang mempunyai keistimewaan penyelia boleh menyuntingnya.'''\nMasukan log terakhir ditunjukkan di bawah untuk rujukan:",
        "semiprotectedpagewarning": "'''Nota:''' Laman ini telah dikunci agar hanya pengguna berdaftar sahaja boleh menyuntingnya.\nMasukan log terakhir ditunjukkan di bawah untuk rujukan:",
-       "cascadeprotectedwarning": "'''Amaran:''' Laman ini telah dikunci, oleh itu hanya penyelia boleh menyuntingnya. Ini kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut yang dilindungi secara melata:",
+       "cascadeprotectedwarning": "<strong>Amaran:</strong> Laman ini telah dikunci supaya hanya pengguna bertaraf penyelia boleh menyuntingnya kerana ia termasuk dalam {{PLURAL:$1|laman|laman-laman}} berikut yang dilindungi secara melata:",
        "titleprotectedwarning": "'''Amaran: Laman ini telah dikunci hingga [[Special:ListGroupRights|hak-hak tertentu]] diperlukan untuk menciptanya.'''\nMasukan log terakhir ditunjukkan di bawah untuk rujukan:",
        "templatesused": "{{PLURAL:$1|Templat|Templat}} yang digunakan dalam laman ini:",
        "templatesusedpreview": "{{PLURAL:$1|Templat|Templat}} yang digunakan dalam pralihat ini:",
        "permissionserrors": "Ralat kebenaran",
        "permissionserrorstext": "Anda tidak mempunyai keizinan untuk berbuat demikian atas {{PLURAL:$1|sebab|sebab-sebab}} berikut:",
        "permissionserrorstext-withaction": "Anda tidak mempunyai keizinan untuk $2, atas {{PLURAL:$1|sebab|sebab-sebab}} berikut:",
+       "contentmodelediterror": "Anda tidak boleh menyunting semakan ini kerana model kandungannya ialah <code>$1</code> padahal model kandungan semasa laman ini ialah <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Amaran: Anda sedang mencipta semula sebuah laman yang pernah dihapuskan.'''\n\nAnda harus mempertimbangkan perlunya menyunting laman ini.\nUntuk rujukan, yang berikut ialah log penghapusan bagi laman ini:",
        "moveddeleted-notice": "Laman ini telah dihapuskan.\nLog penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.",
+       "moveddeleted-notice-recent": "Maaf, laman ini baru-baru sahaja dihapuskan (dalam 24 jam yang lepas).\nLog penghapusan dan pemindahan untuk laman ini dinyatakan di bawah sebagai rujukan.",
        "log-fulllog": "Lihat log lengkap",
        "edit-hook-aborted": "Suntingan anda telah dibatalkan oleh penyangkuk. Tiada sebab diberikan.",
        "edit-gone-missing": "Laman tersebut telah dihapuskan dan tidak dapat dikemaskinikan.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Objek kosong",
        "content-json-empty-array": "Tatasusunan kosong",
+       "duplicate-args-warning": "<strong>Amaran:</strong> [[:$1]] sedang memanggil [[:$2]] dengan lebih daripada satu nilai untuk parameter \"$3\". Hanya nilai terakhir yang diberikan akan digunakan.",
        "duplicate-args-category": "Laman yang menggunakan argumen pendua dalam panggilan templat",
        "duplicate-args-category-desc": "Laman ini mengandungi panggilan templat yang menggunakan pendua argumen seperti <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.\n\nHad panggilan ialah $2, sekarang terdapat $1 panggilan.",
        "search-category": "(kategori $1)",
        "search-file-match": "(sepadan dengan kandungan fail)",
        "search-suggest": "Maksud anda, $1?",
+       "search-rewritten": "Memaparkan hasil untuk $1. Cari $2 pula.",
        "search-interwiki-caption": "Projek-projek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(lagi)",
        "showingresultsinrange": "Yang berikut adalah {{PLURAL:$1|<strong>satu</strong> hasil|sebanyak <strong>$1</strong> hasil}} dalam julat #<strong>$2</strong> hingga #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Hasil <strong>$1</strong> / <strong>$3</strong>|Hasil <strong>$1 - $2</strong> / <strong>$3</strong>}}",
        "search-nonefound": "Tiada hasil yang sepadan dengan pertanyaan.",
+       "search-nonefound-thiswiki": "Tiada hasil yang sepadan dengan pertanyaan di tapak ini.",
        "powersearch-legend": "Carian lanjutan",
        "powersearch-ns": "Cari dalam ruang nama:",
        "powersearch-togglelabel": "Pilih:",
        "prefs-watchlist-token": "Token senarai pantau:",
        "prefs-misc": "Pelbagai",
        "prefs-resetpass": "Tukar kata laluan",
-       "prefs-changeemail": "Tukar E-mel",
+       "prefs-changeemail": "Tukar atau padamkan alamat e-mel",
        "prefs-setemail": "Tetapkan alamat e-mel",
        "prefs-email": "Pilihan e-mel",
        "prefs-rendering": "Penampilan",
        "rows": "Baris:",
        "columns": "Lajur:",
        "searchresultshead": "Cari",
-       "stub-threshold": "Ambang bagi pemformatan <a href=\"#\" class=\"stub\">pautan ke rencana ringkas</a> (bait):",
+       "stub-threshold": "Ambang untuk pemformatan pautan tunas ($1):",
+       "stub-threshold-sample-link": "contoh",
        "stub-threshold-disabled": "Dimatikan",
        "recentchangesdays": "Bilangan hari dalam perubahan terkini:",
        "recentchangesdays-max": "(had $1 hari)",
        "prefs-help-recentchangescount": "Ini termasuklah perubahan terkini, sejarah laman dan log.",
        "prefs-help-watchlist-token2": "Inilah kunci rahsia kepada suapan web senarai pantau anda.\nSesiapa yang mengetahuinya akan boleh membaca senarai pantau anda, jadi jangan kongsinya.\n[[Special:ResetTokens|Klik di sini jika anda perlu mengesetnya semula]].",
        "savedprefs": "Keutamaan anda disimpan.",
+       "savedrights": "Hak pengguna {{GENDER:$1|$1}} telah disimpan.",
        "timezonelegend": "Zon waktu:",
        "localtime": "Waktu tempatan:",
        "timezoneuseserverdefault": "Gunakan tetapan sediaan wiki ($1)",
        "badsig": "Tandatangan mentah tidak sah; sila semak tag HTML.",
        "badsiglength": "Tandatangan anda tidak boleh melebihi $1 aksara.",
        "yourgender": "Jantina anda?",
-       "gender-unknown": "Tidak dinyatakan",
+       "gender-unknown": "Apabila menyebut anda, perisian anakn menggunakan kata-kata yang neutral jantina seboleh-bolehnya",
        "gender-male": "Lelaki",
        "gender-female": "Perempuan",
        "prefs-help-gender": "Pilihan: Digunakan oleh perisian ini untuk merujuk jantina anda dengan betul. Maklumat ini akan didedahkan kepada awam.",
        "prefs-help-prefershttps": "Keutamaan inu akan berkuatkuasa pada lain kali anda log masuk.",
        "prefswarning-warning": "Anda telah mengubah suai keutamaan anda yang belum disimpan.\nJika anda meninggalkan laman ini tanpa mengklik \"$1\", keutamaan anda tidak akan disimpan.",
        "prefs-tabs-navigation-hint": "Petua: Anda boleh menggunakan kekunci anak panah kiri atau kanan untuk beralihan dari tab ke tab pada senarai tab.",
-       "email-address-validity-valid": "Alamat e-mel adalah sah",
-       "email-address-validity-invalid": "Sila masukkan alamat e-mel yang sah",
        "userrights": "Pengurusan hak pengguna",
        "userrights-lookup-user": "Urus kumpulan pengguna",
        "userrights-user-editname": "Masukkan nama pengguna:",
        "group-bot": "Bot",
        "group-sysop": "Penyelia",
        "group-bureaucrat": "Birokrat",
-       "group-suppress": "Penyemak",
+       "group-suppress": "Peredam",
        "group-all": "(semua)",
        "group-user-member": "{{GENDER:$1|pengguna}}",
        "group-autoconfirmed-member": "{{GENDER:$1|pengguna sah automatik}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|penyelia}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat}}",
-       "group-suppress-member": "{{GENDER:$1|penyemak}}",
+       "group-suppress-member": "{{GENDER:$1|peredam}}",
        "grouppage-user": "{{ns:project}}:Pengguna",
        "grouppage-autoconfirmed": "{{ns:project}}:Pengguna yang disahkan secara automatik",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Penyelia",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrat",
-       "grouppage-suppress": "{{ns:project}}:Penyemak",
+       "grouppage-suppress": "{{ns:project}}:Peredam",
        "right-read": "Membaca laman",
        "right-edit": "Menyunting laman",
        "right-createpage": "Mencipta laman (selain laman perbincangan)",
        "rcshowhidemine": "$1 suntingan saya",
        "rcshowhidemine-show": "Paparkan",
        "rcshowhidemine-hide": "Sorokkan",
+       "rcshowhidecategorization": "$1 pengkategorian laman",
+       "rcshowhidecategorization-show": "Paparkan",
+       "rcshowhidecategorization-hide": "Sorokkan",
        "rclinks": "Paparkan $1 perubahan terakhir sejak $2 hari yang lalu<br />$3",
        "diff": "beza",
        "hist": "sej",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 pemantau]",
        "rc_categories": "Hadkan kepada kategori (asingkan dengan \"|\")",
-       "rc_categories_any": "Semua",
+       "rc_categories_any": "Mana-mana yang terpilih",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 bait selepas perubahan",
        "newsectionsummary": "/* $1 */ bahagian baru",
        "recentchangeslinked-summary": "Laman khas ini menyenaraikan perubahan terkini bagi laman-laman yang dipaut. Laman-laman yang terdapat dalam senarai pantau anda ditandakan dengan '''teks tebal'''.",
        "recentchangeslinked-page": "Nama laman:",
        "recentchangeslinked-to": "Paparkan perubahan pada laman yang mengandungi pautan ke laman yang diberikan",
+       "recentchanges-page-added-to-category": "[[:$1]] ditambahkan kepada kategori",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu|$2}} lagi halaman ditambahkan kepada kategori",
+       "recentchanges-page-removed-from-category": "[[:$1]] digugurkan dari kategori",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] dan {{PLURAL:$2|satu|$2}} lagi halaman digugurkan dari kategori",
+       "autochange-username": "Perubahan automatik MediaWiki",
        "upload": "Muat naik fail",
        "uploadbtn": "Muat naik fail",
        "reuploaddesc": "Kembali ke borang muat naik",
        "uploaddisabledtext": "Ciri muat naik fail dimatikan.",
        "php-uploaddisabledtext": "Pemuatnaikan fail PHP dilumpuhkan. Sila semak tetapan file_uploads.",
        "uploadscripted": "Fail ini mengandungi kod HTML atau skrip yang boleh disalahtafsirkan oleh pelayar web.",
-       "upload-scripted-pi-callback": "Tidak dapat memuat naik fail yang mengandungi arahan pemprosesan hamparan xml.",
+       "upload-scripted-pi-callback": "Tidak dapat memuat naik fail yang mengandungi arahan pemprosesan hamparan XML.",
        "uploaded-script-svg": "Terdapat elemen terskrip \"$1\" dalam fail SVG yang dimuat naik.",
        "uploaded-hostile-svg": "Terdapat CSS yang tidak selamat dalam elemen stail fail SVG yang dimuat naik.",
        "uploaded-event-handler-on-svg": "Penetapan atribut <i>event-handler</i> <code>$1=\"$2\"</code> tidak dibenarkan dalam fail SVG.",
        "uploaded-setting-event-handler-svg": "Dilarang menetapkan atribut <i>event-handler</i>, terdapat <code>&lt;$1 $2=\"$3\"&gt;</code> dalam fail SVG yang dimuat naik.",
        "uploaded-setting-href-svg": "Dilarang menggunakan teg \"set\" untuk menambahkan atribut \"href\" kepada elemen induk.",
        "uploaded-wrong-setting-svg": "Dilarang menggunakan teg \"set\" untuk menambah sasaran jauh/data/skrip ke sebarang atribut. Terdapat <code>&lt;set to=\"$1\"&gt;</code> dalam fail SVG yang dimuat naik.",
+       "uploaded-setting-handler-svg": "SVG yang menentukan atribut \"handler\" dengan remote/data/script disekat. Terdapat <code>$1=\"$2\"</code> dalam fail SVG yang dimuat naik.",
+       "uploaded-remote-url-svg": "SVG yang menetapkan sebarang atribut style dengan URL luar dikekang. <code>$1=\"$2\"</code> ditemui di dalam fail SVG yang dimuat naik.",
        "uploaded-image-filter-svg": "Terdapat penapis imej dengan URL: <code>&lt;$1 $2=\"$3\"&gt;</code> dalam fail SVG yang dimuat naik.",
        "uploadscriptednamespace": "Fail SVG ini mengandungi ruang nama terlarang \"$1\"",
        "uploadinvalidxml": "XML dalam fail yang dimuat naik ini tidak dapat dihuraikan.",
        "upload-options": "Pilihan muat naik",
        "watchthisupload": "Pantau fail ini",
        "filewasdeleted": "Sebuah fail dengan nama ini pernah dimuat naik, tetapi kemudiannya dihapuskan. Anda seharusnya menyemak $1 sebelum meneruskan percubaan untuk memuat naik fail ini.",
+       "filename-thumb-name": "Nampaknya macam tajuk gambar kenit (thumbnail). Tolong jangan muat naik gambar kenit balik ke dalam wiki yang sama. Selain itu, sila betulkan nama fail supaya ia nampak lebih bererti dan tiada awalan gambar kenit.",
        "filename-bad-prefix": "Nama bagi fail yang dimuat naik bermula dengan '''\"$1\"''', yang mana merupakan nama yang tidak deskriptif yang biasanya ditetapkan oleh kamera digital secara automatik. Sila berikan nama yang lebih deskriptif bagi fail tersebut.",
        "filename-prefix-blacklist": " #<!-- biarkan baris ini seperti sediakala --> <pre>\n# Sintaks adalah seperti berikut:\n#   * Segalanya mulai aksara \"#\" hingga akhir baris ialah komen\n#   * Setiap baris bukan kosong ialah awalan bagi nama-nama fail biasa yang ditetapkan secara automatik oleh kamera digital\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # sesetengah telefon bimbit\nIMG # generik\nJD # Jenoptik\nMGP # Pentax\nPICT # dll.\n #</pre> <!-- biarkan baris ini seperti sediakala -->",
        "upload-success-subj": "Muat naik berjaya",
        "upload-too-many-redirects": "URL ini mengandungi terlalu banyak lencongan",
        "upload-http-error": "Berlaku ralat HTTP: $1",
        "upload-copy-upload-invalid-domain": "Muat naik salin tidak terdapat dari domain ini.",
+       "upload-dialog-title": "Muat naik fail",
+       "upload-dialog-button-cancel": "Batalkan",
+       "upload-dialog-button-done": "Siap",
+       "upload-dialog-button-save": "Simpan",
+       "upload-dialog-button-upload": "Muat naik",
+       "upload-form-label-select-file": "Pilih fail",
+       "upload-form-label-infoform-title": "Butiran",
+       "upload-form-label-infoform-name": "Nama",
+       "upload-form-label-infoform-description": "Keterangan",
+       "upload-form-label-usage-title": "Penggunaan",
+       "upload-form-label-usage-filename": "Nama fail",
+       "foreign-structured-upload-form-label-own-work": "Ini ialah karya saya sendiri",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategori",
+       "foreign-structured-upload-form-label-infoform-date": "Tarikh",
+       "foreign-structured-upload-form-label-own-work-message-local": "Saya mengesahkan bahawa saya memuat naik fail ini dengan mengikut terma perkhidmatan dan dasar perlesenan di {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Anda mungkin juga mahu mencuba [[Special:Upload|laman muat naik yang asal]].",
        "backend-fail-stream": "Fail $1 tidak dapat distrimkan.",
        "backend-fail-backup": "Fail $1 tidak dapat disandarkan.",
        "backend-fail-notexists": "Fail $1 tidak wujud.",
        "booksources-text": "Yang berikut ialah senarai pautan ke tapak web lain yang menjual buku baru dan terpakai,\nserta mungkin mempunyai maklumat lanjut mengenai buku yang anda cari:",
        "booksources-invalid-isbn": "ISBN yang dinyatakan tidak sah. Sila semak sekali lagi.",
        "specialloguserlabel": "Pelaku:",
-       "speciallogtitlelabel": "Sasaran (tajuk atau pengguna):",
+       "speciallogtitlelabel": "Sasaran (tajuk atau {{ns:user}}:nama pengguna):",
        "log": "Log",
        "all-logs-page": "Semua log awam",
        "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).",
        "emailccsubject": "Salinan bagi mesej anda kepada $1: $2",
        "emailsent": "E-mel dikirim",
        "emailsenttext": "E-mel anda telah dikirim.",
-       "emailuserfooter": "E-mel ini telah dikirim oleh $1 kepada $2 oleh fungsi \"{{int:emailuser}}\" di {{SITENAME}}.",
+       "emailuserfooter": "E-mel ini telah {{GENDER:$1|dikirim}} oleh $1 kepada {{GENDER:$2|$2}} oleh fungsi \"{{int:emailuser}}\" di {{SITENAME}}.",
        "usermessage-summary": "Meninggalkan pesanan sistem.",
        "usermessage-editor": "Utusan sistem",
        "watchlist": "Senarai pantau",
        "wlheader-showupdated": "Laman-laman yang telah diubah sejak kunjungan terakhir anda dipaparkan dalam '''teks tebal'''.",
        "wlnote": "Yang berikut ialah <strong>$1</strong> perubahan terakhir sejak $2 jam yang lalu, sehingga $3, $4.",
        "wlshowlast": "Tunjukkan $2 hari $1 jam yang lalu",
+       "watchlistall2": "semua",
+       "watchlist-hide": "Sorok",
+       "wlshowtime": "Tempoh masa untuk dipaparkan:",
+       "wlshowhideminor": "suntingan kecil",
+       "wlshowhidebots": "bot",
+       "wlshowhideliu": "pengguna berdaftar",
+       "wlshowhideanons": "pengguna awanama",
+       "wlshowhidemine": "suntingan saya",
        "watchlist-options": "Pilihan senarai pantau",
        "watching": "Memantau...",
        "unwatching": "Menyahpantau...",
        "deletepage": "Hapus laman",
        "confirm": "Sahkan",
        "excontent": "kandungan: '$1'",
-       "excontentauthor": "Kandungan: '$1' (dan satu-satunya penyumbang ialah '[[Special:Contributions/$2|$2]]')",
+       "excontentauthor": "kandungan dahulu: \"$1\", dan penyumbang tunggalnya ialah \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|bincang]])",
        "exbeforeblank": "kandungan sebelum pengosongan ialah: '$1'",
        "delete-confirm": "Hapus \"$1\"",
        "delete-legend": "Hapuskan",
        "rollback-success": "Membalikkan suntingan oleh $1 kepada versi terakhir oleh $2.",
        "sessionfailure-title": "Kegagalan sesi",
        "sessionfailure": "Terdapat sedikit masalah pada sesi log masuk anda.\nTindakan ini telah dibatalkan untuk mencegah perampasan sesi.\nSila tekan butang \"back\" dan muatkan semula laman yang telah anda kunjungi sebelum ini, kemudian cuba lagi.",
+       "changecontentmodel-title-label": "Tajuk laman",
+       "changecontentmodel-model-label": "Model kandungan baharu",
+       "changecontentmodel-reason-label": "Alasan:",
+       "changecontentmodel-success-title": "Model kandungan ini telah diubah",
+       "changecontentmodel-success-text": "Jenis kandungan [[:$1]] telah diubah.",
+       "changecontentmodel-cannot-convert": "Kandungan di [[:$1]] tidak dapat ditukar kepada jenis $2.",
+       "changecontentmodel-nodirectediting": "Model kandungan $1 tidak menyokong suntingan langsung",
+       "log-name-contentmodel": "Log perubahan model kandungan",
+       "logentry-contentmodel-change-revertlink": "undur",
+       "logentry-contentmodel-change-revert": "undur",
        "protectlogpage": "Log perlindungan",
        "protectlogtext": "Berikut ialah senarai perubahan pada perlindungan laman.\nLihat [[Special:ProtectedPages|senarai laman terlindung]] untuk senarai laman-laman yang sedang dilindungi.",
        "protectedarticle": "melindungi \"[[$1]]\"",
        "contributions": "Sumbangan {{GENDER:$1|pengguna}}",
        "contributions-title": "Sumbangan oleh $1",
        "mycontris": "Sumbangan",
+       "anoncontribs": "Sumbangan",
        "contribsub2": "Untuk {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Akaun pengguna \"$1\" tidak berdaftar.",
        "nocontribs": "Tiada sebarang perubahan yang sepadan dengan kriteria-kriteria ini.",
        "uctop": "(terkini)",
        "month": "Sebelum bulan:",
-       "year": "Sebelum tahun:",
+       "year": "Sejak tahun (dan sebelumnya):",
        "sp-contributions-newbies": "Tunjukkan sumbangan daripada akaun baru sahaja",
        "sp-contributions-newbies-sub": "Bagi akaun-akaun baru",
        "sp-contributions-newbies-title": "Sumbangan oleh pengguna baru",
        "cant-move-to-user-page": "Anda tidak mempunyai keizinan untuk memindahkan sesebuah laman ke mana-mana laman pengguna (kecuali sebagai sublamannya sahaja).",
        "cant-move-category-page": "Anda tidak mempunyai kebenaran untuk memindah laman-laman kategori.",
        "cant-move-to-category-page": "Anda tidak mempunyai kebenaran untuk memindah sebuah laman ke sebuah laman kategori.",
-       "newtitle": "Ke tajuk baru:",
+       "newtitle": "Tajuk baru:",
        "move-watch": "Pantau laman ini",
        "movepagebtn": "Pindahkan laman",
        "pagemovedsub": "Pemindahan berjaya",
        "movenosubpage": "Laman ini tiada sublaman.",
        "movereason": "Sebab:",
        "revertmove": "balik",
-       "delete_and_move": "Hapus dan pindah",
        "delete_and_move_text": "==Penghapusan diperlukan==\n\nLaman destinasi \"[[:$1]]\" telah pun wujud. Adakah anda mahu menghapuskannya supaya laman ini dapat dipindahkan?",
        "delete_and_move_confirm": "Ya, hapuskan laman ini",
        "delete_and_move_reason": "Dihapuskan untuk membuka laluan untuk pemindahan dari \"[[$1]]\"",
        "tooltip-ca-nstab-main": "Lihat laman kandungan",
        "tooltip-ca-nstab-user": "Lihat laman pengguna",
        "tooltip-ca-nstab-media": "Lihat laman media",
-       "tooltip-ca-nstab-special": "Ini adalah sebuah laman khas, anda tidak boleh menyunting laman ini secara terus.",
+       "tooltip-ca-nstab-special": "Ini adalah laman khas yang tidak boleh disunting.",
        "tooltip-ca-nstab-project": "Lihat laman projek",
        "tooltip-ca-nstab-image": "Lihat laman imej",
        "tooltip-ca-nstab-mediawiki": "Lihat pesanan sistem",
        "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",
-       "simpleantispam-label": "Pemeriksaan anti-spam.\n'''JANGAN''' isi ruangan ini!",
+       "simpleantispam-label": "Pemeriksaan anti-spam.\n<strong>Jangan</strong> isi ruangan ini!",
        "pageinfo-title": "Maklumat untuk \"$1\"",
        "pageinfo-not-current": "Maaf, maklumat ini tidak dapat disediakan untuk semakan lama.",
        "pageinfo-header-basic": "Maklumat asas",
        "pageinfo-robot-index": "Dibenarkan",
        "pageinfo-robot-noindex": "Tidak dibenarkan",
        "pageinfo-watchers": "Bilangan pemantau halaman",
+       "pageinfo-visiting-watchers": "Bilangan penonton laman yang melawat suntingan terkini",
        "pageinfo-few-watchers": "Kurang daripada $1 orang pemantau",
        "pageinfo-redirects-name": "Jumlah lencongan ke laman ini",
        "pageinfo-subpages-name": "Subhalaman untuk halaman ini",
        "version-libraries": "Perpustakaan terpasang",
        "version-libraries-library": "Perpustakaan",
        "version-libraries-version": "Versi",
+       "version-libraries-license": "Lesen",
+       "version-libraries-description": "Keterangan",
+       "version-libraries-authors": "Pengarang",
        "redirect": "Lencongkan mengikut ID fail, pengguna, halaman atau semakan",
        "redirect-legend": "Lencongkan ke fail atau halaman",
        "redirect-summary": "Halaman khas ini melencong kepada fail (dengan nama fail), halaman (dengan ID semakan atau ID halaman) atau halaman pengguna (dengan ID pengguna berangka). Penggunaan: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], atau [[{{#Special:Redirect}}/user/101]].",
        "special-characters-title-endash": "sengkang en",
        "special-characters-title-emdash": "sengkang em",
        "special-characters-title-minus": "tanda tolak",
+       "mw-widgets-dateinput-no-date": "Tarik belum dipilih",
+       "mw-widgets-titleinput-description-new-page": "laman belum wujud",
+       "mw-widgets-titleinput-description-redirect": "melencong ke $1",
        "api-error-blacklisted": "Sila pilih tajuk yang berbeza dan deskriptif."
 }
index 271130f..8d21fde 100644 (file)
        "deletethispage": "Xicpolo inīn tlaīxtli",
        "undeletethispage": "Xicmāquīxti inīn tlaīxtli",
        "undelete_short": "Ahticpolōz {{PLURAL:$1|cē tlapatlaliztli|$1 tlapatlaliztli}}",
-       "viewdeleted_short": "Mà mỏta {{PLURAL:$1|se tlatlaìxpôpolòlli tlayèktlàlilistli|$1 tlatlaìxpôpolòltin tlayèktlàlilistin}}",
+       "viewdeleted_short": "Xiquitta {{PLURAL:$1|cē mopoloh tlapatlaliztli|$1 mopoloh tlapatlaliztli}}",
        "protect": "Xicpiya",
        "protect_change": "xicpatla",
        "protectthispage": "Xicpiya inīn tlaīxtli",
        "hr_tip": "Pāntli",
        "summary": "Mopatlaliz:",
        "subject": "Tōcāitl/Āmoxmachiyōtl:",
-       "minoredit": "Inīn tlapatlaliztli tepitōn",
+       "minoredit": "Ca tepitōn inīn tlapatlaliztli",
        "watchthis": "Xicpiya inīn tlaīxtli",
        "savearticle": "Xicpiya tlaīxtli",
        "preview": "Xiquitta achtochīhualiztli",
        "cantcreateaccounttitle": "Ahmo huelītih mochīhua cuentah",
        "cantcreateaccount-text": "[[User:$3|$3]] ōcquīxti cuentah tlachīhualiztli īpal inīn IP ('''$1''').\n\nĪxtlamatiliztli īpal $3 cah ''$2''",
        "viewpagelogs": "Tiquinttāz tlahcuilōlloh inīn zāzaniltechcopa",
-       "nohistory": "Ahmo cah tlapatlaliztechcopa tlahcuilōlloh inīn zāzaniltechcopa.",
+       "nohistory": "Nicān ahmō oncah tlaīxtlapatlaliztlahtōllōtl.",
        "currentrev": "Āxcān tlapatlaliztli",
        "currentrev-asof": "Āxcān tlachiyaliztli īpan $1",
        "revisionasof": "Tlachiyaliztli īpan $1",
        "histlast": "in tlatzaucticah",
        "historysize": "({{PLURAL:$1|1 byte|$1 byte}})",
        "historyempty": "(iztāc)",
-       "history-feed-title": "Tlachiyaliztli tlahcuilōlloh",
+       "history-feed-title": "Tlaceppahuiliztlahtōllōtl",
        "history-feed-description": "Tlachiyaliztli tlahcuilōlloh inīn zāzaniltechcopa huiquipan",
        "history-feed-item-nocomment": "$1 īpan $2",
        "history-feed-empty": "In zāzanilli tiquiēlēhuia ahmo ia.\nHueliz ōmopolo huiqui nozo ōmozacac.\n[[Special:Search|Xitēmoa huiquipan]] yancuīc huēyi zāzaniltin.",
        "mergehistory-comment": "Ōmocēntili [[:$1]] īpan [[:$2]]: $3",
        "mergehistory-reason": "Tleīpampa:",
        "revertmerge": "Tiquīxipehuaz",
-       "history-title": "«$1» tlahcuilōlloh ītlaihittaliz",
+       "history-title": "«$1» ītlaceppahuiliztlahtōllo",
        "lineno": "Pāntli $1:",
        "editundo": "Tichuelōz",
        "searchresults": "Tlatēmoliztli",
        "action-writeapi": "tictequitiltīz API tlahcuilōliztli",
        "action-delete": "ticpolōz inīn zāzanilli",
        "action-deleterevision": "ticpolōz inīn tlachiyaliztli",
-       "action-deletedhistory": "tiquittāz inīn zāzanilli ītlahcuilōlloh tlein ōmopolo",
+       "action-deletedhistory": "xiquitta inīn tlaīxtli ītlahtōllo in mopoloh.",
        "action-browsearchive": "tiquintēmōz zāzanilli tlein ōmopoloh",
        "action-undelete": "ahticpolōz inīn zāzanilli",
        "action-suppressionlog": "tiquittāz inīn ichtac tlahcuilōlloh",
        "recentchanges-legend": "Yancuīc tlapatlaliztechcopa tlanequiliztli",
        "recentchanges-summary": "Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.",
        "recentchanges-label-newpage": "Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl",
-       "recentchanges-label-minor": "Inīn tlapatlaliztli tepitōn",
+       "recentchanges-label-minor": "Ca tepitōn inīn tlapatlaliztli",
        "rclistfrom": "Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $3 $2",
        "rcshowhideminor": "$1 tlapatlalitzintli",
        "rcshowhideminor-show": "Ticnēxtīz",
        "statistics-files": "Tlahcuilōlli ōmoquetz",
        "doubleredirects": "Ōntetl tlacuepaliztli",
        "brokenredirects": "Tzomoc tlacuepaliztli",
-       "brokenredirects-edit": "ticpatlāz",
+       "brokenredirects-edit": "xicpatla",
        "brokenredirects-delete": "ticpolōz",
        "withoutinterwiki": "Zāzaniltin ahtle tzonhuiliztli",
        "withoutinterwiki-submit": "Tiquittāz",
        "unwatch": "Ahtictlachiyāz",
        "watchlist-details": "{{PLURAL:$1|$1 zāzanilli|$1 zāzaniltin}} motlachiyaliz, ahmo mopōhua tēixnāmiquiliztli.",
        "wlshowlast": "Tiquinttāz tlapatlaliztli īhuīcpa achto $1 yēmpohualminuhtli, $2 tōnaltin",
+       "watchlistall2": "mochīntīn",
        "watching": "Tlachiyacah...",
        "unwatching": "Ahtlachiyacah...",
        "enotif_impersonal_salutation": "tlatequitiltilīlli īpan {{SITENAME}}",
        "protect-expiring": "motlamīz $1 (UTC)",
        "protect-expiry-options": "1 hora:1 hour,1 tōnalli:1 day,1 chicuēyilhuitl:1 week,2 chicuēyilhuitl:2 weeks,1 mētztli:1 month,3 mētztli:3 months,6 mētztli:6 months,1 xihuitl:1 year,mochipa:infinite",
        "restriction-type": "Mācāhualiztli:",
-       "restriction-edit": "Ticpatlāz",
+       "restriction-edit": "xicpatla",
        "restriction-move": "Ticzacāz",
        "restriction-create": "Ticchīhuāz",
        "restriction-upload": "Tlahcuilōlquetza",
-       "undelete": "Tiquinttāz zāzaniltin ōmopolōzqueh",
+       "undelete": "Xiquitta mopoloh tlaīxtli",
        "viewdeletedpage": "Tiquinttāz zāzaniltin ōmopolōzqueh",
        "undelete-revision": "Tlapoloc $1 ītlachiyaliz (īpan $4, $5) īpal $3:",
        "undeletebtn": "Ahticpolōz",
-       "undeletelink": "tiquittaz/ticpahtīz",
+       "undeletelink": "xiquitta/xicmācuepa",
        "undeleteviewlink": "tiquittāz",
        "undeletecomment": "Tleīpampa:",
        "undelete-search-box": "Tiquintlatēmōz zāzaniltin ōmopolōz",
        "ipbsubmit": "Tiquitzacuilīz inīn tlatequitiltilīlli",
        "ipbother": "Occē cāuhpan:",
        "ipboptions": "2 cāhuitl:2 hours,1 tōnalli:1 day,3 tōnaltin:3 days,1 chicuēyilhuitl:1 week,2 chicuēyilhuitl:2 weeks,1 mētztli:1 month,3 mētztli:3 months,6 mētztli:6 months,1 xihuitl:1 year,mochipa:infinite",
-       "ipbwatchuser": "Tiquinchiyāz inīn tlatequitiltilīlli in ītlatequitiltilīlzāzanil auh in ītēixnāmiquiliz",
+       "ipbwatchuser": "Xiquīxpiya inīn tequihuihqui ītequihuihcātlaīx īzānīllaīx",
        "badipaddress": "Ahcualli IP",
        "blockipsuccesssub": "Cualli tlatzacuiliztli",
        "ipb-unblock-addr": "Ahtiquitzacuilīz $1",
        "movepagebtn": "Ticzacāz zāzanilli",
        "pagemovedsub": "Cualli ōmozacac",
        "movepage-moved": "'''\"$1\" ōmotlacuep īhuīc \"$2\".'''",
-       "movetalk": "Ticzacāz nō tēixnāmiquiliztli tlahcuilōltechcopa.",
+       "movetalk": "Xiczaca yehhuātl īzānīllaīx",
        "movepage-page-moved": "Zāzanilli $1 ōmozacac īhuīc $2.",
        "movepage-page-unmoved": "Ahmo huelīti $1 mozaca īhuīc $2.",
        "movelogpage": "Tlazacaliztli tlahcuilōlloh",
        "tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
        "tooltip-pt-logout": "Tiquīzāz",
        "tooltip-ca-talk": "Inīn tlahcuilōlli zānīllī ītechcopa",
-       "tooltip-ca-edit": "Ticpatlaz inīn tlaīxtli",
+       "tooltip-ca-edit": "Xicpatla inīn tlaīxtli",
        "tooltip-ca-addsection": "Tictzintīz yancuic xeliuhcāyōtl.",
        "tooltip-ca-viewsource": "Inīn zāzanilli ōmoquīxti. Tihuelīti tiquitta ītlahtōlcaquiliztilōni.",
        "tooltip-ca-history": "Achtopa āxcān zāzanilli īhuān in tlatequitiltilīlli ōquinchīuhqueh",
        "tooltip-t-upload": "Tiquinquetzāz tlahcuilōlli",
        "tooltip-t-specialpages": "Ìntlapòpòwaltekpànal mochtìn in nònkuâkìskàtlaìxtlapaltìn",
        "tooltip-t-print": "Tepoztlahcuilōlli",
-       "tooltip-ca-nstab-main": "Tiquittaz in tlahcuilōlli",
+       "tooltip-ca-nstab-main": "Xiquitta in tlamantlaīxtli",
        "tooltip-ca-nstab-user": "Xiquitta tlatequitiltilīlli īzāzanil",
        "tooltip-ca-nstab-special": "Inìn sè nònkuâkìskàtlaìxtlapalli, yêìka awel nemàtilòs moyêyèktlàlis in tlaìxtlapalli",
-       "tooltip-ca-nstab-project": "Xiquitta tlachīhualiztli īzāzanil",
+       "tooltip-ca-nstab-project": "Xiquitta in tlatequipanōllaīxtli",
        "tooltip-ca-nstab-image": "Xiquittāz īxipzāzanilli",
        "tooltip-ca-nstab-mediawiki": "Xiquitta in tlahcuilōltzin",
        "tooltip-ca-nstab-template": "Xiquitta in nemachiyōtīlli",
index 2373ab7..9b7557e 100644 (file)
        "createaccountreason": "Lí-iû:",
        "createacct-reason": "理由:",
        "createacct-reason-ph": "為啥物你欲開一另外一个口座?",
-       "createacct-captcha": "An-choân kiám-cha",
-       "createacct-imgcaptcha-ph": "Kā ē-kha lí khoàⁿ tio̍h--ê bûn-jī phah ji̍p lâi",
        "createacct-submit": "Khui lí--ê kháu-chō",
        "createacct-another-submit": "開另外一个口座",
        "createacct-benefit-heading": "{{SITENAME}} sī uī tio̍h chhin-chhiūⁿ lí--ê lâng chiah lâi kiàn-li̍p--ê.",
        "search-section": "(toān-lo̍h $1)",
        "searchall": "choân-pō·",
        "showingresults": "Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$1</b> hāng kiat-kó.",
+       "search-nonefound": "揣無",
        "powersearch-legend": "Kiám-sek",
        "preferences": "Siat-tēng",
        "mypreferences": "Góa ê siat-tēng",
        "rightslogtext": "Chit-ê log lia̍t-chhut kái-piàn iōng-chiá koân-lī ê tōng-chok.",
        "action-edit": "Siu-kái chit ia̍h",
        "nchanges": "$1 {{PLURAL:$1|kái|kái}}",
+       "enhancedrc-history": "歷史",
        "recentchanges": "Chòe-kīn ê kái-piàn",
+       "recentchanges-legend": "最近改的選定",
        "recentchanges-summary": "Tī chiah wiki ia̍h tui-cha chòe-kīn ê kái-piàn.",
        "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": "Che sī ki-khì-lâng kái--ê",
+       "recentchanges-label-unpatrolled": "這个編輯抑無巡視過",
+       "recentchanges-label-plusminus": "彼頁改了;精差的位元組",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁清單]])",
        "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 $3 $2 kàu taⁿ ê sin kái-piàn",
        "rcshowhideminor": "$1 sió siu-kái",
+       "rcshowhideminor-hide": "藏起來",
        "rcshowhidebots": "$1 機器儂",
+       "rcshowhidebots-show": "開",
        "rcshowhideliu": "$1 teng-ji̍p ê iōng-chiá",
+       "rcshowhideliu-hide": "藏起來",
        "rcshowhideanons": "$1 bû-bêng-sī",
+       "rcshowhideanons-hide": "藏起來",
        "rcshowhidemine": "$1 góa ê pian-chi̍p",
+       "rcshowhidemine-hide": "藏起來",
        "rclinks": "Hían-sī $2 ji̍t lāi siōng sin ê $1 hāng kái-piàn<br />$3",
        "diff": "Cheng-chha",
        "hist": "ls",
        "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-summary": "這是有相接到指定頁(抑是指定分類的所有成員),而且最近家己頁的內容有改過的清單。\n遐的頁[[Special:Watchlist|佇你的監視清單]]會用<strong>粗體</strong> 標示。",
        "recentchangeslinked-page": "Ia̍h ê miâ:",
        "upload": "Kā tóng-àn chiūⁿ-bāng",
        "linkstoimage": "ē-kha {{PLURAL:$1|ê ia̍h}} ū iōng tio̍h chit ê iáⁿ-siōng:",
        "nolinkstoimage": "Bô poàⁿ ia̍h liân kàu chit tiuⁿ iáⁿ-siōng.",
        "sharedupload-desc-here": "Chit--ê $1--ê tóng-àn ū khó-lêng hō͘ kî-thaⁿ--ê choan-àn ēng tio̍h.\nChia sī chit--ê tóng-àn i--ê [$2 soat-bêng].",
+       "upload-disallowed-here": "你袂使換掉个檔案",
        "mimesearch": "MIME chhiau-chhoē",
        "unwatchedpages": "Bô lâng kàm-sī ê ia̍h",
        "listredirects": "Lia̍t-chhut choán-ia̍h",
        "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.",
        "wlnote": "$3 $4: Ē-kha sī <strong>$2</strong> tiám-cheng í-lāi siōng sin ê <strong>$1</strong> ê kái-piàn.",
        "wlshowlast": "Hián-sī chêng $1 tiám-cheng $2 ji̍t",
+       "watchlistall2": "choân-pō͘",
        "deletepage": "Thâi ia̍h",
        "confirm": "Khak-tēng",
        "excontent": "lōe-iông sī: '$1'",
        "move-page-legend": "Sóa ia̍h",
        "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ê.\nKū piau-tê ē chiâⁿ-chò 1 ia̍h choán khì sin piau-tê ê choán-ia̍h.\nLiâ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.\nLí ū chek-jīm khak-tēng liân-kiat kè-sio̍k liân tio̍h ūi.\n\nSin 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.\nChe piaú-sī nā ū têng-tâⁿ, ē-sái kā sin ia̍h soà tńg-khì goân-lâi ê kū ia̍h.\n\n'''SÈ-JĪ!'''\nTùi chē lâng tha̍k ê ia̍h lâi kóng, soá-ūi sī toā tiâu tāi-chì.\nLiâu--lo̍h-khì chìn-chêng, chhiáⁿ seng khak-tēng lí ū liáu-kái chiah-ê hiō-kó.",
        "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:",
        "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.",
        "newtitle": "Khì sin piau-tê:",
        "move-watch": "Kàm-sī chit ia̍h",
        "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-special": "這是一个特殊頁,你袂使改這頁。",
+       "tooltip-ca-nstab-special": "這是一个特殊頁,袂使改得。",
        "tooltip-ca-nstab-image": "Khoàⁿ tóng-àn ia̍h",
        "tooltip-ca-nstab-category": "Khoàⁿ lūi-pia̍t ia̍h",
        "tooltip-minoredit": "記這是一个小改",
        "ilsubmit": "Kiám-sek",
        "bydate": "chiàu ji̍t-kî",
        "metadata": "元資料",
+       "metadata-help": "這个檔案有伊的資訊,可能是相機抑掃描機用的。\n若改過這个檔案,資訊就無完全對著。",
        "metadata-expand": "Hián-sī iù-chiat",
        "metadata-collapse": "Am iù-chiat",
        "metadata-fields": "佇顯示圖片的頁,若掀開元資料,下跤的EXIF資料會儂看著。其他的元資料是先看無。\n* 廠商\n* 機型\n* 翕像的時陣\n* 曝光\n* 光圈\n* ISO 速率\n* 焦距\n* 作者\n* 版權\n* 說明\n* 緯度(GPS)\n* 經度(GPS)\n* 海拔(GPS)",
index e52f060..b7bb97e 100644 (file)
@@ -11,7 +11,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Candalua",
-                       "Macofe"
+                       "Macofe",
+                       "V6rg"
                ]
        },
        "tog-underline": "Sottolinia 'e jonte:",
@@ -46,6 +47,7 @@
        "tog-watchlisthidebots": "Annasconne 'e cagnamiènte d' 'e bot ncopp'a l'elenco 'e cuntrollo",
        "tog-watchlisthideminor": "Annascunne 'e cagnamiente piccerille d' 'a lista 'e cuntrollo mia",
        "tog-watchlisthideliu": "Annascunne 'e cagnamiénte 'e l'utente riggistrate 'a l'elenco 'e cuntrollo",
+       "tog-watchlistreloadautomatically": "Recarreca l'elenco 'e paggene cuntrullate automaticamente quanno nu filtro se fosse cagnato (ce buò 'o JavaScript)",
        "tog-watchlisthideanons": "Annascunne 'e cagnamiente fatte d'anonime 'a l'elenco 'e cuntrollo",
        "tog-watchlisthidepatrolled": "Annascunne 'e modifiche cuntrullate 'a l'elenco 'e cuntrollo",
        "tog-watchlisthidecategorization": "Annascunne 'a categorizzazione d' 'e paggene",
        "morenotlisted": "Chisto elenco nun è cumpreto.",
        "mypage": "Paggena",
        "mytalk": "'E chiàcchieriate mmie",
-       "anontalk": "Chiacchierate pe chisto IP",
+       "anontalk": "Chiacchierate",
        "navigation": "Navigazzione",
        "and": "&#32;e",
        "qbfind": "Truòva",
        "printableversion": "Verzione pe' stampa",
        "permalink": "Jonta permanente",
        "print": "Stampà",
-       "view": "Vere",
+       "view": "Vire",
        "view-foreign": "Vide ncopp'a $1",
        "edit": "Càgna",
        "edit-local": "Càgna descrizione lucale",
        "editold": "càgna",
        "viewsourceold": "vere sorgente",
        "editlink": "càgna",
-       "viewsourcelink": "Vere sorgente",
+       "viewsourcelink": "Vire sorgente",
        "editsectionhint": "Modifica a sezzione $1",
        "toc": "Énnece",
        "showtoc": "faje vedé",
        "databaseerror-query": "Richiesta: $1",
        "databaseerror-function": "Funzione: $1",
        "databaseerror-error": "Sbaglio: $1",
+       "transaction-duration-limit-exceeded": "Pe' putè scanzà 'e crià n'auto tiempo e replica, sta transazziona fuje fernuta pecché pe' tramente ca se faceva chesto ($1) s'appassaje 'o lemmeto $2 secondo.\nSi state a cagnà nu cuofeno 'elemente a na vota, tentate e fà nu cuofeno 'operaziune cchiù piccerille mmece.",
        "laggedslavemode": "'''Attenzione:''' 'a paggena putesse nun fà vedé ll'aggiornamente cchiù recente.",
        "readonly": "Database bloccato",
        "enterlockreason": "Miette 'o mutivo 'e blocco, nzieme a 'o mumento quanno se penza ca 'o blocco se sarrà fernuto",
        "missingarticle-rev": "(nummero 'e verzione: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
        "readonly_lag": "'O database s'è bloccato automaticamente pe' tramente ca 'e servers 'e database schiave sincronizzano c' 'o server masto.",
+       "nonwrite-api-promise-error": "'O cap' 'e paggena HTTP 'Promise-Non-Write-API-Action' s'è mannato ma 'a richiesta era a nu modulo API 'e screttura.",
        "internalerror": "Errore 'nterno",
        "internalerror_info": "Errore 'nterno: $1",
        "internalerror-fatal-exception": "Errore irreversibbele 'e tipo \"$1\"",
        "userlogout": "Jèsce",
        "notloggedin": "Acciesso nun affettuato",
        "userlogin-noaccount": "Nun tenite ancora n'acciesso?",
-       "userlogin-joinproject": "Fà 'o riggistro ncopp'a {{SITENAME}}",
+       "userlogin-joinproject": "Facite 'o riggistro ncopp'a {{SITENAME}}",
        "nologin": "Nun tenite ancora n'acciesso? '''$1'''.",
        "nologinlink": "Crialo mmo",
        "createaccount": "Cria nu cunto nuovo",
        "createaccountreason": "Mutivo:",
        "createacct-reason": "Mutivo",
        "createacct-reason-ph": "Pecché staje crianno n'at'utenza",
-       "createacct-captcha": "Cuntrollo 'e sicurezza",
-       "createacct-imgcaptcha-ph": "Scrivite 'o testo ca vedite ncoppa",
        "createacct-submit": "Cria 'a toja utenza",
        "createacct-another-submit": "Cria nu cunto",
        "createacct-benefit-heading": "{{SITENAME}} è fatta 'e perzone comme te.",
        "wrongpasswordempty": "'A password nzertàta è abbacante.\nPe' piacere pruvate n'ata vota.",
        "passwordtooshort": "'E password hann'avé minimo {{PLURAL:$1|nu carattere|$1 carattere}}.",
        "passwordtoolong": "'E password nun ponno essere cchiù luonghe 'e {{PLURAL:$1|nu carattere|$1 carattere}}.",
+       "passwordtoopopular": "'E parole comune nun se ponno ausà pe' ve fà na password. Sciglite na password cchiù unica.",
        "password-name-match": "'A password adda essere diverza 'a 'o nomme utente.",
        "password-login-forbidden": "L'uso 'e stu nomme utente e password è stato proibito.",
        "mailmypassword": "Riabbìa 'a password",
        "passwordreset-emailtext-ip": "Coccherun (può darse ca sì tu, cu n'indirizzo IP $1) ha addimannato na mmasciata c' 'a password nova pe' putè trasì a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|L'utente associate}} a st'indirizze e-mail songo:\n\n$2\n\n{{PLURAL:$3|Sta password temporanea ammaturarrà|Sti password temporanee ammaturarranno}} aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\nHè 'a trasì e scegliere na password nova mò. \n\nSi nun sì stato tu a fà sta richiesta, o te sì scurdat' 'a password origginale e nun 'a buò cagnà cchiù, lassa perde sta mmasciata e usa 'a password viecchia.",
        "passwordreset-emailtext-user": "L'utente $1 di {{SITENAME}} ha addimannato na mmasciata c' 'a password nova pe' putè trasì a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|L'utente associate}} a st'indirizze e-mail songo:\n\n$2\n\n{{PLURAL:$3|Sta password temporanea ammaturarrà|Sti password temporanee ammaturarranno}} aropp'a {{PLURAL:$5|nu juorno|$5 ghiuorne}}.\nHè 'a trasì e scegliere na password nova mò. \n\nSi nun sì stato tu a fà sta richiesta, o te sì scurdat' 'a password origginale e nun 'a buò cagnà cchiù, lassa perde sta mmasciata e usa 'a password viecchia.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPassword temporanea: \n$2",
-       "passwordreset-emailsent": "Si chesto fosse nu cunto riggistrato e-mail, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
+       "passwordreset-emailsentemail": "Si chesto fosse nu cunto e-mail riggistrato, allora buò dicere ca se mannarrà na mmasciata e-mail pe' riabbià 'a password.",
+       "passwordreset-emailsentusername": "Si esistesse nu cunto e-mail riggistrato ca currispunnesse a chesto, allora se mannarrà na mmasciata pe' riabbià 'a password.",
        "passwordreset-emailsent-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, chista mmasciata 'a putite vedé ccà abbascio.",
        "passwordreset-emailerror-capture": "Na mmasciata e-mail pe' riabbià 'a password è stata mannata, 'a putite vedé ccà abbascio, ma aita sapé ca nun s'è mannata a {{GENDER:$2|l'utente}} pecché c'è stato cocch'errore: $1",
        "changeemail": "Cagna o lèva l'indirizzo e-mail",
        "media_tip": "Cullegamente a file multimediale",
        "sig_tip": "Firma cu data e ora",
        "hr_tip": "Linea orizzontale (ausà cu gedizzio)",
-       "summary": "Innece",
+       "summary": "Riepilego:",
        "subject": "Suggietto:",
        "minoredit": "Chisto è nu cagnamiénto piccerillo",
        "watchthis": "Tiene d'uocchio chesta paggena",
        "savearticle": "Sarva 'a paggena",
        "preview": "Anteprimma",
-       "showpreview": "Vere anteprimma",
+       "showpreview": "Vire anteprimma",
        "showdiff": "Fa veré 'e cagnamiente",
        "blankarticle": "<strong>Attenziò:</strong> 'a paggena ca staje crianno è abbacante.\nFà click ncopp'a \"{{int:savearticle}}\" n'ata vota, 'a paggena sarrà criata senza cuntenute.",
        "anoneditwarning": "'''Attenzione:''' Nun avite fatto l'acciesso. 'A cronologgia d' 'a vosta sarrà visibbele pubbrecamente si facite cocche cagnamiento. Si <strong>[$1 tràse]</strong> o <strong>[$2 crìe nu cunto]</strong>, 'e cagnamiente vuoste ve sarranno attribbuite a vvuje, nzieme a n'ati migliuramente.",
        "showingresultsinrange": "{{PLURAL:$1|Vene mmustato|Veneno mmustate}} abbascio {{PLURAL:$1|<strong>1</strong> risultato|<strong>$1</strong> risultate}} d' 'o <strong>$2</strong> a 'o <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Risultato <strong>$1</strong> 'e <strong>$3</strong>|Risultate <strong>$1 - $2</strong> 'e <strong>$3</strong>}}",
        "search-nonefound": "'A ricerca nun ha produtto risultate.",
+       "search-nonefound-thiswiki": "Nun ce stevano risultate p' 'a ricerca fatta.",
        "powersearch-legend": "Ricerca avanzata",
        "powersearch-ns": "Ascìa dint' 'o namespace:",
        "powersearch-togglelabel": "Cuntrolla:",
        "prefs-help-prefershttps": "Sta preferenza averrà affetto 'a 'o prossimo acciesso vuosto.",
        "prefswarning-warning": "Avite fatto cagnamiente a 'e preferenze d' 'e vuoste ca nun so' stat'ancora sarvate.\nSi ascite 'a sta paggena senza clickà \"$1\" 'e preferenze d' 'e vuoste nun sarranno agghiurnate.",
        "prefs-tabs-navigation-hint": "Suggerimento: se ponno ausà 'e buttòne 'e freccia a manca e a dritta pe' ve muovere nfra 'e schede dint'a l'elenco d' 'e schede.",
-       "email-address-validity-valid": "L'indirizzo e-mail pare valido",
-       "email-address-validity-invalid": "Nzerta n'indirizzo e-mail valido",
        "userrights": "Gestione d' 'e permesse 'e l'utente",
        "userrights-lookup-user": "Gestione 'e gruppe d'utenza",
        "userrights-user-editname": "Nzertàte nu nomme utente:",
        "recentchanges-label-plusminus": "'A grannezza d' 'a paggena s'è cagnata pe' bbia 'e stu nummero 'e bytes",
        "recentchanges-legend-heading": "'''Liggenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide [[Special:NewPages|'e paggene nove]])",
+       "recentchanges-submit": "Faje vedé",
        "rcnotefrom": "Ccà abbascio {{PLURAL:$5|è alencato 'o cagnamiento appurtato|song' alincate 'e cagnamiente appurtate}} 'a <strong>$3, $4</strong> (mmustate nfin'a <strong>$1</strong>).",
        "rclistfrom": "Faje vedé 'e cagnamiénte fatte a partì 'a $3 $2",
        "rcshowhideminor": "$1 'e cagnamiénte piccerille",
        "mostrevisions": "Paggene cu cchiù cagnamiente",
        "prefixindex": "Tutte 'e paggene cu prefisso",
        "prefixindex-namespace": "Tutte 'e paggene cu prefisso d' 'o namespace $1",
+       "prefixindex-submit": "Faje vedé",
        "prefixindex-strip": "Annascunne 'o prefisso int' 'a lista",
        "shortpages": "Paggene curte",
        "longpages": "Paggene cchiú longhe",
        "protectedpages-performer": "Prutetta 'a ll'utente",
        "protectedpages-params": "Parametre 'e prutezione",
        "protectedpages-reason": "Mutivo",
+       "protectedpages-submit": "Mmusta paggene",
        "protectedpages-unknown-timestamp": "Scanusciuto",
        "protectedpages-unknown-performer": "Utente scanusciuto",
        "protectedtitles": "Paggene prutette",
        "protectedtitles-summary": "Sta paggena elenca 'e titule ca song'attualmente prutette 'a criazione. Pe' n'avé n'elenco 'e paggene prutette ch'esisteno, vedite [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Nisciunu titolo è prutetto pe mò cu sti parametre.",
+       "protectedtitles-submit": "Mmusta titule",
        "listusers": "Lista 'e l'utente",
        "listusers-editsonly": "Fà vedé sulamente l'utente cu cagnamiente fatte",
        "listusers-creationsort": "Arrecetta pe' data 'e criazione",
        "activeusers-hidebots": "Annascunne 'e bot",
        "activeusers-hidesysops": "Annascunne l'ammenistrature",
        "activeusers-noresult": "Nisciun'utente truvato.",
+       "activeusers-submit": "Mmusta cunte attive",
        "listgrouprights": "Deritte d' 'e gruppe utente",
        "listgrouprights-summary": "'A lista ccà abbascio è na lista d' 'e gruppe utente criate int'a sta wiki, ch' 'e diritte associate.\nPonno esistere [[{{MediaWiki:Listgrouprights-helppage}}|nfurmaziune cchiù ndettaglie]] ncopp' 'e deritte ndividuale.",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Deritto dato</span>\n* <span class=\"listgrouprights-revoked\">Deritto luvato</span>",
        "listgrouprights-addgroup-self-all": "Miette tutt' 'e gruppe ncopp' 'o cunto d' 'o mio",
        "listgrouprights-removegroup-self-all": "Lèva tutt' 'e gruppe 'a 'o cunto utente d' 'o mio",
        "listgrouprights-namespaceprotection-header": "Restriziune d' 'o namespace",
-       "listgrouprights-namespaceprotection-namespace": "Namespace",
+       "listgrouprights-namespaceprotection-namespace": "Namespace:",
        "listgrouprights-namespaceprotection-restrictedto": "Diritto 'e cagnamiento 'e l'utente",
        "trackingcategories": "Categurìe 'e cuntrollo",
        "trackingcategories-summary": "Sta paggena elenca 'e categurìe ca stann'automaticamente popolate 'a 'o software Mediawiki. 'E nomme 'e lloro se ponno cagnà quanno se cagnano 'e relative mmasciate 'e sistema dint' 'o namespace {{ns:8}}.",
        "wlheader-showupdated": "* 'E paggene cca so' state cagnate a l'urdema visita avevano so' nzignate ccà 'n '''grassetto'''.",
        "wlnote": "Ccà abbascio {{PLURAL:$1|è elencato 'o cagnamiento cchiù ricente|songo elencate 'e <strong>$1</strong> cagnamiente cchiù recente}} {{PLURAL:$2|int'a ll'urdema ora|int' 'e ll'urdeme <strong>$2</strong> ore}}; 'e date songo agghiurnate 'o $3, $4.",
        "wlshowlast": "Mmusta ll'urdeme $1 ore $2 ghiuorne",
+       "watchlistall2": "tuttuquante",
+       "watchlist-hide": "Annascunne",
+       "watchlist-submit": "Faje vedé",
+       "wlshowtime": "Periodo 'e tiempo a mmustà:",
+       "wlshowhideminor": "cagnamiente piccerille",
+       "wlshowhidebots": "bot",
+       "wlshowhideliu": "utente riggistrate",
+       "wlshowhideanons": "utente anonime",
+       "wlshowhidepatr": "cagnamiente cuntrullate",
+       "wlshowhidemine": "cagnamiente d' 'e mieie",
        "watchlist-options": "Opziune 'a l'elenco 'e paggene cuntrullate",
        "watching": "Cuntrullanno...",
        "unwatching": "Lassanno 'e cuntrullà...",
        "undelete-nodiff": "Nun s'è truvata nisciuna verzione 'e primma.",
        "undeletebtn": "Arrepiglia",
        "undeletelink": "vide/arrepiglia",
-       "undeleteviewlink": "vere",
+       "undeleteviewlink": "vire",
        "undeleteinvert": "Abbarruca 'a sceveta",
        "undeletecomment": "Mutivo:",
        "undeletedrevisions": "{{PLURAL:$1|1 verzione|$1 verziune}} arrepigliate",
        "contributions": "Contribbute {{GENDER:$1|utente}}",
        "contributions-title": "Cuntribbute 'a l'utente pe' $1",
        "mycontris": "'E ffatiche d''e mmeje",
+       "anoncontribs": "Cuntribbute",
        "contribsub2": "Ppe {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "'O cunto utente \"$1\" nun è riggistrato.",
        "nocontribs": "Nisciunu cagnamiento è stato truvato cu sti criterie.",
        "whatlinkshere-hidelinks": "$1 jonte",
        "whatlinkshere-hideimages": "$1 links d' 'o file",
        "whatlinkshere-filters": "Filtre",
+       "whatlinkshere-submit": "Vaje",
        "autoblockid": "Autoblocco #$1",
        "block": "Blocca l'utente",
        "unblock": "Sblocca l'utente",
        "movenosubpage": "Sta paggena nun tene sottopaggene.",
        "movereason": "Raggióne",
        "revertmove": "arrepiglia",
-       "delete_and_move": "Scancèlla e mòve",
        "delete_and_move_text": "== Scancellamiento richiesto ==\n'A paggena 'e destinazione \"[[:$1]]\" esiste già.\n'A vulite scancellà pe' ne putè ffà 'o spazio abbacante necessario?",
        "delete_and_move_confirm": "Sì, suprascrivi 'a paggena asistente",
        "delete_and_move_reason": "Scancellata pe ne fà spazio abbacante e putè spustà 'a \"[[$1]]\"",
        "tooltip-pt-preferences": "Preferenze d''e mmeje",
        "tooltip-pt-watchlist": "'A lista d' 'e paggene ca state a cuntrullà",
        "tooltip-pt-mycontris": "Elenco dde tuje contributte",
+       "tooltip-pt-anoncontribs": "N'elenco 'e cagnamiente fatte 'a st'indirizzo IP",
        "tooltip-pt-login": "A reggistrazione è cunsigliata",
        "tooltip-pt-logout": "Jésce (logout)",
        "tooltip-pt-createaccount": "Pigliateve curaggio e criate n'utente e trasìte; ancora ca chisto nun s'avesse 'a ffà pe' fforza",
        "htmlform-cloner-required": "Servesse al minimo nu valore.",
        "htmlform-title-badnamespace": "[[:$1]] nun è dint'a lu namespace \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" nun è nu titolo criabbele 'e paggena",
-       "htmlform-title-not-exists": "[[:$1]] nun esiste.",
+       "htmlform-title-not-exists": "$1 nun esiste.",
        "htmlform-user-not-exists": "<strong>$1</strong> nun esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> nun è nu nomme buono.",
        "sqlite-has-fts": "$1 cu supporto 'e ricerche full-text",
        "logentry-suppress-block": "$1 {{GENDER:$2|ave bluccato}} {{GENDER:$4|$3}} cu na scadenza 'e $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cagnaje}} 'e mpustaziune 'e blocco 'e {{GENDER:$4|$3}} ch' 'ammaturasse a nu $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|ave mpurtato}} $3 pe' bbìa d' 'a carreca",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|mpurtaje}} $3 pe' carreca 'e file ($4 {{PLURAL:$4|verziona|verziune}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|ave mpurtato}} $3 pe' bbìa 'e n'atu wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|mpurtaje}} $3 'a $5 ($4 {{PLURAL:$4|verziona|verziune}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|aunito|aunita}} $3 int' 'a $4 (verziune nzin' 'a $5)",
        "logentry-move-move": "$1 {{GENDER:$2|muvette}} paggena $3 a $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|muvette}} paggena $3 a $4 senza lassà nu redirezionamiento",
index bcf8572..401db85 100644 (file)
@@ -53,6 +53,7 @@
        "tog-hideminor": "Skjul mindre redigeringer i siste endringer",
        "tog-hidepatrolled": "Skjul patruljerte redigeringer i siste endringer",
        "tog-newpageshidepatrolled": "Skjul patruljerte sider fra listen over nye sider",
+       "tog-hidecategorization": "Skjul kategorisering av sider",
        "tog-extendwatchlist": "Utvid overvåkningslisten til å vise alle endringer, ikke bare de siste",
        "tog-usenewrc": "Grupper endringer etter side i siste endringer og overvåkingslisten",
        "tog-numberheadings": "Autonummerer overskrifter",
@@ -82,8 +83,9 @@
        "tog-watchlisthideliu": "Skjul endringer av innloggede brukere fra overvåkningslisten",
        "tog-watchlisthideanons": "Skjul endringer av anonyme brukere fra overvåkningslisten",
        "tog-watchlisthidepatrolled": "Skjul patruljerte endringer fra overvåkningslisten",
+       "tog-watchlisthidecategorization": "Skjul kategorisering av sider",
        "tog-ccmeonemails": "Send meg kopier av e-poster jeg sender til andre brukere",
-       "tog-diffonly": "Ikke vis sideinnhold under differ",
+       "tog-diffonly": "Ikke vis sideinnhold under versjonsforskjell",
        "tog-showhiddencats": "Vis skjulte kategorier",
        "tog-norollbackdiff": "Ikke vis diff etter tilbakestilling",
        "tog-useeditwarning": "Si ifra dersom jeg forlater en side uten å lagre den.",
        "missingarticle-rev": "(revisjon#: $1)",
        "missingarticle-diff": "(diff: $1, $2)",
        "readonly_lag": "Databasen er automatisk skrivebeskyttet så slavetjenerne kan ta igjen mestertjeneren",
+       "nonwrite-api-promise-error": "HTTP-headeren 'Promise-Non-Write-API-Action' ble sendt, men forespørselen var til en API skrivemodul.",
        "internalerror": "Intern feil",
        "internalerror_info": "Intern feil: $1",
        "internalerror-fatal-exception": "Uhåndterlig unntak av typen «$1»",
        "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Hvorfor lager du en annen bruker",
-       "createacct-captcha": "Sikkerhetssjekk",
-       "createacct-imgcaptcha-ph": "Fyll inn teksten du ser ovenfor",
        "createacct-submit": "Opprett konto",
        "createacct-another-submit": "Opprett konto",
        "createacct-benefit-heading": "{{SITENAME}} er laget av folk som deg.",
        "passwordreset-emailtext-ip": "Noen (sannsynligvis deg fra IP-adressen $1) ba om en tilbakestilling av ditt passord for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er\ntilknyttet denne e-postadressen:\n\n$2\n\n{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{PLURAL:$5|én dag|$5 dager}}.\nDu bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne\nforespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger\nønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle\npassord.",
        "passwordreset-emailtext-user": "Brukeren $1 på {{SITENAME}} ba om en tilbakestilling av passordet ditt for {{SITENAME}}\n($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er tilknyttet denne e-postadressen:\n\n$2\n\n{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{én dag|$5 dager}}.\nDu bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne\nforespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger\nønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle\npassord.",
        "passwordreset-emailelement": "Brukernavn: \n$1\n\nMidlertidig passord: \n$2",
-       "passwordreset-emailsent": "Hvis dette er en registrert epostadresse vil en passordtilbakestillingsepost bli sendt.",
+       "passwordreset-emailsentemail": "Hvis dette er en registrert epostadresse vil en passordtilbakestillingsepost bli sendt.",
        "passwordreset-emailsent-capture": "Passordtilbakestillingseposten vist under har blitt sendt ut.",
        "passwordreset-emailerror-capture": "En passordtilbakestillingsepost ble laget, men det lyktes ikke å sende denne til {{GENDER:$2|brukeren}}: $1",
        "changeemail": "Endre eller fjerne epostadresse",
-       "changeemail-header": "Endre kontoens e-postadresse",
+       "changeemail-header": "Fyll ut dette skjemaet for å bytte din epost-adresse. Hvis du vil fjerne epostadressen fra din konto, kan du la ny epostadresse-feltet være tomt når.",
        "changeemail-passwordrequired": "Du må skrive inn passordet ditt for å bekrefte denne endringen.",
        "changeemail-no-info": "Du må være innlogget for å få direkte tilgang til denne siden.",
        "changeemail-oldemail": "Nåværende e-postadresse:",
        "sig_tip": "Din signatur med dato",
        "hr_tip": "Horisontal linje (bruk sparsomt)",
        "summary": "Redigeringsforklaring:",
-       "subject": "Emne/overskrift:",
+       "subject": "Emne:",
        "minoredit": "Dette er en mindre endring",
        "watchthis": "Overvåk denne siden",
        "savearticle": "Lagre siden",
        "missingcommenttext": "Vennligst legg inn en kommentar under.",
        "missingcommentheader": "<strong>Påminnelse:</strong> Du har ikke angitt et emne/overskrift for denne kommentaren.\nOm du trykker «{{int:savearticle}}» igjen vil redigeringen din bli lagret uten forklaring.",
        "summary-preview": "Forhåndsvisning av redigeringsforklaring:",
-       "subject-preview": "Forhåndsvisning av emne/overskrift:",
+       "subject-preview": "Forhåndsvisning av overskrift:",
        "previewerrortext": "En feil oppsto mens dine endringer skulle forhåndsvises.",
        "blockedtitle": "Brukeren er blokkert",
        "blockedtext": "'''Ditt brukernavn eller din IP-adresse har blitt blokkert.'''\n\nBlokkeringen ble utført av $1. Grunnen som ble oppgitt var ''$2''.\n\n* Blokkeringen begynte: $8\n* Blokkeringen utgår: $6\n* Blokkering ment på: $7\n\nDu kan kontakte $1 eller en annen [[{{MediaWiki:Grouppage-sysop}}|administrator]] for å diskutere blokkeringen.\nDu kan ikke bruke «E-post til denne brukeren»-funksjonen med mindre du har oppgitt en gyldig e-postadresse i [[Special:Preferences|innstillingene dine]] og du ikke er blokkert fra å sende e-post.\nDin nåværende IP-adresse er $3, og blokkerings-ID-en er #$5.\nVennligst ta all denne informasjonen ved henvendelser.",
        "permissionserrors": "Rettighetsfeil",
        "permissionserrorstext": "Du har ikke tillatelse til å utføre dette, av følgende {{PLURAL:$1|grunn|grunner}}:",
        "permissionserrorstext-withaction": "Du har ikke tillatelse til å $2 {{PLURAL:$1|fordi|av følgende grunner}}:",
+       "contentmodelediterror": "Du kan ikke redigere denne revisjonen fordi innholdsmodellen er <code>$1</code>, og den nåværende innholdsmodellen til siden er <code>$2</code>.",
        "recreate-moveddeleted-warn": "Advarsel: Du er i ferd med å opprette en side som tidligere har blitt slettet.'''\n\nDu bør vurdere om det er passende å fortsette å redigere denne siden.\nSlette- og flytteloggen for denne siden gjengis her:",
        "moveddeleted-notice": "Denne siden har blitt slettet.\nSlette- og flytteloggen vises nedenfor.",
        "moveddeleted-notice-recent": "Beklager, denne siden er nylig blitt slettet (i løpet av de siste 24 timer)\nSlette- og flytteloggen for siden er angitt nedenfor for referanse.",
        "revdelete-no-change": "'''Advarsel:''' objektet datert $2 $1 hadde allerede synlighetsinnstillingene du forespurte.",
        "revdelete-concurrent-change": "Feil under endring av objektet datert $2, $1: dets status ser ut til å ha blitt endret av noen andre mens du prøvde å endre det.\nVennligst sjekk loggen.",
        "revdelete-only-restricted": "Feil ved gjemming av objekt datert $2, $1: du kan ikke skjule objekt fra å vises for administratorer uten også å velge en av de andre visningsalternativene.",
-       "revdelete-reason-dropdown": "*Vanlige slettingsgrunner\n** Opphavsrettsbrudd\n** Upassende personopplysninger\n** Mulig falskt sladder",
+       "revdelete-reason-dropdown": "*Vanlige slettingsgrunner\n** Opphavsrettsbrudd\n** Mulig falskt sladder\n** Upassende personopplysninger\n** Upassende brukernavn\n** Sjikane",
        "revdelete-otherreason": "Annen/ytterligere årsak:",
        "revdelete-reasonotherlist": "Annen årsak",
        "revdelete-edit-reasonlist": "Rediger begrunnelser for sletting",
        "showingresultsinrange": "Nedenfor vises opptil {{PLURAL:$1|<strong>1</strong> resultat|<strong>$1</strong> resultater}} fra og med nummer <strong>$2</strong> til og med nummer <strong>$3</strong>.",
        "search-showingresults": "Resultat <strong>{{PLURAL:$4|$1|$1–$2}}</strong> av <strong>$3</strong>",
        "search-nonefound": "Ingen resultater passet til søket.",
+       "search-nonefound-thiswiki": "Ingen resultater passet til spørringen på denne siden.",
        "powersearch-legend": "Avansert søk",
        "powersearch-ns": "Søk i navnerom:",
        "powersearch-togglelabel": "Merk:",
        "prefs-help-recentchangescount": "Dette inkluderer nylige endringer, sidehistorikk og logger.",
        "prefs-help-watchlist-token2": "Dette er den hemmelige nøkkelen til webmatingen for din overvåkningsliste.\nEnhver som kjenner nøkkelen vil kunne lese din overvåkningsliste, så ikke vis den til andre.\n[[Special:ResetTokens|Klikk her om du trenger å nullstille nøkkelen]].",
        "savedprefs": "Innstillingene ble lagret.",
+       "savedrights": "Brukerrettighetene til {{GENDER:$1|$1}} har blitt lagret.",
        "timezonelegend": "Tidssone:",
        "localtime": "Lokaltid:",
        "timezoneuseserverdefault": "Bruk wikistandard ($1)",
        "prefs-help-prefershttps": "Denne preferansen vil virke etter neste innlogging.",
        "prefswarning-warning": "Du har gjort endringer i dine innstillinger som ikke er lagret ennå.\nDersom du forlater denne siden utenk å klikke på \"$1\" blir ikke innstillingene dine oppdatert.",
        "prefs-tabs-navigation-hint": "Tips: Du kan bruke venstre- og høyrepiltastene for å navigere mellom fanene i fanelisten",
-       "email-address-validity-valid": "E-postadressen ser gyldig ut",
-       "email-address-validity-invalid": "Fyll inn en gyldig e-postadresse",
        "userrights": "Brukerrettighetskontroll",
        "userrights-lookup-user": "Ordne brukergrupper",
        "userrights-user-editname": "Fyll inn et brukernavn:",
        "rcshowhidemine": "$1 mine endringer",
        "rcshowhidemine-show": "Vis",
        "rcshowhidemine-hide": "Skjul",
+       "rcshowhidecategorization": "$1 kategorisering av sider",
+       "rcshowhidecategorization-show": "Vis",
+       "rcshowhidecategorization-hide": "Skjul",
        "rclinks": "Vis siste $1 endringer i de siste $2 dagene<br />$3",
        "diff": "diff",
        "hist": "hist",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} lagt til kategori",
        "recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] og {{PLURAL:$2|én side|$2 sider}} fjernet fra kategori",
+       "autochange-username": "Automatisk MediaWiki-endring",
        "upload": "Last opp fil",
        "uploadbtn": "Last opp fil",
        "reuploaddesc": "Avbryt opplasting og gå tilbake til opplastingsskjemaet",
        "backend-fail-opentemp": "Kunne ikke åpne den midlertidige filen.",
        "backend-fail-writetemp": "Kunne ikke skrive til den midlertidige filen.",
        "backend-fail-closetemp": "Kunne ikke lukke den midlertidige filen.",
-       "backend-fail-read": "Kunne ikke lese filen $1.",
+       "backend-fail-read": "Klarte ikke lese filen $1.",
        "backend-fail-create": "Kunne ikke opprette filen $1.",
        "backend-fail-maxsize": "Kunne ikke skrive filen $1 fordi den er større enn {{PLURAL:$2|én byte|$2 bytes}}.",
        "backend-fail-readonly": "Underliggende \"$1\" er satt skrivebeskyttet fordi: \"$2\"",
        "lockmanager-fail-releaselock": "Kunne ikke frigi låsen for «$1».",
        "lockmanager-fail-db-bucket": "Kunne ikke kontakte nok låsedatabaser i bøtten $1.",
        "lockmanager-fail-db-release": "Kunne ikke frigi låser på databasen $1.",
-       "lockmanager-fail-svr-acquire": "Kunne ikke hente lås på server $1.",
+       "lockmanager-fail-svr-acquire": "Klarte ikke å hente lås på server $1.",
        "lockmanager-fail-svr-release": "Kunne ikke frigi låser på tjeneren $1.",
        "zip-file-open-error": "Det oppsto en feil under åpning av filen for ZIP-sjekking.",
        "zip-wrong-format": "Den angitte filen var ikke en ZIP-fil.",
        "http-timed-out": "Tidsavbrudd på HTTP-forespørsel.",
        "http-curl-error": "Feil under henting av adresse: $1",
        "http-bad-status": "Det var et problem under HTTP-forespørselen: $1 $2",
-       "upload-curl-error6": "Kunne ikke nå adressen",
+       "upload-curl-error6": "Klarte ikke nå adressen",
        "upload-curl-error6-text": "Adressen kunne ikke nås. Vennligst dobbelsjekk at adressen er korrekt og at siden er oppe.",
        "upload-curl-error28": "Opplastingstimeout",
        "upload-curl-error28-text": "Siden brukte for lang tid på å reagere. Vennligst sjekk at siden er oppe, og vent en kort stund for du prøver igjen. Vurder å prøve på en mindre hektisk tid.",
        "activeusers-hidebots": "Skjul roboter",
        "activeusers-hidesysops": "Skjul administratorer",
        "activeusers-noresult": "Ingen brukere funnet.",
+       "activeusers-submit": "Vis",
        "listgrouprights": "Rettigheter for brukergrupper",
        "listgrouprights-summary": "Følgende er en liste over brukergrupper som er definert på denne wikien, og hvilke rettigheter de har.\nMer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrouprights-helppage}}|her]].",
        "listgrouprights-key": "Tegnforklaring:\n* <span class=\"listgrouprights-granted\">Innvilget rettighet</span>\n* <span class=\"listgrouprights-revoked\">Tilbaketrukket rettighet</span>",
        "wlheader-showupdated": "Sider som har blitt endret siden du besøkte dem sist vises med '''fet skrift'''.",
        "wlnote": "Nedenfor er {{PLURAL:$1|den siste endringen|de siste <strong>$1</strong> endringene}} {{PLURAL:$2|den siste timen|de siste <strong>$2</strong> timene}}, per $3 kl. $4",
        "wlshowlast": "Vis siste $1 timer $2 dager",
+       "watchlistall2": "alle",
+       "watchlist-hide": "Skjul",
+       "wlshowtime": "Vis siste:",
+       "wlshowhideminor": "mindre redigeringer",
+       "wlshowhidebots": "boter",
+       "wlshowhideliu": "registrerte brukere",
+       "wlshowhideanons": "anonyme brukere",
+       "wlshowhidepatr": "patruljerte redigeringer",
+       "wlshowhidemine": "mine redigeringer",
        "watchlist-options": "Alternativ for overvåkningslisten",
        "watching": "Overvåker…",
        "unwatching": "Fjerner fra overvåkningsliste…",
        "cantrollback": "Kan ikke fjerne redigering; den siste brukeren er den eneste forfatteren.",
        "alreadyrolled": "Kan ikke fjerne den siste redigeringen på [[$1]] av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); en annen har allerede redigert siden eller fjernet redigeringen.\n\nDen siste redigeringen ble foretatt av [[User:$3|$3]] ([[User talk:$3|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Redigeringskommentaren var: «''$1''»",
-       "revertpage": "Tilbakestilte endring av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]]) til siste versjon av [[User:$1|$1]]",
+       "revertpage": "Tilbakestilte endring av [[Brukerdiskusjon:$2|$2]] ([[Spesial:Contributions/$2|bidrag]]) til siste versjon av $1",
        "revertpage-nouser": "Tilbakestilt endringer av skjult bruker til siste versjon av\n{{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Tilbakestilte endringer av $1; endret til siste versjon av $2.",
        "sessionfailure-title": "Sesjonsfeil",
        "sessionfailure": "Det ser ut til å være et problem med innloggingen din, og den ble avbrutt av sikkerhetshensyn. Trykk ''Tilbake'' i nettleseren din, oppdater siden og prøv igjen.",
+       "changecontentmodel": "Endre innholdsmodell for en side",
+       "changecontentmodel-legend": "Endre innholdsmodell",
        "changecontentmodel-title-label": "Sidetittel",
        "changecontentmodel-model-label": "Ny innholdsmodell",
        "changecontentmodel-reason-label": "Begrunnelse:",
        "contributions": "{{GENDER:$1|Brukerbidrag}}",
        "contributions-title": "Brukerbidrag av $1",
        "mycontris": "Bidrag",
+       "anoncontribs": "Bidrag",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Brukerkontoen «$1» er ikke registrert.",
        "nocontribs": "Ingen endringer er funnet som passer disse kriteriene.",
        "movenosubpage": "Denne siden har ingen undersider.",
        "movereason": "Årsak:",
        "revertmove": "tilbakestill",
-       "delete_and_move": "Slett og flytt",
        "delete_and_move_text": "==Sletting nødvendig==\nMålsiden «[[:$1]]» finnes allerede. Vil du slette den så denne siden kan flyttes dit?",
        "delete_and_move_confirm": "Ja, slett siden",
        "delete_and_move_reason": "Slettet for å muliggjøre flytting fra \"[[$1]]\"",
        "pageinfo-header-properties": "Sideegenskaper",
        "pageinfo-display-title": "Visningstittel",
        "pageinfo-default-sort": "Standardsorteringsnøkkel",
-       "pageinfo-length": "Sidelengde (i bytes)",
+       "pageinfo-length": "Sidestørrelse (i bytes)",
        "pageinfo-article-id": "Side-ID",
        "pageinfo-language": "Språk for sideinnholdet",
        "pageinfo-content-model": "Modell for sideinnhold",
        "pageinfo-robot-index": "Tillatt",
        "pageinfo-robot-noindex": "Ikke tillatt",
        "pageinfo-watchers": "Antall overvåkere av siden",
+       "pageinfo-visiting-watchers": "Antall sideovervåkere med nylig aktivitet",
        "pageinfo-few-watchers": "Færre enn $1 {{PLURAL:$1|overvåker|overvåkere}}",
+       "pageinfo-few-visiting-watchers": "Det kan finnes sideovervåkere med nylig aktivitet",
        "pageinfo-redirects-name": "Antall omdirigeringer til denne siden",
        "pageinfo-subpages-name": "Undersider av siden",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|omdirigering|omdirigeringer}}; $3 {{PLURAL:$3|ikke-omdirigering|ikke-omdirigeringer}})",
        "htmlform-cloner-required": "Minst én verdi kreves.",
        "htmlform-title-badnamespace": "[[:$1]] er ikke i «{{ns:$2}}»-navnerommet",
        "htmlform-title-not-creatable": "«$1» er ikke en opprettbar sidetittel",
-       "htmlform-title-not-exists": "[[:$1]] forefinnes ikke.",
+       "htmlform-title-not-exists": "$1 forefinnes ikke.",
        "htmlform-user-not-exists": "<strong>$1</strong> eksisterer ikke.",
        "htmlform-user-not-valid": "<strong>$1</strong> er ikke et gyldig brukernavn.",
        "sqlite-has-fts": "$1 med støtte for fulltekstsøk",
        "mw-widgets-dateinput-no-date": "Ingen dato valgt",
        "mw-widgets-dateinput-placeholder-day": "ÅÅÅÅ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
-       "mw-widgets-titleinput-description-new-page": "side eksisterer ikke enda",
+       "mw-widgets-titleinput-description-new-page": "siden eksisterer ikke ennå",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
        "api-error-blacklisted": "Vennligst velg en annen beskrivende tittel."
 }
index d258392..9579c8d 100644 (file)
@@ -70,7 +70,8 @@
                        "Mbch331",
                        "Esketti",
                        "M!dgard",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Robin van der Vliet"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "tog-watchlisthidebots": "Botbewerkingen op mijn volglijst verbergen",
        "tog-watchlisthideminor": "Kleine bewerkingen op mijn volglijst verbergen",
        "tog-watchlisthideliu": "Bewerkingen van aangemelde gebruikers op mijn volglijst verbergen",
+       "tog-watchlistreloadautomatically": "Herlaad de volglijst automatisch wanneer er een filter is veranderd (JavaScript vereist)",
        "tog-watchlisthideanons": "Bewerkingen van anonieme gebruikers op mijn volglijst verbergen",
        "tog-watchlisthidepatrolled": "Gemarkeerde wijzigingen op mijn volglijst verbergen",
        "tog-watchlisthidecategorization": "Categorisatie van pagina's verbergen",
        "morenotlisted": "Deze lijst is niet compleet.",
        "mypage": "Gebruikerspagina",
        "mytalk": "Overleg",
-       "anontalk": "Overlegpagina voor dit IP-adres",
+       "anontalk": "Overleg",
        "navigation": "Navigatie",
        "and": "&#32;en",
        "qbfind": "Zoeken",
        "createaccountreason": "Reden:",
        "createacct-reason": "Reden",
        "createacct-reason-ph": "Waarom u een andere account aanmaakt",
-       "createacct-captcha": "Veiligheidscontrole",
-       "createacct-imgcaptcha-ph": "Geef de tekst in die u hierboven ziet",
        "createacct-submit": "Account aanmaken",
        "createacct-another-submit": "Account aanmaken",
        "createacct-benefit-heading": "{{SITENAME}} wordt gemaakt door mensen zoals u.",
        "wrongpasswordempty": "Het opgegeven wachtwoord was leeg.\nProbeer het opnieuw.",
        "passwordtooshort": "Wachtwoorden moeten uit minstens {{PLURAL:$1|$1 teken|$1 tekens}} bestaan.",
        "passwordtoolong": "Wachtwoorden kunnen niet langer zijn dan {{PLURAL:$1|één teken|$1 tekens}}.",
+       "passwordtoopopular": "Vaak gekozen wachtwoorden kunnen niet worden gebruikt. Kies een unieker wachtwoord.",
        "password-name-match": "Uw wachtwoord en uw gebruikersnaam mogen niet overeenkomen.",
        "password-login-forbidden": "Het gebruik van deze gebruikersnaam met dit wachtwoord is niet toegestaan.",
        "mailmypassword": "Nieuw wachtwoord e-mailen",
        "passwordreset-emailtext-ip": "Iemand, waarschijnlijk u, heeft vanaf het IP-adres $1 een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}. Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.",
        "passwordreset-emailtext-user": "Gebruiker $1 op de site {{SITENAME}} heeft een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}.\nMeld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.",
        "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2",
-       "passwordreset-emailsent": "Als dit een geregistreerd e-mailadres is voor uw account, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
+       "passwordreset-emailsentemail": "Als dit een geregistreerd e-mailadres is voor uw account, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emailsent-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.",
        "passwordreset-emailerror-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1",
        "changeemail": "E-mailadres wijzigen of verwijderen",
        "prefs-help-prefershttps": "Deze voorkeur wordt toegepast bij de volgende keer aanmelden.",
        "prefswarning-warning": "U heeft deze wijzigingen gemaakt in uw voorkeuren die nog niet opgeslagen zijn. Wanneer u de pagina verlaat zonder op \"$1\" te klikken worden uw voorkeuren niet bijgewerkt.",
        "prefs-tabs-navigation-hint": "Tip: u kunt de pijltjestoetsen naar links en naar rechts gebruiken om te navigeren tussen de tabbladen in de lijst.",
-       "email-address-validity-valid": "Het e-mailadres lijkt geldig",
-       "email-address-validity-invalid": "Geef een geldig e-mailadres op",
        "userrights": "Gebruikersrechtenbeheer",
        "userrights-lookup-user": "Gebruikersgroepen beheren",
        "userrights-user-editname": "Voer een gebruikersnaam in:",
        "rcshowhidemine": "mijn bewerkingen $1",
        "rcshowhidemine-show": "weergeven",
        "rcshowhidemine-hide": "verbergen",
-       "rcshowhidecategorization": "Paginacategorisatie $1",
+       "rcshowhidecategorization": "paginacategorisatie $1",
        "rcshowhidecategorization-show": "weergeven",
        "rcshowhidecategorization-hide": "verbergen",
        "rclinks": "De $1 laatste wijzigingen bekijken in de laatste $2 dagen<br />$3",
        "activeusers-hidebots": "Bots verbergen",
        "activeusers-hidesysops": "Beheerders verbergen",
        "activeusers-noresult": "Geen actieve gebruikers gevonden.",
+       "activeusers-submit": "Weergeven",
        "listgrouprights": "Rechten van gebruikersgroepen",
        "listgrouprights-summary": "Op deze pagina staan de gebruikersgroepen in deze wiki beschreven, met hun bijbehorende rechten.\nEr kan [[{{MediaWiki:Listgrouprights-helppage}}|extra informatie]] over individuele rechten aanwezig zijn.",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Toegewezen recht</span>\n* <span class=\"listgrouprights-revoked\">Ingetrokken recht</span>",
        "watchlistanontext": "Om uw volglijst te bekijken of te bewerken moet u zich aanmelden.",
        "watchnologin": "U bent niet aangemeld",
        "addwatch": "Toevoegen aan volglijst",
-       "addedwatchtext": "\"[[:$1]]\" de overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
+       "addedwatchtext": "\"[[:$1]]\" en de bijhorende overlegpagina zijn toegevoegd aan uw [[Special:Watchlist|volglijst]].",
        "addedwatchtext-short": "De pagina \"$1\" is aan uw volglijst toegevoegd.",
        "removewatch": "Verwijderen uit volglijst",
        "removedwatchtext": "\"[[:$1]]\" en de overlegpagina zijn verwijderd van [[Special:Watchlist|uw volglijst]].",
        "wlheader-showupdated": "Pagina's die zijn bewerkt sinds uw laatste bezoek worden '''vet''' weergegeven.",
        "wlnote": "Hieronder {{PLURAL:$1|staat de laaste wijziging|staan de laatste $1 wijzigingen}} in {{PLURAL:$2|het laatste uur|de laatste $2 uur}} per $3 om $4.",
        "wlshowlast": "Laatste $1 uur, $2 dagen bekijken",
+       "watchlistall2": "alles",
+       "watchlist-hide": "Verbergen",
+       "wlshowtime": "Periode om te weergeven:",
+       "wlshowhideminor": "kleine bewerkingen",
+       "wlshowhidebots": "bots",
+       "wlshowhideliu": "geregistreerde gebruikers",
+       "wlshowhideanons": "anonieme gebruikers",
+       "wlshowhidepatr": "gecontroleerde bewerkingen",
+       "wlshowhidemine": "mijn bewerkingen",
        "watchlist-options": "Opties voor volglijst",
        "watching": "Bezig met plaatsen op volglijst…",
        "unwatching": "Bezig met verwijderen van volglijst…",
        "contributions": "{{GENDER:$1|Gebruikersbijdragen}}",
        "contributions-title": "Bijdragen van $1",
        "mycontris": "Bijdragen",
+       "anoncontribs": "Bijdragen",
        "contribsub2": "Voor {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "De account \"$1\" is niet geregistreerd.",
        "nocontribs": "Geen wijzigingen gevonden die aan de gestelde criteria voldoen.",
        "movenosubpage": "Deze pagina heeft geen subpagina's.",
        "movereason": "Reden:",
        "revertmove": "terugdraaien",
-       "delete_and_move": "Verwijderen en hernoemen",
        "delete_and_move_text": "==Verwijdering nodig==\nOnder de naam \"[[:$1]]\" bestaat al een pagina.\nWilt u deze verwijderen om plaats te maken voor de te hernoemen pagina?",
        "delete_and_move_confirm": "Ja, de pagina verwijderen",
        "delete_and_move_reason": "Verwijderd in verband met hernoeming van \"[[$1]]\"",
        "tooltip-pt-preferences": "Mijn voorkeuren",
        "tooltip-pt-watchlist": "Overzicht van pagina's die u volgt",
        "tooltip-pt-mycontris": "Overzicht van uw bijdragen",
+       "tooltip-pt-anoncontribs": "Een lijst van bewerkingen gemaakt door dit IP-adres",
        "tooltip-pt-login": "U wordt van harte uitgenodigd om aan te melden, maar dit is niet verplicht",
        "tooltip-pt-logout": "Afmelden",
        "tooltip-pt-createaccount": "Registreer u vooral en meld u aan. Dit is echter niet vereist.",
        "htmlform-cloner-required": "Ten minste één waarde is vereist.",
        "htmlform-title-badnamespace": "[[:$1]] bevindt zich niet in de naamruimte \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" is geen paginanaam die aangemaakt kan worden",
-       "htmlform-title-not-exists": "[[:$1]] bestaat niet.",
+       "htmlform-title-not-exists": "$1 bestaat niet.",
        "htmlform-user-not-exists": "<strong>$1</strong> bestaat niet.",
        "htmlform-user-not-valid": "<strong>$1</strong> is geen geldige gebruikersnaam.",
        "sqlite-has-fts": "Versie $1 met ondersteuning voor \"full-text\" zoeken",
index 54a1f20..a24db3a 100644 (file)
        "nstab-template": "Mal",
        "nstab-help": "Hjelp",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Hovudside",
        "nosuchaction": "Funksjonen finst ikkje",
        "nosuchactiontext": "Handlinga som er oppgjeven i adressa er ugyldig.\nDu har kanskje stava adressa feil, eller følgt ei feil lenkja.\nDette kan òg skuldast ein feil i programvara som er nytta av {{SITENAME}}.",
        "nosuchspecialpage": "Det finst inga slik spesialside",
        "createaccountreason": "Årsak:",
        "createacct-reason": "Årsak",
        "createacct-reason-ph": "Kvifor du lagar ein ny konto",
-       "createacct-captcha": "Tryggingssjekk",
-       "createacct-imgcaptcha-ph": "Skriv inn teksten du ser over",
        "createacct-submit": "Opprett kontoen din",
        "createacct-another-submit": "Opprett ein konto til",
        "createacct-benefit-heading": "{{SITENAME}} er laga av folk som deg.",
        "passwordreset-emailtext-ip": "Nokon (sannsynlegvis deg, frå IP-adressa $1) bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
        "passwordreset-emailtext-user": "Brukaren $1 på {{SITENAME}} bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
        "passwordreset-emailelement": "↓Brukarnamn: \n$1\n\nMellombels passord: \n$2",
-       "passwordreset-emailsent": "Ein e-post for attendestilling av passord er vorten send",
+       "passwordreset-emailsentemail": "Ein e-post for attendestilling av passord er vorten send",
        "passwordreset-emailsent-capture": "Ein e-post om attendestilling av passord - vist under - er vorten send",
        "passwordreset-emailerror-capture": "Ein e-post om attendestilling av passord vart oppretta, og er vist nedanfor; men det lukkast ikkje å senda han til {{GENDER:$2|brukaren}}: $1",
        "changeemail": "↓Endre e-postadresse",
        "edit-gone-missing": "Kunne ikkje oppdatere sida.\nDet ser ut til at ho er sletta.",
        "edit-conflict": "Endringskonflikt.",
        "edit-no-change": "Endringa di vart ignorert fordi det ikkje vart gjort endringar i teksten.",
+       "postedit-confirmation-created": "Sida vart oppretta.",
        "postedit-confirmation-saved": "Endringa di vart lagra.",
        "edit-already-exists": "Kunne ikkje opprette ny side fordi ho alt eksisterer.",
        "defaultmessagetext": "Standard meldingstekst",
        "search-section": "(bolken $1)",
        "search-category": "(kategorien $1)",
        "search-suggest": "Meinte du: «$1»",
+       "search-rewritten": "Viser resultat for $1. Søk i staden etter $2.",
        "search-interwiki-caption": "Systerprosjekt",
        "search-interwiki-default": "Resultat frå $1:",
        "search-interwiki-more": "(meir)",
        "showingresults": "Nedanfor er opp til {{PLURAL:$1|'''eitt'''|'''$1'''}} resultat som byrjar med nummer '''$2''' vist{{PLURAL:$1||e}}.",
        "search-showingresults": "Resultat <strong>{{PLURAL:$4|$1|$1–$2}}</strong> av <strong>$3</strong>",
        "search-nonefound": "Ingen resultat svarte til førespurnaden.",
+       "search-nonefound-thiswiki": "Det var ingen resultat som passa til spørjinga på denne nettstaden.",
        "powersearch-legend": "Avansert søk",
        "powersearch-ns": "Søk i namnerom:",
        "powersearch-togglelabel": "Hak av:",
        "prefs-displaywatchlist": "Val for vising",
        "prefs-diffs": "Skilnader",
        "prefs-help-prefershttps": "Denne innstillinga vil verta verksam neste gongen du loggar inn.",
-       "email-address-validity-valid": "E-postadressa ser ut til å vera gyldig",
-       "email-address-validity-invalid": "Skriv inn ei gyldig e-postaddresse.",
        "userrights": "Administrering av brukartilgang",
        "userrights-lookup-user": "Administrer brukargrupper",
        "userrights-user-editname": "Skriv inn brukarnamn:",
        "wlheader-showupdated": "Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
        "wlnote": "Nedanfor er {{PLURAL:$1|den siste endringa|dei siste '''$1''' endringane}} {{PLURAL:$2|den siste timen|dei siste '''$2''' timane}}, for $3, kl. $4.",
        "wlshowlast": "Vis siste $1 timane $2 dagane",
+       "watchlistall2": "alt",
+       "watchlist-hide": "Gøym",
+       "wlshowtime": "Vis siste:",
+       "wlshowhideminor": "småplukk",
+       "wlshowhidebots": "robotar",
+       "wlshowhideliu": "registrerte brukarar",
+       "wlshowhideanons": "anonyme brukarar",
+       "wlshowhidepatr": "patruljerte endringar",
+       "wlshowhidemine": "mine endringar",
        "watchlist-options": "Alternativ for overvakingslista",
        "watching": "Overvakar...",
        "unwatching": "Fjernar frå overvakinglista...",
        "movenosubpage": "Denne sida har ingen undersider.",
        "movereason": "Årsak:",
        "revertmove": "flytt attende",
-       "delete_and_move": "Slett og flytt",
        "delete_and_move_text": "== Sletting påkravd ==\n\nMå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 å gje rom for flytting frå «[[$1]]»",
index fa7e2fe..4af83d6 100644 (file)
@@ -14,7 +14,8 @@
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Xð"
                ]
        },
        "tog-underline": "Soslinhar los ligams :",
        "viewhelppage": "Vejatz la pagina d'ajuda",
        "categorypage": "Vejatz la pagina de las categorias",
        "viewtalkpage": "Pagina de discussion",
-       "otherlanguages": "Autras lengas",
+       "otherlanguages": "En autras lengas",
        "redirectedfrom": "(Redirigit dempuèi $1)",
        "redirectpagesub": "Pagina de redireccion",
        "redirectto": "Redirigir cap a :",
        "createaccountreason": "Motiu :",
        "createacct-reason": "Motiu",
        "createacct-reason-ph": "Perqué creatz un autre compte",
-       "createacct-captcha": "Contraròtle de seguretat",
-       "createacct-imgcaptcha-ph": "Entratz lo tèxte que vesètz çaisús",
        "createacct-submit": "Creatz vòstre compte",
        "createacct-another-submit": "Crear un autre compte",
        "createacct-benefit-heading": "{{SITENAME}} es escrich per de monde coma vos.",
        "wlheader-showupdated": "Las paginas que son estadas modificadas dempuèi vòstra darrièra visita son afichadas en '''gras'''.",
        "wlnote": "Çaijós {{PLURAL:$1|figura la darrièra modificacion efectuada|figuran las <strong>$1</strong> darrièras modificacions efectuadas}} pendent {{PLURAL:$2|la darrièra ora|las <strong>$2</strong> darrièras oras}}, dempuèi $3, $4.",
        "wlshowlast": "Far veire las darrièras $1 oras, los darrièrs $2 jorns",
+       "watchlistall2": "tot",
        "watchlist-options": "Opcions de la lista de seguiment",
        "watching": "Seguit...",
        "unwatching": "Fin del seguit...",
        "movenosubpage": "Aquesta pagina a pas cap de sospagina.",
        "movereason": "Motiu :",
        "revertmove": "anullar",
-       "delete_and_move": "Suprimir e tornar nomenar",
        "delete_and_move_text": "==Supression requerida==\nL’article de destinacion « [[:$1]] » existís ja.\nLo volètz suprimir per permetre lo cambiament de nom ?",
        "delete_and_move_confirm": "Òc, accèpti de suprimir la pagina de destinacion per permetre lo cambiament de nom.",
        "delete_and_move_reason": "Pagina suprimida per permetre lo cambiament de nom dempuèi « [[$1]] »",
index ebe1506..8408227 100644 (file)
        "tog-hideminor": "Peitä pienet muutokset uuvet muutokset -listaspäi",
        "tog-hidepatrolled": "Peitä tarkastetut muutokset uvvet muutokset -listaspäi",
        "tog-newpageshidepatrolled": "Peitä tarkastetut sivut uuzien sivuloin listalpäi",
+       "tog-hidecategorization": "Peitä sivuloin kategourizacii",
        "tog-extendwatchlist": "Levitä valvonduluvettelo ku ozuttua kai muutokset, ei vaiku jälgimäzii",
+       "tog-usenewrc": "Ryhmittele muutokset sivun mugah uuzien muutoksien listal da valvonduluvettelol",
        "tog-numberheadings": "Automuattizesti numeroija kirjutuksien nimet",
        "tog-showtoolbar": "Ozuta ruadovälinehpalki",
        "tog-editondblclick": "Edituiče sivuloi kaksoispainalduksel",
-       "tog-editsectiononrightclick": "Korjua sektsielöi painamal sektsien nimie hiiren oigiel näppäimel",
+       "tog-editsectiononrightclick": "Kohendele sektsielöi painamal sektsien nimie hiiren oigiel näppäimel",
        "tog-watchcreations": "Ližiä minun luajitut sivut da ližätyt failat minun valvonduluvetteloh",
        "tog-watchdefault": "Ližiä minun kohendetut sivut da failat minun valvonduluvetteloh",
        "tog-watchmoves": "Ližiä minun siirretyt sivut da failat minun valvonduluvetteloh",
        "tog-previewonfirst": "Ozuta ezikačondu kerras, ku edituičendu zavoditah",
        "tog-enotifwatchlistpages": "Työnnä minule sähköpoštu minun valvondulistal olijoin sivuloin kohenduksis",
        "tog-enotifusertalkpages": "Työnnä minule sähköpoštu minun paginsivun muutoksis",
-       "tog-enotifminoredits": "Ilmoita minule pienisgi korjavuksis sähköpoštale",
+       "tog-enotifminoredits": "Ilmoita minule pienisgi kohenduksis sähköpoštale",
        "tog-enotifrevealaddr": "Näytä minun sähköpoštuadressii muile lähetettylöis ilmoituksis",
        "tog-shownumberswatching": "Ozuta tädä sivuu tarkailevien käyttäjien miäriä",
        "tog-oldsig": "Nygöine allekirjutus:",
-       "tog-fancysig": "Allekirjutus wikitekstannu (automuattizettah linkittäh)",
+       "tog-fancysig": "Allekirjutus wikitekstannu (ilmai automuattistu linkii)",
        "tog-uselivepreview": "Käytä välittömiä ezikaččeluu",
        "tog-forceeditsummary": "Huomavuta minuu, gu en olle kirjutannuh yhtehveduo",
-       "tog-watchlisthideown": "Peitä minun korjavukset valvonduluvettelospäi",
+       "tog-watchlisthideown": "Peitä minun kohendukset valvonduluvettelospäi",
        "tog-watchlisthidebots": "Peitä botan kohendukset valdondulistalpäi",
        "tog-watchlisthideminor": "Peitä pienet kohendukset valvondulistalpäi",
        "tog-watchlisthideliu": "Peitä kirjutannuhuoloin käyttäjien kohendukset valvondulistalpäi",
        "tog-watchlisthideanons": "Peitä registriiruičemattomien käyttäjien kohendukset valvondulistalpäi",
        "tog-watchlisthidepatrolled": "Peitä muutoksientarkistajien hyväksytyt kohendukset valvondulistalpäi",
+       "tog-watchlisthidecategorization": "Peitä sivuloin kategourizacii",
        "tog-ccmeonemails": "Työnnä minule koupii MediiWikin kauti työttylöis sähköpoštuviestilöis",
        "tog-diffonly": "Älä ozuta sivun syväindyö eroverdailun alapuolel",
        "tog-showhiddencats": "Ozuta peitetyt kategouriet",
@@ -47,7 +50,7 @@
        "tog-prefershttps": "Käytä ainos suojattuu yhtevytty ku olet kirjutannuhes",
        "underline-always": "Ainos",
        "underline-never": "Nikonzu",
-       "underline-default": "Ketun libo livaimen piäazetus",
+       "underline-default": "Käytä livaimen piäazetuksii",
        "editfont-style": "Edituičendualovehen kirjainstiil'u:",
        "editfont-default": "Livaimen piäazetus",
        "editfont-monospace": "Tazalevyhine kirjain",
        "category-article-count": "{{PLURAL:$2|Täs kategouries on vaiku tämä sivu.|{{PLURAL:$1|Tämä sivu on|$1 Nämmä sivut ollah}} täs kategouries, $2 kaikkiedah.}}",
        "category-article-count-limited": "{{PLURAL:$1|Tämä sivu on|$1 Nämmä sivut ollah}} täs kategouries.",
        "category-file-count": "{{PLURAL:$2|Täs kategouriis on vaiku tämä failu.| {{PLURAL:$1|Tämä failu on|$1 Nämmä failat ollah}} täs kategouries, $2 kaikkiedah.}}",
+       "category-file-count-limited": "Täs kategouries on {{PLURAL:$1|yksi tiijosto|$1 tiijostuo}}",
        "listingcontinuesabbrev": "(jatko)",
        "index-category": "Indeksiruitut sivut",
        "noindex-category": "Indeksiruičemattomat sivut",
        "and": "&#32;da",
        "qbfind": "Eči",
        "qbbrowse": "Livua",
-       "qbedit": "Korjata",
+       "qbedit": "Kohendele",
        "qbpageoptions": "Tämä sivu",
        "qbmyoptions": "Minun sivut",
        "faq": "PKK",
        "print": "Pane bumuagale",
        "view": "Kačo",
        "view-foreign": "Kačo saital $1",
-       "edit": "Korjua",
-       "edit-local": "Edituiče paikallistu kuvavustu",
+       "edit": "Kohendele",
+       "edit-local": "Kohendele paikallistu kuvavustu",
        "create": "Luaji",
        "create-local": "Ližiä paikalline kuvavus",
-       "editthispage": "Korjua tädä sivuu",
+       "editthispage": "Kohendele tädä sivuu",
        "create-this-page": "Luaji tämä sivu",
        "delete": "Ota iäre",
        "deletethispage": "Ota tämä sivu iäre",
        "undeletethispage": "Tuo sivu järilleh",
+       "undelete_short": "Tuo järilleh {{PLURAL:$1|one kohendus|$1 kohendustu}}",
+       "viewdeleted_short": "Ozuta {{PLURAL:$1|yksi iäreotettu kohendus|$1 iäreotettuu kohendustu}}",
        "protect": "Suojua",
        "protect_change": "vaihta",
        "protectthispage": "Suojua tämä sivu",
        "redirectpagesub": "uvvellehohjavussivu",
        "redirectto": "Uvvellehohjuau sivuh:",
        "lastmodifiedat": "Tädä sivuu on muutettu jälgimäzen kerran $1, $2 aigah.",
+       "viewcount": "Tädä sivuu on kačottu {{PLURAL:$1|kerran|$1kerdua}}.",
        "protectedpage": "Suojattu sivu",
        "jumpto": "Siirry",
        "jumptonavigation": "navigatsii",
        "jumptosearch": "eči",
+       "view-pool-error": "Pahakse mielekse palvelimet ollah ylikuormittunnuot täl hetkel. Liijan moni käyttäi oppiu tarkastella tädä sivuu. Vuota kodvaine enne gu opit uvvessah.",
+       "generic-pool-error": "Pahakse mielekse palvelimet ollah ylikuormittunnuot nygöi. Liijan moni käyttäi oppiu tarkastella tädä sivuu.",
+       "pool-timeout": "Lukittumizen vuotanduaigu on loppenuhes.",
+       "pool-queuefull": "Ečindykyzymykzien tallendustila on täyzi",
        "pool-errorunknown": "Tundematoi haireh",
+       "pool-servererror": "Pool counter -palvelu ei ole käytös ($1).",
        "poolcounter-usage-error": "Käyttöhaireh: $1",
        "aboutsite": "Lähteh {{SITENAME}}",
        "aboutpage": "Project:Kuvavus",
+       "copyright": "Sizäldö on käytös luval $1, ei olle toizin mainittu.",
        "copyrightpage": "{{ns:project}}:Luadijan oigevukset",
        "currentevents": "Aijankohtazet tapahtumat",
        "currentevents-url": "Project:Aijankohtazet tapahtumat",
        "disclaimers": "Kieldävymine vastuos",
        "disclaimerpage": "Project:Vastuos kieldävymine",
-       "edithelp": "Abu korjuamizeh",
-       "helppage-top-gethelp": "Kyzyö abuu",
+       "edithelp": "Abu kohendelemizeh",
+       "helppage-top-gethelp": "Kyzy abuu",
        "mainpage": "Piäsivu",
        "mainpage-description": "Piäsivu",
        "policy-url": "Project:Käytändöt",
        "privacy": "Luottamuksen periuateh",
        "privacypage": "Project:Luottamuksen periuateh",
        "badaccess": "Ei oigevuksii",
+       "badaccess-group0": "Sinul ei ole lubua suorittua tädä toiminduo.",
+       "badaccess-groups": "Tämän toimindon voijah suorittua vai {{PLURAL:$2|täh joukkoh|nämmih joukkoloih}} kuulujat käyttäjät.",
        "versionrequired": "MediiWikis pidäy vähimyölleh versii $1",
        "versionrequiredtext": "MediiWikis pidäy vähimyölleh versii $1 tädä sivuu kaččojes. Kačo [[Special:Version|versii]].",
        "ok": "OK",
        "newmessageslinkplural": "{{PLURAL:$1|uuzi viesti|999=uuzii viestilöi}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|jälgimäine muutos|jälgimästy muutostu}}",
        "youhavenewmessagesmulti": "Sinul on uuzii viestilöi sivuloil $1",
-       "editsection": "Korjua",
-       "editold": "korjua",
+       "editsection": "Kohendele",
+       "editold": "kohendele",
        "viewsourceold": "Kačo algukoodu",
-       "editlink": "korjua",
+       "editlink": "kohendele",
        "viewsourcelink": "Kačo algukoodu",
-       "editsectionhint": "Korjua tädä kohtua: $1",
+       "editsectionhint": "Kohendele tädä kohtua: $1",
        "toc": "Sizäldö",
        "showtoc": "ozuttua",
        "hidetoc": "peittiä",
+       "collapsible-collapse": "Peitä",
        "collapsible-expand": "Levitä",
        "confirmable-confirm": "{{GENDER:$1|Oletgo}} varmu?",
        "confirmable-yes": "Muga",
        "confirmable-no": "Ei",
+       "thisisdeleted": "Ozuta libo tuo järilleh $1?",
        "viewdeleted": "Ozuta $1?",
        "restorelink": "{{PLURAL:$1|yksi iäre otettu edituičendu|$1 iäre otettuu edituičendua}}",
        "feedlinks": "Syöteh:",
+       "feed-invalid": "Viäry syötehtaba.",
+       "feed-unavailable": "Sindikacien syöttehet ei olla käytös",
        "site-rss-feed": "$1 (RSS-syöteh)",
        "site-atom-feed": "$1 Atom-lentu",
-       "page-rss-feed": "$1 (RsS-syöteh)",
+       "page-rss-feed": "$1 (RSS-syöteh)",
        "page-atom-feed": "$1 Atom-lentu",
        "red-link-title": "$1 (sivuu ei lövvy)",
+       "sort-descending": "Lajittele laskevas järjestykses",
+       "sort-ascending": "Lajittele nouzevas järjestykses",
        "nstab-main": "Sivu",
        "nstab-user": "Käyttäisivu",
        "nstab-media": "Mediisivu",
        "nstab-project": "Projektusivu",
        "nstab-image": "Failu",
        "nstab-mediawiki": "Viesti",
-       "nstab-template": "Šablon",
+       "nstab-template": "Malli",
        "nstab-help": "Abusivu",
        "nstab-category": "Kategourii",
        "mainpage-nstab": "Piäsivu",
        "directoryreadonlyerror": "Al'bom $1 on kirjutussuojattu.",
        "directorynotreadableerror": "Al'bom $1 ei ole lugiettavis.",
        "filenotfound": "Failua \"$1\" ei lövvetty.",
+       "unexpected": "Vuottamatoi arvo: \"$1\"=\"$2\".",
+       "formerror": "Haireh: Ankietan tiijot ei päitä.",
        "badarticleerror": "Tädä toimindua ei voi ruadua täl sivul.",
        "cannotdelete": "Sivuu libo failua \"$1\" ei voi ottua iäre. Kentah toine on jo toinah ottanuh sen iäre.",
        "cannotdelete-title": "Ei voi ottua iäre sivuu \"$1\"",
        "mycustomjsprotected": "Sinul ei ole oigevuksii edituija tädä JavaScript-sivuu.",
        "ns-specialprotected": "Toimindosivuloi ei voi edituija.",
        "exception-nologin": "Ei ole kirjutannuhes",
-       "virus-scanfailed": "skanniruičendu ei ozavunnu (koudu $1)",
+       "virus-scanfailed": "skaniiruičendua ei voidu luadie (koudu $1)",
        "welcomeuser": "Tule terveh, $1!",
        "yourname": "Käyttäinimi:",
        "userlogin-yourname": "Käyttäinimi",
        "userlogin-yourpassword": "Peittosana",
        "userlogin-yourpassword-ph": "Kirjuta sinun peittosana",
        "createacct-yourpassword-ph": "Kirjuta peittosana",
-       "yourpasswordagain": "Kirjuta peittosana myös:",
-       "createacct-yourpasswordagain": "Lujenda peittosana",
+       "yourpasswordagain": "Kirjuta peittosana uvvessah:",
+       "createacct-yourpasswordagain": "Varmista peittosana",
        "createacct-yourpasswordagain-ph": "Myös kirjuta peittosana",
        "userlogin-remembermypassword": "Pie minut kirjutannuhuonnu",
        "userlogin-signwithsecure": "Käytä suojattuu yhtevytty",
        "gotaccountlink": "Kirjuttai",
        "userlogin-resetlink": "Unohtitgo sinun käyttäinimen/peittosanan?",
        "userlogin-resetpassword-link": "Unohtitgo sinun peittosanan?",
-       "userlogin-helplink2": "Abuu ku kirjuttuakseh",
+       "userlogin-helplink2": "Abuu kirjuttamizeh",
        "userlogin-loggedin": "Olet jo kirjutannuhes nimel {{GENDER:$1|$1}}.\nKäytä al olijua ankiettua ku kirjuttuakseh eri käyttäjänny.",
        "userlogin-createanother": "Luaji toine tili",
        "createacct-emailrequired": "Sähköpoštuadressu",
        "createaccountreason": "Syy:",
        "createacct-reason": "Syy",
        "createacct-reason-ph": "Mindäh olet luadimas tostu käyttäitilii",
-       "createacct-captcha": "Turvallizusvarmistus",
-       "createacct-imgcaptcha-ph": "Kirjuta ylähän olii tekstu",
        "createacct-submit": "Luaji tili",
        "createacct-another-submit": "Luaji tili",
        "createacct-benefit-heading": "Sivun {{SITENAME}} ollah luajittu sinunjyttymät rahvas.",
        "createaccounterror": "Ei voinuh luadie tilii: $1",
        "loginsuccesstitle": "Olet kirjutannuhes",
        "loginsuccess": "<strong>Olet kirjutannuhes sivule {{SITENAME}} käyttäitunnuksel \"$1\".</strong>",
-       "nosuchusershort": "Ei ole käyttäjiä nimel \"$1\". Tarkista kirjutitgo oigein.",
+       "nosuchusershort": "Ei ole käyttäjiä nimel \"$1\". Tarkista kirjutitgo oigieh.",
        "nouserspecified": "Käyttäinimi pidäy.",
        "login-userblocked": "Tämä käyttäi on estetty. Ei oigevuttu kirjuttuakseh.",
        "wrongpassword": "Kirjutit viärän peittosanan. Ole hyvä, opi vie kerdu.",
        "passwordtoolong": "Peittosana ei voi olla pitkembi $1 {{PLURAL:$1|merkii}}.",
        "password-name-match": "Peittosana pidäy olla eri migu käyttäinimi.",
        "password-login-forbidden": "Tämän käyttäinimen da peittosanan käyttö on estetty.",
-       "mailmypassword": "Azeta peittosana uvvelleh",
+       "mailmypassword": "Azeta peittosana uvvessah",
        "passwordremindertitle": "Uuzi väliaigaine peittosana {{SITENAME}}-sivuh niškoi",
        "passwordremindertext": "Kentah IP-adressispäi $1 kyzyi työndämäh uuttu peittosanua saitale {{SITENAME}} ($4). Väliaigaine peittosana käyttäjäle $2 on nygöi $3. Kirjuttai da vaihta peittosana. Väliaigaine peittosana vahnenou {{PLURAL:$5|yhten päivän|$5 päivän}} jälles.\n\nOllou kentah toine työndänyh tämän pakičuksen, libo ku ollet mustanuh sinun peittosanan da et tahto vaihtua sidä, voit jättiä tämän viestin huomivottah da jatkua vahnan peittosanan käyttyö.",
        "passwordsent": "Uuzi peittosana on työtty käyttäjän <b>$1</b> sähköpoštuadressah.\nOle hyvä da kirjuttai sen suaduu.",
        "pt-userlogout": "Kirjuttai ullos",
        "php-mail-error-unknown": "Tundematoi haireh PHP:n mail()-funktsies",
        "user-mail-no-addy": "Opit työndiä sähköpoštan sähköpoštuadressittah.",
-       "user-mail-no-body": "Sähköpoštan syväindön pidäy olla pitkembi.",
+       "user-mail-no-body": "Sähköpoštan syväindö pidäy olla suurembi.",
        "changepassword": "Vaihta peittosana",
        "resetpass_announce": "Suaja sizähkirjuamine loppuh, sinul pidäy keksie uuzi peittosana.",
        "resetpass_header": "Vaihta tilin peittosana",
        "resetpass-recycled": "Ole hyvä, valliče uvvekse peittosanakse eri migu nygöine peittosana.",
        "resetpass-temp-password": "Väliaigaine peittosana:",
        "resetpass-expired": "Sinun peittosana on vahnennuh. Ole hyvä, luaji uuzi peittosana ku kirjuttuakseh.",
-       "passwordreset": "Azeta peittosana uvvelleh",
+       "passwordreset": "Azeta peittosana uvvessah",
        "passwordreset-username": "Käyttäinimi:",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "Sähköpoštuadressu:",
        "hr_tip": "Horizontualine viivu (älä käytä liijakse)",
        "summary": "Yhtehvedo:",
        "subject": "Tiemu/rubriekku:",
-       "minoredit": "Tämä on pieni korjavus",
+       "minoredit": "Tämä on pieni kohendus",
        "watchthis": "Tarkaile tädä sivuu",
        "savearticle": "Tallenda sivu",
        "preview": "Ezikačo",
        "showpreview": "Ezikačo",
-       "showdiff": "Luajitut korjavukset",
+       "showdiff": "Luajitut kohendukset",
        "anoneditwarning": "<strong>Varaitus:</strong> Et ole kirjutannuhes. Luadinet muutoksii syväindölöih, sinun Ip-adressu tulou nägövih kaikile. Ku <strong>[$1 kirjutannuttos]</strong> libo <strong>[$2 registriiruičettos]</strong>, sinun syväindömuutokset nävytäh sinun käyttäinimel, toizien eduloin ližäkse.",
        "summary-preview": "Yhtehvevon ezikačondu:",
-       "subject-preview": "Tiemam ezikačondu:",
+       "subject-preview": "Teeman ezikačondu:",
        "previewerrortext": "Rodih haireh oppijes ezikaččuo muutoksii.",
        "blockedtitle": "Käyttäi on estetty",
-       "blockednoreason": "ei viärysty annettu",
+       "blockednoreason": "syydy ei annettu",
        "whitelistedittext": "Sinun pidäy $1 ku edituija sivuloi.",
-       "nosuchsectiontitle": "Nengostu sektua ei ole",
-       "loginreqtitle": "Pidäy kirjautuakseh",
+       "nosuchsectiontitle": "Nengostu sektsiedu ei ole",
+       "loginreqtitle": "Pidäy kirjuttuakseh",
        "loginreqlink": "kirjuttai",
        "loginreqpagetext": "Toizien sivuloin kaččomizekse pidäy $1.",
        "accmailtitle": "Peittosana työtty",
        "noarticletext-nopermission": "Täl sivul ei ole tekstua.\nVoit [[Special:Search/{{PAGENAME}}|eččie sivun nimel]] toizis sivuloispäi, libo <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie sivuu koskijua logua]</span>, ga sinul ei ole oigevuksii luadie tädä sivuu.",
        "userpage-userdoesnotexist-view": "Käyttäitunnustu ”$1” ei ole registruittu.",
        "updated": "(Päivitetty)",
+       "previewnote": "'''Tämä on vaiku sivun ezikaččelu.'''\nSinun luajittuloi kohenduksii ei ole vie tallendettu.",
        "continue-editing": "Mene edituičendualovehele",
-       "editing": "Edituijah sivuu $1",
+       "editing": "Kohendellah sivuu $1",
        "creating": "Luajitah sivuu \"$1\"",
-       "editingsection": "Korjuandu $1 (alalugu)",
-       "editingcomment": "Edituijah $1 (uuzi sektu)",
+       "editingsection": "Kohendellah $1 (alalugu)",
+       "editingcomment": "Edituijah $1 (uuzi sektsii)",
        "yourtext": "Sinun tekstu",
        "yourdiff": "Erot",
        "templatesused": "{{PLURAL:$1|Šablon|Šablonat}} käytetty täl sivul:",
        "template-protected": "(suojattu)",
        "template-semiprotected": "(puolekse suojattu)",
        "hiddencategories": "Tämä sivu kuuluu {{PLURAL:$1|1 peitettyh kategourieh|$1 peitettyh kategourieh}}:",
-       "sectioneditnotsupported-title": "Sektan kohendustu ei tuveta.",
-       "sectioneditnotsupported-text": "Sektan kohendustu ei tuveta täl sivul.",
+       "nocreate-loggedin": "Sinul ei ole oigevuksii luadie uuzii sivuloi.",
+       "sectioneditnotsupported-title": "Sektsien kohendustu ei tuveta.",
+       "sectioneditnotsupported-text": "Sektsien kohendustu ei tuveta täl sivul.",
        "permissionserrors": "Ei oigevuksii",
        "permissionserrorstext": "Sinul ei ole lubua toimindoh {{PLURAL:$1|tämän syyn periä|nämmien syylöin periä}}:",
        "permissionserrorstext-withaction": "Sinul ei ole lubua toimindoh $2 niškoi, {{PLURAL:$1|tämän syyn periä|nämmien syylöin periä}}:",
        "moveddeleted-notice": "Tämä sivu on otettu iäre. Sivun iäreotandu- da siirdohistourii ollah annettu al viittavuksennu.",
+       "log-fulllog": "Ozuta kai histourii",
        "postedit-confirmation-created": "Sivu on nygöi luajittu.",
-       "postedit-confirmation-restored": "Sivus on otettu järilleh sen aijembi versii.",
+       "postedit-confirmation-restored": "Sivun aijembi versii on tuodu järilleh.",
        "postedit-confirmation-saved": "Sinun kohendus tallendettih.",
        "edit-already-exists": "Ei voi luadie uuttu sivuu. Se on jo olemas.",
        "content-model-wikitext": "wikitekstu",
        "content-json-empty-object": "Tyhjy objektu",
        "cantcreateaccounttitle": "Ei voi luadie tunnustu",
        "cantcreateaccount-text": "Tunnuksien luadimine täs IP-adressaspäi ('''$1''') on estetty. Estäjänny on [[User:$3|$3]].\n\nKäyttäjän $3 annettu syy on ''$2''",
-       "cantcreateaccount-range-text": "Tunnuksien luadimine IP-adressilois adressualovehel '''$1''', kuduah kuuluu dai sinun käytetty IP-adressu('''$4'''), on estetty. Eston on azettanuh [[User:$3|$3]].\n\nKäyttäjän $3 annettu syy estole on \"$2\".",
-       "viewpagelogs": "Ozuta tämän sivun logat",
+       "cantcreateaccount-range-text": "Tunnuksien luadimine IP-adressilois adressualovehel '''$1''', kuduah kuuluu sinungi käytetty IP-adressu('''$4'''), on estetty. Eston on azetannuh [[User:$3|$3]].\n\nKäyttäjän $3 annettu syy estole on \"$2\".",
+       "viewpagelogs": "Ozuta tämän sivun lougat",
        "nohistory": "Täl sivul ei ole kohendushistoriedu.",
        "currentrev": "Jälgimäzin versii",
        "currentrev-asof": "Sivun $1 jälgimäzin versii",
        "history-feed-description": "Tämän sivun versiihistourii",
        "history-feed-item-nocomment": "$1 ($2)",
        "rev-deleted-user": "(käyttäinimi on otettu iäre)",
-       "rev-deleted-event": "(logan tiijot on otettu iäre)",
+       "rev-deleted-event": "(login tiijot on otettu iäre)",
        "rev-deleted-user-contribs": "[käyttäinimi libo IP-adressu on otettu iäre – edituičendu on peitetty edituičenduluvettelospäi]",
        "rev-delundel": "vaihta nägyvys",
        "rev-showdeleted": "ozuttua",
        "revdelete-nooldid-title": "Ei kohtehversielöi",
        "revdelete-show-file-submit": "Muga",
        "revdelete-selected-text": "{{PLURAL:$1|Vallittu versii|Vallitut versiet}} kohtehes [[:$2]]:",
+       "revdelete-hide-image": "Peitä failan syväindö",
+       "revdelete-hide-name": "Peitä kohteh da parametrat",
+       "revdelete-hide-comment": "Kohendele yhtehveduo",
+       "revdelete-hide-user": "Peitä kirjuttajan nimi libo IP-adressu",
        "revdelete-radio-same": "(älä vaihta)",
        "revdelete-radio-set": "Peitetty",
        "revdelete-radio-unset": "Nägövil",
+       "logdelete-success": "'''Tapahtumuhistourien nägyvytty on muutettu.'''",
+       "logdelete-failure": "'''Tapahtumuhistourien nägyvytty ei voidu azettua:'''\n$1",
+       "revdel-restore": "vaihta nägyvys",
        "pagehist": "Sivuhistourii",
        "deletedhist": "Iäre otettuloin versielöin histourii",
        "revdelete-offender": "Versien luadii:",
-       "suppressionlog": "Peitändyloga",
+       "suppressionlog": "Peitändylog",
        "mergehistory": "Yhtistä sivuloin edituičenduhistourii",
        "mergehistory-header": "Täl sivul voit yhtistiä lähtehsivun sivuhistourien versielöi uvvemban sivun histourieh. Varmista, ku sivuloin yhtenäine edituičenduhistourii pyzyy eigo mene ristakkai immin-kummin!",
        "mergehistory-box": "Yhtistä kahten sivun versielöi:",
        "powersearch-togglelabel": "Valliče:",
        "powersearch-toggleall": "Kai",
        "powersearch-togglenone": "Nimidä",
+       "preferences": "Azetukset",
        "mypreferences": "Azetukset",
-       "prefs-edits": "Edituičendoi kaikkiedah:",
+       "prefs-edits": "Kohenduksii kaikkiedah:",
+       "prefsnologintext2": "Ole hyvä, kirjuttai ku vaihtua sinun azetuksii.",
        "prefs-skin": "Kettu",
+       "skin-preview": "Ezikačo",
        "prefs-user-pages": "Käyttäisivut",
+       "prefs-rc": "Jälgimäzet kohendukset",
        "prefs-watchlist": "Valvondulistu",
+       "prefs-editwatchlist": "Kohendele valvonduluvetteluo",
+       "prefs-editwatchlist-label": "Kohendele valvonduluvettelon merkindölöi:",
+       "prefs-editwatchlist-edit": "Ozuta da ota iäre kohtehii valvonduluvettelos",
+       "prefs-editwatchlist-clear": "Tyhjendä valvonduluvettelo",
+       "prefs-watchlist-days": "Ozutettuloin päivien lugu valvonduluvettelos:",
+       "prefs-watchlist-days-max": "Ei enämbi $1 {{PLURAL:$1|päiviä}}",
+       "prefs-watchlist-token": "Valvonduluvettelon avain:",
        "prefs-resetpass": "Vaihta peittosana",
        "prefs-changeemail": "Vaihta libo ota iäre sähköpoštuadressu",
        "prefs-setemail": "Kirjuta sähköpoštuadressu",
        "group-user": "Käyttäjät",
        "group-all": "(kai)",
        "right-read": "Lugie sivuloi",
-       "right-edit": "Edituija sivuloi",
+       "right-edit": "Kohendella sivuloi",
        "right-createpage": "Luadie sivuloi (kudamat ei olla paginsivuloi)",
        "right-createtalk": "Luadie paginsivuloi",
        "right-createaccount": "Luadie uuzii käyttäitunnuksii",
        "action-move-subpages": "siirrä tämä sivu, da sen alisivut",
        "action-movefile": "siirrä tämä failu",
        "enhancedrc-history": "histourii",
-       "recentchanges": "Uvvet korjavukset",
+       "recentchanges": "Uvvet kohendukset",
        "recentchanges-legend": "Tuorehien muutoksien azetukset",
        "recentchanges-summary": "Jällitä kaikkii jälgimäzet muutokset wikih täl sivul.",
-       "recentchanges-label-newpage": "Tämä korjavus on johtanuh uvven sivun luadimizeh",
-       "recentchanges-label-minor": "Tämä on pieni korjavus",
-       "recentchanges-label-bot": "Tämän muutoksen on luadinuh bot",
+       "recentchanges-label-newpage": "Tämä kohendus on johtanuh uvven sivun luadimizeh",
+       "recentchanges-label-minor": "Tämä on pieni kohendus",
+       "recentchanges-label-bot": "Tämän kohenduksen on luadinuh bot",
        "recentchanges-label-unpatrolled": "Tädä korjuandua vie ei ole tarkistettu",
        "recentchanges-label-plusminus": "Sivu on kazvanuh [] baital",
        "recentchanges-legend-heading": "'''Legendu:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kačo sežo [[Special:NewPages|uuzien sivuloin listu]])",
        "rclistfrom": "Ozuta jälgimäzet muutokset algajen $2, $3",
-       "rcshowhideminor": "$1 pienet muutokset",
+       "rcshowhideminor": "$1 pienet kohendukset",
        "rcshowhideminor-show": "Ozuta",
        "rcshowhideminor-hide": "Peitä",
        "rcshowhidebots": "$1 botat",
        "boteditletter": "b",
        "rc-change-size-new": "Kogo jälles muutoksii: $1 {{PLURAL:$1|baitu|baitua}}",
        "recentchangeslinked": "Koskijat muutokset",
-       "recentchangeslinked-toolbox": "Toine toizeh liittyjät korjavukset",
+       "recentchangeslinked-toolbox": "Toine toizeh liittyjät kohendukset",
        "recentchangeslinked-title": "Muutokset koskijen sivuu \"$1\"",
        "recentchangeslinked-summary": "Tämä on nengomien sivuloin korjavuksien luvettelo, kudamih viittuau tämä sivu (libo sih kategourieh kuulujat).Sivut, kudamat kuulutah [[Special:Watchlist|teijän valvonduluvettelo]], ollah  <strong>bold</strong>.",
        "recentchangeslinked-page": "Sivun nimi:",
        "booksources": "Kniigulähtehet",
        "booksources-search-legend": "Eči kniigulähtehii",
        "booksources-search": "Eči",
-       "log": "Logat",
+       "log": "Lougat",
        "allpages": "Kai sivut",
        "nextpage": "Tulii sivu ($1)",
        "prevpage": "Ielline sivu ($1)",
        "whatlinkshere-page": "Sivu:",
        "linkshere": "Nämmä sivut linkittiäkseh sivuh <strong>[[:$1]]</strong>:",
        "isredirect": "uvvellehohjavussivu",
-       "istemplate": "sižällyttämine",
+       "istemplate": "sizällyttämine",
        "isimage": "failan linku",
        "whatlinkshere-prev": "{{PLURAL:$1|ielline|ielline $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|tulii|tulii $1}}",
        "whatlinkshere-hidelinks": "$1 linkat",
        "whatlinkshere-filters": "Filtrat",
        "blocklink": "Lukiče",
-       "contribslink": "korjavukset",
+       "contribslink": "kohendukset",
        "movelogpage": "Siirrä loga",
        "export": "Vie sivut",
        "allmessages-language": "Kieli:",
        "tooltip-pt-mytalk": "Sinun paginsivu",
        "tooltip-pt-preferences": "Sinun azetukset",
        "tooltip-pt-watchlist": "Listu sivulois kudamien muutoksii valvot",
-       "tooltip-pt-mycontris": "Listu sinun kirjutuksis",
+       "tooltip-pt-mycontris": "Luvettelo sinun kirjutuksis",
        "tooltip-pt-login": "Täs voibi registriiruijakseh, ga se ei ole vältämätöi",
        "tooltip-pt-logout": "Kirjuttai ullos",
        "tooltip-pt-createaccount": "Voit registriiruijakseh da kirjuttuakseh järjestelmäh, ga se ei ole vältämätöi",
        "tooltip-ca-talk": "Pagize piäsivun sizäldös",
-       "tooltip-ca-edit": "Korjua tädä sivuu",
+       "tooltip-ca-edit": "Kohendele tädä sivuu",
        "tooltip-ca-addsection": "Luaji uuzi alalugu",
        "tooltip-ca-viewsource": "Tämä sivu on suojattu. Voit kaččuo sen lähtehkoudan",
        "tooltip-ca-history": "Tämän sivun jälgimäzet muutokset",
        "tooltip-t-permalink": "Pyzyi linki tämän sivun versieh",
        "tooltip-ca-nstab-main": "Kačo piäsivun sizäldö",
        "tooltip-ca-nstab-user": "Ozuta käyttäisivu",
-       "tooltip-ca-nstab-special": "Tämä on erikoine sivu, sidä ei voi korjata",
+       "tooltip-ca-nstab-special": "Tämä on erikoine sivu, sidä ei voi kohendella",
        "tooltip-ca-nstab-project": "Ozuta projektusivu",
        "tooltip-ca-nstab-image": "Kačo failan sivu",
        "tooltip-ca-nstab-template": "Ozuta šablon",
        "tooltip-save": "Tallenda muutokset",
        "tooltip-preview": "Ezikačo muutokset. Ole hyvä, luaji nenga ainos enne tallendamistu!",
        "tooltip-diff": "Ozuta sinun luajitut muutokset tekstah",
-       "tooltip-rollback": "Yhtel painalluksel poistua jälgimäine korjavus",
-       "tooltip-undo": "\"Kumua\" tuou järilleh aijemban edituičenduversien da avuau edituičenduankietan ezikaččelendutilas. Sen vuoh voi ližätä kumuandumotiivan yhtehvevos.",
+       "tooltip-rollback": "Yhtel painalluksel poistua jälgimäine kohendus",
+       "tooltip-undo": "\"Hylgiä\" tuou järilleh aijemban kohendusversien da avuau kohendusankietan ezikaččelendutilas. Sinne voit kirjuttua, mindäh olet hyllännyh muutokset.",
        "tooltip-summary": "Kirjuta lyhyt kuvavus",
        "simpleantispam-label": "Anti-spam-tarkistus. \n<strong>älä</strong> täytä!",
        "pageinfo-toolboxlink": "Sivun tiijot",
        "exif-yresolution": "Vertikualine rezolucii",
        "exif-datetime": "Tiijoston muutospäivy da -aigu",
        "exif-make": "Kameran valmistai",
-       "exif-model": "Kamerumodellu",
+       "exif-model": "Kameran malli",
        "exif-software": "Käytetty programmu",
        "exif-exifversion": "Exif-versii",
        "exif-colorspace": "Väritila",
index 7b33d53..8f760e4 100644 (file)
@@ -21,6 +21,7 @@
        "tog-hideminor": "ନିକଟରେ ହୋଇଥିବା ଛୋଟ ବଦଳସବୁକୁ ଲୁଚାଇବେ",
        "tog-hidepatrolled": "ନଗଦ ବଦଳରେ ନିରିକ୍ଷଣ କରାଯାଇଥିବା ବଦଳ ସବୁକୁ ଲୁଚାଇବେ",
        "tog-newpageshidepatrolled": "ନୂଆ ପୃଷ୍ଠାତାଲିକାରୁ ଜଗାହୋଇଥିବା ବଦଳସବୁକୁ ଲୁଚାଇବେ",
+       "tog-hidecategorization": "ପୃଷ୍ଠାସବୁର ଶ୍ରେଣୀବିଭାଗ ଲୁଚାନ୍ତୁ",
        "tog-extendwatchlist": "କେବଳ ନଗଦ ହିଁ ନୁହେଁ, ସବୁଯାକ ବଦଳକୁ ଦେଖାଇବା ପାଇଁ ଦେଖଣାତାଲିକାକୁ ପୂରା ଦେଖାଇବେ",
        "tog-usenewrc": "ନଗଦ ବଦଳରେ ପୃଷ୍ଠା ଅନୁଯାୟୀ ଗୋଷ୍ଠୀ ବଦଳ ଏବଂ ଦେଖଣା",
        "tog-numberheadings": "ଆପେଆପେ-ସଂଖ୍ୟାର ନାମଗୁଡ଼ିକ",
@@ -50,6 +51,7 @@
        "tog-watchlisthideliu": "ଲଗ ଇନ କରିଥିବା ସଭ୍ୟମାନଙ୍କ ଦେଇ କରାହୋଇଥିବା ବଦଳଗୁଡ଼ିକ ଲୁଚାଇବେ",
        "tog-watchlisthideanons": "ଅଜଣା ସଭ୍ୟମାନଙ୍କ ଦେଇ କରାହୋଇଥିବା ବଦଳଗୁଡ଼ିକ ଲୁଚାଇବେ",
        "tog-watchlisthidepatrolled": "ମୋ ଦେଖଣା ତାଲିକାରୁ ଜଗାଯାଇଥିବା ସମ୍ପାଦନାଗୁଡ଼ିକ ଲୁଚାଇବେ",
+       "tog-watchlisthidecategorization": "ପୃଷ୍ଠାସବୁର ଶ୍ରେଣୀବିଭାଗ ଲୁଚାନ୍ତୁ",
        "tog-ccmeonemails": "ମୁଁ ଯେଉଁ ଇ-ମେଲ ସବୁ ଅନ୍ୟମାନଙ୍କୁ ପଠାଉଛି ସେସବୁର ନକଲ ମୋତେ ପଠାଇବେ ।",
        "tog-diffonly": "ତୁଳନା ତଳେ ପୃଷ୍ଠାର ଭିତର ଭାଗ ଦେଖାନ୍ତୁ ନାହିଁ",
        "tog-showhiddencats": "ଲୁଚାଯାଇଥିବା ଶ୍ରେଣୀଗୁଡ଼ିକ ଦେଖାଇବେ",
        "sort-ascending": "ସାନରୁ ବଡ଼ କ୍ରମେ ସଜାନ୍ତୁ",
        "nstab-main": "ପୃଷ୍ଠା",
        "nstab-user": "ବ୍ୟବହାରକାରୀଙ୍କର ପୃଷ୍ଠା",
-       "nstab-media": "ମà­\87ଡିà¬\86 à¬ªà¬°à¬¦",
+       "nstab-media": "ମିଡ଼ିà¬\86 à¬ªà­\83ଷà­\8dଠା",
        "nstab-special": "ବିଶେଷ ପୃଷ୍ଠା",
        "nstab-project": "ପ୍ରକଳ୍ପ ପୃଷ୍ଠା",
        "nstab-image": "ଫାଇଲ",
        "createaccountreason": "କାରଣ:",
        "createacct-reason": "କାରଣ",
        "createacct-reason-ph": "ଆପଣ ଅନ୍ୟଏକ ଖାତା କାହିଁକି ତିଆରି କରୁଛନ୍ତି",
-       "createacct-captcha": "ନିରାପତ୍ତା ଯାଞ୍ଚ",
-       "createacct-imgcaptcha-ph": "ଉପରେ ଲେଖାଥିବା ଅକ୍ଷରକୁ ଲେଖନ୍ତୁ",
        "createacct-submit": "ନିଜର ନୂଆ ଖାତାଟିଏ ଖୋଲନ୍ତୁ",
        "createacct-another-submit": "ଆଉ ଏକ ଖାତା ଖୋଲନ୍ତୁ",
        "createacct-benefit-heading": "{{SITENAME}} ଆପଣଙ୍କ ଭଳି ଲୋକମାନଙ୍କ ଦ୍ୱାରା ଗଢ଼ା ।",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|ସଭ୍ୟ|ସଭ୍ୟଗଣା}}ଙ୍କୁ ଦେଖୁଅଛି]",
        "rc_categories": "ଶ୍ରେଣୀସମୂହ ପାଇଁ ସୀମା ( \"|\" ଦେଇ ଅଲଗା କରିବେ)",
        "rc_categories_any": "ଯେ କୌଣସି",
-       "rc-change-size-new": "ବଦଳପରେ $1 {{PLURAL:$1|ବାଇଟ|ବାଇଟ}}",
+       "rc-change-size-new": "ବଦଳ ପରେ $1 {{PLURAL:$1|ବାଇଟ|ବାଇଟ}}",
        "newsectionsummary": "/* $1 */ ନୂଆ ଭାଗ",
        "rc-enhanced-expand": "ସବିଶେଷ ଦେଖାନ୍ତୁ",
        "rc-enhanced-hide": "ବେଶି କଥାସବୁ ଲୁଚାଇଦିଅ",
        "cachedspecial-viewing-cached-ts": "ଆପଣ ଏହି ପୃଷ୍ଠାର ଏକ ପୁରୁଣା ସଂସ୍କରଣ ଦେଖୁଛନ୍ତି, ଯାହାକି ପ୍ରକୃତରେ ସଂପୂର୍ଣ ନ ହୋଇଥାଇପାରେ ।",
        "cachedspecial-refresh-now": "ନୂତନତମ ଦେଖନ୍ତୁ ।",
        "categories": "ଶ୍ରେଣୀସମୂହ",
-       "categoriespagetext": "ତଳଲିà¬\96ିତ {{PLURAL:$1|ଶà­\8dରà­\87ଣà­\80|ଶà­\8dରà­\87ଣà­\80ସମà­\82ହ}}ରà­\87 à¬ªà­\83ଷà­\8dଠା à¬¬à¬¾ à¬®à­\87ଡ଼ିଆ ରହିଅଛି ।\n[[Special:UnusedCategories|ବ୍ୟବହାର ହୋଇନଥିବା ଶ୍ରେଣୀସବୁ]] ଦେଖାଯାଇନାହିଁ ।\n[[Special:WantedCategories|ଦରକାରୀ ଶ୍ରେଣୀସମୂହ]] ସବୁ ଦେଖନ୍ତୁ ।",
+       "categoriespagetext": "ତଳଲିà¬\96ିତ {{PLURAL:$1|ଶà­\8dରà­\87ଣà­\80|ଶà­\8dରà­\87ଣà­\80ସମà­\82ହ}}ରà­\87 à¬ªà­\83ଷà­\8dଠା à¬¬à¬¾ à¬®à¬¿ଡ଼ିଆ ରହିଅଛି ।\n[[Special:UnusedCategories|ବ୍ୟବହାର ହୋଇନଥିବା ଶ୍ରେଣୀସବୁ]] ଦେଖାଯାଇନାହିଁ ।\n[[Special:WantedCategories|ଦରକାରୀ ଶ୍ରେଣୀସମୂହ]] ସବୁ ଦେଖନ୍ତୁ ।",
        "categoriesfrom": "ଏହି ନାମରେ ଆରମ୍ଭ ହେଉଥିବା ଶ୍ରେଣୀଗୁଡ଼ିକୁ ଦେଖାଇବେ:",
        "special-categories-sort-count": "ଗଣନ କରି ସଜାଇବେ",
        "special-categories-sort-abc": "ଅକ୍ଷରର କ୍ରମ ଅନୁସାରେ ସଜାଇବେ",
        "wlheader-showupdated": "ଆପଣ ଶେଷଥର ଦେଖିଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକ '''ମୋଟା ଅକ୍ଷର'''ରେ ଦେଖାଯାଉଅଛି ।",
        "wlnote": "$3, $4 ଅନୁସାରେ ବିଗତ {{PLURAL:$2|ଘଣ୍ଟାକରେ|<strong>$2</strong> ଘଣ୍ଟାରେ}}{{PLURAL:$1|ଶେଷ ବଦଳ|ଶେଷ <strong>$1</strong> ବଦଳ ତଳେ ଦିଆଗଲା}} ।",
        "wlshowlast": "ଗତ $1 ଘଣ୍ଟା $2 ଦିନ ଦେଖାନ୍ତୁ",
+       "watchlistall2": "ସବୁ",
        "watchlist-options": "ଦେଖଣା ବିକଳ୍ପସବୁ",
        "watching": "ଦେଖୁଛି...",
        "unwatching": "ଦେଖୁନାହିଁ...",
        "movenosubpage": "ଏହି ପୃଷ୍ଠାର ଉପପୃଷ୍ଠା ନାହିଁ ।",
        "movereason": "କାରଣ:",
        "revertmove": "ପଛକୁ ଫେରାଇବେ",
-       "delete_and_move": "ଲିଭାଇବେ ଓ ଘୁଞ୍ଚାଇବେ",
        "delete_and_move_text": "== ଲିଭାଇବା ଦରକାର ==\nମୁକାମ ପୃଷ୍ଠା \"[[:$1]]\" ଟି ଆଗରୁ ଅଛି ।\nଆପଣ ଏହାକୁ ଲିଭାଇ ଘୁଞ୍ଚାଇବାକୁ ବାଟ କଢ଼ାଇବାକୁ ଚାହାନ୍ତି କି?",
        "delete_and_move_confirm": "ହଁ, ଏହି ପୃଷ୍ଠାଟିକୁ ଲିଭାଇଦେବେ",
        "delete_and_move_reason": "\"[[$1]]\" ପାଇଁ ପଥ ସଳଖ କରିବା ନିମନ୍ତେ ଲିଭାଇଦିଆଗଲା",
        "feedback-message": "ଖବର:",
        "feedback-subject": "ବିଷୟ:",
        "feedback-submit": "ଦାଖଲ କରିବା",
-       "feedback-thanks": "ଧନà­\8dà­\9fବାଦ ! à¬\86ପଣà¬\99à­\8dà¬\95ର à¬®à¬¤à¬¾à¬®à¬¤  \"[$2 $1]\" à¬ªà­\83ଷà­\8dଠାରà­\87 à¬¦à¬°à­\8dଶାଯାଇଛି ।",
-       "feedback-thanks-title": "ଧନà­\8dà­\9fବାଦ!",
+       "feedback-thanks": "ସାଧà­\81ବାଦ ! à¬\86ପଣà¬\99à­\8dà¬\95ର à¬®à¬¤à¬¾à¬®à¬¤  \"[$2 $1]\" à¬ªà­\83ଷà­\8dଠାରà­\87 à¬¸à¬¾à¬\87ତାଯାଇଛି ।",
+       "feedback-thanks-title": "ସାଧà­\81ବାଦ!",
        "searchsuggest-search": "ଖୋଜନ୍ତୁ",
        "searchsuggest-containing": "ଖୋଜୁଛି...",
        "api-error-badaccess-groups": "ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।",
index c56ea5d..59f5979 100644 (file)
        "rcshowhideanons": "$1 talagamit a e migpakilala",
        "rcshowhidepatr": "$1 edit a babanten (patrolled edits)",
        "rcshowhidemine": "$1 deng elilan ku",
+       "rcshowhidecategorization-show": "Pakit",
        "rclinks": "Pakit la reng tauling $1 miyalilan anyang tauling $2 aldo<br />$3",
        "diff": "aliwa",
        "hist": "amlat",
        "wlheader-showupdated": "'''Makapal''' la pangasulat deng bulung a miyalilan manibat aniang tauli mu lang pintalan.",
        "wlnote": "{{PLURAL:$1|Ing makatuki ing tauling|Ding makatuki ring tauling '''$1''' miyalilan}} kilub {{PLURAL:$2|ning tauling metung a oras|ding tauling '''$2''' oras}}.",
        "wlshowlast": "Pakit la reng tauling $1 oras $2 aldo",
+       "watchlistall2": "eganagana",
+       "watchlist-hide": "Isalikut",
+       "wlshowtime": "Ipakit ya ing tauli:",
+       "wlshowhideminor": "deng malating edit",
+       "wlshowhidebots": "Deng bot",
+       "wlshowhideanons": "Deng e migpakilalang talagamit",
+       "wlshowhidemine": "Deng kanakung edit",
        "watchlist-options": "Deng maliaring gawan kareng listaan da reng babanten (''watchlist'')",
        "watching": "Babanten...",
        "unwatching": "E ne babanten...",
        "contributions": "Ambag da reng gagamit",
        "contributions-title": "Deng ambag da reng talagamit para king $1",
        "mycontris": "Deng kakung ambag",
+       "anoncontribs": "Deng ambag",
        "contribsub2": "Para $1 ($2)",
        "nocontribs": "Alang pamagbayung pareu/tutud kareng kundisiung deti.",
        "uctop": "(babo)",
        "movelogpagetext": "Makabili ya king lalam ing tala (list) da reng bulung a miyalis.",
        "movereason": "Sangkan:",
        "revertmove": "isubli",
-       "delete_and_move": "Buran at ialis",
        "delete_and_move_text": "==Kailangan ing pamamura==\nAtiu ne ing \"[[:$1]]\" a bulung a puntalan.\nBuri meng buran bang malaus ing pamanales?",
        "delete_and_move_confirm": "Wa, buran ya ing bulung",
        "delete_and_move_reason": "Mebura ya bang malaus ing pamanalis",
index dd04a2b..ccf2843 100644 (file)
@@ -95,7 +95,7 @@
        "tog-showtoolbar": "Pokaż pasek narzędzi",
        "tog-editondblclick": "Podwójne kliknięcie rozpoczyna edycję",
        "tog-editsectiononrightclick": "Kliknięcie prawym klawiszem myszy na tytule sekcji rozpoczyna jej edycję",
-       "tog-watchcreations": "Dodawaj do obserwowanych tworzone przeze mnie strony oraz wgrywane przeze mnie pliki",
+       "tog-watchcreations": "Dodawaj do obserwowanych tworzone przeze mnie strony oraz przesyłane przeze mnie pliki",
        "tog-watchdefault": "Dodawaj do obserwowanych strony i pliki, które edytuję",
        "tog-watchmoves": "Dodawaj do obserwowanych strony i pliki, które przenoszę",
        "tog-watchdeletion": "Dodawaj do obserwowanych strony i pliki, które usuwam",
        "tog-watchlisthidebots": "Ukryj edycje botów na liście obserwowanych",
        "tog-watchlisthideminor": "Ukryj drobne zmiany na liście obserwowanych",
        "tog-watchlisthideliu": "Ukryj edycje zalogowanych użytkowników na liście obserwowanych",
+       "tog-watchlistreloadautomatically": "Automatycznie odświeżaj listę obserwowanych, gdy zmieniany jest filtr (wymagany JavaScript)",
        "tog-watchlisthideanons": "Ukryj edycje anonimowych użytkowników na liście obserwowanych",
        "tog-watchlisthidepatrolled": "Ukryj sprawdzone edycje na liście obserwowanych",
        "tog-watchlisthidecategorization": "Ukryj kategoryzację stron",
        "underline-never": "Nigdy",
        "underline-default": "według ustawień skórki lub przeglądarki",
        "editfont-style": "Styl czcionki w polu edycyjnym:",
-       "editfont-default": "domyślny przeglądarki",
+       "editfont-default": "Domyślny przeglądarki",
        "editfont-monospace": "czcionka o stałej szerokości",
        "editfont-sansserif": "czcionka bezszeryfowa",
        "editfont-serif": "czcionka szeryfowa",
        "morenotlisted": "Nie jest to kompletna lista.",
        "mypage": "Strona",
        "mytalk": "Dyskusja",
-       "anontalk": "Dyskusja tego IP",
+       "anontalk": "Dyskusja",
        "navigation": "Nawigacja",
        "and": "&#32;oraz",
        "qbfind": "Znajdź",
        "databaseerror-query": "Zapytanie: $1",
        "databaseerror-function": "Funkcja: $1",
        "databaseerror-error": "Błąd: $1",
+       "transaction-duration-limit-exceeded": "Aby zapobiec wysokim opóźnieniom replikacji danych, ta transakcja została przerwana. Czas zapisywania ($1) przekroczył limit $2 sekund.\nJeśli modyfikujesz wiele elementów jednocześnie, spróbuj zamiast tego wykonać kilka mniejszych operacji.",
        "laggedslavemode": "Uwaga! Ta strona może nie zawierać najnowszych aktualizacji.",
        "readonly": "Baza danych jest zablokowana",
        "enterlockreason": "Podaj powód zablokowania bazy oraz szacunkowy termin jej odblokowania",
        "missingarticle-rev": "(wersja $1)",
        "missingarticle-diff": "(różnica: $1, $2)",
        "readonly_lag": "Baza danych została automatycznie zablokowana na czas potrzebny do wykonania synchronizacji zmian między serwerem głównym i serwerami pośredniczącymi.",
+       "nonwrite-api-promise-error": "Nagłówek HTTP 'Promise-Non-Write-API-Action' został wysłany, ale zapytanie wykorzystywało moduł API, który modyfikuje dane.",
        "internalerror": "Błąd wewnętrzny",
        "internalerror_info": "Błąd wewnętrzny: $1",
        "internalerror-fatal-exception": "Krytyczny wyjątek typu \"$1\"",
        "title-invalid-interwiki": "Podany tytuł strony zawiera link interwiki, który nie może być używany w tytułach.",
        "title-invalid-talk-namespace": "Żądany tytuł strony dotyczy strony dyskusji, która nie istnieje.",
        "title-invalid-characters": "Żądany tytuł strony zawiera błędne znaki: „$1”.",
+       "title-invalid-relative": "Tytuł zawiera ścieżkę względną (./, ../). Tytuły stron ze ścieżką względną są niedozwolone, gdyż w wielu wypadkach byłyby nieosiągalne dla przeglądarki użytkownika.",
        "title-invalid-magic-tilde": "Żądany tytuł strony zawiera błędną, magiczną sekwencję tyld (<nowiki>~~~</nowiki>)",
-       "title-invalid-too-long": "Podany tytuł strony jest zbyt długi. Nie może mieć więcej niż  {{PLURAL:$1|bajt|bajty|bajtów}} w kodowaniu UTF-8.",
+       "title-invalid-too-long": "Podany tytuł strony jest zbyt długi. Nie może mieć więcej niż $1 {{PLURAL:$1|bajt|bajty|bajtów}} w kodowaniu UTF-8.",
        "title-invalid-leading-colon": "Podany tytuł strony zawiera na początku nieprawidłowy dwukropek.",
        "perfcached": "Poniższe dane są kopią z pamięci podręcznej i mogą być nieaktualne. W pamięci podręcznej {{PLURAL:$1|znajduje|znajdują|znajduje}} się maksymalnie {{PLURAL:$1|jeden wynik|$1 wyniki|$1 wyników}}.",
        "perfcachedts": "Poniższe dane są kopią z pamięci podręcznej. Ostatnia aktualizacja odbyła się $1. W pamięci podręcznej {{PLURAL:$4|znajduje|znajdują|znajduje}} się maksymalnie {{PLURAL:$4|jeden wynik|$4 wyniki|$4 wyników}}.",
        "createaccountreason": "Powód:",
        "createacct-reason": "Powód",
        "createacct-reason-ph": "Dlaczego zakładasz kolejne konto",
-       "createacct-captcha": "Kontrola bezpieczeństwa",
-       "createacct-imgcaptcha-ph": "Wpisz tekst widoczny powyżej",
        "createacct-submit": "Utwórz konto",
        "createacct-another-submit": "Utwórz konto",
        "createacct-benefit-heading": "{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.",
        "wrongpasswordempty": "Wprowadzone hasło jest puste. Spróbuj ponownie.",
        "passwordtooshort": "Hasło musi mieć co najmniej $1 {{PLURAL:$1|znak|znaki|znaków}}.",
        "passwordtoolong": "Hasło nie może być dłuższe niż  {{PLURAL:$1|1 znak|$1 znaków}}.",
+       "passwordtoopopular": "Często wybierane hasła nie mogą być stosowane. Proszę wybrać hasło bardziej unikalne.",
        "password-name-match": "Hasło musi być inne niż nazwa użytkownika.",
        "password-login-forbidden": "Wykorzystanie tej nazwy użytkownika lub hasła zostało zabronione.",
        "mailmypassword": "Zresetuj hasło",
        "passwordreset-emailtext-ip": "Ktoś (prawdopodobnie Ty, spod adresu IP $1) poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}\n\n$2\n\n{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.\nPowinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.",
        "passwordreset-emailtext-user": "Użytkownik $1 poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}\n\n$2\n\n{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.\nPowinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.",
        "passwordreset-emailelement": "Nazwa użytkownika: \n$1\n\nTymczasowe hasło: \n$2",
-       "passwordreset-emailsent": "Jeśli adres e‐mail przypisany do Twojego konta został zarejestrowany, zostanie wysłany e-mail do odzyskiwania hasła.",
+       "passwordreset-emailsentemail": "Jeśli ten adres e‐mail jest przypisany do Twojego konta, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
+       "passwordreset-emailsentusername": "Jeśli z tym kontem powiązany jest adres e‐mail, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
        "passwordreset-emailsent-capture": "Wyświetlony poniżej e‐mail pozwalający na zresetowanie hasła został wysłany.",
        "passwordreset-emailerror-capture": "Poniżej wyświetlony e‐mail pozwalający na zresetowanie hasła został wygenerowany, ale nie udało się wysłać go do {{GENDER:$2|użytkownika|użytkowniczki}}: $1",
        "changeemail": "Zmiana lub usunięcie adresu e‐mail",
-       "changeemail-header": "Zmiana adresu e‐mail",
+       "changeemail-header": "Wypełnij ten formularz, aby zmienić swój adres e-mail. Jeśli chcesz usunąć swój adres e-mail, to przy wypełnianiu formularza pozostaw puste pole nowego adresu e-mail.",
        "changeemail-passwordrequired": "Musisz podać swoje hasło, aby potwierdzić tę zmianę.",
        "changeemail-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.",
        "changeemail-oldemail": "Obecny adres e‐mail:",
        "changeemail-newemail": "Nowy adres e-mail:",
+       "changeemail-newemail-help": "Jeśli chcesz usunąć swój adres e-mail, pozostaw to pole puste. Nie będzie wtedy możliwe zresetowanie zapomnianego hasła, przestaniesz także otrzymywać inne e-maile z tej wiki.",
        "changeemail-none": "(brak)",
        "changeemail-password": "Twoje hasło:",
        "changeemail-submit": "Zmień e-mail",
        "userinvalidcssjstitle": "'''Uwaga:''' Brak skórki o nazwie „$1”.\nStrony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą literą, np. {{ns:user}}:Foo/vector.css, w przeciwieństwie do nieprawidłowego {{ns:user}}:Foo/Vector.css.",
        "updated": "(Zmodyfikowano)",
        "note": "'''Uwaga:'''",
-       "previewnote": "'''To jest tylko podgląd'''\nZmiany nie zostały jeszcze zapisane!",
+       "previewnote": "<strong>To jest tylko podgląd.</strong>\nZmiany nie zostały jeszcze zapisane!",
        "continue-editing": "Przejdź do pola edycji",
        "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.\nSpróbuj jeszcze raz.\nJeśli to nie pomoże – [[Special:UserLogout|wyloguj się]] i zaloguj ponownie.'''",
        "permissionserrors": "Błąd uprawnień",
        "permissionserrorstext": "Nie masz uprawnień do tego działania z {{PLURAL:$1|następującej przyczyny|następujących przyczyn}}:",
        "permissionserrorstext-withaction": "Nie masz uprawnień do $2 z {{PLURAL:$1|następującego powodu|następujących powodów}}:",
+       "contentmodelediterror": "Nie możesz edytować tej wersji, ponieważ model jej zawartości (<code>$1</code>) różni się od obecnego modelu zawartości strony (<code>$2</code>).",
        "recreate-moveddeleted-warn": "'''Uwaga! Zamierzasz utworzyć stronę, która została wcześniej usunięta.'''\n\nUpewnij się, czy ponowne utworzenie tej strony jest uzasadnione.\nPoniżej znajduje się rejestr usunięć i zmian nazwy tej strony:",
        "moveddeleted-notice": "Ta strona została usunięta.\nRejestr usunięć i zmian nazwy tej strony jest pokazany poniżej.",
+       "moveddeleted-notice-recent": "Przepraszamy, ale ta strona została niedawno (w ciągu ostatnich 24 godzin) usunięta. Poniżej znajduje się rejestr usunięć i zmian nazwy tej strony.",
        "log-fulllog": "Pokaż cały rejestr",
        "edit-hook-aborted": "Edycja zatrzymana z powodu haka.\nWystąpił z nieokreślonej przyczyny.",
        "edit-gone-missing": "Nie udało się zaktualizować strony.\nZdaje się, że została skasowana.",
        "showingresultsinrange": "Poniżej wyświetlono co najwyżej {{PLURAL:$1|<strong>1</strong> wynik|<strong>$1</strong> wyniki|<strong>$1</strong> wyników}} w zakresie od <strong>$2</strong> do <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Wynik <strong>$1</strong> z <strong>$3</strong>|Wyniki <strong>$1 - $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Brak wyników spełniających kryteria podane w zapytaniu.",
+       "search-nonefound-thiswiki": "Brak wyników spełniających kryteria podane w zapytaniu.",
        "powersearch-legend": "Wyszukiwanie zaawansowane",
        "powersearch-ns": "Przeszukaj przestrzenie nazw:",
        "powersearch-togglelabel": "Zaznacz:",
        "prefs-help-recentchangescount": "Uwzględnia ostatnie zmiany, historię stron i rejestry.",
        "prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez Ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli musisz go zresetować]].",
        "savedprefs": "Twoje preferencje zostały zapisane.",
+       "savedrights": "Zapisano uprawnienia {{GENDER:$1|użytkownika $1|użytkowniczki $1}}.",
        "timezonelegend": "Strefa czasowa:",
        "localtime": "Czas lokalny:",
        "timezoneuseserverdefault": "Użyj domyślnej dla tej wiki ($1)",
        "prefs-help-prefershttps": "Ta opcja zacznie działać przy twoim następnym zalogowaniu.",
        "prefswarning-warning": "Niektóre z dokonanych zmian w preferencjach nie zostały jeszcze zapisane. Jeśli wyjdziesz bez wciśnięcia „$1”, Twoje zmiany zostaną utracone.",
        "prefs-tabs-navigation-hint": "Wskazówka: do poruszania się między zakładkami możesz użyć klawiszy strzałek w lewo i w prawo",
-       "email-address-validity-valid": "Wygląda na prawidłowy",
-       "email-address-validity-invalid": "Wymagany jest prawidłowy adres!",
        "userrights": "Zarządzanie uprawnieniami użytkowników",
        "userrights-lookup-user": "Zarządzaj grupami użytkownika",
        "userrights-user-editname": "Wprowadź nazwę użytkownika:",
        "right-viewmyprivateinfo": "Podgląd swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)",
        "right-editmyprivateinfo": "Edycja swoich prywatnych danych (np. adres e-mail, prawdziwe imię i nazwisko)",
        "right-editmyoptions": "Edycja swoich preferencji",
-       "right-rollback": "Szybkie wycofanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował stronę",
+       "right-rollback": "Szybkie wycofywanie zmian wprowadzonych przez użytkownika, który jako ostatni edytował stronę",
        "right-markbotedits": "Oznaczanie rewertu jako edycji bota",
        "right-noratelimit": "Brak ograniczeń przepustowości",
        "right-import": "Importowanie stron z innych wiki",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (zobacz też [[Special:NewPages|listę nowych stron]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Pokaż",
        "rcnotefrom": "Poniżej {{PLURAL:$5|pokazano zmianę|pokazano zmiany}} {{PLURAL:$5|wykonaną|wykonane}} po <strong>$3, $4</strong> (nie więcej niż '''$1''' pozycji).",
        "rclistfrom": "Pokaż nowe zmiany od $3 $2",
-       "rcshowhideminor": "$1 drobne zmiany",
+       "rcshowhideminor": "$1 drobne edycje",
        "rcshowhideminor-show": "Pokaż",
        "rcshowhideminor-hide": "Ukryj",
        "rcshowhidebots": "$1 boty",
        "recentchanges-page-added-to-category-bundled": "dodano [[:$1]] oraz {{PLURAL:$2|jedną stronę|$2 strony|$2 stron}} do kategorii",
        "recentchanges-page-removed-from-category": "usunięto [[:$1]] z kategorii",
        "recentchanges-page-removed-from-category-bundled": "usunięto [[:$1]] oraz {{PLURAL:$2|jedną stronę|$2 strony|$2 stron}} z kategorii",
+       "autochange-username": "Automatyczna zmiana MediaWiki",
        "upload": "Prześlij plik",
        "uploadbtn": "Prześlij plik",
        "reuploaddesc": "Przerwij wysyłanie i wróć do formularza wysyłki",
        "uploaddisabledtext": "Możliwość przesyłania plików została wyłączona.",
        "php-uploaddisabledtext": "Przesyłanie plików PHP zostało zablokowane. Sprawdź ustawienie „file_uploads”.",
        "uploadscripted": "Plik zawiera kod HTML lub skrypt, który może zostać błędnie zinterpretowany przez przeglądarkę internetową.",
+       "uploaded-script-svg": "Znaleziono element skryptowy „$1” we przesyłanym pliku SVG.",
+       "uploaded-hostile-svg": "Znaleziono niebezpieczny kod CSS w przesyłanym pliku SVG.",
        "uploadscriptednamespace": "Ten plik SVG zawiera niedozwoloną przestrzeń nazw '$1'",
        "uploadinvalidxml": "Nie udało się przeanalizować XML w załadowanym pliku.",
        "uploadvirus": "W pliku jest wirus! Szczegóły: $1",
        "upload-options": "Opcje przesyłania",
        "watchthisupload": "Obserwuj ten plik",
        "filewasdeleted": "Plik o tej nazwie istniał, ale został usunięty.\nZanim załadujesz go ponownie, sprawdź $1.",
+       "filename-thumb-name": "Nazwa pliku wskazuje na to, że próbujesz przesłać miniaturkę obrazka. Prosimy nie przesyłać miniaturek w ramach tej samej wiki. Jeśli jest to konieczne, to zmień nazwę na bardziej opisową (w szczególności taką, w której nie ma prefiksu typowego dla miniaturek).",
        "filename-bad-prefix": "Nazwa pliku, który przesyłasz, zaczyna się od '''„$1”'''. Jest to nazwa zazwyczaj przypisywana automatycznie przez cyfrowe aparaty fotograficzne, która nie informuje o zawartości pliku.\nZmień nazwę pliku na bardziej opisową.",
        "filename-prefix-blacklist": " #<!-- nie modyfikuj tej linii --> <pre>\n# Składnia jest następująca:\n#  * Wszystko od znaku \"#\" do końca linii uznawane jest za komentarz\n#  * Każda niepusta linia zawiera początek nazwy pliku domyślnie wykorzystywany przez aparaty cyfrowe\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # niektóre telefony komórkowe\nIMG # ogólny\nJD # Jenoptik\nMGP # Pentax\nPICT # wiele różnych\n  #</pre> <!-- nie modyfikuj tej linii -->",
        "upload-success-subj": "Przesłanie pliku powiodło się",
        "foreign-structured-upload-form-label-own-work": "To moja własna praca",
        "foreign-structured-upload-form-label-infoform-categories": "Kategorie",
        "foreign-structured-upload-form-label-infoform-date": "Data",
-       "foreign-structured-upload-form-label-own-work-message-local": "Potwierdzam, że wysyłam ten plik zgodnie z warunkami i zasadami licencjowania obowiązującymi na {{SITENAME}}.",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potwierdzam, że wysyłam ten plik zgodnie z warunkami i zasadami licencjonowania obowiązującymi na {{SITENAME}}.",
        "foreign-structured-upload-form-label-not-own-work-message-local": "Jeśli nie możesz wysłać tego pliku zgodnie z zasadami obowiązującymi na {{SITENAME}}, zamknij ten komunikat i spróbuj innej metody.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Możesz skorzystać też z [[Special:Upload|domyślnej strony przesyłania plików]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Rozumiem, że przesyłam ten plik do współdzielonego repozytorium. Potwierdzam, że robię to zgodnie z warunkami i zasadami licencjonowania tam obowiązującymi.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Jeśli nie jesteś w stanie przesłać tego pliku zgodnie z zasadami współdzielonego repozytorium, zamknij to okno i spróbuj innej metody.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Możesz spróbować użyć [[Special:Upload|strony przesyłania plików {{GRAMMAR:D.lp|{{SITENAME}}}}]], jeżeli zasady tej strony dopuszczają publikację tego pliku.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Oświadczam, że mam prawa autorskie do tego pliku, nieodwołalnie publikuję go na Wikimedia Commons na licencji [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0] i zgadzam się na [https://wikimediafoundation.org/wiki/Terms_of_Use warunki użytkowania].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Jeżeli nie masz praw autorskich do tego pliku albo chcesz go opublikować na innej licencji, rozważ użycie [https://commons.wikimedia.org/wiki/Special:UploadWizard kreatora przesyłania plików].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Możesz spróbować użyć [[Special:Upload|strony przesyłania plików {{GRAMMAR:D.lp|{{SITENAME}}}}]], jeżeli zasady tej strony dopuszczają publikację tego pliku.",
+       "foreign-structured-upload-form-2-label-intro": "Dziękujemy za przesłanie pliku na {{GRAMMAR:B.lp|{{SITENAME}}}}. Zanim kontynuujesz, upewnij się, że spełnia poniższe warunki:",
+       "foreign-structured-upload-form-2-label-ownwork": "Musi być w całości <strong>Twoją pracą</strong>, a nie pobrany z Internetu",
+       "foreign-structured-upload-form-2-label-noderiv": "<strong>Nie może</strong> zawierać fragmentów <strong>cudzych prac</strong> ani być nimi zainspirowany",
+       "foreign-structured-upload-form-2-label-useful": "Musi mieć <strong>wartość edukacyjną</strong> i ułatwiać przekazywanie wiedzy",
+       "foreign-structured-upload-form-2-label-ccbysa": "Musi być możliwe <strong>udostępnienie go na zawsze</strong> w Internecie na licencji [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0]",
+       "foreign-structured-upload-form-2-label-alternative": "Jeśli nie wszystkie z tych warunków są spełnione, być może możesz mimo wszystko przesłać go za pomocą [https://commons.wikimedia.org/wiki/Special:UploadWizard kreatora przesyłania plików Commons], o ile jest udostępniony na wolnej licencji.",
+       "foreign-structured-upload-form-2-label-termsofuse": "Przesyłając plik, oświadczasz, że masz prawa autorskie do tego pliku, nieodwołalnie publikujesz go na Wikimedia Commons na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 i zgadzasz się na [https://wikimediafoundation.org/wiki/Terms_of_Use warunki użytkowania].",
+       "foreign-structured-upload-form-3-label-question-website": "Czy {{GENDER:|pobrałeś|pobrałaś|pobrałeś/aś}} tę grafikę ze strony internetowej lub wyszukiwarki grafiki?",
+       "foreign-structured-upload-form-3-label-question-ownwork": "Czy {{GENDER:|stworzyłeś|stworzyłaś|stworzyłeś/aś}} tę grafikę ({{GENDER:|zrobiłeś|zrobiłaś|zrobiłeś/aś}} zdjęcie, {{GENDER:|naszkicowałeś|naszkicowałaś|naszkicowałeś/aś}} rysunek, itp.)  {{GENDER:|samemu|samej|samemu/samej}}?",
+       "foreign-structured-upload-form-3-label-question-noderiv": "Czy zawiera fragmenty cudzych prac (np. logo) lub jest nimi zainspirowana?",
+       "foreign-structured-upload-form-3-label-yes": "Tak",
+       "foreign-structured-upload-form-3-label-no": "Nie",
        "backend-fail-stream": "Nie można odczytać pliku $1.",
        "backend-fail-backup": "Nie można utworzyć kopii zapasowej pliku  $1 .",
        "backend-fail-notexists": "Plik  $1  nie istnieje.",
        "mostrevisions": "Strony o największej liczbie wersji",
        "prefixindex": "Wszystkie strony o prefiksie",
        "prefixindex-namespace": "Wszystkie strony z prefiksem (przestrzeń nazw $1)",
+       "prefixindex-submit": "Pokaż",
        "prefixindex-strip": "Ukryj prefiks na liście wyników",
        "shortpages": "Najkrótsze strony",
        "longpages": "Najdłuższe strony",
        "protectedpages-performer": "Użytkownik zabezpieczający",
        "protectedpages-params": "Parametry zabezpieczenia",
        "protectedpages-reason": "Powód",
+       "protectedpages-submit": "Wyświetl strony",
        "protectedpages-unknown-timestamp": "Nieznane",
        "protectedpages-unknown-performer": "Użytkownik nieznany",
        "protectedtitles": "Zabezpieczone nazwy stron",
        "protectedtitles-summary": "Ta strona zawiera listę tytułów, których utworzenie jest obecnie zabronione. Aby zobaczyć listę istniejących stron, które są chronione, zobacz [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Dla tych ustawień dopuszczalne jest utworzenie stron o dowolnej nazwie.",
+       "protectedtitles-submit": "Wyświetl tytuły",
        "listusers": "Lista użytkowników",
        "listusers-editsonly": "Pokaż tylko użytkowników z edycjami",
        "listusers-creationsort": "Sortuj według daty utworzenia",
        "usereditcount": "$1 {{PLURAL:$1|edycja|edycje|edycji}}",
        "usercreated": "{{GENDER:$3|Utworzył|Utworzyła|Utworzone}} $1 o $2",
        "newpages": "Nowe strony",
+       "newpages-submit": "Pokaż",
        "newpages-username": "Nazwa użytkownika:",
        "ancientpages": "Najstarsze strony",
        "move": "Przenieś",
        "nopagetext": "Wybrana strona docelowa nie istnieje.",
        "pager-newer-n": "{{PLURAL:$1|1 nowszy|$1 nowsze|$1 nowszych}}",
        "pager-older-n": "{{PLURAL:$1|1 starszy|$1 starsze|$1 starszych}}",
-       "suppress": "Rewizor",
+       "suppress": "Ukryj (oversight)",
        "querypage-disabled": "Ta strona specjalna została wyłączona ze względu na ograniczenia wydajności.",
        "apihelp": "Pomoc API",
        "apihelp-no-such-module": "Moduł \"$1\" nie znaleziony.",
        "booksources-text": "Poniżej znajduje się lista odnośników do innych witryn, które pośredniczą w sprzedaży nowych i używanych książek, a także mogą posiadać dalsze informacje na temat poszukiwanej przez Ciebie książki.",
        "booksources-invalid-isbn": "Podany numer ISBN został rozpoznany jako nieprawidłowy. Sprawdź czy podany numer zgadza się z numerem zaczerpniętym ze źródła.",
        "specialloguserlabel": "Kto:",
-       "speciallogtitlelabel": "Co (tytuł lub użytkownik):",
+       "speciallogtitlelabel": "Co (tytuł lub {{ns:user}}:nick użytkownika):",
        "log": "Rejestr operacji",
+       "logeventslist-submit": "Pokaż",
        "all-logs-page": "Wszystkie publiczne operacje",
        "alllogstext": "Wspólny rejestr wszystkich typów operacji dla {{GRAMMAR:D.lp|{{SITENAME}}}}.\nMoż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.",
        "allpages": "Wszystkie strony",
        "nextpage": "Następna strona ($1)",
        "prevpage": "Poprzednia strona ($1)",
-       "allpagesfrom": "Strony o tytułach rozpoczynających się od:",
-       "allpagesto": "Strony o tytułach kończących się na:",
+       "allpagesfrom": "Wyświetl strony, zaczynając od:",
+       "allpagesto": "Wyświetl strony, kończąc na:",
        "allarticles": "Wszystkie artykuły",
        "allinnamespace": "Wszystkie strony (w przestrzeni nazw $1)",
        "allpagessubmit": "Pokaż",
        "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.",
        "categories": "Kategorie",
+       "categories-submit": "Pokaż",
        "categoriespagetext": "Strona przedstawia {{PLURAL:$1|kategorię zawierającą|listę kategorii zawierających}} strony lub pliki.\n[[Special:UnusedCategories|Nieużywane kategorie]] zostały ukryte.\nZobacz również [[Special:WantedCategories|brakujące kategorie]].",
        "categoriesfrom": "Wyświetl kategorie, zaczynając od:",
        "special-categories-sort-count": "sortowanie według liczby",
        "activeusers-hidebots": "Ukryj boty",
        "activeusers-hidesysops": "Ukryj administratorów",
        "activeusers-noresult": "Nie odnaleziono żadnego użytkownika.",
+       "activeusers-submit": "Wyświetl aktywnych użytkowników",
        "listgrouprights": "Uprawnienia grup użytkowników",
        "listgrouprights-summary": "Poniżej znajduje się spis zdefiniowanych na tej wiki grup użytkowników, z wyszczególnieniem przydzielonych im uprawnień.\nSprawdź stronę z [[{{MediaWiki:Listgrouprights-helppage}}|dodatkowymi informacjami]] o uprawnieniach.",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Przyznane uprawnienie</span>\n* <span class=\"listgrouprights-revoked\">Odebrane uprawnienie</span>",
        "wlheader-showupdated": "'''Wytłuszczone''' zostały strony, które zostały zmodyfikowane od Twojej ostatniej wizyty na nich.",
        "wlnote": "Poniżej pokazano {{PLURAL:$1|zmianę wykonaną|<strong>$1</strong> zmiany wykonane|<strong>$1</strong> zmian wykonanych}} w ciągu {{PLURAL:$2|ostatniej godziny|ostatnich <strong>$2</strong> godzin}}, licząc od $4 dnia $3.",
        "wlshowlast": "Pokaż ostatnie $1 godzin, $2 dni",
+       "watchlistall2": "wszystkie",
+       "watchlist-hide": "Ukryj",
+       "watchlist-submit": "Pokaż",
+       "wlshowtime": "Okres czasu do wyświetlania:",
+       "wlshowhideminor": "drobne edycje",
+       "wlshowhidebots": "boty",
+       "wlshowhideliu": "zarejestrowanych",
+       "wlshowhideanons": "anonimowych",
+       "wlshowhidepatr": "sprawdzone edycje",
+       "wlshowhidemine": "moje edycje",
        "watchlist-options": "Opcje obserwowanych",
        "watching": "Dodaję do obserwowanych...",
        "unwatching": "Przestaję obserwować...",
        "deletepage": "Usuń stronę",
        "confirm": "Potwierdź",
        "excontent": "treść: „$1”",
-       "excontentauthor": "treść: „$1” (jedyny autor: [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "treść: „$1”, jedyny autor: „[[Special:Contributions/$2|$2]]” ([[User talk:$2|dyskusja]])",
        "exbeforeblank": "poprzednia zawartość, obecnie pustej strony: „$1”",
        "delete-confirm": "Usuwanie „$1”",
        "delete-legend": "Usuń",
        "historywarning": "<strong>Uwaga:</strong> Strona, którą chcesz usunąć, ma {{PLURAL:$1|jedną starszą wersję|$1 starsze wersje|$1 starszych wersji}}:",
+       "historyaction-submit": "Pokaż",
        "confirmdeletetext": "Zamierzasz usunąć stronę razem z całą dotyczącą jej historią.\nUpewnij się, czy na pewno chcesz to zrobić, że rozumiesz konsekwencje i że robisz to w zgodzie z [[{{MediaWiki:Policy-url}}|zasadami]].",
        "actioncomplete": "Operacja wykonana",
        "actionfailed": "Operacja się nie powiodła",
        "changecontentmodel-cannot-convert": "Zawartość [[:$1]] nie może być przekształcona do typu $2.",
        "changecontentmodel-nodirectediting": "Model zawartości $1 nie obsługuje bezpośredniego edytowania",
        "log-name-contentmodel": "Rejestr zmian modelu zawartości",
+       "log-description-contentmodel": "Wydarzenia związane z modelami zawartości stron",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|zmienił|zmieniła}} model zawartości strony $3 z \"$4\" na \"$5\"",
        "logentry-contentmodel-change-revertlink": "Przywróć",
        "logentry-contentmodel-change-revert": "Przywróć",
        "protectlogpage": "Zabezpieczone",
        "contributions": "Wkład {{GENDER:$1|użytkownika|użytkowniczki}}",
        "contributions-title": "Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1",
        "mycontris": "Edycje",
+       "anoncontribs": "Edycje",
        "contribsub2": "Dla {{GENDER:$3|użytkownika|użytkowniczki}} $1 ($2)",
        "contributions-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
        "nocontribs": "Brak zmian odpowiadających tym kryteriom.",
        "whatlinkshere-hidelinks": "$1 linki",
        "whatlinkshere-hideimages": "$1 linki z plików",
        "whatlinkshere-filters": "Filtry",
+       "whatlinkshere-submit": "Dalej",
        "autoblockid": "automatyczna blokada nr $1",
        "block": "Zablokuj użytkownika",
        "unblock": "Odblokuj użytkownika",
        "movenosubpage": "Ta strona nie posiada podstron.",
        "movereason": "Powód:",
        "revertmove": "cofnij",
-       "delete_and_move": "Usuń i przenieś",
        "delete_and_move_text": "== Przeniesienie wymaga usunięcia innej strony ==\nStrona docelowa „[[:$1]]” istnieje.\nCzy chcesz ją usunąć, by zrobić miejsce dla przenoszonej strony?",
        "delete_and_move_confirm": "Tak, usuń stronę",
        "delete_and_move_reason": "Usunięto, by zrobić miejsce dla przenoszonej strony „[[$1]]”",
        "tooltip-pt-preferences": "Moje preferencje",
        "tooltip-pt-watchlist": "Lista stron obserwowanych przez Ciebie",
        "tooltip-pt-mycontris": "Lista moich edycji",
+       "tooltip-pt-anoncontribs": "Lista edycji wykonanych z tego adresu IP",
        "tooltip-pt-login": "Zachęcamy do zalogowania się, choć nie jest to obowiązkowe.",
        "tooltip-pt-logout": "Wyloguj",
        "tooltip-pt-createaccount": "Zachęcamy do stworzenia konta i zalogowania, ale nie jest to konieczne.",
        "pageinfo-robot-index": "Dozwolone",
        "pageinfo-robot-noindex": "Niedozwolone",
        "pageinfo-watchers": "Liczba obserwujących",
+       "pageinfo-visiting-watchers": "Liczba obserwujących stronę, którzy ostatnio ją odwiedzili",
        "pageinfo-few-watchers": "Mniej niż $1 {{PLURAL:$1|obserwujący|obserwujących}}",
        "pageinfo-redirects-name": "Liczba przekierowań do tej strony",
        "pageinfo-subpages-name": "Liczba podstron tej strony",
        "exif-compression-4": "CCITT Grupa 4 kodowanie faksowe",
        "exif-copyrighted-true": "Chronione prawem autorskim",
        "exif-copyrighted-false": "Status praw autorskich nieznany",
+       "exif-photometricinterpretation-1": "Czarny i biały (czarny to 0)",
        "exif-unknowndate": "nieznana data",
        "exif-orientation-1": "normalna",
        "exif-orientation-2": "odbicie lustrzane w poziomie",
        "confirmemail_text": "Projekt {{SITENAME}} wymaga weryfikacji adresu e‐mail przed użyciem funkcji korzystających z poczty.\nWciśnij przycisk poniżej aby wysłać na swój adres list z linkiem do strony WWW.\nList będzie zawierał link do strony, w którym zakodowany będzie identyfikator.\nOtwórz ten link w przeglądarce, czym potwierdzisz, że jesteś użytkownikiem tego adresu e‐mail.",
        "confirmemail_pending": "Kod potwierdzenia został właśnie do Ciebie wysłany. Jeśli zarejestrował{{GENDER:|eś|aś|eś(‐aś)}} się niedawno, poczekaj kilka minut na dostarczenie wiadomości przed kolejną prośbą o wysłanie kodu.",
        "confirmemail_send": "Wyślij kod potwierdzenia",
-       "confirmemail_sent": "Wiadomość e‐mail z kodem uwierzytelniającym została wysłana.",
+       "confirmemail_sent": "Wiadomość z kodem uwierzytelniającym została wysłana.",
        "confirmemail_oncreate": "Link z kodem potwierdzenia został wysłany na Twój adres e‐mail.\nKod ten nie jest wymagany do zalogowania się, jednak będziesz musiał go aktywować otwierając, otrzymany link, w przeglądarce przed włączeniem niektórych opcji e‐mail na wiki.",
        "confirmemail_sendfailed": "Nie udało się wysłać potwierdzającej wiadomości e‐mail.\nSprawdź poprawność adresu pod kątem literówki.\n\nSystem pocztowy zwrócił komunikat: $1",
        "confirmemail_invalid": "Błędny kod potwierdzenia.\nKod może być przedawniony.",
        "htmlform-cloner-required": "Wymagana jest co najmniej jedna wartość.",
        "htmlform-title-badnamespace": "[[:$1]] nie znajduje się w przestrzeni nazw „{{ns:$2}}”.",
        "htmlform-title-not-creatable": "Nie można użyć „$1” do utworzenia tytułu strony",
-       "htmlform-title-not-exists": "[[:$1]] nie istnieje.",
+       "htmlform-title-not-exists": "$1 nie istnieje.",
        "htmlform-user-not-exists": "<strong>$1</strong> nie istnieje.",
        "htmlform-user-not-valid": "<strong>$1</strong> nie jest prawidłową nazwą użytkownika.",
        "sqlite-has-fts": "$1 z obsługą pełnotekstowego wyszukiwania",
        "logentry-suppress-block": "$1 {{GENDER:$2|zablokował|zablokowała}} {{GENDER:$4|$3}}, czas blokady: $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|zmienił|zmieniła}} ustawienia blokady dla {{GENDER:$4|$3}}, czas blokady: $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|zaimportował|zaimportowała}} $3 poprzez przesłanie pliku",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|zaimportował|zaimportowała|zaimportował(a)}} $3 poprzez przesłanie pliku ($4 {{PLURAL:$4|wersja|wersje|wersji}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|zaimportował|zaimportowała}} $3 z innej wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|zaimportował|zaimportowała|zaimportował(a)}} $3 z $5 ($4 {{PLURAL:$4|wersja|wersje|wersji}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|scalił|scaliła}} stronę $3 do $4 (wersje do $5)",
        "logentry-move-move": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 do $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4, bez pozostawienia przekierowania pod starym tytułem",
        "json-error-syntax": "Błąd składni",
        "json-error-utf8": "Nieprawidłowe znaki UTF-8, prawdopodobnie niepoprawnie zakodowane",
        "json-error-recursion": "Jedno lub więcej rekurencyjnych odniesień musi być zakodowane.",
+       "json-error-inf-or-nan": "W wartości do zakodowania występuje co najmniej jedna wartość NAN lub INF",
        "json-error-unsupported-type": "Podano wartość typu, która nie mogła być kodowana",
        "headline-anchor-title": "Link do tej sekcji",
        "special-characters-group-latin": "Łacińskie",
index f3f39a9..b07c9c7 100644 (file)
@@ -12,6 +12,7 @@
        "tog-hideminor": "په وروستيو بدلونو کې واړه سمونونه پټول",
        "tog-hidepatrolled": "په وروستيو بدلونونو کې څارل شوې سمونونه پټول",
        "tog-newpageshidepatrolled": "د نوؤ مخونو په لړليک کې کتل شوي مخونه پټول",
+       "tog-hidecategorization": "په وېشنيزو کې د مخونو وېشنه پټول",
        "tog-extendwatchlist": "يوازې د وروستني بدلونونو د ښکاره کولو لپاره نه بلکه د ټولو بدلونونو د ښکاره کولو لپاره کتنلړ غځول",
        "tog-usenewrc": "په کتنلړ او وروستي بدلونو مخ باندې ډله ايز بدلونونه",
        "tog-numberheadings": "د سرليکونو خپلکاره شمېرايښودنه",
        "tog-watchlisthidebots": "په کتنلړ کې د روباټ سمونې پټول",
        "tog-watchlisthideminor": "په کتنلړ کې وړې سمونې پټول",
        "tog-watchlisthideliu": "په کتنلړ کې د ثبت شويو کارنانو سمونې پټول",
+       "tog-watchlistreloadautomatically": "هرکله چې يو چاڼگر بدلېږي، کتنلړ دې هم په خپلکاره توگه بيابرسېره شي. (د جاواسکرېپټ اړتيا)",
        "tog-watchlisthideanons": "په کتنلړ کې د ورکنومو کارنانو سمونې پټول",
        "tog-watchlisthidepatrolled": "په کتنلړ کې څارل شوې سمونې پټول",
+       "tog-watchlisthidecategorization": "په وېشنيزو کې د مخونو وېشنه پټول",
        "tog-ccmeonemails": "هغه برېښليکونه چې زه يې نورو ته لېږم، د هغو يوه کاپي دې ماته هم راشي",
        "tog-diffonly": "د توپيرونو نه لاندې د مخ مېنځپانگه پټول",
        "tog-showhiddencats": "پټې وېشنيزې ښکاره کول",
        "index-category": "ليکلړلرونکي مخونه",
        "noindex-category": "بې ليکلړه مخونه",
        "broken-file-category": "د دوتنو د ماتو تړنو مخونه",
+       "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "په اړه",
        "article": "مېنځپانگيز مخ",
        "newwindow": "(په نوې کړکۍ کې پرانيستل کېږي)",
        "morenotlisted": "دا لړليک بشپړ نه دی",
        "mypage": "زما مخ",
        "mytalk": "خبرې اترې",
-       "anontalk": "ددÛ\90 IP Ø®Ø¨Ø±Û\90 Ø§ØªØ±Û\90",
+       "anontalk": "خبرې اترې",
        "navigation": "گرځښت",
        "and": "&#32;او",
        "qbfind": "موندل",
        "newpage": "نوی مخ",
        "talkpage": "د دې مخ په اړه خبرې اترې کول",
        "talkpagelinktext": "خبرې اترې",
-       "specialpage": "Ú\81اÙ\86Ú¯Ú\93Û\90 Ù¾Ø§Ú¼Ù\87",
+       "specialpage": "Ú\81اÙ\86Ú¯Ú\93Û\8c Ù\85Ø®",
        "personaltools": "شخصي اوزار",
        "articlepage": "د مخ مېنځپانگه ښکاره کول",
        "talk": "خبرې اترې",
        "versionrequired": "د ميډياويکي $1 بڼې ته اړتيا ده",
        "versionrequiredtext": "د دې مخ په ليدلو کې د مېډياويکي $1 بڼې ته اړتيا ده. \n[[Special:Version|د بڼې مخ وگورۍ]].",
        "ok": "ښه",
+       "pagetitle": "$1 - {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "\"$1\" نه اخيستل شوی",
        "youhavenewmessages": "تاسې $1 لری  ($2).",
        "youhavenewmessagesfromusers": "تاسې د {{PLURAL:$3|يو بل کارن|$3 کارنانو}} لخوا $1 لرۍ ($2).",
        "viewsource-title": "د $1 سرچينه کتل",
        "actionthrottled": "د دې کړنې مخنيوی وشو",
        "protectedpagetext": "دا مخ د سمون او نورو کړنو د ترسره کولو په تکل ژغورل شوی.",
-       "viewsourcetext": "تاسې د دې مخ سرچينه کتلی او لمېسلی شی:",
-       "viewyourtext": "تاسې په دې مخ کې د '''خپلو سمونونو''' سرچينه کتلی او لمېسلی شی:",
+       "viewsourcetext": "تاسې د دې مخ سرچينه کتلی او لمېسلی شی.",
+       "viewyourtext": "په دې مخ کې <strong>تاسې د خپلو سمونونو</strong> سرچينه کتلی او لمېسلی شی.",
        "protectedinterface": "دا مخ د دې ويکي د ساوترې د ليدنمخ متن لري، او د ورانکارۍ په خاطر ژغورل شوی.\nپه ټولو ويکي گانو کې د ژباړې د ورگډولو او يا هم د ژباړې د سمون او بدلون لپاره د مېډياويکي د ځايتابه پروژه [//translatewiki.net/ translatewiki.net] وکاروۍ.",
        "editinginterface": "<strong>گواښنه:</strong> تاسې چې په دې مخ کې بدلون راولۍ همدا مخ د يوې ساوترې د ليدنمخ متن په توگه کارېږي.\nد دې مخ بدلون به د ټولو کارنانو لپاره د ليدنمخ بڼه اغېزمنه کړي.",
        "namespaceprotected": "تاسې د '''$1''' په نوم-تشيال کې د مخونو د سمولو اجازه نه لرۍ.",
        "yourname": "کارن-نوم:",
        "userlogin-yourname": "کارن-نوم",
        "userlogin-yourname-ph": "کارن-نوم مو وليکئ",
-       "createacct-another-username-ph": "كارن نوم مو وركړۍ",
+       "createacct-another-username-ph": "كارن نوم مو وركړئ",
        "yourpassword": "پټنوم:",
        "userlogin-yourpassword": "پټنوم",
        "userlogin-yourpassword-ph": "پټنوم مو وليکئ",
        "createacct-emailrequired": "برېښليک پته",
        "createacct-emailoptional": "برېښليک پته (اختياري)",
        "createacct-email-ph": "برېښليک پته مو وټاپئ",
-       "createacct-another-email-ph": "برېښليک پته مو ورکړۍ",
+       "createacct-another-email-ph": "برېښليک پته مو ورکړئ",
        "createaccountmail": "يو لنډمهاله ناټاکلی پټنوم کارول او ځانگړې شوې برېښليک پتې ته ورلېږل",
        "createacct-realname": "آر نوم (اختياري)",
        "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
-       "createacct-reason-ph": "ولې تاسې بل گڼون جوړول غوااړۍ",
-       "createacct-captcha": "امنيتي تدبير",
-       "createacct-imgcaptcha-ph": "پورته ښکاره شوی متن دلته وټاپئ",
+       "createacct-reason-ph": "تاسې ولې بل گڼون جوړوئ؟",
        "createacct-submit": "گڼون مو جوړ کړئ",
        "createacct-another-submit": "گڼون جوړول",
-       "createacct-benefit-heading": "{{SITENAME}} ستاسې په شان خلکو لخوا جوړ شوی.",
+       "createacct-benefit-heading": "{{SITENAME}} ستاسې په څېر خلکو جوړ کړی.",
        "createacct-benefit-body1": "{{PLURAL:$1|سمون|سمونونه}}",
        "createacct-benefit-body2": "{{PLURAL:$1|مخ|مخونه}}",
        "createacct-benefit-body3": "{{PLURAL:$1|وروستنی ونډه وال|وروستني ونډه وال}}",
        "user-mail-no-addy": "د يوې برېښليک پتې پرته د برېښليک لېږلو هڅه شوې.",
        "changepassword": "پټنوم بدلول",
        "resetpass_announce": "د ننوتلو د بشپړېدلو لپاره بايد تاسې يو نوی پټنوم وټاکئ.",
+       "resetpass_text": "<!-- متن مو دلته وليکئ -->",
        "resetpass_header": "د گڼون پټنوم بدلول",
        "oldpassword": "زوړ پټنوم:",
        "newpassword": "نوی پټنوم:",
        "passwordreset-email": "برېښليک پته:",
        "passwordreset-emailtitle": "د {{SITENAME}} د گڼون څرگندنې",
        "passwordreset-emailelement": "کارن-نوم: \n$1\n\nلنډمهاله پټنوم: \n$2",
-       "passwordreset-emailsent": "د پټنوم بيا پرځای کېدنې لپاره برېښليک درولېږل شو.",
+       "passwordreset-emailsentemail": "د پټنوم بيا پرځای کېدنې لپاره برېښليک درولېږل شو.",
        "passwordreset-emailsent-capture": "د پټنوم بياپرځای کېدنې لپار مو يو برېښليک درولېږه، برېښليک په لاندې توگه ښودل شوی.",
-       "changeemail": "برېښليک پته بدلول",
+       "changeemail": "برېښليک پته بدلول يا ليرې کول",
        "changeemail-header": "د گڼون برېښليک پته بدلول",
        "changeemail-no-info": "دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.",
        "changeemail-oldemail": "اوسنۍ برېښليک پته:",
        "headline_tip": "د ۲ کچې سرليک",
        "nowiki_sample": "دلته دې بې بڼې متن ځای پر ځای شي",
        "nowiki_tip": "د ويکي بڼه نيونه بابېزه گڼل",
+       "image_sample": "Example.jpg",
        "image_tip": "خښه شوې دوتنه",
+       "media_sample": "Example.ogg",
        "media_tip": "د دوتنې تړنه",
        "sig_tip": "ستاسې لاسليک د وخت د ټاپې سره",
        "hr_tip": "څنډيزه ليکه (ددې په کارولو کې سپما وکړۍ)",
        "summary": "لنډيز:",
-       "subject": "سکالو/سرليک:",
+       "subject": "سکالو:",
        "minoredit": "دا يو وړوکی سمون دی",
        "watchthis": "همدا مخ کتل",
        "savearticle": "مخ خوندي کول",
        "anonpreviewwarning": "''تاسې غونډال ته نه ياست ننوتي. خوندي کولو سره به ستاسې IP پته به د دې مخ د سمونونو په پېښليک کې ثبت شي.''",
        "missingcommenttext": "لطفاً تبصره لاندې وليکۍ.",
        "summary-preview": "د لنډيز مخليدنه:",
-       "subject-preview": "سکاÙ\84Ù\88/سرÙ\84Ù\8aÚ© مخليدنه:",
+       "subject-preview": "د Ø³Ú©Ø§Ù\84Ù\88 مخليدنه:",
        "previewerrortext": "د بدلونونو د مخليدنو په وخت کې مو يوه ستونزه رامېنځ ته شوه.",
        "blockedtitle": "پر کارن بنديز لگېدلی",
        "blockedtext": "'''ستاسې د کارن-نوم يا آی پي پتې مخنيوی شوی.'''\n\nهمدا بنديز د $1 له خوا پر تاسې لږېدلی. او د همدې کړنې سبب ''$2'' دی.\n\n* د بنديز د پېل نېټه: $8\n* د بنديز د پای نېټه: $6\n* بنديزونه دي پر: $7\n\nتاسې کولای شی چې د $1 او يا هم د يو بل [[{{MediaWiki:Grouppage-sysop}}|پازوال]] سره اړيکې ټينگې کړی او د بنديز ستونزې مو هوارې کړی.\nتاسې نه شی کولای چې د 'کارن ته برېښلک لېږل' کړنې نه گټه پورته کړی تر څو چې تاسې د خپل گڼون په [[Special:Preferences|غوره توبونو]] کې يوه کره برېښليک پته نه وي ځانگړې کړې او تر دې بريده چې پر تاسې د هغې د کارولو بنديز نه وي لگېدلی.\nستاسې د دم مهال آی پي پته $3 ده، او ستاسې د بنديز پېژند #$5 دی. مهرباني وکړۍ د خپلې يادونې پر مهال د دغو دوو څخه د يوه او يا هم د دواړو ورکول مه هېروۍ.",
        "anontalkpagetext": "----''دا د يوه ورکنومي کارن چې کارن-نوم نه لري او يا خپل کارن-نوم نه کاروي، د سکالو يوه پاڼه ده. نو د يوه کس د پېژندلو پخاطر موږ د هماغه کارن د انټرنېټ شمېره يا IP پته دلته ثبتوؤ. داسې يوه IP پته د ډېرو کارنانو لخوا هم کارېدلی شي. که تاسې يو ورکنومی کارن ياست او تاسې ته دا څرگندېږي چې تاسې ته نااړونده پېغامونه او تبصرې اشاره شوي، نو د نورو بې نومو کارنانو او ستاسې ترمېنځ د ټکنتوب د مخ نيونې لپاره لطفاً [[Special:UserLogin/signup|يو گڼون جوړ کړۍ]] او يا هم [[Special:UserLogin|غونډال ته ورننوځۍ]].''",
        "noarticletext": "دم مهال په دې مخ کې څه نشته.\nتاسې کولای شی چې په نورو مخونو کې [[Special:Search/{{PAGENAME}}|د دې مخ د سرليک پلټنه]] يا\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} د اړوندو يادښتونو پلټنه] وکړی.\nاو يا [{{fullurl:{{FULLPAGENAME}}|action=edit}} همدا مخ سم کړی]</span>.",
        "noarticletext-nopermission": "دم مهال په دې مخ کې متن نشته.\nتاسې کولای شی چې [[Special:Search/{{PAGENAME}}|همدا سرليک په نورو مخونو کې وپلټۍ]], يا هم <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} اړونده يادښتونه وپلټۍ]</span>، خو تاسې د دې مخ د جوړولو اجازه نه لرۍ.",
-       "userpage-userdoesnotexist": "د \"<nowiki>$1</nowiki>\" گڼون نه دی ثبت شوی.\nلطفاً ځان ډاډه کړۍ چې آيا تاسې په رښتيا همدا مخ جوړول که سمول غواړۍ.",
+       "userpage-userdoesnotexist": "د \"<nowiki>$1</nowiki>\" گڼون نه دی ثبت شوی.\nلطفاً ځان ډاډه کړئ چې آيا تاسې په رښتيا همدا مخ جوړول/سمول غواړئ.",
        "userpage-userdoesnotexist-view": "د \"$1\" گڼون نه دی ثبت شوی.",
        "blocked-notice-logextract": "دم مهال په دې کارن بنديز لگېدلی.\nد بنديز يادښت تازه مالومات په لاندې توگه دي:",
        "clearyourcache": "'''يادښت:''' د غوره توبونو د خوندي کولو وروسته، خپل د کتنمل (بروزر) ساتل شوې حافظه تازه کړی.\n* '''فايرفاکس/ سفري:''' په دې کتنمل کې د ''Reload'' د ټکوهلو په وخت د ''Shift'' تڼۍ نيولې وساتی، او يا هم ''Ctrl-F5'' يا ''Ctrl-R''تڼۍ کېښکاږۍ (په Apple Mac کمپيوټر باندې ''⌘-R'' کېښکاږۍ)\n* '''گووگل کروم:''' په دې کتنمل کې د ''Ctrl-Shift-R'' تڼۍ کېښکاږۍ (د مک لپاره ''⌘-Shift-R'')\n* '''انټرنټ اېکسپلورر:''' په دې کتنمل کې د ''Refresh'' د ټکوهلو په وخت کې د ''Ctrl'' تڼۍ کېښکاږلې ونيسۍ، او يا هم د ''Ctrl-F5'' تڼۍ کېښکاږۍ\n* '''اوپرا''': په دې کتنمل کې د خپل براوزر ساتل شوې حافظه پدې توگه سپينولی شی ''Tools→Preferences''",
        "template-protected": "(ژغورلی)",
        "template-semiprotected": "(نيم-ژغورلی)",
        "hiddencategories": "دا مخ د {{PLURAL:$1|1 پټې وېشنيزې|$1 پټو وېشنيزو}} يو غړی دی:",
+       "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} د نوو مخونو د جوړولو وړتيا محدوده کړې.\nتاسو بېرته پر شا تللای شی او په شته مخونو کې سمونې ترسره کولای شی، او يا هم [[Special:UserLogin|غونډال ته ننوتلای او يو گڼون جوړولای شی]].",
        "nocreate-loggedin": "تاسې د نوو مخونو د جوړولو پرېښله نلرۍ.",
        "sectioneditnotsupported-title": "د برخې د سمون ملاتړ نه کېږي",
        "content-model-text": "ساده متن",
        "content-model-javascript": "جاواسکرېپټ",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "تش څيز",
        "post-expand-template-inclusion-warning": "'''گواښنه:''' دا کينډۍ د خپل ټاکلي بريد نه ډېره لويه ده.\nځينې کينډۍ به په کې گډې نه شي.",
        "post-expand-template-inclusion-category": "هغه مخونه چې په کې د کارېدلو کينډيو شمېر له ټاکلې کچې ډېر دی",
        "mergehistory-comment": "[[:$1]] [[:$2]] کې اخږل شوی: $3",
        "mergehistory-same-destination": "د سرچينې او موخې مخونه بايد يو ډول نه وي",
        "mergehistory-reason": "سبب:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "د اخږلو يادښت",
        "revertmerge": "بېلول",
        "mergelogpagetext": "دلته لاندې د يو مخ د پېښليک تازه اخږنه بل مخ ته د يو لړليک په توگه راغلی.",
        "youremail": "برېښليک *",
        "username": "{{GENDER:$1|کارن نوم}}:",
        "prefs-memberingroups": "د {{PLURAL:$1|ډله|ډلې}} {{GENDER:$2|غړی}}:",
+       "prefs-memberingroups-type": "$1",
        "prefs-registration": "د نومليکنې وخت:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "اصلي نوم:",
        "yourlanguage": "ژبه:",
        "yourvariant": "د ژبگړدود مېنځپانگه:",
        "yournick": "نوی لاسليک:",
+       "prefs-help-signature": "د خبرو اترو مخونو د تبصرو پای بايد د \"<nowiki>~~~~</nowiki>\" په کوډ لاسليک شي، دا کوډ به بيا په خپلکاره توگه ستاسې په لاسليک او وخت ټاپې اړول کېږي.",
        "badsiglength": "ستاسو لاسليک ډېر اوږد دی.\nبايد چې لاسليک مو له $1 {{PLURAL:$1|توري|تورو}} نه لږ وي.",
        "yourgender": "څنگه غواړۍ ځان څرگند کړۍ؟",
        "gender-unknown": "ناڅرگنده",
        "prefs-displayrc": "د ښکارېدو خوښنې",
        "prefs-displaywatchlist": "د ښکارېدنې خوښنې",
        "prefs-diffs": "توپيرونه",
-       "email-address-validity-valid": "برېښليک پته سمه ښکاري",
-       "email-address-validity-invalid": "يوه سمه برېښليک پته وليکۍ",
        "userrights": "د کارن رښتو سمبالښت",
        "userrights-lookup-user": "کارن ډلې سمبالول",
        "userrights-user-editname": "يو کارن نوم ورکړئ:",
        "saveusergroups": "کارن ډلې خوندي کول",
        "userrights-groupsmember": "غړی د:",
        "userrights-groupsmember-auto": "ضمني غړی د:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "تاسې هغه ډلې چې همدا کارن يې غړی دی بدلولی شی:\n* يو په نښه شوی بکس د دې مانا لري چې کارن د هغې ډلې غړيتوب لري.\n* يو نانښه شوی بکس د دې مانا لري چې کارن د هغې ډلې غړيتوب نلري.\n* د * يوه نښه په دې مانا ده چې هر کله تاسې څوک په همدې ډلې کې غړی کړی بيا يې ترې نشی وېستلی او د دې برعکس هم.",
        "userrights-reason": "سبب:",
        "userrights-no-interwiki": "په همدې ويکي باندې تاسې د کارن رښتو د سمولو اجازه نه لرۍ.",
        "userrights-changeable-col": "هغه ډلې چې تاسې يې بدلولی شی",
        "userrights-unchangeable-col": "هغه ډلې چې تاسې يې نه شی بدلولی",
+       "userrights-irreversible-marker": "$1*",
        "group": "ډله:",
        "group-user": "کارنان",
        "group-autoconfirmed": "تاييد شوي کارنان",
        "recentchanges-label-plusminus": "د بايټونو د شمېر له مخې د مخ د بدلون کچه",
        "recentchanges-legend-heading": "'''لنډونونه:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|د نويو مخونو لړليک]] هم وگورئ)",
+       "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "recentchanges-submit": "ښکاره کول",
        "rcnotefrom": "دلته لاندې د <strong>$2</strong> څخه راپدېخوا پېښ شوي بدلونونه راغلي (تر <strong>$1</strong> پورې ښکاري).",
        "rclistfrom": "نوي بدلونونه چې له $3، $2 څخه پيلېږي ښکاره کول",
        "rcshowhideminor": "وړې سمونې $1",
        "rcshowhidemine": "زما سمونې $1",
        "rcshowhidemine-show": "ښکاره کول",
        "rcshowhidemine-hide": "پټول",
+       "rcshowhidecategorization-show": "ښکاره کول",
+       "rcshowhidecategorization-hide": "پټول",
        "rclinks": "هغه وروستي $1 بدلونونه ښکاره کړی چې په $2 ورځو کې پېښ شوي<br />$3",
        "diff": "توپير",
        "hist": "پېښليک",
        "minoreditletter": "و",
        "newpageletter": "ن",
        "boteditletter": "ر",
+       "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1  {{PLURAL:$1|کتونکی کارن|کتونکي کارنان}}]",
-       "rc_categories": "د Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 Ø¨Ø±Ù\8aدÙ\88Ù\86ه (په \"|\" بېلول)",
+       "rc_categories": "د Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 ØªØ± Ø¨Ø±Ù\8aده (په \"|\" بېلول)",
        "rc_categories_any": "له ټاکل شويو هر يو",
+       "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|بايټ|بايټونه}} د بدلون وروسته",
        "newsectionsummary": "/* $1 */ نوې برخه",
        "rc-enhanced-expand": "تفصيل ښکاره کول",
        "recentchangeslinked-summary": "دا د هغه بدلونونو لړليک دی چې وروستۍ ځل په تړن لرونکيو مخونو کې د يوه ځانگړي مخ (او يا هم د يوې ځانگړې وېشنيزې غړو) نه رامېنځ ته شوي.\n[[Special:Watchlist|ستاسې د کتنلړ]] مخونه په '''زغرد ليک''' کې ښکاري.",
        "recentchangeslinked-page": "د مخ نوم:",
        "recentchangeslinked-to": "د ورکړل شوي مخ پر ځای د اړونده تړلي مخونو بدلونونه ښکاره کول",
+       "recentchanges-page-added-to-category": "[[:$1]] وېشنيزې کې ورگډ شو",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] او {{PLURAL:$2|يو مخ|$2 مخونه}} وېشنيزې کې ورگډ شول",
+       "recentchanges-page-removed-from-category": "[[:$1]] له وېشنيزې وغورځول شو",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] او {{PLURAL:$2|يو مخ|$2 مخونه}} له وېشنيزې وغورځول شول",
+       "autochange-username": "د مېډياويکي خپلکاره بدلون",
        "upload": "دوتنه پورته کول",
        "uploadbtn": "دوتنه پورته کول",
        "reuploaddesc": "پورته کېدنه ناگارل او بېرته د پورته کېدنې فورمې ته ورگرځېدل",
        "upload-form-label-infoform-description": "څرگندونه",
        "upload-form-label-usage-title": "کارېدنې",
        "upload-form-label-usage-filename": "د دوتنې نوم",
+       "foreign-structured-upload-form-label-own-work": "دا زما خپل کار دی",
+       "foreign-structured-upload-form-label-infoform-categories": "وېشنيزې",
+       "foreign-structured-upload-form-label-infoform-date": "نېټه",
        "backend-fail-notexists": "د $1 په نوم دوتنه نشته.",
        "backend-fail-delete": "د \"$1\" دوتنه ړنګه نه شوه.",
        "backend-fail-alreadyexists": "د $1 دوتنه له پخوا نه شته.",
        "ntransclusions": "په $1 {{PLURAL:$1|مخ|مخونو}} کارېدلی",
        "specialpage-empty": "د دې راپور لپاره کومې پايلې نشته.",
        "lonelypages": "يتيم مخونه",
+       "lonelypagestext": "دا لانديني مخونه په {{SITENAME}} کې د هېڅ کوم بل مخ سره تړنې نه لري او په هېڅ کوم بل مخ کې نه دي رانغاړل شوي.",
        "uncategorizedpages": "ناوېشلي مخونه",
        "uncategorizedcategories": "ناوېشلې وېشنيزې",
        "uncategorizedimages": "ناوېشلي انځورنه",
        "wantedpages": "غوښتلي مخونه",
        "wantedpages-summary": "دا د هغو ناموجودو مخونو لړليک دی چې تر ټولو ډېرې تړنې لري، په دې لړليک کې د مخ گرځونو مخونه شامل نه دي. د هغو ناموجودو مخونو لپاره چې د مخ گرځونو مخونه په کې شامل دي، [[{{#special:BrokenRedirects}}|د ماتو مخ گرځونو لړليک]] کې کتلی شی.",
        "wantedfiles": "غوښتلې دوتنې",
+       "wantedfiletext-cat": "دا لاندې دوتنې دلته په نورو مخونو کې کارېدلي خو لا تر اوسه پورې نشته.. همداراز کېدای شي د باندنيو زېرمتونونو دوتنې د شتون سره سره دلته په لړليک کې راغلي وي. په دې ډول هرې ناسمې مثبته راوړنې باندې به <del>کرښه کښل</del> کېږي.\nد دې تر څنگ هغه مخونه چې ناموجوده دوتنې په ځان کې رانغاړي د لړليک په بڼه، [[:$1]] کې موندلی شئ.",
+       "wantedfiletext-nocat": "دا لاندې دوتنې دلته په نورو مخونو کې کارېدلي خو لا تر اوسه پورې نشته.. همداراز کېدای شي د باندنيو زېرمتونونو دوتنې د شتون سره سره دلته په لړليک کې راغلي وي. په دې ډول هرې ناسمې مثبته راوړنې باندې به <del>کرښه کښل</del> کېږي.",
+       "wantedfiletext-nocat-noforeign": "دا لاندينۍ دوتنې دلته کارېدلي خو لا تر اوسه نشته.",
        "wantedtemplates": "غوښتلې کينډۍ",
        "mostlinked": "د ډېرو تړنو مخونه",
        "mostlinkedcategories": "د گڼو تړنو وېشنيزې",
-       "mostlinkedtemplates": "د ډېرو تړنو کينډۍ",
+       "mostlinkedtemplates": "ډېر رانغاړل شوي مخونه",
        "mostcategories": "د گڼو وېشنيزو مخونه",
        "mostimages": "د ډېرو تړنو انځورونه",
        "mostinterwikis": "د ډېرو خپلمنځي تړنو مخونه",
        "mostrevisions": "ډېر کتلي مخونه",
        "prefixindex": "د مختاړيو ټول مخونه",
        "prefixindex-namespace": "د مختاړي ټول مخونه ($1 نومتشيال)",
+       "prefixindex-strip": "په لړليک کې مختاړی غورځول",
        "shortpages": "لنډ مخونه",
        "longpages": "اوږده مخونه",
        "deadendpages": "بې پايه مخونه",
        "protectedpages-page": "مخ",
        "protectedpages-expiry": "پای نېټه",
        "protectedpages-performer": "ژغورونکی کارن",
+       "protectedpages-params": "د ژغورنې پاراميټرونه",
        "protectedpages-reason": "سبب",
        "protectedpages-unknown-timestamp": "ناجوت",
        "protectedpages-unknown-performer": "ناڅرگنده کارن",
        "usereditcount": "{{PLURAL:$1|سمون|سمونونه}}",
        "usercreated": "په $1 نېټه په $2 بجو {{GENDER:$3|جوړ شو}}",
        "newpages": "نوي مخونه",
+       "newpages-submit": "ښکاره کول",
        "newpages-username": "کارن-نوم:",
        "ancientpages": "تر ټولو زاړه مخونه",
        "move": "لېږدول",
        "apihelp-no-such-module": "د \"$1\" ماډيول و نه موندل شو.",
        "booksources": "د کتاب سرچينې",
        "booksources-search-legend": "د کتابي سرچينو پلټنه",
+       "booksources-isbn": "ISBN:",
        "booksources-search": "پلټل",
        "booksources-text": "دا لاندې د هغه وېبځايونو د تړنو لړليک دی چېرته چې نوي او زاړه کتابونه پلورل کېږي، او يا هم کېدای شي چې د هغه کتاب په هکله مالومات ولري کوم چې تاسو ورپسې لټېږۍ:",
        "booksources-invalid-isbn": "دا ISBN چې تاسې ورکړی سم نه ښکاري؛ د تېروتنو لپاره د لمېسلو اصلي سرچينه وگورئ.",
        "specialloguserlabel": "ترسره کوونکی:",
        "speciallogtitlelabel": "موخه (سرليک يا کارن):",
        "log": "يادښتونه",
+       "logeventslist-submit": "ښکاره کول",
        "all-logs-page": "ټول عام يادښتونه",
        "logempty": "په يادښت کې ورته څه نشته.",
        "log-title-wildcard": "هغه سرليکونه پلټل چې په دې متن پيلېږي",
        "allpages-hide-redirects": "مخ گرځونې پټول",
        "cachedspecial-refresh-now": "تر ټولو تازه کتل.",
        "categories": "وېشنيزې",
+       "categories-submit": "ښکاره کول",
        "categoriespagetext": "دا لاندينۍ {{PLURAL:$1|وېشنيزه|وېشنيزې}} مخونه يا رسنيزې دوتنې لري.\nدلته [[Special:UnusedCategories|ناکارېدلې وېشنيزې]] نه دي ښکاره شوي.\n[[Special:WantedCategories|غوښتلې وېشنيزې]] هم وگورۍ.",
        "categoriesfrom": "هغه وېشنيزې کتل چې پېلېږي په:",
        "special-categories-sort-count": "د شمېر له مخې اوډل",
        "listgrouprights-rights": "رښتې",
        "listgrouprights-helppage": "Help:د ډلې رښتې",
        "listgrouprights-members": "(د غړو لړليک)",
+       "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code>($2)</code></span>",
+       "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 <code>($2)</code></span>",
        "listgrouprights-addgroup": "{{PLURAL:$2|ډله|ډلې}} ورگډول: $1",
        "listgrouprights-removegroup": "{{PLURAL:$2|ډله|ډلې}} ليري کول: $1",
        "listgrouprights-addgroup-all": "ټولې ډلې ورگډول",
        "listgrouprights-removegroup-self": "خپل گڼون نه د {{PLURAL:$2|ډله|ډلې}} ليري کول: $1",
        "listgrouprights-addgroup-self-all": "خپل گڼون کې ټولې ډلې ورگډول",
        "listgrouprights-removegroup-self-all": "خپل گڼون نه ټولې ډلې ليري کول",
+       "listgrouprights-namespaceprotection-header": "د نومتشيال محدوديتونه",
        "listgrouprights-namespaceprotection-namespace": "نوم-تشيال",
+       "listgrouprights-namespaceprotection-restrictedto": "د کارن سمون ترسره کولو رښته(رښتې)",
        "trackingcategories": "موندونکې وېشنيزې",
        "trackingcategories-msg": "وېشنيزه موندنه",
        "trackingcategories-name": "پيغام نوم",
        "wlheader-showupdated": "هغه مخونه چې ستاسې د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک په نښه شوي.",
        "wlnote": "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
        "wlshowlast": "وروستي $1 ساعتونه $2 ورځې ښکاره کول",
+       "watchlistall2": "ټول",
+       "watchlist-hide": "پټول",
+       "wlshowtime": "وروستی ښکاره کول:",
+       "wlshowhideminor": "وړوکي سمونونه",
+       "wlshowhidebots": "روباټونه",
+       "wlshowhideliu": "ثبت شوي کارنان",
+       "wlshowhideanons": "ورکنومي کارنان",
+       "wlshowhidepatr": "څارل شوي سمونونه",
+       "wlshowhidemine": "زما سمونونه",
        "watchlist-options": "د کتنلړ خوښنې",
        "watching": "د کتلو په حال کې...",
        "unwatching": "د نه کتلو په حال کې...",
        "delete-confirm": "\"$1\" ړنگول",
        "delete-legend": "ړنگول",
        "historywarning": "گواښنه:''' دا مخ چې تاسې يې د ړنگېدو تکل لرئ نژدې $1 {{PLURAL:$1|بڼه|بڼې}} پېښليک لري:",
+       "historyaction-submit": "ښکاره کول",
        "confirmdeletetext": "تاسې د تل لپار يو مخ يا انځور د هغه ټول پېښليک سره د دغه توکبنسټ نه ړنگوئ. که چېرته تاسې ددې کړنې په پايله پوه ياست او يا ستاسې همدا کړنه د دې پاڼې د [[{{MediaWiki:Policy-url}}|تگلارې]] سره سمون خوري نو لطفاً د دې تاييد وکړی.",
        "actioncomplete": "بشپړه کړنه",
        "actionfailed": "کړنه نابريالۍ شوه",
        "deletereasonotherlist": "بل سبب",
        "deletereason-dropdown": "*د ړنگولو ټولگړی سبب\n** چټيات\n** د پوهې سره دښمني\n** د رښتو تېری\n** د ليکوال غوښتنه\n** ناسمه مخ گرځېدنه",
        "delete-edit-reasonlist": "د ړنگولو سببونه سمول",
+       "deleting-backlinks-warning": "گواښنه:''' دا مخ چې تاسې يې ړنگوی د [[Special:WhatLinksHere/{{FULLPAGENAME}}|نورو مخونو]] سره تړلی او يا هم په نورو مخونو کې نغاړل شوی دی.",
        "rollbacklink": "په شابېول",
        "rollbacklinkcount": "$1 {{PLURAL:$1|سمون|سمونونه}} پرشابېول",
        "editcomment": "د سمون لنډيز دا و: \"''$1''\".",
        "protect-fallback": "يوازې د \"$1\" اجازې لرونکي کارنان پرېښودل",
        "protect-level-autoconfirmed": "يوازې تاييد شوي کارنان",
        "protect-level-sysop": "يواځې پازوالان پرېښودل",
+       "protect-summary-desc": "[$1=$2] ($3)",
        "protect-summary-cascade": "ځوړاوبيز",
        "protect-expiring": "په $1 (UTC) پای ته رسېږي",
        "protect-expiring-local": "پای نېټه $1",
        "undelete-search-prefix": "هغه مخونه چې پيلېږي په:",
        "undelete-search-submit": "پلټل",
        "undelete-show-file-submit": "هو",
+       "undelete-revision-row": "$1 $2 ($3) $4 . . $5 $6 $7 $8 $9",
        "namespace": "نوم-تشيال:",
        "invert": "ټاکنې سرچپه کول",
        "tooltip-invert": "په ټاکلو نومتشيالونو کې (او اړونده نومتشيال کې که په نښه شوی وي) د مخونو بدلونونو د پټولو لپاره دا بکس په نښه کړئ",
        "contributions": "{{GENDER:$1|کارن}} ونډې",
        "contributions-title": "د $1 کارن ونډې",
        "mycontris": "ونډې",
+       "anoncontribs": "ونډې",
        "contribsub2": "د {{GENDER:$3|$1}} لپاره ($2)",
        "contributions-userdoesnotexist": "کارن گڼون \"$1\" نه دی ثبت شوی.",
        "nocontribs": "دې شرطونو سره سم بدلونونه و نه موندل شول.",
        "movenotallowedfile": "تاسې د دوتنو د لېږدولو پرېښله نلرۍ.",
        "cant-move-user-page": "تاسې د کارن مخونو د لېږدولو پرېښله نلرۍ (د څېرمه مخونو نه پرته).",
        "cant-move-to-user-page": "تاسې د يو کارن مخ ته د يوه بل مخ د لېږدولو پرېښله نلرۍ (د يو کارن د څېرمه مخ نه پرته).",
-       "newtitle": "نوي سرليک ته:",
+       "newtitle": "نوی سرليک:",
        "move-watch": "همدا مخ کتل",
        "movepagebtn": "مخ لېږدول",
        "pagemovedsub": "لېږدول په برياليتوب سره ترسره شوه",
        "movenosubpage": "دا مخ کوم څېرمه مخونه نه لري.",
        "movereason": "سبب:",
        "revertmove": "په څټ گرځول",
-       "delete_and_move": "ړنگول او لېږدول",
        "delete_and_move_text": "== د ړنگولو اړتيا ==\nد \"[[:$1]]\" په نوم مخ له پخوا څخه شته.\nآيا د دې په ړنگولو سره لېږدولو ته لاره هوارول غواړۍ؟",
        "delete_and_move_confirm": "هو, دا مخ ړنگ کړه",
        "immobile-source-page": "دا مخ نه لېږدېدنونکی دی",
        "import-comment": "تبصره:",
        "import-revision-count": "$1 {{PLURAL:$1|بڼه|بڼې}}",
        "importnopages": "د رالېږدولو لپاره مخونه نشته.",
+       "imported-log-entries": "$1 {{PLURAL:$1|يادښتليک راوړل شوی|يادښتليکونه راوړل شوي}}.",
        "importcantopen": "واردونکې دوتنه و نه پرانيستل شوه.",
+       "importbadinterwiki": "ناسمه ويکيخپلمنځي تړنه",
        "import-upload": "د XML اومتوک پورته کول",
        "import-token-mismatch": "د اومتوک غونډېدنه له لاسه وتلې.\nلطفاً بيا يې وآزمايئ.",
        "importlogpage": "د واردولو يادښت",
        "tooltip-undo": "\"ناکړ\" همدا سمون پر شا گرځوي او د سمون کړکۍ د مخکتنې په بڼه پرانيزي.\nدا کړنه د لنډيز په برخه کې د سمونونو د سببونو د ورگډولو آسانتيا برابروي.",
        "tooltip-preferences-save": "غوره توبونه خوندي کول",
        "tooltip-summary": "يو لنډ لنډيز کښل",
+       "interlanguage-link-title": "$1 – $2",
+       "interlanguage-link-title-nonlang": "$1 – $2",
        "anonymous": "د {{SITENAME}} {{PLURAL:$1|ورکنومی کارن|ورکنومي کارنان}}",
        "siteuser": "د {{SITENAME}} کارن $1",
        "anonuser": "د {{SITENAME}} ورکنومی کارن $1",
        "pageinfo-watchers": "د مخ د کتونکو شمېر",
        "pageinfo-few-watchers": "له $1 څخه لږ {{PLURAL:$1|کتونکی|کتونکي}}",
        "pageinfo-redirects-name": "دې مخ ته د ورگرځونو شمېر",
+       "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "دې مخ ته څېرمه مخونه",
        "pageinfo-firstuser": "مخ جوړونکی",
        "pageinfo-firsttime": "د مخ جوړېدنې نېټه",
        "metadata-fields": "د انځور مېټاډاټا ډگرونه چې لړليک يې په همدې پيغام کې په لاندې توگه راغلی د انځور مخ په ښکارېدنه کې به هغه وخت ورگډ شي کله چې د مېټاډاټا لښتيال غځېږي.\nنور څه به په تلواليزه توگه پټ پاتې وي.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "سوروالی",
        "exif-imagelength": "لوړوالی",
+       "exif-photometricinterpretation": "پېکسل ترکيب",
        "exif-orientation": "لورموندنه",
+       "exif-planarconfiguration": "اومتوک ترتيب",
        "exif-xresolution": "څنډيز ژورليد",
        "exif-yresolution": "ولاړيز ژورليد",
        "exif-stripoffsets": "د انځور مالوماتځی",
        "exif-relatedsoundfile": "اړونده غږيزه دوتنه",
        "exif-datetimeoriginal": "د اومتوک د جوړېدنې وخت او نېټه",
        "exif-datetimedigitized": "د گڼياليز کېدنې وخت او نېټه",
+       "exif-exposuretime": "رڼاغورځونې وخت",
        "exif-exposuretime-format": "$1 ثانيه ($2)",
        "exif-fnumber": "F شمېره",
+       "exif-exposureprogram": "رڼاغورځونې پروگرام",
        "exif-spectralsensitivity": "طيفي حساسيت",
        "exif-isospeedratings": "د ISO چټکتيا ارزونه",
        "exif-shutterspeedvalue": "د APEX بندگر چټکتيا",
        "exif-brightnessvalue": "د APEX رڼښت",
+       "exif-meteringmode": "رڼامېچنې حالت",
        "exif-lightsource": "د رڼا سرچينه",
        "exif-flash": "فلش",
        "exif-focallength": "د عدسيې کانوني واټن",
        "exif-subjectarea": "د جسم سيمه",
        "exif-flashenergy": "د فلش انرژي",
        "exif-subjectlocation": "د جسم ځای",
+       "exif-sensingmethod": "د حس کولو چلندلار",
        "exif-filesource": "د دوتنې سرچينه",
+       "exif-scenetype": "د صحنې ډول",
+       "exif-customrendered": "دوديزه انځور بهير",
+       "exif-exposuremode": "د رڼا غورځولو حالت",
        "exif-whitebalance": "د سپين رنگ توازن",
+       "exif-digitalzoomratio": "د گڼياليز لويواله پرتلنه",
+       "exif-gaincontrol": "د صحنې تنظيم",
+       "exif-contrast": "رڼښت",
+       "exif-saturation": "رنگ گاټه توب",
+       "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": "د جي پي اس اخيستونکي چټکتيا",
+       "exif-gpstrack": "د خوځښت سمت",
        "exif-gpsimgdirection": "د انځور لوری",
        "exif-gpsareainformation": "د جي پي اس د سيمې نوم",
        "exif-gpsdatestamp": "د جي پي اس نېټه",
        "exif-orientation-1": "نورمال",
        "exif-componentsconfiguration-0": "نشته دی",
        "exif-exposureprogram-1": "لاسي",
-       "exif-exposureprogram-2": "Ù\86Ù\88رÙ\85اÙ\84Ù\87 Ù¾Ø±Ù\88Ú«رام",
+       "exif-exposureprogram-2": "Ù\86Ù\88رÙ\85اÙ\84Ù\87 Ù¾Ø±Ù\88Ú¯رام",
        "exif-subjectdistance-value": "$1 متره",
        "exif-meteringmode-0": "ناجوت",
        "exif-meteringmode-1": "منځالی",
        "exif-lightsource-11": "سيوری",
        "exif-lightsource-255": "د رڼا بله سرچينه",
        "exif-flash-fired-0": "فلش و نه ځلېده",
+       "exif-flash-mode-3": "خپلکاره حالت",
        "exif-focalplaneresolutionunit-2": "انچه",
        "exif-sensingmethod-1": "ناڅرگنده",
        "exif-filesource-3": "گڼياليزه ولاړه کامره",
        "exif-gaincontrol-0": "هېڅ",
        "exif-contrast-0": "نورمال",
        "exif-contrast-1": "پوست",
+       "exif-contrast-2": "کلک",
        "exif-saturation-0": "نورمال",
        "exif-sharpness-0": "نورمال",
        "exif-sharpness-1": "پوست",
+       "exif-sharpness-2": "کلک",
        "exif-subjectdistancerange-0": "ناجوت",
        "exif-subjectdistancerange-1": "ماکرو",
        "exif-subjectdistancerange-2": "نژدې ليدون",
        "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-ycbcrpositioning-1": "منځنی",
        "exif-dc-contributor": "ونډه وال",
        "exif-dc-date": "نېټه (نېټې)",
-       "exif-dc-publisher": "خپرونکی",
+       "exif-dc-publisher": "خپرÙ\88Ù\88Ù\86Ú©Û\8c",
        "exif-dc-relation": "اړونده رسنۍ",
        "exif-dc-rights": "رښتې",
        "exif-dc-source": "د سرچينې رسنۍ",
        "autosumm-replace": "دا مخ د '$1' پرځای راوستل",
        "autoredircomment": "[[$1]] ته وروگرځېده",
        "autosumm-new": "د \"$1\" تورو مخ جوړ شو",
+       "autosumm-newblank": "تش مخ جوړ شو",
        "size-bytes": "$1 بايټ",
        "size-kilobytes": "$1 کيلوبايټ",
        "size-megabytes": "$1 مېگابايټ",
        "hebrew-calendar-m4": "تيفيت",
        "hebrew-calendar-m5": "شيفات",
        "hebrew-calendar-m6": "آدار",
+       "hebrew-calendar-m10-gen": "تموز",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|خبرې اترې]])",
        "duplicate-defaultsort": "'''گواښنه:'''د \"$2\" تلواليزه اوډون تڼۍ تر دې پخوا ټاکلې تلواليزه اوډون تڼۍ \"$1\" پر ځای چارنه کېږي.",
        "version": "بڼه",
        "fileduplicatesearch-result-1": "\"$1\" بله کټ مټ ورته غبرګونې دوتنه نلري.",
        "fileduplicatesearch-noresults": "د \"$1\" په نوم دوتنه و نه موندل شوه.",
        "specialpages": "ځانگړي مخونه",
+       "specialpages-note-top": "څرگندونې",
        "specialpages-note": "* نورماله ځانگړي مخونه.\n* <strong class=\"mw-specialpagerestricted\">محدوده ځانگړي مخونه.</strong>",
        "specialpages-group-maintenance": "د څارنې راپورونه",
        "specialpages-group-other": "نور ځانگړي مخونه",
        "specialpages-group-pagetools": "د مخ اوزارونه",
        "specialpages-group-wiki": "توکي او اوزارونه",
        "specialpages-group-redirects": "د ځانگړو مخونو مخ گرځونې",
+       "specialpages-group-developer": "د پرمختگگر اوزار",
        "blankpage": "تش مخ",
        "intentionallyblankpage": "همدا مخ په لوی لاس تش پرېښودل شوی دی",
        "external_image_whitelist": " #دا کرښه چې څنگه ده، همداسې پرېږدۍ<pre>\n#لاندې د منظمو اصطلاحگانو ټوټې (يوازې هغه برخه چې د // په مېنځ کې ليکلې) ځای پر ځای کړی\n#دا به د باندنيو انځورونو د يو آر اېل (hotlinked) سره مطابقه شي \n#هغه څه چې مطابقت لري هغه به د انځورونو په توگه ښکاره شي، کوم چې مطابقت نلري نو يوازې د انځور تړنه به ښکاره کېږي\n#هغه کرښې چې په # پيل کېږي د تبصرو په توگه په نظر کې نيول کېږي\n#دا کرښې د غټو تورو او وړو تورو سره حساسې نه دي\n\n#ټولې regex ټوټې د دغې کرښې نه پورته ځای پر ځای کړی. دا کرښه چې څنگه ده، همداسې يې پرېږدۍ</pre>",
+       "tags": "د کره بدلون نښلنونه",
        "tag-filter": "[[Special:Tags|نښلن]] چاڼگر:",
        "tag-filter-submit": "چاڼگر",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|نښلن|نښلنونه}}]]: $2)",
        "tags-create-already-exists": "د \"$1\" نښلن له پخوا څخه شته.",
        "tags-delete-title": "نښلن ړنگول",
        "tags-delete-reason": "سبب:",
+       "tags-activate-title": "نښلن فعالول",
+       "tags-activate-question": "تاسې د \"$1\" نښلن په فعالولو کې ياست.",
        "tags-activate-reason": "سبب:",
        "tags-activate-submit": "فعالول",
        "tags-deactivate-reason": "سبب:",
        "htmlform-cloner-create": "نور ورگډول",
        "htmlform-cloner-delete": "غورځول",
        "htmlform-cloner-required": "لږ تر لږه يو ارزښت ته اړتيا شته.",
+       "htmlform-title-not-exists": "$1 نشته.",
+       "htmlform-user-not-exists": "<strong>$1</strong> نشته.",
        "logentry-delete-delete": "$1 د $3 مخ {{GENDER:$2|ړنگ کړ}}",
        "revdelete-content-hid": "مېنځپانگه پټېدلې",
        "revdelete-uname-hid": "کارن نوم پټ شوی",
        "logentry-newusers-newusers": "د $1 کارن گڼون {{GENDER:$2|جوړ شو}}",
        "logentry-newusers-create": "د $1 کارن گڼون {{GENDER:$2|جوړ شو}}",
        "logentry-newusers-autocreate": "د $1 گڼون په اتوماتيک ډول {{GENDER:$2|جوړ شو}}",
+       "logentry-protect-unprotect": "$1 له $3 څخه ژغورنه {{GENDER:$2|ليرې کړه}}",
        "logentry-rights-rights": "$1 د $3 لپاره د غړيتوب ډله له $4 څخه $5 ته {{GENDER:$2|بدله کړه}}",
        "logentry-rights-rights-legacy": "$1 د $3 لپاره د غړيتوب ډله {{GENDER:$2|بدله کړه}}",
        "logentry-upload-upload": "$1 $3 {{GENDER:$2|ورپورته يې کړ}}",
        "log-name-tag": "نښلن يادښت",
        "rightsnone": "(هېڅ)",
        "revdelete-summary": "لنډيز سمول",
+       "feedback-back": "پر شا کېدل",
        "feedback-cancel": "ناگارل",
        "feedback-close": "ترسره شو",
        "feedback-external-bug-report-button": "د يوې تخنيکي دندې دوتنه جوړونه",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|ثانيه|ثانيې}}",
        "limitreport-walltime": "اصلي وخت کارېدنه",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|ثانيه|ثانيې}}",
+       "limitreport-ppvisitednodes-value": "$1/$2",
+       "limitreport-ppgeneratednodes-value": "$1/$2",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|بايټ|بايټونه}}",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|بايټ|بايټونه}}",
+       "limitreport-expansiondepth-value": "$1/$2",
+       "limitreport-expensivefunctioncount-value": "$1/$2",
        "expandtemplates": "کينډۍ غځول",
        "expand_templates_input": "ځايونکی متن:",
        "expand_templates_output": "پايله",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''ناچارن''')",
        "mediastatistics": "د رسنيو شمار",
        "mediastatistics-summary": "د پورته شويو دوتنو اړونده شمارنې. په دې ځای کې د يوې دوتنې يوازې تر ټولو تازه بڼې شاملې شوي. د دوتنو زړې يا ړنگې شوې بڼې په دې شمارنو کې نه دي شاملې شوي.",
+       "mediastatistics-nfiles": "$1 ($2%)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 بايټ|$1 بايټونه}} ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME بڼه",
        "mediastatistics-table-extensions": "ممکنه شاتاړي",
        "special-characters-group-thai": "تايلنډي",
        "special-characters-group-lao": "لاوي",
        "special-characters-group-khmer": "خمري",
-       "mw-widgets-titleinput-description-new-page": "پدې نوم لا تر اوسه پورې مخ نشته",
-       "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځول"
+       "mw-widgets-dateinput-placeholder-day": "کککک-م م-و و",
+       "mw-widgets-dateinput-placeholder-month": "کککک-م م",
+       "mw-widgets-titleinput-description-new-page": "تر اوسه پورې دا مخ نشته",
+       "mw-widgets-titleinput-description-redirect": "$1 ته ورگرځېدنه"
 }
index 147f55f..e1bc875 100644 (file)
@@ -93,6 +93,7 @@
        "tog-hideminor": "Ocultar edições menores nas mudanças recentes",
        "tog-hidepatrolled": "Ocultar edições patrulhadas nas mudanças recentes",
        "tog-newpageshidepatrolled": "Ocultar páginas patrulhadas da lista de páginas novas",
+       "tog-hidecategorization": "Ocultar a categorização das páginas",
        "tog-extendwatchlist": "Expandir a lista de páginas vigiadas para mostrar todas as mudanças, não apenas as mais recentes",
        "tog-usenewrc": "Agrupar alterações por páginas nas mudanças recentes e nas páginas vigiadas",
        "tog-numberheadings": "Auto-numerar cabeçalhos",
        "tog-watchlisthideliu": "Ocultar edições de usuários autenticados da lista de páginas vigiadas",
        "tog-watchlisthideanons": "Ocultar edições de usuários anônimos da lista de páginas vigiadas",
        "tog-watchlisthidepatrolled": "Ocultar edições patrulhadas da lista de páginas vigiadas",
+       "tog-watchlisthidecategorization": "Ocultar a categorização das páginas",
        "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",
        "category_header": "Páginas na categoria \"$1\"",
        "subcategories": "Subcategorias",
        "category-media-header": "Multimídia na categoria \"$1\"",
-       "category-empty": "''No momento esta categoria não possui nenhuma página ou arquivo multimídia.''",
+       "category-empty": "<em>No momento, esta categoria não possui nenhuma página ou arquivo multimídia.</em>",
        "hidden-categories": "{{PLURAL:$1|Categoria oculta|Categorias ocultas}}",
        "hidden-category-category": "Categorias ocultas",
        "category-subcat-count": "{{PLURAL:$2|Esta categoria possui apenas a seguinte subcategoria.|Esta categoria possui as seguintes $1 subcategorias, de um total de $2.}}",
        "morenotlisted": "Esta lista não está completa.",
        "mypage": "Página",
        "mytalk": "Discussão",
-       "anontalk": "Discussão para este IP",
+       "anontalk": "Discussão para este endereço IP",
        "navigation": "Navegação",
        "and": "&#32;e",
        "qbfind": "Procurar",
        "qbedit": "Editar",
        "qbpageoptions": "Esta página",
        "qbmyoptions": "Minhas páginas",
-       "faq": "FAQ",
-       "faqpage": "Project:FAQ",
+       "faq": "Perguntas frequentes",
+       "faqpage": "Project:Perguntas frequentes",
        "actions": "Ações",
        "namespaces": "Domínios",
        "variants": "Variantes",
        "permalink": "Ligação permanente",
        "print": "Imprimir",
        "view": "Ver",
-       "view-foreign": "Ver no $1",
+       "view-foreign": "Ver em $1",
        "edit": "Editar",
        "edit-local": "Editar descrição local",
        "create": "Criar",
        "create-this-page": "Iniciar esta página",
        "delete": "Eliminar",
        "deletethispage": "Eliminar esta página",
-       "undeletethispage": "Restaure esta página",
+       "undeletethispage": "Restaurar esta página",
        "undelete_short": "Restaurar {{PLURAL:$1|uma edição|$1 edições}}",
        "viewdeleted_short": "Ver {{PLURAL:$1|uma edição eliminada|$1 edições eliminadas}}",
        "protect": "Proteger",
        "unprotect": "Alterar a proteção",
        "unprotectthispage": "Alterar a proteção desta página",
        "newpage": "Página nova",
-       "talkpage": "Dialogar sobre esta página",
+       "talkpage": "Discutir sobre esta página",
        "talkpagelinktext": "Discussão",
        "specialpage": "Página especial",
        "personaltools": "Ferramentas pessoais",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que você está criando outra conta",
-       "createacct-captcha": "Verificação de segurança",
-       "createacct-imgcaptcha-ph": "Digite o texto acima",
        "createacct-submit": "Crie sua conta",
        "createacct-another-submit": "Criar conta",
        "createacct-benefit-heading": "{{SITENAME}} é feita por pessoas como você.",
        "badsiglength": "A sua assinatura é muito longa.\nEla deve ter menos de $1 {{PLURAL:$1|caractere|caracteres}}.",
        "yourgender": "Como você prefere ser descrito(a)?",
        "gender-unknown": "Ao mencionar você, o software usará palavras do gênero neutro sempre que possível",
-       "gender-male": "Ele edita páginas wiki",
-       "gender-female": "Ela edita páginas wiki",
+       "gender-male": "Ele é um usuário",
+       "gender-female": "Ela é uma usuária",
        "prefs-help-gender": "A configuração desta preferência é opcional.\nO software utiliza seu valor para tratá-lo(a) e mencioná-lo(a) a outros usando o gênero gramatical adequado.\nEsta informação será pública.",
        "email": "E-mail",
        "prefs-help-realname": "O fornecimento de seu nome verdadeiro é opcional.\nCaso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu trabalho.",
        "upload-form-label-infoform-description": "Descrição",
        "upload-form-label-usage-title": "Uso",
        "upload-form-label-usage-filename": "Nome do arquivo",
+       "foreign-structured-upload-form-label-infoform-categories": "Categorias",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
        "backend-fail-stream": "Não foi possível transmitir o arquivo  $1.",
        "backend-fail-backup": "Não foi possível fazer backup do arquivo  $1 .",
        "backend-fail-notexists": "O arquivo $1 não existe.",
        "emailccsubject": "Cópia de sua mensagem para $1: $2",
        "emailsent": "E-mail enviado",
        "emailsenttext": "Sua mensagem foi enviada.",
-       "emailuserfooter": "Este email foi enviado por $1 para $2 através da função\"{{int:emailuser}}\" do site {{SITENAME}}.",
+       "emailuserfooter": "Este e-mail foi {{GENDER:$1|enviado}} por $1 para {{GENDER:$2|$2}} através do recurso \"{{int:emailuser}}\" do site {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "wlheader-showupdated": "Páginas modificadas desde a sua última visita são mostradas em '''negrito'''",
        "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
        "wlshowlast": "Ver últimas $1 horas $2 dias",
+       "watchlistall2": "todas",
+       "watchlist-hide": "Ocultar",
+       "wlshowhideminor": "edições menores",
+       "wlshowhidebots": "robôs",
+       "wlshowhideliu": "usuários registrados",
+       "wlshowhideanons": "usuários anônimos",
+       "wlshowhidepatr": "edições patrulhadas",
+       "wlshowhidemine": "minhas edições",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "Vigiando...",
        "unwatching": "Deixando de vigiar...",
        "deletepage": "Eliminar página",
        "confirm": "Confirmar",
        "excontent": "o conteúdo era: '$1'",
-       "excontentauthor": "o conteúdo era: \"$1\" (e o único editor era \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "o conteúdo era: \"$1\",e o único editor era \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|discussão]])",
        "exbeforeblank": "o conteúdo antes de esvaziar era: '$1'",
        "delete-confirm": "Eliminar \"$1\"",
        "delete-legend": "Eliminar",
        "undeletepagetext": "{{PLURAL:$1|A seguinte página foi eliminada|As $1 páginas seguintes foram eliminadas}}, mas ainda {{PLURAL:$1|permanece|permanecem}} no arquivo e poderem ser restauradas.\nO arquivo pode ser limpo periodicamente.",
        "undelete-fieldset-title": "Restaurar edições",
        "undeleteextrahelp": "Para restaurar o histórico de edições completo desta página, desmarque todas as caixas de seleção e clique '''''{{int:undeletebtn}}'''''.\nPara efectuar uma restauração seletiva, marque as caixas correspondentes às edições que pretende restaurar e clique '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "$1 {{PLURAL:$1|edição disponível|edições disponíveis}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|revisão eliminada|revisões eliminadas}}",
        "undeletehistory": "Se restaurar a página, todas as revisões serão restauradas para o histórico.\nSe uma nova página foi criada com o mesmo nome desde a eliminação, as edições restauradas aparecerão no histórico anterior.",
        "undeleterevdel": "O restauro não será executado se resultar na remoção parcial da versão mais recente da página ou arquivo.\nEm tais casos, deverá desselecionar ou reverter a ocultação da versão apagada mais recente.",
        "undeletehistorynoadmin": "Esta página foi eliminada. O motivo de eliminação é apresentado no súmario abaixo, junto dos detalhes do usuário que editou esta página antes de eliminar. O texto atual destas edições eliminadas encontra-se agora apenas disponível para administradores.",
        "move-page-legend": "Mover página",
        "movepagetext": "Utilizando o formulário a seguir você poderá renomear uma página, movendo todo o histórico para o novo título.\nO título anterior será transformado em um redirecionamento para o novo.\nVocê poderá optar em atualizar automaticamente os redirecionamentos que se destinem ao título original.\nCaso escolha pela não-atualização, se certifique de verificar por redirecionamentos [[Special:DoubleRedirects|duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ de sua responsabilidade que os links continuem direcionando para onde eles devem.\n\nNote que a página '''não''' será movida se já existir uma página com o novo título, a não ser que ele seja um redirecionamento e não tenha histórico de edições.\nIsto significa que você pode renomear uma página de volta para o seu nome anterior se cometer algum engano e que não poderá sobrescrever uma página existente.\n\n'''CUIDADO!'''\nEsta pode ser uma mudança drástica e inesperada para uma página popular;\ntenha certeza de que compreende as consequências da mudança antes de prosseguir.",
        "movepagetext-noredirectfixer": "Usando o formulário abaixo, você irá alterar o nome de uma página e moverá todo o histórico desta para o nome novo.\nA página antiga será transformada numa página de redirecionamento para a nova.\nVerifique a existência de [[Special:DoubleRedirects|redirecionamentos duplos]] ou [[Special:BrokenRedirects|quebrados]].\nÉ sua responsabilidade certificar-se de que os links continuam a apontar para onde eles deveriam apontar.\n\nNote que a página '''não''' será movida se já existir uma página com o nome novo, a menos que esta página esteja vazia ou seja uma página de redirecionamento e não tenha um histórico de edições.\nIsto significa que, se você cometer um engano, poderá alterar o nome da página movida de volta para o seu nome original; e que não pode sobrescrever o conteúdo de uma página existente.\n\n'''Aviso!'''\nPara páginas populares, esta operação pode representar uma mudança drástica e inesperada;\ncertifique-se de que compreende as consequências da operação antes de continuar.",
-       "movepagetalktext": "A página de \"discussão\" associada, se existir, será automaticamente movida, '''a não ser que:'''\n*Uma página de discussão com conteúdo já exista sob o novo título, ou\n*Você não marque a caixa abaixo.\n\nNestes casos, você terá que mover ou mesclar a página manualmente, se assim desejar.",
+       "movepagetalktext": "Caso marcar esta caixa, a página de discussão associada será automaticamente movida para um novo título, a menos que uma página de discussão com conteúdo já existir lá.\n\n\nNeste caso, você deverá mover ou mesclar a página manualmente se desejar.",
        "moveuserpage-warning": "'''Aviso:''' Você irá mover uma página de usuário. Note que apenas a página será movida, ''sem'' alterar o nome do usuário.",
        "movecategorypage-warning": "<strong>Aviso:</strong> Você está prestes a mover uma página de categoria. Por favor, note que apenas a página será transferida e quaisquer páginas da categoria antiga <em>não</em> serão recategorizadas para o novo.",
        "movenologintext": "Você precisa ser um usuário registrado e [[Special:UserLogin|autenticado]] para poder mover uma página.",
        "cant-move-to-user-page": "Você não tem permissão para mover uma página para uma página de usuários (exceto para uma subpágina de usuário).",
        "cant-move-category-page": "Você não possui permissão para mover páginas de categorias.",
        "cant-move-to-category-page": "Você não tem permissão para mover uma página para uma categoria de páginas.",
-       "newtitle": "Para novo título",
+       "newtitle": "Novo título:",
        "move-watch": "Vigiar esta página",
        "movepagebtn": "Mover página",
        "pagemovedsub": "Página movida com sucesso",
        "movenosubpage": "Esta página não tem subpáginas.",
        "movereason": "Motivo:",
        "revertmove": "reverter",
-       "delete_and_move": "Eliminar e mover",
        "delete_and_move_text": "==Eliminação necessária==\nA página de destino (\"[[:$1]]\") já existe. Deseja eliminá-la de modo a poder mover?",
        "delete_and_move_confirm": "Sim, eliminar a página",
        "delete_and_move_reason": "Eliminada para mover \"[[$1]]\"",
        "htmlform-cloner-delete": "Remover",
        "htmlform-cloner-required": "Pelo menos um valor é requerido",
        "htmlform-title-not-creatable": "\"$1\" não é um título que possa ser atribuído a uma página",
-       "htmlform-title-not-exists": "[[:$1]] não existe.",
+       "htmlform-title-not-exists": "$1 não existe.",
        "htmlform-user-not-exists": "<strong>$1</strong> não existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> não é um nome de usuário válido.",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "log-description-pagelang": "Este é um registro de alterações aos idiomas das páginas.",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|alterou}} o idioma da página $3 de $4 para $5.",
        "default-skin-not-found": "Ops! A aparência padrão para sua wiki, definida em <code dir=\"ltr\">$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nSua instalação parece incluir a(s) seguinte(s) {{PLURAL:$4|aparência|aparências}}. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Configuração de aparência] para informações sobre como  {{PLURAL:$4|habilitá-la|habilitá-las e escolha a padrão}}.\n\n$2\n\n; Se você já instalou o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código fonte usando usando algum outro método. Isto é esperado. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git/pt-br#Usando_o_Git_para_baixar_extensões_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você é um desenvolvedor MediaWiki.\n\n; Se você já atualizou o MediaWiki:\n: O MediaWiki 1.24 e os mais recentes não permitem mais aparências instaladas automaticamente (veja [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Você pode colar {{PLURAL:$5|a seguinte linha|as seguintes linhas}} em <code>LocalSettings.php</code> para habilitar {{PLURAL:$5|a|todas as}} {{PLURAL:$5|aparência instalada|aparências instaladas}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Se você já modificou <code>LocalSettings.php</code>:\n: Verifique cuidadosamente se não há erros de digitação nos nomes das aparências.",
-       "default-skin-not-found-no-skins": "Ops! A aparência padrão para sua wiki, definida em <code>$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nVocê não tem aparências instaladas.\n\n; Se você já instalou ou atualizou o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código fonte usando usando algum outro método. Isto é esperado. O MediaWiki 1.24 e mais recentes não incluem todas as aparências no repositório principal.Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência de [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonando um dos repositórios <code>mediawiki/skins/*</code> via git no diretório <code dir=\"ltr\">skins/</code> de sua instalação MediaWiki.\n: Fazer isso não deve interferir no seu repositório git se você é um desenvolvedor MediaWiki.Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] para informações sobre como habilitar aparências e escolhar a padrão.",
+       "default-skin-not-found-no-skins": "Opa! A aparência padrão da sua wiki, definida em <code>$wgDefaultSkin</code> como <code>$1</code>, não está disponível.\n\nVocê não tem aparências instaladas.\n\n; Se você acabou de instalar ou atualizar o MediaWiki:\n: Você provavelmente instalou do git, ou diretamente do código-fonte usando usando algum outro método. Isto é esperado. O MediaWiki 1.24 e mais recentes não incluem aparências no repositório principal. Tente instalar algumas aparências do [https://www.mediawiki.org/wiki/Category:All_skins/pt-br diretório de aparências do mediawiki.org]:\n:* Baixando o [https://www.mediawiki.org/wiki/Download/pt-br instalador tarball], que vem com várias aparências e extensões. Você pode copiar e colar o diretório <code>skins/</code> dele.\n:* Baixando tarballs individuais de aparência do [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Usando_o_Git_para_baixar_aparências_do_MediaWiki Usando o Git para baixar aparências].\n: Fazer isso não deve interferir no seu repositório git se você for um(a) desenvolvedor(a) do MediaWiki. Veja [https://www.mediawiki.org/wiki/Manual:Skin_configuration/pt-br Manual:Configuração de aparências] para informações sobre como habilitar aparências e escolher a padrão.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (habilitado)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''desabilitado''')",
        "mediastatistics": "Estatísticas de mídia",
index b034a2e..e0ef903 100644 (file)
@@ -72,6 +72,7 @@
        "tog-hideminor": "Esconder edições menores nas mudanças recentes",
        "tog-hidepatrolled": "Esconder edições patrulhadas nas mudanças recentes",
        "tog-newpageshidepatrolled": "Esconder páginas patrulhadas na lista de páginas novas",
+       "tog-hidecategorization": "Ocultar categorização de páginas",
        "tog-extendwatchlist": "Listagem expandida de todas as mudanças às páginas vigiadas, não apenas das mais recentes",
        "tog-usenewrc": "Agrupar alterações por página nas mudanças recentes e páginas vigiadas",
        "tog-numberheadings": "Auto-numerar cabeçalhos",
        "morenotlisted": "Esta lista não está completa.",
        "mypage": "Página",
        "mytalk": "Discussão",
-       "anontalk": "Discussão para este IP",
+       "anontalk": "Discussão",
        "navigation": "Navegação",
        "and": "&#32;e",
        "qbfind": "Procurar",
        "title-invalid-interwiki": "O título da página solicitada contém uma ligação interlíngua que não pode ser utilizada em títulos.",
        "title-invalid-talk-namespace": "O título da página solicitada refere-se a uma página de discussão que não existe.",
        "title-invalid-characters": "O título da página solicitada contém carateres inválidos: \"$1\".",
+       "title-invalid-magic-tilde": "O título da página solicitada possui uma sequência de tis inválida (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "O título da página solicitada é demasiado longo. Não deverá ser maior que $1 {{PLURAL:$1|byte|bytes}} na codificação UTF-8.",
        "title-invalid-leading-colon": "O título da página solicitada contém um erro de pontuação (:) no início.",
        "perfcached": "Os seguintes dados encontram-se armazenados na ''cache'' e podem não estar atualizados. No máximo {{PLURAL:$1|um resultado é disponível|$1 resultados são disponíveis}} na ''cache''.",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Porque está a criar outra conta",
-       "createacct-captcha": "Verificação de segurança",
-       "createacct-imgcaptcha-ph": "Digite o texto que vê acima",
        "createacct-submit": "Crie a sua conta",
        "createacct-another-submit": "Criar conta",
        "createacct-benefit-heading": "{{SITENAME}} é feito por pessoas como você.",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailtext-user": "O utilizador $1 do projeto {{SITENAME}} pediu a recuperação da sua palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este endereço de correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailelement": "{{GENDER:$1|Utilizador|Utilizadora}}: \n$1\n\nPalavra-passe temporária: \n$2",
-       "passwordreset-emailsent": "Se este é o endereço de correio eletrónico registado para a sua conta, então ser-lhe-à enviada uma palavra-passe de reposição.",
+       "passwordreset-emailsentemail": "Se este é o endereço de correio eletrónico registado para a sua conta, então ser-lhe-à enviada uma palavra-passe de reposição.",
        "passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
        "passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
        "changeemail": "Alterar ou remover o endereço de correio eletrónico",
-       "changeemail-header": "Completa este formulário para alterar o seu endereço de correio electrónico. Se quer eliminar a associação de qualquer endereço de correio electrónico com a sua conta, deixa em branco o novo endereço de correio electrónico ao enviar o formulário.",
+       "changeemail-header": "Complete este formulário para alterar o seu endereço de correio eletrónico. Se quer eliminar a associação de qualquer endereço de correio eletrónico com a sua conta, deixe em branco o novo endereço de correio eletrónico ao submeter o formulário.",
        "changeemail-passwordrequired": "Necessita de introduzir a sua palavra-passe para confirmar esta alteração.",
        "changeemail-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "changeemail-oldemail": "Correio eletrónico atual:",
        "permissionserrors": "Erro de permissão",
        "permissionserrorstext": "Não possui permissão para fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "permissionserrorstext-withaction": "Não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
+       "contentmodelediterror": "Não pode editar esta revisão pois seu modelo de conteúdo é <code>$1</code>, e o modelo actual do conteúdo da página é <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Aviso: Está a recriar uma página anteriormente eliminada.'''\n\nVerifique se é apropriado continuar a editar esta página.\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
        "moveddeleted-notice": "Esta página foi eliminada.\nPara referência, é apresentado de seguida o registo de eliminações e de movimento da página.",
        "moveddeleted-notice-recent": "Desculpe, esta página foi eliminada recentemente (nas últimas 24 horas).\nA exclusão e registo de movimentação para a página são fornecidos abaixo para referência.",
        "showingresultsinrange": "Apresenta-se abaixo {{PLURAL:$1|<strong>1</strong> resultado|até <strong>$1</strong> resultados}} no intervalo #<strong>$2</strong> a #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultado <strong>$1</strong> de <strong>$3</strong>|Resultados <strong>$1 - $2</strong> de <strong>$3</strong>}}",
        "search-nonefound": "A pesquisa não produziu resultados.",
+       "search-nonefound-thiswiki": "Não existem resultados que correspondam à consulta neste sítio.",
        "powersearch-legend": "Pesquisa avançada",
        "powersearch-ns": "Pesquisar nos domínios:",
        "powersearch-togglelabel": "Marcar:",
        "badsiglength": "A sua assinatura é demasiado longa.\nNão deverá conter mais de $1 {{PLURAL:$1|carácter|caracteres}}.",
        "yourgender": "Como prefere ser descrito?",
        "gender-unknown": "Ao mencioná-lo, o software irá utilizar palavras de género neutro sempre que possível",
-       "gender-male": "Ele edita páginas wiki",
-       "gender-female": "Ela edita páginas wiki",
+       "gender-male": "Ele é um utilizador",
+       "gender-female": "Ela é uma utilizadora",
        "prefs-help-gender": "Esta preferência é opcional.\nO software usa o seu valor para o endereçar e para o mencionar a outros usando o género gramatical apropriado.\nEsta informação será pública.",
        "email": "Correio eletrónico",
        "prefs-help-realname": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, será utilizado para atribuir-lhe crédito pelo seu trabalho.",
        "rcshowhidemine": "$1 as minhas edições",
        "rcshowhidemine-show": "Mostrar",
        "rcshowhidemine-hide": "Ocultar",
+       "rcshowhidecategorization": "$1 categorização de páginas",
+       "rcshowhidecategorization-show": "Mostrar",
+       "rcshowhidecategorization-hide": "Ocultar",
        "rclinks": "Mostrar as últimas $1 mudanças nos últimos $2 dias<br />$3",
        "diff": "dif",
        "hist": "his",
        "recentchangeslinked-page": "Nome da página:",
        "recentchangeslinked-to": "Inversamente, mostrar mudanças às páginas que contêm ligações para esta",
        "recentchanges-page-added-to-category": "[[:$1]] foi adicionada à categoria",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|uma página|$2 páginas}} foram adicionadas à categoria",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] e {{PLURAL:$2|uma outra página|$2 outras páginas}} foram adicionadas à categoria",
        "recentchanges-page-removed-from-category": "[[:$1]] foi removida da categoria",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|uma página|$2 páginas}} foram removidas da categoria",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] e {{PLURAL:$2|uma outra página|$2 outras páginas}} foram removidas da categoria",
+       "autochange-username": "Alteração automática do MediaWiki",
        "upload": "Carregar ficheiro",
        "uploadbtn": "Carregar ficheiro",
        "reuploaddesc": "Cancelar o envio e voltar ao formulário de carregamento",
        "wlheader-showupdated": "As páginas modificadas desde a última vez que as visitou aparecem destacadas a '''negrito'''.",
        "wlnote": "A seguir {{PLURAL:$1|está a última alteração ocorrida|estão as últimas <strong>$1</strong> alterações ocorridas}} {{PLURAL:$2|na última hora|nas últimas <strong>$2</strong> horas}} até $3, $4.",
        "wlshowlast": "Ver últimas $1 horas $2 dias",
+       "watchlistall2": "todas",
+       "watchlist-hide": "Ocultar",
+       "wlshowtime": "Mostrar mudanças desde há:",
+       "wlshowhideminor": "edições menores",
+       "wlshowhidebots": "robôs",
+       "wlshowhideliu": "usuários registrados",
+       "wlshowhideanons": "usuários anônimos",
+       "wlshowhidepatr": "edições patrulhadas",
+       "wlshowhidemine": "minhas edições",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "A vigiar...",
        "unwatching": "A deixar de vigiar...",
        "contributions": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}}",
        "contributions-title": "Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1",
        "mycontris": "Contribuições",
+       "anoncontribs": "Contribuições",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "A conta de utilizador \"$1\" não está registada.",
        "nocontribs": "Não foram encontradas alterações com este critério.",
        "movenosubpage": "Esta página não tem subpáginas.",
        "movereason": "Motivo:",
        "revertmove": "reverter",
-       "delete_and_move": "Eliminar e mover",
        "delete_and_move_text": "==Eliminação necessária==\nA página de destino (\"[[:$1]]\") já existe. Deseja eliminá-la de modo a poder mover?",
        "delete_and_move_confirm": "Sim, eliminar a página",
        "delete_and_move_reason": "Eliminada para poder mover \"[[$1]]\" para este título",
        "htmlform-cloner-required": "Pelo menos um valor é necessário.",
        "htmlform-title-badnamespace": "[[:$1]] não se encontra no domínio \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" não é um título que possa ser atribuído a uma página",
-       "htmlform-title-not-exists": "[[:$1]] não existe.",
+       "htmlform-title-not-exists": "$1 não existe.",
        "htmlform-user-not-exists": "<strong>$1</strong> não existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> não é um nome de utilizador válido.",
        "sqlite-has-fts": "$1 com suporte de pesquisa de texto completo",
        "logentry-newusers-autocreate": "A conta de utilizador $1 foi criada automaticamente",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|moveu}} as preferências de proteção de $4 para $3",
        "logentry-protect-unprotect": "$1 {{GENDER:$2|removido}} proteção de $3",
-       "logentry-protect-protect": "$1 {{GENDER:$2|protegidas}} $3 $4",
+       "logentry-protect-protect": "$1 {{GENDER:$2|protegeu}} $3 $4",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|protegido}} $3 $4 [cascading]",
        "logentry-protect-modify": "$1 {{GENDER:$2|alterado}} nível de proteção para $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|alterado}} nível de proteção para us$3 $4 [cascading]",
index 3592562..1c32302 100644 (file)
                        "TTO",
                        "J. 'mach' wust",
                        "Ciencia Al Poder",
-                       "Aursani"
+                       "Aursani",
+                       "Robin van der Vliet"
                ]
        },
        "sidebar": "{{notranslate}}",
        "tog-watchlisthidebots": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide bot edits from watchlist. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthideminor": "[[Special:Preferences]], tab 'Watchlist'. Offers user to hide minor edits from watchlist. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthideliu": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
+       "tog-watchlistreloadautomatically": "[[Special:Preferences]], tab 'Watchlist'. Offers user to to automatically refresh the watchlist page, when a filter is changed.",
        "tog-watchlisthideanons": "Option in tab 'Watchlist' of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthidepatrolled": "Option in Watchlist tab of [[Special:Preferences]]. {{Gender}}\n\n{{Related|Preferences-watchlistrc-toggle}}",
        "tog-watchlisthidecategorization": "Option in Watchlist tab of [[Special:Preferences]]. Offers user to hide/show categorization of pages. Appears next to checkboxes with labels such as {{msg-mw|tog-watchlisthideminor}}.",
        "morenotlisted": "An indication that more of a templates list is not shown.\n\nUsed as \"More...\" link for {{msg-mw|pageinfo-templates}} field.\n\nSimilar to {{msg-mw|moredotdotdot}}.",
        "mypage": "A text for the link to the user's user page in the links at the top of the page.\n{{Identical|Page}}",
        "mytalk": "In the personal URLs page section - right upper corner.\n\nUsed as link title in your personal toolbox.\n\nSee also:\n* {{msg-mw|Mytalk}}\n* {{msg-mw|Accesskey-pt-mytalk}}\n* {{msg-mw|Tooltip-pt-mytalk}}\n{{Identical|Talk}}",
-       "anontalk": "Link to the talk page appearing in [[mw:Help:Navigation#User_Links|user links]] for each anonymous users when [[mw:Manual:$wgShowIPinHeader|$wgShowIPinHeader]] is true.\n\nSee also:\n* {{msg-mw|Anontalk}}\n* {{msg-mw|Accesskey-pt-anontalk}}\n* {{msg-mw|Tooltip-pt-anontalk}}",
+       "anontalk": "Same as {{msg-mw|mytalk}} but used for non-logged-in users.\n{{Identical|Talk}}\n\nSee also:\n* {{msg-mw|Accesskey-pt-anontalk}}\n* {{msg-mw|Tooltip-pt-anontalk}}",
        "navigation": "This is shown as a section header in the sidebar of most skins.\n\n{{Identical|Navigation}}",
        "and": "The translation for \"and\" appears in the [[Special:Version]] page, between the last two items of a list. If a comma is needed, add it at the beginning without a gap between it and the \"&\". &amp;#32; is a blank space, one character long. Please leave it as it is.\n\nThis can also appear in the credits page if the credits feature is enabled,for example [{{canonicalurl:Support|action=credits}} the credits of the support page]. (To view any credits page type <nowiki>&action=credits</nowiki> at the end of any URL in the address bar.)\n{{Identical|And}}",
        "qbfind": "Alternative for \"search\" as used in Cologne Blue skin.\n{{Identical|Find}}",
        "databaseerror-query": "Identifies, in the list of technical details, the [[wikipedia:SQL|SQL]] statement that failed.\nParameters:\n* $1 - SQL statement (shown within a box)\n{{Identical|Query}}",
        "databaseerror-function": "Identifies, in the list of technical details, the function that tried to execute the database query.\nParameters:\n* $1 - Name of function\n{{Identical|Function}}",
        "databaseerror-error": "Identifies, in the list of technical details, the error message the database server returned.\nParameters:\n* $1 - Error message from the database server, probably in English\n{{Identical|Error}}",
+       "transaction-duration-limit-exceeded": "Plain text error shown when DB updates take too long. Parameters:\n* $1 - time spent in database updates\n* $2 - maximum time allowed in database updates",
        "laggedslavemode": "Used as warning when getting the timestamp of the latest version, if in LaggedSlaveMode.",
        "readonly": "Used as title of error message when database is locked.",
        "enterlockreason": "For developers when locking the database",
        "missingarticle-rev": "Used as <code>$2</code> in {{msg-mw|Missing-article}}\n\nPreceded by the page title.\n\n[{{canonicalurl:Translating:Tasks|oldid=371789000}} Click here] to see an example of such an error message.\n\nParameters:\n* $1 - revision# of the requested ID",
        "missingarticle-diff": "Used as <code>$2</code> in {{msg-mw|Missing-article}}\n\nPreceded by the page title.\n\n[{{canonicalurl:Translating:Tasks|diff=372398&oldid=371789000}} Click here] to see an example of such an error message.\n\nParameters:\n* $1 - the old revision ID\n* $2 - the revision ID to build the diff with",
        "readonly_lag": "Error message displayed when the database is locked.",
+       "nonwrite-api-promise-error": "Error message displayed when the 'Promise-Non-Write-API-Action' HTTP header is misused.",
        "internalerror": "{{Identical|Internal error}}",
        "internalerror_info": "Parameters:\n* $1 - error message",
        "internalerror-fatal-exception": "Error message displayed by MediaWiki itself when the request failed, inside an error box which also contains a code, a timestamp and a colon before this message.\nParameters:\n* $1 - proper name of the kind of error\n* $2 - alphanumeric code identifying the error in the server logs\n* $3 - URL which resulted in the error\n$2 and $3 are not used by default and only available for wiki customisations, because they are useful for communication to the wiki system administrator.",
        "createaccountreason": "Since 1.22 no longer used in core, but may be used by some extensions. DEPRECATED\n\n{{Identical|Reason}}",
        "createacct-reason": "In create account form, label for field to enter reason to create an account when already logged-in.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n{{Identical|Reason}}",
        "createacct-reason-ph": "Placeholder in vertical-layout create account form for reason field.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
-       "createacct-captcha": "Label in vertical-layout create account form for CAPTCHA input field when repositioned by JavaScript.",
        "createacct-imgcaptcha-help": "{{Optional}} Optional help text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.\n\nBlank by default.",
-       "createacct-imgcaptcha-ph": "Placehodler text in vertical-layout create account form for image CAPTCHA input field when repositioned by JavaScript.",
        "createacct-submit": "Submit button on vertical-layout create account form.\n\nSee example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]",
        "createacct-another-submit": "Submit button of  [[Special:UserLogin/signup]] ([[Special:CreateAccount]]) when accessed by a registered user.\n\nThe original means \"create an account in addition to the one you already have\"; sometimes, but not always, it means you are going to \"Create the account on behalf of somebody else\" or \"Create account for another\".\n{{Identical|Create another account}}",
        "createacct-benefit-heading": "In vertical-layout create account form, the heading for the section describing the benefits of creating an account. See example: [{{canonicalurl:Special:UserLogin|type=signup}} Special:UserLogin?type=signup]\n\nIf in your language you need to know the gender of the name for the wiki (which is the subject of the English sentence), please adapt the sentence as much as you need for your translation to fit.",
        "wrongpasswordempty": "Error message displayed when entering a blank password.\n{{Identical|Please try again}}",
        "passwordtooshort": "This message is shown in [[Special:Preferences]] and [[Special:CreateAccount]].\n\nParameters:\n* $1 - the minimum number of characters in the password",
        "passwordtoolong": "This message is shown in [[Special:Preferences]], [[Special:CreateAccount]], and [[Special:Userlogin]].\n\nParameters:\n* $1 - the maximum number of characters in the password",
+       "passwordtoopopular": "Shown if the user chooses a really popular password.",
        "password-name-match": "Used as error message when password validity check failed.",
        "password-login-forbidden": "Error message shown when the user has tried to log in using one of the special username/password combinations used for MediaWiki testing. (See [[mwr:75589]], [[mwr:75605]].)",
        "mailmypassword": "Used as label for Submit button in [[Special:PasswordReset]].\n{{Identical|Reset password}}",
        "passwordreset-emailtext-ip": "Be consistent with {{msg-mw|Passwordreset-emailtext-user}}.\n\nParameters:\n* $1 - an IP address\n* $2 - message {{msg-mw|Passwordreset-emailelement}} repeated $3 times\n* $3 - the number of repetitions in $2\n* $4 - base URL of the wiki\n* $5 - number of days",
        "passwordreset-emailtext-user": "Be consistent with {{msg-mw|Passwordreset-emailtext-ip}}.\n\nParameters:\n* $1 - a user name, no GENDER suport.\n* $2 - message {{msg-mw|Passwordreset-emailelement|notext=1}} repeated $3 times\n* $3 - the number of repetitions in $2\n* $4 - base URL of the wiki\n* $5 - number of days",
        "passwordreset-emailelement": "This is a body of a password reset email to allow them into the system with a new password. Parameters:\n* $1 - the user's login name. This parameter can be used for GENDER.\n* $2 - the temporary password given by the system",
-       "passwordreset-emailsent": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsent}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
+       "passwordreset-emailsentemail": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
+       "passwordreset-emailsentusername": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
+       "passwordreset-emailsent-capture": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
+       "passwordreset-emailerror-capture": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}",
        "changeemail": "Title of [[Special:ChangeEmail|special page]]. This page also allows removing the user's email address.",
        "changeemail-summary": "{{ignored}}",
        "changeemail-header": "Text of [[Special:ChangeEmail]].",
        "showingresultsinrange": "Used in pagination of [[Special:MostLinkedCategories]]. Parameters:\n* $1 - the total number of results in the batch shown\n* $2 - the number of the first item listed\n* $3 - the number of last item in the batch shown\n\nSee also {{msg-mw|Showingresults}}",
        "search-showingresults": "Used in search results of [[Special:Search]]. Parameters:\n* $1 - minimum offset\n* $2 - maximum offset\n* $3 - total number of results\n* $4 - number of results",
        "search-nonefound": "Message shown when a search returned no results (when using the default MediaWiki search engine).",
+       "search-nonefound-thiswiki": "Message shown when a search in current wiki returned no results (when using the default MediaWiki search engine) but search in other wikis did return results.",
        "powersearch-legend": "Advanced search\n\n{{Identical|Advanced search}}",
        "powersearch-ns": "Used in the extended search form at [[Special:Search]]",
        "powersearch-togglelabel": "Used in [{{canonicalurl:Special:Search|advanced=1}} Advanced search]. Synonym: \"Select\" as verb.\n{{Identical|Check}}",
        "prefs-help-prefershttps": "Used as help text for the checkbox in [[Special:Preferences]].\n\nThe checkbox has the label {{msg-mw|Tog-prefershttps}}.\n\nSee example: [[mw:Special:Preferences]].",
        "prefswarning-warning": "Warning shown (except in Firefox) when attempting to leave [[Special:Preferences]] with unsaved changes.\n\nParameters:\n* $1 - Text of {{msg-mw|saveprefs}}, as <nowiki>{{int:saveprefs}}</nowiki> cannot be used directly.",
        "prefs-tabs-navigation-hint": "Hint message that explains the arrow key navigation for the tabs on [[Special:Preferences]] to screenreader users.",
-       "email-address-validity-valid": "Used as hint for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is valid.",
-       "email-address-validity-invalid": "Used as warning for {{msg-mw|changeemail-newemail}} field in [[Special:ChangeEmail]], when the provided E-mail address is invalid.",
        "userrights": "Page title of [[Special:UserRights]].",
        "userrights-summary": "{{doc-specialpagesummary|userrights}}",
        "userrights-lookup-user": "Label text when managing user rights ([[Special:UserRights]])",
        "recentchanges-legend-bot": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-bot}}.",
        "recentchanges-legend-unpatrolled": "Used as legend on [[Special:RecentChanges]] and [[Special:Watchlist]].\n\nRefers to {{msg-mw|Recentchanges-label-unpatrolled}}.",
        "recentchanges-legend-plusminus": "{{optional}}\nA plus/minus sign with a number for the legend.",
+       "recentchanges-submit": "Label for submit button in [[Special:RecentChanges]]\n{{Identical|Show}}",
        "rcnotefrom": "This message is displayed at [[Special:RecentChanges]] when viewing recentchanges from some specific time.\n\nThe corresponding message is {{msg-mw|Rclistfrom}}.\n\nParameters:\n* $1 - the maximum number of changes that are displayed\n* $2 - (Optional) a date and time\n* $3 - a date\n* $4 - a time\n* $5 - Number of changes are displayed, for use with PLURAL",
        "rclistfrom": "Used on [[Special:RecentChanges]]. Parameters:\n* $1 - (Currently not use) date and time. The date and the time adds to the rclistfrom description.\n* $2 - time. The time adds to the rclistfrom link description (with split of date and time).\n* $3 - date. The date adds to the rclistfrom link description (with split of date and time).\n\nThe corresponding message is {{msg-mw|Rcnotefrom}}.",
        "rcshowhideminor": "Option text in [[Special:RecentChanges]]. Parameters:\n* $1 - the \"show/hide\" command, with the text taken from either {{msg-mw|rcshowhideminor-show}} or {{msg-mw|rcshowhideminor-hide}}\n{{Identical|Minor edit}}",
        "upload-form-label-infoform-description": "Label for the file description input\n{{Identical|Description}}",
        "upload-form-label-usage-title": "Title for the insert form showing how to use the uploaded item.\n{{Identical|Usage}}",
        "upload-form-label-usage-filename": "Label for the file name input\n{{Identical|Filename}}",
-       "foreign-structured-upload-form-label-own-work": "Label for own work toggle",
+       "foreign-structured-upload-form-label-own-work": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Label for own work confirmation checkbox",
        "foreign-structured-upload-form-label-infoform-categories": "Label for category selector input\n{{Identical|Category}}",
        "foreign-structured-upload-form-label-infoform-date": "Label for date input\n{{Identical|Date}}",
        "foreign-structured-upload-form-label-own-work-message-local": "Message shown by local when a user affirms that they are allowed to upload a file to the local wiki.",
        "foreign-structured-upload-form-label-own-work-message-default": "Message shown by default when a user affirms that they are allowed to upload a file to a remote wiki.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Message shown by default when a user cannot upload a file to a remote wiki.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Suggests uploading a file locally instead of to a remote wiki.",
-       "foreign-structured-upload-form-label-own-work-message-shared": "Legal message to show when the work is made by the uploader.",
-       "foreign-structured-upload-form-label-not-own-work-message-shared": "Message to show when the work isn't owned by the uploader.",
-       "foreign-structured-upload-form-label-not-own-work-local-shared": "Message suggesting the user might want to upload a file locally instead of to Wikimedia Commons. $1 is the name of the local wiki.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Legal message, confirming that the user is allowed to upload the file. Almost identical to {{msg-mw|foreign-structured-upload-form-2-label-termsofuse}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 1.png|thumb]] Message suggesting the user might want to upload a file locally instead of to Wikimedia Commons.",
+       "foreign-structured-upload-form-2-label-intro": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Introductory text in cross-wiki upload dialog.",
+       "foreign-structured-upload-form-2-label-ownwork": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.",
+       "foreign-structured-upload-form-2-label-noderiv": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.",
+       "foreign-structured-upload-form-2-label-useful": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.",
+       "foreign-structured-upload-form-2-label-ccbysa": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Affirmative statement, used as checkbox label. The user must tick it to continue.",
+       "foreign-structured-upload-form-2-label-alternative": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.",
+       "foreign-structured-upload-form-2-label-termsofuse": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 2.png|thumb]] Legal message, confirming that the user is allowed to upload the file. Almost identical to {{msg-mw|foreign-structured-upload-form-label-own-work-message-shared}}.",
+       "foreign-structured-upload-form-3-label-question-website": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.",
+       "foreign-structured-upload-form-3-label-question-ownwork": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.",
+       "foreign-structured-upload-form-3-label-question-noderiv": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Question to the user, with Yes/No answer ({{msg-mw|foreign-structured-upload-form-3-label-yes}} / {{msg-mw|foreign-structured-upload-form-3-label-no}}). The answer determines whether the user will be able to continue.",
+       "foreign-structured-upload-form-3-label-yes": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] {{Identical|Yes}}",
+       "foreign-structured-upload-form-3-label-no": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] {{Identical|No}}",
+       "foreign-structured-upload-form-3-label-alternative": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 3.png|thumb]] Explains alternatives when the copyright isn't owned by the uploader.",
+       "foreign-structured-upload-form-4-label-good": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 4.png|thumb]] Gives examples of good content that is welcome. There is limited space for this text in the interface, please keep it short.",
+       "foreign-structured-upload-form-4-label-bad": "[[File:Cross-wiki media upload dialog, December 2015 AB test option 4.png|thumb]] Gives examples of bad content that is unacceptable. There is limited space for this text in the interface, please keep it short.",
        "backend-fail-stream": "Parameters:\n* $1 - a filename",
        "backend-fail-backup": "Parameters:\n* $1 - a filename",
        "backend-fail-notexists": "Parameters:\n* $1 - a filename",
        "prefixindex": "{{doc-special|PrefixIndex}}\nWhen the user limits the list to a certain namespace, {{msg-mw|allinnamespace}} is used instead.",
        "prefixindex-namespace": "The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace",
        "prefixindex-summary": "{{notranslate}}\n\nThe summary displayed at the top of [[Special:Prefixindex]]. [[mw:Manual:Interface/Special pages summary|MediaWiki manual]].",
+       "prefixindex-submit": "Label on submit button in [[Special:PrefixIndex]]\n{{Identical|Show}}",
        "prefixindex-strip": "Label for a checkbox. If the checkbox is checked, the prefix searched will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].\n\nSee the following search results:\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)",
        "shortpages": "{{doc-special|ShortPages}}",
        "shortpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Shortpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "protectedpages-performer": "This is a column header in the table on the page [[Special:ProtectedPages]].",
        "protectedpages-params": "This is a column header in the table on the page [[Special:ProtectedPages]].\n\nProtection parameters are:\n* {{msg-mw|Restriction-level-autoconfirmed}}\n* {{msg-mw|Restriction-level-sysop}}",
        "protectedpages-reason": "This is a column header in the table on the page [[Special:ProtectedPages]].\n{{Identical|Reason}}",
+       "protectedpages-submit": "Label on search button in [[Special:ProtectedPages]]",
        "protectedpages-unknown-timestamp": "This is shown, when the date and time is unknown for a protection on the page [[Special:ProtectedPages]].\n{{Identical|Unknown}}",
        "protectedpages-unknown-performer": "This is shown, when the protecting user is unknown for a protection on the page [[Special:ProtectedPages]].",
        "protectedpages-unknown-reason": "{{ignored}}Comment used for extremely old protection log events (before there was a reason field).",
        "protectedtitles": "{{doc-special|ProtectedTitles}}",
        "protectedtitles-summary": "Summary of [[Special:ProtectedTitles]].\n\nSee also:\n* {{msg-mw|Protectedpages-summary}}",
        "protectedtitlesempty": "Used on [[Special:ProtectedTitles]]. This text appears if the list of protected titles is empty. See the [[mw:Project:Protected_titles|help page on MediaWiki]] for more information.",
+       "protectedtitles-submit": "Label on submit button in [[Special:ProtectedTitles]]",
        "listusers": "{{doc-special|ListUsers}}",
        "listusers-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Listusers]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
        "listusers-editsonly": "Option in [[Special:ListUsers]].",
        "usercreated": "Used in [[Special:ListUsers]]. Parameters:\n* $1 - a date\n* $2 - a time\n* $3 - the name of the user, for use in GENDER",
        "newpages": "{{doc-special|NewPages}}\n{{Identical|New page}}",
        "newpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Newpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
+       "newpages-submit": "Submit button on [[Special:Newpages]]\n{{Identical|Show}}",
        "newpages-username": "{{Identical|Username}}",
        "ancientpages": "{{doc-special|AncientPages}}\nSee [[mw:Manual:Interface/Special pages title|manual]].",
        "ancientpages-summary": "{{doc-specialpagesummary|ancientpages}}",
        "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\".",
        "speciallogtitlelabel": "Used in [[Special:Log]] as a label for an input field with which the log can be filtered.  This filter selects for pages or users on which a log action was performed.",
        "log": "{{doc-special|Log}}\n{{Identical|Log}}",
+       "logeventslist-submit": "Submit button on [[Special:Log]]\n{{Identical|Show}}",
        "all-logs-page": "{{doc-logpage}}\nTitle of [[Special:Log]].",
        "alllogstext": "Header of [[Special:Log]]",
        "logempty": "Used as warning when there are no items to show.",
        "cachedspecial-refresh-now": "Link text pointing to the most recent version of the page.",
        "categories": "The page name of [[Special:Categories]].\n{{Identical|Category}}",
        "categories-summary": "{{doc-specialpagesummary|categories}}",
+       "categories-submit": "Submit button on [[Special:Categories]]\n{{Identical|Show}}",
        "categoriespagetext": "{{doc-important|Do not translate or change links.}}\nText displayed in [[Special:Categories]].\n\nIn order to translate \"Unused categories\" and \"wanted categories\" see {{msg-mw|Unusedcategories}} and {{msg-mw|Wantedcategories}}.\n\nParameters:\n* $1 - number of categories",
        "categoriesfrom": "Used as label for the input box in [[Special:Categories]].\n\nThis message follows the fieldset label {{msg-mw|categories}}, and is followed by the input box.",
        "special-categories-sort-count": "Commented out at this time.\n\nThis message is used on [[Special:Categories]] to sort the list by the number of members in the categories.\n\nSee also:\n* {{msg-mw|Special-categories-sort-abc}}",
        "activeusers-hidebots": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-from|label for input box}}\n* {{msg-mw|activeusers-hidesysops|label for checkbox}}",
        "activeusers-hidesysops": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}\n* {{msg-mw|activeusers-from|label for input box}}\n* {{msg-mw|activeusers-hidebots|label for checkbox}}",
        "activeusers-noresult": "identical with {{msg-mw|listusers-noresult}}",
+       "activeusers-submit": "Used as label for button in the form on [[Special:ActiveUsers]]",
        "listgrouprights": "The name of the special page [[Special:ListGroupRights]].",
        "listgrouprights-summary": "The description used on [[Special:ListGroupRights]].\n\nRefers to {{msg-mw|Listgrouprights-helppage}}.",
        "listgrouprights-key": "Footer note for the [[Special:ListGroupRights]] page",
        "wlheader-showupdated": "Message at the top of [[Special:Watchlist]], after {{msg-mw|watchlist-details}}. Has to be a full sentence.",
        "wlnote": "Used on [[Special:Watchlist]] when a maximum number of hours or days is specified.\n\nParameters:\n* $1 - the number of changes shown\n* $2 - the number of hours for which the changes are shown\n* $3 - a date alone\n* $4 - a time alone",
        "wlshowlast": "Appears on [[Special:Watchlist]]. Parameters:\n* $1 - a choice of different numbers of hours (\"1 | 2 | 6 | 12\")\n* $2 - a choice of different numbers of days (\"1 | 3 | 7\" and the maximum number of days available)\nClicking on your choice changes the list of changes you see (without changing the default in my preferences).",
+       "watchlistall2": "Appears on [[Special:Watchlist]], after {{msg-mw|wlshowtime}}, as the option to display all available data regardless of age.\n{{Identical|All}}",
+       "watchlist-hide": "Appears on [[Special:Watchlist]]. It is the first word on a new line with checkboxes to hide/unhide options\n{{Identical|Hide}}",
+       "watchlist-submit": "Label on the submit button in [[Special:Watchlist]]\n{{Identical|Show}}",
+       "wlshowtime": "Appears on [[Special:Watchlist]]. Label of a drop-down list used to specify the period of time to display in the watchlist. This period can be {{msg-mw|days}}, {{msg-mw|hours}}, or {{msg-mw|watchlistall2}}.",
+       "wlshowhideminor": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhideminor}}.\n{{Identical|Minor edit}}",
+       "wlshowhidebots": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhidebots}}.\n{{Identical|Bot}}",
+       "wlshowhideliu": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhideliu}}.\n{{Identical|Registered user}}",
+       "wlshowhideanons": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhideanons}}.\n{{Identical|Anonymous user}}",
+       "wlshowhidepatr": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhidepatr}}.",
+       "wlshowhidemine": "Option text in [[Special:Watchlist]]. Cf. {{msg-mw|rcshowhidemine}}.",
        "watchlist-options": "Legend of the fieldset of [[Special:Watchlist]]\n\nSee also:\n* {{msg-mw|Watchlist-details|watchlist header}}\n* {{msg-mw|Wlheader-enotif|watchlist header}}\n* {{msg-mw|enotif reset|Submit button text}}",
        "watching": "Text displayed when clicked on the watch tab: {{msg-mw|Watch}}. It means the wiki is adding that page to your watchlist.",
        "unwatching": "Text displayed when clicked on the unwatch tab: {{msg-mw|Unwatch}}. It means the wiki is removing that page from your watchlist.",
        "delete-confirm": "Used as page title. Parameters:\n* $1 - the page title\n{{Identical|Delete}}",
        "delete-legend": "{{Identical|Delete}}",
        "historywarning": "Warning when about to delete a page that has history.\n\nFollowed by a link which points to the history page.\n\nParameters:\n* $1 - the number of revisions that the page has",
+       "historyaction-submit": "Submit button on history pages\n{{Identical|Show}}",
        "confirmdeletetext": "Introduction shown when deleting a page.\n\nRefers to {{msg-mw|Policy-url}}.",
        "actioncomplete": "Used in several situations, for example when a page has been deleted.\n\nSee also:\n* {{msg-mw|Actionfailed|page title}}",
        "actionfailed": "Used as page title when the submit operation failed, in [[Special:RevisionDelete]].\n\nSee also:\n* {{msg-mw|Actioncomplete|page title}}",
        "contributions-summary": "{{doc-specialpagesummary|contributions}}",
        "contributions-title": "{{Gender}}\nThe page title in your browser bar, but not the page title.\n\nParameters:\n* $1 - the username\nSee also:\n* {{msg-mw|Contributions}}",
        "mycontris": "In the personal urls page section - right upper corner.\n\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}\n{{Identical|Contribution}}",
+       "anoncontribs": "Same as {{msg-mw|mycontris}} but used for non-logged-in users.\n\nSee also:\n* {{msg-mw|Accesskey-pt-anoncontribs}}\n* {{msg-mw|Tooltip-pt-anoncontribs}}\n{{Identical|Contribution}}",
        "contribsub2": "Contributions for \"user\" (links). Parameters:\n* $1 is an IP address or a username, with a link which points to the user page (if registered user).\n* $2 is list of tool links. The list contains a link which has text {{msg-mw|Sp-contributions-talk}}.\n* $3 is a plain text username used for GENDER.\n{{Identical|For $1}}",
        "contributions-userdoesnotexist": "This message is used in [[Special:Contributions]]. It is used to tell the user that the name he searched for doesn't exists.\n\nParameters:\n* $1 - a username\n\n{{identical|userdoesnotexist}}",
        "nocontribs": "Used in [[Special:Contributions]] and [[Special:DeletedContributions]].\n\nSee examples: [[Special:Contributions/x]] and [[Special:DeletedContributions/x]].\n\nParameters:\n* $1 - (Unused) the user name",
        "whatlinkshere-hidelinks": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}\n{{Identical|Link}}",
        "whatlinkshere-hideimages": "Filter option in [[Special:WhatLinksHere]]. Parameters:\n* $1 - the {{msg-mw|Hide}} or {{msg-mw|Show}}\n\nSee also:\n*{{msg-mw|Isimage}}\n*{{msg-mw|Media tip}}",
        "whatlinkshere-filters": "{{Identical|Filter}}",
+       "whatlinkshere-submit": "Label for submit button in [[Special:WhatLinksHere]]\n{{Identical|Go}}",
        "autoblockid": "Used as name of autoblock, instead of autoblocked IPs. Parameters:\n* $1 - autoblock ID",
        "block": "{{doc-special|Block}}\n{{Identical|Block user}}",
        "unblock": "{{doc-special|Unblock}}",
        "move-redirect-text": "{{ignored}}The text that's added to a redirected page when that redirect is created.",
        "category-move-redirect-override": "{{ignored}}The text that's added to a redirected category page when that redirect is created.",
        "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.\n\nThis message is to confirm that you really want to delete the page.\n\nParameters:\n* $1 - the destination page title\n\nSee also:\n* {{msg-mw|Delete and move confirm}}",
        "delete_and_move_confirm": "Used when moving a page, but the destination page already exists and needs deletion.\n\nThis message is for a checkbox to confirm that you really want to delete the page.\n\nSee also:\n* {{msg-mw|Delete and move text}}",
        "delete_and_move_reason": "Shown as reason in content language in the deletion log. Parameter:\n* $1 - The page name for which this page was deleted.",
        "accesskey-pt-preferences": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mypreferences}}\n* {{msg-mw|Accesskey-pt-preferences}}\n* {{msg-mw|Tooltip-pt-preferences}}",
        "accesskey-pt-watchlist": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mywatchlist}}\n* {{msg-mw|Accesskey-pt-watchlist}}\n* {{msg-mw|Tooltip-pt-watchlist}}",
        "accesskey-pt-mycontris": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}",
+       "accesskey-pt-anoncontribs": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Anoncontribs}}\n* {{msg-mw|Tooltip-pt-anoncontribs}}",
        "accesskey-pt-login": "{{doc-accesskey}}",
        "accesskey-pt-logout": "{{doc-accesskey}}\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}",
        "accesskey-pt-createaccount": "{{doc-accesskey}}",
        "tooltip-pt-preferences": "Tooltip shown when hovering over the {{msg-mw|Mypreferences}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mypreferences}}\n* {{msg-mw|Accesskey-pt-preferences}}\n* {{msg-mw|Tooltip-pt-preferences}}\n{{Identical|Preferences}}",
        "tooltip-pt-watchlist": "Tooltip shown when hovering over the {{msg-mw|Mywatchlist}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mywatchlist}}\n* {{msg-mw|Accesskey-pt-watchlist}}\n* {{msg-mw|Tooltip-pt-watchlist}}",
        "tooltip-pt-mycontris": "Tooltip shown when hovering over the {{msg-mw|Mycontris}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Mycontris}}\n* {{msg-mw|Accesskey-pt-mycontris}}\n* {{msg-mw|Tooltip-pt-mycontris}}",
+       "tooltip-pt-anoncontribs": "Tooltip shown when hovering over the {{msg-mw|Anoncontribs}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Anoncontribs}}\n* {{msg-mw|Accesskey-pt-anoncontribs}}",
        "tooltip-pt-login": "Tooltip shown when hovering over the link 'Log in' in the upper right corner show on all pages while not logged in.",
        "tooltip-pt-logout": "Tooltip shown when hovering over the {{msg-mw|Logout}} link in your personal toolbox (upper right side).\n\nSee also:\n* {{msg-mw|Logout}}\n* {{msg-mw|Accesskey-pt-logout}}\n* {{msg-mw|Tooltip-pt-logout}}\n{{Identical|Log out}}",
        "tooltip-pt-createaccount": "Tooltip shown when hovering over the link 'Create account' in the upper right corner show on all pages while not logged in.",
        "exif-compression-34712": "{{optional}}",
        "exif-copyrighted-true": "The image is under copyright (including if its copyrighted but freely licensed)",
        "exif-copyrighted-false": "Copyright status is not set in the file.\n\nCompare: {{msg-mw|exif-copyrighted-true}}.",
-       "exif-photometricinterpretation-2": "{{optional}}",
-       "exif-photometricinterpretation-6": "{{optional}}",
+       "exif-photometricinterpretation-0": "Black and white image. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-1": "Black and white image. Commons for B&W tiffs. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-2": "{{optional}} RGB (red green blue) image. Common for colour tiffs. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-3": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-4": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-5": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-6": "{{optional}}\nYCbCr encoding. Common for jpeg images and tiffs with jpeg compressed data",
+       "exif-photometricinterpretation-8": "{{optional}}\nSee http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-9": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-10": "See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-32803": "Used mostly by DNG images. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
+       "exif-photometricinterpretation-34892": "Used mostly by DNG images. See http://www.awaresystems.be/imaging/tiff/tifftags/photometricinterpretation.html",
        "exif-unknowndate": "Used if the Exif date and time is \"<code>0000:00:00 00:00:00</code>\".\n\nRelated Exif attributes:\n* {{msg-mw|Exif-datetime}}\n* {{msg-mw|Exif-datetimeoriginal}}\n* {{msg-mw|Exif-datetimedigitized}}\n* {{msg-mw|Exif-datetimereleased}}\n* {{msg-mw|Exif-datetimeexpires}}\n* {{msg-mw|Exif-gpsdatestamp}}\n* {{msg-mw|Exif-dc-date}}\n* {{msg-mw|Exif-datetimemetadata}}",
        "exif-orientation-1": "0th row: top; 0th column: left\n{{Related|Exif-orientation}}\n{{Identical|Normal}}",
        "exif-orientation-2": "0th row: top; 0th column: right\n{{Related|Exif-orientation}}",
        "logentry-suppress-block": "{{Logentry}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
        "logentry-suppress-reblock": "{{Logentry}}\n* $4 - user name for gender or empty string for autoblocks\n* $5 - the block duration, localized and formatted with the english tooltip\n* $6 - block detail flags or empty string",
        "logentry-import-upload": "{{Logentry|[[Special:Log/import]]}}",
+       "logentry-import-upload-details": "{{Logentry|[[Special:Log/import]]}}\n* $4 - Number of imported revisions\n\nCf. {{msg-mw|logentry-import-upload}}",
        "logentry-import-interwiki": "{{Logentry|[[Special:Log/import]]}}",
+       "logentry-import-interwiki-details": "{{Logentry|[[Special:Log/import]]}}\n* $4 - Number of imported revisions\n* $5 - Interwiki title\n\nCf. {{msg-mw|logentry-import-interwiki}}",
        "logentry-merge-merge": "{{Logentry|[[Special:Log/merge]]}}\n* $4 - the page into which the content is merged\n* $5 - a timestamp of limit\n\nThe log and its associated special page 'MergeHistory' is not enabled by default.\n\nPlease note that the parameters in a log entry will appear in the log only in the default language of the wiki. View [[Special:Log]] for examples on translatewiki.net with English default language.",
        "logentry-move-move": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",
        "logentry-move-move-noredirect": "{{Logentry|[[Special:Log/move]]}}\nParameter $4, the target page, is also not visible to parser functions.",
index 11b8cfc..4ad023f 100644 (file)
        "nstab-template": "Plantilla",
        "nstab-help": "Yanapa",
        "nstab-category": "Katiguriya",
+       "mainpage-nstab": "Qhapaq p'anqa",
        "nosuchaction": "Kay hina rurayqa manam kanchu",
        "nosuchactiontext": "URL tiyaypi sut'ichasqa rurayqa manam kanchu.\nMana allintachá qillqanki, icha p'itisqa t'inkitachá qatinki.\n{{SITENAME}} sutiyuq wikipi llamp'u kaqpipas pantasqachá kanman.",
        "nosuchspecialpage": "Kay hina sapaq p'anqaqa manam kanchu",
        "createaccountreason": "Kayrayku:",
        "createacct-reason": "Kayrayku",
        "createacct-reason-ph": "Imaraykutaq huk rakiqunata kamarichkanki",
-       "createacct-captcha": "Amachana llanchiy",
-       "createacct-imgcaptcha-ph": "Hanaqpi rikusqayki qillqata yaykuchiy",
        "createacct-submit": "Rakiqunaykita kamariy",
        "createacct-another-submit": "Huk rakiqunata kamariy",
        "createacct-benefit-heading": "{{SITENAME}}taqa qam hina runakunam ruran.",
        "passwordreset-emailtext-ip": "Pipas (qamchiki, $1 IP huchhayuq tiyaymanta) {{SITENAME}}-paq ($4)\nrakiqunaykipaq yaykuna rimata kutichinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}\nkay e-chaski imamaytayuq kachkan:\n\n$2\n\nKay mit'alla yaykuna {{PLURAL:$3|rimaqa|rimakunaqa}} kunanmanta {{PLURAL:$5|huk p'unchawpi|$5 p'unchawpi}} mawk'ayanqam.\nYaykuspayki musuq yaykuna rimaykitam akllankiman. Pi wakiykipas kayta mañakurqaptinqa,\nicha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,\nkay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
        "passwordreset-emailtext-user": "{{SITENAME}}-pi kaq $1 sutiyuq ruraqqa {{SITENAME}}-paq ($4)\nrakiqunaykipaq yaykuna rimata kutichinatam mañakurqan. Kay qatiq ruraqpa {{PLURAL:$3|rakiqunanmi|rakiqunankunam}}\nkay e-chaski imamaytayuq kachkan:\n\n$2\n\nKay mit'alla yaykuna {{PLURAL:$3|rimaqa|rimakunaqa}} kunanmanta {{PLURAL:$5|huk p'unchawpi|$5 p'unchawpi}} mawk'ayanqam.\nYaykuspayki musuq yaykuna rimaykitam akllankiman. Pi wakiykipas kayta mañakurqaptinqa,\nicha qam ñawpaq yaykuna rimaykita yuyaspayki manaña wakinchayta munaspaykiqa,\nkay willayta mana qhawaspa mana imatapas ruraspa ñawpaq yaykuna rimaykiwanmi llamk'ayta atinki.",
        "passwordreset-emailelement": "Ruraqpa sutin: \n$1\n\nMit'alla yaykuna rima: \n$2",
-       "passwordreset-emailsent": "Yaykuna rimata kutichina e-chaskiqa kachasqañam.",
+       "passwordreset-emailsentemail": "Yaykuna rimata kutichina e-chaskiqa kachasqañam.",
        "passwordreset-emailsent-capture": "Yaykuna rimata kutichina e-chaskiqa kachasqañam, kay qatiqpi rikunki.",
        "passwordreset-emailerror-capture": "{{GENDER:$2|}}Yaykuna rimata kutichina e-chaskiqa rurasqa karqan, imatachus kay qatiqpi rikunki, ichataq kachasqa kaptin pantasqam tukurqan: $1",
        "changeemail": "E-chaski imamaytata wakinchay",
-       "changeemail-text": "Kay hunt'ana p'anqata hunt'ay e-chaski imamaytaykita hukchanaykipaq. Yaykuna rimaykita yaykuchinaykim tiyan kay hukchanata takyachinaykipaq.",
+       "changeemail-header": "Rakiqunap e-chaski imamaytanta wakinchay",
        "changeemail-no-info": "Yaykunaykim tiyan kay p'anqata chiqalla aypanaykipaq.",
        "changeemail-oldemail": "Kunan kachkaq e-chaski imamayta:",
        "changeemail-newemail": "Musuq e-chaski imamayta:",
        "prefs-displaywatchlist": "Akllanakunata rikuchiy",
        "prefs-tokenwatchlist": "Llawi",
        "prefs-diffs": "Wakin kaykuna",
-       "email-address-validity-valid": "E-chaski imamaytaqa allinchá",
-       "email-address-validity-invalid": "Allin e-chaski imamaytata yaykuchiy",
        "userrights": "Ruraqkunata saqillanap allinkachinan",
        "userrights-lookup-user": "Ruraqkunap huñunkunata allinkachiy",
        "userrights-user-editname": "Ruraqpa sutinta qillqamuy:",
        "wlheader-showupdated": "Qayna watukamusqaykimantapacha hukchasqa p'anqakunataqa '''yanasapa''' nisqapim rikunki.",
        "wlnote": "Kay qatiqpiqa {{PLURAL:$1|qhipaq hukchasqam|'''$1''' qhipaq hukchasqakunam}} qhipaq {{PLURAL:$2|urapim|'''$2''' urakunapim}}, musuqchasqa $3, $4.",
        "wlshowlast": "$1 ura, $2 p'unchaw -mantapacha hukchasqakunata rikuchiy",
+       "watchlistall2": "lliw",
        "watchlist-options": "Watiqana sutisuyupaq allinkachinakuna",
        "watching": "Watiqasqakunaman yapaspa...",
        "unwatching": "Watiqasqakunamanta qulluspa...",
        "contributions": "{{GENDER:$1|Ruraqpa}} llamk'apusqankuna",
        "contributions-title": "$1 sutiyuq ruraqpa llamk'apusqankuna",
        "mycontris": "Llamk'apusqaykuna",
+       "anoncontribs": "Llamk'apusqakuna",
        "contribsub2": "{{GENDER:$3|$1}}paq ($2)",
        "contributions-userdoesnotexist": "\"$1\" sutiyuq rakiqunaqa manam hallch'asqachu.",
        "nocontribs": "Manam kay hina hukchasqakuna kanchu.",
        "movenosubpage": "Kay p'anqaqa manam urin p'anqayuqchu.",
        "movereason": "Kayrayku:",
        "revertmove": "kutichiy",
-       "delete_and_move": "Qulluspa astay",
        "delete_and_move_text": "==Qullunam tiyan==\n\nTukuna p'anqaqa (\"[[:$1]]\") kachkañam. Astanapaq qulluyta munankichu?",
        "delete_and_move_confirm": "Arí, kay p'anqata qulluy",
        "delete_and_move_reason": "\"[[$1]]\" nisqamanta astanapaq qullusqa",
        "spam_reverting": "Qhipaq kaq mana $1-man t'inkimuqniyuq llamk'apusqaman kutichispa",
        "spam_blanking": "Tukuy llamk'apusqakunaqa $1-manmi t'inkimuq, ch'usaqchaspa",
        "spam_deleting": "Tukuy musuqchasqakunaqa $1-manmi t'inkimun, qulluspa",
-       "simpleantispam-label": "Spam hark'ana llanchiy.\nKayta <strong>AMA</strong> hunt'aychu!",
+       "simpleantispam-label": "Spam hark'ana llanchiy.\nKayta <strong>ama</strong> hunt'aychu!",
        "pageinfo-title": "\"$1\" sutiyuq p'anqamanta willay",
        "pageinfo-not-current": "Achachaw, manam atinichu mawk'a llamk'apusqakunamanta kay willaykunata qusuyta.",
        "pageinfo-header-basic": "Tiksi willaykuna",
index 0e8f173..e48d1e1 100644 (file)
        "morenotlisted": "Această listă nu este completă.",
        "mypage": "Pagină",
        "mytalk": "Discuții",
-       "anontalk": "Discuția pentru această adresă IP",
+       "anontalk": "Discuții",
        "navigation": "Navigare",
        "and": "&#32;și",
        "qbfind": "Găsește",
        "missingarticle-rev": "(versiunea#: $1)",
        "missingarticle-diff": "(Dif: $1, $2)",
        "readonly_lag": "Baza de date a fost închisă automatic în timp ce serverele secundare ale bazei de date îl urmează pe cel principal.",
+       "nonwrite-api-promise-error": "Antetul HTTP „Promise-Non-Write-API-Action” a fost trimis, dar cererea s-a făcut către un modul de scriere API.",
        "internalerror": "Eroare internă",
        "internalerror_info": "Eroare internă: $1",
        "internalerror-fatal-exception": "Excepție fatală pentru tipul „$1”",
        "createaccountreason": "Motiv:",
        "createacct-reason": "Motiv",
        "createacct-reason-ph": "De ce creați un alt cont",
-       "createacct-captcha": "Verificare de securitate",
-       "createacct-imgcaptcha-ph": "Introduceți textul pe care îl vedeți deasupra",
        "createacct-submit": "Creați-vă contul",
        "createacct-another-submit": "Creează contul",
        "createacct-benefit-heading": "{{SITENAME}} este un proiect clădit de oameni ca dumneavoastră.",
        "passwordreset-emailtext-ip": "Cineva (probabil dumneavoastră, de la adresa IP $1) a solicitat resetarea parolei \npentru {{SITENAME}} ($4). {{PLURAL:$3|Următorul cont este asociat|Următoarele conturi sunt asociate}}\ncu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să schimbați parola acum. Dacă altcineva a făcut această cerere \nsau dacă v-ați reamintit parola inițială și nu mai doriți să o schimbați,\nputeți ignora acest mesaj, continuând să utilizați vechea parolă.",
        "passwordreset-emailtext-user": "Utilizatorul $1 de pe {{SITENAME}} a solicitat o resetare a parolei dumneavoastră pentru {{SITENAME}} ($4). Următorul utilizator are {{PLURAL:$3|contul asociat|conturile asociate}} cu această adresă de e-mail:\n\n$2\n\n{{PLURAL:$3|Această parolă temporară va|Aceste parole temporare vor}} expira {{PLURAL:$5|într-o zi|în $5 zile}}.\nAr trebui să vă autentificați și să alegeți acum o nouă parolă. Dacă altcineva a făcut această solicitare, ori dacă v-ați reamintit parola originală și nu mai doriți modificarea ei, puteți ignora acest mesaj, continuând cu vechea parolă.",
        "passwordreset-emailelement": "Nume de utilizator: \n$1\n\nParolă temporară: \n$2",
-       "passwordreset-emailsent": "Dacă aceasta este o adresă de e-mail înregistrată pentru contul dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
+       "passwordreset-emailsentemail": "Dacă aceasta este o adresă de e-mail înregistrată pentru contul dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
        "passwordreset-emailsent-capture": "Un mesaj de resetare a parolei a fost trimis, fiind afișat mai jos.",
        "passwordreset-emailerror-capture": "Un mesaj de resetare a parolei a fost generat (fiind afișat mai jos), dar trimiterea sa către {{GENDER:$2|utilizator}} a eșuat: $1",
        "changeemail": "Modificare sau înlăturare adresă de e-mail",
        "permissionserrors": "Eroare de permisiune",
        "permissionserrorstext": "Nu aveți permisiune pentru a face acest lucru, din următoarele {{PLURAL:$1|motiv|motive}}:",
        "permissionserrorstext-withaction": "Nu aveți permisiunea să $2, din {{PLURAL:$1|următorul motiv|următoarele motive}}:",
+       "contentmodelediterror": "Nu puteți modifica această versiune, deoarece modelul de conținut al acesteia este <code>$1</code>, iar actualul model de conținut al paginii este <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Atenție: Recreați o pagină care a fost ștearsă anterior.'''\n\nAsigurați-vă că este oportună recrearea acestei pagini.\nJurnalul ștergerilor și al mutărilor pentru această pagină este disponibil:",
        "moveddeleted-notice": "Această pagină a fost ștearsă.\nJurnalul ștergerilor și al redenumirilor este disponibil mai jos.",
        "moveddeleted-notice-recent": "Ne cerem scuze, dar această pagină a fost ștearsă recent (în ultimele 24 de ore).\nJurnalele de ștergere și redenumire ale paginii sunt disponibile mai jos cu scop informativ.",
        "parser-unstrip-loop-warning": "Buclă nedetașabilă detectată",
        "parser-unstrip-recursion-limit": "Limita de recursivitate nedetașabilă depășită ($1)",
        "converter-manual-rule-error": "Eroare detectată în regula manuală de conversie a limbii",
-       "undo-success": "Modificarea poate fi anulată. Verificați diferența de dedesupt și apoi salvați pentru a termina anularea modificării.",
+       "undo-success": "Modificarea poate fi anulată. Verificați diferența de dedesubt și apoi salvați pentru a termina anularea modificării.",
        "undo-failure": "Modificarea nu poate fi reversibilă datorită conflictului de modificări intermediare.",
        "undo-norev": "Modificarea nu poate fi reversibilă pentru că nu există sau pentru că a fost ștearsă.",
        "undo-nochange": "Se pare că această modificare a fost deja anulată.",
        "showingresultsinrange": "Mai jos se afișează un număr de până la {{PLURAL:$1|<strong>1</strong> rezultat|<strong>$1</strong> rezultate|<strong>$1</strong> de rezultate}} din intervalul #<strong>$2</strong> la #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultatul <strong>$1</strong> din <strong>$3</strong>|Rezultatele <strong>$1 - $2</strong> din <strong>$3</strong>}}",
        "search-nonefound": "Nu sunt rezultate conforme interogării.",
+       "search-nonefound-thiswiki": "Nu sunt rezultate conforme interogării pe acest site.",
        "powersearch-legend": "Căutare avansată",
        "powersearch-ns": "Căutare în spațiile de nume:",
        "powersearch-togglelabel": "Selectare:",
        "prefs-help-prefershttps": "Această preferință va avea efect la următoarea autentificare.",
        "prefswarning-warning": "Ați efectuat modificări asupra preferințelor dumneavoastră, care nu au fost încă salvate.\nDacă părăsiți această pagină fără a apăsa butonul „$1”, preferințele dumnevoastră nu se vor actualiza.",
        "prefs-tabs-navigation-hint": "Sfat: Puteți folosi tastele săgeată stânga și dreapta pentru a naviga între filele din cadrul listei de file.",
-       "email-address-validity-valid": "Adresa de e-mail pare validă",
-       "email-address-validity-invalid": "Introduceți o adresă de e-mail validă",
        "userrights": "Administrare permisiuni de utilizator",
        "userrights-lookup-user": "Administrare grupuri de utilizatori",
        "userrights-user-editname": "Introduceți un nume de utilizator:",
        "wantedfiletext-nocat-noforeign": "Următoarele fișiere sunt utilizate, dar nu există.",
        "wantedtemplates": "Formate dorite",
        "mostlinked": "Cele mai căutate articole",
-       "mostlinkedcategories": "Cele mai căutate categorii",
+       "mostlinkedcategories": "Cele mai utilizate categorii",
        "mostlinkedtemplates": "Cele mai transcluse pagini",
        "mostcategories": "Articole cu cele mai multe categorii",
-       "mostimages": "Cele mai căutate imagini",
+       "mostimages": "Cele mai utilizate imagini",
        "mostinterwikis": "Pagini cu cele mai multe legături interwiki",
        "mostrevisions": "Articole cu cele mai multe revizuiri",
        "prefixindex": "Toate paginile cu prefix",
        "wlheader-showupdated": "Paginile care au fost modificate după ultima dumneavoastră vizită sunt afișate '''îngroșat'''.",
        "wlnote": "Mai jos se află {{PLURAL:$1|ultima schimbare|ultimele <strong>$1</strong> schimbări|ultimele <strong>$1</strong> de schimbări}} din {{PLURAL:$2|ultima oră|ultimele <strong>$2</strong> ore|ultimele <strong>$2</strong> de ore}}, așa cum era situația la $3, $4.",
        "wlshowlast": "Arată ultimele $1 ore $2 zile",
+       "watchlistall2": "toate",
+       "watchlist-hide": "Ascunde",
+       "wlshowtime": "Arată ultimele:",
+       "wlshowhideminor": "modificări minore",
+       "wlshowhidebots": "roboți",
+       "wlshowhideliu": "utilizatori înregistrați",
+       "wlshowhideanons": "utilizatori anonimi",
+       "wlshowhidepatr": "modificări patrulate",
+       "wlshowhidemine": "modificările mele",
        "watchlist-options": "Opțiuni listă de pagini urmărite",
        "watching": "Se urmărește...",
        "unwatching": "Așteptați...",
        "contributions": "Contribuții {{GENDER:$1|utilizator}}",
        "contributions-title": "Contribuțiile utilizatorului $1",
        "mycontris": "Contribuții",
+       "anoncontribs": "Contribuții",
        "contribsub2": "Pentru {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Contul de utilizator „$1” nu este înregistrat.",
        "nocontribs": "Nu a fost găsită nici o modificare care să satisfacă acest criteriu.",
        "movenosubpage": "Această pagină nu are subpagini.",
        "movereason": "Motiv:",
        "revertmove": "revenire",
-       "delete_and_move": "Șterge și redenumește",
        "delete_and_move_text": "==Ștergere necesară==\n\nPagina destinație „[[:$1]]” există deja. Doriți să o ștergeți pentru a face loc redenumirii?",
        "delete_and_move_confirm": "Da, șterge pagina.",
        "delete_and_move_reason": "Șters pentru a face loc redenumirii paginii „[[$1]]”",
        "tooltip-pt-preferences": "Preferințele dumneavoastră",
        "tooltip-pt-watchlist": "Lista paginilor pe care le monitorizați",
        "tooltip-pt-mycontris": "Listă de contribuții",
+       "tooltip-pt-anoncontribs": "O listă de modificări efectuate de la această adresă IP",
        "tooltip-pt-login": "Sunteți încurajat să vă autentificați, deși acest lucru nu este obligatoriu.",
        "tooltip-pt-logout": "Închide sesiunea de lucru",
        "tooltip-pt-createaccount": "Vă încurajăm să vă creați un cont și să vă autentificați; totuși, nu este obligatoriu",
        "size-bytes": "{{PLURAL:$1|un octet|$1 octeți|$1 de octeți}}",
        "size-pixel": "$1 {{PLURAL:$1|pixel|pixeli|de pixeli}}",
        "lag-warn-normal": "Modificările mai noi de $1 {{PLURAL:$1|secondă|seconde}} pot să nu apară în listă.",
-       "lag-warn-high": "Serverul bazei de date este suprasolicitat, astfel Ã®ncît modificÄ\83rile fÄ\83cute Ã®n ultimele $1 {{PLURAL:$1|secundÄ\83|secunde}} pot să nu apară în listă.",
+       "lag-warn-high": "Serverul bazei de date este suprasolicitat, astfel Ã®ncât modificÄ\83rile fÄ\83cute Ã®n ultimele $1 {{PLURAL:$1|secundÄ\83|secunde|de secunde}} ar putea să nu apară în listă.",
        "watchlistedit-normal-title": "Modificare listă pagini urmărite",
        "watchlistedit-normal-legend": "Ștergere titluri din lista de urmărire",
        "watchlistedit-normal-explain": "Lista de mai jos cuprinde paginile pe care le urmăriți.\nPentru a elimina un titlu, bifați-l și apăsați „{{int:Watchlistedit-normal-submit}}”.\nPuteți modifica și direct [[Special:EditWatchlist/raw|lista brută]].",
        "htmlform-cloner-required": "Este necesară cel puțin o valoare.",
        "htmlform-title-badnamespace": "[[:$1]] nu se află în spațiul de nume „{{ns:$2}}”.",
        "htmlform-title-not-creatable": "„$1” este un titlu de pagină inutilizabil",
-       "htmlform-title-not-exists": "[[:$1]] nu există.",
+       "htmlform-title-not-exists": "$1 nu există.",
        "htmlform-user-not-exists": "<strong>$1</strong> nu există.",
        "htmlform-user-not-valid": "<strong>$1</strong> nu este un nume de utilizator valid.",
        "sqlite-has-fts": "$1 cu suport de căutare în tot textul",
        "logentry-suppress-block": "$1 {{GENDER:$2|a blocat}} utilizatorul {{GENDER:$4|$3}} pe o perioadă de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|a schimbat}} parametrii blocării pentru utilizatorul {{GENDER:$4|$3}} cu o perioadă de expirare de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|a importat}} $3 prin încărcare de fișier",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|a importat}} $3 prin încărcare de fișier ($4 {{PLURAL:$4|versiune|versiuni|de versiuni}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|a importat}} $3 din alt wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|a importat}} $3 de la $5 ($4 {{PLURAL:$4|versiune|versiuni|de versiuni}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|a unificat}} $3 cu $4 (versiuni de până la $5)",
        "logentry-move-move": "$1 {{GENDER:$2|a redenumit}} pagina $3 în $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|a redenumit}} pagina $3 în $4 fără a lăsa o redirecționare în loc",
index f5c9600..c607569 100644 (file)
        "createaccountreason": "Mutive:",
        "createacct-reason": "Mutive",
        "createacct-reason-ph": "Purcé tu ste ccreje 'n'otre cunde utende?",
-       "createacct-captcha": "Verifiche de securezze",
-       "createacct-imgcaptcha-ph": "Mitte 'u teste tune aqquà sus",
        "createacct-submit": "Ccreje 'u cunde utende tune",
        "createacct-another-submit": "Ccreje 'nu cunde utende",
        "createacct-benefit-heading": "{{SITENAME}} jè fatte da crestiane cumme a te.",
        "wlheader-showupdated": "* Le pàggene ca onne state cangiate da l'urtema visite avènene fatte vedè in '''grascette'''",
        "wlnote": "Aqquà sotte {{PLURAL:$1|ste l'urteme cangiamende|stonne l'urteme <strong>$1</strong> cangiaminde}} jndr'à {{PLURAL:$2|l'urtema ore|l'urteme <strong>$2</strong> ore}}, jndr'à $3, $4.",
        "wlshowlast": "Vide l'urteme $1 ore $2 sciurne",
+       "watchlistall2": "tutte",
        "watchlist-options": "Opzione d'a liste de le pàggene condrollete",
        "watching": "Fà vedè...",
        "unwatching": "No fà vedè...",
        "htmlform-cloner-delete": "Live",
        "htmlform-cloner-required": "Almene 'nu valore l'a mettere.",
        "htmlform-title-badnamespace": "[[:$1]] non ge stè jndr'à 'u namespace \"{{ns:$2}}\".",
-       "htmlform-title-not-exists": "[[:$1]] non g'esiste.",
+       "htmlform-title-not-exists": "$1 non g'esiste.",
        "htmlform-user-not-exists": "<strong>$1</strong> non g'esiste.",
        "htmlform-user-not-valid": "<strong>$1</strong> non g'è 'nu nome utende valide.",
        "sqlite-has-fts": "$1 cu 'u supporte d'a ricerche full-text",
index bbb58e8..dcb27d9 100644 (file)
@@ -85,7 +85,8 @@
                        "WindEwriX",
                        "Nzeemin",
                        "INS Pirat",
-                       "Краснорядцева Елена"
+                       "Краснорядцева Елена",
+                       "Frhdkazan"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "tog-watchlisthidebots": "Скрывать правки ботов из списка наблюдения",
        "tog-watchlisthideminor": "Скрывать малые правки из списка наблюдения",
        "tog-watchlisthideliu": "Скрывать правки представившихся участников из списка наблюдения",
+       "tog-watchlistreloadautomatically": "Перезагружать список наблюдения автоматически всякий раз, когда изменяется фильтр (требуется JavaScript)",
        "tog-watchlisthideanons": "Скрывать правки анонимных участников из списка наблюдения",
        "tog-watchlisthidepatrolled": "Скрывать отпатрулированные правки из списка наблюдения",
        "tog-watchlisthidecategorization": "Скрывать категоризацию страниц",
        "morenotlisted": "Этот список неполон.",
        "mypage": "Страница",
        "mytalk": "Обсуждение",
-       "anontalk": "Обсуждение для этого IP-адреса",
+       "anontalk": "Обсуждение",
        "navigation": "Навигация",
        "and": "&#32;и",
        "qbfind": "Поиск",
        "databaseerror-query": "Запрос: $1",
        "databaseerror-function": "Функция: $1",
        "databaseerror-error": "Ошибка: $1",
+       "transaction-duration-limit-exceeded": "Для того, чтобы избежать большого лага при репликации, эта транзакция была прервана, поскольку продолжительность записи ($1) превысила лимит в $2 сек.\nЕсли вы изменяете несколько элементов за один раз, постарайтесь вместо этого сделать несколько небольших операций.",
        "laggedslavemode": "Внимание: страница может не содержать последних обновлений.",
        "readonly": "Запись в базу данных заблокирована",
        "enterlockreason": "Укажите причину и намеченный срок блокировки.",
        "missingarticle-rev": "(версия № $1)",
        "missingarticle-diff": "(разность: $1, $2)",
        "readonly_lag": "База данных автоматически заблокирована от изменений на время, пока вторичные сервера базы данных не синхронизируются с первичным.",
+       "nonwrite-api-promise-error": "Был отправлен HTTP-заголовок 'Promise-Non-Write-API-Action', но запрос был к API-модулю записи.",
        "internalerror": "Внутренняя ошибка",
        "internalerror_info": "Внутренняя ошибка: $1",
        "internalerror-fatal-exception": "Неустранимое исключение типа «$1»",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Зачем вы создаёте другую учетную запись",
-       "createacct-captcha": "Проверка безопасности",
-       "createacct-imgcaptcha-ph": "Введите текст, который вы видите выше",
        "createacct-submit": "Создать учётную запись",
        "createacct-another-submit": "Создать учётную запись",
        "createacct-benefit-heading": "{{SITENAME}} — совместный труд таких же людей, как вы.",
        "wrongpasswordempty": "Пожалуйста, введите непустой пароль.",
        "passwordtooshort": "Пароль должен состоять не менее чем из $1 {{PLURAL:$1|символа|символов}}.",
        "passwordtoolong": "Пароль не может превышать {{PLURAL:$1|1 символ|$1 символов|$1 символа}}.",
+       "passwordtoopopular": "Часто выбираемые пароли не могут быть использованы. Пожалуйста, выберите более уникальный пароль.",
        "password-name-match": "Введённый пароль должен отличаться от имени участника.",
        "password-login-forbidden": "Использование этого имени участника и пароля запрещено.",
        "mailmypassword": "Сбросить пароль",
        "eauthentsent": "На указанный адрес электронной почты отправлено письмо. \nЧтобы получать письма в дальнейшем, следуйте изложенным там инструкциям для подтверждения, что этот адрес действительно принадлежит вам.",
        "throttled-mailpassword": "Функция напоминания пароля уже использовалась в течение {{PLURAL:$1|1=последнего часа|последних $1 часов}}.\nДля предотвращения злоупотреблений, разрешено запрашивать не более одного напоминания {{PLURAL:$1|за $1 час|за $1 часов|за $1 часа|1=в час}}.",
        "mailerror": "Ошибка при отправке почты: $1",
-       "acct_creation_throttle_hit": "За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись участника|было создано $1 учётных записей участников|1=уже была создана учётная запись участника}}, что является пределом для данного отрезка времени.\nТаким образом, пользователи, обладающие данным IP-адресом, в данный момент больше не могут создавать новых учётных записей.",
+       "acct_creation_throttle_hit": "За сутки с вашего IP-адреса {{PLURAL:$1|была создана $1 учётная запись|было создано $1 учётных записей|были созданы $1 учётных записи|1=уже была создана учётная запись}} — это предельное количество для данного отрезка времени.\nВ результате, пользователи с этим IP-адресом в данный момент больше не могут создавать новых учётных записей.",
        "emailauthenticated": "Ваш адрес электронной почты подтверждён $2 в $3.",
        "emailnotauthenticated": "Ваш адрес электронной почты ещё не был подтверждён.\nПисьма не будут отправляться ни для одной из следующий функций.",
        "noemailprefs": "Адрес электронной почты не был указан, функции вики-движка по работе с эл. почтой отключены.",
        "resetpass-abort-generic": "Изменение пароля было прервано расширением.",
        "resetpass-expired": "Срок действия вашего пароля истёк. Пожалуйста, установите новый пароль для входа в систему.",
        "resetpass-expired-soft": "Срок действия вашего пароля истёк, и теперь он должен быть изменён. Пожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы изменить его позже.",
-       "resetpass-validity-soft": "Ð\92аÑ\88 Ð¿Ð°Ñ\80олÑ\8c Ñ\8fвлÑ\8fеÑ\82Ñ\81Ñ\8f Ð½ÐµÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bм: $1\n\nПожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы сбросить его позже.",
+       "resetpass-validity-soft": "Ð\97адан Ð½ÐµÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bй Ð¿Ð°Ñ\80олÑ\8c: $1\n\nПожалуйста, выберите новый пароль или нажмите «{{int:resetpass-submit-cancel}}», чтобы сбросить его позже.",
        "passwordreset": "Сброс пароля",
        "passwordreset-text-one": "Заполните эту форму, чтобы сбросить свой пароль.",
        "passwordreset-text-many": "{{PLURAL:$1|Заполните одно из полей для получения временного пароля по электронной почте.}}",
        "passwordreset-emailtext-ip": "Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней|1=один день}}.\nВы должны представиться системе и выбрать новый пароль. \nЕсли вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
        "passwordreset-emailtext-user": "Участник $1 из проекта {{SITENAME}} запросил сброс пароля для вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дней|$5 дня|1=один день}}.\nВы должны представиться системе и выбрать новый пароль.\nЕсли вы не делали этого запроса или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
        "passwordreset-emailelement": "Имя участника: \n$1\n\nВременный пароль: \n$2",
-       "passwordreset-emailsent": "Если это адрес электронной почты, на которую зарегистрирована ваша учётная запись, вам будет отправлено письмо для сброса пароля.",
+       "passwordreset-emailsentemail": "Если это адрес электронной почты, на которую зарегистрирована ваша учётная запись, вам будет отправлено письмо для сброса пароля.",
+       "passwordreset-emailsentusername": "Если есть соответствующий зарегистрированный адрес электронной почты, будет отправлено письмо для восстановления пароля.",
        "passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
        "passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
        "changeemail": "Изменить или удалить адрес электронной почты",
        "permissionserrors": "Ошибка прав доступа",
        "permissionserrorstext": "У вас нет прав на выполнение этой операции по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
        "permissionserrorstext-withaction": "У вас нет прав на $2 по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
+       "contentmodelediterror": "Вы не можете редактировать эту версию, поскольку модель её содержания — <code>$1</code>, а текущая модель содержания страницы — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Внимание. Вы пытаетесь воссоздать страницу, которая ранее удалялась.'''\n\nПроверьте, действительно ли вам нужно воссоздавать эту страницу.\nНиже приведены журналы удалений и переименований этой страницы.",
        "moveddeleted-notice": "Эта страница была удалена.\nДля справки ниже показаны соответствующие записи из журналов удалений и переименований.",
        "moveddeleted-notice-recent": "К сожалению, эта страница была недавно удалена (в течение последних 24 часов).\nНиже для справки приведены журналы удаления и перемещения для этой страницы.",
        "mergehistory-go": "Показать объединяемые правки",
        "mergehistory-submit": "Объединить правки",
        "mergehistory-empty": "Не найдены правки для объединения.",
-       "mergehistory-done": "$3 {{PLURAL:$3|пÑ\80авка|пÑ\80авок|пÑ\80авки}} из $1 {{PLURAL:$3|была перенесена|были перенесены}} в [[:$2]].",
+       "mergehistory-done": "$3 {{PLURAL:$3|пÑ\80авка|пÑ\80авки|пÑ\80авок}} из $1 {{PLURAL:$3|была перенесена|были перенесены}} в [[:$2]].",
        "mergehistory-fail": "Не удалось произвести объединение историй страниц, пожалуйста, проверьте параметры страницы и времени.",
        "mergehistory-fail-toobig": "Не удаётся выполнить слияние истории, так как необходимо перенести больше допустимого лимита в $1 {{PLURAL:$1|версию|версии|версий}}.",
        "mergehistory-no-source": "Исходная страница «$1» не существует.",
        "next-page": "Следующая страница",
        "prevn-title": "{{PLURAL:$1|Предыдущая $1 запись|Предыдущие $1 записи|Предыдущие $1 записей}}",
        "nextn-title": "{{PLURAL:$1|Следующая $1 запись|Следующие $1 записи|Следующие $1 записей}}",
-       "shown-title": "Ð\9fоказÑ\8bваÑ\82Ñ\8c $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81ей|запиÑ\81и}} на странице",
+       "shown-title": "Ð\9fоказÑ\8bваÑ\82Ñ\8c $1 {{PLURAL:$1|запиÑ\81Ñ\8c|запиÑ\81и|запиÑ\81ей}} на странице",
        "viewprevnext": "Просмотреть ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''В этой вики есть страница «[[:$1]]»'''",
        "searchmenu-new": "<strong>Создать страницу «[[:$1]]» в этом вики-проекте!</strong>\n{{PLURAL:$2|0=|См. также страницу, найденную по результатами вашего поиска.|См. также найденные результаты поиска.}}",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1 — $2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
+       "search-nonefound-thiswiki": "Нет результатов, соответствующих запросу на этом сайте.",
        "powersearch-legend": "Расширенный поиск",
        "powersearch-ns": "Поиск в пространствах имён:",
        "powersearch-togglelabel": "Отметить:",
        "prefs-help-prefershttps": "Эта настройка будет применена после следующего представления системе.",
        "prefswarning-warning": "Вы внесли в свои настройки изменения, которые ещё не были сохранены.\nЕсли вы покинете эту страницу, не нажав «$1», настройки не будут обновлены.",
        "prefs-tabs-navigation-hint": "Совет: Вы можете использовать клавиши стрелок влево и вправо для перехода между вкладками в списке вкладок.",
-       "email-address-validity-valid": "Выглядит корректно",
-       "email-address-validity-invalid": "Введите корректный адрес электронной почты!",
        "userrights": "Управление правами участника",
        "userrights-lookup-user": "Управление группами участников",
        "userrights-user-editname": "Введите имя учётной записи:",
        "recentchanges-legend-heading": "'''Легенда:&nbsp;'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (см. также [[Special:NewPages|список новых страниц]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Показать",
        "rcnotefrom": "Ниже {{PLURAL:$5|указано изменение|перечислены изменения}} с <strong>$3, $4</strong> (показано не более <strong>$1</strong>).",
        "rclistfrom": "Показать изменения с $3 $2.",
        "rcshowhideminor": "$1 малые правки",
        "listredirects": "Список перенаправлений",
        "listduplicatedfiles": "Список файлов с дубликатами",
        "listduplicatedfiles-summary": "Это список файлов, где самая последняя версия файла считается дубликатом последней версии некоторых других файлов. Учитываются только локальные файлы.",
-       "listduplicatedfiles-entry": "У файла [[:File:$1|$1]] — [[$3|{{PLURAL:$2|один дубликат|$2 дубликата|$2 дубликатов}}]].",
+       "listduplicatedfiles-entry": "У файла [[:File:$1|$1]] — [[$3|{{PLURAL:$2|$2 дубликат|$2 дубликата|$2 дубликатов}}]].",
        "unusedtemplates": "Неиспользуемые шаблоны",
        "unusedtemplatestext": "Здесь перечислены все страницы пространства имён «{{ns:template}}», не включённые ни в какие другие страницы.\nНе забывайте проверять отсутствие ссылок на шаблон перед его удалением.",
        "unusedtemplateswlh": "другие ссылки",
        "mostrevisions": "Наиболее часто редактировавшиеся страницы",
        "prefixindex": "Указатель по началу названий страниц",
        "prefixindex-namespace": "Указатель по началу страниц (пространство имён «{{ns:$1}}»)",
+       "prefixindex-submit": "Показать",
        "prefixindex-strip": "Скрыть префикс в списке результатов",
        "shortpages": "Короткие страницы",
        "longpages": "Длинные страницы",
        "protectedpages-performer": "Защита участника",
        "protectedpages-params": "Параметры защиты",
        "protectedpages-reason": "Причина",
+       "protectedpages-submit": "Показывать страницы",
        "protectedpages-unknown-timestamp": "Неизвестно",
        "protectedpages-unknown-performer": "Неизвестный участник",
        "protectedtitles": "Защищённые названия",
        "protectedtitles-summary": "На этой странице перечислены названия, которые защищены от создания. Для списка существующих страниц, которые в настоящее время защищены, см. [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "В настоящий момент нет запрещённых названий с указанными параметрами.",
+       "protectedtitles-submit": "Показывать заголовки",
        "listusers": "Список участников",
        "listusers-editsonly": "Показать только тех участников, кто сделал хотя бы одну правку",
        "listusers-creationsort": "Упорядочить по дате создания",
-       "listusers-desc": "СоÑ\80Ñ\82иÑ\80оваÑ\82Ñ\8c Ð¿Ð¾ Ñ\83бÑ\8bваниÑ\8e",
+       "listusers-desc": "СоÑ\80Ñ\82иÑ\80оваÑ\82Ñ\8c Ð² Ð¾Ð±Ñ\80аÑ\82ном Ð¿Ð¾Ñ\80Ñ\8fдке",
        "usereditcount": "$1 {{PLURAL:$1|правка|правки|правок}}",
        "usercreated": "{{GENDER:$3|зарегистрировался|зарегистрировалась}} $1 в $2",
        "newpages": "Новые страницы",
+       "newpages-submit": "Показать",
        "newpages-username": "Участник:",
        "ancientpages": "Статьи по дате последнего редактирования",
        "move": "Переименовать",
        "specialloguserlabel": "Исполнитель:",
        "speciallogtitlelabel": "Цель (название или {{ns:user}}:имя участника):",
        "log": "Журналы",
+       "logeventslist-submit": "Показать",
        "all-logs-page": "Все доступные журналы",
        "alllogstext": "Общий список журналов сайта {{SITENAME}}.\nВы можете отфильтровать результаты по типу журнала, имени участника (учитывается регистр) или затронутой странице (также учитывается регистр).",
        "logempty": "Подходящие записи в журнале отсутствуют.",
        "cachedspecial-viewing-cached-ts": "Вы просматриваете кэшированную версию этой страницы, которая может серьёзно отличаться от текущей версии.",
        "cachedspecial-refresh-now": "Просмотреть последнюю версию.",
        "categories": "Категории",
+       "categories-submit": "Показать",
        "categoriespagetext": "{{PLURAL:$1|1=Следующая категория содержит|Следующие категории содержат}} страницы или медиафайлы.\nЗдесь не показаны [[Special:UnusedCategories|неиспользуемые категории]].\nСм. также [[Special:WantedCategories|список требуемых категорий]].",
        "categoriesfrom": "Показать категории, начинающиеся с:",
        "special-categories-sort-count": "упорядочить по количеству",
        "activeusers-hidebots": "Скрыть ботов",
        "activeusers-hidesysops": "Скрыть администраторов",
        "activeusers-noresult": "Не найдено участников.",
+       "activeusers-submit": "Показать активных участников",
        "listgrouprights": "Права групп участников",
        "listgrouprights-summary": "Ниже представлен список определённых в этой вики групп участников, указаны соответствующие им права доступа.\nВозможно, существует [[{{MediaWiki:Listgrouprights-helppage}}|дополнительная информация]] об индивидуальных правах.",
        "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Предоставленные права</span>\n* <span class=\"listgrouprights-revoked\">Отозванные права</span>",
        "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены '''жирным''' шрифтом.",
        "wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последние изменения|показаны <strong>$1</strong> последних изменений}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часа|последние <strong>$2</strong> часов}}, по состоянию на $3 $4.",
        "wlshowlast": "Показать за последние $1 часов $2 дней",
+       "watchlistall2": "все",
+       "watchlist-hide": "Скрыть",
+       "watchlist-submit": "Показать",
+       "wlshowtime": "Период времени для отображения:",
+       "wlshowhideminor": "малые правки",
+       "wlshowhidebots": "ботов",
+       "wlshowhideliu": "зарегистрированных участников",
+       "wlshowhideanons": "анонимных участников",
+       "wlshowhidepatr": "проверенные правки",
+       "wlshowhidemine": "мои правки",
        "watchlist-options": "Настройки списка наблюдения",
        "watching": "Добавление в список наблюдения…",
        "unwatching": "Удаление из списка наблюдения…",
        "delete-confirm": "$1 — удаление",
        "delete-legend": "Удаление",
        "historywarning": "<strong>Внимание:</strong> Вы собираетесь удалить страницу, у которой есть история правок, содержащая $1 {{PLURAL:$1|версию|версии|версий}}:",
+       "historyaction-submit": "Показать",
        "confirmdeletetext": "Вы запросили полное удаление страницы (или изображения) и всей её истории изменений. Пожалуйста, подтвердите, что вы действительно желаете это сделать, понимаете последствия своих действий, и делаете это в соответствии [[{{MediaWiki:Policy-url}}|с правилами]].",
        "actioncomplete": "Действие выполнено",
        "actionfailed": "Действие не выполнено",
        "undeleteviewlink": "просмотреть",
        "undeleteinvert": "Обратить выделение",
        "undeletecomment": "Причина:",
-       "undeletedrevisions": "{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменений|изменения}}",
+       "undeletedrevisions": "{{PLURAL:$1|восстановлено|восстановлены}} $1 {{PLURAL:$1|изменение|изменения|изменений}}",
        "undeletedrevisions-files": "восстановлены $1 {{PLURAL:$1|версия|версии|версий}} и $2 {{PLURAL:$2|файл|файла|файлов}}",
-       "undeletedfiles": "{{PLURAL:$1|воÑ\81Ñ\81Ñ\82ановлен|воÑ\81Ñ\81Ñ\82ановленÑ\8b}} $1 {{PLURAL:$1|Ñ\84айл|Ñ\84айлов|Ñ\84айла}}",
+       "undeletedfiles": "{{PLURAL:$1|воÑ\81Ñ\81Ñ\82ановлен|воÑ\81Ñ\81Ñ\82ановленÑ\8b}} $1 {{PLURAL:$1|Ñ\84айл|Ñ\84айла|Ñ\84айлов}}",
        "cannotundelete": "Ошибка восстановления:\n$1",
        "undeletedpage": "'''Страница «$1» была восстановлена.'''\n\nДля просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].",
        "undelete-header": "Список недавно удалённых страниц можно посмотреть в [[Special:Log/delete|журнале удалений]].",
        "contributions": "Вклад {{GENDER:$1|участника|участницы}}",
        "contributions-title": "Вклад {{GENDER:$1|участника|участницы}} $1",
        "mycontris": "Вклад",
+       "anoncontribs": "Вклад",
        "contribsub2": "Вклад {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
        "nocontribs": "Изменений, соответствующих заданным условиям, найдено не было.",
        "whatlinkshere-hidelinks": "$1 ссылки",
        "whatlinkshere-hideimages": "$1 файловые ссылки",
        "whatlinkshere-filters": "Фильтры",
+       "whatlinkshere-submit": "Выполнить",
        "autoblockid": "Автоблокировка #$1",
        "block": "Блокировка участника",
        "unblock": "Разблокировка участника",
        "move-page-legend": "Переименование страницы",
        "movepagetext": "Воспользовавшись нижеприведённой формой, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое.\nВы можете автоматически обновить перенаправления, которые вели на старое название.\nЕсли вы этого не сделаете, пожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница <strong>не будет</strong> переименована, если уже существует страница с названием, идентичным выбранному, кроме случаев, когда такая страница пуста или представляет собой перенаправление, и при этом не имеет истории правок.\nЭто означает, что сделав ошибочное переименование, вы можете переименовать страницу обратно в то название, которое у неё только что было, но не можете случайно затереть существующую страницу.\n\n<strong>Предупреждение!</strong>\nПереименование популярных страниц может привести к масштабным и неожиданным изменениям.\nПожалуйста, прежде чем продолжать, убедитесь, что понимаете все возможные последствия.",
        "movepagetext-noredirectfixer": "Воспользовавшись формой ниже, вы переименуете страницу, одновременно переместив на новое место её журнал изменений.\nСтарое название станет перенаправлением на новое название.\nПожалуйста, проверьте наличие [[Special:DoubleRedirects|двойных]] и [[Special:BrokenRedirects|разорванных перенаправлений]].\nВы отвечаете за то, чтобы ссылки продолжали и далее указывать туда, куда предполагалось.\n\nОбратите внимание, что страница <strong>не будет</strong> переименована, если страница с новым названием уже существует, кроме случаев, если она пуста или представляет собой перенаправление, и при этом не имеет истории правок.\nЭто означает, что сделав ошибочное переименование, вы сможете переименовать страницу обратно в то название, которое у неё только что было, но не сможете случайно затереть существующую страницу.\n\n<strong>Предупреждение!</strong>\nПереименование может привести к масштабным и неожиданным изменениям для популярных страниц.\nПожалуйста, прежде чем продолжить, убедитесь, что понимаете все возможные последствия.",
-       "movepagetalktext": "Ð\9fÑ\80иÑ\81оединÑ\91ннаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f Ð±Ñ\83деÑ\82 Ñ\82акже Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¿ÐµÑ\80еименована, '''кÑ\80оме Ñ\81лÑ\83Ñ\87аев, ÐºÐ¾Ð³Ð´Ð°:'''\n\n*Ð\9dе Ð¿Ñ\83Ñ\81Ñ\82аÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f Ñ\83же Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ð¿Ð¾Ð´ Ñ\82аким Ð¶Ðµ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ð¸Ð»Ð¸\n*Ð\92Ñ\8b Ð½Ðµ Ð¿Ð¾Ñ\81Ñ\82авили Ð³Ð°Ð»Ð¾Ñ\87кÑ\83 Ð² Ð¿Ð¾Ð»Ðµ Ð½Ð¸Ð¶Ðµ.\n\nÐ\92 Ñ\8dÑ\82иÑ\85 Ñ\81лÑ\83Ñ\87аÑ\8fÑ\85, Ð²Ñ\8b Ð±Ñ\83деÑ\82е Ð²Ñ\8bнÑ\83жденÑ\8b Ð¿ÐµÑ\80емеÑ\81Ñ\82иÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð¾Ð±Ñ\8aединиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð²Ñ\80Ñ\83Ñ\87нÑ\83Ñ\8e, ÐµÑ\81ли Ñ\8dÑ\82о Ð½Ñ\83жно.",
+       "movepagetalktext": "Ð\95Ñ\81ли Ð²Ñ\8b Ð¾Ñ\82меÑ\82иÑ\82е Ñ\8dÑ\82оÑ\82 Ð¿Ñ\83нкÑ\82, Ñ\81вÑ\8fзаннаÑ\8f Ñ\81 Ð½ÐµÐ¹ Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f Ð±Ñ\83деÑ\82 Ñ\82акже Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¿ÐµÑ\80еименована, ÐµÑ\81ли Ñ\82олÑ\8cко Ñ\83же Ð½Ðµ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83еÑ\82 Ð½ÐµÐ¿Ñ\83Ñ\81Ñ\82аÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f Ñ\81 Ñ\82аким Ð¶Ðµ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¼.\n\nÐ\92 Ñ\8dÑ\82ом Ñ\81лÑ\83Ñ\87ае Ð²Ð°Ð¼ Ð½Ñ\83жно Ð±Ñ\83деÑ\82 Ð¿ÐµÑ\80еименоваÑ\82Ñ\8c Ð¸Ð»Ð¸ Ð¾Ð±Ñ\8aединиÑ\82Ñ\8c Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð²Ñ\80Ñ\83Ñ\87нÑ\83Ñ\8e, ÐµÑ\81ли Ñ\8dÑ\82о Ð½ÐµÐ¾Ð±Ñ\85одимо.",
        "moveuserpage-warning": "'''Внимание.''' Вы собираетесь переименовать страницу участника. Пожалуйста, обратите внимание, что переименована будет только страница, участник '''не''' будет переименован.",
        "movecategorypage-warning": "<strong>Предупреждение:</strong> Вы собираетесь переименовать страницу категории. Пожалуйста, обратите внимание, что будет переименована только эта страница, а все страницы старой категории <em>не</em> будут перекатегоризованы в новую.",
        "movenologintext": "Вы должны [[Special:UserLogin|представиться системе]],\nчтобы иметь возможность переименовать страницы.",
        "movenosubpage": "У этой страницы нет подстраниц.",
        "movereason": "Причина:",
        "revertmove": "возврат",
-       "delete_and_move": "Удалить и переименовать",
        "delete_and_move_text": "== Требуется удаление ==\nСтраница с именем «[[:$1]]» уже существует. \nХотите удалить её, чтобы сделать возможным переименование?",
        "delete_and_move_confirm": "Да, удалить эту страницу",
        "delete_and_move_reason": "Удалено для возможности переименования «[[$1]]»",
        "tooltip-pt-preferences": "Ваши настройки",
        "tooltip-pt-watchlist": "Список страниц, изменения в которых вы отслеживаете",
        "tooltip-pt-mycontris": "Список ваших правок",
+       "tooltip-pt-anoncontribs": "Список правок, сделанных с этого IP-адреса",
        "tooltip-pt-login": "Здесь можно зарегистрироваться в системе, но это необязательно.",
        "tooltip-pt-logout": "Завершить сеанс работы",
        "tooltip-pt-createaccount": "Мы предлагаем вам создать учётную запись и войти в систему, хотя это и не обязательно.",
        "exif-compression-4": "CCITT Group 4, факсовое кодирование",
        "exif-copyrighted-true": "Охраняется авторским правом",
        "exif-copyrighted-false": "Авторско-правовой статус не задан",
+       "exif-photometricinterpretation-1": "Чёрный и белый (чёрный — 0)",
        "exif-unknowndate": "Неизвестная дата",
        "exif-orientation-1": "Нормальная",
        "exif-orientation-2": "Отражено по горизонтали",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Следующая метка не может быть применена|Следующие метки не могут быть применены}} вручную: $1",
        "tags-update-no-permission": "У вас нет права на добавление или изменение меток изменения из отдельных версий или записей журналов.",
        "tags-update-add-not-allowed-one": "Тег \"$1\" не может быть добавлен вручную.",
-       "tags-update-add-not-allowed-multi": "Следующее {{PLURAL:$2|tag is|tags are}} не может быть добавлено вручную: $1",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Следующий тег|Следующие теги}} нельзя добавлять вручную: $1",
        "tags-update-remove-not-allowed-one": "Метка «$1» не может быть удалена.",
        "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Следующая метка не может быть удалена|Следующие метки не могут быть удалены}} вручную: $1",
        "tags-edit-title": "Редактировать теги",
        "tags-edit-manage-link": "Управление тегами",
        "tags-edit-revision-selected": "{{PLURAL:$1|Выбранная версия|Выбранные версии}} [[:$2]]:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|1=Выбранная запись|Выбранные записи}} журнала:",
-       "tags-edit-revision-legend": "Добавить или удалить теги из {{PLURAL:$1|this revision|all $1 revisions}}",
+       "tags-edit-revision-legend": "Добавить или удалить теги из {{PLURAL:$1|1=этой версии|всех $1 версий}}",
        "tags-edit-logentry-legend": "Добавить или удалить теги из {{PLURAL:$1|this log entry|all $1 log entries}}",
        "tags-edit-existing-tags": "Существующие метки:",
        "tags-edit-existing-tags-none": "''Нет''",
        "tags-edit-revision-submit": "Применить изменения к {{PLURAL:$1|этой версии|$1 версиям}}",
        "tags-edit-logentry-submit": "Применить изменения к {{PLURAL:$1|этой записи журнала|$1 записям журнала}}",
        "tags-edit-success": "Изменения были успешно применены.",
-       "tags-edit-failure": "Ð\98зменениÑ\8f Ð½Ðµ Ñ\83далоÑ\81Ñ\8c Ð¿Ñ\80именениÑ\82Ñ\8c.\n$1",
+       "tags-edit-failure": "Изменения не удалось применить.\n$1",
        "tags-edit-nooldid-title": "Не задана целевая версия",
        "tags-edit-nooldid-text": "Вы не задали целевую версию (версии) для выполнения этой функции, или указанная версия не существует.",
        "tags-edit-none-selected": "Пожалуйста, выберите по крайней мере один тег, чтобы добавить или удалить.",
        "htmlform-cloner-required": "Требуется по крайней мере одно значение.",
        "htmlform-title-badnamespace": "[[:$1]] находится не в пространстве имён «{{ns:$2}}».",
        "htmlform-title-not-creatable": "«$1» — заголовок страницы, которая не может быть создана",
-       "htmlform-title-not-exists": "[[:$1]] не существует.",
+       "htmlform-title-not-exists": "$1 не существует.",
        "htmlform-user-not-exists": "<strong>$1</strong> не существует.",
        "htmlform-user-not-valid": "<strong>$1</strong> — недопустимое имя учётной записи.",
        "sqlite-has-fts": "$1 с поддержкой полнотекстового поиска",
        "logentry-suppress-block": "$1 {{GENDER:$2|заблокировал}} {{GENDER:$4|$3}} сроком на $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|изменил|изменила}} срок блокировки {{GENDER:$4|$3}} на период $5 $6",
        "logentry-import-upload": "$1 импортировал{{GENDER:$2||а}} $3 путём файловой загрузки",
+       "logentry-import-upload-details": "$1 импортировал{{GENDER:$2||а}} $3 с помощью файловой загрузки ($4 {{PLURAL:$4|версия|версий|версии}})",
        "logentry-import-interwiki": "$1 импортировал{{GENDER:$2||а}} $3 из другой вики",
+       "logentry-import-interwiki-details": "$1 импортировал{{GENDER:$2||а}} $3 из $5 ($4 {{PLURAL:$4|версия|версий|версии}})",
        "logentry-merge-merge": "$1 объединил{{GENDER:$2||а}} $3 с $4 (версии до $5)",
        "logentry-move-move": "$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|переименовал|переименовала}} страницу $3 в $4 без оставления перенаправления",
index 96b8e89..61415d6 100644 (file)
        "morenotlisted": "एषाऽऽवलिः अपूर्णा अस्ति ।",
        "mypage": "पृष्ठम्",
        "mytalk": "सम्भाषणम्",
-       "anontalk": "à¤\85सà¥\8dय à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदà¤\83 (I P address) à¤\95à¥\83तà¥\87 सम्भाषणम्",
+       "anontalk": "à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82वितà¥\8dसम्भाषणम्",
        "navigation": "सञ्चरणम्",
        "and": "&#32;तथा च",
        "qbfind": "अन्विष्यताम्",
        "retrievedfrom": "\"$1\" इत्यस्माद् पुनः प्राप्तिः",
        "youhavenewmessages": "{{PLURAL:$3|भवतः/भवत्याः कृते}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|भवतः/भवत्याः कृते}} $1  {{PLURAL:$3|अन्यस्मात् योजकात्|$3 अन्येभ्यः योजकेभ्यः}} अस्ति ($2)।",
-       "youhavenewmessagesmanyusers": "नà¥\88à¤\95à¥\87भà¥\8dयà¤\83 à¤¯à¥\8bà¤\9cà¤\95ेभ्यः ते $1 सन्ति ($2) ।",
+       "youhavenewmessagesmanyusers": "नà¥\88à¤\95à¥\87भà¥\8dयà¤\83 à¤¸à¤¦à¤¸à¥\8dयेभ्यः ते $1 सन्ति ($2) ।",
        "newmessageslinkplural": "{{PLURAL:$1|नूतनः सन्देशः|नूतनाः सन्देशाः}}",
        "newmessagesdifflinkplural": "सद्यः {{PLURAL:$1|परिवर्तनम्| परिवर्तनानि}}",
        "youhavenewmessagesmulti": "भवते नूतनसन्देशाः सन्ति अत्र $1",
        "sort-descending": "अवरोहक्रमेण सज्जयतु",
        "sort-ascending": "आरोहक्रमेण सज्जयतु",
        "nstab-main": "पृष्ठम्",
-       "nstab-user": "यà¥\8bà¤\9cà¤\95पृष्ठम्",
+       "nstab-user": "सदसà¥\8dयपृष्ठम्",
        "nstab-media": "माध्यमपृष्ठम्",
        "nstab-special": "विशेषपृष्ठम्",
        "nstab-project": "प्रकल्पपृष्ठम्",
        "nstab-template": "फलकम्",
        "nstab-help": "साहाय्यपृष्ठम्",
        "nstab-category": "वर्गः",
+       "mainpage-nstab": "मुख्यपृष्ठम्",
        "nosuchaction": "तादृशं कार्यं न विद्यते",
        "nosuchactiontext": "अनेन सार्वसङ्केन (URL) दर्शिता क्रिया अयोग्या अस्ति । अयोग्यं त्रुटियुक्तं वा सार्वसङ्केतं भवता/भवत्या लिखितं स्यात् ।",
        "nosuchspecialpage": "तादृशं विशेषपृष्ठं न विद्यते",
        "translateinterface": "विकि इत्यस्य सर्वेषु बन्धुप्रकल्पेषु अनुवादमिदं योजयितुं कृपया [//translatewiki.net/ translatewiki.net] इत्यस्य मिडीयाविकि-स्थानीयकरणस्य उपयोगं करोतु ।",
        "cascadeprotected": "इदं पृष्ठं सम्पादनात् संरक्षितमस्ति । कारणम् एतत् पृष्ठं {{PLURAL:$1|तादृशे पृष्ठे|तादृशेषु पृष्ठेषु}} अन्तर्भवति, यादृशेषु पृष्ठेषु सोपानवत् सुरक्षा अस्ति : $2",
        "namespaceprotected": "भवान्/भवती '''$1''' नामाकाशे अन्तर्भूतेषु पृष्ठेषु परिवर्तनं कर्तुं न शक्नोति ।",
-       "customcssprotected": "भवानà¥\8d/भवतà¥\80 à¤\87दà¤\82 CSS à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤¯à¤¤à¤\83 à¤\85नà¥\8dयसà¥\8dय à¤¯à¥\8bà¤\9cà¤\95स्य वैयक्तिकव्यवस्थापनानि (settings) अत्र सन्ति ।",
-       "customjsprotected": "भवानà¥\8d/भवतà¥\80 à¤\87दà¤\82 JavaScript à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤¯à¤¤à¤\83 à¤\85नà¥\8dयसà¥\8dय à¤¯à¥\8bà¤\9cà¤\95स्य वैयक्तिकव्यवस्थापनानि (settings) अत्र सन्ति ।",
+       "customcssprotected": "भवानà¥\8d/भवतà¥\80 à¤\87दà¤\82 CSS à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤¯à¤¤à¤\83 à¤\85नà¥\8dयसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयस्य वैयक्तिकव्यवस्थापनानि (settings) अत्र सन्ति ।",
+       "customjsprotected": "भवानà¥\8d/भवतà¥\80 à¤\87दà¤\82 JavaScript à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤¯à¤¤à¤\83 à¤\85नà¥\8dयसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयस्य वैयक्तिकव्यवस्थापनानि (settings) अत्र सन्ति ।",
        "mycustomcssprotected": "भवान्/भवती इदं CSS पृष्ठं सम्पादयितुं न शक्नोति ।",
        "mycustomjsprotected": "भवान्/भवती इदं JavaScript पृष्ठं सम्पादयितुं न शक्नोति ।",
        "myprivateinfoprotected": "भवान्/भवती अत्र वैयक्तिकसूचनाः सम्पादयितुं न शक्नोति ।",
        "logouttext": "'''भवान्/भवती अधुना बहिः अस्ति ।'''\nभवान्/भवती {{SITENAME}} इत्येतत् अनामतया प्रयोक्तुं शक्नोति । अथवा तेनैव प्रयोक्तृनाम्ना, भिन्नप्रयोक्तृनाम्ना वा पुनः प्रवेष्टुं शक्नोति ।\nइदानीमपि कानिचन पृष्ठानि पूर्ववदेव दृश्येरन् । तत् वारयितुं गवाक्षस्य (browser) इतिहासः रिक्तीक्रियताम् ।",
        "welcomeuser": "स्वागतम्, $1!",
        "welcomecreation-msg": "भवता/भवत्या सदस्यता प्राप्ता ।\nस्वस्य [[Special:Preferences|{{SITENAME}} इष्टतमानि]] परिवर्तयितुं मा विस्मरतु ।",
-       "yourname": "यà¥\8bà¤\9cà¤\95नाम:",
-       "userlogin-yourname": "पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम",
-       "userlogin-yourname-ph": "सà¥\8dवसà¥\8dय à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम लिख्यताम्",
-       "createacct-another-username-ph": "पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम लिख्यताम्",
+       "yourname": "सदसà¥\8dयनाम:",
+       "userlogin-yourname": "सदसà¥\8dयनाम",
+       "userlogin-yourname-ph": "सà¥\8dवसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयनाम लिख्यताम्",
+       "createacct-another-username-ph": "सदसà¥\8dयनाम लिख्यताम्",
        "yourpassword": "कूटशब्दः :",
        "userlogin-yourpassword": "कूटशब्दः",
        "userlogin-yourpassword-ph": "स्वस्य कूटशब्दः लिख्यताम्",
        "createaccountreason": "कारणम् :",
        "createacct-reason": "कारणम्",
        "createacct-reason-ph": "भवतः/भवत्याः अन्यसदस्यतां प्राप्तुं किं प्रयोजनमस्ति ?",
-       "createacct-captcha": "सुरक्षानिरीक्षणम्",
-       "createacct-imgcaptcha-ph": "उपरि लिखिताः वर्णाः लिख्यन्तादम्",
        "createacct-submit": "स्वसदस्यता प्राप्यताम्",
        "createacct-another-submit": "अन्यसदस्यता प्राप्यताम्",
        "createacct-benefit-heading": "{{SITENAME}} इति भवत्सदृशैः जनैः रचितमस्ति ।",
        "createacct-benefit-body2": "{{PLURAL:$1|पृष्ठम्|पृष्ठानि}}",
        "createacct-benefit-body3": "नवीन{{PLURAL:$1|योजकः|योजकाः}}",
        "badretype": "भवता/भवत्या लिखितौ कूटशब्दौ समानौ न स्तः ।",
-       "userexists": "भवता/भवतà¥\8dया à¤\88षà¥\8dà¤\9fà¤\82 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम à¤ªà¥\82रà¥\8dवमà¥\87व à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤ \nà¤\95à¥\83पया à¤\85परà¤\82 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम चिनोतु ।",
-       "loginerror": "पà¥\8dरवà¥\87शà¥\87 à¤¦à¥\8bषà¤\83",
+       "userexists": "भवता/भवतà¥\8dया à¤\88षà¥\8dà¤\9fà¤\82 à¤¸à¤¦à¤¸à¥\8dयनाम à¤ªà¥\82रà¥\8dवमà¥\87व à¤µà¤¿à¤¦à¥\8dयतà¥\87 à¥¤ \nà¤\95à¥\83पया à¤\85परà¤\82 à¤¸à¤¦à¤¸à¥\8dयनाम चिनोतु ।",
+       "loginerror": "प्रवेशदोषः",
        "createacct-error": "सदस्यताप्राप्तिकाले दोषः",
        "createaccounterror": "$1 सदस्यता न प्राप्ता :",
        "nocookiesnew": "भवता/भवत्या सदस्यता प्राप्ता, परन्तु प्रवेशः न कृतः । {{SITENAME}} इत्यस्य कृते योजकज्ञापकम् (uses cookies) अनिवार्यम् अस्ति । \nभवता/भवत्या ज्ञापकव्यवस्था असमर्थिता अस्ति ।\nकृपया सा समर्थ्यताम्, ततश्च नवीनसदस्यतायाः प्रयोक्तृनाम्ना प्रविश्यताम् ।",
        "nocookieslogin": "{{SITENAME}} इत्यत्र ज्ञापकेन (cookies) विना प्रवेशः न शक्यः । \nभवता/भवत्या ज्ञापकव्यवस्था असमर्थिता अस्ति ।\nकृपया सा समर्थ्यताम्, ततश्च पुनः प्रयासः क्रियताम् ।",
        "nocookiesfornew": "योजकसदस्यता न सिद्धा यतः स्रोतः प्रमाणीकृतं न जातम् । \nभवता कुक्कीस् इत्येतत् समर्थितानि किम् इति परिशील्य इदं पृष्ठं पुनरारोप्य प्रयतताम् ।",
-       "noname": "भवता/भवतà¥\8dया à¤¯à¥\8bà¤\97à¥\8dयà¤\82 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम न प्रदत्तम् ।",
+       "noname": "भवता/भवतà¥\8dया à¤¯à¥\8bà¤\97à¥\8dयà¤\82 à¤¸à¤¦à¤¸à¥\8dयनाम न प्रदत्तम् ।",
        "loginsuccesstitle": "स्वागतं ! प्रवेशः सिद्धः ।",
        "loginsuccess": "भवता/भवत्या {{SITENAME}} इत्यत्र \"$1\"-योजकत्वेन प्रवेशः प्राप्तः ।",
        "nosuchuser": "'''$1''' नाम्नः न कोऽपि योजकः विद्यते ।\n\nप्रयोक्तृनामानि पक्षानुगुणं (case sensitive) भवन्ति ।\n\nयत् टङ्कितं, तत् पश्यतु अथवा [[Special:UserLogin/signup|नूतनसदस्यता प्राप्यताम्]] ।",
        "nosuchusershort": "'''$1''' नाम्नः न कोऽपि सदस्यः विद्यते ।\n\nयत् टङ्कितं, तत् पश्यतु ।",
-       "nouserspecified": "भवता/भवतà¥\8dया à¤\8fà¤\95à¤\82 à¤¯à¥\8bà¤\97à¥\8dयà¤\82 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम अवश्यमेव दातव्यम् ।",
+       "nouserspecified": "भवता/भवतà¥\8dया à¤\8fà¤\95à¤\82 à¤¯à¥\8bà¤\97à¥\8dयà¤\82 à¤¸à¤¦à¤¸à¥\8dयनाम अवश्यमेव दातव्यम् ।",
        "login-userblocked": "एषः सदस्यः प्रतिबन्धितः । प्रवेष्टुम् अनुमतिः नास्ति ।",
        "wrongpassword": "भवता/भवत्या लिखितः कूटशब्दः त्रुटियुक्तः । \nकृपया पुनः लिख्यताम् ।",
        "wrongpasswordempty": "कूटशब्दपेटिकायां कूटशब्दः न लिखितः ।\n\nकृपया पुनः प्रयासः क्रियताम् ।",
        "passwordtooshort": "न्यूनातिन्यूनं {{PLURAL:$1| 1 अक्षरात्मकः|$1 अक्षरात्मकः}} कूटशब्दः भवेदेव ।",
        "passwordtoolong": "कूटशब्दः {{PLURAL:$1| 1 अक्षरात्|$1 अक्षरेभ्यः}} बृहत् न स्यात् ।",
-       "password-name-match": "भवतà¤\83/भवतà¥\8dयाà¤\83 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम, कूटशब्दः च समानः न भवेत् ।",
+       "password-name-match": "भवतà¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤¦à¤¸à¥\8dयनाम, कूटशब्दः च समानः न भवेत् ।",
        "password-login-forbidden": "अस्य प्रयोक्तृनाम्नः कूटशब्दस्य च प्रयोगः वर्जितोऽस्ति ।",
        "mailmypassword": "कूटशब्दः परिवर्त्यताम्",
        "passwordremindertitle": "{{SITENAME}} इत्यस्मै नूतनः अस्थायी कूटशब्दः ।",
        "noemailprefs": "एनं विकल्पं समर्थितुम् \"इष्टतमानि\" मध्ये भवतः/भवत्याः वि-पत्रसङ्केतस्य उल्लेखः आवश्यकः ।",
        "emailconfirmlink": "स्वस्य वि-पत्रसङ्कतं प्रमाणीक्रियताम्",
        "invalidemailaddress": "एषः वि-पत्रसङ्केतः आवश्यकप्रारुपे नास्ति । कृपया योग्यप्रारुपानुकूलः वि-पत्रसङ्केतः लिख्यताम् । अथवा सा पेटिका रिक्ता त्यज्यताम् ।",
-       "cannotchangeemail": "à¤\85सà¥\8dमिनà¥\8d à¤µà¤¿à¤\95ि-à¤\9cालसà¥\8dथानà¥\87 à¤¯à¥\8bà¤\9cà¤\95-विपत्र-सङ्केताः परिवर्तयितुं न शक्यन्ते ।",
+       "cannotchangeemail": "à¤\85सà¥\8dमिनà¥\8d à¤µà¤¿à¤\95ि-à¤\9cालसà¥\8dथानà¥\87 à¤¸à¤¦à¤¸à¥\8dय-विपत्र-सङ्केताः परिवर्तयितुं न शक्यन्ते ।",
        "emaildisabled": "स्थानमेतत् (site) वि-पत्रं प्रेषयितुं न शक्यते ।",
        "accountcreated": "सदस्यता प्राप्ता",
        "accountcreatedtext": "[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) कृते \"योजसम्भाषणम्\" इति पृष्ठं रचितम् ।",
        "createaccount-text": "{{SITENAME}} ($4) इत्यत्र, \"$2\" नाम्ना, \"$3\" कूटशब्देन, च कोऽपि भवतः/भवत्याः वि-पत्रसङ्केतस्य उपयोगं कृत्वा सदस्यतां प्रापत् ।\nअधुना भवान्/भवती प्रवेशं कृत्वा गुप्तसङ्ख्यां परिवर्तयितं शक्नोति ।\nएषा सदस्यताप्राप्तिः क्षत्या अभवत् चेत्, एनं सन्देशम् उपेक्षताम् ।",
        "login-throttled": "भवता/भवत्या अत्यधिकाः प्रवेशप्रयासाः कृताः । \nकृपया $1 कालं यावत् प्रतीक्ष्यताम् ।",
        "login-abort-generic": "भवतः/भवत्याः प्रवेशप्रयासः विफलीभूतः - परित्यक्तः",
-       "login-migrated-generic": "भवतà¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤¦à¤¸à¥\8dयतà¥\8dवà¤\82 à¤¸à¥\8dथानानà¥\8dतरितà¤\82, à¤¯à¥\87न à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम एतस्मिन् विकि-प्रकल्पे न विद्यते ।",
+       "login-migrated-generic": "भवतà¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤¦à¤¸à¥\8dयतà¥\8dवà¤\82 à¤¸à¥\8dथानानà¥\8dतरितà¤\82, à¤¯à¥\87न à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤¦à¤¸à¥\8dयनाम एतस्मिन् विकि-प्रकल्पे न विद्यते ।",
        "loginlanguagelabel": "भाषा : $1",
        "suspicious-userlogout": "भवतः/भवत्याः \"निर्गम्यताम्\" इत्यस्य विज्ञप्तिं स्वीकर्तुं न शक्यते । यतः भवता/भवत्या एषा विज्ञप्तिं तृटियुक्तगवेक्षणात् प्रतिनिधि(proxy)-तः वा कृता ।",
        "createacct-another-realname-tip": "वास्तविकनाम ऐच्छिकम् अस्ति । भवान्/भवती एनं विकल्पं समर्थयति चेत्, भवतः/भवत्याः योगदानश्रेयसः उल्लेखसमये अस्य उपयोगः भविष्यति ।",
        "passwordreset-text-many": "{{PLURAL:$1|वि-पत्रमाध्यमेन अल्पकालीनकूटशब्दं प्राप्तुम् अधस्तनां कामपि एकां पेटिकां पूरयतु ।}}",
        "passwordreset-disabled": "अस्मिन् विकि-जालस्थाने कूटशब्दं परिर्तितुं निषेधः अस्ति ।",
        "passwordreset-emaildisabled": "अस्मिन् विकि-जालस्थाने वि-पत्रसम्बद्धाः सेवाः असमर्थिताः सन्ति ।",
-       "passwordreset-username": "यà¥\8bà¤\9cà¤\95नाम:",
-       "passwordreset-domain": "à¤\95à¥\8dषà¥\87तà¥\8dरमà¥\8d:",
+       "passwordreset-username": "सदसà¥\8dयनाम:",
+       "passwordreset-domain": "पà¥\8dरदà¥\87शà¤\83 :",
        "passwordreset-capture": "परिणामस्वरूपनिर्मितानि वि-पत्राणि द्रष्टुम् इच्छति ?",
        "passwordreset-capture-help": "अस्यां मञ्जूषायां यदि भवता अङ्क्यते तर्हि वि-पत्रम् (अस्थायिकूटशब्देन सह) दर्श्यते प्रेष्यते च ।",
        "passwordreset-email": "वि-पत्रसङ्केतः",
        "passwordreset-emailtitle": "{{SITENAME}} इत्यत्र योजकविषये",
        "passwordreset-emailtext-ip": "कोऽपि (कदाचित् भवान्/भवती, $1 अन्तर्जालसंविदः (from IP)) {{SITENAME}}($4) जालस्थानस्य  कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । निम्न{{PLURAL:$3|योजकः|योजकाः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विनतिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
        "passwordreset-emailtext-user": "$1 सदस्यः {{SITENAME}}($4) जालस्थानस्य  कृते कूटशब्दपरिवर्तनस्य विनतिम् अकरोत् । निम्न{{PLURAL:$3|सदस्यः|सदस्याः}} अनेन वि-पत्रेण सह सल्लग्नः अस्ति/सल्लग्नाः सन्ति ।\n\n$2\n\n{{PLURAL:$3|एषः अल्पकालीनकूटशब्दः|एते अल्पकालीनकूटशब्दाः}} {{PLURAL:$5|चतुर्विंशतिघण्टासु|$5 दिनेषु}} निरस्तः भविष्यति/निरस्ताः भविष्यन्ति ।\nअधुना प्रवेशं सम्प्राप्य कूटशब्दः परिवर्तनीयः एव । \n\nनिम्नकारणानि यदि सन्ति, तर्हि एनं सन्देशम् अवगण्यताम् ।\n\n१ कोऽपि अन्यः अत्र विज्ञप्तिम् अकरोत् । \n२ पूरातनः कूटशब्दः भवतः/भवत्याः स्मरणे अस्ति ।\n३ भवान्/भवती कूटशब्दं परिवर्तयितुं नेच्छिति ।",
-       "passwordreset-emailelement": "पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम : \n$1\n\nअल्पकालीनकूटशब्दः : \n$2",
-       "passwordreset-emailsent": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति ।",
+       "passwordreset-emailelement": "सदसà¥\8dयनाम : \n$1\n\nअल्पकालीनकूटशब्दः : \n$2",
+       "passwordreset-emailsentemail": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति ।",
        "passwordreset-emailsent-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं प्रेषितम् अस्ति । तत् अधः द्रष्टुं शक्यते ।",
        "passwordreset-emailerror-capture": "परिवर्तितकूटशब्दस्य वि-पत्रं निर्मितम् अस्ति । तत् अधः द्रष्टुं शक्यते । परन्तु {{GENDER:$2|योजकाय}} प्रेषणकाले तत् निरस्तम् अभवत् : $1",
        "changeemail": "वि-पत्रसङ्केतः परिवर्त्यताम्",
        "accmailtext": "[[User talk:$1|$1]] कृते अशृङ्खलितरीत्या (randomly) उत्पादितः कूटशब्दः $2 वि-पत्रसङ्केतं प्रति प्रेषितः अस्ति । <em>[[Special:ChangePassword|कूटशब्दः परिवर्त्यताम्]]</em> अत्र तत् परिर्तयितुं शक्यते ।",
        "newarticle": "(नूतनम्)",
        "newarticletext": "भवान्/भवती अनिर्मिते पृष्ठे अस्ति । \nपृष्ठं स्रष्टुम् अधः प्रदत्तायां पेटिकायां टङ्कनं प्रारभताम् (साहाय्यार्थं [$1 अत्र]) नुदतु ।\nभवान्/भवती यदि क्षतिकारणात् एतत् पृष्ठं प्रति आगच्छत्, तर्हि अस्य गवेषकस्य (browser) Back नुदतु ।",
-       "anontalkpagetext": "----\n<em>à¤\8fततà¥\8d à¤¸à¤®à¥\8dभाषणपà¥\83षà¥\8dठमà¥\8d à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95à¥\87भà¥\8dयà¤\83 à¤\85सà¥\8dति à¥¤ à¤\8fततà¥\8d à¤¤à¥\87भà¥\8dयà¤\83 à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95à¥\87भà¥\8dयà¤\83 à¤°à¤\9aितमसà¥\8dति, à¤¯à¥\88à¤\83 à¤¸à¤¦à¤¸à¥\8dयता à¤¨ à¤ªà¥\8dरापà¥\8dता à¤\85सà¥\8dति à¤¤à¤¥à¤¾ à¤\9a à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤\89पयà¥\8bà¤\97à¤\82 à¤¨ à¤\95à¥\81रà¥\8dवनà¥\8dतà¤\83 à¤¸à¤¨à¥\8dति à¥¤</em>\nतà¥\87षाà¤\82 à¤µà¥\8dयà¤\95à¥\8dतिà¤\97तसà¥\82à¤\9aनाà¤\82 à¤ªà¥\8dरापà¥\8dतà¥\81मà¥\87व à¤µà¤¯à¤\82 à¤¤à¤¸à¥\8dय/तसà¥\8dयाà¤\83 à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदà¤\83 à¤\89पयà¥\8bà¤\97à¤\82 à¤\95à¥\81रà¥\8dमà¤\83 à¥¤ à¤\95à¥\87à¤\9aन à¤¯à¥\8bà¤\9cà¤\95ाà¤\83 à¤¸à¥\8dवसà¥\8dय à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदमà¥\8d à¤\85नà¥\8dयानà¥\8d à¤¯à¥\8bà¤\9cà¤\95ानà¥\8d à¤\95थयनà¥\8dति à¥¤ \nयदà¥\8dयपि à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95à¤\83 à¤\85हà¤\82 à¤¨à¤¾à¤¸à¥\8dमि, à¤¤à¤¥à¤¾à¤ªà¤¿ à¤\85यà¥\8bà¤\97à¥\8dयसà¥\82à¤\9aनाà¤\83 à¤®à¤® à¤ªà¤¾à¤°à¥\8dशà¥\8dवà¥\87 à¤\86à¤\97à¤\9aà¥\8dà¤\9bनà¥\8dतà¥\8dयà¤\83 à¤¸à¤¨à¥\8dति à¤\87ति à¤¯à¤¦à¤¿ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤¶à¤\99à¥\8dà¤\95तà¥\87, à¤¤à¤°à¥\8dहि à¤\8fततà¥\8d [[Special:UserLogin/signup|create an account]] à¤\8fततà¥\8d [[Special:UserLogin|log in]] à¤µà¤¾ à¤\95à¥\83तà¥\8dवा à¤­à¤µà¤¿à¤·à¥\8dयसà¥\8dय à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95ानां सन्देशेभ्यः स्वस्य रक्षणं करोतु ।",
+       "anontalkpagetext": "----\n<em>à¤\8fततà¥\8d à¤¸à¤®à¥\8dभाषणपà¥\83षà¥\8dठमà¥\8d à¤\85नामà¤\95सदसà¥\8dयà¥\87भà¥\8dयà¤\83 à¤\85सà¥\8dति à¥¤ à¤\8fततà¥\8d à¤¤à¥\87भà¥\8dयà¤\83 à¤\85नामà¤\95सदसà¥\8dयà¥\87भà¥\8dयà¤\83 à¤°à¤\9aितमसà¥\8dति, à¤¯à¥\88à¤\83 à¤¸à¤¦à¤¸à¥\8dयता à¤¨ à¤ªà¥\8dरापà¥\8dता à¤\85सà¥\8dति à¤¤à¤¥à¤¾ à¤\9a à¤\85सà¥\8dय à¤ªà¥\83षà¥\8dठसà¥\8dय à¤\89पयà¥\8bà¤\97à¤\82 à¤¨ à¤\95à¥\81रà¥\8dवनà¥\8dतà¤\83 à¤¸à¤¨à¥\8dति à¥¤</em>\nतà¥\87षाà¤\82 à¤µà¥\8dयà¤\95à¥\8dतिà¤\97तसà¥\82à¤\9aनाà¤\82 à¤ªà¥\8dरापà¥\8dतà¥\81मà¥\87व à¤µà¤¯à¤\82 à¤¤à¤¸à¥\8dय/तसà¥\8dयाà¤\83 à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदà¤\83 à¤\89पयà¥\8bà¤\97à¤\82 à¤\95à¥\81रà¥\8dमà¤\83 à¥¤ à¤\95à¥\87à¤\9aन à¤¸à¤¦à¤¸à¥\8dयाà¤\83 à¤¸à¥\8dवसà¥\8dय à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदमà¥\8d à¤\85नà¥\8dयानà¥\8d à¤¸à¤¦à¤¸à¥\8dयानà¥\8d à¤\95थयनà¥\8dति à¥¤ \nयदà¥\8dयपि à¤\85नामà¤\95सदसà¥\8dयà¤\83 à¤\85हà¤\82 à¤¨à¤¾à¤¸à¥\8dमि, à¤¤à¤¥à¤¾à¤ªà¤¿ à¤\85यà¥\8bà¤\97à¥\8dयसà¥\82à¤\9aनाà¤\83 à¤®à¤® à¤ªà¤¾à¤°à¥\8dशà¥\8dवà¥\87 à¤\86à¤\97à¤\9aà¥\8dà¤\9bनà¥\8dतà¥\8dयà¤\83 à¤¸à¤¨à¥\8dति à¤\87ति à¤¯à¤¦à¤¿ à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤¶à¤\99à¥\8dà¤\95तà¥\87, à¤¤à¤°à¥\8dहि à¤\8fततà¥\8d [[Special:UserLogin/signup|create an account]] à¤\8fततà¥\8d [[Special:UserLogin|log in]] à¤µà¤¾ à¤\95à¥\83तà¥\8dवा à¤­à¤µà¤¿à¤·à¥\8dयसà¥\8dय à¤\85नामà¤\95सदसà¥\8dयानां सन्देशेभ्यः स्वस्य रक्षणं करोतु ।",
        "noarticletext": "अस्मिन् पृष्ठे अधुना किमपि न विद्यते । [[Special:Search/{{PAGENAME}}|एषः शब्दः]] येषु पृष्ठेषु अन्तर्भवति, तानि पृष्ठानि अन्वेष्टुं शक्यन्ते । \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  सम्बद्धेषु पृष्ठेषु अन्वेषणं]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} अस्य पृष्ठस्य सम्पादनं] वा  शक्यम्</span>.",
        "noarticletext-nopermission": "अस्मिन् पृष्ठे अधुना किमपि न विद्यते । [[Special:Search/{{PAGENAME}}|एषः शब्दः]] येषु पृष्ठेषु अन्तर्भवति, तानि पृष्ठानि अन्वेष्टुं शक्यन्ते । \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}  सम्बद्धेषु पृष्ठेषु अन्वेषणं]\n[{{fullurl:{{FULLPAGENAME}}|action=edit}} अस्य पृष्ठस्य सम्पादनं] वा  शक्यम्</span>.",
        "missing-revision": "\"{{FULLPAGENAME}}\" पृष्ठस्य संस्करणं #$1 नोपलभ्यम् ।\nयस्य पृष्ठस्य इतिहासे परिसन्धयः कालातीताः सन्ति, तेषु पृष्ठेषु एवं भवति ।\nअधिकसूचनाः अत्र प्राप्तुं शक्यते [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} अपाकृतानाम् आवलिः].",
-       "userpage-userdoesnotexist": "\"$1\" à¤\87ति à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम पञ्जीकृतं न विद्यते । अस्य\nनवरचनायै/सम्पादनाय तत् पश्यतु ।",
-       "userpage-userdoesnotexist-view": "\"$1\" à¤\87ति à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम पञ्जीकृतं न विद्यते ।",
+       "userpage-userdoesnotexist": "\"$1\" à¤\87ति à¤¸à¤¦à¤¸à¥\8dयनाम पञ्जीकृतं न विद्यते । अस्य\nनवरचनायै/सम्पादनाय तत् पश्यतु ।",
+       "userpage-userdoesnotexist-view": "\"$1\" à¤\87ति à¤¸à¤¦à¤¸à¥\8dयनाम पञ्जीकृतं न विद्यते ।",
        "blocked-notice-logextract": "अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते ।\nसन्दर्भार्थम् अधः नूतनतमा अवरोधाभिलेख-प्रविष्टिः प्रदत्ताऽस्ति :",
        "clearyourcache": "<strong>सूचना :</strong> भवता/भवत्या कृतानि सम्पादनानि संरक्ष्य तानि परिवर्तनेषु द्रष्टुं गवेषकस्य पृष्ठस्य पुनरारोपणम् (reload) आवश्यकं भवति ।\n* <strong>Firefox / Safari:</strong> <em>Shift</em>कुड्मलेन सह <em>Reload</em>कुड्मलं नुदतु । \n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> नोदनेन पुनरारोपणं भवति । (<em>⌘-R</em> इति Mac तन्त्रांशप्रयोक्तॄभ्यः)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em>कुड्मलेन सह <em>Refresh</em>कुड्मलं नुदतु, <em>Ctrl-F5</em> नुदतु वा ।\n* <strong>Opera:</strong> <em>Tools → Preferences</em> इत्यत्र गत्वा कर्तुं शक्नोति ।",
        "usercssyoucanpreview": "'''सूचना :''' CSS नवीनलिप्याः संरक्षणं करणात् प्राक् एतत् \"{{int:showpreview}}\" नुद्य प्रयोगं करोतु ।",
        "userjsyoucanpreview": "'''सूचना :''' JavaScript नवीनलिप्याः संरक्षणं करणात् प्राक् एतत् \"{{int:showpreview}}\" नुद्य प्रयोगं करोतु ।",
-       "usercsspreview": "<strong>à¤\8fततà¥\8d à¤\95à¥\87वलà¤\82 à¤¯à¥\8bà¤\9cà¤\95स्य CSS इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
-       "userjspreview": "<strong>à¤\8fततà¥\8d à¤\95à¥\87वलà¤\82 à¤¯à¥\8bà¤\9cà¤\95स्य JabaScript इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
+       "usercsspreview": "<strong>à¤\8fततà¥\8d à¤\95à¥\87वलà¤\82 à¤¸à¤¦à¤¸à¥\8dयस्य CSS इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
+       "userjspreview": "<strong>à¤\8fततà¥\8d à¤\95à¥\87वलà¤\82 à¤¸à¤¦à¤¸à¥\8dयस्य JabaScript इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
        "sitecsspreview": "<strong>एतत् केवलं CSS इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
        "sitejspreview": "<strong>एतत् केवलं JavaScript इत्यस्य प्राग्दृश्यं वर्तते इति स्मरतु । भवता/भवत्या कृतानि परिवर्तनानि एतवता न रक्षितानि !</strong>",
        "userinvalidcssjstitle": "'''पूर्वसूचना:'''  \"$1\" इति त्वक् न विद्यते।\nयोजकपरिवर्तिते .css, .js सञ्चिके लघु-आङ्ग्लवर्णमालायाः वर्णैः लिख्येते । उदा. {{ns:user}}:Foo/Vector.css एवं न लेखनीयम् । लघुवर्णैः {{ns:user}}:Foo/vector.css एवं लेखनीयम् ।",
        "history-feed-empty": "एतत् पृष्ठं न विद्यते । \nएतस्य पृष्ठस्य नामपरिवर्तनम्, अपाकरणं च कृतं स्यात् । \n अनेन सम्बद्धानि पृष्ठानि [[Special:Search|विकि-जालस्थाने अन्विष्यन्ताम्]] ।",
        "history-edit-tags": "चितस्य संस्ककरणस्य चिह्नानि सम्पाद्यन्ताम्",
        "rev-deleted-comment": "(सम्पादनस्य सारः अपाकृतः)",
-       "rev-deleted-user": "(पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम अपाकृतमस्ति)",
+       "rev-deleted-user": "(सदसà¥\8dयनाम अपाकृतमस्ति)",
        "rev-deleted-event": "(संरक्षिताऽऽवल्यः(log) अपाकृताः)",
-       "rev-deleted-user-contribs": "[पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम अन्तर्जालसंविद् वा अपाकृतम् - योगदानाऽऽवल्याम् एतानि परिवर्तनानि निगूहितानि सन्ति ।]",
+       "rev-deleted-user-contribs": "[सदसà¥\8dयनाम अन्तर्जालसंविद् वा अपाकृतम् - योगदानाऽऽवल्याम् एतानि परिवर्तनानि निगूहितानि सन्ति ।]",
        "rev-deleted-text-permission": "एतस्य पृष्ठस्य संस्करणम् <strong>अपाकृतमस्ति</strong> ।\nविस्तृतं विवरणम् अत्र प्राप्स्यति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "rev-suppressed-text-permission": "एतस्य पृष्ठस्य संस्कृतम् <strong>अपाकृतम्</strong> । तस्य विस्तृतं विवकणं [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} गूहितऽऽवल्याः] प्राप्यते ।",
        "rev-deleted-text-unhide": "एतस्य पृष्ठस्य संस्करणम् <strong>अपाकृतमस्ति</strong> ।\nविस्तृतं ज्ञानम् अत्र प्राप्स्यति... [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log]. \n\nयदि इच्छति, तर्हि अत्रापि [$1 view this revision] द्रष्टुं शक्नोति ।",
        "revdelete-hide-image": "सञ्चिकाधेयं गोप्यताम्",
        "revdelete-hide-name": "परिमितयः (parameters), लक्ष्यं च गोप्यताम्",
        "revdelete-hide-comment": "सम्पादनसारः गोप्यताम्",
-       "revdelete-hide-user": "यà¥\8bà¤\9cà¤\95स्य प्रयोकतृनाम/अन्तर्जालसंविद् (IP)",
+       "revdelete-hide-user": "सदसà¥\8dयस्य प्रयोकतृनाम/अन्तर्जालसंविद् (IP)",
        "revdelete-hide-restricted": "प्रबन्धकेभ्यः, अन्येभ्यश्च सूचनाधारः गोप्यताम्",
        "revdelete-radio-same": "(मा परिवर्त्यताम्)",
        "revdelete-radio-set": "निगूहितम्",
        "revdelete-modify-no-access": "$2 दिनाङ्कस्य $1 समयस्य परिवर्तितवस्तुनि दोषः दृष्टः । तत् वस्तु निषिद्धावल्याम् अस्ति । भवान्/भवती तत् परिवर्तितुं न शक्नोति ।",
        "revdelete-modify-missing": "ID $1 इत्यस्य परिवर्तने दोषः : एतत् दत्तांशे न प्राप्तम् !",
        "revdelete-no-change": "'''पूर्वसूचना :''' $2, $1 इत्यस्मिन् याचितवस्तूनि पूर्वमेव विद्यन्ते ।",
-       "revdelete-concurrent-change": "$2 दिनाङ्कस्य $1 समयस्य परिवर्तनेषु दोषः दृष्टः । अस्य पृष्ठस्य यदा भवान्/भवती सम्पादनं करोति स्म, तदा अन्य कोऽपि अत्र परिवर्तनम् अकरोत् । अतः परिवर्तनस्य इतिहासे अन्यस्य नाम दृश्यते । \nकृपया स्वस्य संरक्षिताऽऽवलिं पश्यतु ।",
+       "revdelete-concurrent-change": "$2 दिनाङ्कस्य $1 समयस्य परिवर्तनेषु दोषः दृष्टः । अस्य पृष्ठस्य यदा भवान्/भवती सम्पादनं करोति स्म, तदा अन्य कोऽपि अत्र परिवर्तनम् अकरोत् । अतः परिवर्तनस्य इतिहासे अन्यस्य नाम दृश्यते । \nकृपया स्वस्य संरक्षिताऽऽवलिं पश्यतु ।",
        "revdelete-only-restricted": "$2 दिनाङ्कस्य $1 समयस्य निगूढनकार्ये दोषः दृष्टः । भावान्/भवती दृश्यता-विकल्पे परिवर्तनं अकृत्वा प्रबन्धकेभ्यः एतत् परिवर्तनं निगूहितुं न शक्नोति ।",
-       "revdelete-reason-dropdown": "* à¤\85पाà¤\95रणसà¥\8dय à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dयà¤\95ारणानि\n** à¤ªà¥\8dरतिà¤\95à¥\83तà¥\8dयधिà¤\95ारसà¥\8dय à¤\89लà¥\8dलà¤\99à¥\8dà¤\98नमà¥\8d\n** à¤\85यà¥\8bà¤\97à¥\8dया à¤\9fिपà¥\8dपणà¥\80 à¤µà¥\88यà¤\95à¥\8dतिà¤\95सà¥\82à¤\9aनाधारà¤\83 à¤µà¤¾\n** à¤\85यà¥\8bà¤\97à¥\8dयà¤\82 à¤¯à¥\8bà¤\9cà¤\95नाम\n** हानिकारकसूचनाधारः",
+       "revdelete-reason-dropdown": "* à¤\85पाà¤\95रणसà¥\8dय à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dयà¤\95ारणानि\n** à¤ªà¥\8dरतिà¤\95à¥\83तà¥\8dयधिà¤\95ारसà¥\8dय à¤\89लà¥\8dलà¤\99à¥\8dà¤\98नमà¥\8d\n** à¤\85यà¥\8bà¤\97à¥\8dया à¤\9fिपà¥\8dपणà¥\80 à¤µà¥\88यà¤\95à¥\8dतिà¤\95सà¥\82à¤\9aनाधारà¤\83 à¤µà¤¾\n** à¤\85यà¥\8bà¤\97à¥\8dयà¤\82 à¤¸à¤¦à¤¸à¥\8dयनाम\n** हानिकारकसूचनाधारः",
        "revdelete-otherreason": "अपरं/अतिरिक्तं कारणम् :",
        "revdelete-reasonotherlist": "अन्यानि कारणानि",
        "revdelete-edit-reasonlist": "सम्पादनस्य अपाकरणकारणानि",
        "datedefault": "इष्टतमानि न सन्ति",
        "prefs-labs": "प्रयोगशालावैशिष्ट्यम्",
        "prefs-user-pages": "योजकपृष्ठानि",
-       "prefs-personal": "यà¥\8bà¤\9cà¤\95स्य विवरणम्",
+       "prefs-personal": "सदसà¥\8dयस्य विवरणम्",
        "prefs-rc": "सद्यो जातानि परिवर्तनानि",
        "prefs-watchlist": "निरीक्षासूचिः",
        "prefs-editwatchlist": "निरीक्षासूचिः सम्पाद्यताम्",
        "prefs-reset-intro": "भवान्/भवती अस्य पृष्ठस्य साहाय्येन स्वस्य इष्टतमविकल्पान् मूलविकि-विकल्पसदृशं स्थापयितुं (कर्तुं) शक्नोति ।\nपरन्तु ततः भवान्/भवती पूर्ववत् स्थितिं प्राप्तुं न शक्ष्यति ।",
        "prefs-emailconfirm-label": "वि-पत्रं दृढीक्रियताम् :",
        "youremail": "वि-पत्रसङ्केतः :",
-       "username": "{{GENDER:$1|यà¥\8bà¤\9cà¤\95नाम}} :",
+       "username": "{{GENDER:$1|सदसà¥\8dयनाम}} :",
        "prefs-memberingroups": "{{PLURAL:$1|समूहस्य|समूहानां}} {{GENDER:$2|सदस्यः|सदस्याः}} :",
        "prefs-registration": "पञ्जीकरणकालः :",
        "yourrealname": "वास्तविकनाम :",
        "email": "वि-पत्रम्",
        "prefs-help-realname": "वास्तविकनाम ऐच्छकम् अस्ति । भवान्/भवती एनं विकल्पं समर्थयति चेत्, भवतः/भवत्याः योगदानश्रेयस्य उल्लेखसमये अस्य उपयोगः भविष्यति ।",
        "prefs-help-email": "वि-पत्रसङ्केतः अनिवार्यः नास्ति । किन्तु कूटशब्दः विस्मर्यते चेत्, तस्य परिवर्तनाय आवश्यकः भवति ।",
-       "prefs-help-email-others": "यà¥\8bà¤\9cà¤\95पà¥\83षà¥\8dठ-समà¥\8dभाषणपà¥\83षà¥\8dठयà¥\8bà¤\83 à¤®à¤¾à¤§à¥\8dयमà¥\87न, à¤µà¤¿-पतà¥\8dरमाधà¥\8dयमà¥\87न à¤µà¤¾ à¤\85नà¥\8dयà¥\87 à¤¯à¥\8bà¤\9cà¤\95ाà¤\83 à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤®à¥\8dपरà¥\8dà¤\95à¤\82 à¤\95रà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\81यà¥\81à¤\83 à¥¤\nसमà¥\8dपरà¥\8dà¤\95à¥\87ऽसà¥\8dमिनà¥\8d à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤µà¤¿-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तमà¥\8d à¤\85नà¥\8dययà¥\8bà¤\9cà¤\95ाः ज्ञातुं न प्रभवन्ति ।",
+       "prefs-help-email-others": "सदसà¥\8dयपà¥\83षà¥\8dठ-समà¥\8dभाषणपà¥\83षà¥\8dठयà¥\8bà¤\83 à¤®à¤¾à¤§à¥\8dयमà¥\87न, à¤µà¤¿-पतà¥\8dरमाधà¥\8dयमà¥\87न à¤µà¤¾ à¤\85नà¥\8dयà¥\87 à¤¸à¤¦à¤¸à¥\8dयाà¤\83 à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤®à¥\8dपरà¥\8dà¤\95à¤\82 à¤\95रà¥\8dतà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\81यà¥\81à¤\83 à¥¤\nसमà¥\8dपरà¥\8dà¤\95à¥\87ऽसà¥\8dमिनà¥\8d à¤­à¤µà¤¤à¤\83/भवतà¥\8dयाà¤\83 à¤µà¤¿-पतà¥\8dरसà¤\99à¥\8dà¤\95à¥\87तमà¥\8d à¤\85नà¥\8dयसदसà¥\8dयाः ज्ञातुं न प्रभवन्ति ।",
        "prefs-help-email-required": "वि-पत्रसङ्केतः अनिवार्यः ।",
        "prefs-info": "मूलसूचना",
        "prefs-i18n": "अन्ताराष्ट्रियकरणम्",
        "prefs-help-prefershttps": "आगामिप्रेवेशकाले एतत् परिवर्तनं सक्रियं भवष्यति ।",
        "prefswarning-warning": "स्वस्य इष्टतमानि-पुष्ठे भवता/भवत्या यत्, परिवर्तनं कृतं, तत् एतावता न रक्षितम् ।\n\"$1\" एतत् अनूद्य यदि भवान्/भवती एतत् पृष्ठं त्यक्ष्यति, तर्हि परिवर्तनं रक्षितं न भविष्यति ।",
        "prefs-tabs-navigation-hint": "परामर्शः : प्लवनयोः (tabs) मध्ये गमनागमनं कर्तुं भवान्/भवती वामतीरकुड्मलस्य, दक्षिणतीरकुड्मलस्य च उपयोगं कर्तुं शक्नोति ।",
-       "email-address-validity-valid": "वि-पत्रसङ्केतः मान्यः अस्ति इति प्रतीयते",
-       "email-address-validity-invalid": "मान्यः वि-पत्रसङ्केतः लिख्यताम्",
        "userrights": "योजकाधिकारस्य प्रबन्धनम्",
        "userrights-lookup-user": "योजकसमूहस्य प्रबन्धनं करोतु",
-       "userrights-user-editname": "पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम दीयताम्",
+       "userrights-user-editname": "सदसà¥\8dयनाम दीयताम्",
        "editusergroup": "योजकसमूहः सम्पाद्यताम्",
-       "editinguser": "'''[[User:$1|$1]]''' à¤\87तà¥\8dयसà¥\8dय à¤¯à¥\8bà¤\9cà¤\95सà¥\8dय à¤¯à¥\8bà¤\9cà¤\95ाधिकारः परिवर्त्यते । $2",
+       "editinguser": "'''[[User:$1|$1]]''' à¤\87तà¥\8dयसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयाधिकारः परिवर्त्यते । $2",
        "userrights-editusergroup": "योजकसमूहः सम्पाद्यताम्",
        "saveusergroups": "योजकसमूहः रक्ष्यताम्",
        "userrights-groupsmember": "अस्य सदस्यः :",
        "userrights-reason": "कारणम् :",
        "userrights-no-interwiki": "अन्यविकि-जालस्थानेषु योजकाधिकारं सम्पादयितुं ते अनुमतिः नास्ति ।",
        "userrights-nodatabase": "$1 दत्तांशनिधिः न विद्यते अथवा तु सः स्थानीयः नास्ति ।",
-       "userrights-nologin": "यà¥\8bà¤\9cà¤\95ेभ्यः अधिकारं दातुं प्रबन्धकत्वेन प्रवेशः आवश्यकः । [[Special:UserLogin|प्रविश्यताम्]]",
-       "userrights-notallowed": "यà¥\8bà¤\9cà¤\95ेभ्यः अधिकारं दातुं, योजकान् अपाकर्तुं च ते अनुमतिः नास्ति ।",
+       "userrights-nologin": "सदसà¥\8dयेभ्यः अधिकारं दातुं प्रबन्धकत्वेन प्रवेशः आवश्यकः । [[Special:UserLogin|प्रविश्यताम्]]",
+       "userrights-notallowed": "सदसà¥\8dयेभ्यः अधिकारं दातुं, योजकान् अपाकर्तुं च ते अनुमतिः नास्ति ।",
        "userrights-changeable-col": "परिवर्तनार्हाः समूहाः",
        "userrights-unchangeable-col": "परिवर्तयितुम् अनर्हाः समूहाः",
        "userrights-conflict": "सदस्याधिकारस्य परिवर्तनेषु अन्तर्विरोधः अस्ति ! कृपया स्वकृतानि परिवर्तनानि पुनरवलोक्य संरक्ष्यन्ताम् ।",
        "userrights-removed-self": "भवता/भवत्या सफलतया स्वाधिकाराः अपाकृताः । अतः भवान्/भवती एतत् पृष्ठं द्रष्टुं न प्रभवति ।",
        "group": "समूहः :",
-       "group-user": "यà¥\8bà¤\9cà¤\95ाः",
+       "group-user": "सदसà¥\8dयाः",
        "group-autoconfirmed": "स्वदृढितयोजकाः",
        "group-bot": "बॉट्स्",
        "group-sysop": "प्रबन्धकाः",
        "group-sysop-member": "{{GENDER:$1|प्रबन्धकः}}",
        "group-bureaucrat-member": "{{GENDER:$1|अधिकारी}}",
        "group-suppress-member": "{{GENDER:$1|अलक्ष्यम्}}",
-       "grouppage-user": "{{ns:project}}:यà¥\8bà¤\9cà¤\95ाः",
+       "grouppage-user": "{{ns:project}}:सदसà¥\8dयाः",
        "grouppage-autoconfirmed": "{{ns:project}}:स्वदृढितयोजकाः",
        "grouppage-bot": "{{ns:project}}:बॉट्स्",
        "grouppage-sysop": "{{ns:project}}:प्रबन्धकाः",
        "right-suppressrevision": "प्रबन्धकैः निगूहितानि, सम्मुखं स्थापितानि च विशिष्टसंस्करणानि पुनः पश्यतु, पुनस्स्थापयतु च",
        "right-viewsuppressed": "अन्ययोजकैः गूहितं संस्करणं दृश्यताम्",
        "right-suppressionlog": "वैयक्तिकसंस्करणानि दृश्यन्ताम्",
-       "right-block": "à¤\85सà¥\8dय à¤¯à¥\8bà¤\9cà¤\95स्य सम्पादनानि अवरुध्यन्ताम्",
+       "right-block": "à¤\85सà¥\8dय à¤¸à¤¦à¤¸à¥\8dयस्य सम्पादनानि अवरुध्यन्ताम्",
        "right-blockemail": "वि-पत्रप्रेषयितुम् एषः सदस्यः अवरुध्यताम्",
-       "right-hideuser": "पà¥\8dरयà¥\8bà¤\95à¥\8dतà¥\83नाम अवरुध्यताम्, तत् अन्ययोजकेभ्यः गोप्यतां च",
+       "right-hideuser": "सदसà¥\8dयनाम अवरुध्यताम्, तत् अन्ययोजकेभ्यः गोप्यतां च",
        "right-ipblock-exempt": "स्वयम् अवरोधितं, समूहावरोधितम् अन्तर्जालसङ्केतम् (IP) अवगण्य अग्रे गच्छतु",
        "right-proxyunbannable": "प्रतिनिधीनां (of prxies) स्वयम्-अवरोधान् अवगण्य अग्रे गच्छतु",
        "right-unblockself": "स्वं मा अवरुध्यताम्",
        "right-editsemiprotected": "\"{{int:protect-level-autoconfirmed}}\"-त्वेन संरक्षितानि पृष्ठानि सम्पाद्यन्ताम्",
        "right-editcontentmodel": "एकस्य पृष्ठस्य विषयोदाहरणं सम्पाद्यताम्",
        "right-editinterface": "योजकमाध्यमं सम्पाद्यताम्",
-       "right-editusercssjs": "à¤\85नà¥\8dयसà¥\8dय à¤¯à¥\8bà¤\9cà¤\95स्य CSS, JavaScript सञ्चिकाः सम्पाद्यन्ताम्",
-       "right-editusercss": "à¤\85नà¥\8dयसà¥\8dय à¤¯à¥\8bà¤\9cà¤\95स्य CSS सञ्चिकाः सम्पाद्यन्ताम्",
-       "right-edituserjs": "à¤\85नà¥\8dयसà¥\8dय à¤¯à¥\8bà¤\9cà¤\95स्य JavaScript सञ्चिकाः सम्पाद्यन्ताम्",
+       "right-editusercssjs": "à¤\85नà¥\8dयसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयस्य CSS, JavaScript सञ्चिकाः सम्पाद्यन्ताम्",
+       "right-editusercss": "à¤\85नà¥\8dयसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयस्य CSS सञ्चिकाः सम्पाद्यन्ताम्",
+       "right-edituserjs": "à¤\85नà¥\8dयसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयस्य JavaScript सञ्चिकाः सम्पाद्यन्ताम्",
        "right-editmyusercss": "स्वस्य CSS सञ्चिकाः सम्पाद्यन्ताम्",
        "right-editmyuserjs": "स्वस्य JavaScript सञ्चिकाः सम्पाद्यन्ताम्",
        "right-viewmywatchlist": "स्वस्य निरीक्षासूचिः दृश्यताम्",
        "rcshowhidebots": "$1 बोट् इत्येतानि",
        "rcshowhidebots-show": "दृश्यताम्",
        "rcshowhidebots-hide": "गोप्यताम्",
-       "rcshowhideliu": "$1 à¤ªà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83ताà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाः",
+       "rcshowhideliu": "$1 à¤ªà¤\9eà¥\8dà¤\9cà¥\80à¤\95à¥\83ताà¤\83 à¤¸à¤¦à¤¸à¥\8dयाः",
        "rcshowhideliu-show": "दृश्यताम्",
        "rcshowhideliu-hide": "गोप्यताम्",
-       "rcshowhideanons": "à¤\85नामà¤\95ाà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाः $1",
+       "rcshowhideanons": "à¤\85नामà¤\95ाà¤\83 à¤¸à¤¦à¤¸à¥\8dयाः $1",
        "rcshowhideanons-show": "दृश्यताम्",
        "rcshowhideanons-hide": "गोप्यताम्",
-       "rcshowhidepatr": "$1 à¤\88क्षितसम्पादनानि",
+       "rcshowhidepatr": "$1 à¤¨à¤¿à¤°à¥\80क्षितसम्पादनानि",
        "rcshowhidepatr-show": "दृश्यताम्",
        "rcshowhidepatr-hide": "गोप्यताम्",
        "rcshowhidemine": "$1 मम सम्पादनानि",
        "img-auth-isdir": "भवान् \"$1\"निदेशिकाम् अभिगन्तुं यतते ।\nसञ्चिकाभिगमनम् एव अनुमतम् ।",
        "img-auth-streaming": "\"$1\"इत्यस्य प्रवाहिनी ।",
        "img-auth-public": "स्वायत्तविकितः सञ्चिकाः नेतुम् अयं कार्यक्रमः img_auth.php उपयुज्यते ।\nएषा विकिः सार्वजनिकविकिः इति  दृढिता । \nवैकल्पिकसुरक्षार्थं img_auth.php अपलपितः । ।",
-       "img-auth-noread": "\"$1\"पठनà¥\87 à¤¯à¥\8bà¤\9cà¤\95स्य अभिगमनं नास्ति ।",
+       "img-auth-noread": "\"$1\"पठनà¥\87 à¤¸à¤¦à¤¸à¥\8dयस्य अभिगमनं नास्ति ।",
        "http-invalid-url": " $1 इति अमान्यम् URL ।",
        "http-invalid-scheme": "\"$1\"योजनायुक्तं URLs नानुमोदितानि ।",
        "http-request-error": " अज्ञातदोषात् HTTP अभ्यर्थनं निष्पलम् ।",
        "listfiles-delete": "अपाक्रियताम्",
        "listfiles-summary": "एतद्विशेषपुटम् उत्तारितसञ्चिकाः प्रदर्शयति । \nयोजकेन शुद्धाः अतिनूतनं सञ्चिकाः केवलम् अत्र प्रदर्शयति ।",
        "listfiles_search_for": "माध्यमनामधेयार्थम् अन्विषतु ।",
-       "listfiles-userdoesnotexist": "\"$1\" à¤\87तà¥\8dयषा à¤¯à¥\8bà¤\9cà¤\95लेखा पञ्जीकृतं नास्ति ।",
+       "listfiles-userdoesnotexist": "\"$1\" à¤\87तà¥\8dयषा à¤¸à¤¦à¤¸à¥\8dयलेखा पञ्जीकृतं नास्ति ।",
        "imgfile": "संचिका",
        "listfiles": "सञ्चिकावली ।",
        "listfiles_thumb": "अंगुष्ठनखाकारम् ।",
        "listfiles_date": "दिनाङ्क",
        "listfiles_name": "नाम",
-       "listfiles_user": "यà¥\8bà¤\9cà¤\95",
+       "listfiles_user": "सदसà¥\8dयà¤\83",
        "listfiles_size": "आकार",
        "listfiles_description": "वर्णनम्",
        "listfiles_count": "आवृत्ति",
        "filedelete-nofile": "'''$1''' न वर्तते ।",
        "filedelete-nofile-old": "'''$1''' इत्यस्य भवता वर्णितविशेषतायुतम् अवतरणम् अत्र न वर्तते ।",
        "filedelete-otherreason": "अपरम्/अतिरिक्तं कारणम् :",
-       "filedelete-reason-otherlist": "अन्य कारणम्",
+       "filedelete-reason-otherlist": "अन्यकारणम्",
        "filedelete-reason-dropdown": "* अपमर्जनस्य सामान्यं कारणम् । \n** कृतिस्वाम्यस्य उल्लङ्घनम् । \n** प्रतिकृता सञ्चिका ।",
        "filedelete-edit-reasonlist": "अपमार्जनकारणानि सम्पादयतु ।",
        "filedelete-maintenance": "सञ्चिकानाम् अपमर्जनम् अनमपमर्जनं च निर्वहणकाले तात्कालिकतया निष्क्रियौ ।",
        "statistics-edits-average": "प्रतिपुटं माध्यसम्पादनानि ।",
        "statistics-users": "पञ्जीकृतः [[Special:ListUsers|सदस्यः]]",
        "statistics-users-active": "सक्रियाः सदस्याः",
-       "statistics-users-active-desc": "à¤\97तà¥\87षà¥\81 {{PLURAL:$1|day|$1 à¤¦à¤¿à¤¨à¥\87षà¥\81}} à¤¸à¤\95à¥\8dरियाà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाः  ।",
+       "statistics-users-active-desc": "à¤\97तà¥\87षà¥\81 {{PLURAL:$1|day|$1 à¤¦à¤¿à¤¨à¥\87षà¥\81}} à¤¸à¤\95à¥\8dरियाà¤\83 à¤¸à¤¦à¤¸à¥\8dयाः  ।",
        "pageswithprop": "प्रगुणविशेषयुतानि पृष्ठानि",
        "pageswithprop-legend": "प्रगुणविशेषयुतानि पृष्ठानि",
        "pageswithprop-text": "निश्चितपृष्ठस्य अवच्छेदकतानाम् उपयोगं कुर्वतानां पृष्ठानाम् आवलिः ।",
        "wantedfiletext-nocat-noforeign": "अधो दत्ताः सञ्चिकाः उपयुक्ताः किन्तु न वर्तन्ते ।",
        "wantedtemplates": "आवश्यकाः प्राकृतयः ।",
        "mostlinked": "अत्यनुबद्धानि पुटानि ।",
-       "mostlinkedcategories": "वर्गैः सह अत्यनुबद्धाः ।",
+       "mostlinkedcategories": "वर्गैः सह अत्यनुबद्धाः",
        "mostlinkedtemplates": "प्राकृतिभिः अत्यनुबद्धाः ।",
        "mostcategories": "बहुवर्गयुक्तपुटानि ।",
        "mostimages": "अत्यनुबद्धानि पुटानि ।",
        "protectedpages-timestamp": "समयमुद्रा",
        "protectedpages-page": "पृष्ठम्",
        "protectedpages-expiry": "अवसानम्",
-       "protectedpages-performer": "यà¥\8bà¤\9cà¤\95ं संरक्षति",
+       "protectedpages-performer": "सदसà¥\8dयं संरक्षति",
        "protectedpages-params": "कार्यस्य परिमितिः",
        "protectedpages-reason": "कारणम्",
        "protectedpages-unknown-timestamp": "अज्ञातम्",
        "protectedtitles": "सुरक्षितानि शीर्षकानि ।",
        "protectedtitles-summary": "एतत् पृष्ठं सद्यः निर्माणात् संरक्षितम् अस्ति । विद्यमानानां संरक्षितानां पृष्ठानाम् आवल्यै [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] अत्र दृश्यताम् ।",
        "protectedtitlesempty": "एतैः विस्तारैः न किमपि शीर्षकं सद्यः परिरक्षितानि ।",
-       "listusers": "यà¥\8bà¤\9cà¤\95 à¤¸à¥\82à¤\9aि",
+       "listusers": "सदसà¥\8dयावलिà¤\83",
        "listusers-editsonly": "केवलं सम्पादनसहितयोजकान् दर्शयतु ।",
        "listusers-creationsort": "सर्जनदिनाङ्कैः वर्गीकरोतु ।",
        "listusers-desc": "अवरोहक्रमेण क्रमबद्धं क्रियताम्",
        "usereditcount": "$1 {{PLURAL:$1|दिनम्|दिनानि}}",
        "usercreated": "$1 दिने $2 समये {{GENDER:$3|रचितं}}",
        "newpages": "नवीनपृष्ठानि",
-       "newpages-username": "यà¥\8bà¤\9cà¤\95नामनà¥\8d:",
+       "newpages-username": "सदसà¥\8dयनाम :",
        "ancientpages": "प्राचीनतमानि पृष्ठानि",
        "move": "शीर्षकं परिवर्त्यताम्",
        "movethispage": "एतस्य पृष्ठस्य शीर्षकं परिवर्त्यताम्",
        "unusedimagestext": "अधो दत्तसञ्चिकाः सन्ति किन्तु कस्मिंश्चिदपि पुटे न न्यस्ताः ।",
        "unusedcategoriestext": "निम्नलिखितवर्गाः सन्ति तथापि अन्यपुटं वर्गः वा न उपयुङ्क्ते ।",
        "notargettitle": "लक्ष्यं नास्ति ।",
-       "notargettext": "एतत्कार्यं समाचरितुं भवान् लक्षितपुटं योजकं वा न निर्दिष्टवान् ।",
+       "notargettext": "एतत्कार्यं समाचरितुं भवान्/भवती लक्षितपृष्ठं सदस्यं वा न निर्दिष्टवान् ।",
        "nopagetitle": "तादृशलक्षितपुटं नास्ति ।",
        "nopagetext": "भवता निर्दिष्टं लक्षितपुटं नास्ति ।",
        "pager-newer-n": "{{PLURAL:$1|नूतनतरम् 1|नूतनतराणि $1}}",
        "specialloguserlabel": "आचारी :",
        "speciallogtitlelabel": "लक्ष्यम् (शीर्षकम् / योजकः)",
        "log": "संरक्षिताऽऽवल्यः (Logs)",
-       "all-logs-page": "सरà¥\8dवसारà¥\8dवà¤\9cनिà¤\95पà¥\8dरवà¥\87शà¤\83 à¥¤",
-       "alllogstext": "{{SITENAME}}à¤\87तà¥\8dयसà¥\8dय à¤\89बलबà¥\8dधपà¥\8dरवà¥\87शानाà¤\82  à¤¸à¤\82यà¥\81à¤\95à¥\8dतपà¥\8dरदरà¥\8dशनमà¥\8d à¥¤\nपà¥\8dरवà¥\87शपà¥\8dरà¤\95ारà¤\82 à¤\9aितà¥\8dवा à¤­à¤µà¤¾à¤¨à¥\8d à¤¦à¥\83शà¥\8dयà¤\82 à¤\95à¥\8dषाययितà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤¯à¥\8bà¤\9cà¤\95नाम,  सदस्य नाम (ह्रस्वदीर्घाक्षरसंवादी) प्रभावितपुटम् ।",
+       "all-logs-page": "सरà¥\8dवाà¤\83 à¤¸à¤°à¥\8dवसारà¥\8dवà¤\9cनिà¤\95à¥\8dयà¤\83 à¤¸à¤\82रà¤\95à¥\8dषितावलà¥\8dयà¤\83",
+       "alllogstext": "{{SITENAME}}à¤\87तà¥\8dयसà¥\8dय à¤\89बलबà¥\8dधपà¥\8dरवà¥\87शानाà¤\82  à¤¸à¤\82यà¥\81à¤\95à¥\8dतपà¥\8dरदरà¥\8dशनमà¥\8d à¥¤\nपà¥\8dरवà¥\87शपà¥\8dरà¤\95ारà¤\82 à¤\9aितà¥\8dवा à¤­à¤µà¤¾à¤¨à¥\8d à¤¦à¥\83शà¥\8dयà¤\82 à¤\95à¥\8dषाययितà¥\81à¤\82 à¤¶à¤\95à¥\8dनà¥\8bति à¥¤ à¤¸à¤¦à¤¸à¥\8dयनाम,  सदस्य नाम (ह्रस्वदीर्घाक्षरसंवादी) प्रभावितपुटम् ।",
        "logempty": "प्रवेशे मेलयुक्तपुटं नास्ति ।",
        "log-title-wildcard": "अनेन पाठेन आरब्धानि शीर्षकानि अन्विषतु ।",
        "showhideselectedlogentries": "चितप्रवेशावलीः प्रदर्शयतु/गोपयतु ।",
        "listgrouprights-group": "दलम्",
        "listgrouprights-rights": "अधिकाराः ।",
        "listgrouprights-helppage": "Help: समूहाधिकाराः ।",
-       "listgrouprights-members": "(यà¥\8bà¤\9cà¤\95ानाम् आवलिः)",
+       "listgrouprights-members": "(सदसà¥\8dयानाम् आवलिः)",
        "listgrouprights-addgroup": "{{PLURAL:$2|समूहः}} योज्यताम् $1",
        "listgrouprights-removegroup": "समूहः{{PLURAL:$2|विलोपयतु}}: $1",
        "listgrouprights-addgroup-all": "सर्वसमूहान् योजयतु ।",
        "emailuser-title-notarget": "वि-पत्रयुक्तः सदस्यः",
        "emailpagetext": "{{GENDER:$1|अस्मै}} योजकाय विद्युन्मानपत्रं प्रेषयितुम् अधो दत्तप्रपत्रम् उपयोक्तुं शक्नोति । \n[[Special:Preferences|your user preferences]] अत्र भवता विनिवेशितः वि-पत्रसङ्केतः सकाशात् इति स्थाने प्रतिभाति । अनेन स्वीकर्ता साक्षात् प्रत्युत्तरं दातुं प्रभविष्यति ।",
        "defemailsubject": "{{SITENAME}}\"$1\" इति योजकात् विद्युन्मानपत्रम् ।",
-       "usermaildisabled": "यà¥\8bà¤\9cà¤\95स्य विद्युन्मानपत्रं निष्क्रियम् ।",
+       "usermaildisabled": "सदसà¥\8dयस्य विद्युन्मानपत्रं निष्क्रियम् ।",
        "usermaildisabledtext": "अस्यां विक्याम् अन्ययोजकेभ्यः विद्युन्मानपत्रं प्रेषयितुं नै शक्नोति ।",
        "noemailtitle": "विद्युन्मानपत्रसङ्केतः नास्ति ।",
-       "noemailtext": "à¤\85सà¥\8dय à¤¯à¥\8bà¤\9cà¤\95स्य निरिदिष्टः विद्युन्मानपत्रसङ्केतः नास्ति ।",
+       "noemailtext": "à¤\85सà¥\8dय à¤¸à¤¦à¤¸à¥\8dयस्य निरिदिष्टः विद्युन्मानपत्रसङ्केतः नास्ति ।",
        "nowikiemailtext": "अयं सदस्यः अन्यसदस्येभ्यः वि-पत्राणि स्वीकर्तुं नेच्छति ।",
-       "emailnotarget": "सà¥\8dवà¥\80à¤\95रà¥\8dतà¥\81à¤\83 à¤\85सà¥\8dतितà¥\8dवविहà¥\80नमà¥\8d à¤\85थवा à¤\85मानà¥\8dयà¤\82 à¤¯à¥\8bà¤\9cà¤\95नाम  ।",
-       "emailtarget": "सà¥\8dवà¥\80à¤\95रà¥\8dतà¥\81à¤\83 à¤¯à¥\8bà¤\9cà¤\95नाम लिखतु ।",
-       "emailusername": "यà¥\8bà¤\9cà¤\95नामनà¥\8d:",
+       "emailnotarget": "सà¥\8dवà¥\80à¤\95रà¥\8dतà¥\81à¤\83 à¤\85सà¥\8dतितà¥\8dवविहà¥\80नमà¥\8d à¤\85थवा à¤\85मानà¥\8dयà¤\82 à¤¸à¤¦à¤¸à¥\8dयनाम  ।",
+       "emailtarget": "सà¥\8dवà¥\80à¤\95रà¥\8dतà¥\81à¤\83 à¤¸à¤¦à¤¸à¥\8dयनाम लिखतु ।",
+       "emailusername": "सदसà¥\8dयनाम :",
        "emailusernamesubmit": "उपस्थाप्यताम्",
        "email-legend": "{{SITENAME}}  इति अन्ययोजकाय विद्युन्मानपत्रं प्रेषयतु ।",
        "emailfrom": "सकाशात्",
        "wlheader-showupdated": " येषु पृष्ठेषु भवता/भवत्या परिवर्तनं कृतम् आसीत्, तानि पृष्ठानि अत्र <strong>bold</strong> प्राप्यन्ते ।",
        "wlnote": "$3 : $4 वादनं यावत् <strong>$2</strong> होरां यवात् {{PLURAL:$2|होरायां|होरासु}} {{PLURAL:$1|एकं परिवर्तनं|परिवर्तनानि <strong>$1</strong>}} अधः {{PLURAL:$1|अस्ति|सन्ति}}।",
        "wlshowlast": "अन्तिमाः $1 होराः, अन्तिमानि $2 दिनानि  दृश्यन्ताम्",
+       "watchlistall2": "सर्वाणि",
        "watchlist-options": "निरीक्षासूचेः विकल्पाः",
        "watching": "निरीक्षते...",
        "unwatching": "निरीक्षाम् अपाकरोति...",
        "watcherrortext": " \"$1\" कृते अवलोकनावल्याः व्यवस्थापरिवर्तनावसरे दोषः संविधितः ।",
        "enotif_reset": "सन्दर्शितानि इति सर्वपुटानि अङ्कयतु ।",
-       "enotif_impersonal_salutation": "{{SITENAME}} à¤¯à¥\8bà¤\9cà¤\95",
+       "enotif_impersonal_salutation": "{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयà¤\83",
        "enotif_subject_deleted": "{{SITENAME}} पृष्ठं $1 इत्येतत् {{gender:$2 इत्यनेन|$2 इत्यनया}} अपाकृतमस्ति।",
        "enotif_subject_created": "{{SITENAME}} पृष्ठं $1 इत्येतत् {{gender:$2 इत्यनेन|$2 इत्यनया}} रचितमस्ति",
        "enotif_subject_moved": "{{SITENAME}} पृष्ठं $1 इत्येतत् {{gender:$2 इत्यनेन|$2 इत्यनया}} चालितमस्ति",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा कृतम्  [[:$1]] इत्यस्य गतसम्पादनं पूर्वतनस्थितौ प्रत्याहरणं न शक्यते । अत्रान्तरे कोऽप्यन्यः एतत्पुटं पुनस्सम्पादितवान् अथवा पूर्वमेव प्राचीनस्थितौ आनीतम् अस्ति ।\nअस्य पुटास्य अन्तिमसम्पादनं [[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]] इति अन्तिमपुनरावृत्तिः ।",
-       "revertpage-nouser": "(यà¥\8bà¤\9cà¤\95स्य नाम अपाकृतम्) इत्यस्य सम्पादनानि अपाकृत्य {{GENDER:$1|[[User:$1|$1]]}} इत्यस्य अन्तिमं संस्करणं पूर्ववत् कृतम् ।",
+       "revertpage-nouser": "(सदसà¥\8dयस्य नाम अपाकृतम्) इत्यस्य सम्पादनानि अपाकृत्य {{GENDER:$1|[[User:$1|$1]]}} इत्यस्य अन्तिमं संस्करणं पूर्ववत् कृतम् ।",
        "rollback-success": "$1 इत्यस्य सम्पादनम् अपनयतु । \n$2 द्वारा सम्पादितां अन्तिमावृत्तिं पुनस्थापयतु ।",
        "sessionfailure-title": "सत्रस्य वैफल्यम् ।",
        "sessionfailure": "भवतः प्रवेशत्रेण सह कापि समस्या अस्ति इति भाति ।\nसत्रापहरणात् रक्षणस्य सावधानार्थं भवतः क्रियाकलापः अपनीतः ।\nनिर्गत्य पूर्वपुटं गत्वा पुनः गत्वा प्रयत्नं करोतु ।",
-       "protectlogpage": "सà¥\81रà¤\95à¥\8dषाऽऽवलिः",
+       "protectlogpage": "सà¥\81रà¤\95à¥\8dषािता à¤¸à¤\82रà¤\95à¥\8dषितावलिः",
        "protectlogtext": "अधो दत्ता सुरक्षार्थं कृतपरिवर्ननानां सूचिका अस्ति । \nवरतमानस्य सुरक्षितपुटानां सूचिकार्थम् अत्र [[Special:ProtectedPages|सुरक्षितपुटानां सूचिका]] पश्यतु ।",
        "protectedarticle": "\"[[$1]]\" संरक्षितमस्ति",
        "modifiedarticleprotection": "\"[[$1]]\" इत्येतदर्थं सुरक्षा-स्तरः परिवर्तित: :",
        "protect-locked-access": "भवान् अस्य पृष्ठस्य सुरक्षा-स्तरं परिवर्तयितुम् अनुज्ञां न धारयति। '''$1''' इति पृष्ठस्य अधुनातनः सुरक्षा-स्तरः :",
        "protect-cascadeon": "एतत् पृष्ठं सद्यः संरक्षितम् अस्ति, यतो हि {{PLURAL:$1|एतस्य पृष्ठस्य|एतेषां पृष्ठानां}} सुरक्षा-सोपाने विद्यते । एतस्य पृष्ठस्य सुरक्षा-स्तरे परिवर्तनं कृते सति सुरक्षा-सोपाने परिवर्नं न भविष्यति ।",
        "protect-default": "सर्वान् प्रयोक्तॄन् अनुज्ञापयतु।",
-       "protect-fallback": "\"$1\" à¤\85नà¥\81à¤\9cà¥\8dà¤\9eायà¥\81à¤\95à¥\8dताà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाः अनुमिताः",
-       "protect-level-autoconfirmed": "सà¥\8dवानà¥\81मà¥\8bदिताà¤\83 à¤¯à¥\8bà¤\9cà¤\95ा एव अनुमिताः",
+       "protect-fallback": "\"$1\" à¤\85नà¥\81à¤\9cà¥\8dà¤\9eायà¥\81à¤\95à¥\8dताà¤\83 à¤¸à¤¦à¤¸à¥\8dयाः अनुमिताः",
+       "protect-level-autoconfirmed": "सà¥\8dवानà¥\81मà¥\8bदिताà¤\83 à¤¸à¤¦à¤¸à¥\8dयाà¤\83 एव अनुमिताः",
        "protect-level-sysop": "केवलं प्रबन्धकाः अनुमिताः",
        "protect-summary-cascade": "सोपानात्मकम्",
        "protect-expiring": "अवसानम् $1 (UTC)",
        "undeleterevisions": "$1 {{PLURAL:$1|पुनरावृत्तिः}}",
        "undeletehistory": "यदि भवान् पुटानि पुनस्थापयितुमिच्छति तर्हि पुनरवृत्तीनां सर्वेतिहासाः पुनस्थापितानि भवन्ति । \nअपनयनात् परं यदि तस्मिन् एव नाम्नि नूतनपुटनिर्माणं करोति चेत् तस्य पुनस्थापितावृत्तिः पूर्वेतिहासे एव दृश्यते ।",
        "undeleterevdel": "यदि पुनस्थापनस्य फलस्वरूपशीर्षकपुटं, सञ्चिकां, पुनरावृत्तिं वा आंशिकरूपेण नाशयति चेत् एतत् न क्रियते ।\nएतादस्थितौ नूतनापनीताः पुनरावृत्तीनाम् अपचयनं असङ्गोपनं वा कुर्याट् ।",
-       "undeletehistorynoadmin": "à¤\8fततà¥\8dपà¥\81à¤\9fमà¥\8d à¤\85पमरà¥\8dà¤\9cितमà¥\8d à¥¤\nà¤\85धà¤\83 à¤\85पमरà¥\8dà¤\9cनसà¥\8dय à¤\95ारणà¤\82 à¤¦à¤°à¥\8dशितमà¥\8d à¥¤ à¤\85पमरà¥\8dà¤\9cनातà¥\8d à¤ªà¥\82रà¥\8dवà¤\82 à¤¯à¥\87 à¤¯à¥\8bà¤\9cà¤\95ाः सम्पादनं कृतवन्तः तेषां विषयः अपि दर्शिताः । \nअपमर्जितपुनरावृत्तीनां वास्तवपाठः केवलं प्रशासकै दृष्टुं शक्यते ।",
+       "undeletehistorynoadmin": "à¤\8fततà¥\8dपà¥\81à¤\9fमà¥\8d à¤\85पमरà¥\8dà¤\9cितमà¥\8d à¥¤\nà¤\85धà¤\83 à¤\85पमरà¥\8dà¤\9cनसà¥\8dय à¤\95ारणà¤\82 à¤¦à¤°à¥\8dशितमà¥\8d à¥¤ à¤\85पमरà¥\8dà¤\9cनातà¥\8d à¤ªà¥\82रà¥\8dवà¤\82 à¤¯à¥\87 à¤¸à¤¦à¤¸à¥\8dयाः सम्पादनं कृतवन्तः तेषां विषयः अपि दर्शिताः । \nअपमर्जितपुनरावृत्तीनां वास्तवपाठः केवलं प्रशासकै दृष्टुं शक्यते ।",
        "undelete-revision": "$3 द्वारा $1 ($4 दिनाङ्के $5 वादने) इत्येतेतस्य पृष्ठस्य अपाकृतं संस्करणम् ।",
        "undeleterevision-missing": "अमान्यम् अथवा विलुप्तं संस्करणम् । भवान्/भवती \nकदाचित् अयोग्यपरिसन्धेः उपयोगं करोति, अथवा तु एतत् संस्करणं पूर्वमेव पुनर्स्थापितम् अस्ति । लेखागारात् निष्कासितं स्याद्वा ।",
        "undelete-nodiff": "पूर्वतनसंस्करणं न प्राप्तम् ।",
        "tooltip-namespace_association": "चितनामस्थानेन सह सम्बद्धं विषयनामस्थानम् अथवा सम्भाषणम् अपि उपादातुम् इमां मञ्जूषाम् अर्गलयतु ।",
        "blanknamespace": "(मुख्यम्)",
        "contributions": "{{GENDER:$1|प्रयोक्तॄणां}} योगदानानि",
-       "contributions-title": "$1 à¤\95à¥\83तà¥\87 à¤¯à¥\8bà¤\9cà¤\95स्य योगदानानि",
+       "contributions-title": "$1 à¤\95à¥\83तà¥\87 à¤¸à¤¦à¤¸à¥\8dयस्य योगदानानि",
        "mycontris": "योगदानानि",
        "contribsub2": "($2) कृते {{GENDER:$3|$1}}",
-       "contributions-userdoesnotexist": "\"$1\" à¤\87तà¥\8dयषा à¤¯à¥\8bà¤\9cà¤\95लेखा पञ्जीकृतं नास्ति ।",
+       "contributions-userdoesnotexist": "\"$1\" à¤\87तà¥\8dयषा à¤¸à¤¦à¤¸à¥\8dयलेखा पञ्जीकृतं नास्ति ।",
        "nocontribs": "एतादृशयोग्यताभिः समं परिवर्तनानि न दृष्टानि ।",
        "uctop": "वर्तमानः",
        "month": "अस्मात् मासात् (प्राक्तनानि च):",
        "sp-contributions-newbies-title": "नूतनलेखार्थं योजकयोगदानम् ।",
        "sp-contributions-blocklog": "अवरोधाऽऽवलिः",
        "sp-contributions-suppresslog": "अपमर्जितानि योजकयोगदानानि",
-       "sp-contributions-deleted": "यà¥\8bà¤\9cà¤\95स्य अपाकृतं योगदानम्",
+       "sp-contributions-deleted": "सदसà¥\8dयस्य अपाकृतं योगदानम्",
        "sp-contributions-uploads": "उपारोहणानि",
        "sp-contributions-logs": "संरक्षिताऽऽवल्यः (Logs)",
        "sp-contributions-talk": "सम्भाषणम्",
        "sp-contributions-blocked-notice": "अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते।\nनूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति:",
        "sp-contributions-blocked-notice-anon": "अयं प्रयोक्ता सम्प्रति अवरुद्धः वर्तते।\nनूतनतमा अवरोधाभिलेख-प्रविष्टिः सन्दर्भार्थम् अधस्तात् प्रदत्ताऽस्ति:",
        "sp-contributions-search": "योगदानानि अन्विष्यन्ताम्",
-       "sp-contributions-username": "à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदà¥\8d (I P address) à¤¯à¥\8bà¤\9cà¤\95नाम वा :",
+       "sp-contributions-username": "à¤\85नà¥\8dतरà¥\8dà¤\9cालसà¤\82विदà¥\8d (I P address) à¤¸à¤¦à¤¸à¥\8dयनाम वा :",
        "sp-contributions-toponly": "सम्पादनानां नूतनतमा आवलिः दृश्यताम्",
        "sp-contributions-newonly": "केवलं पृष्ठनिर्माणस्य सम्पादनानाम् आवलिः दृश्यताम्",
        "sp-contributions-submit": "अन्विष्यताम्",
        "unblock": "योजकम् अनवरुणद्धु ।",
        "blockip": "{{GENDER:$1|सदस्यः}} अवरुद्ध्यताम्",
        "blockip-legend": "योजकम् अवरुणद्धु ।",
-       "blockiptext": "विशिषà¥\8dà¤\9fà¤\82  IP à¤¸à¤\99à¥\8dà¤\95à¥\87तमà¥\8d à¤\85थवा à¤¯à¥\8bà¤\9cà¤\95नाम लेखानाधिकारस्य प्राप्तये निम्नदत्तपत्रस्य उपयोगं करोतु ।\nकेवलं नाशकत्वम् अवरोद्धुं एतस्य उपयोगं करोतु । [[{{MediaWiki:Policy-url}}|नीतिः]] इत्यानुसारं करणीयम् ।\nअधः विशिष्टं कारणमपि लिखतु ।",
-       "ipaddressorusername": "à¤\86à¤\87.पà¥\80.सà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85थवा à¤¯à¥\8bà¤\9cà¤\95नाम :",
+       "blockiptext": "विशिषà¥\8dà¤\9fà¤\82  IP à¤¸à¤\99à¥\8dà¤\95à¥\87तमà¥\8d à¤\85थवा à¤¸à¤¦à¤¸à¥\8dयनाम लेखानाधिकारस्य प्राप्तये निम्नदत्तपत्रस्य उपयोगं करोतु ।\nकेवलं नाशकत्वम् अवरोद्धुं एतस्य उपयोगं करोतु । [[{{MediaWiki:Policy-url}}|नीतिः]] इत्यानुसारं करणीयम् ।\nअधः विशिष्टं कारणमपि लिखतु ।",
+       "ipaddressorusername": "à¤\86à¤\87.पà¥\80.सà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85थवा à¤¸à¤¦à¤¸à¥\8dयनाम :",
        "ipbexpiry": "समाप्तिः :",
        "ipbreason": "कारणम् :",
-       "ipbreason-dropdown": "* à¤\85वरà¥\8bधसà¥\8dय à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dयानि à¤\95ारणानि à¥¤  \n** à¤®à¤¿à¤¥à¥\8dया à¤¯à¥\8bà¤\9cà¤\95नाम à¥¤ \n** à¤\8fà¤\95ाधिà¤\95यà¥\8bà¤\9cà¤\95सà¥\8dथानà¤\82 à¤¨à¤¿à¤°à¥\8dमà¥\80य à¤¤à¥\87षाà¤\82 à¤¦à¥\81रà¥\81पयà¥\8bà¤\97à¤\83 à¥¤ \n** à¤\85सतà¥\8dयविषयानामà¥\8d à¤\89तà¥\8dतारणमà¥\8d à¥¤ \n** à¤ªà¥\81à¤\9fà¥\87षà¥\81 à¤\85वà¤\95रपà¥\82रणमà¥\8d à¥¤ \n** à¤ªà¥\81à¤\9fà¥\87भà¥\8dयà¤\83 à¤ªà¤¦à¤¾à¤°à¥\8dथानà¥\8d à¤\85पनयनमà¥\8d à¥¤ \n** à¤¬à¤¾à¤¹à¥\8dयà¤\9cालसà¥\8dथानामà¥\8d à¤\85समà¥\8dबदà¥\8dधानà¥\81बनà¥\8dधानामà¥\8d à¤¸à¤\82यà¥\8bà¤\9cनमà¥\8d à¥¤ \n** à¤¯à¥\8bà¤\9cà¤\95ानां पीडनम् ।",
+       "ipbreason-dropdown": "* à¤\85वरà¥\8bधसà¥\8dय à¤¸à¤¾à¤®à¤¾à¤¨à¥\8dयानि à¤\95ारणानि à¥¤  \n** à¤®à¤¿à¤¥à¥\8dया à¤¸à¤¦à¤¸à¥\8dयनाम à¥¤ \n** à¤\8fà¤\95ाधिà¤\95यà¥\8bà¤\9cà¤\95सà¥\8dथानà¤\82 à¤¨à¤¿à¤°à¥\8dमà¥\80य à¤¤à¥\87षाà¤\82 à¤¦à¥\81रà¥\81पयà¥\8bà¤\97à¤\83 à¥¤ \n** à¤\85सतà¥\8dयविषयानामà¥\8d à¤\89तà¥\8dतारणमà¥\8d à¥¤ \n** à¤ªà¥\81à¤\9fà¥\87षà¥\81 à¤\85वà¤\95रपà¥\82रणमà¥\8d à¥¤ \n** à¤ªà¥\81à¤\9fà¥\87भà¥\8dयà¤\83 à¤ªà¤¦à¤¾à¤°à¥\8dथानà¥\8d à¤\85पनयनमà¥\8d à¥¤ \n** à¤¬à¤¾à¤¹à¥\8dयà¤\9cालसà¥\8dथानामà¥\8d à¤\85समà¥\8dबदà¥\8dधानà¥\81बनà¥\8dधानामà¥\8d à¤¸à¤\82यà¥\8bà¤\9cनमà¥\8d à¥¤ \n** à¤¸à¤¦à¤¸à¥\8dयानां पीडनम् ।",
        "ipb-hardblock": "नामाभिलेखितयोजकान् अनेन ऐपि सङ्केतेन सम्पादनं निवारयतु ।",
        "ipbcreateaccount": "योजकस्थानस्य निर्माणं निवारयतु ।",
-       "ipbemailban": "यà¥\8bà¤\9cà¤\95स्य विद्युन्मानसन्देशप्रेषणम् अवरुणद्धु ।",
+       "ipbemailban": "सदसà¥\8dयस्य विद्युन्मानसन्देशप्रेषणम् अवरुणद्धु ।",
        "ipbenableautoblock": "अनेन योजकेन उपयुक्तम् ऐपिसङ्केतम्, अग्रे अनेन योजकेन सम्पादयितुं प्रयतमानम् ऐपिसङ्केतं च स्वयम् अवरुद्धं करोतु ।",
        "ipbsubmit": "एतं योजकम् अवरुणद्धु ।",
        "ipbother": "अन्यः समयः ।",
        "ipboptions": "२ होरे:2 hours,१ दिनम्:1 day,३ दिनानि:3 days,१ सप्ताहः:1 week,२ सप्ताहौ:2 weeks,१ मासः:1 month,३ मासाः:3 months,६ मासाः:6 months,१ वर्षम्:1 year,अनन्तम्:infinite",
-       "ipbhidename": "समà¥\8dपादनà¥\87भà¥\8dयà¤\83 à¤\86वलà¥\80भà¥\8dयà¤\83 à¤\9a à¤¯à¥\8bà¤\9cà¤\95नाम सङ्गोपयतु ।",
-       "ipbwatchuser": "à¤\85सà¥\8dय à¤¯à¥\8bà¤\9cà¤\95सà¥\8dय à¤¯à¥\8bà¤\9cà¤\95पà¥\81à¤\9fानि सम्भाषणपुटानि च अवलोकयतु ।",
+       "ipbhidename": "समà¥\8dपादनà¥\87भà¥\8dयà¤\83 à¤\86वलà¥\80भà¥\8dयà¤\83 à¤\9a à¤¸à¤¦à¤¸à¥\8dयनाम सङ्गोपयतु ।",
+       "ipbwatchuser": "à¤\85सà¥\8dय à¤¸à¤¦à¤¸à¥\8dयसà¥\8dय à¤¸à¤¦à¤¸à¥\8dयपà¥\83षà¥\8dठानि सम्भाषणपुटानि च अवलोकयतु ।",
        "ipb-disableusertalk": "एतं योजकम् अवरोधकाले स्वस्य सम्भाषणपुटस्य सम्पानात् निवारयतु ।",
-       "ipb-change-block": "à¤\8fतà¥\88à¤\83 à¤µà¤¿à¤¨à¥\8dयासà¥\88à¤\83 à¤¯à¥\8bà¤\9cà¤\95ं पुनः अवरुणद्धु ।",
+       "ipb-change-block": "à¤\8fतà¥\88à¤\83 à¤µà¤¿à¤¨à¥\8dयासà¥\88à¤\83 à¤¸à¤¦à¤¸à¥\8dयं पुनः अवरुणद्धु ।",
        "ipb-confirm": "अवरोधं दृढयतु ।",
        "badipaddress": "अमान्यः ऐपिसङ्केतः ।",
        "blockipsuccesssub": "अवरोधः सफलः ।",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]]इत्येतत् अवरुद्धम् । <br />\nअवरोधानां समीक्षां करोतु । [[Special:BlockList|IP अवरोधसूचिका]]",
        "ipb-blockingself": "भवान् स्वयम् अवरोधने निरतः । निश्चयेन स्वावरोधनम् इच्छति वा ?",
-       "ipb-confirmhideuser": "यà¥\8bà¤\9cà¤\95à¤\97à¥\8bपनसà¥\8dय à¤ªà¤¿à¤\9eà¥\8dà¤\9cà¤\82 à¤¨à¤¿à¤ªà¥\80डयनà¥\8d à¤­à¤µà¤¾à¤¨à¥\8d à¤¯à¥\8bà¤\9cà¤\95ावरà¥\81दà¥\8dधिà¤\82 à¤¯à¤¤à¤¤à¥\87 à¥¤ à¤\8fततà¥\8d à¤¸à¤°à¥\8dवावलà¥\80षà¥\81 à¤¸à¤°à¥\8dवपà¥\8dरवà¥\87शसà¥\82à¤\9aिà¤\95ासà¥\81 à¤\9a à¤¯à¥\8bà¤\9cà¤\95नाम निग्रहति । भवान् निश्चयेन एतत् कर्तुमिच्छति वा ?",
+       "ipb-confirmhideuser": "सदसà¥\8dयà¤\97à¥\8bपनसà¥\8dय à¤ªà¤¿à¤\9eà¥\8dà¤\9cà¤\82 à¤¨à¤¿à¤ªà¥\80डयनà¥\8d à¤­à¤µà¤¾à¤¨à¥\8d à¤¸à¤¦à¤¸à¥\8dयावरà¥\81दà¥\8dधिà¤\82 à¤¯à¤¤à¤¤à¥\87 à¥¤ à¤\8fततà¥\8d à¤¸à¤°à¥\8dवावलà¥\80षà¥\81 à¤¸à¤°à¥\8dवपà¥\8dरवà¥\87शसà¥\82à¤\9aिà¤\95ासà¥\81 à¤\9a à¤¸à¤¦à¤¸à¥\8dयनाम निग्रहति । भवान् निश्चयेन एतत् कर्तुमिच्छति वा ?",
        "ipb-confirmaction": "भवान्/भवती निश्चयेन एतत् कर्तुम् इच्छति चेत्  \"{{int:ipb-confirm}}\" इत्येत् कुड्मलं समर्थयतु",
        "ipb-edit-dropdown": "अवरोधकारणानि सम्पादयतु ।",
        "ipb-unblock-addr": "$1 अनवरोधनं करोतु ।",
-       "ipb-unblock": "यà¥\8bà¤\9cà¤\95नाम अथवा ऐपिसङ्केतम् अवरुणद्धु ।",
+       "ipb-unblock": "सदसà¥\8dयनाम अथवा ऐपिसङ्केतम् अवरुणद्धु ।",
        "ipb-blocklist": "वर्तमानावरोधान् अवलोकयतु ।",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} कृते योगदानम्",
        "unblockip": "योजकसु अवरोधं परिहरतु ।",
        "unblockiptext": "सद्यः अवरुद्धान् ऐपिसङ्केतान् अथवा अवरुद्धानि योजकनामानि पुनस्संस्थाप्य लिखनावकाशं प्राप्तुम् अधो दत्तप्रपत्रस्य उपयोगं करोतु ।",
        "ipusubmit": "अवरोधम् अपनयतु ।",
-       "unblocked": "[[User:$1|$1]] à¤\87ति à¤¯à¥\8bà¤\9cà¤\95स्य अवरोधम् अपनयतु ।",
+       "unblocked": "[[User:$1|$1]] à¤\87ति à¤¸à¤¦à¤¸à¥\8dयस्य अवरोधम् अपनयतु ।",
        "unblocked-range": "$1 इत्येतस्य अवरोधः कृतः ।",
        "unblocked-id": "$1 इत्यस्य अवरोधः अपनीतः ।",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] स्थनसूच्याः निष्कासितः ।",
-       "blocklist": "à¤\85वरà¥\81दà¥\8dधाà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाà¤\83 à¥¤",
-       "ipblocklist": "à¤\85वरà¥\81दà¥\8dधाà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाः",
+       "blocklist": "à¤\85वरà¥\81दà¥\8dधाà¤\83 à¤¸à¤¦à¤¸à¥\8dयाà¤\83",
+       "ipblocklist": "à¤\85वरà¥\81दà¥\8dधाà¤\83 à¤¸à¤¦à¤¸à¥\8dयाः",
        "ipblocklist-legend": "अवरुद्धयोजकं पश्यतु ।",
        "blocklist-userblocks": "योजकस्थानावरुद्धिं गोपयतु ।",
        "blocklist-tempblocks": "तात्कालिकावरुद्धिं गोपयतु ।",
        "emailblock": "वि-पत्रं निष्क्रियम्",
        "blocklist-nousertalk": "स्वस्य सम्भाषणपुटं सम्पादयितुं न शक्यते ।",
        "ipblocklist-empty": "अवरोधावली रिक्ता अस्ति ।",
-       "ipblocklist-no-results": "à¤\85भà¥\8dयरà¥\8dथितà¤\83 à¤\90पिसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85थवा à¤\85भà¥\8dयरà¥\8dथितà¤\83 à¤¯à¥\8bà¤\9cà¤\95नाम अवरुद्धं न ।",
+       "ipblocklist-no-results": "à¤\85भà¥\8dयरà¥\8dथितà¤\83 à¤\90पिसà¤\99à¥\8dà¤\95à¥\87तà¤\83 à¤\85थवा à¤\85भà¥\8dयरà¥\8dथितà¤\83 à¤¸à¤¦à¤¸à¥\8dयनाम अवरुद्धं न ।",
        "blocklink": "अवरुद्ध्यताम्",
        "unblocklink": "अवरोधः निरस्त्यताम्",
        "change-blocklink": "अवरोधः परिवर्त्यताम्",
        "reblock-logentry": "[[$1]] इत्यस्य अवरोधस्य विन्यासः परिवर्तितः अयं $2 $3 समये विनश्येत् ।",
        "blocklogtext": "इयम् अवरुद्धानवरुद्धप्रक्रियायाः अवलोकनस्य सूचिका । \nस्वयम् अवरुद्धानाम् ऐपिसङ्केतानाम् आवली न कृता ।\nसद्यः उपयोगनिषेधस्य अवरोधानाम् आवलीप्राप्तये [[Special:BlockList|block list]] अवलोकयतु ।",
        "unblocklogentry": "अनिरुद्धम् $1",
-       "block-log-flags-anononly": "à¤\85नामà¤\95ाà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाः केवलम् ।",
+       "block-log-flags-anononly": "à¤\85नामà¤\95ाà¤\83 à¤¸à¤¦à¤¸à¥\8dयाः केवलम् ।",
        "block-log-flags-nocreate": "सदस्यता प्राप्तिः अवरुद्धा अस्ति",
        "block-log-flags-noautoblock": "स्वयमवरोधः निष्क्रियः ।",
        "block-log-flags-noemail": "वि-पत्रं निष्क्रियम्",
        "block-log-flags-nousertalk": "स्वस्य सम्भाषणपुटं सम्पादयितुं न शक्यते ।",
        "block-log-flags-angry-autoblock": " उन्नतीकृतः स्वयमवरोधः सक्रियः ।",
-       "block-log-flags-hiddenname": "यà¥\8bà¤\9cà¤\95स्य नाम सङ्गुप्तम् ।",
+       "block-log-flags-hiddenname": "सदसà¥\8dयस्य नाम सङ्गुप्तम् ।",
        "range_block_disabled": " प्रादेशिकावरोधस्य प्रशासकस्य सामर्थ्यं निष्क्रियम् ।",
        "ipb_expiry_invalid": "अवसानसमयः अमान्योऽस्ति।",
        "ipb_expiry_temp": "सङ्गुप्तयोजकनामावरोधः शश्वतः भवेत् ।",
        "ipb_already_blocked": "\"$1\" इत्येषः पूर्वमेव अवरुद्धः ।",
        "ipb-needreblock": "$1 इत्येषः पूर्वमेव अवरुद्धः विन्यासं परिवर्तयितुमिच्छति वा ?",
        "ipb-otherblocks-header": "अन्याः {{PLURAL:$1|अवरोधः |अवरोधाः}}",
-       "unblock-hideuser": "à¤\8fतà¤\82 à¤¯à¥\8bà¤\9cà¤\95मà¥\8d à¤\85वरà¥\8bधातà¥\8d à¤µà¤¿à¤®à¥\8bà¤\9aयितà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ à¤¯à¤¤à¤\83 à¤\85सà¥\8dय à¤¯à¥\8bà¤\9cà¤\95नाम सङ्गुप्तम् ।",
+       "unblock-hideuser": "à¤\8fतà¤\82 à¤¸à¤¦à¤¸à¥\8dयमà¥\8d à¤\85वरà¥\8bधातà¥\8d à¤µà¤¿à¤®à¥\8bà¤\9aयितà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ à¤¯à¤¤à¤\83 à¤\85सà¥\8dय à¤¸à¤¦à¤¸à¥\8dयनाम सङ्गुप्तम् ।",
        "ipb_cant_unblock": " दोषः : $1 इति अवरुद्धः पत्रसङ्केतः न दृष्टः । प्रायः तावत् पूर्वमेव उत्तारितम् ।",
        "ipb_blocked_as_range": "दोषः : $1 इति ऐपिसङ्केतः साक्षात् अवरुद्धः न अपि च विमोचनं न शक्यते ।\n$2 इति प्रकारस्य अवरोधं कर्तुं शक्यते यत् अनवरोधमिच्छति ।",
        "ip_range_invalid": "अमान्यः ऐपिप्रकारः",
        "movepagetext": "निम्नपत्रं पृष्ठस्य नाम परिवर्तयिष्यति । तस्य पृष्ठस्य सम्पूर्णेतिहासोऽपि नूतननाम्ना दर्शिष्यति ।\nपुरातनं शीर्षकं नूतनशीर्षकं प्रति पुनर्निर्देिष्टं भविष्यति ।\nमूलशीर्षकं प्रति नेतॄन् पुनार्निर्देशान् भवान्/भवती स्वचालितरूपेण परिवर्तयितुम् अपि शक्नोति ।\nयदि भवान्/भवती एवं न करोति, तर्हि कृपया [[Special:DoubleRedirects|पुनर्निर्देशस्य द्वित्वम्]] उत [[Special:BrokenRedirects|खण्डितपुनर्निर्देशः]] इत्यनयोः परीक्षणं निश्चयेन करोतु ।\nपरिसन्धयः योग्यस्थानं प्रति गच्छेत् इति सुनिश्चितकरणं भवतः/भवत्याः दायित्वम् अस्ति ।\n\nयदि नवीनशीर्षकस्य नाम्ना लेखः पूर्वमेव विद्यते, तर्हि पुनर्निर्देशः <strong> न </strong> भविष्यति । परन्तु नवीनशीर्षकस्य नाम्ना लेखः नास्ति उत कुत्रापि अनुप्रेषितं नास्ति चेदेव स्थानान्तरणस्य प्रक्रिया भविष्यति ।\n\nअर्थात् त्रुट्या स्थानान्तरणस्य प्रक्रिया अभवत् चेत्, पुरातनपृष्ठे स्थानान्तरणं कर्तुं प्रभविष्यति । तथा च विद्यामाने पृष्ठे सति भवान्/भवती स्थानान्तरणं कर्तुं न प्रभवति ।\n\n<strong>पूर्वसूचना !</strong>\n\nयदि पृष्ठम् अतिलोकप्रियम् अस्ति, तर्हि बृहत् आकस्मिकं परिवर्तनं भवितुं शक्नोति, अतः स्थानान्तरणात् प्राक् अन्तिमपरिणामस्य विषये पूर्वानुमानं करोतु ।",
        "movepagetext-noredirectfixer": "निम्नपत्रं पृष्ठस्य नाम परिवर्तयिष्यति । तस्य पृष्ठस्य सम्पूर्णेतिहासोऽपि नूतननाम्ना दर्शिष्यति ।\nपुरातनं शीर्षकं नूतनशीर्षकं प्रति पुनर्निर्देिष्टं भविष्यति । मूलशीर्षकं प्रति नेतॄन् पुनार्निर्देशान् भवान्/भवती स्वचालितरूपेण परिवर्तयितुम् अपि शक्नोति । यदि भवान्/भवती एवं न करोति, तर्हि कृपया पुनर्निर्देशस्य [[Special:DoubleRedirects|द्वित्वम्]] उत [[Special:BrokenRedirects|खण्डितपुनर्निर्देशः]] इत्यनयोः परीक्षणं निश्चयेन करोतु । \n\nपरिसन्धयः योग्यस्थानं प्रति गच्छेत् इति सुनिश्चितकरणं भवतः/भवत्याः दायित्वम् अस्ति ।\nयदि नवीनशीर्षकस्य नाम्ना लेखः पूर्वमेव विद्यते, तर्हि पुनर्निर्देशः न भविष्यति । परन्तु नवीनशीर्षकस्य नाम्ना लेखः नास्ति उत कुत्रापि अनुप्रेषितं नास्ति चेदेव स्थानान्तरणस्य प्रक्रिया भविष्यति ।\n\nअर्थात् त्रुट्या स्थानान्तरणस्य प्रक्रिया अभवत् चेत्, पुरातनपृष्ठे स्थानान्तरणं कर्तुं प्रभविष्यति । तथा च विद्यामाने पृष्ठे सति भवान्/भवती स्थानान्तरणं कर्तुं <strong>न</strong> प्रभवति ।\n\n<strong>पूर्वसूचना !</strong>\nयदि पृष्ठम् अतिलोकप्रियम् अस्ति, तर्हि बृहत् आकस्मिकं परिवर्तनं भवितुं शक्नोति, अतः स्थानान्तरणात् प्राक् अन्तिमपरिणामस्य विषये पूर्वानुमानं करोतु ।\"",
        "movepagetalktext": "सम्बद्धसम्भाषणपुटानि अनेन सह स्थानान्तरितानि भवन्ति अन्यथा  \n* भवान् पृष्ठम् अन्यस्थानान्तरं कुर्वन् अस्ति । \n* अस्मिन् नाम्नि सम्भाषणपुटं पूर्वनिर्मितमस्ति अस्थवा  \n* अधोदत्ताम् अर्गलनमञ्चूषाम् उत्पाटितवान् । \nअस्मिन् विषये यदि इच्छति तर्हि भवता पुटानि चालनीयानि अथवा संयोजनीयानि ।",
-       "moveuserpage-warning": "पà¥\82रà¥\8dवसà¥\82à¤\9aना : à¤¯à¥\8bà¤\9cà¤\95पà¥\83षà¥\8dठà¤\82 à¤\9aालयितà¥\81मà¥\8d à¤\89दà¥\8dयà¥\81à¤\95à¥\8dतà¤\83 à¥¤ à¤¸à¥\8dमरतà¥\81 à¤\95à¥\87वलà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¥\8dथानानà¥\8dतरितà¤\82 à¤­à¤µà¤¤à¤¿ à¤¨ à¤¤à¥\81 à¤¯à¥\8bà¤\9cà¤\95नाम परिवर्तनं न भविष्यति ।",
+       "moveuserpage-warning": "पà¥\82रà¥\8dवसà¥\82à¤\9aना : à¤¸à¤¦à¤¸à¥\8dयपà¥\83षà¥\8dठà¤\82 à¤\9aालयितà¥\81मà¥\8d à¤\89दà¥\8dयà¥\81à¤\95à¥\8dतà¤\83 à¥¤ à¤¸à¥\8dमरतà¥\81 à¤\95à¥\87वलà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¥\8dथानानà¥\8dतरितà¤\82 à¤­à¤µà¤¤à¤¿ à¤¨ à¤¤à¥\81 à¤¸à¤¦à¤¸à¥\8dयनाम परिवर्तनं न भविष्यति ।",
        "movecategorypage-warning": "<strong>पूर्वसूचना :</strong> भवान्/भवती वर्गं स्थानान्तरितं कर्तुम् इच्छति । अतः जानातु यत्, केवलं पृष्ठं स्थानान्तरितं भविष्यति पृष्ठे विद्यमानानि पुरातनवर्गाः परिवर्तिताः <em>न</em> भविष्यन्ति ।",
        "movenologintext": " [[Special:UserLogin|logged in]] पञ्जीकृतयोजकः भवता नामाभिलेखनं करणीयं भवति ।",
        "movenotallowed": "पुटानि स्थानान्तरियितुम् अनुमतिः नाश्ति ।",
        "movenosubpage": "अस्य पुटस्य उपपुटानि न सन्ति ।",
        "movereason": "कारणम् :",
        "revertmove": "प्रत्यावर्तनम्",
-       "delete_and_move": "अपमर्जनं चालनं च ।",
        "delete_and_move_text": "==अपमर्जनम् आवश्यकम्==\nलक्षितपुटं \"[[:$1]]\" पूर्वमेव अस्ति ।\nचालनपथं सृष्टुम् एतत् अपमर्जितुम् इच्छति वा ?",
        "delete_and_move_confirm": "आम्, पुटम् अपमर्जतु ।",
        "delete_and_move_reason": "\"[[$1]]\" तः स्थानान्तरणं कर्तुं पथनिर्माणार्थम् अपमर्जितम् ।",
        "imageinvalidfilename": "लक्षितसञ्चिकानाम अमान्यम् ।",
        "fix-double-redirects": "यङ्कमपि पुनर्निदेशं उन्नतीकरोतु यः मूलशीर्षकं निदेशति ।",
        "move-leave-redirect": "कञ्चित् पुनर्निदेशं पूर्वमेव त्यजतु ।",
-       "protectedpagemovewarning": "'''पà¥\82रà¥\8dवसà¥\82à¤\9aना ''' à¤ªà¥\8dरशासà¤\95पदयà¥\81à¤\95à¥\8dताà¤\83 à¤¯à¥\8bà¤\9cà¤\95ाः एव सम्पादनं कर्तुमर्हन्ति । अतः एतत्पुटं सुरक्षितम् । निदेशार्थम् अधः जघन्यप्रवेशः सूचितः ।",
+       "protectedpagemovewarning": "'''पà¥\82रà¥\8dवसà¥\82à¤\9aना ''' à¤ªà¥\8dरशासà¤\95पदयà¥\81à¤\95à¥\8dताà¤\83 à¤¸à¤¦à¤¸à¥\8dयाः एव सम्पादनं कर्तुमर्हन्ति । अतः एतत्पुटं सुरक्षितम् । निदेशार्थम् अधः जघन्यप्रवेशः सूचितः ।",
        "semiprotectedpagemovewarning": "'''सूचना ''' पञ्जीकृतयोजकानां  उपयोगार्थ केवलम् एतत्पुटम् अभिरक्षितम् । जघन्यप्रवेशस्य सूचना आनुकूल्यार्थम् अधोनिदेशिता ।",
        "move-over-sharedrepo": "==वर्तमानसञ्चिकाः==\n [[:$1]] विभक्तकोशे सञ्चिकास्ति । अस्यां शीर्षकं स्थानान्तरणेन विभक्तसञ्चिका विकृता भवति ।",
        "file-exists-sharedrepo": "विभक्तकोशे चितसञ्चिकानाम प्रथममेव उपयोगे अस्ति  । अन्यं नाम चिनोतु ।",
        "import-options-wrong": "असमीचीनः {{PLURAL:$2|विकल्पः|विकल्पाः}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "दत्तमूलपुटम् अमान्यशीर्षकयुक्तम् ।",
        "import-rootpage-nosubpage": "मूलपुटस्य \"$1\" इति नामस्थाने उपपुटानि नानुमतानि ।",
-       "importlogpage": "à¤\86यातसà¥\82à¤\9aिà¤\95ा à¥¤",
+       "importlogpage": "à¤\86यातसà¥\8dय à¤¸à¤\82रà¤\95à¥\8dषितावलिà¤\83",
        "importlogpagetext": "अन्यविकितः सम्पादितेतिहाससहितानि प्रशासकानाम् आयातपुटानि ।",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|संस्करणस्य|संस्करणानाम्}} आयातः अभवत्",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|संस्करणस्य|संस्करणानाम्}} आयातः अभवत् $2",
        "javascripttest-pagetext-frameworks": "अधो दत्तेषु कञ्चिदेकां परीक्षाप्रक्रियां चिनोतु : $1",
        "javascripttest-pagetext-skins": "अनेन सह परीक्षां सञ्चालयितुं  काचित् त्वक् चिनोतु ।",
        "javascripttest-qunit-intro": "mediawiki.org. [$1 अभिलेखपरीक्षा] इत्यत्र पश्यतु ।",
-       "tooltip-pt-userpage": "भवतà¤\83/भवतà¥\8dयाà¤\83 à¤¯à¥\8bà¤\9cà¤\95पृष्ठम्",
+       "tooltip-pt-userpage": "भवतà¤\83/भवतà¥\8dयाà¤\83 à¤¸à¤¦à¤¸à¥\8dयपृष्ठम्",
        "tooltip-pt-anonuserpage": "ऐपिसङ्केतार्थं योजकपुटं भवान् सम्पादयति एवम्..",
        "tooltip-pt-mytalk": "भवतः/भवत्याः सम्भाषणपृष्ठम्",
        "tooltip-pt-anontalk": "एतस्मात् ऐपिसङ्केतात् सम्पादनस्य परिचर्चा ।",
        "tooltip-pt-logout": "निर्गम्यताम्",
        "tooltip-pt-createaccount": "नूतनसदस्यतां प्राप्य प्रविश्यताम् इति सूच्यते किन्तु न एतद् अनिवार्यम्",
        "tooltip-ca-talk": "विषयसहितानां पृष्ठानां सम्भाषणम्",
-       "tooltip-ca-edit": "à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤¶à¤\95à¥\8dयतà¥\87 à¥¤ à¤°à¤\95à¥\8dषणातà¥\8dपà¥\82रà¥\8dवà¤\82 à¤\95à¥\83पया à¤ªà¥\8dराà¤\97à¥\8dदà¥\83शà¥\8dयà¤\82 à¤¦à¥\83शà¥\8dयतामà¥\8d à¥¤",
+       "tooltip-ca-edit": "à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादà¥\8dयतामà¥\8d",
        "tooltip-ca-addsection": "नूतनविभागः आरभ्यताम्",
        "tooltip-ca-viewsource": "इदं पृष्ठं संरक्षितं विद्यते । अस्य स्रोतः द्रष्टुं शक्यते ।",
        "tooltip-ca-history": "अस्य पृष्ठस्य पुरातनाऽऽवृत्तिः",
        "tooltip-t-recentchangeslinked": "एतत्पृष्ठसम्बद्धेषु पृष्ठेषु जातानि नवीनपरिवर्तनानि",
        "tooltip-feed-rss": "अस्मै पृष्ठाय आर-एस-एस-पूरणम्",
        "tooltip-feed-atom": "अस्मै पृष्ठाय अणुपूरणम्",
-       "tooltip-t-contributions": "à¤\85सà¥\8dय à¤¯à¥\8bà¤\9cà¤\95सà¥\8dय योगदानानाम् आवलिः",
+       "tooltip-t-contributions": "à¤\85नà¥\87न à¤¸à¤¦à¤¸à¥\8dयà¥\87न à¤\95à¥\83तानाà¤\82 योगदानानाम् आवलिः",
        "tooltip-t-emailuser": "एतस्मै योजकाय वि-पत्रं प्रेष्यताम्",
        "tooltip-t-info": "एतस्य पृष्ठस्य विषये अधिकं विवरणम्",
        "tooltip-t-upload": "सञ्चिकाः उपारोप्यन्ताम्",
        "tooltip-ca-nstab-main": "विषययुक्तं पृष्ठं पश्यतु",
        "tooltip-ca-nstab-user": "योजकपृष्ठं दृश्यताम्",
        "tooltip-ca-nstab-media": "माध्यमपुटम् अवलोकयतु ।",
-       "tooltip-ca-nstab-special": "à¤\87दमà¥\87à¤\95à¤\82 à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9fà¤\82 à¤ªà¥\83षà¥\8dठà¤\82, à¤­à¤µà¤¾à¤¨à¥\8d/भवतà¥\80 à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤¨à¤¾à¤°à¥\8dहति ।",
+       "tooltip-ca-nstab-special": "à¤\87दमà¥\87à¤\95à¤\82 à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9fà¤\82 à¤ªà¥\83षà¥\8dठमà¥\8d, à¤\87दà¤\82 à¤ªà¥\83षà¥\8dठà¤\82 à¤¸à¤®à¥\8dपादयितà¥\81à¤\82 à¤¨ à¤¶à¤\95à¥\8dयतà¥\87 ।",
        "tooltip-ca-nstab-project": "प्रकल्पपृष्ठं दृश्यताम्",
        "tooltip-ca-nstab-image": "सञ्चिकापृष्ठं दृश्यताम्",
        "tooltip-ca-nstab-mediawiki": "तन्त्रसन्देशान् अवलोकयतु ।",
        "tooltip-undo": "'\"पूर्ववत्\"' इति अन्तिमसम्पादनम् अपाकरोति, सम्पादनप्रारूपं प्राग्दृश्यरूपेण उद्घाटयति, नवीनसम्पादनानन्तरं सम्पादनपृष्ठं प्राग्दृश्यत्वेन प्रदर्शयति च । \n\nअस्य सारांशे अपाकरणस्य कारणमपि लिखितुं शक्यते ।",
        "tooltip-preferences-save": "आद्यताः रक्षतु ।",
        "tooltip-summary": "सङ्क्षिप्तसारांशः योज्यताम्",
-       "anonymous": "{{SITENAME}} à¤\87तà¥\8dयसà¥\8dय {{PLURAL:$1||}} à¤\85नामà¤\95यà¥\8bà¤\9cà¤\95ः ।",
-       "siteuser": "{{SITENAME}} à¤¯à¥\8bà¤\9cà¤\95 $1",
+       "anonymous": "{{SITENAME}} à¤\87तà¥\8dयसà¥\8dय {{PLURAL:$1||}} à¤\85नामà¤\95सदसà¥\8dयः ।",
+       "siteuser": "{{SITENAME}} à¤¸à¤¦à¤¸à¥\8dयà¤\83 $1",
        "anonuser": "{{SITENAME}} अज्ञातयोजकः $1",
        "lastmodifiedatby": "एतस्य पुटस्य अन्तिमपरिवर्तनं $1 दिनाङ्के $2 समये कृतम् ।",
        "othercontribs": "$1 इत्यस्य कार्यस्य अनुसारम् ।",
-       "others": "अन्य",
-       "siteusers": "{{SITENAME}} {{PLURAL:$2|यà¥\8bà¤\9cà¤\95|यà¥\8bà¤\9cà¤\95}} $1",
+       "others": "अन्य",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|सदसà¥\8dयà¤\83|सदसà¥\8dयाà¤\83}} $1",
        "anonusers": "{{SITENAME}} {{PLURAL:$2|अज्ञातयोजकः|अज्ञातयोजकाः}} $1",
        "creditspage": "पुटनां समाकलनानि ।",
        "nocredits": "अस्य पुटस्य समाकलनसूचना नोपलब्धा ।",
        "markedaspatrollederror-noautopatrol": "स्वस्य परिवर्तनानि आरक्षितं कर्तुं भवान् नानुमतः ।",
        "markedaspatrollednotify": "$1 इत्यस्य एतत् परिवर्तनं समीक्षितम् इति अङ्कितम्।",
        "markedaspatrollederrornotify": "समीक्षितम् इति चिह्नीकरणं विफलम्।",
-       "patrol-log-page": "à¤\86रà¤\95à¥\8dषणसà¥\82à¤\9aिà¤\95ा à¥¤",
+       "patrol-log-page": "निरà¥\80à¤\95à¥\8dषिता à¤¸à¤\82रà¤\95à¥\8dषितावलिà¤\83",
        "patrol-log-header": "इयम् आरक्षितपुनरावृत्तीनां सूचिका अस्ति ।",
-       "log-show-hide-patrol": "$1 à¤\87तà¥\8dयसà¥\8dय à¤\86रà¤\95à¥\8dषणसà¥\82à¤\9aिà¤\95ा à¥¤",
+       "log-show-hide-patrol": "$1 à¤\87तà¥\8dयनà¥\87न à¤¨à¤¿à¤°à¥\80à¤\95à¥\8dषिता à¤¸à¤\82रà¤\95à¥\8dषितावलिà¤\83",
        "log-show-hide-tag": "$1 चिह्नाऽऽवलिः",
        "deletedrevision": "अपमर्जितप्राचीनपुनरावृत्तिः $1",
        "filedeleteerror-short": "सञ्चिकानपमर्जने दोषः : $1",
        "version-credits-title": "$1 कृते कृतज्ञता",
        "version-credits-not-found": "एतस्य विस्तारक्षेत्राय विस्तृतं कृतज्ञतासूचनं न प्राप्तम्",
        "version-poweredby-credits": "इयं विकिः अनेन सञ्चालिता '''[https://www.mediawiki.org/ MediaWiki]''', स्वामित्वम् © 2001 - $1  $2 ।",
-       "version-poweredby-others": "अन्य",
+       "version-poweredby-others": "अन्य",
        "version-poweredby-translators": "translatewiki.net अनुवादकाः",
        "version-credits-summary": "[[Special:Version|MediaWiki]] इत्यत्र योगदानार्थं वयं अधोलिखितान् जनान् प्रशंसितुमिच्छामः।",
        "version-license-info": "मिडियाविकिः तु निश्शुल्कतन्त्रांशः ; भवान् पुनः वितर्तुं शक्नोति अथवा GNU सामान्यसार्वजनिकानुज्ञपत्रस्य नियमानुगुणं द्वीतीयावृत्तिम् अथवा अन्यनूतनावृतिं संस्कर्तुं शक्नोति । \n\nएषा बहूपयोगाय भवेत् इति धिया मिडियाविकिः वितीर्णा । किन्तु केनापि प्रमाणत्वेन विना दत्ता । अथवा निर्दिष्टोद्देशर्थे अनुकूलकरं वेति अपरिशील्य अथवा वाणिज्यस्य आनुषङ्गिकानुज्ञापत्रेण विना अपि मीडियाविकिः प्रदत्ता । विशेषविवरणप्राप्तये GNU सर्वजनसामान्यम् अनुज्ञापत्रं पश्यतु ।\n\n[{{SERVER}}{{SCRIPTPATH}}/COPYING काचित् प्रतिः, GNU सर्वजनसामान्यम् अनुज्ञापत्रम्] इत्येतत् भवान् स्वीकृतवान् । अनेन कार्यकलापेन सह , यदि नास्ति, निश्शुल्कतन्त्रज्ञानप्रतिष्ठानं पत्रं प्रेषयतु । सङ्केतः - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA or [//www.gnu.org/licenses/old-licenses/gpl-2.0.html सद्यसः पठितुमर्हति]",
        "version-libraries": "स्थापिताः सञ्चिकाः",
        "version-libraries-library": "ग्रन्थालयः",
        "version-libraries-version": "संस्करणम्",
-       "redirect": "सà¤\9eà¥\8dà¤\9aिà¤\95ा-यà¥\8bà¤\9cà¤\95-पृष्ठेभ्यः उत संस्करणात् पुनर्निर्दिष्टम्",
+       "redirect": "सà¤\9eà¥\8dà¤\9aिà¤\95ा-सदसà¥\8dय-पृष्ठेभ्यः उत संस्करणात् पुनर्निर्दिष्टम्",
        "redirect-legend": "सञ्चिकायाः, पृष्ठात् वा पुनर्निर्दिष्टम्",
-       "redirect-summary": "à¤\8fततà¥\8d à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9fपà¥\83षà¥\8dठà¤\82 à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ाà¤\82 (सà¤\9eà¥\8dà¤\9aिà¤\95ायाà¤\83 à¤¨à¤¾à¤® à¤ªà¥\8dरदतà¥\8dतमà¥\8d) à¤ªà¥\8dरति à¤ªà¥\81नरà¥\8dनिरà¥\8dदिषà¥\8dà¤\9fमà¥\8d à¤\85सà¥\8dति à¥¤ à¤ªà¥\83षà¥\8dठà¤\82 (à¤\85भिà¤\9cà¥\8dà¤\9eापà¤\95सà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d à¤\89त à¤ªà¥\83षà¥\8dठाभिà¤\9cà¥\8dà¤\9eापà¤\95à¤\82 à¤ªà¥\8dरदतà¥\8dतमà¥\8d), à¤\89त à¤¯à¥\8bà¤\9cà¤\95पà¥\83षà¥\8dठमà¥\8d (सà¤\99à¥\8dà¤\96à¥\8dयातà¥\8dमà¤\95à¤\82 à¤¯à¥\8bà¤\9cà¤\95ाभिज्ञापकं प्रदत्तम्) । उपयोगः : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], उत [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "à¤\8fततà¥\8d à¤µà¤¿à¤¶à¤¿à¤·à¥\8dà¤\9fपà¥\83षà¥\8dठà¤\82 à¤¸à¤\9eà¥\8dà¤\9aिà¤\95ाà¤\82 (सà¤\9eà¥\8dà¤\9aिà¤\95ायाà¤\83 à¤¨à¤¾à¤® à¤ªà¥\8dरदतà¥\8dतमà¥\8d) à¤ªà¥\8dरति à¤ªà¥\81नरà¥\8dनिरà¥\8dदिषà¥\8dà¤\9fमà¥\8d à¤\85सà¥\8dति à¥¤ à¤ªà¥\83षà¥\8dठà¤\82 (à¤\85भिà¤\9cà¥\8dà¤\9eापà¤\95सà¥\8dय à¤¸à¤\82सà¥\8dà¤\95रणमà¥\8d à¤\89त à¤ªà¥\83षà¥\8dठाभिà¤\9cà¥\8dà¤\9eापà¤\95à¤\82 à¤ªà¥\8dरदतà¥\8dतमà¥\8d), à¤\89त à¤¸à¤¦à¤¸à¥\8dयपà¥\83षà¥\8dठमà¥\8d (सà¤\99à¥\8dà¤\96à¥\8dयातà¥\8dमà¤\95à¤\82 à¤¸à¤¦à¤¸à¥\8dयाभिज्ञापकं प्रदत्तम्) । उपयोगः : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], उत [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "गम्यताम्",
        "redirect-lookup": "अन्विष्याम् :",
        "redirect-value": "मूल्यम्",
        "specialpages-group-login": "प्रविश्यताम् / लेखा सृज्यताम्",
        "specialpages-group-changes": "सद्योजातानि परिवर्तनानि आवल्यश्च",
        "specialpages-group-media": "माध्यमस्य इतिवृत्तम् आरोपणानि च",
-       "specialpages-group-users": "यà¥\8bà¤\9cà¤\95ाः अधिकाराश्च",
+       "specialpages-group-users": "सदसà¥\8dयाः अधिकाराश्च",
        "specialpages-group-highuse": "अधिकोपयोगीनि पृष्ठानि",
        "specialpages-group-pages": "पृष्ठानाम् आवली",
        "specialpages-group-pagetools": "पृष्ठोपकरणानि",
        "tags-hitcount": "$1 {{PLURAL:$1|परिवर्तनम्|परिवर्तनानि}}",
        "tags-manage-no-permission": "भवतः/भवत्याः पार्श्वे परिवर्तनचिह्नानि सञ्चालयितुम् अनुमतिः नास्ति ।",
        "tags-create-heading": "नूतनचिह्नं सृज्यताम्",
-       "tags-create-explanation": "यदभावà¥\87, à¤¨à¤µà¥\80नरà¤\9aितानि à¤\85à¤\99à¥\8dà¤\95नानि à¤¯à¥\8bà¤\9cà¤\95ेभ्यः, बॉट् इत्येतेभ्यश्च उपलब्धानि सन्ति ।",
+       "tags-create-explanation": "यदभावà¥\87, à¤¨à¤µà¥\80नरà¤\9aितानि à¤\85à¤\99à¥\8dà¤\95नानि à¤¸à¤¦à¤¸à¥\8dयेभ्यः, बॉट् इत्येतेभ्यश्च उपलब्धानि सन्ति ।",
        "tags-create-tag-name": "अङ्कननाम :",
        "tags-create-reason": "कारणम् :",
        "tags-create-submit": "सृज्यताम्",
        "htmlform-required": "इदं मूल्यम् अपेक्षितम् ।",
        "htmlform-submit": "उपस्थाप्यताम्",
        "htmlform-reset": "परिवर्तनानि पूर्वस्थितिं प्रति आनयतु",
-       "htmlform-selectorother-other": "अन्य",
+       "htmlform-selectorother-other": "अन्यत्",
        "htmlform-no": "न",
        "htmlform-yes": "आम्",
        "htmlform-chosen-placeholder": "एकं विकल्पं चिनोतु",
        "logentry-suppress-revision-legacy": "$3 इत्यत्र संरक्षिताऽऽवलेः दर्शनीयता $1 द्वारा रहस्यमयरीत्या {{GENDER:$2|परिवर्तिता}}",
        "revdelete-content-hid": "सामग्री अपाकृता",
        "revdelete-summary-hid": "सम्पादनसारः विलोपितः",
-       "revdelete-uname-hid": "यà¥\8bà¤\9cà¤\95स्य नाम सङ्गुप्तम् ।",
+       "revdelete-uname-hid": "सदसà¥\8dयस्य नाम सङ्गुप्तम् ।",
        "revdelete-content-unhid": "आधेयं न लोपितम्",
        "revdelete-summary-unhid": "सम्पादनसारः न लोपितः",
-       "revdelete-uname-unhid": "यà¥\8bà¤\9cà¤\95स्य नाम न लोपितम्",
+       "revdelete-uname-unhid": "सदसà¥\8dयस्य नाम न लोपितम्",
        "revdelete-restricted": "प्रबन्धकानां प्रतिबन्धनानि आरोपितानि",
        "revdelete-unrestricted": "प्रबन्धकानां प्रतिबन्धनानि निष्कासितानि",
        "logentry-block-block": "$1 {{GENDER:$2|प्रतिबन्धितः}} {{GENDER:$4|$3}} $5 $6 कालं यावत्",
        "logentry-move-move_redir-noredirect": "पुनर्निर्देशनं प्रति पुनर्निर्देशनम् अत्यक्त्वा $1 इत्यनेन $3 तः $4 पृष्ठं {{GENDER:$2|स्थानान्तरितं}}",
        "logentry-patrol-patrol": "$1 द्वारा $3 इतिपृष्ठस्य $4 संस्करणं परिक्रमितं (patrolled) {{GENDER:$2|चिह्नितं}}",
        "logentry-patrol-patrol-auto": "$1 द्वारा स्वतः $3 इतिपृष्ठस्य $4 संस्करणं परिक्रमितं (patrolled) {{GENDER:$2|चिह्नितं}}",
-       "logentry-newusers-newusers": "$1 à¤¯à¥\8bà¤\9cà¤\95लेखा {{GENDER:$2|निर्मिता}}",
-       "logentry-newusers-create": "$1 à¤¯à¥\8bà¤\9cà¤\95लेखा {{GENDER:$2|निर्मिता}}",
-       "logentry-newusers-create2": "$1 à¤¦à¥\8dवारा $3 à¤¯à¥\8bà¤\9cà¤\95लेखा {{GENDER:$2|निर्मिता}}",
-       "logentry-newusers-byemail": "$1 à¤¦à¥\8dवारा $3 à¤\87ति à¤¯à¥\8bà¤\9cà¤\95लेखा {{GENDER:$2|सृष्टा}} कूटशब्दः ईपत्रमाध्यमेन प्रेषितः ।",
-       "logentry-newusers-autocreate": "$1 à¤¯à¥\8bà¤\9cà¤\95लेखा स्वतः {{GENDER:$2|निर्मिता}}",
+       "logentry-newusers-newusers": "$1 à¤¸à¤¦à¤¸à¥\8dयलेखा {{GENDER:$2|निर्मिता}}",
+       "logentry-newusers-create": "$1 à¤¸à¤¦à¤¸à¥\8dयलेखा {{GENDER:$2|निर्मिता}}",
+       "logentry-newusers-create2": "$1 à¤¦à¥\8dवारा $3 à¤¸à¤¦à¤¸à¥\8dयलेखा {{GENDER:$2|निर्मिता}}",
+       "logentry-newusers-byemail": "$1 à¤¦à¥\8dवारा $3 à¤\87ति à¤¸à¤¦à¤¸à¥\8dयलेखा {{GENDER:$2|सृष्टा}} कूटशब्दः ईपत्रमाध्यमेन प्रेषितः ।",
+       "logentry-newusers-autocreate": "$1 à¤¸à¤¦à¤¸à¥\8dयलेखा स्वतः {{GENDER:$2|निर्मिता}}",
        "logentry-rights-rights": "$1 इत्यनेन $3 इत्यस्य दलसमूहः $4 इत्यस्मात् परिवर्त्य  $5 {{GENDER:$2|कृतः}}",
        "logentry-rights-rights-legacy": "$1 द्वारा $3 कृते दलसदस्यत्वं {{GENDER:$2|परिवर्तितं}}",
        "logentry-rights-autopromote": "$4 तः $5 पर्यन्तं $1 इत्यनेन स्वतः {{GENDER:$2|संरक्षितम्}}",
        "feedback-submit": "उपस्थाप्यताम्",
        "feedback-terms": "मम योजकानुयोज्यस्य सूचना, मम गवेषकेन, कासंविधायाः संस्करणे सह मम प्रतिक्रिया च जनसामान्येभ्यः दृश्यमाना भविष्यति ।",
        "feedback-termsofuse": "उपयोगनियमान्तर्गतम् अहं स्वप्रतिक्रियां दातुम् इच्छामि ।",
-       "feedback-thanks": "धनà¥\8dयवादà¤\83 ! भवतः प्रतिस्पन्दः \"[ $2  $1 ]\" पृष्ठाय प्रेषितः अस्ति ।",
+       "feedback-thanks": "à¤\95à¥\83तà¤\9cà¥\8dà¤\9eता ! भवतः प्रतिस्पन्दः \"[ $2  $1 ]\" पृष्ठाय प्रेषितः अस्ति ।",
        "feedback-thanks-title": "कृतज्ञतां निवेदयामि !",
        "feedback-useragent": "योजकानुयोज्यः :",
        "searchsuggest-search": "अन्वेषणम्",
index bbd3272..2a53b49 100644 (file)
@@ -20,6 +20,7 @@
        "tog-hideminor": "Кыра көннөрүүлэри көрдөрбөккө",
        "tog-hidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн саҥа көннөрүүлэр тиһиктэригэр көрдөрүмэ",
        "tog-newpageshidepatrolled": "Ботуруулламмыт сирэйдэри саҥа сирэйдэр тиһиктэригэр көрдөрүмэ",
+       "tog-hidecategorization": "Сирэй категорияларын көрдөрүмэ",
        "tog-extendwatchlist": "Кэтээһин тупсарыллыбыт тиһигэ. Бары уларытыылар көстөллөр (бүтэһиктэр эрэ буолбатах)",
        "tog-usenewrc": "Саҥа уларытыы уонна кэтэбил тиһиктэригэр уларыйыылары бөлөхтүүргэ",
        "tog-numberheadings": "Түһүмэхтэр ааттарын нүөмэрдээ",
@@ -49,6 +50,7 @@
        "tog-watchlisthideliu": "Бэлиэтэммит кыттааччылар уларытыыларын кэтиир тиһиккэ көрдөрүмэ",
        "tog-watchlisthideanons": "Ааттарын эппэтэх кыттааччылар уларытыыларын кэтээһин тиһигэр көрдөрүмэ",
        "tog-watchlisthidepatrolled": "Ботурууллааччы көрбүт көннөрүүтүн кэтээһин испииһэгэр көрдөрүмэ",
+       "tog-watchlisthidecategorization": "Сирэй категорияларын көрдөрүмэ",
        "tog-ccmeonemails": "Атын кыттааччыларга суруйбут суруктарбын бэйэбэр эмиэ ыыт",
        "tog-diffonly": "Икки барылы тэҥнииргэ сирэй иһин көрдөрүмэ",
        "tog-showhiddencats": "Кистэммит категориялары көрдөр",
        "morenotlisted": "Бу тиһик толорута суох.",
        "mypage": "Сирэй",
        "mytalk": "Кэпсэтэр сирим",
-       "anontalk": "Ð\91Ñ\83 IP-га Ñ\8bрытыы",
+       "anontalk": "Ырытыы",
        "navigation": "Навигация",
        "and": "&#32;уонна",
        "qbfind": "Бул",
        "createaccountreason": "Төрүөтэ:",
        "createacct-reason": "Төрүөтэ",
        "createacct-reason-ph": "Саҥа аатынан тоҕо киирэҕиний",
-       "createacct-captcha": "Куттал суох буолуутун тургутуу",
-       "createacct-imgcaptcha-ph": "Үөһэ көстөрү хатылаа",
        "createacct-submit": "Бэлиэтэнии",
        "createacct-another-submit": "Бэлиэтэн",
        "createacct-benefit-heading": "{{SITENAME}} ситим-сири эн курдук дьон оҥороллор.",
        "permissionserrors": "Киирии алҕаһа",
        "permissionserrorstext": "Маны оҥорор кыаҕыҥ суох, {{PLURAL:$1|төрүтэ|төрүттэрэ}}:",
        "permissionserrorstext-withaction": "Бу дьайыыны ($2) оҥорор кыаҕыҥ суох.  {{PLURAL:$1|Биричиинэтэ|Биричиинэлэрэ}}:",
+       "contentmodelediterror": "Бу торуму уларытар кыаҕыҥ суох эбит, тоҕо диэтэххэ иһинээҕитин мадьыала маннык <code>$1</code>, оттон сирэй иһинээҕитин билиҥҥитэ маннык — <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Болҕой: сотулубут сирэйи төттөрү оҥорон эрэҕин.'''\n\nТолкуйдаан көр, кырдьык бу сирэйи оҥорор туһалаах дуо.\nАллара сотуулар уонна аат уларыйыытын сурунааллара көрдөрүлүннэ.",
        "moveddeleted-notice": "Бу сирэй сотуллубут.\nАллара сотуу уонна аат уларытыытын сурунаалларыгар онно сыһыаннаах туох суруллубута көстөр.",
        "moveddeleted-notice-recent": "Бу сирэй соторутааҕыта (тиһэх 24 чаас иһигэр) сотуллубут эбит.\nАллара сотуу уонна көһөрүү сурунаалларыгар сигэлэр көстөллөр.",
        "showingresultsinrange": "Манна {{PLURAL:$1|<strong>1</strong> түмүк|<strong>$1</strong> түмүк}} мантан саҕалаан <strong>$2</strong> маныаха дылы <strong>$3</strong> көрдөрүлүннэ.",
        "search-showingresults": "{{PLURAL:$4|Түмүк <strong>$1</strong> из <strong>$3</strong>|Түмүктэр <strong>$1 — $2</strong> мантан <strong>$3</strong>}}",
        "search-nonefound": "Көрдөбүлгэ эппиэттиир билэлэр көстүбэтилэр.",
+       "search-nonefound-thiswiki": "Көрдөбүлгэ эппиэттиир билэ бу ситим-сиргэ көстүбэтэ.",
        "powersearch-legend": "Дириҥэтэн көрдөөһүн",
        "powersearch-ns": "Аат далыгар көрдөө:",
        "powersearch-togglelabel": "Бэлиэтээ:",
        "foreign-structured-upload-form-label-own-work-message-default": "Уопсай репозиторийга угарбын өйдөөн туран угабын. Туһаныы сиэрин уонна лиссиэнсийэлиир бэлиитикэни кытта сөп түбэһэрин мэктиэлиибин.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Бу билэҕин уопсай репозиторий быраабылатынан угар кыаҕыҥ суох буоллаҕына, маны сап уонна атын ньыманы туһанан көр.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Өскө, {{SITENAME}} быраабылатынан угар сатанар буоллаҕына, кини [[Special:Upload|киллэрии тэрилин]] туһаныаххын сөп.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Бу билэни бас билэрбин уонна Биики Ыскылаакка төнүннэрбэттии [https://creativecommons.org/licenses/by-sa/4.0/deed.ru Creative Commons Attribution-ShareAlike 4.0] лиссиэнсийэннэн угары бигэргэтэбин. Ону тэҥэ [https://wikimediafoundation.org/wiki/Условия_использования Туһаныы усулуобуйатын кытта] сөбүлэһэбин.",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Өскөтө билэни бас билбэт буоллаххына, биитэр атын лиссиэнсийэннэн угуоххун баҕарар буоллаххына, манна баар ньыманы туһаныаххын сөп: [https://commons.wikimedia.org/wiki/Special:UploadWizard Биики Ыскылаакка угуу маастара].",
        "foreign-structured-upload-form-label-not-own-work-local-shared": "Өскө, {{SITENAME}} быраабылатынан угар сатанар буоллаҕына, кини [[Special:Upload|киллэрии тэрилин]] туһаныаххын эмиэ сөп.",
        "backend-fail-stream": "$1 билэни ыытар табыллыбата.",
        "backend-fail-backup": "Бу билэ $1 резервнэй куопуйатын оҥорор табыллыбата.",
        "index-category-desc": "Сирэйгэ <nowiki>__INDEX__</nowiki> диэн «аптаах тыл» баар эбит (сирэй ону көҥүллүүр аат далыгар баар эбит), онон көрдүүр роботтар кинини болҕомтоҕо ылыа да суох түгэннэргэ көрөллөр эбит.",
        "post-expand-template-inclusion-category-desc": "Халыыптары барытын көрдөрдөххө сирэй ыйааһына маны <code>$wgMaxArticleSize</code> куоһарыан сөп, онон сорҕото эрэ көрдөрүлүннэ.",
        "post-expand-template-argument-category-desc": "Халыып аргуменын арыйдахха (фигурнай ускуопка иһигэр баары, холобур, <code>{{{Foo}}})</code>, сирэй маннааҕар улахан буолуо: <code>$wgMaxArticleSize</code>.",
-       "expensive-parserfunction-category-desc": "СиÑ\80Ñ\8dйгÑ\8d Ð½Ð°Ò»Ð°Ð° Ñ\8dлбÑ\8dÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81анÑ\8b Ñ\81ииÑ\80 Ñ\84Ñ\83нкÑ\86иÑ\8f Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллÑ\83бÑ\83Ñ\82 (Ñ\85олобÑ\83Ñ\80, Ð¼Ð°Ð½Ð½Ñ\8bк <code>#ifexist</code>). Сиһилии — бу сирэйгэ: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
-       "broken-file-category-desc": "Ð\91Ñ\83 ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ð°Ð»Ò\95аÑ\81Ñ\82ааÑ\85 Ñ\81игÑ\8d Ð±Ð°Ð°Ñ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна Ñ\8dбиллÑ\8dÑ\80 (Ñ\81Ñ\83оÑ\85 Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dнии).",
-       "hidden-category-category-desc": "Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8dлÑ\8dÑ\8dÑ\85 ÐºÐ°Ñ\82егоÑ\80иÑ\8f <code><nowiki>__HIDDENCAT__</nowiki></code> ÐºÐ¸Ð½Ð¸Ð½Ð¸ ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81алааÑ\82Ñ\8bгаÑ\80 ÐºÓ©Ñ\81Ñ\82Ó©Ñ\80үн Ð±Ð¾Ð±ор.",
+       "expensive-parserfunction-category-desc": "СиÑ\80Ñ\8dйгÑ\8d Ð½Ð°Ò»Ð°Ð° Ñ\8dлбÑ\8dÑ\85 Ñ\80еÑ\81Ñ\83Ñ\80Ñ\81анÑ\8b Ñ\81ииÑ\80 Ñ\84Ñ\83нкÑ\86иÑ\8f Ñ\82Ñ\83Ñ\82Ñ\82Ñ\83ллÑ\83бÑ\83Ñ\82 (Ñ\85олобÑ\83Ñ\80, Ð¼Ð°Ð½Ð½Ñ\8bгÑ\8b <code>#ifexist</code>). Сиһилии — бу сирэйгэ: [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "СиÑ\80Ñ\8dй Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dÑ\82Ñ\8d Ð°Ð»Ò\95аÑ\81Ñ\82ааÑ\85 (Ñ\81Ñ\83оÑ\85 Ð±Ð¸Ð»Ñ\8dÒ\95Ñ\8d Ñ\81игÑ\8dнÑ\8dÑ\80).",
+       "hidden-category-category-desc": "Ð\9cаннÑ\8bк Ð±Ñ\8dлиÑ\8dлÑ\8dÑ\8dÑ\85 ÐºÐ°Ñ\82егоÑ\80иÑ\8f <code><nowiki>__HIDDENCAT__</nowiki></code> ÐºÐ¸Ð½Ð¸Ð½Ð¸ ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81алааÑ\82Ñ\8bн Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80игÑ\8dÑ\80 ÐºÓ©Ñ\81Ñ\82үбÑ\8dÑ\82 Ð¾Ò¥Ð¾Ñ\80ор.",
        "trackingcategories-nodesc": "Ойуулааһына суох.",
        "trackingcategories-disabled": "Араарыллыбыт категория",
        "mailnologin": "Аадырыһа суох",
        "emailccsubject": "Эн суругуҥ куоппуйата $1: $2",
        "emailsent": "Сурук барда",
        "emailsenttext": "Эн суругуҥ ыытылынна.",
-       "emailuserfooter": "Ð\91Ñ\83 Ñ\81Ñ\83Ñ\80Ñ\83к $2 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bга $1 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82Ñ\82ан Â«Ð¡Ñ\83Ñ\80Ñ\83кÑ\82а Ñ\8bÑ\8bÑ\82» Ð´Ð¸Ñ\8dн Ñ\84Ñ\83нкÑ\86иÑ\8f ÐºÓ©Ð¼Ó©Ñ\82үнÑ\8dн {{SITENAME}} Ñ\81аайÑ\82ан ыытыллыбыт.",
+       "emailuserfooter": "Ð\91Ñ\83 Ñ\81Ñ\83Ñ\80Ñ\83к $2 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bга $1 ÐºÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bÑ\82Ñ\82ан Â«Ð¡Ñ\83Ñ\80Ñ\83кÑ\82а Ñ\8bÑ\8bÑ\82» Ð´Ð¸Ñ\8dн Ñ\82Ñ\8dÑ\80ил ÐºÓ©Ð¼Ó©Ñ\82үнÑ\8dн {{SITENAME}} Ñ\81иÑ\82им-Ñ\81иÑ\80Ñ\82Ñ\8dн ыытыллыбыт.",
        "usermessage-summary": "Тиһилик биллэриитин хааллар.",
        "usermessage-editor": "Тиһилик биллэрээччитэ",
        "watchlist": "Кэтэбилим тиһигэ",
        "mywatchlist": "Кэтэбил тиһигэ",
        "watchlistfor2": "$1 $2 аналлаах",
        "nowatchlist": "Эн кэтиир сирэйдэриҥ суохтар.",
-       "watchlistanontext": "Кэтэбилиҥ сирэйин көрөргөр эбэтэр уларытаргар маны оҥор: $1.",
+       "watchlistanontext": "Кэтэбилиҥ сирэйин көрөргө эбэтэр уларытарга бэлиэ-аатынан киириэхтээххин.",
        "watchnologin": "Бэйэҕин билиһиннэр",
        "addwatch": "Кэтэбил тиһигэр киллэр",
-       "addedwatchtext": "«[[:$1]]» сирэй [[Special:Watchlist|кэтэбил тиһигэр]] киирдэ.\nСирэй уларытыылара уонна кинини кытта ситимнээх ырытыы сирэйин уларытыылара бүгүҥҥүттэн онно көстөр буолуохтара.",
+       "addedwatchtext": "«[[:$1]]» сирэй уонна кинини кытта ситимнээх ырытыы сирэйэ [[Special:Watchlist|кэтэбилиҥ тиһигэр]] киирдэ.",
        "addedwatchtext-short": "\"$1\" диэн сирэй кэтэбилиҥ тиһигэр эбилиннэ.",
        "removewatch": "Кэтэбил тиһигиттэн сот",
-       "removedwatchtext": "[[:$1]]\" сирэй [[Special:Watchlist|кэтэбилиҥ тиһигиттэн]] сотулунна.",
+       "removedwatchtext": "[[:$1]]\" сирэй уонна кини ырытыытын сирэйэ [[Special:Watchlist|кэтэбилиҥ тиһигиттэн]] сотулунна.",
        "removedwatchtext-short": "\"$1\" диэн сирэй кэтэбилиҥ тиһигиттэн сотулунна.",
        "watch": "Кэтээ",
        "watchthispage": "Бу сирэйи кэтээ",
        "watchlist-details": "Ырытыы сирэйдэрин аахпатахха {{PLURAL:$1|$1 сирэйи кэтиигин|$1 сирэй эн кэтэбилгэр сылдьар}}.",
        "wlheader-enotif": "Эл. почтанан биллэрии холбоммут.",
        "wlheader-showupdated": "Бүтэһик киирииҥ кэннэ уларыйбыт сирэйдэр '''модьу''' бичигинэн бэлиэтэннилэр.",
-       "wlnote": "Манна кэлиҥҥи {{PLURAL:$2|чаас|'''$2''' чаас}} иһигэр оҥоһуллубут бүтэһик $1 уларытыы көрдөрүлүннэ, бу кэмҥэ туругунан $3 $4.",
-       "wlshowlast": "бүтэһик $1 чааска $2 күҥҥэ  көрдөр",
+       "wlnote": "Манна кэлиҥҥи {{PLURAL:$2|чаас|<strong>$2</strong> чаас}} иһигэр оҥоһуллубут бүтэһик <strong>$1</strong> уларытыы көрдөрүлүннэ, бу кэминээҕи туругунан $3, $4.",
+       "wlshowlast": "Бүтэһик $2 күҥҥэ $1 чааска көрдөр",
+       "watchlistall2": "бары",
+       "wlshowtime": "Тиһэҕи көрдөр:",
+       "wlshowhideminor": "кыра суолталаах уларытыы",
+       "wlshowhidebots": "оруобат",
+       "wlshowhideliu": "бэлиэтэммит кыттааччы",
+       "wlshowhideanons": "ааттарын эппэтэх кыттааччы",
+       "wlshowhidepatr": "тургутуллубут уларытыы",
+       "wlshowhidemine": "бэйэм уларытыым",
        "watchlist-options": "Кэтээн көрүү туруоруутун уларытыы",
        "watching": "Кэтээ...",
        "unwatching": "Кэтээмэ...",
        "deletepage": "Сирэйи сот",
        "confirm": "Бигэргэтии",
        "excontent": "иһинээҕитэ: '$1'",
-       "excontentauthor": "иһинээҕитэ: «$1» (соҕотох ааптар [[Special:Contributions/$2|$2]])",
+       "excontentauthor": "иһинээҕитэ: «$1», соҕотох ааптар \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
        "exbeforeblank": "иһинээҕитэ сотуллуон иннинэ: '$1'",
        "delete-confirm": "Маны \"$1\" соторго",
        "delete-legend": "Сотуу",
-       "historywarning": "'''Сэрэтии''': Сотоору турар сирэйиҥ көрүллүбүт $1 {{PLURAL:$1|соҕотох барыллаах|барыллаах}} устуоруйалаах:",
+       "historywarning": "<strong>Сэрэтии</strong>: Сотоору турар сирэйиҥ $1 {{PLURAL:$1|соҕотох барыллаах|барыллаах}} устуоруйалаах:",
        "confirmdeletetext": "Эн сирэйи (ойууну) уонна кини устуоруйатын букатын сотоору гынаҕын.\nБука диэн, кырдьык инньэ гынаары гынаргын,\nбу дьайыы туох содуллаах буоларын толору билэргин\nуонна [[{{MediaWiki:Policy-url}}]] сиэрин кэспэккин бигэргэт.",
        "actioncomplete": "Дьайыы оҥоһулунна",
        "actionfailed": "Дьайыы оҥоһуллубата",
        "delete-edit-reasonlist": "Сотуу төрүөтүн уларытыы",
        "delete-toobig": "Бу сирэй уларытыыларын историята уһун, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маннык сирэйдэри сотор хааччахтанар, тоҕо диэххэ алҕас {{SITENAME}} алдьаныан сөп.",
        "delete-warning-toobig": "Бу сирэй уларыылара уһун историялаах, хас да ($1) {{PLURAL:$1|хат көрүүлээх|хат көрүүлэрдээх}}. Маны соттоххуна, {{SITENAME}} билэтин тиһигин алдьатыан сөп; салгыыр буоллаххына сэрэнэн үлэлээ.",
+       "deleteprotected": "Бу сирэйи, көмүскэллээх буолан, сотор кыаҕыҥ суох эбит.",
        "deleting-backlinks-warning": "'''Сэрэтии.''' Сотоору гынар сирэйгэр [[Special:WhatLinksHere/{{FULLPAGENAME}}|атын сирэйдэр]] сигэнэллэр эбит.",
        "rollback": "Уруккутугар төннөр",
        "rollbacklink": "төннөр",
        "sessionfailure-title": "Сиэссийэ алҕаһа",
        "sessionfailure": "Арааһа туох эрэ сатаммата, дьайыыҥ оҥоһуллубата. Браузергар \"Төнүн\" тимэҕи баттаа уонна бу иннинээҕи сирэйгин иккистээн киллэрэн көр.",
        "changecontentmodel": "Сирэй ис тутулун киэбин уларытыы",
+       "changecontentmodel-legend": "Сирэй иһинээҕитин моделын уларытыы",
        "changecontentmodel-title-label": "Сирэй баһа",
        "changecontentmodel-model-label": "Иһинээҕитин саҥа киэбэ",
        "changecontentmodel-reason-label": "Төрүөтэ:",
        "changecontentmodel-nodirectediting": "$1 иһинээҕитин киэбин быһа уларытар сатаммат эбит",
        "log-name-contentmodel": "Иһинээҕитин киэбин уларытыы сурунаала",
        "log-description-contentmodel": "Сирэй иһинээҕитин киэбин кытта ситимнээх",
+       "logentry-contentmodel-change": "$1 кыттааччы $3 сирэй иһинээҕитин мадьыалын мантан «$4» манна «$5» {{GENDER:$2|уларыппыт}}",
        "logentry-contentmodel-change-revertlink": "төннөрүү",
        "logentry-contentmodel-change-revert": "төннөрүү",
        "protectlogpage": "Харысхал сурунаала (көннөрүүттэн көмүскэммит билэлэр испииһэктэрэ)",
        "undeletepagetext": "Манна ыйыллыбыт {{PLURAL:$1|сирэй сотуллубут|$1 сирэй сотуллубуттар}} гынан баран архыыпка сыталлар.\nОнон оннуларыгар төннөрүөххүн сөп. Архыып кэмиттэн кэмигэр ыраастанар.",
        "undelete-fieldset-title": "Торумнары төнүннэр",
        "undeleteextrahelp": "Сирэйи барытын оннугар төннөрөргө тугу да бэлиэтээмэ уонна '''''{{int:undeletebtn}}''''' тимэҕи баттаа.\nСирэй сороҕун эрэ төннөрөр буоллаххына сирэй төннөрүллүөхтээх барылларын бэлиэтээ уонна '''''{{int:undeletebtn}}''''' тимэҕи баттаа.",
-       "undeleterevisions": "Архыыпка $1 {{PLURAL:$1|барыллаах|барыл баар}}",
+       "undeleterevisions": "$1 {{PLURAL:$1|сотуллубут торумнаах|сотуллубут торум баар}}",
        "undeletehistory": "Сирэйи төннөрдөххүнэ уларытыытын устуоруйата барыта төннөрүллүө.\nСотуллубутун кэннэ маннык ааттаах атын сирэй оҥоһуллубут түбэлтэтигэр төннөрүллүбүт торумнар уларытыы сурунаалыгар саҥа суруктар иннилэригэр суруллуохтара.",
        "undeleterevdel": "Бу дьайыы сирэй эбэтэр билэ бүтэһик торумун сороҕун сотор кыахтаах буоллаҕына, оҥоһуллуо суоҕа.\nОннук түбэлтэҕэ эн бэлиэни устуохтааххын, эбэтэр бүтэһик сотуллубут торумнары көрдөрүөхтээххин.",
        "undeletehistorynoadmin": "Ыстатыйа сотуллубут.\nСотуу төрүөтэ уонна ыстатыйаны суруйбут кыттааччылар испииһэктэрэ манна көрдөрүлүннэ.\nСотуллубут ыстатыйа ис хоһоонун дьаһабыллар эрэ көрүөхтэрин сөп.",
        "move-page-legend": "Аатын уларытыы",
        "movepagetext": "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.\nБу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.\nУрукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.\nУрукку аакка ыйынньыктары аптамаатынан уларытыаххын сөп.\nИнньэ гыммат буоллаххына, бука диэн [[Special:DoubleRedirects|хос ыйынньыктар]] уонна [[Special:BrokenRedirects|быстыбыт сигэниилэр]] баалларын-суохтарын көр.\nСиэр быһыытынан ыйынньыктар сөпкө сигэнэллэрин эн ситиһиэхтээххин.\n\nӨскө маннык ааттаах сирэй номнуо баар буоллаҕына сирэй аата '''уларыйыа суоҕа''', арай ол сирэй кураанах эбэтэр утаарар сирэй буолбатах буоллаҕына.\nОл аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп, ол гынан баран баар сирэйи алҕас сотор кыаҕыҥ суох.\n\n'''Сэрэтии!'''\n''Элбэхтик туһаныллар'' сирэй аатын уларытыы бөдөҥ уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.\nОнон, бука диэн, салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
        "movepagetext-noredirectfixer": "Манна баар форманы туһанан сирэй аатын уларытыаххын сөп.\nБу түбэлтэҕэ уларытыы сурунаала саҥа сиргэ көһөр.\nУрукку аат саҥа сирэйгэ утаарар сирэйгэ кубулуйар.\nБука диэн [[Special:DoubleRedirects|хос ыйынньыктар]] уонна [[Special:BrokenRedirects|быстыбыт сигэниилэр]] баалларын көр.\nСигэлэр сөпкө ыйалларын эн ситиһиэхтээххин.\n\nӨскө маннык ааттаах сирэй хайыы-үйэ баар буоллаҕына сирэй аата '''уларыйыа суоҕа''', арай ол сирэй кураанах эбэтэр утаарар сирэй буолбатах буоллаҕына.\nОл аата эн сирэй аатын сыыһа уларыппыт буоллаххына төттөрү урукку аатыгар төннөрүөххүн сөп гынан баран, баар сирэйи алҕас сотор кыаҕыҥ суох.\n\n'''СЭРЭТИИ!'''\nСирэй аатын уларытыы улахан уонна эрдэттэн өйдөммөтөх содуллаах буолуон сөп.\nОнон, бука диэн салгыаҥ иннинэ үчүгэйдик толкуйдаа.",
-       "movepagetalktext": "ХолбонÑ\83ллÑ\83бÑ\83Ñ\82 Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b (бааÑ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна) Ñ\8dмиÑ\8d Ð°Ð°Ñ\82Ñ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bа. Ð\9eл Ñ\81аÑ\82аммаÑ\82 Ñ\82үбÑ\8dлÑ\82Ñ\8dлÑ\8dÑ\80Ñ\8d:\n*Ð\9cаннÑ\8bк Ð°Ð°Ñ\82Ñ\82ааÑ\85 ÐºÑ\83Ñ\80аанаÑ\85 Ð±Ñ\83олбаÑ\82аÑ\85 Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ð±Ð°Ð°Ñ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна\n*Ð\9cанна Ð±Ñ\8dлиÑ\8d Ñ\82Ñ\83Ñ\80Ñ\83оÑ\80баÑ\82аÑ\85Ñ\85Ñ\8bна.\n\nÐ\98Ñ\82и Ñ\82үгÑ\8dннÑ\8dÑ\80гÑ\8d Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и Ð±Ñ\8dйÑ\8dÒ¥ ÐºÓ©Ò»Ó©Ñ\80Ò¯Ó©Ñ\85Ñ\82Ñ\8dÑ\8dÑ\85Ñ\85ин Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\85олбÑ\83оÑ\85Ñ\82ааÑ\85Ñ\85Ñ\8bн.",
+       "movepagetalktext": "Ð\91Ñ\8dлиÑ\8dÑ\82Ñ\8dÑ\8dÑ\82Ñ\8dÑ\85Ñ\85инÑ\8d Ð¼Ð°Ð½Ñ\8b ÐºÑ\8bÑ\82Ñ\82а Ñ\81иÑ\82имнÑ\8dÑ\8dÑ\85 Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ñ\8dмиÑ\8d Ð°Ð°Ñ\82Ñ\8bн Ñ\83лаÑ\80Ñ\8bÑ\82Ñ\8bа. Ð\9eл Ñ\81аÑ\82аммаÑ\82 Ñ\82үбÑ\8dлÑ\82Ñ\8dÑ\82Ñ\8d: Ð\9cаннÑ\8bк Ð°Ð°Ñ\82Ñ\82ааÑ\85 ÐºÑ\83Ñ\80аанаÑ\85 Ð±Ñ\83олбаÑ\82аÑ\85 Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ð±Ð°Ð°Ñ\80 Ð±Ñ\83оллаÒ\95Ñ\8bна.\n\nÐ\9eннÑ\83к Ñ\82үгÑ\8dÒ¥Ò¥Ñ\8d Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80и Ð±Ñ\8dйÑ\8dÒ¥ ÐºÓ©Ò»Ó©Ñ\80Ò¯Ó©Ñ\85Ñ\85үн Ñ\8dбÑ\8dÑ\82Ñ\8dÑ\80 Ñ\85олбÑ\83оÑ\85Ñ\85Ñ\83н Ñ\81өп.",
        "moveuserpage-warning": "'''Болҕой:''' Эн кыттааччы тус сирэйин аатын уларытаары гынныҥ. Инньэ гыннаххына сирэй аата эрэ уларыйыа, кыттааччы бэйэтин аата уларыйыа '''суоҕа'''.",
        "movecategorypage-warning": "<strong>Сэрэтии:</strong> Категория сирэйин көһөрөөрү гынныҥ. Бука диэн, өйдөө, бу эрэ сирэй көһүө, эргэ категория атын сирэйдэрэ саҥа категорияҕа <em>киириэхтэрэ суоҕа</em>.",
        "movenologintext": "Эн аакын [[Special:UserLogin|билиһиннэрдэххинэ]] эрэ сирэй аатын уларытар кыахтаныаҥ.",
        "movenosubpage": "Бу сирэй алын сирэйэ суох.",
        "movereason": "Төрүөтэ:",
        "revertmove": "төннөрүү",
-       "delete_and_move": "Суох гын уонна аатын уларыт",
        "delete_and_move_text": "==Сотуохха наада==\n\nМаннык ааттаах сирэй [[:$1|«$1»]] бэлиэр баар. Эн ону суох гынан баран аатын уларытаары гынаҕын дуо?",
        "delete_and_move_confirm": "Сөп, бу сирэйи суох гын",
        "delete_and_move_reason": "Аатын уларытаары сотулунна \"[[$1]]\"",
        "import-error-special": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ кини угуллубут аатын далыгар саҥа сирэйдэри оҥорор көҥүллэммэт эбит.",
        "import-error-invalid": "\"$1\" сирэй импортаммата, тоҕо диэтэххэ маннык аат туттуллара бу биикигэ бобуулаах.",
        "import-error-unserialize": "«$1» сирэй $2 барыла структуураланар (десериализация) кыаҕа суох. Барылга иһинээҕитин модела маннык: $3, маннык серияланар: $4.",
+       "import-error-bad-location": "$2 уларытыы, $3 мадьыалы туһанар буолан бу биики «$1» сирэйигэр бигэргэтиллэр кыаҕа суох эбит, тоҕо диэтэххэ ити мадьыал бу сирэйгэ өйөнүллүбэт.",
        "import-options-wrong": "Алҕастаах {{PLURAL:$2|опция|опциялар}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Тирэх сирэй ыйыллыбыт аата алҕастаах.",
        "import-rootpage-nosubpage": "\"$1\" тирэх сирэй аатын далыгар сирэй үөдүҥнэрэ (подстраницалар) көҥүллэммэттэр",
        "importlogpage": "Импорт сурунаала",
        "importlogpagetext": "Сирэйдэри историяларын кытта холбуу атын биикилэртэн импортааһын.",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|барыл|барыл баар}}",
-       "import-logentry-interwiki-detail": "баÑ\80Ñ\8bÑ\82а $2 Ð±Ð°Ñ\80Ñ\8bлÑ\82ан $1 Ð±Ð°Ñ\80Ñ\8bл",
+       "import-logentry-upload-detail": "$1 {{PLURAL:$1|барыл угулунна|барылы уктубут}}",
+       "import-logentry-interwiki-detail": "Ð\91аÑ\80Ñ\8bÑ\82а $2 Ð±Ð°Ñ\80Ñ\8bлÑ\82ан $1 Ð±Ð°Ñ\80Ñ\8bл Ñ\83гÑ\83лÑ\83нна",
        "javascripttest": "JavaScript тургутуу",
        "javascripttest-pagetext-noframework": "Бу сирэй JavaScript тургутууларга анаммыт.",
        "javascripttest-pagetext-unknownframework": "\"$1\" тургутуу биллибэт эйгэтэ.",
+       "javascripttest-pagetext-unknownaction": "Биллибэт дьайыы «$1».",
        "javascripttest-pagetext-frameworks": "Бука диэн, бу тургуутуу эйгэлэриттэн биирин тал: $1",
        "javascripttest-pagetext-skins": "Тургутууну ыытарга тас көрүҥүн бастаан тал:",
        "javascripttest-qunit-intro": "[$1 тургутуу документациятын] манна mediawiki.org көр.",
        "tooltip-feed-atom": "Atom бу сирэйгэ",
        "tooltip-t-contributions": "Бу кыттааччы уларыппыт сирэйдэрин испииһэгэ",
        "tooltip-t-emailuser": "Бу киһиэхэ сурук ыытарга",
+       "tooltip-t-info": "Бу сирэй туһунан сиһилии",
        "tooltip-t-upload": "Билэлэри суруттарыы",
        "tooltip-t-specialpages": "Анал сирэйдэр испииһэктэрэ",
        "tooltip-t-print": "Сирэй бэчээккэ ыытыллар торума",
        "pageinfo-robot-index": "Көҥүллэммит",
        "pageinfo-robot-noindex": "Араарыллыбыт",
        "pageinfo-watchers": "Кэтээнэр сирэйдэр ахсааннара",
+       "pageinfo-visiting-watchers": "Сирэйи кэтиир уонна тиһэх көннөрүүлэри көрбүт дьон ахсаана",
        "pageinfo-few-watchers": "$1 кыттааччыттан аҕыйах кэтээччи",
+       "pageinfo-few-visiting-watchers": "Сирэйи кэтиир уонна тиһэх уларыйыылары көрбүт да, атын да кыттааччылар буолуохтарын сөп",
        "pageinfo-redirects-name": "Бу сирэйгэ утаарыы ахсаана",
        "pageinfo-subpages-name": "Сирэй аннынааҕы сирэйдэр ахсааннара",
        "pageinfo-subpages-value": "$1 ($2 утаарыы; $3 көннөрү (утаарыыта суох))",
        "pageinfo-protect-cascading-yes": "Сөп",
        "pageinfo-protect-cascading-from": "Каскадынан көмүскэл мантан",
        "pageinfo-category-info": "Категория туһунан",
+       "pageinfo-category-total": "Бары",
        "pageinfo-category-pages": "Сирэй ахсаана",
        "pageinfo-category-subcats": "Субкатегория ахсаана",
        "pageinfo-category-files": "Билэ ахсаана",
        "svg-long-error": "Алҕастаах SVG-билэ: $1",
        "show-big-image": "Билэ бэйэтэ",
        "show-big-image-preview": "Бигэргэтиэх иннинэ көрүү улахана: $1.",
+       "show-big-image-preview-differ": "Бу $3-превью $2-билэҕэ анаммыт кээмэйэ: $1.",
        "show-big-image-other": "Атын {{PLURAL:$2|түмүк|түмүктэр}}: $1.",
        "show-big-image-size": "$1 × $2 пииксэл",
        "file-info-gif-looped": "хатаммыт (бобуллубут)",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ырытыы]])",
        "duplicate-defaultsort": "Болҕой: Наардааһын «$2» күлүүһэ урукку «$1» күлүүһү сабар (Ключ сортировки переопределяет прежний ключ).",
        "duplicate-displaytitle": "<strong>Болҕой:</strong> Көрдөрүллүбүт «$2» аат урут көрдөрүллүбүт «$1» ааты уларытар.",
+       "invalid-indicator-name": "<strong>Алҕас:Сирэй туругун көрдөрөр индикатор </strong> атрибута <code>name</code> кураанах буолуо суохтаах.",
        "version": "MediaWiki барыла (биэрсийэтэ)",
        "version-extensions": "Туруоруллубут расширениялар",
        "version-skins": "Туруоруллубут тас көстүү барыллара",
        "tags-create-invalid-chars": "Бэлиэ аатыгар сопутуой (<code>,</code>) эбэтэр слэш  (<code>/</code>) буолуохтаах.",
        "tags-create-invalid-title-chars": "Тиэк аатыгар сирэй баһыгар туттуллуо суохтаах бэлиэ киириэ суохтаах",
        "tags-create-already-exists": "«$1» тиэк хайыы-үйэ баар эбит.",
+       "tags-create-warnings-above": "«$1» тиэги оҥорорго маннык {{PLURAL:$2|сэрэтии көһүннэ|сэрэтиилэр көһүннүлэр}}:",
+       "tags-create-warnings-below": "Тиэги салгыы оҥоруоххун баҕараҕын дуо?",
+       "tags-delete-title": "Тиэги сот",
+       "tags-delete-explanation-initial": "«$1» тиэги билии олоҕуттан сотон эрэҕин.",
+       "tags-delete-explanation-in-use": "Кини билигин туттуллар {{PLURAL:$2|$2 барылыттан биитэр сурунаалыттан|бары $2 барылларыттан уонна/биитэр сурунаалга суруллубуттартан}} сотуллуо.",
+       "tags-delete-explanation-warning": "Бу дьайыыны <strong>төннөрөр кыаҕыҥ суох</strong> буолуо, оннооҕор дьаһабыл <strong>төннөрөр кыаҕа суох</strong> буолуо. Сөпкө сотобун диэн эрэллээх буолуохтааххын.",
+       "tags-delete-explanation-active": "<strong>«$1» тиэк билигин да туттуллар.</strong> Ону хааччахтыыр туһуттан тиэк туттуллар сиригэр тиийэн онно бэйэтигэр араарыахтааххын.",
        "tags-delete-reason": "Төрүөтэ:",
        "tags-delete-submit": "Бу тиэги букатыннаахтык сот",
+       "tags-delete-not-allowed": "Кэҥэтии (расширение) бэлиэтээбит тикэтэрин сотор кыах суох, арай кэҥэтии бэйэтэ көҥүллүүр эрэ буоллаҕына ол сатаныа.",
+       "tags-delete-not-found": "Маннык $1 бэлиэ суох эбит.",
+       "tags-delete-too-many-uses": "«$1» тиэк $2 торумтан ордукка туттуллар, ол аата сотуллар кыаҕа суох.",
+       "tags-delete-warnings-after-delete": "«$1» тиэк сотулунна, ол эрээри {{PLURAL:$2|маннык сэрэтии|маннык сэрэтиилэр}} көһүннүлэр:",
        "tags-activate-title": "Тиэги холбоо",
+       "tags-activate-question": "\"$1\" тиэги холбоон эрэҕин.",
        "tags-activate-reason": "Төрүөтэ:",
+       "tags-activate-not-allowed": "\"$1\" тиэги холбуур табыллыбат.",
+       "tags-activate-not-found": "Маннык $1 тиэк суох эбит.",
        "tags-activate-submit": "Холбоо",
        "tags-deactivate-title": "Тиэги араар",
        "tags-deactivate-question": "\"$1\" тиэги арааран эрэҕин.",
        "tags-deactivate-reason": "Төрүөтэ:",
        "tags-deactivate-not-allowed": "\"$1\" тиэги араарар табыллыбат.",
        "tags-deactivate-submit": "араар",
+       "tags-apply-no-permission": "Бэйэҥ уларытыыгар уларытыы тиэгин туруорар кыаҕыҥ суох эбит.",
+       "tags-apply-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
+       "tags-apply-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
+       "tags-update-no-permission": "Сурунаал тус-туспа торумнарын уонна суруктарын тиэгин эбэр уонна уларытар кыаҕыҥ суох эбит.",
+       "tags-update-add-not-allowed-one": "«$1» тиэги илииннэн туруорар табыллыбат эбит.",
+       "tags-update-add-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн угуллубат|тиэктэр илиинэн угуллубаттар}}: $1",
+       "tags-update-remove-not-allowed-one": "«$1» тиэги сотор табыллыбат эбит.",
+       "tags-update-remove-not-allowed-multi": "Маннык {{PLURAL:$2|тиэк илиинэн сотуллубат|тиэктэр илиинэн сотуллубаттар}} эбит: $1",
        "tags-edit-title": "Тиэктэри уларытыы",
        "tags-edit-manage-link": "Тиэктэри дьаһайыы",
+       "tags-edit-revision-selected": "{{PLURAL:$1|Талыллыбыт торума|Талыллыбыт торумнара}} [[:$2]]:",
+       "tags-edit-logentry-selected": "{{PLURAL:$1|Талыллыбыт дьайыыта|Талыллыбыт дьайыылара}}:",
+       "tags-edit-revision-legend": "{{PLURAL:$1|Бу торумҥа|Бары $1 торумҥа}} тиэги угуу эбэтэр онтон сотуу",
+       "tags-edit-logentry-legend": "Сурунаал {{PLURAL:$1|суругуттан|$1 бары суруктарыттан}} тиэги сот биитэр онно киллэр",
        "tags-edit-existing-tags": "Баар тиэктэр:",
        "tags-edit-existing-tags-none": "''Суох''",
        "tags-edit-new-tags": "Саҥа тиэктэр:",
        "tags-edit-chosen-placeholder": "Биир эбэтэр хас да тиэги тал",
        "tags-edit-chosen-no-results": "Сөп түбэһэр тиэк көстүбэтэ",
        "tags-edit-reason": "Төрүөтэ:",
+       "tags-edit-revision-submit": "Уларытыылары бу {{PLURAL:$1|торумҥа|$1 торумнарга}} тарҕат",
+       "tags-edit-logentry-submit": "Уларытыылары сурунаал бу {{PLURAL:$1|суругар|$1 суруктарыгар}} тарҕат",
+       "tags-edit-success": "Уларытыы сөпкө бигэргэннэ.",
+       "tags-edit-failure": "Уларытыылары туттар табыллыбата.\n$1",
+       "tags-edit-nooldid-title": "Торум чопчу ыйыллыбата",
+       "tags-edit-nooldid-text": "Ханнык торумҥа туттулларын талбатаххын, биитэр талбыт торумуҥ суох эбит.",
+       "tags-edit-none-selected": "Бука диэн биир эмит тиэги тал.",
        "comparepages": "Сирэйдэри тэҥнииргэ",
        "compare-page1": "Бастакы сирэй",
        "compare-page2": "Иккис сирэй",
        "htmlform-cloner-create": "Өссө эп",
        "htmlform-cloner-delete": "Сот",
        "htmlform-cloner-required": "Саатар биирин толоруохтаах эбиккин.",
+       "htmlform-title-badnamespace": "[[:$1]] бу аат далыгар киирбэт эбит «{{ns:$2}}».",
        "htmlform-title-not-creatable": "«$1» оҥоһуллар сирэй аата буолбатах",
-       "htmlform-title-not-exists": "[[:$1]] суох.",
+       "htmlform-title-not-exists": "$1 суох.",
        "htmlform-user-not-exists": "<strong>$1</strong> суох.",
+       "htmlform-user-not-valid": "<strong>$1</strong> — маннык аат сатаммат.",
        "sqlite-has-fts": "$1 толору тиэкистээх көрдөөһүнү өйүүр",
        "sqlite-no-fts": "$1 толору тиэкистээх көрдөөһүнү өйөөбөт",
        "logentry-delete-delete": "$3 сирэйи $1 соппут",
        "revdelete-uname-unhid": "кыттааччы аата көстөр буолбут",
        "revdelete-restricted": "хааччахтааһын администраатардарга сыһыаннаах",
        "revdelete-unrestricted": "хааччахтааһын админстраатардартан уһулунна",
+       "logentry-block-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччахтаабыт}}",
+       "logentry-block-unblock": "$1 {{GENDER:$2|хааччаҕын суох гыммыт}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
+       "logentry-suppress-block": "$1 маннык болдьоххо $5 $6 {{GENDER:$4|$3}} {{GENDER:$2|хааччаҕын суох гыммыт}}",
+       "logentry-suppress-reblock": "$1 хааччах болдьоҕун {{GENDER:$4|$3}} манныкка $5 $6 {{GENDER:$2|уларыппыт}}",
+       "logentry-import-upload": "$1 {{GENDER:$2|киллэрбит}} $3 билэни хачайдыыр ньыманнан",
+       "logentry-import-interwiki": "$1 {{GENDER:$2|киллэрбит}} $3 атын биикиттэн",
+       "logentry-merge-merge": "$1 {{GENDER:$2|холбообут}} мантан $3 манна $4 ($5 диэри торумнара)",
        "logentry-move-move": "$1 $3 сирэй аатын маннык $4 уларыппыт",
        "logentry-move-move-noredirect": "$3 сирэй аатын $1 маннык $4 уларыппыт, утаарыы-сирэй хаалларбатах",
        "logentry-move-move_redir": "$3 сирэйи $1 диэн кыттааччы манныкка $4  уларыппыт (утаарыы үрдүнэн)",
        "logentry-newusers-create2": "$3 кыттааччы аатын $1 бэлиэтээтэ",
        "logentry-newusers-byemail": "$3 бэлиэ-ааты $1 оҥорбут, киирии тыла электрон почтанан ыытыллыбыт",
        "logentry-newusers-autocreate": "$1 бэлиэ-аат аптамаатынан бэлиэтэннэ",
+       "logentry-protect-move_prot": "$1 көмүскэл нарылааһынан мантан $4 манна $3 {{GENDER:$2|көһөрбүт}}",
+       "logentry-protect-unprotect": "$1 мантан $3 көмүскэли {{GENDER:$2|суох гыммыт}}",
+       "logentry-protect-protect": "$1 {{GENDER:$2|көмүскээтэ}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|көмүскээбит}} $3 $4 [каскаадынан]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|уларыппыт}}: $3 $4 көмүскэлин таһымын (каскаадынан)",
        "logentry-rights-rights": "$3 бөлөхтөргө киириитин $1 уларыппыт: манныктан $4 манныкка $5",
        "logentry-rights-rights-legacy": "$3 бөлөхтөргө киириитин $1 уларыппыт",
        "logentry-rights-autopromote": "$1 мантан $4 манна $5 көһөрүллүбүт",
        "logentry-upload-upload": "$1 {{GENDER:$2|укпут}} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2|киллэрбит}}: $3 саҥа торумун",
+       "logentry-upload-revert": "$1 {{GENDER:$2|укпут}}: $3",
        "log-name-managetags": "Тиэктэр сурунааллара",
+       "log-description-managetags": "Бу сирэйгэ [[Special:Tags|тиэктэри]] уларытары кытта ситимнээх соруктар көстөллөр. Сурунаалга дьаһабыл илиитинэн эрэ оҥорбут дьайыылара бааллар. Тиэктэри биики бырагырааматын көмөтүнэн манна бэлиэтээбэккэ эрэ эмиэ уларытыахха сөп.",
+       "logentry-managetags-create": "\"$4\" тиэги $1 {{GENDER:$2|оҥорбут}}",
+       "logentry-managetags-delete": "\"$4\" тиэги $1 {{GENDER:$2|соппут}} (мантан $5 {{PLURAL:$5|торумтан биитэр сурунаалтан}})",
+       "logentry-managetags-activate": "$1 \"$4\" тиэги кыттааччылар уонна буоттар тутталларыгар  {{GENDER:$2|арыйбыт}}",
+       "logentry-managetags-deactivate": "$1 \"$4\" тиэги кыттааччылар уонна буоттар туһамматтарын курдук {{GENDER:$2|гыммыт}}",
+       "log-name-tag": "Тиэк сурунаала",
+       "log-description-tag": "Бу сирэй кыттааччылар [[Special:Tags|тиэктэри]] хаһан эппиттэрин биитэр соппуттарын көрдөрөр. Тиэги атын уларытыы, сотуу <strong>иһинэн</strong> оҥордоххо манна көстүбэт.",
        "rightsnone": "(суох)",
        "revdelete-summary": "уларытыылар туһунан",
        "feedback-adding": "Сирэй туһунан санаа этии...",
        "feedback-bugornote": "Туох кыһалҕаны көрсүбүккүн сиһилии суруйар кыахтаах буоллаххына, бука диэн [$1 алҕас туһунан биллэр].\nОл сатаммат буоллаҕына бу судургу форманы толор. Эн этииҥ ааккын уонна туһанар браузерыҥ аатын кытта манна «[$3 $2]» бэчээттэниэ.",
        "feedback-cancel": "Салҕаама",
        "feedback-close": "Сатанна",
+       "feedback-external-bug-report-button": "Тех. садаанньаны ыытыы",
        "feedback-dialog-title": "Санааҕын ыыт",
+       "feedback-dialog-intro": "Санааҕын этэргэ аллара баар судургу форманы туһаныаххын сөп. Оччоҕо Эн аатыҥ уонна этииҥ «$1» сирэйгэ эбиллиэ.",
        "feedback-error-title": "Алҕас",
        "feedback-error1": "Алҕас: API биллибэт түмүгэ",
        "feedback-error2": "Алҕас: Көннөрүү сатаммата",
        "feedback-error3": "Алҕас: API хоруйдаабата",
+       "feedback-error4": "Алҕас: Ыйыллыбыт ааттаах суругу бэчээттиир табыллыбата",
        "feedback-message": "Сурук:",
        "feedback-subject": "Тиэмэ:",
        "feedback-submit": "Ыыт",
+       "feedback-terms": "Ыытар сурукпар мин браузерым уонна эпэрээсийэлиир систиэмэм туһунан сибидиэнньэлэр бэчээттэнэллэрин уонна дьоҥҥо аһаҕастык көстүөхтэрин өйдүүбүн.",
+       "feedback-termsofuse": "Туһаныы усулуобуйатынан миигиттэн информация барарын утарбаппын.",
        "feedback-thanks": "Махтал! Эн санааҥ бу сирэйгэ \"[$2 $1]\" сурулунна.",
        "feedback-thanks-title": "Махтал!",
        "feedback-useragent": "Браузерым:",
        "api-error-stashfailed": "Ис алҕас: сиэрбэр быстах кэмҥэ оҥоһуллубут билэни кыайан бигэргэппэтэх.",
        "api-error-publishfailed": "Ис алҕас: сиэрбэр быстах билэни кыайан бигэргэппэтэх.",
        "api-error-stasherror": "Билэни угарга алҕас таҕыста.",
+       "api-error-stashedfilenotfound": "Хачайданыахтаах билэ быстах уурар сиргэ көстүбэтэ.",
+       "api-error-stashpathinvalid": "Билэ сытыахтаах быстах уурар сирин суола алҕастаах.",
+       "api-error-stashfilestorage": "Билэни быстах угар сиргэ угарга алҕас таҕыста.",
+       "api-error-stashzerolength": "Сиэрбэр билэни быстах угар сиргэ харайар кыаҕа суох, тоҕо диэтэххэ уһуна нуул.",
+       "api-error-stashnotloggedin": "Билэни быстах сиргэ харайарга бастаан ааккынан киириэхтээххин.",
+       "api-error-stashwrongowner": "Арыйа сатаабыт билэҥ эйиэнэ буолбатах эбит.",
+       "api-error-stashnosuchfilekey": "Быстах уурар сиргэ сытар билэҕэ киирэ сатаабыт күлүүһүҥ суох эбит.",
        "api-error-timeout": "Сиэрбэр кэтэһэр кэмҥэ хоруйдаабата.",
        "api-error-unclassified": "Биллибэт алҕас таҕыста",
        "api-error-unknown-code": "Биллибэт алҕас: «$1»",
        "limitreport-title": "Анализатор дааннайдара:",
        "limitreport-cputime": "Процессору туһаныы",
        "limitreport-cputime-value": "$1 сөкүүндэ",
+       "limitreport-walltime": "Тута көрдөрөр эрэсиим",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}}",
        "limitreport-ppvisitednodes": "Препроцессор көрбүт сирдэрин ахсаана",
        "limitreport-ppgeneratednodes": "Препроцессор оҥорбут түмүктэрин (node) ахсаана",
        "expand_templates_generate_xml": "XML-ы мас курдук көрдөр",
        "expand_templates_generate_rawhtml": "HTML-ы көрдөр",
        "expand_templates_preview": "Холоон көрүү",
+       "expand_templates_preview_fail_html": "<em>raw HTML холбоно сылдьар {{SITENAME}} ситим-сир сиэссийэтин сүтэрэн кэбиспит буолан, эрдэ көрүү сатаммат, бу JavaScript-атаакаттан көмүскэнэр ньыма.</em>\n\n<strong>Эрдэ көрөрүҥ буортуну аҕалбат буоллаҕына хатылаан көр.</strong>\nСин биир сатамматаҕына [[Special:UserLogout|үлэҕин түмүктээ]] уонна хат киирэн көр.",
+       "pagelanguage": "Сирэй тылын талыы",
        "pagelang-name": "Сирэй",
        "pagelang-language": "Омугун тыла",
        "pagelang-use-default": "Сүрүн тылы тутун",
        "right-pagelang": "Сирэй тылын уларыт",
        "action-pagelang": "сирэй тылын уларытар буол",
        "log-name-pagelang": "Тылы уларытыы сурунаала",
+       "log-description-pagelang": "Сирэй тылын талыы сурунаала.",
+       "logentry-pagelang-pagelang": "$1 кыттааччы $3 сирэй тылын мантан $4 манныкка $5 {{GENDER:$2|уларыппыт}}.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (холбоммут)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''арахсыбыт''')",
        "mediastatistics": "Миэдьийэ ыстатыыстыката",
+       "mediastatistics-summary": "Киирбит билэ көрүҥүн ыстатыыстыката. Билэ тиһэх эрэ торумун көрдөрөр. Урукку уонна сотуллубут билэлэр ааҕыллыбаттар.",
        "mediastatistics-nbytes": "$1 баайт ($2; $3%)",
        "mediastatistics-table-mimetype": "MIME көрүҥэ",
        "mediastatistics-table-extensions": "Туһаныллыан сөптөөх кэҥэтиилэр",
        "special-characters-title-minus": "минус бэлиэтэ",
        "mw-widgets-dateinput-no-date": "Күнэ-дьыла ыйыллыбатах",
        "mw-widgets-titleinput-description-new-page": "сирэй суох эбит",
-       "mw-widgets-titleinput-description-redirect": "манна $1 утаарыы"
+       "mw-widgets-titleinput-description-redirect": "манна $1 утаарыы",
+       "api-error-blacklisted": "Бука диэн өйдөнөр аатта тал дуу."
 }
index 3748b83..c81d0e5 100644 (file)
@@ -12,7 +12,7 @@
                        "Taxandru"
                ]
        },
-       "tog-underline": "Sutalìnia sos ligàmenes",
+       "tog-underline": "Sutalìnia sos ligòngios",
        "tog-hideminor": "Cua is acontzos minores in sa pàgina de is ùrtimas mudàntzias",
        "tog-hidepatrolled": "Cua is mudas verificadas in is ùrtimos càmbios",
        "tog-newpageshidepatrolled": "Cua sas pàginas verificadas dae sa lista de sas pàginas noas",
        "badarticleerror": "Operatzione non cunsentida pro custa pàgina.",
        "cannotdelete": "No est istadu possìbile a burrare sa pàgina o su file \"$1\".\nPodet èsser stadu burradu dae calicunu àteru.",
        "cannotdelete-title": "Impossìbile burrare sa pàgina \"$1\"",
-       "delete-hook-aborted": "Sa burradura est istada annullada dae su hook de s'estensione.\nNo est istadu dadu acrarimentu.",
+       "delete-hook-aborted": "Sa burradura est istada annullada dae su hook de s'estensione.\nNo est istadu datu acrarimentu.",
        "no-null-revision": "Non si podet creare una versione lulla pro sa pàgina \"$1\"",
        "badtitle": "Tìtulu malu",
        "badtitletext": "Su tìtulu de sa pàgina chi as pregontadu est bùidu, isballiadu, o iscritu in is cullegamentus inter-wiki a manera non currègia.\nPodet cuntènnere uno o unos cantos caràteres no ammìtidos pro is tìtulos.",
        "createaccountreason": "Motivu:",
        "createacct-reason": "Motivu",
        "createacct-reason-ph": "Pro ite ses creende un àteru contu",
-       "createacct-captcha": "Còmpudu de siguresa",
-       "createacct-imgcaptcha-ph": "Inseri su testu chi ses bidende in artu",
        "createacct-submit": "Crea su contu tuo",
        "createacct-another-submit": "Crea un àteru contu",
        "createacct-benefit-heading": "{{SITENAME}} est òpera de gente che tue.",
        "passwordreset-emailtitle": "Particulares de s'impitadore in {{SITENAME}}",
        "passwordreset-emailelement": "Nùmene utente: \n$1\n\nPassword temporànea: \n$2",
        "changeemail": "Càmbia indiritzu email",
+       "changeemail-header": "Càmbia s'indirìtzu email de su contu",
        "changeemail-oldemail": "Indiritzu email atuale:",
        "changeemail-newemail": "Indiritzu email nou:",
        "changeemail-none": "(nudda)",
        "notanarticle": "Custa pàgina no est unu artìculu",
        "watchlist-details": "Tenes {{PLURAL:$1|$1 pàgina annotada paris a sa pagina de cuntierra sua|$1 pàginas annotadas paris a is pàginas de cuntierra issoro}}.",
        "wlshowlast": "Ammustra is ùrtimas $1 oras, $2 dies",
+       "watchlistall2": "totu",
        "watchlist-options": "Optziones subra sa lista de pàginas annotadas",
        "watching": "Giunghende a sa watchlist...",
        "unwatching": "Boghende dae sa watchlist...",
        "move-page-legend": "Movimentu pàgina",
        "movepagetext": "Cun custu mòdellu podes renumenare una pàgina, movende totu sa stòria sua a sa pàgina noa.\nSu tìtulu bèciu at a diventare una pàgina de reindiritzamentu a su tìtulu nou.\nPodes agiornare automaticamente is redirects ca ligant a su tìtulu originàriu.\nSi sèberas de no, assicura·ti de controllare pro [[Special:DoubleRedirects| reindiritzaduras dòpias]] o [[Special:BrokenRedirects|sballiadas]].\nSes responsàbile de t'assigurare ca is cullegamentos sighint a puntare  a ue depent puntare.\n\nAnnota ca sa pàgina <strong>non</strong> s'at a mòver si nde esistit giai un'àtera a su tìtulu nou, si no est ki siat bùida o cun sceti unu reindiritzamentu a sa bècia e siat chentza acontzos in antis. In casu de movimentu sballiadu, duncas, si podet torrare a su tìtulu bèciu, ma non podes subrascrìer una pàgina chi giai esistit.\n\n<strong>ATENTZIONE!</strong>\nUnu cambiamentu dràsticu podet creare problemas, mescamente a is pàginas prus populares;\npro praxere depes èsser seguru de àer cumpresu is cunsighèntzias prima de sighire a in antis.",
        "movepagetalktext": "Sa pàgina cuntierras asotziada, chi esistit, at a èssere movida automaticamenti impare a sa pàgina base, '''a parte in custos casos''':\n* su movimentu de sa pàgina est intre namespaces diversos;\n* in currispondèntzia de su tìtulu nou esistit giai una pàgina de cuntierras (non bùida);\n* sa casella inoe in bàsciu no est istata sceberada.\n\nIn custos casos, si cheres, depes mòvere a manu su cuntenutu de sa pàgina.",
-       "movearticle": "Move sa pàgina",
        "movenologintext": "Depes èsser unu impitadore registradu e [[Special:UserLogin|identificadu]] pro pòder mòver una pàgina",
        "newtitle": "Tìtulu nou:",
        "move-watch": "Pone ogru a custa pàgina",
index cc47cc0..ed06150 100644 (file)
        "createaccountreason": "Mutivu:",
        "createacct-reason": "Mutivu",
        "createacct-reason-ph": "Pirchì stai criannu n'àutru cuntu",
-       "createacct-captcha": "Cuntrollu di sicurizza",
-       "createacct-imgcaptcha-ph": "Nzirìsci lu testu ca vidi ccassupra",
        "createacct-submit": "Crea lu tò cuntu",
        "createacct-another-submit": "Crea un cuntu",
        "createacct-benefit-heading": "{{SITENAME}} è fatta di pirsuni comu a tìa.",
        "passwordreset-emailsent-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu mannatu, cû cuntinutu chi si pò taliari ccassutta.",
        "passwordreset-emailerror-capture": "Nu missaggiu di posta elittrònica d'azziramentu dâ password fu cumpilatu, cû cuntinutu chi si pò taliari ccassutta, pirò la sò spidizzioni a l'utenti {{GENDER:$2|user}} nun arriniscìu: $1",
        "changeemail": "Canciu dû nnirizzu di posta elittrònica",
-       "changeemail-text": "Jinchi stu mòdulu pi canciari lu tò nnirizzu di posta elittrònica. Hai a nziriri la tò password pi cunfirmari stu canciamentu.",
+       "changeemail-header": "Jinchi stu mòdulu pi canciari lu tò nnirizzu di posta elittrònica. Hai a nziriri la tò password pi cunfirmari stu canciamentu.",
        "changeemail-no-info": "Hai a aviri trasutu p'aviri accessu direttu a sta pàggina.",
        "changeemail-oldemail": "Nnirizzu di posta elittrònica attuali:",
        "changeemail-newemail": "Nnirizzu di posta elittrònica novu:",
        "upload-dialog-button-done": "Finutu",
        "upload-dialog-button-save": "Sarva",
        "upload-dialog-button-upload": "Càrrica",
-       "upload-process-error": "Ammattìu n'erruri",
-       "upload-process-warning": "Ammattìu n'avvisu",
        "upload-form-label-select-file": "Scegghi lu file",
        "upload-form-label-infoform-title": "Dittagghî",
        "upload-form-label-infoform-name": "Nomu",
        "wlheader-showupdated": "Li pàggini ca foru canciati dâ tò ùrtima vìsita sunnu evidinziati n <strong>grassettu</strong>.",
        "wlnote": "Sutta attrovi l'ùrtim{{PLURAL:$1|u canciamentu|i <strong>$1</strong> canciamenti}} fatti nta l'ùrtim{{PLURAL:$1|a ura|i <strong>$2</strong> uri}}, aggiurnati ê $4 dû $3.",
        "wlshowlast": "Ammustra l'ùrtimi $1 uri $2 jorna",
+       "watchlistall2": "tutti",
        "watchlist-options": "Opzioni dâ lista taliata",
        "watching": "Agghiunciuta â lista taliata...",
        "unwatching": "Cancillata dâ lista taliata...",
        "specialpages": "Pàggini spiciali",
        "specialpages-note-top": "Liggenna",
        "specialpages-note": "* Pàggini spiciali nurmali.\n* <span class=\"mw-specialpagerestricted\">Pàggini spiciali risirvati.</strong>",
-       "specialpages-group-maintenance": "Resocunti di manutinzioni",
+       "specialpages-group-maintenance": "Resucunti di manutinzioni",
        "specialpages-group-other": "Àutri pàggini spiciali",
        "specialpages-group-login": "Trasuta / criazzioni di cunti",
        "specialpages-group-changes": "Ùrtimi canciamenti e riggistri",
        "htmlform-cloner-required": "Ci voli armenu nu valuri.",
        "htmlform-title-badnamespace": "[[:$1]] nun sta ntô namespace «{{ns:$2}}».",
        "htmlform-title-not-creatable": "«$1» nun è lu tìtulu di na pàggina ca si pò criari",
-       "htmlform-title-not-exists": "[[:$1]] nun esisti.",
+       "htmlform-title-not-exists": "$1 nun esisti.",
        "htmlform-user-not-exists": "<strong>$1</strong> nun esisti.",
        "htmlform-user-not-valid": "<strong>$1</strong> nun è vàlidu comu nomu utenti.",
        "sqlite-has-fts": "$1 cu capacità d'arricerca a tuttu testu",
index 1be5ee8..9d1665a 100644 (file)
@@ -21,7 +21,9 @@
                        "Macofe",
                        "Caliburn",
                        "Matma Rex",
-                       "Aursani"
+                       "Aursani",
+                       "V6rg",
+                       "C.R."
                ]
        },
        "tog-underline": "Unnerline airtins:",
        "createaccountreason": "Raison:",
        "createacct-reason": "Raison",
        "createacct-reason-ph": "Why ar ye creating anither accoont",
-       "createacct-captcha": "Security check.",
-       "createacct-imgcaptcha-ph": "Enter the tex ye see abuin",
        "createacct-submit": "Mak yer accoont",
        "createacct-another-submit": "Mak anither accoont",
        "createacct-benefit-heading": "{{SITENAME}} is makit bi fowk like ye.",
        "notargettext": "Ye'v na speceefie'd ae tairget page or uiser tae perform this function oan.",
        "nopagetitle": "Naw sic tairget page",
        "nopagetext": "The tairget page that ye'v speeceefied disna exeest.",
-       "pager-newer-n": "{{PLURAL:$1|اڃا نئون 1|اڃا نئون $1}}",
+       "pager-newer-n": "{{PLURAL:$1|newer 1|newer $1}}",
        "pager-older-n": "{{PLURAL:$1|aulder 1|aulder $1}}",
        "suppress": "Owersicht",
        "querypage-disabled": "This speecial page is disablit fer performance raisons.",
        "wlheader-showupdated": "Pages that hae been chynged sin ye last veesitit thaim ar shawn in '''baud'''.",
        "wlnote": "Ablo {{PLURAL:$1|is the laist chynge|ae the laist <strong>$1</strong> chynges}} in the laist {{PLURAL:$2|hoor|<strong>$2</strong> hoors}}, aes o $3, $4.",
        "wlshowlast": "Shaw the hainmaist $1 hoors $2 days",
+       "watchlistall2": "aw",
        "watchlist-options": "Watchleet opties",
        "watching": "Watchin...",
        "unwatching": "Onwatchin...",
        "movenosubpage": "This page haes naw subpages.",
        "movereason": "Raison:",
        "revertmove": "revert",
-       "delete_and_move": "Delyte n muiv",
        "delete_and_move_text": "==Delytion caad fer==\n\nThe destination airticle \"[[:$1]]\" aareadies exists. Div ye want tae delyte it fer tae mak wey fer the muiv?",
        "delete_and_move_confirm": "Ai, delyte the page",
        "delete_and_move_reason": "Delytit fer tae mak wa fer muiv fae \"[[$1]]\"",
index 09a87de..42d59f4 100644 (file)
@@ -9,14 +9,17 @@
                ]
        },
        "tog-underline": "ڳنڍڻي هيٺان لڪير:",
-       "tog-hideminor": "تازيون معمولي تبديليون لڪايو",
-       "tog-hidepatrolled": "تازيون گھميل تبديليون لڪايو",
-       "tog-newpageshidepatrolled": "نَوَن صفحن واري فهرست مان تازو گھميل صفحا لڪايو",
-       "tog-numberheadings": "سُرخين کي خودڪار طريقي سان نمبر ڏيو",
+       "tog-hideminor": "تازين تبديلين منجھہ معمولي تبديليون لڪايو",
+       "tog-hidepatrolled": "تازيون نگرانيل تبديليون لڪايو",
+       "tog-newpageshidepatrolled": "نَوَن صفحن واري فهرست مان نگرانيل صفحا لڪايو",
+       "tog-hidecategorization": "صفحن جا ذمرا لڪايو",
+       "tog-extendwatchlist": "تازه ترين بدران سموريون تبديليون ڏيکارڻ لاءِ ٽيٽ لسٽ کي وسيع ڪريو.",
+       "tog-numberheadings": "سُرخين کي خودڪاراً نمبر ڏيو",
        "tog-showtoolbar": "سنوار اوزار ڏيکاريو",
        "tog-editondblclick": "ٻٽي ڪلڪ تي صفحا سنواريو",
-       "tog-watchcreations": "منهنجا سرجيل صفحا منهنجي ٽيٽ فهرست ۾ رکو",
+       "tog-watchcreations": "منهنجا سرجيل صفحا ۽ منهنجا چاڙهيل فائيل منهنجي زيرِ نظر فهرست تي رکو",
        "tog-watchdefault": "منهنجا ترميميل صفحا منهنجي ٽيٽ فهرست تي رکو",
+       "tog-watchmoves": "جيڪي صفحا ۽ فائيلس آئون چوريان، سي منهنجي ٽيٽ لسٽ ۾ شامل ڪريو.",
        "tog-watchdeletion": "آئون جيڪي صفحا ڊاهيان، سي منهنجي ٽيٽ فهرست تي رکو",
        "tog-watchrollback": "انهن صفحن کي منهنجي ٽيٽ فهرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي.",
        "tog-minordefault": "سمورين تبديلين کي بنان چئي معمولي ترميم تصور ڪريو",
        "tog-previewonfirst": "پهرين ترميم تي پيش نگاهہ ڏيکاريو",
        "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برق ٽپال اماڻيو",
        "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برق ٽپال ڪريو",
+       "tog-enotifrevealaddr": "پڌراين ۾ منهنجو برق ٽپال پتو ظاهر ڪريو.",
        "tog-shownumberswatching": "ٽيٽيندڙ يوزرس جو تعداد ڏيکاريو",
        "tog-oldsig": "موجوده دستخط",
+       "tog-uselivepreview": "سڌي سنئين پيش نگاھہ استعمال ڪريو",
        "tog-watchlisthideown": "ٽيٽ فهرست مان منهنجون ڪيل ترميمون لڪايو",
+       "tog-watchlisthidebots": "ٽيٽ فهرست تان بوٽ جون ترميمون لڪايو",
+       "tog-watchlisthideminor": "ٽيٽ فهرست تان معمولي ترميمون لڪايو",
        "tog-watchlisthideliu": "لاگ اِن ٿيل يوزرس جون ڪيل ترميمون ٽيٽ فهرست ۾ نہ ڏيکاريو",
+       "tog-watchlisthideanons": "ٽيٽ فهرست تان اڻڄاتل يوزر جون ترميمون لڪايو",
+       "tog-watchlisthidecategorization": "صفحن جا زمرا لڪايو",
        "tog-ccmeonemails": "ٻين يوزرس ڏانهن منهنجي موڪليل برق ٽپال جو پرت مون کي اماڻيو",
        "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نہ ڏيکاريو",
        "tog-showhiddencats": "لڪل زمرا ڏيکاريو",
+       "tog-useeditwarning": "مونکي خبردار ڪريو جڏهن مان هڪ ترميم وارو صفحو بغير تبديلين سانڍڻ جي ڇڏيان",
+       "tog-prefershttps": "هميشه محفوظ ڪنيڪشن استعمال ڪريو جڏهن لاگ اِن ٿيل هجو",
        "underline-always": "هميشہ",
        "underline-never": "ڪڏهن بہ نہ",
        "sunday": "آچر",
        "hidden-categories": "{{PLURAL:$1|لڪيل زمرو|لڪيل زمرا}}",
        "hidden-category-category": "لڪل زمرا",
        "category-subcat-count": "{{PLURAL:$2|هن ذمري ۾ رڳو هيٺيون ذيلي ذمرو آهي.|هن ذمري ۾ ڪل $2 مان هيٺيان {{PLURAL:$1|subcategory|$1 ذيلي ذمرا}} آهن.}}",
+       "category-subcat-count-limited": "هن زمري ۾ هيٺيان {{PLURAL:$1|ننڍا زمرا آهن|$1 subcategories}}.",
+       "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": "جاري..",
        "index-category": "ڏسڻيل صفحا",
        "noindex-category": "غيرڏسڻيل صفحا",
+       "broken-file-category": "فائيل جي ٽٽل ڳنڍڻن وارا صفحا",
        "about": "بابت",
        "article": "موادي صفحو",
        "newwindow": "(نئين دريءَ ۾ کلندو)",
        "morenotlisted": "فهرست مڪمل ڪانهي.",
        "mypage": "منهنجو صفحو",
        "mytalk": "ڳالهہ ٻول",
-       "anontalk": "هن آءِ پِي پتي لاءِ مباحثي صفحو",
+       "anontalk": "ڳالھ ٻولھ",
        "navigation": "رهنمائي",
        "and": "&#32؛۽",
        "qbfind": "ڳوليو",
        "qbmyoptions": "منهنجا صفحا",
        "faq": "ڪپوس",
        "faqpage": "Project:ڪپوس",
+       "actions": "فعل",
        "namespaces": "نانءُ پولار:",
        "variants": "بَدَلَ",
        "navigation-heading": "رهنما مينيو",
        "deletethispage": "هيءُ صفحو ڊاهيو",
        "undeletethispage": "هيءُ صفحو اڻ ڊاهيو",
        "undelete_short": "اڻڊاهيو {{PLURAL:$1|هڪ ترميم|$1 ترميمون}}",
+       "viewdeleted_short": "ڏسو {{PLURAL:$1|هڪ ڊاٺل ترميم|$1 ڊاٺل ترميمون}}",
        "protect": "تحفظيو",
        "protect_change": "تبديل ڪريو",
        "protectthispage": "هيءُ صفحو تحفظيو",
        "articlepage": "مسودو ڏسو",
        "talk": "بحث",
        "views": "ڏيٺون",
-       "toolbox": "ٽولَ",
+       "toolbox": "اوزارَ",
        "userpage": "يوزر صفحو ڏسو",
        "projectpage": "رٿائي صفحو ڏسو",
        "imagepage": "ذريعاتي صفحو ڏسو",
        "redirectedfrom": "($1 کان چوريل)",
        "redirectpagesub": "چوريل صفحو",
        "redirectto": "ڏانهن چوريو",
-       "lastmodifiedat": "هيءُ صفحو آخري ڀيرو $2، $1ع تي ترميميو ويو هو.",
+       "lastmodifiedat": "هيءُ صفحو آخري دفعو $2، $1ع تي سنواريو ويو هو.",
        "viewcount": "هيءُ صفحو {{PLURAL:$1|دفعو|$1 دفعا}} ڏسجي چڪو آهي.",
        "protectedpage": "تحفظيل صفحو",
        "jumpto": "ڏانهن ٽپ ڏيو",
        "jumptosearch": "ڳولا",
        "generic-pool-error": "معذرت سان سرور هاڻي تمام گھڻو سُڪ آهي.\nتمام گھڻا يوزر هتي موجود آهن.\nمهرباني ڪري ٿورو ترسي پوءِ ڪوشش ڪريو.",
        "pool-errorunknown": "اڻ ڄاتل چُڪَ",
+       "poolcounter-usage-error": "استعمال جي خرابي: $1",
        "aboutsite": "{{SITENAME}} بابت",
        "aboutpage": "Project:بابت",
        "copyright": "ڪجھہ ٻيو ڄاڻايل نہ هجڻ جي صورت ۾ سمورو مواد $1 تحت ميسر ڪجي ٿو.",
        "ok": "ٺيڪ",
        "retrievedfrom": "\"$1\" تان ورتل",
        "youhavenewmessages": "توهان لاءِ $1 ($2) آهن.",
+       "youhavenewmessagesmanyusers": "توهان لاءِ ڪيترن ئي يُوزرس ($2) طرفان $1 آيل آهن.",
        "youhavenewmessagesmulti": "$1 تي توهان لاءِ نوان نياپا آهن",
        "editsection": "سنواريو",
        "editold": "سنواريو",
        "toc": "فهرست",
        "showtoc": "ڏيکاريو",
        "hidetoc": "لڪايو",
-       "confirmable-confirm": "ڇا توهان کي پڪ آهي؟",
+       "collapsible-collapse": "بند ڪريو",
+       "collapsible-expand": "کوليو",
+       "confirmable-confirm": "ڇا{{GENDER:$1|توهانکي}} پڪ آهي؟",
        "confirmable-yes": "ها",
        "confirmable-no": "نہ",
        "thisisdeleted": "$1 کي ڏسڻ يا بحالڻ چاهيندا؟",
        "nstab-help": "امدادي صفحو",
        "nstab-category": "زمرو",
        "mainpage-nstab": "مک صفحو",
+       "nosuchaction": "اهڙو ڪو بہ عمل نہ آهي",
        "nosuchspecialpage": "اهڙو ڪو بہ خاص صفحو ناهي",
        "error": "چُڪَ",
        "databaseerror": "اعدادخاني ۾ چڪ",
        "databaseerror-function": "ڪاڄ: $1",
        "databaseerror-error": "چُڪَ: $1",
        "readonly": "اعدادخانو بنديل",
+       "missingarticle-rev": "(ڀيرو#: $1)",
        "missingarticle-diff": "(تفاوت: $1، $2)",
        "readonly_lag": "اعدادخانو خودڪاراً بنجي چڪو آهي، جيستائين غلام اعدادخانہ سَروَر، مالڪ سَروَر کي رسي نہ ٿو.",
        "internalerror": "اندروني خرابي",
        "protectedpagetext": "هيءُ صفحو ترميمن کان تحفظيل آهي.",
        "viewsourcetext": "توهان هن صفحي جو ڪوڊ ڏسي ۽ نقل ڪري سگھو ٿا:",
        "namespaceprotected": "توهان کي نانءُ پولار '''$1''' جا صفحا سنوارڻ جا اختيار ناهن.",
+       "mycustomcssprotected": "توهان کي هيءُ CSS صفحو سنوارڻ جي اجازت نہ آهي.",
+       "mycustomjsprotected": "توهان کي هيءُ جاوا اسڪرپٽ صفحو سنوارڻ جي اجازت حاصل ڪانهي.",
+       "myprivateinfoprotected": "توهان کي پنهنجي ذاتي معلومات سنوارڻ جي اجازت حاصل نہ آهي.",
+       "mypreferencesprotected": "توهان جي پنهنجون ترجيحات سنوارڻ جي اجات حاصل ڪانهي.",
        "ns-specialprotected": "خاص صفحا سنواري نٿا سگھجن.",
+       "titleprotected": "[[User:$1|$1]] اهڙي عنوان سان صفحو سرجڻ تي روڪ لڳائي ڇڏي آهي. سبب \"<em>$2</em>\" ڄاڻايو ويو آهي.",
        "exception-nologin": "لا اِن ٿيل ناهيو",
        "virus-unknownscanner": "اڻ ڄاتل نِس وائرس:",
        "welcomeuser": "ڀلي ڪري آيا، $1!",
        "yourpasswordagain": "يُوزرنان ٻيهر ٽائيپ ڪريو:",
        "createacct-yourpasswordagain": "ڳجھي لفظ جي خاطري ڪريو",
        "createacct-yourpasswordagain-ph": "ٻيهر ڳجھو لفظ داخل ڪريو",
-       "remembermypassword": "هن ڳڻپيوڪر تي مون کي (وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن|ڏينهن}} لاءِ) ياد رکو",
+       "remembermypassword": "هن برائوزر تي منهنجي لاگ ان کي (وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}} لاءِ) ياد رکو",
        "userlogin-remembermypassword": "مون کي لاگ اِن رکو",
+       "userlogin-signwithsecure": "محفوظ ڳانڍاپو استعمال ڪريو",
        "yourdomainname": "توهان جو ميدان:",
        "password-change-forbidden": "هن وڪِي تي توهان ڳجھو لفظ بدلائي نہ ٿا سگھو.",
        "login": "لاگ اِن",
        "createaccountreason": "سبب:",
        "createacct-reason": "سبب",
        "createacct-reason-ph": "توهان ٻيو کاتو ڇو کولي رهيا آهيو",
-       "createacct-captcha": "حفاظتي روڪ",
-       "createacct-imgcaptcha-ph": "مٿي ظاهر ٿيندڙ ٽيڪسٽ ٽائيپ ڪريو",
        "createacct-submit": "پنهنجو کاتو کوليو",
        "createacct-another-submit": "کاتو کوليو",
        "createacct-benefit-heading": "{{SITENAME}} توهان جهڙن سڄڻن ٺاهيو آهي.",
        "createacct-benefit-body1": "{{PLURAL:$1|ترميم|ترميمون}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحو|صفحا}}",
-       "createacct-benefit-body3": "حاليہ $1 ڀاڱيدار",
+       "createacct-benefit-body3": "حاليه {{PLURAL:$1|ڀاڱيدار}}",
        "badretype": "توهان جو ڄاڻايل ڳجھو لفظ درست نہ آهي.",
        "usernameinprogress": "ان يُوزرنانءُ لاءِ کاتو اڳ ۾ ئي تياريءَ هيٺ آهي. مهرباني ڪري انتظار فرمايو.",
        "userexists": "ڄاڻايل يوزرنانءُ اڳ ۾ ئي استعمال هيٺ آهي. مهرباني ڪري ڪو ٻيو يُوزرنانءُ چونڊيو.",
        "noname": "توهان جو ڄاڻايل يُوزرنانءُ ناقابل ڪار آهي.",
        "loginsuccesstitle": "لاگ اِن ڪامياب",
        "loginsuccess": "'''هاڻي توهان {{SITENAME}} تي بطور \"$1\" لاگ اِن ٿيل آهيو.'''",
-       "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي. يُوزرنانءُ، ننڍن وڏن اکرن ۾ امتياز ڪري ٿو. هِجي چڪاسيو، يا نئون کاتو کوليو.",
+       "nosuchuser": "\"$1\" نالي سان ڪو بہ يوزر نہ آهي.  \"$1\".\n ننڍن وڏن اکرن ۾ امتياز ڪرڻ لازمي آهي. \nهِجي چڪاسيو،يا [[Special:UserLogin/signup|نئون کاتو تخليق ڪريو]]",
        "nosuchusershort": "\"$1\" نالي ڪو بہ يُوزر ناهي.\nهِجي جي پڪ ڪندا.",
        "nouserspecified": "توهان کي ڪو يوزرنانءُ ڄاڻائڻو پوندو.",
        "login-userblocked": "هيءُ يُوزر بندشيل آهي. لاگ اِن جي اجازت نہ ٿي ڏجي.",
        "passwordtooshort": "ڳجھي لفظ گھٽ ۾ گھٽ  {{PLURAL:$1|1 اکر|$1 اکرَن}} تي ٻڌل هوڻ گھرجي.",
        "passwordtoolong": "ڳجھو لفظ {{PLURAL:$1|1 اکر|$1 اکرن}} کان وڏو نہ ٿو ٿي سگھي.",
        "password-name-match": "توهان جو ڳجھو لفظ توهان جي يوزرنانءُ کان مختلف هجڻ گھرجي.",
-       "mailmypassword": "ڳجھو لفظ برق ٽپاليو",
+       "mailmypassword": "ڳجھو لفظ  نئين سِر مقرر ڪريو",
        "passwordremindertitle": "{{SITENAME}} لاءِ نئون عارضي ڳجھو لفظ",
-       "passwordremindertext": "ڪنهن (شايد توهان آءِ پي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھو لفظ اماڻڻ جي گھُرَ ڪئي.\n\nهاڻي يوزر \"$2\" لاءِ ڳجھو لفظ \"$3\" آهي. توهان کي هينئر ئي لاگ اِن ٿي پنهنجو ڳجھو لفظ تبديل ڪرڻ گھرجي.\n\nجيڪڏهن اها گھُرَ اوهان نه ڪئي هئي، يا هاڻي اوهان کي پنهنجو ڳجھو لفظ ياد اچي ويو آهي ۽ توهان ان کي تبديل ڪرڻ نه ٿا چاهيو، ته توهان هن نياپي کي نظر انداز ڪندي پنهنجو پراڻو ڳجھو لفظ ئي استعمال ڪري سگھو ٿا.",
-       "noemail": "يُوزر \"$1\" جي ڪو به برق ٽپال پتو درج ٿيل ناهي.",
+       "passwordremindertext": "ڪنهن (شايد توهان آءِ پي پتي $1 تان) اسان کي {{SITENAME}} ($4) لاءِ نئون ڳجھو لفظ اماڻڻ جي گھُرَ ڪئي.\"$2\" يوزر لاءِ هڪ ڳجھُ لفظ تخليق ڪيو ويو آهي \"$3\" تي ترتيب ڏنو ويو هو. جيڪڏهن اهو توهان جي ارادو هيو، ته هاڻي توهان کي هينئر ئي لاگ اِن ٿي پنهنجو ڳجھو لفظ تبديل ڪرڻ گھرجي.\nتوهان جو عارضي ڳجھو لفظ {{PLURAL:$5|هڪ ڏينهُن|$5 ڏينهَن}} ۾ ختم ٿيندو.\n\nجيڪڏهن اها گھُرَ اوهان نه ڪئي هئي، يا هاڻي اوهان کي پنهنجو ڳجھو لفظ ياد اچي ويو آهي ۽ توهان ان کي تبديل ڪرڻ نه ٿا چاهيو، ته توهان هن نياپي کي نظر انداز ڪندي پنهنجو پراڻو ڳجھو لفظ ئي استعمال ڪري سگھو ٿا.",
+       "noemail": "يُوزر \"$1\" جي ڪو بہ برق ٽپال پتو درج ٿيل ناهي.",
+       "noemailcreate": "توهان کي قابل ڪار برق ٽپال پتو مهيا ڪرڻو پوندو.",
        "passwordsent": "يوزر \"$1\" لاءِ هڪ نئون ڳجھو لفظ برق ٽپال ذريعي اماڻيو ويو آهي.  مهرباني ڪري اهو حاصل ڪرڻ بعد لاگ اِن ٿيندا.",
        "mailerror": "ٽپال اماڻڻ ۾ چُڪَ: $1",
-       "acct_creation_throttle_hit": "توهان جي آءِ پي پتي تان هن وڪيءَ تي پوئين ڏينهن $1 کاتا کلي چڪا آهن. ايتري عرصي ۾ ان کان وڌيڪ کاتا نہ ٿا کولي سگھجن. نتيجتاً ساڳي آءِ پي پتي تان في‌الوقت وڌيڪ کاتا کولي نہ ٿا سگھجن.",
+       "acct_creation_throttle_hit": "توهان جي آءِ پي پتي تان هن وڪيءَ تي پوئين ڏينهن {{PLURAL:$1|1 کاتو|$1 کاتا}} کلي چڪا آهن، جيڪو وڌ ۾ وڌ اجازت ڏنل وقت آهي. \nنتيجتاً ساڳي آءِ پي پتي تان في‌الوقت وڌيڪ کاتا کولي نٿا سگھجن.",
        "emailauthenticated": "توهان جي برق ٽپال پتي جي تصديق $2 تي $3 بجي ڪئي وئي.",
        "emailnotauthenticated": "توهان جو برق ٽپال پتي جي تصديق اڃا ٿي نہ سگھي آهي.",
+       "noemailprefs": "انهن فيچرس کي فعال بڻائڻ لاءِ پنهنجي ترجيحات ۾ برق ٽپال پتو ڄاڻايو.",
        "emailconfirmlink": "پنهنجي برق ٽپال پتي جي پَڪَ ڪندا",
+       "invalidemailaddress": "هي ايميل پتو قبول نٿو ڪڪري سگھجي ايئن ٿو لڳي ته انجو فارميٽ قابل قبول نه آهي.\nبراءِ مهرباني هڪ قابل قبول فارميٽ وارو پتو موڪليو يا ان جڳھ کي کالي ڇڏيو.",
+       "cannotchangeemail": "هن وڪيءَ تي کاتيدار جو برق ٽپال پتو بدلائي نہ ٿو سگھجي.",
        "emaildisabled": "هيءَ سرزمين برق ٽپال اماڻي نہ ٿي سگھي.",
        "accountcreated": "کاتو کلي چڪو",
-       "accountcreatedtext": "$1 نالي يوزر کاتو کلي چڪو آھي.",
+       "accountcreatedtext": "يوزر کاتو [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) جي لاءِ تخليق ٿي چڪو آهي.",
        "createaccount-title": "{{SITENAME}} تي کاتو کولڻ",
        "login-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
        "login-abort-generic": "توهان جو لاگ اِن ناڪام ويو.",
        "pt-login-button": "لاگ اِن",
        "pt-createaccount": "کاتو کوليو",
        "pt-userlogout": "لاگ آئوٽ",
+       "php-mail-error-unknown": "پي ايڇ پي جي  ڪاڄ اندر اڻڄاتل چُڪَ.",
        "user-mail-no-addy": "برق ٽپال پتو ڄاڻائڻ کان سواءِ برق ٽپال اماڻڻ جي ڪوشش ڪئي وئي.",
        "changepassword": "ڳجھو لفظ تبديل ڪريو",
+       "resetpass_announce": "لاگ اِن جو عمل پورو ڪرڻ لاءِ، توهان کي نئون ڳجھو لفظ اختيار مقرر ڪرڻو پوندو.",
        "resetpass_header": "کاتي جو ڳجھو لفظ بدلايو",
        "oldpassword": "اڳوڻو ڳجھو لفظ:",
        "newpassword": "نئون ڳجھو لفظ:",
        "passwordreset-domain": "ميدان:",
        "passwordreset-email": "برق ٽپال پتو:",
        "passwordreset-emailtitle": "{{SITENAME}} واري کاتي جا تفصيل",
+       "passwordreset-emailelement": "يُوزر نانءُ: \n$1\n\nعارضي ڳجھو لفظ:\n$2",
+       "changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
        "changeemail-passwordrequired": "توهانکي هن تبديلي جي تصديق ڪرڻ جي لاءِ پنهنجو ڳجھو لفظ داخل ڪرڻ جي ضرورت پوندي.",
        "changeemail-oldemail": "هاڻوڪو برق ٽپال پتو:",
        "changeemail-newemail": "نئون برق ٽپال پتو:",
        "changeemail-throttled": "توهان تازو ئي لاگ اِن ٿيڻ جون هيڪانديون گھڻيون ڪوششون ڪيون آهن. مهرباني ڪري $1 لاءِ ترسي پوءِ وري ڪوشش ڪريو.",
        "changeemail-nochange": "مهرباني ڪري مختلف نئون برق ٽپال پتو ڄاڻايو.",
        "resettokens-tokens": "ٽوڪنس:",
+       "resettokens-token-label": "$1 (حاليہ قدر: $2)",
        "bold_sample": "گهري تحرير",
        "bold_tip": "گهري لکت",
        "italic_sample": "ترڇي لکت",
        "summary-preview": "تت تي پيش نگاهہ:",
        "subject-preview": "موضوع پيش نگاهہ:",
        "blockedtitle": "يُوزر بندشيل آهي.",
-       "blockedtext": "'''توهان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آهي.'''\n\nبندش $1 هنئي. جڏهن تہ ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاهڙي روڪ تي بحث ڪرڻ لاءِ توهان $1 يا ڪنهن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توهان جو درست [[Special:ترجيحات|کاتو ترجيحات]] ۾ درست برق ٽپال پتو درج ٿيل نہ آهي تہ توهان 'هن يوزر کي برق ٽپال ڪريو' وارو فيچر نہ ٿا \nYou 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.\nاستعمال ڪري سگھو. توهان جو هاڻوڪو آءِ پي پتو $3 آهي، ۽ بندش سڃاڻپ $5 آهي. مهرباني ڪري ڪنهن به پڇا ڳاڇا يا لهوچڙ لاءِ انهن مان ڪنهن هڪ يا ٻنهي جو حوالو ڏيندا.",
+       "blockedtext": "'''توهان جي يوزرنانءُ يا آءِ پي کي بندشيو ويو آهي.'''\n\nبندش $1 هنئي. جڏهن تہ ڄاڻايل سبب ''$2'' آهي.\n\n\n* بندش جو آغاز: $8\n* بندش جو انجام: $6\n* بندش جو هدف: $7\n\nاهڙي روڪ تي بحث ڪرڻ لاءِ توهان $1 يا ڪنهن ٻي [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سان رابطو ڪري سگھو ٿا. جيڪڏهن توهان جو درست [[Special:ترجيحات|کاتو ترجيحات]] ۾ درست برق ٽپال پتو درج ٿيل نہ آهي تہ توهان 'هن يوزر کي برق ٽپال ڪريو' وارو فيچر نہ ٿا \nYou 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.\nاستعمال ڪري سگھو. توهان جو هاڻوڪو آءِ پي پتو $3 آهي، ۽ بندش سڃاڻپ $5 آهي. مهرباني ڪري ڪنهن بہ پڇا ڳاڇا يا لهوچڙ لاءِ انهن مان ڪنهن هڪ يا ٻنهي جو حوالو ڏيندا.",
        "blockednoreason": "سبب اڻڄاڻايل",
+       "whitelistedittext": "صفحا سنوارڻ لاءِ مهرباني ڪري $1.",
+       "confirmedittext": "صفحا سنوارڻ کان اڳ توهان کي پنهنجي ايميل پتي جي تصديق ڪرڻي پوندي. مهرباني ڪري [[Special:Preferences|use preferences]] ذريعي پنهنجو ايميل پتو ڄاڻايو ۽ تصديقيو.",
+       "nosuchsectiontitle": "سيڪشن نٿو لهي سگهي",
        "loginreqtitle": "لاگ اِن گھربل آهي",
        "loginreqlink": "لاگ اِن",
        "loginreqpagetext": "ٻيا صفحا ڏسڻ لاءِ مهرباني ڪري $1",
        "userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
        "blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
        "previewnote": "<strong>'''هيءَ محظ پيش نگاهہ آهي.</strong> ترميمون اڃا سانڍجوين ناهن!'''",
+       "continue-editing": "ترميم گاھ ڏانهن وڃو",
        "editing": "زير ترميم $1",
        "creating": "$1 سرجيندي",
        "editingsection": "زير ترميم $1 (سيڪشن)",
        "storedversion": "سانڍيل مسودو",
        "yourdiff": "تفاوت",
        "copyrightwarning": "ياد رکندا ته {{SITENAME}} لاءِ سموريون ڀاڱيداريون $2 تحت پڌريون ڪجن ٿيون (تفصيلن لاءِ $1 ڏسندا). اوهان جي تحرير کي {{SITENAME}} جي قائدن تحت ترميمي سگهجي ٿو. جيڪڏهن اوهان نه ٿا چاهيو ته اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي ته پوءِ پنهنجي لکڻي هتي جمع نه ڪرايو. پنهنجو مواد هتي جمع ڪرڻ جو مطلب هوندو ته توهان کي جمع ڪرايل مواد جي مفت فراهمي ۽ کُليل تبديليءَ تي ڪو به اعتراز ناهي.<br />\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو ته توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن مفت وسيلي تان ڪاپي ڪيو آهي.\n'''تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ کان سواءِ هتي جمع نه ڪريو.'''",
-       "copyrightwarning2": "ياد رکندا تہ {{SITENAME}} لاءِ سموريون ڀاڱيدارين کي ٻيا ڀاڱيدار سنواري، بدلائي، يا ڊاهي سگھن ٿا. جيڪڏهن اوهان نہ ٿا چاهيو تہ اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي تہ پوءِ پنهنجي لکڻي هتي جمع نہ ڪرايو.\n<br>\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو تہ توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن اهڙي ئي مفت عوامي وسيلي تان ڪاپي ڪيو آهي. (تفصيلن لاءِ $1 ڏسندا).\n\n'''تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ بنان هتي جمع نہ ڪريو.'''",
+       "copyrightwarning2": "ياد رکندا تہ {{SITENAME}} لاءِ سموريون ڀاڱيدارين کي ٻيا ڀاڱيدار سنواري، بدلائي، يا ڊاهي سگھن ٿا. جيڪڏهن اوهان نہ ٿا چاهيو تہ اوهان جي لکڻين کي بي رحميءَ سان ترميميو وڃي يا ورهائي عام ڪيو وڃي تہ پوءِ پنهنجي لکڻي هتي جمع نہ ڪرايو.</br>\nتوهان اهڙي پڪ ڏيڻ جا پابند پڻ آهيو تہ توهان جو جمع ڪرايل مواد توهان جو پنهنجو لکيل آهي يا وري توهان ڪنهن اهڙي ئي مفت عوامي وسيلي تان ڪاپي ڪيو آهي. (تفصيلن لاءِ $1 ڏسندا).\n\n<strong>تحفظيل حق ۽ واسطا رکندڙ مواد واسطيدار مالڪ کان اڳواٽ اجازت وٺڻ بنان هتي جمع نہ ڪريو.</strong>",
        "protectedpagewarning": "<strong>چتاءُ: هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط منتظمين ئي ان کي سنواري سگھن ٿا. </strong>\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
        "semiprotectedpagewarning": "<strong>نوٽ: هيءَ صفحو اهڙيءَ ريت تحفظيو ويو آهي جو فقط کاتيدار يُوزرس ئي ان کي سنواري سگھن ٿا. </strong>\nتازه ترين لاگ حوالي طور پيش ڪجي ٿو:",
        "templatesused": "هن صفحي تي استعمال ٿيندڙ {{PLURAL:$1|سانچو|سانچا}}:",
        "content-not-allowed-here": "\"$1\" مواد هن صفحي [[$2]] تي رکي نہ ٿو سگھجي.",
        "content-model-wikitext": "وڪي‌ٽيڪسٽ",
        "content-model-text": "سادو ٽيڪسٽ",
+       "content-model-javascript": "جاوا اسڪرپٽ",
        "content-json-empty-object": "خالي آبجيڪٽ",
        "content-json-empty-array": "خالي اري",
-       "duplicate-args-warning": "وارننگ: [[:$2]]کي [[:$1]] ڪال ڪري رهيو آهي، ساڻ هڪ کان وڌيڪ قدرن لاءِ ’$3‘ پيراميٽرس لاءِ. فقط آخري قدر مهيا ڪيل استعمال ڪيو ويندو.",
+       "duplicate-args-warning": "چتاءُ: [[:$2]] کي [[:$1]] ڪال ڪري رهيو آهي، جنهن منجھہ ’$3‘ نيم‌پيما لاءِ هڪ کان وڌيڪ قدر ڄاڻايل آهن. فقط آخري ڄاڻايل قدر استعمال ڪيو ويندو.",
        "parser-template-loop-warning": "سانچو چڪر لڌو ويو: [[$1]]",
-       "viewpagelogs": "هن صفحي جا لاگ ڏسو",
+       "cantcreateaccounttitle": "کاتو کولي نہ ٿو سگھجي",
+       "cantcreateaccount-text": "هن آءِ پي پتي تان کاتي جي تخليق تي يُوز (<strong>$1</strong>)  [[User:$3|$3]] روڪ لڳائي آهي.\n\n$3 جو ڄاڻايل سبب آهي <em>$2</em> آهي.",
+       "cantcreateaccount-range-text": "آءِپي پتن جي حد '''$1''' ۾ [[User:$3|$3]] کاتو کولڻ تي روڪ لڳائي وئي آهي،$4 جنهن ۾ توهان جو آءِپي پتو بہ ('''$4''')،  پڻ شامل آهي. \n\n$3 ان روڪَ جو سبب \"$2\" ڄاڻايو آهي.",
+       "viewpagelogs": "هن صفحي جا لاگس ڏسو",
+       "nohistory": "هن صفحي جي ڪا بہ سوانح نہ آهي.",
        "currentrev": "هاڻوڪو مسودو",
        "currentrev-asof": "$1 جو تازو ترين مسودو",
        "revisionasof": "$1 وارو پرت",
        "nextrevision": "اڃا نئون پرت→",
        "currentrevisionlink": "هاڻوڪو پرت",
        "cur": "ھاڻوڪو",
+       "next": "اڳيون",
        "last": "پويون",
        "page_first": "پهريون",
        "page_last": "آخري",
+       "history-fieldset-title": "جھانگ جي سوانح",
        "history-show-deleted": "رڳو ڊاٺل",
        "histfirst": "اوائلي ترين",
        "histlast": "تازه ترين",
        "historysize": "({{PLURAL:$1|1 ٻاٽڻ|$1 ٻاٽڻيون}})",
        "historyempty": "(خالي)",
+       "history-feed-title": "ترميمي سوانح",
+       "history-feed-description": "وڪي جي هن صفحي جي ترميمي سوانح",
        "history-feed-item-nocomment": "$2 تي $1",
        "rev-deleted-user": "(يُوزرنانءُ ڊاٺو ويو)",
+       "rev-delundel": "نمائش تبديل ڪريو",
+       "rev-showdeleted": "ڏيکاريو",
+       "revisiondelete": "مسوادا ڊاهيو/اڻ‌ڊاهيو",
+       "revdelete-no-file": "ڄاڻايل فائيل وجود نہ ٿو رکي.",
        "revdelete-show-file-submit": "ها",
+       "revdelete-legend": "نمائش جون پابنديون ترتيب ڪريو",
+       "revdelete-hide-image": "فائيل جو مواد لڪايو",
+       "revdelete-hide-comment": "ترميم جو تتُ",
+       "revdelete-hide-user": "ايڊيٽر جو يوزرنانءُ / آء پي پتو",
+       "revdelete-radio-same": "(نہ بدلايو)",
        "revdelete-radio-set": "لڪل",
        "revdelete-radio-unset": "ظاهر",
+       "revdelete-log": "سبب:",
+       "revdel-restore": "نمائش تبديل ڪريو",
        "pagehist": "صفحي جي سوانح",
        "deletedhist": "ڊاٺل سوانح",
        "revdelete-otherreason": "ٻيا/اضافي ڪارڻ:",
        "revdelete-reasonotherlist": "ٻيو ڪارڻ",
        "revdelete-edit-reasonlist": "ڊاٺ جا سبب سنواريو",
+       "revdelete-offender": "ڀيري جو ليکڪ:",
        "mergehistory": "صفحن جون سوانح ضم ڪريو",
+       "mergehistory-box": "ٻن صفحن جي ڀيرن کي ضم ڪريو:",
        "mergehistory-from": "ذريعہ صفحو:",
        "mergehistory-into": "مقصود صفحو:",
        "mergehistory-list": "ضمائتي ترميم سوانح",
-       "mergehistory-autocomment": "[[$1]] کي [[$2]] ۾ ضم ڪيو ويو",
+       "mergehistory-submit": "ڀيرن کي ضم ڪريو",
+       "mergehistory-empty": "ڪي بہ ڀيرا ضم ڪري نہ ٿا سگھجن.",
+       "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": "سبب:",
        "mergelog": "ضم لاگ",
        "revertmerge": "اڻ ضم",
        "history-title": "\"$1\" جي ترميمي سوانح",
        "difference-title": "\"$1\" جي مسودن ۾ تفاوت",
+       "difference-title-multipage": "صفحن \"$1\" ۽ \"$2\" ۾ تفاوت",
        "difference-multipage": "(صفحن درميان تفاوت)",
        "lineno": "سِٽَ $1:",
        "compareselectedversions": "چونڊيل پرت ڀيٽيو",
        "diff-empty": "(ڪو بہ تفاوت ڪونهي)",
        "searchresults": "ڳولا نتيجا",
        "searchresults-title": "”$1“ لاءِ ڳولا نتيجا",
+       "titlematches": "صفحي جو عنوان مشابهت رکي ٿو",
+       "textmatches": "صفحي جو متن مشابهت رکي ٿو",
+       "notextmatches": "ڪنهن به صفحي جو متن مشابهت نٿو رکي",
        "prevn": "پويان {{PLURAL:$1|$1}}",
        "nextn": "اڳيان {{PLURAL:$1|$1}}",
        "prev-page": "اڳوڻو صفحو",
        "search-result-size": "$1 ({{PLURAL:$2|لفظُ|$2 لفظَ}})",
        "search-redirect": "($1 کي چوريو)",
        "search-section": "(سيڪشن $1)",
+       "search-category": "(ذمرو $1)",
        "search-suggest": "ڇا توهان جو مطلب $1 آهي؟",
        "search-interwiki-caption": "برادر رٿائون",
+       "search-interwiki-default": "$1 مان نتيجا",
        "search-interwiki-more": "(وڌيڪ)",
        "search-relatedarticle": "لاڳاپيل",
        "searchrelated": "لاڳاپيل",
        "searchall": "سڀ",
        "search-nonefound": "توهان جي ڳولا جي نتيجي ۾ ڪجھہ بہ ڪو نہ لڌو.",
+       "powersearch-legend": "اعليٰ ڳولا",
+       "powersearch-togglelabel": "چڪاسيو:",
        "powersearch-toggleall": "سڀ",
        "powersearch-togglenone": "ڪو بہ نہ",
        "search-external": "خارجي ڳولا",
        "prefs-editwatchlist-edit": "پنهنجي ٽيٽ فهرست ۾ موجود عنوان ڏسو ۽ مٽايو",
        "prefs-editwatchlist-raw": "ڪچي ٽيٽ فهرست سنواريو",
        "prefs-editwatchlist-clear": "پنهنجي ٽيٽ فهرست ڊاهيو",
-       "prefs-watchlist-days-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن|ڏينهن}}",
+       "prefs-watchlist-days": "ٽيٽ فهرست ۾ ڏيکارڻ لاءِ ڏينهن :",
+       "prefs-watchlist-days-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
        "prefs-watchlist-edits-max": "وڌ ۾ وڌ تعداد: 1000",
+       "prefs-watchlist-token": "ٽيٽ لسٽ جو ٽوڪن:",
+       "prefs-misc": "متفرق",
        "prefs-resetpass": "ڳجھو لفظ بدلايو",
        "prefs-changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
        "prefs-setemail": "ڪو برق ٽپال پتو ڄاڻايو",
        "prefs-email": "برق ٽپال چارا",
        "prefs-rendering": "حليو",
        "saveprefs": "سانڍيو",
+       "prefs-editing": "سنوارڻ",
+       "rows": "قطارون:",
+       "columns": "ڪالمَ:",
+       "searchresultshead": "ڳولا",
        "stub-threshold-sample-link": "نمونو",
        "stub-threshold-disabled": "غيرفعال",
-       "recentchangesdays-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن|ڏينهن}}",
+       "recentchangesdays": "تازين تبديلين ۾ ڏيکارڻ جي لاءِ ڏينهن:",
+       "recentchangesdays-max": "وڌ ۾ وڌ $1 {{PLURAL:$1|ڏينهن}}",
+       "recentchangescount": "عدم پيروي جي صورت ۾ ڏيکارڻ جي لاءِ ترميمون:",
        "prefs-help-recentchangescount": "ان ۾ تازيون تبديليون، صفحن جي سوانح، ۽ لاگ شامل آهن.",
-       "savedprefs": "توهان جو ترجيحات سانڍجي چڪيون آهن.",
+       "savedprefs": "توهان جون ترجيحات سانڍجي چڪيون آهن.",
        "savedrights": "{{GENDER:$1|$1}} نالي يوزر جا حق سانڇجي چڪا آهن.",
        "timezonelegend": "اوقاتي زون:",
        "localtime": "مقامي وقت:",
+       "timezoneuseserverdefault": "وڪي عدم پيروي استعمال ڪريو ($1)",
        "servertime": "سَروَر پٽاندر وقت:",
        "guesstimezone": "جھانگُوءَ مان ڀريو",
        "timezoneregion-africa": "آفريڪا",
        "allowemail": "ٻين يُوزرس کان ايندڙ برق ٽپال بحال ڪريو",
        "prefs-searchoptions": "ڳولا",
        "prefs-namespaces": "نانءُپولار",
+       "default": "ڏنل",
        "prefs-files": "فائيلس",
        "prefs-emailconfirm-label": "برق ٽپال جي خاطري:",
        "youremail": "برق ٽپال:",
-       "username": "يُوزرنانءُ",
+       "username": "{{GENDER:$1|يُوزرنانءُ}}",
        "prefs-registration": "رجسٽريشن جو وقت:",
        "yourrealname": "اصل نالو:",
        "yourlanguage": "ٻولي:",
        "prefs-info": "بنيادي ڄاڻ",
        "prefs-i18n": "بين‌الاقوامڪاري",
        "prefs-signature": "صحيح",
+       "prefs-dateformat": "تاريخ جو طرز",
        "prefs-advancedediting": "عمومي چارا",
        "prefs-editor": "ايڊيٽر",
        "prefs-preview": "پيش نگاهہ",
        "prefs-tokenwatchlist": "ٽوڪن",
        "prefs-diffs": "تفاوت",
        "prefs-help-prefershttps": "هيءَ ترجيح توهان جي ايندڙ لاگ اِن تي عمل ۾ ايندي.",
-       "email-address-validity-valid": "برق ٽپال پتو قابل ڪار ڏسجي ٿو.",
-       "email-address-validity-invalid": "قابل ڪار برق ٽپال پتو ڄاڻايو",
-       "userrights": "يُوزر حقن جي انتظامڪاري",
+       "userrights": "يُوزر حقن جو انتظام",
+       "userrights-lookup-user": "يوزر گروپَ سنڀاليو",
        "userrights-user-editname": "يُوزرنانءُ ڄاڻايو:",
+       "editusergroup": "يوزر گروپَ سنواريو",
+       "userrights-editusergroup": "يوزر گروپَ سنواريو",
+       "saveusergroups": "يوزر گروپَ سنڀاليو",
        "userrights-groupsmember": "برڪن:",
        "userrights-groupsmember-auto": "رڪن واجبي:",
        "userrights-reason": "سبب:",
        "userrights-no-interwiki": "توهان کي ٻين وڪيز تي يُوزر حقن ۾ ترميم ڪرڻ جو حق حاصل نہ آهي.",
        "userrights-nodatabase": "اعداخانو $1 يا تہ وجود نہ ٿو رکي يا تہ اهو مقامي اعدادخانو نہ آهي.",
+       "userrights-notallowed": "توهان کي يوزر جا حق شامل يا هٽائڻ جي اجازت نه آهي.",
+       "userrights-changeable-col": "گروپَ جيڪي توهان تبديل ڪري سگھو ٿا",
+       "userrights-unchangeable-col": "گروپَ جيڪي توهان تبديل نٿا ڪري سگھو",
        "group": "گروپ:",
        "group-user": "يوزرس",
+       "group-autoconfirmed": "خودبخود پڪ ڪيل يوزرس",
+       "group-bot": "بوٽس",
+       "group-sysop": "منتظم",
+       "group-bureaucrat": "ڪامورا",
+       "group-all": "(سڀ)",
+       "group-user-member": "{{GENDER:$1|يُوزر}}",
+       "group-sysop-member": "{{GENDER:$1|منتظم}}",
+       "grouppage-user": "{{ns:project}}:يُوزرس",
        "grouppage-sysop": "{{ns:project}}:منتظمين",
+       "grouppage-bureaucrat": "{{ns:project}}:ڪامورا",
+       "right-read": "صفحا پڙهو",
+       "right-edit": "صفحا سنواريو",
+       "right-createpage": "صفحا سنواريو (جيڪي مباحثي صفحا نہ آهن)",
+       "right-createtalk": "مباحثي صفحا سرجيو",
+       "right-createaccount": "نوان يُوزر کاتا کوليو",
+       "right-move": "صفحا چوريو",
+       "right-move-subpages": "ذيلي صفحن سميت صفحا چوريو",
+       "right-movefile": "فائيل چوريو",
+       "right-upload": "فائيل چاڙهيو",
+       "right-upload_by_url": "ڪنهن يُوآرايل تان فائيل چاڙهيو",
+       "right-writeapi": "اي پر آءِ لکڻ جو استعمال",
+       "right-delete": "صفحا ڊاهيو",
+       "right-bigdelete": "ڊگھيون سوانح رکندڙ صفحا ڊاهيو",
+       "right-browsearchive": "ڊاٺل صفحا ڳوليو",
        "right-undelete": "ڪو صفحو اڻڊاهيو",
+       "right-unblockself": "ڪنهن تان بندش ختم ڪريو",
+       "right-editinterface": "يُوزر باهمرُو کي سنواريو",
+       "right-viewmywatchlist": "پنهنجي ٽيٽ لسٽ ڏسو",
+       "right-editmyoptions": "پنهنجون ترجيحات سنواريو",
+       "right-import": "ٻين وڪيز کان صفحا درآمديو",
+       "right-mergehistory": "صفحن جي سوانح سنواريو",
+       "right-userrights": "سڀ يوزر حق ترميم ڪريو",
+       "right-userrights-interwiki": "هن وڪي جي يوزرس جا حق ترميم ڪريو",
+       "right-sendemail": "ٻين يوزرس ڏانهن ايميل موڪليو",
        "newuserlogpage": "يوزر کاتن جو لاگ",
        "rightslog": "يُوزر حق لاگ",
+       "action-read": "هي صفحو پڙهو",
+       "action-edit": "هن صفحي کي سسنواريو",
+       "action-createpage": "صفحا تخليق ڪريو",
+       "action-createtalk": "مباحثي صفحا تخليق ڪريو",
+       "action-createaccount": "هي يوزر کاتو تخليق ڪريو",
+       "action-history": "هن صفحي جي سوانح ڏسو",
+       "action-minoredit": "هن ترميم کي معمولي طور نشان لڳايو",
+       "action-move": "هيءَُ صفحو چوريو",
+       "action-move-subpages": "هيءُ صفحو، ۽ ان جا ذيلي صفحا چوريو",
+       "action-move-categorypages": "زمرن جا صفحا چوريو",
        "action-movefile": "هيءُ فائيل چوريو",
        "action-upload": "هيءُ فائيل چاڙهيو",
+       "action-delete": "هيءُ صفحو ڊاهيو",
        "action-browsearchive": "ڊاٺل صفحن ۾ ڳوليو",
        "action-undelete": "هيءُ صفحو اڻڊاهيو",
+       "action-import": "ٻي ڪنهن وڪي کان صفحا درآمد ڪريو",
+       "action-importupload": "ڪو فائيل چاڙهي صفحا درآمديو",
+       "action-mergehistory": "هن صفحي جي سوانح ضم ڪريو",
+       "action-userrights": "سڀ يوزر حق ترميم ڪريو",
+       "action-userrights-interwiki": "ٻين وڪيز جي يوزرس جا حق ترميم ڪريو",
+       "action-siteadmin": "اعدادخاني کي بند ڪريو يا کوليو",
+       "action-sendemail": "برق ٽپال اماڻيو",
        "action-editmywatchlist": "پنهنجي ٽيٽ فهرست سنواريو",
        "action-viewmywatchlist": "پنهنجي ٽيٽ فهرست ڏسو",
+       "action-viewmyprivateinfo": "پنهنجي ذاتي معلومات ڏسو",
+       "action-editmyprivateinfo": "پنهنجي ذاتي معلومات سنواريو",
        "nchanges": "$1 {{PLURAL:$1|تبديلي|تبديليون}}",
        "enhancedrc-history": "سوانح",
        "recentchanges": "تازيون تبديليون",
        "recentchanges-label-bot": "هيءُ ترميم بوٽ عمل ۾ آندي.",
        "recentchanges-label-plusminus": "هن صفحي جي ماپ ۾ هيترين ٻاٺڻين جو ڦير آيو آهي",
        "recentchanges-legend-heading": "\"ڪنجي.\"",
-       "rcnotefrom": "هيٺ '''$2''' کان ٿيندڙ تبديليون پيش ڪجن ٿيون ('''$1''' تائين ڏيکارجن ٿيون).",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (پڻ ڏسو [[Special:NewPages|نون صفحن جي فهرست]])",
+       "recentchanges-submit": "ڏيکاريو",
+       "rcnotefrom": "هيٺ {{PLURAL:$5|تبديلي آهي|تبديليون آهن}} کان <strong>$3, $4</strong> (تائين <strong>$1</strong> ) ڏيکاريل آهن.",
        "rclistfrom": "$3 $2 کان شروع ٿيندڙ نيون تبديليون",
        "rcshowhideminor": "$1 معمولي ترميمون",
        "rcshowhideminor-show": "نمايو",
        "rcshowhideanons-show": "نمايو",
        "rcshowhideanons-hide": "لڪايو",
        "rcshowhidepatr": "$1 تاڻيل ترميمون",
+       "rcshowhidepatr-show": "ڏيکاريو",
        "rcshowhidepatr-hide": "لڪايو",
        "rcshowhidemine": "منهنجون ترميمون $1",
        "rcshowhidemine-show": "نمايو",
        "filename": "فائيل نانءُ",
        "filedesc": "خلاصو",
        "fileuploadsummary": "خلاصو:",
+       "filereuploadsummary": "فائيل تبديليون:",
+       "filesource": "ذريعو:",
        "filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
+       "uploadwarning": "چاڙھ جو چتاءُ",
        "savefile": "فائيل سانڍيو",
-       "upload-scripted-pi-callback": "ان فائيل کي اپلوڊ نه ٿو ڪري سگهي جنهن ۾ ايڪس ايم ايل اسٽائيل شيٽ جون پراسيسنگ هدايتون شامل هجن.",
+       "uploaddisabled": "چاڙھ ناقابلِ ڪار بڻيل.",
+       "upload-scripted-pi-callback": "ن فائيل کي اپلوڊ نه ٿو ڪري سگهي جنهن ۾ ايڪس ايم ايل اسٽائيل شيٽ جون پراسيسنگ هدايتون شامل هجن.",
        "uploaded-script-svg": "اسڪرپٽ جوڳو ايليمينٽ ”$1” مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾.",
        "uploaded-hostile-svg": "اپلوڊ ٿيل ايس وي جي فائيل جو غير محفوظ سي ايس ايس ۾ اسٽائيل ايلمينٽ مليو",
-       "uploaded-event-handler-on-svg": "واقعي جون هينڊل ڪندڙ وصفون \n<code>$1=\"$2\"</code> ايس وي جي فائيل ۾ اجازت نه آهي.",
-       "uploaded-href-attribute-svg": "Href خاصيتون \n<code>&lt;$1 $2=\"$3\"&gt;</code> نان لوڪل ٽارگيٽ سان جهڙوڪ ( http://, javascript:, وغيره) ايس وي جي فائيل ۾ اجازت مليل نه آهن",
+       "uploaded-event-handler-on-svg": "ايس وي جي فائيل ۾ ايوينٽ هينڊلر خصوصيتون <code>$1=\"$2\"</code> مقرر ڪرڻ جي اجازت نہ آهي.",
+       "uploaded-href-attribute-svg": "Href خاصيتون <code>&lt;$1 $2=\"$3\"&gt;</code> نان لوڪل ٽارگيٽ سان جهڙوڪ ( http://, javascript:, وغيره) ايس وي جي فائيل ۾ اجازت مليل نه آهن.",
        "uploaded-href-unsafe-target-svg": "href جو غير محفوظ نشانو مليو آهي <code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾",
        "uploaded-animate-svg": "”اينيميٽ“ ٽيگ ڳوليو  جيڪا ٿي سگهي ٿو href کي تبديل ڪري رهي هجي. \"form\" وصف استعمال ڪندي <code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾",
        "uploaded-setting-event-handler-svg": "واقعي کي هينڊل ڪندڙ جي سيٽنگ جون وصفون بلاڪ ٿيل آهن. \n<code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو",
        "uploaded-remote-url-svg": "ايس وي جي جيڪا سيٽ ڪري ٿي ڪنهن اسٽائيل وصف  رموٽ يو آر ايل سان  بلاڪ ٿيل آهي.\n <code>$1=\"$2\"</code> اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو",
        "uploaded-image-filter-svg": "هن يو آر ايل سان <code>&lt;$1 $2=\"$3\"&gt;</code> اميج فلٽر مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾،",
        "uploadvirus": "هن فائيل ۾ وائرس آهي! \nتفصيل: $1",
+       "upload-source": "ذريعي جو فائيل",
+       "sourcefilename": "ذريعي جي فائيل جو نالو:",
+       "upload-description": "فائيل جي تشريح",
+       "upload-options": "چاڙھ جا چارا",
        "watchthisupload": "هيءُ فائيل ٽيٽيو",
        "upload-success-subj": "چاڙهہ ڪامياب",
+       "upload-failure-subj": "چاڙھ جو مسئلو",
+       "upload-warning-subj": "چاڙھ جو چتاءُ",
+       "upload-file-error": "اندروني چُڪَ",
        "upload-dialog-title": "فائيل چاڙهيو",
        "upload-dialog-button-cancel": "رد",
+       "upload-dialog-button-done": "ٿي ويو",
        "upload-dialog-button-save": "سانڍيو",
        "upload-dialog-button-upload": "چاڙهيو",
        "upload-form-label-select-file": "فائيل چونڊيو",
+       "upload-form-label-infoform-title": "تفصيل",
        "upload-form-label-infoform-name": "نالو",
        "upload-form-label-infoform-description": "تشريح",
        "upload-form-label-usage-title": "استعمال",
        "foreign-structured-upload-form-label-own-work": "هيءُ منهنجو پنهنجو ڪم آهي.",
        "foreign-structured-upload-form-label-infoform-categories": "زمرا",
        "foreign-structured-upload-form-label-infoform-date": "تاريخ",
+       "backend-fail-notexists": "فائيل ''$1'' وجود نٿو رکي.",
+       "backend-fail-delete": "\"$1\" فائيل ڊهي نہ سگھيو.",
+       "backend-fail-alreadyexists": "\"$1\" فائيل اڳ ئي وجود رکي ٿو.",
+       "backend-fail-copy": "فائيل \"$1\" کي \"$2\" ڏانهن نقل نه ڪري سگھيو.",
+       "backend-fail-move": "فائيل \"$1\" کي \"$2\" ڏانهن چوري نه سگھيو.",
+       "backend-fail-opentemp": "عارضي فائيئ کولي نه سگھيو.",
+       "backend-fail-read": "فائيل \"$1\" کي پڙهي نه سگھيو.",
        "license-header": "لائيسنسڪاري",
        "listfiles-delete": "ڊاهيو",
        "imgfile": "فائيل",
        "listfiles": "فائيل فهرست",
+       "listfiles_date": "تاريخ",
        "listfiles_name": "نالو",
        "listfiles_user": "يُوزر",
        "listfiles_size": "ماپَ",
        "listfiles_description": "تشريح",
+       "listfiles_count": "ورزن",
+       "listfiles-latestversion": "هاڻوڪو ورزن",
        "listfiles-latestversion-yes": "ها",
        "listfiles-latestversion-no": "نہ",
        "file-anchor-link": "فائيل",
        "filehist": "فائيل جي سوانح",
-       "filehist-help": "ڪنهن به تاريخ/وقت تي ڪلڪ ڪري ڏسندا ته تڏڻي اهو فائيل ڪيئن هو.",
+       "filehist-help": "ڪنهن بہ تاريخ/وقت تي ڪلڪ ڪري ڏسندا تہ ان وقت اهو فائيل ڪيئن هو.",
        "filehist-deleteall": "سڀ ڊاهيو",
        "filehist-deleteone": "ڊاهيو",
        "filehist-revert": "واپس ورايو",
-       "filehist-current": "هاڻوڪو",
+       "filehist-current": "حاليہ",
        "filehist-datetime": "تاريخ/وقت",
        "filehist-thumb": "آڱوٺي ننهن",
+       "filehist-thumbtext": "$1 جي نظرثاني لاءِ تصويري نشان",
        "filehist-user": "يُوزر",
        "filehist-dimensions": "ماپَ",
        "filehist-filesize": "فائيل سائيز",
        "filehist-comment": "تاثرات",
        "imagelinks": "فائيل جو استعمال",
        "linkstoimage": "هن فائيل سان {{PLURAL:$1|هيٺيون صفحو ڳنڍيل آهي |$1 هيٺيان صفحا ڳنڍيل آهن}}:",
-       "nolinkstoimage": "هن فائيل سان ڪو به صفحو ڳنڍيل ناهي.",
-       "sharedupload": "هيءَ هڪ شراڪتي چاڙهه آهي، تنهنڪري ان کي ٻيون رٿائون به استعمال ڪري سگھن ٿيون.",
+       "nolinkstoimage": "هن فائيل سان ڪي بہ صفحا ڳنڍيل ناهن.",
+       "sharedupload": "هيءَ فائيل $1 کان آهي ۽ ان کي ٻيون رٿائون به استعمال ڪري سگھن ٿيون.",
+       "sharedupload-desc-here": "هي فائيل $1 مان آهي ۽ ٻين رٿائن پاران پڻ استعمال ٿي سگهي ٿو. تشريح انجي [[$2 جو تشريحي صفحو]] هيٺان ڏنل آهي.",
        "uploadnewversion-linktext": "هن فائيل جو نئون پرت چاڙهيو",
        "shared-repo-from": "$1 کان",
        "upload-disallowed-here": "توهان هن فائيل مٿان لکي نہ ٿا سگھو.",
        "fewestrevisions": "گھٽانگھٽ ترميميل صفحا",
        "nbytes": "$1 {{PLURAL:$1|ٻاٽڻ|ٻاٽڻيون}}",
        "ncategories": "$1 {{PLURAL:$1|زمرو|زمرا}}",
-       "ninterwikis": "$1 {{PLURAL:$1|بين‌الوڪي|بين‌الوڪي}}",
+       "ninterwikis": "$1 {{PLURAL:$1|بين‌الوڪي}}",
        "nlinks": "$1 {{PLURAL:$1|ڳنڍڻو|ڳنڍڻا}}",
        "nmembers": "$1 {{PLURAL:$1|رڪن|رڪنَ}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|رڪن|رڪنَ}}",
        "wantedtemplates": "گھربل سانچا",
        "mostlinked": "صفحن سان وڌانوڌ ڳنڍيندڙ",
        "mostlinkedcategories": "زمرن سان وڌانوڌ ڳنڍيل",
-       "mostlinkedtemplates": "گھڻي کان گھڻا سانچا رکندڙ",
+       "mostlinkedtemplates": "گھڻي کان گھڻا سانچا رکندڙ صفحا",
        "mostcategories": "گھڻي کان گھڻا زمرا رکندڙ صفحا",
        "mostimages": "وڌانوڌ ڳنڍيندڙ فائيل",
        "mostrevisions": "وڌانوڌ ترميميل صفحا",
        "prefixindex": "هيءَ اڳياڙي رکندڙ سمورا صفحا",
        "prefixindex-namespace": "سمورا صفحا جن کي هيءَ اڳياڙي آهي ($1 نانءُپولار)",
+       "prefixindex-submit": "ڏيکاريو",
        "shortpages": "مختصر صفحا",
        "longpages": "طويل صفحا",
        "deadendpages": "اڻ ڳنڍيندڙ صفحا",
        "protectedpages-noredirect": "چورڻا لڪايو",
        "protectedpages-page": "صفحو",
        "protectedpages-reason": "سبب",
+       "protectedpages-submit": "صفحا ڏيکاريو",
        "protectedpages-unknown-timestamp": "اڻڄاتل",
        "protectedpages-unknown-performer": "نامعلوم يُوزر",
        "protectedtitles": "تحفظيل عنوان",
+       "protectedtitles-submit": "عنوان ڏيکاريو",
        "listusers": "يُوزر فهرست",
        "newpages": "نوان صفحا",
        "newpages-username": "يُوزرنانءُ:",
        "booksources": "ڪتابي وسيلا",
        "booksources-search-legend": "ڪتابي ذريعن جي ڳولا ڪريو",
        "booksources-search": "ڳوليو",
-       "specialloguserlabel": "Ù\8aÙ\8fÙ\88زر:",
-       "speciallogtitlelabel": "عنوان:",
+       "specialloguserlabel": "Ù¾Ù\8aØ´ ÚªÙ\86دÚ\99:",
+       "speciallogtitlelabel": "نشانو (عنوان يا {{ns:user}}:يا يوزنانءُ يور جي لاءِ):",
        "log": "لاگس",
-       "all-logs-page": "سڀئي لاگس",
+       "all-logs-page": "سڀ عوامي لاگس",
        "allpages": "سڀ صفحا",
        "nextpage": "اڳيون صفحو ($1)",
        "prevpage": "پويون صفحو ($1)",
        "listusers-noresult": "ڪو بہ يُوزر نہ لڌو",
        "listusers-blocked": "(بندشيل)",
        "activeusers": "سرگرم يُوزرس جي فهرست",
+       "activeusers-hidebots": "بوٽس لڪايو",
        "activeusers-hidesysops": "منتظمن کي لڪايو",
        "activeusers-noresult": "ڪي بہ يُوزرس نہ لڌا.",
+       "activeusers-submit": "سرگرم يُوزرس ڏيکاريو",
+       "listgrouprights": "يوزر گروپ جا حق",
        "listgrouprights-group": "گروهہ:",
        "listgrouprights-rights": "حق",
        "listgrouprights-members": "(رڪنن جي لسٽ)",
+       "listgrouprights-addgroup-all": "سڀ گروپَ شامل ڪريو",
+       "listgrouprights-removegroup-all": "سڀ گروپ هٽايو",
        "listgrouprights-namespaceprotection-namespace": "نانءُ پولار:",
+       "trackingcategories-name": "پيغام جو نالو",
+       "trackingcategories-nodesc": "ڪا به تشريح موجود نه آهي.",
+       "trackingcategories-disabled": "زمرو ناقابلِ ڪار بڻايل آهي.",
        "emailuser": "هن يوزر کي برق ٽپال اماڻيو",
        "emailuser-title-notarget": "يُوزر ڏانهن برق ٽپال اماڻيو",
+       "usermaildisabled": "يوزر ايميل ناقابلِ ڪار بڻيل",
+       "usermaildisabledtext": "توهان هن وڪي تي ٻين يوزرس ڏانهن ايميل نٿا موڪلي سگھو",
        "noemailtitle": "برق ٽپال پتو نامعلوم",
        "noemailtext": "هن يُوزر ڪو بہ قابل ڪار برق ٽپال پتو نہ ڄاڻايو آهي.",
        "emailusername": "يُوزرنانءُ:",
        "emailccme": "نياپي جو پرت مون کي برق ٽپال ڪريو.",
        "emailsent": "برق ٽپال اماڻجي چڪي",
        "emailsenttext": "توهان جو برق ٽپال نياپو اماڻجي چڪو آهي.",
-       "watchlist": "Ù\85Ù\86Ù\87Ù\86جÙ\8a Ù½Ù\8aÙ½ Ù\81Ù\87رست",
+       "watchlist": "ٽيٽ فهرست",
        "mywatchlist": "ٽيٽ فهرست",
        "addwatch": "ٽيٽ فهرست ۾ شامل ڪريو",
-       "addedwatchtext": "صفحو بعنوان \"[[:$1]]\" اوهان جي [[Special:Watchlist|ٽيٽ فهرست]] ۾ شامل ٿي ويو. استقبالي تبديليون هتي درج ٿينديون وينديون. اهو صفحو [[Special:RecentChanges|تازين تبديلين]] واري صفحي تي '''گهرن''' اکرن ۾ نمايان ڪري ڏيکاريو ويندو. جيڪڏهن اوهان اهو سڀ نه ٿا چاهيو ته '''اڻ ٽيٽيو''' تي ڪلڪ ڪريو.",
+       "addedwatchtext": "صفحو\"[[:$1]]\" ان جي بحث وارو صفحو اوهان جي [[Special:Watchlist|ٽيٽ فهرست]] ۾ شامل ڪيو ويو آهي.",
        "removedwatchtext": "صفحو بعنوان \"[[:$1]]\" توهان جي [[Special:Watchlist|ٽيٽ فهرست]] مان هٽي چڪو آهي.",
        "removedwatchtext-short": "\"صفحو بعنوان \"$1\" توهان جي ٽيٽ فهرست مان هٽي چڪو آهي.\"",
        "watch": "ٽيٽيو",
        "unwatch": "اڻ ٽيٽيو",
        "unwatchthispage": "ٽيٽڻ ڇڏيو",
        "notanarticle": "غير موادي صفحو",
-       "watchlist-details": "مباحثي صفحن کان سواءِ {{PLURAL:$1|$1 صفحو|$1 صفحا}} ٽيٽيل.",
-       "wlshowlast": "پوين $1 ڪلاڪن $2 ڏينهن جا  ڏيکاريو",
+       "watchlist-details": "{{PLURAL:$1|$1 صفحو|$1 صفحا}} توهان جي ٽيٽ فهرست، ڳالھ ٻولھ جا صفحا الڳ شمار نٿا ٿين.",
+       "wlshowlast": "گذريل $1 ڪلاڪ $2 ڏينهن ڏيکاريو",
+       "watchlistall2": "سڀ",
+       "watchlist-hide": "لڪايو",
+       "watchlist-submit": "ڏيکاريو",
+       "wlshowtime": "ڏيکارڻ جي لاءِ وقت جو دورانيو:",
+       "wlshowhideminor": "معمولي ترميم",
+       "wlshowhidebots": "بوٽس",
+       "wlshowhideliu": "کاتيدار يُوزرس",
+       "wlshowhideanons": "گمنام يُوزرس",
+       "wlshowhidemine": "منهنجون ترميمون",
+       "watchlist-options": "زيرِ نظر فهرست جا چارا",
        "watching": "ٽيٽيندي...",
        "unwatching": "اڻ ٽيٽيندي...",
+       "enotif_reset": "سڀ گھميل صفحن تي نشان لڳايو",
        "enotif_impersonal_salutation": "{{SITENAME}} يُوزر",
+       "enotif_lastdiff": "هي تبديلي ڏسڻ لاءِ $1 ڏسو",
        "enotif_anon_editor": "گمنام يُوزر $1",
        "created": "ٺهي چڪو",
        "changed": "تبديل ٿي ويو",
        "confirm": "پڪ ڪريو",
        "delete-confirm": "\"$1\" ڊهي چڪو",
        "delete-legend": "ڊاهيو",
-       "historywarning": "خبردار: جيڪو صفحو توهان ڊاهڻ وارا آهيو، تنهن جي هڪ سوانح آهي:",
+       "historywarning": "<strong>خبردار:</strong> جيڪو صفحو توهان ڊاهڻ وڃي رهيا آهيو ان ساڻ هڪ تاريخ آهي $1 {{PLURAL:$1|revision|revisions}}:",
        "confirmdeletetext": "توهان هڪ صفحي کي ان جي سموري سوانح سميت ڊاهڻ وارا آهيو. مهرباني ڪري پڪ ڪندا ته توهان اهو ئي ڪرڻ گھرو ٿا، ۽ اهو ته توهان ان جي نتيجن کان واقف آهيو، ۽ اهو پڻ ته توهان اهو ڪم [[{{MediaWiki:Policy-url}}|پاليسي]]ءَ مطابق ڪري رهيا آهيو.",
        "actioncomplete": "ڪم پُورو",
+       "actionfailed": "عمل ناڪام",
        "deletedtext": "\"$1\" ڊهي چڪو آهي.\nتازو ڊاٺل صفحن جي فهرست لاءِ $2 ڏسندا.",
        "dellogpage": "ڊاٺ لاگ",
        "deletionlog": "ڊاٺ لاگ",
        "rollbacklinkcount": "اڻ ڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
        "changecontentmodel-title-label": "صفحي جو عنوان",
        "changecontentmodel-reason-label": "سبب:",
+       "logentry-contentmodel-change-revertlink": "واپس ورايو",
+       "logentry-contentmodel-change-revert": "واپس ورايو",
        "protectlogpage": "تحفظ لاگ",
+       "protectedarticle": "محفوظ ٿيل \"[[$1]]\"",
        "prot_1movedto2": "[[$1]] کي چوري [[$2]] تي رکيو ويو",
        "protect-legend": "تحفظڻ جي پڪ ڪريو",
        "protectcomment": "سبب:",
        "protect_expiry_old": "انجامي مدو ماضيءَ ۾ آهي.",
        "protect-text": "توهان '''$1''' صفحي جي تحفظاتي سطح ڏسي ۽ بدلائي سگھو ٿا.",
        "protect-locked-access": "توهان جو کاتو صفحن جي تحفظاتي سطح تبديلي ڪرڻ جا اختيار نه ٿو رکي. هيٺ صفحي جون وقوعات (سيٽڱس) پيش ڪجن ٿيون '''$1''':",
-       "protect-cascadeon": "هيءُ صفحو في الوقت تحفظيل آهي، ڇاڪاڻ ته اهو هيٺين {{PLURAL:$1|صفحي|صفحن}} جو حصو آهي، جنهن تي تحفظ در تحفظ لاڳو ٿيل آهي.",
+       "protect-cascadeon": "هيءُ صفحو في الوقت تحفظيل آهي، ڇاڪاڻ ته اهو هيٺين {{PLURAL:$1|صفحي|صفحن}} جو حصو آهي، جنهن تي تحفظ در تحفظ لاڳو ٿيل آهي.\nChanges to this page's protection level will not affect the cascading protection.",
        "protect-default": "سمورن يُوزرس کي اجازت ڏيو",
-       "protect-fallback": "\"$1\" جي اجازت گھرجي",
-       "protect-level-autoconfirmed": "غÙ\8aرکاتÙ\8aدار Ù\8aÙ\8fÙ\88زرس Ú©Ù\8a Ø¨Ù\86دشيو",
-       "protect-level-sysop": "صرف منتظمين",
+       "protect-fallback": "\"$1\" جي اجازت وارن يوزرس کي اجازت ڏيو",
+       "protect-level-autoconfirmed": "Ø®Ù\88دڪار Ù\86Ù\85Ù\88Ù\86Ù\8a Ù¾Úª ÚªÙ\8aÙ\84 Ù\8aÙ\88زرس Ú©Ù\8a Ø§Ø¬Ø§Ø²Øª Ú\8fيو",
+       "protect-level-sysop": "صرف منتظمين کي اجازت ڏيو",
        "protect-summary-cascade": "تحفظ در تحفظ",
+       "protect-expiry-indefinite": "لامحدود",
        "protect-cascade": "هن صفحي ۾ شامل صفحن کي تحفظيو (تحفظ در تحفظ)",
        "protect-cantedit": "توهان هن صفحي جي تحفظاتي سطح نٿا بدلائي سگھو، ڇاڪاڻ ته توهان ان کي سنوارڻ جي اجازت نٿا رکو.",
+       "protect-othertime": "ٻيو وقت:",
+       "protect-othertime-op": "ٻيو وقت",
+       "protect-existing-expiry": "موجوده پڄاڻي جو وقت: $3, $2",
+       "protect-existing-expiry-infinity": "موجوده پڄاڻي جو وقت: لامحدود",
        "protect-otherreason-op": "ٻيو سبب",
-       "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",
+       "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": "روڪ سطح:",
        "pagesize": "(ٻاٽڻيون)",
        "undeletebtn": "بحاليو",
        "undeleteviewlink": "ڏسو",
        "undeletecomment": "سبب:",
+       "undelete-search-title": "ڊاٺل صفحا ڳوليو",
+       "undelete-search-box": "ڊاٺل صفحا ڳوليو",
+       "undelete-search-prefix": "سان شروع ٿيندڙ صفحا ڏيکاريو:",
        "undelete-search-submit": "ڳوليو",
        "undelete-error-short": "هيءُ فائيل اڻڊاهيندي چُڪَ ٿي آهي: $1",
        "undelete-show-file-submit": "ها",
        "namespace": "نانءُ پولار:",
        "invert": "چونڊ ابتيو",
+       "tooltip-invert": "هن دٻي تي نشان لڳايو صحفن ۾ تبديليون لڪائڻ لاءِ چونڊيل نيم اسپيس مان (۽ لاڳاپيل نيم اسپيس جيڪڏهن نشان لڳل)",
        "namespace_association": "منسلڪ نانءُپولار",
        "blanknamespace": "(مُک)",
        "contributions": "{{GENDER:$1|يوزر}} جون ڀاڱيداريون",
        "contributions-title": "يُوزر ڀاڱيداريون براءِ $1",
        "mycontris": "ڀاڱيداريون",
-       "contribsub2": "براءِ $1 ($2)",
-       "uctop": "(سِرُ)",
+       "anoncontribs": "ڀاڱيداريون",
+       "contribsub2": "{{GENDER:$3|$1}} ($2) لاءِ",
+       "contributions-userdoesnotexist": "يُوزر کاتو \"$1\" درج ٿيل نہ آهي.",
+       "uctop": "(هاڻوڪو)",
        "month": "مهينو (۽ اڳوڻيون):",
        "year": "سال (۽ اڳوڻيون):",
+       "sp-contributions-newbies": "صرف نون کاتن جون ڀاڱيداريون ڏيکاريو",
        "sp-contributions-newbies-sub": "نون کاتن لاءِ",
+       "sp-contributions-newbies-title": "نون کاتن جي لاءِ يوزر جون ڀاڱيداريون",
        "sp-contributions-blocklog": "بنسش لاگ",
-       "sp-contributions-talk": "بحث",
+       "sp-contributions-deleted": "يُوزر جون ڊاٺل ڀاڱيداريون",
+       "sp-contributions-uploads": "چاڙھَ",
+       "sp-contributions-logs": "لاگس",
+       "sp-contributions-talk": "ڳالھہ",
+       "sp-contributions-userrights": "يُوزر حقن جي سنڀال",
+       "sp-contributions-search": "ڀاڱيدارين لاءِ ڳولا ڪريو",
+       "sp-contributions-username": "آءِپي پتو يا يوزرنانءُ:",
        "sp-contributions-submit": "ڳوليو",
        "whatlinkshere": "هتان ڇا ڳنڍيل آهي",
        "whatlinkshere-title": "$1 سان ڳنڍيل صفحا",
        "whatlinkshere-hideredirs": "$1 چورجي ٿو",
        "whatlinkshere-hidelinks": "$1 ڳنڍڻا",
        "whatlinkshere-filters": "ڇاڻيون",
+       "whatlinkshere-submit": "هلو",
        "block": "يُوزر کي بندشيو",
        "unblock": "يُوزر کي اڻبندشيو",
-       "blockip": "يُوزر کي روڪيو",
+       "blockip": "{{GENDER:$1|يوزر}} تي بندش وجھو",
        "blockip-legend": "يُوزر کي بندشيو",
        "ipbexpiry": "اختتام:",
        "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",
+       "ipbother": "ٻيو وقت:",
+       "ipboptions": "2 ڪلاڪ:2 hours,1 ڏينهن:1 day,3 days:3 days,1 هفتو:1 week,2 weeks:2 weeks,1 مهينا:1 month,3 مهينا:3 months,6 مهينا:6 months,1 سال:1 year,اڻ کٽ:infinite",
        "ipb-confirm": "بندش جي پڪ ڪريو",
        "badipaddress": "ناقابلڪار آءِ پي پتو",
        "blockipsuccesssub": "بندش ڪامياب ٿي",
        "unblockip": "يُوزر کي اڻبندشيو",
        "ipusubmit": "اها بندش هٽايو",
-       "unblocked-range": "$1 تان بندش هتي چڪي آهي.",
+       "unblocked-range": "$1 تان بندش هٽي چڪي آهي.",
        "unblocked-id": "بندش $1 هٽي چڪي آهي.",
        "blocklist": "بندشيل يُوزرس",
-       "ipblocklist": "بندشيل يوزرنانءُ ۽ آءِ پي پتا",
+       "ipblocklist": "بندش وڌل يوزرس",
        "blocklist-timestamp": "اوقاتي مهر",
        "blocklist-target": "هدف",
+       "blocklist-expiry": "اختتام:",
        "blocklist-reason": "سبب",
        "ipblocklist-submit": "ڳوليو",
        "ipblocklist-localblock": "مقامي بندش",
        "infiniteblock": "لامحدود",
-       "anononlyblock": "فقط نامعلوم",
-       "noautoblockblock": "خودڪار بندش روڪيل",
+       "anononlyblock": "فقط گمنام",
+       "noautoblockblock": "خودڪار بندش ناقابلِ ڪار بڻيل",
        "createaccountblock": "کاتو کولڻ جي روڪَ ٿيل",
        "emailblock": "برق ٽپال غير فعال",
        "blocklink": "بندشيو",
        "unlockbtn": "اعدادخاني کي کوليو",
        "move-page": "$1 چوريو",
        "move-page-legend": "صفحو چوريو",
-       "movepagetext": "هيٺيون فارم استعمال ڪندي ڪنهن صفحي کي نئون عنوان ڏئي سگھجي ٿو، جنهن سان سمورو صفحو نئين عنوان ڏانهن هليو ويندو. اڳوڻو عنوان نئين عنوان ڏانهن چورڻو بنجي ويندو. ان ڳالهه جي پڪ ڪرڻ ذميواري توهان تي آهي ته ڳنڍڻا اتي ئي وٺي وڃن ٿا جتي انهن کي وٺي وڃڻ گھرجي.\n\nياد رکندا ته جيڪڏهن نئين عنوان سان اڳي ئي ڪو مضمون موجود آهي ته پوءِ صفحو '''نه''' چوريو ويندو، سوا ان جي ته موجوده صفحو محظ خالي آهي يا ڪا به سوانح نه رکندڙ ڪو چورڻو آهي.\n\n'''خبردار!'''\nاها هڪ مقبول صفحي لاءِ ڪا غير متوقه ۽ انتهائي اڻوڻندڙ تبديلي ثابت ٿي سگھي ٿي؛ براءِ مهرباني اڳتي وڌڻ کان اڳ پڪ ڪندا ته توهان اها تبديلي آڻڻ جي نتيجن کان چڱيءَ ريت واقف آهيو.",
-       "movepagetalktext": "واسطيدار مباحثي صفحو پاڻهي ئي چوريو ويندو ماهسوا:\n\n*نئين عنوان سان هڪ اڻ پورو يعني غير خالي مباحثي صفحو اڳي ئي وجود رکندو هجي، يا\n*توهان هيٺين باڪس کي اڻ ٽِڪ ڪريو\n\nانهن صورتن ۾، جيڪڏهن توهان چاهيو ته صفحي کي پاڻ چوري يا ضمائي سگھو ٿا.",
+       "movepagetext": "هيٺيون فارم استعمال ڪندي ڪنهن صفحي کي نئون عنوان ڏئي سگھجي ٿو، جنهن سان سمورو صفحو نئين عنوان ڏانهن هليو ويندو. \nاڳوڻو عنوان نئين عنوان ڏانهن چورڻو بنجي ويندو. \nتوهان  چورڻن کي سنواري سگھو ٿا جيڪي اصل عنوان ڏانهن خودبخود اشارو ڪن ٿا.\nIf you choose not to, be sure to check for [[Special:DoubleRedirects|double]] or [[Special:BrokenRedirects|broken redirects]].\nان ڳالهه جي پڪ ڪرڻ ذميواري توهان تي آهي ته ڳنڍڻا اتي ئي وٺي وڃن ٿا جتي انهن کي وٺي وڃڻ گھرجي.\n\nياد رکندا ته جيڪڏهن نئين عنوان سان اڳي ئي ڪو مضمون موجود آهي ته پوءِ صفحو '''نه''' چوريو ويندو، سوا ان جي ته موجوده صفحو محظ خالي آهي يا ڪا به سوانح نه رکندڙ ڪو چورڻو آهي.\n\n<strong>خبردار!</strong>\nاها هڪ مقبول صفحي لاءِ ڪا غير متوقه ۽ انتهائي اڻوڻندڙ تبديلي ثابت ٿي سگھي ٿي؛ براءِ مهرباني اڳتي وڌڻ کان اڳ پڪ ڪندا ته توهان اها تبديلي آڻڻ جي نتيجن کان چڱيءَ ريت واقف آهيو.",
+       "movepagetalktext": "جيڪڏهن توهان هن خاني کي نشان لڳائيندئو، واسطيدار مباحثي صفحو پاڻ ئي چوريو ويندو ماسواءِ اتي ڪو اڳ ئي ڪو غيرخالي مباحثي صفحو موجود هجي.\n\nان صورت ۾، جيڪڏهن توهان چاهيو ته صفحي کي پاڻ چوري يا ضم ڪري سگھو ٿا.",
        "movenotallowed": "توهان کي صفحا چورڻ جي اجازت حاصل ڪانهي.",
        "movenotallowedfile": "توهان کي فائيلس چورڻ جي اجازت حاصل ڪانهي.",
-       "newtitle": "Ù\86ئÙ\8aÙ\86 Ø¹Ù\86Ù\88اÙ\86 Ú\8fاÙ\86Ù\87ن:",
+       "newtitle": "Ù\86ئÙ\88Ù\86 Ø¹Ù\86Ù\88ان:",
        "move-watch": "هيءُ صفحو ٽيٽيو",
        "movepagebtn": "صفحو چوريو",
        "pagemovedsub": "چورڻ جو عمل ڪامياب ٿيو",
        "movelogpage": "چورڻ لاگ",
        "movereason": "سبب:",
        "revertmove": "ورايو",
-       "delete_and_move": "ڊاهيو ۽ چوريو",
        "delete_and_move_confirm": "جي ها، صفحو ڊاهيو",
-       "delete_and_move_reason": "چورڻ جو عمل ممڪن بنائڻ لاءِ ڊاٺو ويو",
+       "delete_and_move_reason": "\"[[$1]]\" کان چورڻ جو عمل ممڪن بڻائڻ لاءِ ڊاٺو ويو",
        "export": "صفحا برآمديو",
        "export-submit": "برآمديو",
        "export-download": "بطور فائيل سانڍيو",
        "tooltip-pt-mycontris": "توهان جون ڀاڱيداريون",
        "tooltip-pt-login": "توهان کي همٿائجي ٿو تہ توهان لاگ اِن ٿيو، بهرحال اهو لازمي نہ آهي.",
        "tooltip-pt-logout": "لاگ آئوٽ",
-       "tooltip-pt-createaccount": "توهان جي همٿ افزائي ڪئي وئي آهي ته هڪ کاتو کوليو ۽ لاگ ان ٿيو؛ جيتوڻيڪ، اهو ضروري نه آهي",
+       "tooltip-pt-createaccount": "کاتو کولڻ ۽ لاگ اِن ٿيڻ تي توهان کي همٿايو ويندو؛  جيتوڻيڪ، اهو ضروري نہ آهي",
        "tooltip-ca-talk": "موادي صفحي تي بحث",
        "tooltip-ca-edit": "هيءُ صفحو سنواريو",
        "tooltip-ca-addsection": "نئون سيڪشن شروع ڪريو",
        "tooltip-ca-viewsource": "هيءُ صفحو تحفظيل آهي. توهان ان جو ڪوڊ ڏسي سگھو ٿا.",
-       "tooltip-ca-history": "هن صفحي جون گذريل نظرثانيون",
+       "tooltip-ca-history": "هن صفحي جا گذريل ڀيرا",
        "tooltip-ca-protect": "هيءُ صفحو تحفظيو",
        "tooltip-ca-delete": "هيءُ صفحو ڊاهيو",
        "tooltip-ca-move": "هيءُ صفحو چوريو",
        "tooltip-ca-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
-       "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي ٽيٽ فهرست مان هٽايو",
-       "tooltip-search": "جھڙتيو {{SITENAME}}",
-       "tooltip-search-go": "صÙ\81Ø­Ù\8a ØªÙ\8a Ù\88Ú\83Ù\88 Ø¨Ù\84ÚªÙ\84 Ù\87Ù\86 Ø³Ø§Ú³Ø¦Ù\8a Ù\86اÙ\84Ù\8a Ø³Ø§Ù\86 Ø¬Ù\8aÚªÚ\8fÙ\87Ù\86 Ù\85Ù\88جÙ\88د Ø¢Ù\87Ù\8a ØªÛ\81",
+       "tooltip-ca-unwatch": "هيءُ صفحو پنهنجي زيرِ نظر فهرست تان هٽايو",
+       "tooltip-search": "{{SITENAME}} ۾ ڳوليو",
+       "tooltip-search-go": "تز Ø§Ù\86 Ø¦Ù\8a Ù\86اÙ\84Ù\8a Ø³Ø§Ù\86 ÚªÙ\88 ØµÙ\81Ø­Ù\88 Ù\85Ù\88جÙ\88د Ø¢Ù\87Ù\8a ØªÛ\81 Ú©Ù\88Ù\84Ù\8aÙ\88",
        "tooltip-search-fulltext": "هن متن لاءِ صفحا ڳوليو",
-       "tooltip-p-logo": "مک صفحو وزٽ ڪريو",
+       "tooltip-p-logo": "مک صفحو گھمو",
        "tooltip-n-mainpage": "مک صفحو گھمو",
-       "tooltip-n-mainpage-description": "مکيه صفحو وزٽ ڪريو",
+       "tooltip-n-mainpage-description": "مک صفحو گھمو",
        "tooltip-n-portal": "هن رٿا بابت، توهان ڇا ٿا ڪري سگھو، ڪهڙي شَي ڪٿي ملندي",
        "tooltip-n-currentevents": "تازن واقعن تي تفصيلي ڄاڻ لهو",
        "tooltip-n-recentchanges": "هن وڪيءَ ۾ تازين تبديلين جي فهرست.",
-       "tooltip-n-randompage": "بلاترتيب ڪو به صفحو اتاريو",
-       "tooltip-n-help": "ڳولي لهڻ جي جاءِ.",
+       "tooltip-n-randompage": "بلاترتيب ڪو بہ صفحو اتاريو",
+       "tooltip-n-help": "ڳولي لهڻ جي جاءِ",
        "tooltip-t-whatlinkshere": "هتان ڳنڍيل سمورا وڪي صفحا",
        "tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي سان ڳنڍيل آهن",
+       "tooltip-feed-atom": "هن صفحي لاءِ ايٽم فيڊ",
        "tooltip-t-contributions": "هن يُوزر جون ڀاڱيداريون ڏسو",
        "tooltip-t-emailuser": "هن يُوزر کي برق ٽپال اماڻيو",
        "tooltip-t-upload": "فائيل چاڙهيو",
        "tooltip-diff": "پنهنجون ڪيل تبديليون ڏسو.",
        "tooltip-compareselectedversions": "هن صفحي جن ٻن چونڊيل پرتن درميان تفاوت ڏسو.",
        "tooltip-watch": "هيءُ صفحو پنهنجي ٽيٽ فهرست ۾ شامل ڪريو",
-       "tooltip-rollback": "هن صفحي ۾ پوئين ڀاڱيدار جي ڪيل ترميم (ترميمن) کي هڪ ڪلڪ سان اڻ ڪريو.",
+       "tooltip-rollback": "\"واپس پرايو\" هن صفحي ۾ پوئين ڀاڱيدار جي ڪيل ترميم (ترميمن) کي هڪ ڪلڪ سان اڻڪري ٿو.",
        "tooltip-summary": "ننڍو خلاصو ڏيو",
-       "anonymous": "{{SITENAME}} جا نامعلوم يوزرس",
+       "anonymous": "گمنام {{PLURAL:$1|يوزر|يوزرس}} جو {{SITENAME}}",
        "pageinfo-toolboxlink": "صفحي جي معلومات",
        "pageinfo-contentpage-yes": "ها",
        "pageinfo-protect-cascading-yes": "ها",
        "exif-imagewidth": "ويڪر",
        "exif-imagelength": "اوچائي",
        "exif-bitspersample": "ٻٽڻيون في جُز",
+       "exif-orientation": "شروعات",
        "exif-samplesperpixel": "جزن جو تعداد",
        "exif-xresolution": "افقي تحلل",
        "exif-yresolution": "عمودي تحلل",
        "exif-stripoffsets": "عڪسي اعداد جي مڪانيت",
        "exif-datetime": "فائيل ۾ تبديليءَ جي تاريخ ۽ وقت",
        "exif-imagedescription": "عڪس عنوان",
+       "exif-make": "ڪيمرا ٺاهيندڙ",
        "exif-model": "ڪيميرا ماڊل",
-       "exif-software": "Ù\85ستعÙ\85Ù\84 Ù\85Ù\86تقگري",
+       "exif-software": "Ù\85ستعÙ\85Ù\84 Ù\85Ù\86Ø·قگري",
        "exif-artist": "ليکڪ",
-       "exif-copyright": "حق ۽ واطا رکندڙ",
+       "exif-copyright": "Ø­Ù\82 Û½ Ù\88اسطا Ø±Ú©Ù\86دÚ\99",
        "exif-colorspace": "رنگ پولار",
        "exif-pixelydimension": "عڪس جي ويڪر",
        "exif-pixelxdimension": "عڪس جي اوچائي",
        "exif-unknowndate": "نامعلوم تاريخ",
        "exif-orientation-1": "نارمل",
        "exif-orientation-3": "180° موڙيل",
-       "exif-componentsconfiguration-0": "وجود نه ٿو رکي",
+       "exif-componentsconfiguration-0": "وجود نہ ٿو رکي",
        "exif-exposureprogram-1": "دستينامو",
        "exif-meteringmode-0": "اڻڄاتل",
        "exif-meteringmode-1": "سراسري",
        "confirmemail": "برق ٽپال پتي جي پَڪَ ڪندا",
        "confirmemail_send": "خاطري ڪوڊ اماڻيو",
        "confirmemail_sent": "خاطري برق ٽپال اماڻي وئي.",
-       "confirmemail_success": "توھان جي برق ٽپال جي پڪ ڪئي وئي آھي. ھاڻِ توھان لاگ ان ٿي وڪيءَ جو مزو وٺي سگھو ٿا",
+       "confirmemail_success": "توهان جي برق ٽپال پتي جي تصديق ڪئي وئي آهي.\nهاڻ توهان [[Special:UserLogin|لاگ اِن]] ٿي ۽ وڪي جو مزو وٺي سگھو ٿا.",
        "confirmemail_loggedin": "توهان جي برق ٽپال پتي جي تصديق هاڻي ٿي چڪي آهي.",
        "confirmemail_subject": "{{SITENAME}} برق ٽپال پتي جي تصديق",
        "recreate": "ورسرجيو",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ڳالهہ]])",
        "version": "ورزن",
        "version-extensions": "تنصيب شده توسيعات",
-       "version-skins": "تنصيبشده چَمُون",
+       "version-skins": "تنصيب شده چَمڙيون",
        "version-specialpages": "خاص صفحا",
-       "version-variables": "ڦرڻا",
+       "version-variables": "ڦِرڻا",
        "version-other": "ٻيو",
        "version-license": "ذريعات‌وڪي لائيسنس",
        "version-ext-license": "لائيسنس",
        "version-libraries-description": "تشريح",
        "version-libraries-authors": "ليکڪ",
        "redirect-submit": "ھلو",
-       "redirect-file": "فائيل نانءُ",
-       "fileduplicatesearch-filename": "فائيل نانءُ:",
+       "redirect-file": "فائيلنانءُ",
+       "fileduplicatesearch-filename": "فائيلنانءُ:",
        "fileduplicatesearch-submit": "ڳوليو",
        "specialpages": "خاص صفحا",
-       "specialpages-note-top": "ڪنجي",
+       "specialpages-note-top": "ÚªÙ\8fÙ\86جÙ\8a",
        "specialpages-group-login": "لاگ اِن ٿيو / کاتو کوليو",
        "specialpages-group-users": "يوزرس ۽ حق",
        "blankpage": "خالي صفحو",
        "intentionallyblankpage": "هيءُ صفحو ڄاڻي خالي ڇڏيو ويو آهي.",
-       "tag-filter": "[[Special:Tags|ٽيگ]] ڇاڻيون:",
+       "tag-filter": "[[Special:Tags|ٽيگ]] ڇاڻي:",
        "tag-filter-submit": "ڇاڻي",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ٽيگ|ٽيگز}}]]: $2)",
-       "tags-title": "ٽيگ",
+       "tags-title": "ٽيگس",
        "tags-tag": "ٽيگ نانءُ",
        "tags-source-header": "ذريعو",
        "tags-active-yes": "ها",
        "tags-active-no": "نہ",
        "tags-edit": "سنواريو",
        "tags-delete": "ڊاهيو",
-       "tags-activate": "Ù\85Ù\88ثر بڻايو",
-       "tags-deactivate": "غÙ\8aر Ù\85Ù\88ثر بڻايو",
+       "tags-activate": "Ù\81عاÙ\84 بڻايو",
+       "tags-deactivate": "غÙ\8aر Ù\81عاÙ\84 بڻايو",
        "tags-create-tag-name": "ٽيگ نانءُ:",
        "tags-create-reason": "سبب:",
        "tags-create-submit": "سرجيو",
-       "tags-delete-title": "Ù½Ù\8aÚ¯ Ú©Ù\8a Ú\8aاÙ\87Ù\8aÙ\88",
+       "tags-delete-title": "ٽيگ ڊاهيو",
        "tags-delete-reason": "سبب:",
        "tags-activate-reason": "سبب:",
-       "tags-activate-submit": "Ù\85Ù\88ثر بڻايو",
-       "tags-deactivate-title": "ٽيگ کي غيرموثر بڻايو.",
+       "tags-activate-submit": "Ù\81عاÙ\84 بڻايو",
+       "tags-deactivate-title": "ٽيگ کي غير فعال نڻايو.",
        "tags-deactivate-reason": "سبب:",
        "tags-edit-existing-tags-none": "\"ڪو بہ نہ\"",
        "tags-edit-new-tags": "نوان ٽيگس:",
        "htmlform-yes": "ها",
        "htmlform-cloner-create": "ٻيا بہ شامل ڪريو",
        "htmlform-cloner-delete": "هٽايو",
+       "htmlform-title-not-exists": "$1 وجود نٿو رکي.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ڊاٺو}} صفحو $3",
-       "revdelete-uname-hid": "لڪل يُوزرنانءُ",
-       "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|جوڙيو ويو}}",
+       "revdelete-uname-hid": "يُوزرنانءُ لڪل",
+       "logentry-move-move": "$1 {{GENDER:$2|چوريو}} صفحو $3 ڏانهن $4",
+       "logentry-newusers-create": "يوزر کاتو $1 {{GENDER:$2|سرجيو ويو}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|چاڙهيو}} $3",
        "rightsnone": "(ڪو بہ نہ)",
        "revdelete-summary": "ترميمي خلاصو",
        "feedback-submit": "جمع ڪرايو",
        "feedback-thanks-title": "توهان جي مهرباني!",
        "searchsuggest-search": "ڳوليو",
-       "api-error-filename-tooshort": "فائيل نانءَُ هيڪاندو ننڍو آهي.",
+       "api-error-filename-tooshort": "فائيلنانءَُ هيڪاندو ننڍو آهي.",
        "api-error-unclassified": "ڪا اڻجاتل چُڪَ واقع ٿي.",
        "api-error-unknown-code": "اڻڄاتل چُڪَ: \"$1\".",
        "api-error-unknown-warning": "اڻڄاتل چتاءُ: \"$1\".",
        "mw-widgets-dateinput-no-date": "ڪا بہ تاريخ نہ چونڊيل",
        "mw-widgets-titleinput-description-new-page": "اڃا اهو صفحو وجود نہ ٿو رکي",
        "mw-widgets-titleinput-description-redirect": "$1 ڏانهن چوريل",
-       "api-error-blacklisted": "براءِ مهرباني ڪو مختلف، وضاحتي عنوان چونڊيو."
+       "api-error-blacklisted": "براءِ مهرباني ڪو مختلف، تشريحي عنوان چونڊيو."
 }
index f988e8c..2730515 100644 (file)
@@ -74,7 +74,7 @@
        "august": "rogpjūtė",
        "september": "siejės",
        "october": "spalė",
-       "november": "lapkrėstė",
+       "november": "lapkristė",
        "december": "groudė",
        "january-gen": "Sausis",
        "february-gen": "Vasaris",
        "august-date": "Rogpjūtė $1",
        "september-date": "Siejės $1",
        "october-date": "Spalė $1",
-       "november-date": "Lapkrėstė $1",
+       "november-date": "Lapkristė $1",
        "december-date": "Groudė $1",
        "pagecategories": "{{PLURAL:$1|Kateguorėjė|Kateguorėjės|Kateguorėju}}",
        "category_header": "Kateguorėjės „$1“ straipsnē",
        "history": "Poslapė istuorėjė",
        "history_short": "Istuorėjė",
        "updatedmarker": "pakeist nug tada, kāp lonkiaus paskotėni sīki",
-       "printableversion": "Atmains spausdėnėmō",
+       "printableversion": "Atmains spausdėnėmou",
        "permalink": "Nūlatėnė nūruoda",
        "print": "Spausdintė",
        "view": "Veizietė",
        "nstab-template": "Šabluons",
        "nstab-help": "Pagelbuos poslapis",
        "nstab-category": "Kateguorėjė",
+       "mainpage-nstab": "Pėrms poslapis",
        "nosuchaction": "Nier tuokė vēksma",
        "nosuchspecialpage": "Nier tuokė specēlėjė poslapė",
        "nospecialpagetext": "Tamsta prašiet nelaistėna specēlė̄jė poslapė, laistėnū specēliūju poslapiu sōraša rasėt [[Special:SpecialPages|specēliūju poslapiu sārošė]].",
        "error": "Klaida",
        "databaseerror": "Doumenū bazės klaida",
        "databaseerror-error": "Klaida: $1",
-       "laggedslavemode": "Diemesė: Poslapī gal nesmatītė naujausiu pakeitėmu.",
+       "laggedslavemode": "Atėduos: Poslapie gal' nesmatītė vielībiausiu pakeitėmu.",
        "readonly": "Doumenū bazė ožrakėnta",
        "enterlockreason": "Iveskėt ožrakėnėma prižasti, tēpuogi kumet daugmaž bus atrokėnta",
        "readonlytext": "Doumenū bazė daba īr ožrakėnta naujėm irašam a kėtėm keitėmam,\nmažo doumenū bazės techninē pruofilaktėkā,\npuo tuo vėsks griš i sava viežes.\nOžrakėnusiuojo admėnėstratuoriaus pateikts rakėnima paaiškėnims: $1",
        "createacct-realname": "Tėkros vardos (nie būtėns)",
        "createaccountreason": "Dingstės:",
        "createacct-reason": "Dingstės",
-       "createacct-captcha": "Sargtėis patikrėnėms",
-       "createacct-imgcaptcha-ph": "Ožrašīkėt ženklus, katrus veizėt viršō",
        "createacct-submit": "Padėrbkat savėi paskīra",
        "createacct-another-submit": "Padėrbtė kėta paskīra",
        "createacct-benefit-heading": "{{SITENAME}} īr sokorta prietėliu, tuokiu, kāp Tamsta.",
        "newarticle": "(Naus)",
        "newarticletext": "Tamsta pakliovat poslapin, katros dā nie padėrbts.\nJēgo nuorat anon padėrbtė, rašīkat laukė, katros ī apatiuo\n(veiziekat [$1 pagelbas poslapi]).\nJēgo pakliovat čė netīčiuom, paprastiausē paspauskat naršīklės mīgtoka '''atgal'''.",
        "anontalkpagetext": "----''Tas īr anonimėnė nauduotuojė, katros nier sosėkūrės aba nenauduo paskīruos, aptarėmu poslapis.\nDielē tuo nauduojams IP adresos anuo atpažėnėmō.\nTas IP adresos gal būtė dalinams keletō nauduotuoju.\nJēgo Tamsta esat anonimėnis nauduotuos ėr veizėt, kū kuomentarā nier skėrtė Tamstā, [[Special:UserLogin/signup|sokorkėt paskīra]] aba [[Special:UserLogin|prisėjonkėt]], ė nebūsėt maišuoms so kėtās anonimėnēs nauduotuojās.''",
-       "noarticletext": "Nūnā tamė poslapī nie nė juokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė ton poslapė pavadėnėma]] terp kėtū poslapiū,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu īrašu],\naba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistė ton poslapi]</span>.",
-       "noarticletext-nopermission": "Nūnā tamė poslapī nier anėjuokė teksta.\nTamsta galėt [[Special:Search/{{PAGENAME}}|ėiškuotė šėta poslapė pavadėnėma]] kėtūs poslapiūs,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu regėstru]</span>.",
+       "noarticletext": "Nūnā tamė poslapie nie nė juokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė ton poslapė pavadėnėma]] terp kėtū poslapiū,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiu īrašu],\naba [{{fullurl:{{FULLPAGENAME}}|action=edit}} keistė ton poslapi]</span>.",
+       "noarticletext-nopermission": "Nūnā tamė poslapie nier anėjuokė teksta.\nTamsta galat [[Special:Search/{{PAGENAME}}|ėiškuotė šėtuo poslapė pavadėnėma]] kėtūs poslapiūs,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ėiškuotė prėgolontiūm ragėstru]</span>.",
        "userpage-userdoesnotexist": "Nauduotuojė paskīra „<nowiki>$1</nowiki>“ nier ožregėstrouta. Prašuom patikrėntė, a Tamsta nuorėt kortė/keistė ta poslapi.",
        "userpage-userdoesnotexist-view": "Nie nauduotuojė vardo „$1“",
        "blocked-notice-logextract": "Nauduotuos ožgints īr.\nApatiuo paruodīta kas ė kāpː",
        "next-page": "paskesnis poslapis",
        "prevn-title": "{{PLURAL:$1|Onkstesnis $1 rezoltats|Onkstesnio $1 rezoltato|Onkstesni $1 rezoltatā}}",
        "nextn-title": "{{PLURAL:$1|Kėts $1 gavėms|Kėtė $1 gavėmā|Kėtū $1 gavėmu}}",
-       "shown-title": "Ruodītė $1 {{PLURAL:$1|gavėni|gavėnius|gavėniū}} poslapī",
+       "shown-title": "Ruodītė $1 {{PLURAL:$1|gavėni|gavėnius|gavėniū}} ont poslapė",
        "viewprevnext": "Veizėtė ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Poslapis pavadėnts „[[$1]]“ šėtuo wiki'''",
        "searchmenu-new": "<strong>Padėrbtė poslapi, katros vadėntos „[[:$1]]“</strong> {{PLURAL:$2|0=|Dā veiziekat paėiškuo rasta straipsni|Dā veiziekat paėiškuos gavėnius.}}",
        "right-read": "Skaitītė poslapius",
        "right-edit": "Keistė poslapius",
        "right-upload": "Ikeltė failus",
+       "right-writeapi": "Nauduotė API rašīmō",
        "right-delete": "Trintė poslapius",
        "newuserlogpage": "Nauduotuojė kūrėma sārošos",
        "rightslog": "Nauduotuoju teisiu istuorėjė",
        "action-read": "skaitītė ton poslapi",
        "action-edit": "redagoutė ta poslapi",
        "action-createpage": "dėrbtė poslapius",
-       "action-move": "parvadintė šėta poslapi",
+       "action-move": "parvadintė šėton poslapi",
        "action-move-subpages": "parvadintė šėta poslapi ėr anuo dalės",
        "action-move-categorypages": "parvadintė kateguorėjes",
        "action-movefile": "parvadintė šėta faila",
        "rc-enhanced-expand": "Ruodītė smolkmenas",
        "rc-enhanced-hide": "Kavuotė smolkmenas",
        "rc-old-title": "pradiuo padėrbta kāp \"$1\"",
-       "recentchangeslinked": "Sosėjėn pakeitėmā",
-       "recentchangeslinked-feed": "Sosėjėn pakeitėmā",
-       "recentchangeslinked-toolbox": "Sosėjėn pakeitėmā",
+       "recentchangeslinked": "Sosėjė̄ pakeitėmā",
+       "recentchangeslinked-feed": "Sosėjė̄ pakeitėmā",
+       "recentchangeslinked-toolbox": "Sosėjė̄ pakeitėmā",
        "recentchangeslinked-title": "So $1 sosėjē pakeitėmā",
        "recentchangeslinked-summary": "Tamė specēliam poslapi sogol vielībė̄jė pakeitėmā poslapiūs, i katrūs īr nuruodoma. Poslapē ėš Tamstas [[Special:Watchlist|keravuojamu sāroša]] ėšruod '''stuorā'''.",
        "recentchangeslinked-page": "Poslapė pavadėnėms:",
        "upload_directory_read_only": "Tėnklapė serveris nagal rašītė i ikielima papke ($1).",
        "uploaderror": "Ikielima soklīdims",
        "upload-recreate-warning": "<strong>Atėdės: Abruozdielis tuokio vardo bova ėštrints aba parvadints.</strong>\n\nApatiuo ėšdieta kas ė kāp:",
-       "uploadtext": "Nauduokėtės žemiau pateikta skvarma kū ikeltomėt failus.\nNuoriedamė parveizietė ar ėiškuotė unkstiau ikeltū abruozdieliu, ēkėt i [[Special:FileList|ikeltū failu saraša]], ikielėmā ėr ėštrīnėmā īr ožregėstroujamė [[Special:Log/upload|ikielėmu istuorėjuo]], trīnėmā - [[Special:Log/delete|trīnėmu istuorėjuo]].\n\nNuoriedamė panauduotė ikelta faila poslapī, nauduokėt tuokės nūoruodas:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' aba\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' tėisiuogėnē nūruodā i faila.",
+       "uploadtext": "Nauduokatėis apatiuo douta skvarma kū ikeltomat abruozdielius.\nNuoriedamė parveizietė ar ėiškuotė onkstiau ikeltū abruozdieliu, ēkat i [[Special:FileList|ikeltū abruozdieliu sāraša]], ikielėmā ėr ėštrīnėmā īr ožregėstroujamė [[Special:Log/upload|ikielėmu istuorėjuo]], trīnėmā - [[Special:Log/delete|trīnėmu istuorėjuo]].\n\nNuoriedamė panauduotė ikelta abruozdieli poslapie, nauduokat tuokės nūruodas:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code>''' aba\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>''' tėisiuogėnē nūruoda i faila.",
        "upload-permitted": "{{PLURAL:$2|Galams skvarmas būds|Galamė skvarmas būdā}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Velėms skvarmas būds|Velėmė skvarmas būdā}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Nagalams skvarmas būds|Nagalamė skvarmas būdā}}: $1.",
        "morelinkstoimage": "Veizietė [[Special:WhatLinksHere/$1|daugiau nūruodu]] ton abruozdielėn.",
        "sharedupload": "Tas fails īr ėš $1 ė gal būtė nauduojams kėtūs pruojektūs.",
        "sharedupload-desc-here": "Tas abruozdielis īr nug $1 ė gal būtė nauduojams kėtūs poslapiūs.\nŽinės nug [$2 abruozdielė aprašīma poslapė] prėgol apatiuo.",
+       "sharedupload-desc-create": "Šėts abruozdielis īr ėš $1 ė gal būtė nauduonams kėtūs pruojektūs. \nMaž nuorat pamainītė anuo aprašīma [$2 anuo poslapie]?",
        "uploadnewversion-linktext": "Ožkrautė nauji abruozdielė atmaina",
        "shared-repo-from": "ėš $1",
        "shared-repo": "bendruos saugīklas",
        "unwatchedpages": "Nekeravuojėmė poslapē",
        "listredirects": "Paradresavėmu sārašos",
        "unusedtemplates": "Nenauduojamė šabluonā",
-       "unusedtemplatestext": "Šėts poslapis ruod sāraša poslapiu, esontiu šabluonu vardū srėtī, katrė nė iterptė i juoki kėta poslapi. Nepamėrškėt patėkrėntė kėtū nūruodu priš anūs ėštrėnont.",
+       "unusedtemplatestext": "Tas poslapis ruod sāraša poslapiu, esontiu vardū srėtie „{{ns:template}}“, katrėi nie iterptė i juoki kėta poslapi. Nepamėrškat patikrėntė kėtū nūruodu prīš anas ėštrėnont.",
        "unusedtemplateswlh": "kėtas nūruodas",
        "randompage": "Bikuoks poslapis",
        "randompage-nopages": "Šėtuo vardū srėti nier anėjuokiu poslapiu.",
        "wlheader-showupdated": "Poslapē, katrėi pakeistė nu Tamstas paskotėnė apsėlonkėma čiesa anūs, īr pažīmietė '''pastuorintā'''",
        "wlnote": "Ruoduoma '''$1''' paskotėniu pakeitėmu, atlėktū par '''$2''' paskotėniu adīnu.",
        "wlshowlast": "Ruodītė paskotėniu $1 adīnu, $2 dėinū a  pakeitėmus",
+       "watchlistall2": "vėsos",
        "watchlist-options": "Keravuojamu sāroša pasėrinkėmā",
        "watching": "Kergiama keravuojamu sārošon...",
        "unwatching": "Šalėnama ėš keravuojamu sāraša...",
        "undelete-show-file-submit": "Tēp",
        "namespace": "Vardū srėtės:",
        "invert": "Žīmietė prīšėngā",
+       "tooltip-invert": "Pažīmiekat ton varnalė, ka pakavuotomiet pakeitėmus pasėrinktūs poslapiūs (ė prėgolontės vardū srėtis)",
        "namespace_association": "Prėgolontė vardū srėtės",
+       "tooltip-namespace_association": "Pažīmiekat ton varnalė, ka prėgoldītomat aptarėmus, katrėi ī sosėjė so parinkta vardū srėtim",
        "blanknamespace": "(Pagrėndinė)",
        "contributions": "Nauduotuojė duovis",
        "contributions-title": "Nauduotuojė $1 duovis",
        "autoblocker": "Autuomatėnis ožbluokavėms, nes dalėnaties IP adreso so nauduotuojo \"$1\". Prīžastės - \"$2\".",
        "blocklogpage": "Ožgīnėmu sārošos",
        "blocklog-showlog": "Nauduotuos jau bova ožgints pėrmiou.\nApatiuo veiziekat kas ė kāpː",
-       "blocklogentry": "ožgīnė „[[$1]]“ nug dėrbėma, tas vēk ton čiesa - $2 $3",
+       "blocklogentry": "ožgīnė [[$1]] nug dėrbėma, tas vēk ton čiesa - $2 $3",
        "reblock-logentry": "pakeistė [[$1]] bluokavėma nustatīmā, naus bluokavėma čiesos īr $2 $3",
        "blocklogtext": "Čė īr nauduotuoju blokavėma ėr atblokavėma sārašos. Autuomatėškā blokoutė IP adresā nier ėšvardėntė. Jeigu nuorėt paveizėtė nūnā blokoujamus adresus, veizėkėt [[Special:BlockList|IP ožbluokavėmu istuorėjė]].",
        "unblocklogentry": "nug $1 nujėmtė ožgīnėma",
        "movelogpagetext": "Sārašos parvadintu poslapiu.",
        "movereason": "Dingstės:",
        "revertmove": "atmestė",
-       "delete_and_move": "Ėštrintė ė parkeltė",
        "delete_and_move_text": "==Rēkalings ėštrīnims==\nPaskėrties straipsnis „[[:$1]]“ jau īr. A nuorėt ana ėštrintė, kū galietomiet parvadintė?",
        "delete_and_move_confirm": "Tēp, trintė poslapi",
        "delete_and_move_reason": "Ėštrinta, ka $1 galietom būtė parvadints",
        "tooltip-t-emailuser": "Siōstė gromata šėtom prietėliō",
        "tooltip-t-upload": "Ožkrautė abruozdielius",
        "tooltip-t-specialpages": "Specēliūju poslapiu sārašos",
-       "tooltip-t-print": "Šėta poslapė atmains spausdėnėmō",
+       "tooltip-t-print": "Šėta poslapė atmains spausdėnėmou",
        "tooltip-t-permalink": "Nūlatėnė nūruoda ton poslapė atmainuō",
        "tooltip-ca-nstab-main": "Ruodītė poslapė torėni",
        "tooltip-ca-nstab-user": "Ruodītė nauduotuojė poslapi",
-       "tooltip-ca-nstab-special": "Tas poslapis īr specēlos - anuo nagalėm keistė.",
+       "tooltip-ca-nstab-special": "Tas poslapis īr specēlos - anon nagalam keistė.",
        "tooltip-ca-nstab-project": "Ruodītė pruojekta poslapi",
        "tooltip-ca-nstab-image": "Ruodītė abruozdielė poslapi",
        "tooltip-ca-nstab-mediawiki": "Veizietė sėstėmas pranešėma",
        "spambot_username": "''MediaWiki'' reklamu šalėnėms",
        "spam_reverting": "Atkoriama i onkstesne versėje, katra nator nūruodu i $1",
        "spam_blanking": "Vėsos versėjės toriejė nūruodu i $1. Ėšvaluoma",
+       "simpleantispam-label": "Patikrėnėms nug šiokšlėnėma.\n<strong>Napildėkat</strong> šėton!",
        "pageinfo-header-basic": "Poslapė žėnės",
        "pageinfo-header-edits": "Keitėma istuorėjė",
        "pageinfo-header-restrictions": "Poslapė apsauga",
        "previousdiff": "← Onkstesnis pakeitėms",
        "nextdiff": "Paskesinis pakeitėms →",
        "mediawarning": "'''Diemesė''': Šėts fails gal torietė kenksmėnga kuoda, anū palaidus Tamstas sėstėma gal būtė sogadinta.",
-       "imagemaxsize": "Rėbuotė abruozdieliu dėdoma anū aprašīma poslapī lėgė:",
+       "imagemaxsize": "Abruozdielė dėdloma apžabuojėms:<br /><em>(abruozdielė aprašīma poslapiams)</em>",
        "thumbsize": "Somažėntu pavēkslieliu didums:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|poslapis|poslapē|poslapiu}}",
        "file-info": "faila dėdoms: $1, MIME tips: $2",
        "file-info-size": "$1 × $2 taškū, abruozdielė dėdloms: $3, MIME būds: $4",
        "file-nohires": "Geresnis ėšraiškėms negalėms.",
        "svg-long-desc": "SVG skvarmou, fuormalē $1 × $2 puškiu, skvarmenė dėdloms: $3",
-       "show-big-image": "Pėrms abruozdielis",
+       "show-big-image": "Pradėnis abruozdielis",
        "show-big-image-preview": "Parvaizos dėdloms: $1.",
        "show-big-image-other": "{{PLURAL:$2|Kėts dėdloms|Kėtė dėdlomā|Kėtū dėdlomu}}: $1.",
        "show-big-image-size": "$1 × $2 pikselē",
        "exif-make": "Puortaparata dėrbies",
        "exif-model": "Puortaparata muodelis",
        "exif-artist": "Autuorios",
+       "exif-exifversion": "Exif atmains",
        "exif-colorspace": "Spalvū lauks",
        "exif-compressedbitsperpixel": "Abruozdielė sospaudėma rėžėms",
        "exif-pixelydimension": "Abruozdielė platoms",
        "external_image_whitelist": " #Palikėt ta eilotė, tuokė kāp īr <pre>\n#Īrašīkat standartėniu ėšraišku fragmentus (tėktās dali terp //)\n#Anūs bus miegėnama sotapatintė so ėšuorėniu abruozdieliu adresās\n#Tė, katrėi sotaps, bus ruodomė kāp abruozdielē, a kėtė bus ruodomė tėktās kāp nūoruodas\n#Raidiu dėdoms nier svarbos\n#Eilotės, katuos prasided # īr kuomentarā \n\n#Īterpkat vėsus standartiėniu ėšraišku fragmentus prīš šėta eilote. Palikat šėta eilote, tuokė kāp ana īr </pre>",
        "tag-filter": "[[Special:Tags|Žīmiū]] kuošeklis:",
        "tag-filter-submit": "Kuošeklis",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Žīms|Žīmā|Žīmū}}]]: $2)",
        "tags-edit": "taisītė",
        "comparepages": "Primestė poslapio",
        "logentry-delete-delete": "$1 ėštrīnė poslapi $3",
        "logentry-delete-restore": "$1 atkūrė poslapi $3",
        "revdelete-content-hid": "torėnīs pakavuots",
+       "logentry-block-block": "ožgīnė „[[$1]]“ nug dėrbėma, tas vēk ton čiesa - $2 $3",
        "logentry-move-move": "$1 {{GENDER:$2|parvadėna}} poslapi $3 i $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|parvadėna}} poslapi nug $3 i $4 nepalinkdoms nusokėma",
        "logentry-move-move_redir": "$1 {{GENDER:$2|parvadėna}} poslapi nog $3 i $4 ont bovosė nusokėma",
index 3983006..a673d6e 100644 (file)
@@ -10,7 +10,8 @@
                        "Milicevic01",
                        "Macofe",
                        "KWiki",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Srdjan m"
                ]
        },
        "tog-underline": "Podvuci linkove:",
@@ -27,6 +28,7 @@
        "tog-watchdefault": "Dodaj stranice i datoteke koje izmijenim u spisak praćenja",
        "tog-watchmoves": "Dodaj stranice i datoteke koje premjestim na moj spisak praćenja",
        "tog-watchdeletion": "Dodaj stranice i datoteke koje izbrišem na moj spisak praćenja",
+       "tog-watchrollback": "Dodaj stranice na kojima sam vratio uređivanja na popis praćenja",
        "tog-minordefault": "Označi da su sve izmjene u pravilu manje",
        "tog-previewontop": "Prikaži pretpregled prije kutije za uređivanje",
        "tog-previewonfirst": "Prikaži pretpregled na prvoj izmjeni",
@@ -37,7 +39,7 @@
        "tog-shownumberswatching": "Prikaži broj korisnika koji prate",
        "tog-oldsig": "Postojeći potpis:",
        "tog-fancysig": "Smatraj potpis kao wikitekst (bez automatskog linka)",
-       "tog-uselivepreview": "Koristi pretpregled uživo (eksperimentalno)",
+       "tog-uselivepreview": "Koristi pretpregled uživo",
        "tog-forceeditsummary": "Opomeni me pri unosu praznog sažetka",
        "tog-watchlisthideown": "Sakrij moje izmjene sa spiska praćenih članaka",
        "tog-watchlisthidebots": "Sakrij izmjene botova sa spiska praćenih članaka",
@@ -45,6 +47,7 @@
        "tog-watchlisthideliu": "Sakrij izmjene prijavljenih korisnika sa liste praćenja",
        "tog-watchlisthideanons": "Sakrij izmjene anonimnih korisnika sa liste praćenja",
        "tog-watchlisthidepatrolled": "Sakrij patrolirane izmjene sa spiska praćenja",
+       "tog-watchlisthidecategorization": "Sakrij kategorizaciju stranica",
        "tog-ccmeonemails": "Pošalji mi kopije emailova koje šaljem drugim korisnicima",
        "tog-diffonly": "Ne prikazuj sadržaj stranice ispod prikaza razlika",
        "tog-showhiddencats": "Prikaži skrivene kategorije",
        "moredotdotdot": "Još...",
        "morenotlisted": "Ovaj spisak nije kompletan.",
        "mypage": "Moja stranica",
-       "mytalk": "Moj razgovor / Мој разговор",
+       "mytalk": "Razgovor / Разговор",
        "anontalk": "Razgovor za ovu IP adresu",
        "navigation": "Navigacija - Навигација",
        "and": "&#32;i",
        "pool-timeout": "Zaustavi čekanje za zaključavanje",
        "pool-queuefull": "Red na pool je prenapunjen",
        "pool-errorunknown": "nepoznata greška",
+       "pool-servererror": "Usluga brojača poola nije dostupna ($1).",
+       "poolcounter-usage-error": "Greška pri upotrebi: $1",
        "aboutsite": "O projektu {{SITENAME}}",
        "aboutpage": "Project:O_projektu_{{SITENAME}}",
        "copyright": "Pod licencom / Под лиценцом: $1.",
        "disclaimers": "Odricanje odgovornosti",
        "disclaimerpage": "Project:Uslovi korištenja, pravne napomene i odricanje odgovornosti",
        "edithelp": "Pomoć pri uređivanju",
+       "helppage-top-gethelp": "Pomoć",
        "mainpage": "Glavna stranica / Главна страница",
        "mainpage-description": "Glavna stranica / Главна страница",
        "policy-url": "Project:Pravila",
        "hidetoc": "sakrij - сакриј",
        "collapsible-collapse": "Sakrij",
        "collapsible-expand": "Proširi",
+       "confirmable-confirm": "Da li {{GENDER:$1|ste}} sigurni?",
+       "confirmable-yes": "Da",
+       "confirmable-no": "Ne",
        "thisisdeleted": "Pogledaj ili vrati $1?",
        "viewdeleted": "Pogledaj $1?",
        "restorelink": "{{PLURAL:$1|$1 izbrisana izmjena|$1 izbrisanih izmjena}}",
        "readonly_lag": "Baza podataka je zaključana dok se sekundarne baze podataka na serveru ne sastave sa glavnom.",
        "internalerror": "Interna pogreška",
        "internalerror_info": "Interna greška: $1",
+       "internalerror-fatal-exception": "Fatalna greška tipa \"$1\"",
        "filecopyerror": "Ne može se kopirati \"$1\" na \"$2\".",
        "filerenameerror": "Ne može se promjeniti ime datoteke \"$1\" u \"$2\".",
        "filedeleteerror": "Ne može se izbrisati datoteka \"$1\".",
        "directorycreateerror": "Nije moguće napraviti direktorijum \"$1\".",
+       "directoryreadonlyerror": "Direktorij \"$1\" je samo za čitanje.",
+       "directorynotreadableerror": "Direktorij \"$1\" nije čitljiv.",
        "filenotfound": "Ne može se naći datoteka \"$1\".",
        "unexpected": "Neočekivana vrijednost: \"$1\"=\"$2\".",
        "formerror": "Greška: ne može se poslati formular",
        "no-null-revision": "Nije se mogla stvoriti nova ništavna revizija za stranicu \"$1\"",
        "badtitle": "Loš naslov",
        "badtitletext": "Zatražena stranica je bila nevaljana, prazna ili neispravno povezana s među-jezičkim ili inter-wiki naslovom.\nMože sadržavati jedno ili više slova koja se ne mogu koristiti u naslovima.",
+       "title-invalid-empty": "Zatraženo ime stranice je prazno ili samo sadrži naziv imenskog prostora.",
+       "title-invalid-utf8": "Vaš zatraženi naziv stranice sadrži nevažeći UTF-8 znak.",
+       "title-invalid-interwiki": "Traženi naslov stranice sadrži interwiki link koji ne može biti korišten u naslovima.",
+       "title-invalid-talk-namespace": "Vaš zatraženi naslov stranice se odnosi na stranicu za razgovor koja ne može postojati.",
+       "title-invalid-characters": "Vaš zatraženi naslov stranice sadrži nevažeće znakove: \"$1\".",
+       "title-invalid-relative": "Naslov ima relativnu putanju. Relativni naslovi stranica (./, ../) nisu važeći jer će često biti nedostupni u pregledniku korisnika.",
+       "title-invalid-magic-tilde": "Zatraženi naslov stranice sadrži nevažeći slijed magičknog znaka tilda (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Zatraženi naziv stranice je predugačak. Ne smije biti duži od {{PLURAL:$1|bajta|bajtova}} u UTF-8 kodiranju.",
+       "title-invalid-leading-colon": "Zahtjevani naslov stranice sadrži nevažeću dvotačku na početku.",
        "perfcached": "Sledeći podaci su keširani i mogu biti zastareli. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata|$1 rezultata}}.",
        "perfcachedts": "Sledeći podaci su keširani, a poslednji put su ažurirani $2 u $3. Keš sadrži najviše {{PLURAL:$4|jedan rezultat|$4 rezultata|$4 rezultata}}.",
        "querypage-no-updates": "Ažuriranje ove stranice je isključeno.\nPodaci koji se ovdje nalaze neće biti biti ažurirani.",
        "viewsource": "Pogledaj kod",
        "viewsource-title": "Prikaz izvora stranice $1",
        "actionthrottled": "Akcija je usporena",
-       "actionthrottledtext": "Kao anti-spam mjera, ograničene su vam izmjene u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte ponovo poslije nekoliko minuta.",
+       "actionthrottledtext": "U cilju borbe protiv zloupotrebe, ograničeno vam je da u kratkom vremenskom periodu previše puta vršite ovu radnju, a upravo ste prešli to ograničenje.\nPokušajte ponovo za nekoliko minuta.",
        "protectedpagetext": "Ova stranica je zaključana kako bi se spriječilo uređivanje ili druge akcije.",
-       "viewsourcetext": "Možete vidjeti i kopirati izvorni tekst ove stranice:",
-       "viewyourtext": "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
+       "viewsourcetext": "Možete vidjeti i kopirati izvorni kôd ove stranice.",
+       "viewyourtext": "Možete vidjeti i kopirati izvor '''vaših izmjena''' na ovoj stranici.",
        "protectedinterface": "Ova stranica sadrži tekst interfejsa za softver na ovoj wiki, pa je zaključana kako bi se spriječile zloupotrebe. Kako bi dodali ili promijenili prijevode za sve wikije, molimo koristite [//translatewiki.net/ translatewiki.net], projekt lokalizacije MediaWikija.",
-       "editinginterface": "'''Upozorenje:''' Mijenjate stranicu koja se koristi za tekst interfejsa za softver.\nPromjene na ovoj stranici će izazvati promjene korisničkog interfejsa za druge korisnike na ovoj wiki.\nZa prijevode, molimo Vas koristite [//translatewiki.net/wiki/Main_Page?setlang=bs translatewiki.net], projekt lokalizacije MediaWiki.",
-       "cascadeprotected": "Ova stranica je zaštićena od uređivanja, jer je uključena u {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja sa uključenom kaskadnom opcijom:\n$2",
+       "editinginterface": "<strong>Upozorenje:</strong> Mijenjate stranicu koja sadrži aktivan tekst programa.\nPromjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.\nZa dodavanje ili promjene prijevoda za sve wikije, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
+       "translateinterface": "Za dodavanje ili promjenu prijevoda za sve wikije koristite [//translatewiki.net/ translatewiki.net], projekt za lokalizaciju MediaWikija.",
+       "cascadeprotected": "Uređivanje ove stranice zabranjeno je jer se koristi u {{PLURAL:$1|sljedećoj stranici, koja je zaštićena|sljedećim stranicama, koje su zaštićene}} prenosivom zaštitom:\n$2",
        "namespaceprotected": "Nemate dozvolu uređivati stranice imenskog prostora '''$1'''.",
        "customcssprotected": "Nemate dozvolu za mijenjanje ove CSS stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "customjsprotected": "Nemate dozvolu za mijenjanje ove JavaScript stranice jer sadrži osobne postavke nekog drugog korisnika.",
        "invalidtitle-knownnamespace": "Neispravan naslov s imenskim prostorom „$2“ i tekstom „$3“",
        "invalidtitle-unknownnamespace": "Neispravan naslov s imenskim prostorom br. $1 i tekstom „$2“",
        "exception-nologin": "Niste prijavljeni",
-       "exception-nologin-text": "Molimo [[Special:Userlogin|prijavite se]] da biste pristupili ovoj stranici ili radnji.",
+       "exception-nologin-text": "Molimo prijavite se ako želite pristup ovoj stranici ili djelovanje.",
        "exception-nologin-text-manual": "Molimo $1 da biste pristupili ovoj stranici ili radnji.",
        "virus-badscanner": "Loša konfiguracija: nepoznati anti-virus program: ''$1''",
        "virus-scanfailed": "skeniranje nije uspjelo (code $1)",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto stvarate novi račun",
-       "createacct-captcha": "Sigurnosna provjera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Stvorite svoj račun",
-       "createacct-another-submit": "Stvorite novi račun",
+       "createacct-another-submit": "Napravi korisnički račun",
        "createacct-benefit-heading": "{{SITENAME}} se stvara od ljudi poput vas.",
        "createacct-benefit-body1": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|stranica|stranice|stranica}}",
        "createacct-benefit-body3": "nedavni {{PLURAL:$1|donator|donatora}}",
        "badretype": "Lozinke koje ste unijeli se ne poklapaju.",
+       "usernameinprogress": "Stvaranje računa za ovog korisnika je već u toku.\nMolimo sačekajte.",
        "userexists": "Uneseno korisničko ime već je u upotrebi.\nUnesite neko drugo ime.",
        "loginerror": "Greška pri prijavljivanju",
        "createacct-error": "Pogreška u stvaranju računa",
        "wrongpassword": "Šifra koju ste uneli je neodgovarajuće. Molimo, upišite je ponovo.\n\nШифра коју сте унели је неодговарајућа. Молимо, упишите је поново.",
        "wrongpasswordempty": "Unesena šifra je bila prazna.\nMolimo Vas da pokušate ponovno.",
        "passwordtooshort": "Lozinka mora imati najmanje {{PLURAL:$1|1 znak|$1 znakova}}.",
+       "passwordtoolong": "Šifre/lozinke/zaporke ne mogu biti duže od {{PLURAL:$1|jednog znaka|$1 znaka|$1 znakova}}.",
        "password-name-match": "Vaša lozinka mora biti različita od Vašeg korisničkog imena.",
        "password-login-forbidden": "Korištenje ovog korisničkog imena i lozinke je zabranjeo.",
        "mailmypassword": "Resetiraj lozinku/zaporku",
        "createaccount-text": "Neko je napravio korisnički račun za vašu e-mail adresu na {{SITENAME}} ($4) sa imenom \"$2\", i sa šifrom \"$3\".\nTrebali biste se prijaviti i promjeniti šifru.\n\nMožete ignorisati ovu poruku, ako je korisnički račun napravljen greškom.",
        "login-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
        "login-abort-generic": "Vaša prijava nije bila uspješna – Prekinuto",
+       "login-migrated-generic": "Vaš se korisnički račun preselio, te Vaše korisničko ime više ne postoji na ovom wikiju.",
        "loginlanguagelabel": "Jezik: $1",
        "suspicious-userlogout": "Vaš zahtjev za odjavu je odbijen jer je poslan preko pokvarenog preglednika ili keširanog proksija.",
        "createacct-another-realname-tip": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje za vaš rad.",
        "passwordreset-emailtext-ip": "Netko (vjerovatno Vi, s IP adrese $1) je zatražio resetiranje vaše lozinke/zaporke {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše početne lozinke, a ne želite je promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
        "passwordreset-emailtext-user": "Korisnik $1 na {{SITENAME}} je zatražio resetiranje vaše lozinke/zaporke za {{SITENAME}}\n($4). Sljedeći {{PLURAL:$3|korisnički račun je|korisnički računi su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena lozinka|Ove privremene lozinke}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu lozinku. Ako je neko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše originalne lozinke, a ne želite je više promijeniti, \nmožete zanemariti ovu poruku i nastaviti koristiti staru lozinku.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena šifra: \n$2",
-       "passwordreset-emailsent": "E-mail za resetiranje lozinke/zaporke je poslan.",
+       "passwordreset-emailsent": "Ako je ovo adresa e-pošte s kojom ste registrirali ovaj račun, podsjetnik šifre/lozinke/zaporke će vam biti poslan na vašu adresu e-pošte.",
        "passwordreset-emailsent-capture": "E-mail za resetiranje lozinke/zaporke je poslan (prikazan dolje).",
        "passwordreset-emailerror-capture": "E-mail za resetiranje lozinke/zaporke, prikazan dolje, je poslan, ali slanje {{GENDER:$2|korisniku|korisnici|korisniku}} nije uspjelo: $1",
-       "changeemail": "Promijeni e-mail adresu",
-       "changeemail-header": "Promijeni e-mail adresu korisničkog računa",
+       "changeemail": "Promeni ili ukloni e-adresu",
+       "changeemail-header": "Ispunite sljedeći formular da biste promijenili adresu e-pošte. Ako želite ukloniti postojeću adresu e-pošte s vašeg korisničkog računa, pri ispunjavanju formulara, polje nove adrese e-pošte ostavite prazno.",
+       "changeemail-passwordrequired": "Morat ćete unijeti vašu lozinku/zaporku da potvrdite ovu promjenu.",
        "changeemail-no-info": "Morate biti prijavljeni da biste izravno pristupili ovoj stranici.",
        "changeemail-oldemail": "Trenutna e-mail adresa:",
        "changeemail-newemail": "Nova e-mail adresa:",
+       "changeemail-newemail-help": "Ovo polje treba ostaviti prazno ako želite ukloniti svoju E-mail adresu. Nećete biti u mogućnosti resetirati zaboravljenu lozinku/zaporku i nećete moći primati E-mailove sa ove wiki ukoliko je E-mail adresa uklonjena.",
        "changeemail-none": "(ništa)",
        "changeemail-password": "Tvoja šifra/lozinka za {{SITENAME}}:",
        "changeemail-submit": "Promijeni e-mail",
        "changeemail-throttled": "Previše puta ste se pokušali prijaviti.\nMolimo Vas da sačekate $1 prije nego što pokušate ponovo.",
+       "changeemail-nochange": "Molimo unesite različitu E-mail adresu.",
        "resettokens": "Resetirajte tokene",
        "resettokens-text": "Možete resetirati tokene koji dozvoljavaju pristup određenim privatnim podacima povezanim sa vašim računom ovdje.\n\nTo možete učiniti ako ste ih slučajno podijelili sa nekim ili ako je vaš račun kompromitiran.",
        "resettokens-no-tokens": "Nema tokena za resetiranje.",
        "sig_tip": "Vaš potpis sa trenutnim vremenom",
        "hr_tip": "Horizontalna linija (koristite rijetko)",
        "summary": "Sažetak:",
-       "subject": "Tema/naslov:",
+       "subject": "Tema:",
        "minoredit": "Mala izmjena - Мала измена",
        "watchthis": "Prati / Прати",
        "savearticle": "Sačuvaj - Сачувај",
        "preview": "Pretpregled / Претпреглед",
        "showpreview": "Pretpregled - Претпреглед",
        "showdiff": "Prikaži izmjene - Прикажи измене",
+       "blankarticle": "<strong>Upozorenje:</strong> Napravili ste praznu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", napravit ćete praznu stranicu bez sadržaja.",
        "anoneditwarning": "<strong>Upozorenje:</strong> Niste prijavljeni. \nVaša IP adresa će biti javno vidljiva ako napravite neku izmjenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 napravite račun]</strong>, vaše izmjene će biti pripisane vašem korisničkom imenu, zajedno sa drugim pogodnostima.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabilježena u historiji ove stranice.''",
        "missingsummary": "'''Podsjećanje:''' Niste unijeli sažetak izmjene.\nAko kliknete na Sačuvaj/Snimi, Vaša izmjena će biti snimljena bez sažetka.",
+       "selfredirect": "<strong>Upozorenje:</strong> Preusmjeravate stranicu na samu sebe.\nMožda ste naveli pogrešan cilj preusmjeravanja ili ste uređivali pogrešnu stranicu.\nAko ponovno kliknete \"{{int:savearticle}}\", ipak će nastati preusmjerenje.",
        "missingcommenttext": "Molimo unesite komentar ispod.",
-       "missingcommentheader": "'''Podsjetnik:''' Niste napisali temu/naslov za ovaj komentar.\nAko ponovo kliknete na '''{{int:savearticle}}''', Vaše izmjene će biti snimljene bez teme/naslova.",
+       "missingcommentheader": "<strong>Podsjetnik:</strong> Niste napisali temu za ovaj komentar.\nAko ponovo kliknete na \"{{int:savearticle}}\", vaša izmjena će biti sačuvana bez teme/naslova.",
        "summary-preview": "Pretpregled sažetka:",
-       "subject-preview": "Pretpregled teme/naslova:",
+       "subject-preview": "Pretpregled teme:",
+       "previewerrortext": "Dogodila se greška prilikom prikazivanja vaših izmjena.",
        "blockedtitle": "Korisnik je blokiran",
        "blockedtext": "'''Vaše korisničko ime ili IP adresa je blokirana.'''\n\nBlokada izvršena od strane $1.\nDati razlog je slijedeći: ''$2''.\n\n*Početak blokade: $8\n*Kraj perioda blokade: $6\n*Ime blokiranog korisnika: $7\n\nMožete kontaktirati $1 ili nekog drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste razgovarali o blokadi.\n\nNe možete koristiti opciju ''Pošalji e-mail korisniku'' osim ako niste unijeli e-mail adresu u [[Special:Preferences|Vaše postavke]].\nVaša trenutna IP adresa je $3, a oznaka blokade je #$5.\nMolimo Vas da navedete gornje podatke u zahtjevu za deblokadu.",
        "autoblockedtext": "Vaša IP adresa je automatski blokirana jer je korištena od strane drugog korisnika, a blokirao ju je $1.\nNaveden je slijedeći razlog:\n\n:''$2''\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Blokirani korisnik: $7\n\nMožete kontaktirati $1 ili nekog drugog iz grupe [[{{MediaWiki:Grouppage-sysop}}|administratora]] i zahtijevati da Vas deblokira.\n\nZapamtite da ne možete koristiti opciju \"pošalji e-mail ovom korisniku\" sve dok ne unesete validnu e-mail adresu pri registraciji u Vašim [[Special:Preferences|korisničkim postavkama]] te Vas ne spriječava ga je koristite.\n\nVaša trenutna IP adresa je $3, a ID blokade je $5.\nMolimo da navedete sve gore navedene detalje u zahtjevu za deblokadu.",
        "yourdiff": "Razlike / Разлике",
        "copyrightwarning": "Molimo da uzmete u obzir kako se smatra da su svi doprinosi u {{SITENAME}} izdani pod $2 (v. $1 za detalje).\nUkoliko ne želite da vaše pisanje bude nemilosrdno uređivano i redistribuirano po tuđoj volji, onda ga nemojte ovdje objavljivati.<br />\nTakođer obećavate kako ste ga napisali sami ili kopirali iz izvora u javnoj domeni ili sličnog slobodnog izvora.\n'''NEMOJTE SLATI RAD ZAŠTIĆEN AUTORSKIM PRAVIMA BEZ DOZVOLE!'''",
        "copyrightwarning2": "Zapamtite da svaki doprinos na stranici {{SITENAME}} može biti izmijenjen, promijenjen ili uklonjen od strane ostalih korisnika. Ako ne želite da ovo desi sa Vašim tekstom, onda ga nemojte slati ovdje.<br />\nTakođer nam garantujete da ste ovo Vi napisali, ili da ste ga kopirali iz javne domene ili sličnog slobodnog izvora informacija (pogledajte $1 za više detalja).\n'''NE ŠALJITE DJELA ZAŠTIĆENA AUTORSKIM PRAVOM BEZ DOZVOLE!'''",
+       "editpage-cannot-use-custom-model": "Model sadržaja ove stranice se ne može promijeniti.",
        "longpageerror": "'''Greška: tekst koji ste uneli je veličine {{PLURAL:$1|jedan kilobajt|$1 kilobajta|$1 kilobajta}}, što je veće od {{PLURAL:$2|dozvoljenog jednog kilobajta|dozvoljena $2 kilobajta|dozvoljenih $2 kilobajta}}.'''\nStranica ne može biti sačuvana.",
        "readonlywarning": "<strong>Upozorenje: baza podataka je zaključana radi održavanja, tako da trenutno nećete moći da sačuvate izmene.</strong>\nMožda biste želeli sačuvati tekst za kasnije u nekoj tekstualnoj datoteci.\n\nAdministrator koji je zaključao bazu dao je sledeće objašnjenje: $1",
        "protectedpagewarning": "'''PAŽNJA: Ova stranica je zaključana tako da samo korisnici sa administratorskim privilegijama mogu da je mijenjaju.'''\nPosljednja stavka u registru je prikazana ispod kao referenca:",
        "semiprotectedpagewarning": "'''Pažnja:''' Ova stranica je zaključana tako da je samo registrovani korisnici mogu uređivati.\nPosljednja stavka registra je prikazana ispod kao referenca:",
-       "cascadeprotectedwarning": "'''Upozorenje:''' Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, lančano povezane, zaštićene stranice}}:",
+       "cascadeprotectedwarning": "<strong>Upozorenje:</strong> Ova stranica je zaključana tako da je samo administratori mogu mijenjati, jer je ona uključena u {{PLURAL:$1|ovu, lančanu povezanu, zaštićenu stranicu|sljedeće, prenosivo povezane, zaštićene stranice}}:",
        "titleprotectedwarning": "'''UPOZORENJE: Ova stranica je zaključana tako da su potrebna [[Special:ListGroupRights|posebna prava]] da se ona napravi.'''\nPosljednja stavka registra je prikazana ispod kao referenca:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} koji su upotrebljeni na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} prikazani u ovom pregledu:",
        "permissionserrors": "Greška pri odobrenju",
        "permissionserrorstext": "Nemate dopuštenje da to uradite, iz {{PLURAL:$1|slijedećeg razloga|slijedećih razloga}}:",
        "permissionserrorstext-withaction": "Nemate dozvolu za $2, zbog {{PLURAL:$1|sljedećeg|sljedećih}} razloga:",
+       "contentmodelediterror": "Ne možete urediti ovu izmjenu jer je model sadržaja <code>$1</code>, a trenutni model sadržaja stranice je <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Upozorenje: Postavljate stranicu koja je prethodno brisana.'''\n\nRazmotrite da li je nastavljanje uređivanja ove stranice u skladu s pravilima.\nOvdje je naveden registar brisanja i premještanja s obrazloženjem:",
        "moveddeleted-notice": "Ova stranica je obrisana.\nRegistar brisanja i premještanja stranice je prikazan ispod kao referenca.",
+       "moveddeleted-notice-recent": "Žao nam je, ova stranica je izbrisana u prošla 24 sata. \nNiže je navedena evidencija brisanja i premještanja.",
        "log-fulllog": "Vidi potpuni registar",
        "edit-hook-aborted": "Izmjena je poništena putem interfejsa.\nNije ponuđeno nikakvo objašnjenje.",
        "edit-gone-missing": "Stranica se nije mogla osvježiti.\nIzgleda da je obrisana.",
        "edit-conflict": "Sukob izmjena.",
        "edit-no-change": "Vaša izmjena je ignorirana, jer nije bilo promjena teksta stranice.",
+       "postedit-confirmation-created": "Stranica je stvorena.",
+       "postedit-confirmation-restored": "Stranica je obnovljena.",
        "postedit-confirmation-saved": "Vaša izmjena je snimljena.",
        "edit-already-exists": "Stranica nije mogla biti kreirana.\nIzgleda da već postoji.",
        "defaultmessagetext": "Uobičajeni tekst poruke",
        "content-model-text": "obični tekst",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-json-empty-object": "Prazan objekat",
+       "content-json-empty-array": "Prazan niz",
+       "duplicate-args-warning": "<strong>Upozorenje:</strong> [[:$1]] poziva na [[:$2]] sa više od jedne vrijednosti za parametar \"$3\". Koristit će se samo posljednja navedena vrijednost.",
+       "duplicate-args-category": "Stranice sa istim argumentima kod poziva šablona",
+       "duplicate-args-category-desc": "Stranica sadrži pozive šablona koji koriste argumente dvojnike, kao što su <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ili <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.\n\nTrebalo bi imati manje od $2 {{PLURAL:$2|poziv|poziva}}, a sad ima {{PLURAL:$1|$1 poziv|$1 poziva}}.",
        "expensive-parserfunction-category": "Stranice sa previše poziva parserskih funkcija",
        "post-expand-template-inclusion-warning": "'''Upozorenje:''' Šablon koji je uključen je prevelik.\nNeki šabloni neće biti uključeni.",
        "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": "Stranica u kojoj je prekoračen broj čvorova",
+       "node-count-exceeded-category-desc": "Stranica je prešla najviši broj čvorova.",
+       "node-count-exceeded-warning": "Stranica je prekoračila broj čvorova",
        "expansion-depth-exceeded-category": "Stranice koje su prekoračile dubinu proširenja",
+       "expansion-depth-exceeded-category-desc": "Stranica je prešla najveću dubinu proširenja.",
        "expansion-depth-exceeded-warning": "Na ovoj stranici dubina proširenja je prevelika",
        "parser-unstrip-loop-warning": "Utvrđena je petlja",
        "parser-unstrip-recursion-limit": "Dosegnuto je ograničenje rekurzije ($1)",
        "history-feed-description": "Historija promjena ove stranice na wikiju",
        "history-feed-item-nocomment": "$1 u $2",
        "history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je izbrisana sa wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
+       "history-edit-tags": "Uredi oznake izabranih verzija",
        "rev-deleted-comment": "(komentar uklonjen)",
        "rev-deleted-user": "(korisničko ime uklonjeno)",
-       "rev-deleted-event": "(stavka registra obrisana)",
+       "rev-deleted-event": "(detalji zapisa obrisani)",
        "rev-deleted-user-contribs": "[korisničko ime ili IP adresa uklonjeni - izmjena sakrivena u spisku doprinosa]",
        "rev-deleted-text-permission": "Revizija ove stranice je '''obrisana'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].",
+       "rev-suppressed-text-permission": "Revizija ove stranice je <strong>prekrivena</strong>.\nDetalji se mogu naći u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku prekrivanja].",
        "rev-deleted-text-unhide": "Izmhena ove stranice je '''obrisana'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].\nIpak možete [$1 vidjeti ovu izmenu] ako želite nastaviti.",
        "rev-suppressed-text-unhide": "Izmjena ove stranice je '''sakrivena'''.\nDetalje možete vidjeti u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} registru sakrivanja].\nIpak možete da [$1 vidjeti ovu izmjenu] ako želite nastaviti.",
        "rev-deleted-text-view": "Izmjena ove stranice je '''obrisana'''.\nMožete je pogledati; više detalja možete naći u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registru brisanja].",
        "rev-showdeleted": "Pokaži",
        "revisiondelete": "Obriši/vrati revizije",
        "revdelete-nooldid-title": "Nije unesena tačna revizija",
-       "revdelete-nooldid-text": "Niste precizno odredili odredišnu reviziju/revizije da se izvrši ova funkcija,\nili ta revizija ne postoji, ili pokušavate sakriti trenutnu reviziju.",
+       "revdelete-nooldid-text": "Niste odredili odredišnu verziju da se izvrši ova funkcija, ili ta verzija ne postoji, ili pokušavate sakriti trenutnu verziju.",
        "revdelete-no-file": "Navedena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Da li ste sigurni da želite pogledati obrisanu reviziju datoteke \"<nowiki>$1</nowiki>\" od $2 u $3?",
        "revdelete-show-file-submit": "Da",
        "revdelete-text-text": "Izbrisane revizije će se još pojavljivati u historiji stranice, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
        "revdelete-text-file": "Izbrisane verzije datoteke će se još pojavljivati u historiji datoteke, ali dijelovi sadržaja neće biti dostupni javnosti.",
        "logdelete-text": "Izbrisane stavke u registru događaja će se još pojavljivati u registrima, ali dijelovi njihovog sadržaja neće biti javno dostupni.",
-       "revdelete-text-others": "Drugi administratori {{SITENAME}} će još uvijek moći pristupiti skrivenom sadržaju i mogu ga ponovno odbrisati kroz isti interfejs, ukoliko nisu postavljena dodatna ograničenja.",
+       "revdelete-text-others": "Drugi administratori će i dalje moći pristupiti sakrivenom sadržaju i vratiti ga, bez obzira na postavljena dodatna ograničenja.",
        "revdelete-confirm": "Molimo potvrdite da namjeravate ovo učiniti, da razumijete posljedice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmjena bi se trebalo koristiti <strong>samo</strong> za sljedeće slučajeve:\n* potencijalno klevetničke informacije\n* neprimjerene lične informacije\n*: <em>kućne adrese i telefonski brojevi, matični i lični identifikacijski brojevi itd.</em>",
        "revdelete-legend": "Postavi ograničenja vidljivosti",
        "revdelete-hide-text": "Tekst revizije",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
-       "revdelete-hide-name": "Sakrij akciju i cilj",
+       "revdelete-hide-name": "Sakrij cilj i parametre",
        "revdelete-hide-comment": "Opis izmjene",
        "revdelete-hide-user": "Sakrij korisničko ime / IP adresu korisnika koji je uređivao stranicu",
        "revdelete-hide-restricted": "Ograniči podatke za administratore kao i za druge korisnike",
        "mergehistory-empty": "Nema revizija za spajanje.",
        "mergehistory-done": "$3 {{PLURAL:$3|revizija|revizije|revizija}} stranice $1 uspješno spojeno u [[:$2]].",
        "mergehistory-fail": "Ne može se izvršiti spajanje historije, molimo provjerite opet stranicu i parametre vremena.",
+       "mergehistory-fail-toobig": "Ne može se izvršiti spajanje historije jer će se više premjestiti više od ograničenja od $1 {{PLURAL:$1|revizije|revizija}}.",
        "mergehistory-no-source": "Izvorna stranica $1 ne postoji.",
        "mergehistory-no-destination": "Odredišna stranica $1 ne postoji.",
        "mergehistory-invalid-source": "Izvorna stranica mora imati valjan naslov.",
        "notextmatches": "Tekst stranice ne odgovara",
        "prevn": "prethodna {{PLURAL:$1|$1}}",
        "nextn": "{{PLURAL:$1|slijedeći $1|slijedećih $1}}",
+       "prev-page": "prethodna stranica",
+       "next-page": "sljedeća stranica",
        "prevn-title": "{{PLURAL:$1|Prethodni $1 rezultat|Prethodna $1 rezultata|Prethodnih $1 rezultata}}",
        "nextn-title": "{{PLURAL:$1|Slijedeći $1 rezultat|Slijedeća $1 rezultata|Slijedećih $1 rezultata}}",
        "shown-title": "Pokaži $1 {{PLURAL:$1|rezultat|rezultata}} po stranici",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 podkategorija|$2 podkategorije|$2 podkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
        "search-redirect": "(preusmjeravanje $1)",
        "search-section": "(sekcija $1)",
+       "search-category": "(kategorija $1)",
        "search-file-match": "(odgovara sadržaju datoteke)",
        "search-suggest": "Da li ste mislili: $1",
+       "search-rewritten": "Prikazuju se rezultati za $1. Umjesto toga pretraži $2.",
        "search-interwiki-caption": "Srodni projekti",
        "search-interwiki-default": "Rezultati od $1:",
        "search-interwiki-more": "(više)",
        "showingresultsinrange": "Ispod {{PLURAL:$1|je prikazan <strong>1</strong> rezultat|su prikazana <strong>$1</strong> rezultata|je prikazano <strong>$1</strong> rezultata}}, u rasponu od <strong>$2</strong> do <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1 - $2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Nisu pronađeni rezultati koji odgovaraju upitu.",
+       "search-nonefound-thiswiki": "Nisu pronađeni rezultati koji odgovaraju upitu na ovom sajtu.",
        "powersearch-legend": "Napredna pretraga",
        "powersearch-ns": "Pretraga u imenskim prostorima:",
        "powersearch-togglelabel": "Označi:",
        "powersearch-toggleall": "Sve",
        "powersearch-togglenone": "Ništa",
+       "powersearch-remember": "Zapamti izbor za buduće pretrage",
        "search-external": "Vanjska/spoljna pretraga",
        "searchdisabled": "Pretraga teksta na ovoj Wiki je trenutno onemogućena.\nU međuvremenu možete pretraživati preko Googlea.\nUzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.",
        "search-error": "Dogodila se pogreška prilikom pretraživanja: $1",
        "preferences": "Postavke / Подешавања",
-       "mypreferences": "Moje postavke / Моја подешавања",
+       "mypreferences": "Postavke / Подешавања",
        "prefs-edits": "Broj izmjena:",
-       "prefsnologintext2": "Molimo $1 kako bi promijenili vaše postavke.",
+       "prefsnologintext2": "Molimo Vas prijavite se da biste promijenili postavke.",
        "prefs-skin": "Izgled (skin)",
        "skin-preview": "Pretpregled",
        "datedefault": "Bez preferenci",
        "prefs-personal": "Korisnički profil",
        "prefs-rc": "Podešavanje nedavnih izmjena",
        "prefs-watchlist": "Praćene stranice / Списак надгледања",
+       "prefs-editwatchlist": "Uredi popis praćenja",
+       "prefs-editwatchlist-label": "Uredi unose na popisu praćenja:",
+       "prefs-editwatchlist-edit": "Vidite i uklonite naslove na vašem popisu praćenja",
+       "prefs-editwatchlist-raw": "Uredi grubi popis praćenja",
+       "prefs-editwatchlist-clear": "očisti popis praćenja",
        "prefs-watchlist-days": "Broj dana za prikaz u spisku praćenja:",
        "prefs-watchlist-days-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
        "prefs-watchlist-edits": "Najveći broj izmjena za prikaz u proširenom spisku praćenja:",
        "prefs-watchlist-token": "Token spiska za praćenje:",
        "prefs-misc": "Razno / Разно",
        "prefs-resetpass": "Promijeni lozinku",
-       "prefs-changeemail": "Promijeni E-mail",
+       "prefs-changeemail": "Promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite E-mail adresu",
        "prefs-email": "E-mail opcije",
        "prefs-rendering": "Izgled",
        "rows": "Redova:",
        "columns": "Kolona:",
        "searchresultshead": "Postavke rezultata pretrage",
-       "stub-threshold": "Formatiranje <a href=\"#\" class=\"stub\">linkova stranica u začetku</a> (bajtova):",
+       "stub-threshold": "Prag za formatiranje linkova ka stranicama u začetku ($1):",
+       "stub-threshold-sample-link": "uzorak",
        "stub-threshold-disabled": "Isključen/a",
        "recentchangesdays": "Broj dana za prikaz u nedavnim izmjenama:",
        "recentchangesdays-max": "(najviše $1 {{PLURAL:$1|dan|dana}})",
        "prefs-help-recentchangescount": "Ovo uključuje nedavne izmjene, historije stranice i registre.",
        "prefs-help-watchlist-token2": "Ovo je tajni ključ prema sažetku Vašeg popisa praćenja. Svaki suradnik kojem je poznat, moći će čitati Vaš popis praćenih stranica. Ne dijelite ga ni s kim. [[Special:ResetTokens|Kliknite ovdje ako ga želite ponovo postaviti]].",
        "savedprefs": "Vaša postavke su snimljene.",
+       "savedrights": "Korisnička prava {{GENDER:$1|korisnika|korisnice}} su snimljena.",
        "timezonelegend": "Vremenska zona / Временска зона",
        "localtime": "Lokalno vrijeme:",
        "timezoneuseserverdefault": "Koristi postavke wikija ($1)",
        "badsig": "Loš sirovi potpis.\nProvjerite HTML tagove.",
        "badsiglength": "Vaš potpis je predug.\nMora biti manji od $1 {{PLURAL:$1|znaka|znaka|znakova}}.",
        "yourgender": "Kako želite da se predstavite?",
-       "gender-unknown": "Preferiram da se ne odredim",
+       "gender-unknown": "Kad vas spominje, softver će pokušati koristiti srednji rod kad god je to moguće",
        "gender-male": "On uređuje wiki stranice",
        "gender-female": "Ona uređuje wiki stranice",
        "prefs-help-gender": "Postavljanje ove preferencije nije obavezno.\nSoftver koristi ovu vrijednost kako bi vam se obratio i spomenuo vas drugima koristeći vaš gramatički rod.\nOva informacija će biti javna.",
        "email": "E-mail",
-       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.",
+       "prefs-help-realname": "Pravo ime nije obavezno.\nAko izaberete da date ime, biće korišteno za pripisivanje vašem radu.",
        "prefs-help-email": "E-mail adresa je opcionalna, ali je potrebna jer omogućava da Vam se pošalje nova šifra u slučaju da je izgubite ili zaboravite.",
        "prefs-help-email-others": "Također možete da odaberete da vas drugi kontaktiraju putem vaše korisničke stranice ili stranice za razgovor bez otkrivanja vašeg identiteta.",
        "prefs-help-email-required": "Neophodno je navesti e-mail adresu.",
        "prefs-advancedwatchlist": "Napredne opcije",
        "prefs-displayrc": "Postavke displeja",
        "prefs-displaywatchlist": "Postavke prikaza",
+       "prefs-tokenwatchlist": "Žeton",
        "prefs-diffs": "Razlike",
        "prefs-help-prefershttps": "Ova mogućnost će stupiti na snagu kod vaše sljedeće prijave.",
+       "prefswarning-warning": "Napravili ste promjene u vašim postavkama koje još uvijek nisu sačuvane. Ako napustite ovu stranicu bez da pritisnete na \"$1\", postavke neće biti ažurirane.",
        "prefs-tabs-navigation-hint": "Savjet: Možete koristi lijevu i desnu navigacijsku tipku kako biste se kretali između tabova u popisu tabova.",
        "email-address-validity-valid": "E-mail adresa izgleda valjano",
        "email-address-validity-invalid": "Unesite valjanu e-mail adresu",
        "userrights-lookup-user": "Menadžment korisničkih prava",
        "userrights-user-editname": "Unesi korisničko ime:",
        "editusergroup": "Menjaj Grupe Korisnika",
-       "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice|korisnika}} '''[[User:$1|$1]]''' $2",
+       "editinguser": "Mijenjate korisnička prava {{GENDER:$1|korisnika|korisnice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Uredi korisničke grupe",
        "saveusergroups": "Snimi korisničke grupe",
        "userrights-groupsmember": "Član:",
        "group-bot": "Botovi",
        "group-sysop": "Administratori",
        "group-bureaucrat": "Birokrati",
-       "group-suppress": "Nadzornici",
+       "group-suppress": "Skrivači",
        "group-all": "(svi)",
        "group-user-member": "{{GENDER:$1|korisnik|korisnica|korisnik}}",
        "group-autoconfirmed-member": "{{GENDER:$1|automatski potvrđen korisnik|automatski potvrđena korisnica|automatski potvrđen korisnik}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|administrator|administratorka|administrator}}",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat|birokratica|birokrat}}",
-       "group-suppress-member": "{{GENDER:$1|nadzornik|nadzornica|nadzornik}}",
+       "group-suppress-member": "{{GENDER:$1|skrivač|skrivačica}}",
        "grouppage-user": "{{ns:project}}:Korisnici",
        "grouppage-autoconfirmed": "{{ns:project}}:Potvrđeni korisnici",
        "grouppage-bot": "{{ns:project}}:Botovi",
        "grouppage-sysop": "{{ns:project}}:Administratori",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrati",
-       "grouppage-suppress": "{{ns:project}}:Nadzornici",
+       "grouppage-suppress": "{{ns:project}}:Skrivač",
        "right-read": "Čitanje stranica",
        "right-edit": "Uređivanje stranica",
        "right-createpage": "Pravljenje stranica (ne uključujući stranice za razgovor)",
        "right-move": "Preusmjeravanje stranica",
        "right-move-subpages": "Preusmjeravanje stranica sa svim podstranicama",
        "right-move-rootuserpages": "Premještanje stranica osnovnih korisnika",
+       "right-move-categorypages": "Pomakni stranice kategorije",
        "right-movefile": "Premještanje datoteka",
        "right-suppressredirect": "Ne pravi preusmjeravanje sa starog imena pri preusmjeravanju stranica",
        "right-upload": "Postavljanje datoteka",
        "right-deletedtext": "Pregled obrisanog teksta i izmjena između obrisanih revizija",
        "right-browsearchive": "Pretraživanje obrisanih stranica",
        "right-undelete": "Vraćanje obrisanih stranica",
-       "right-suppressrevision": "Pregled i povratak revizija sakrivenih od administratora",
+       "right-suppressrevision": "Pregled, sakrivanje i povratak određenih revizija stranice od svih korisnika",
+       "right-viewsuppressed": "Pregledaj izmjene skrivene od svih korisnika",
        "right-suppressionlog": "Pregled privatnih evidencija",
        "right-block": "Blokiranje uređivanja drugih korisnika",
        "right-blockemail": "Blokiranje korisnika da šalje e-mail",
        "right-protect": "Promjena nivoa zaštite i uređivanje kaskadno zaštićenih stranica",
        "right-editprotected": "Uređivanje stranice zaštićenih kao \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Uređivanje stranica zaštićenih kao  \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editcontentmodel": "Uređivanje modela sadržaja stranice",
        "right-editinterface": "Uređivanje korisničkog interfejsa",
        "right-editusercssjs": "Uređivanje CSS i JS datoteka drugih korisnika",
        "right-editusercss": "Uređivanje CSS datoteka drugih korisnika",
        "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": "Pregled e-maila za obnavljanje lozinke",
+       "right-managechangetags": "Napravi i briši [[Special:Tags|oznake]] iz baze podataka",
+       "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
+       "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
        "newuserlogpage": "Registar novih korisnika",
        "newuserlogpagetext": "Ovo je evidencija registracije novih korisnika.",
        "rightslog": "Evidencija korisničkih prava",
        "action-createpage": "stvaranje stranica",
        "action-createtalk": "stvaranje stranica za razgovor",
        "action-createaccount": "stvaranje ovog korisničkog računa",
+       "action-history": "gledate historiju ove stranice",
        "action-minoredit": "označavanje ove izmjene kao manje",
        "action-move": "premještanje ove stranice",
        "action-move-subpages": "premještanje ove stranice, i njenih podstranica",
        "action-move-rootuserpages": "premještanje osnovne stranice korisnika",
+       "action-move-categorypages": "pomakni stranice kategorije",
        "action-movefile": "premjesti ovu datoteku",
        "action-upload": "postavljate ovu datoteku",
        "action-reupload": "postavljanje nove verzije datoteke",
        "action-viewmywatchlist": "pogledajte svoj spisak praćenja",
        "action-viewmyprivateinfo": "pogledajte svoje privatne informacije",
        "action-editmyprivateinfo": "uredite svoje privatne informacije",
+       "action-editcontentmodel": "uredi model sadržaja stranice",
+       "action-managechangetags": "napravite i uklonite oznake iz baze podataka",
+       "action-applychangetags": "dodajte oznake uz vaše izmjene",
+       "action-changetags": "dodajte ili uklonite razne oznake na pojedinačnim verzijama i unosima u zapisnicima",
        "nchanges": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|izmjena od Vaše posljedne posjete}}",
        "enhancedrc-history": "historija",
        "recentchanges-label-plusminus": "Veličina stranice promijenila se za ovoliko bajtova",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (također pogledajte [[Special:NewPages|spisak novih stranica]])",
-       "rcnotefrom": "Ispod su izmjene od <strong>$2</strong> (do <strong>$1</strong> prikazano).",
+       "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (do <strong>$1</strong> prikazano).",
        "rclistfrom": "Prikaži nove poruke od / Прикажи нове поруке од $3 $2",
        "rcshowhideminor": "$1 male izmjene / мале измене",
        "rcshowhideminor-show": "Pokaži",
        "rcshowhidebots": "$1 botove / ботове",
        "rcshowhidebots-show": "Pokaži",
        "rcshowhidebots-hide": "Sakrij",
-       "rcshowhideliu": "$1 registrovanih korisnika",
+       "rcshowhideliu": "$1 registrirane / регистроване",
        "rcshowhideliu-show": "Pokaži",
        "rcshowhideliu-hide": "Sakrij",
        "rcshowhideanons": "$1 anonimne / анонимне",
        "rcshowhidemine": "$1 vlastite izmjene / сопствене измене",
        "rcshowhidemine-show": "Pokaži",
        "rcshowhidemine-hide": "Sakrij",
+       "rcshowhidecategorization": "$1 kategorizacija stranice",
+       "rcshowhidecategorization-show": "Prikaži",
+       "rcshowhidecategorization-hide": "Sakrij",
        "rclinks": "Prikaži najskorijih $1 izmjena u posljednjih $2 dana<br />$3",
        "diff": "razl-разл",
        "hist": "his-пов",
        "newpageletter": "N/Н",
        "boteditletter": "b",
        "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_categories": "Ograniči na kategorije (razdvoji sa \"|\"):",
+       "rc_categories_any": "Bilo koju odabranu",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajta|bajtova}} posle izmene",
        "newsectionsummary": "/* $1 */ nova sekcija",
        "rc-enhanced-expand": "Pokaži detalje",
        "recentchangeslinked-summary": "Ova posebna stranica prikazuje promjene na povezanim stranicama.\nStranice koje su na vašem [[Special:Watchlist|spisku praćenja]] su '''podebljane'''.",
        "recentchangeslinked-page": "Naslov stranice:",
        "recentchangeslinked-to": "Pokaži promjene stranica koji su povezane sa datom stranicom",
+       "recentchanges-page-added-to-category": "[[:$1]] pridodano kategoriji",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|pridodana|pridodane}} kategoriji",
+       "recentchanges-page-removed-from-category": "[[:$1]] uklonjeno iz kategorije",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] i {{PLURAL:$2|stranica|$2 stranica}} {{PLURAL:$2|uklonjena|uklonjenne}} iz kategorije",
+       "autochange-username": "MediaWiki automatska promjena",
        "upload": "Postavi datoteku",
        "uploadbtn": "Postavi datoteku",
        "reuploaddesc": "Vratite se na upitnik za slanje",
        "uploaderror": "Greška pri slanju",
        "upload-recreate-warning": "'''Upozorenje: Datoteka s tim imenom je obrisana ili premještena.'''\n\nZapisnik brisanja i premještanja za ovu stranicu je dostupan ovdje na uvid:",
        "uploadtext": "Koristite formu ispod za postavljanje datoteka.\nDa bi ste vidjeli ili pretražili ranije postavljene datoteke, pogledajte [[Special:FileList|spisak postavljenih datoteka]], ponovna postavljanja su također zapisana u [[Special:Log/upload|evidenciji postavljanja]], a brisanja u [[Special:Log/delete|evidenciji brisanja]].\n\nDa bi ste prikazali datoteku na stranici, koristite link na jedan od slijedećih načina:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.jpg]]</nowiki></code>''' da upotrijebite potpunu veziju datoteke\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datoteka.png|200px|thumb|lijevo|opis slike]]</nowiki></code>''' da upotrijebite smanjeni prikaz širine 200 piksela unutar okvira, s lijevim poravnanjem i ''opisom slike''.\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datoteka.ogg]]</nowiki></code>''' za direkno povezivanje datoteke bez njenog prikazivanja",
-       "upload-permitted": "Podržane vrste datoteka: $1.",
-       "upload-preferred": "Preferirane vrste datoteka: $1.",
-       "upload-prohibited": "Zabranjene vrste datoteka: $1.",
+       "upload-permitted": "{{PLURAL:$2|Podržana vrsta|Podržane vrste}} datoteka: $1.",
+       "upload-preferred": "{{PLURAL:$2|Preferirana vrsta|Preferirane vrste}} datoteka: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Zabranjena vrsta|Zabranjene vrste}} datoteka: $1.",
        "uploadlogpage": "Registar postavljanja",
        "uploadlogpagetext": "Ispod je popis najnovijih postavljanja datoteka.\nVidi [[Special:NewFiles|galeriju novih datoteka]] za slikovitiji pregled.",
        "filename": "Ime fajla / Име датотеке",
        "largefileserver": "Ova datoteka je veća nego što server dopušta.",
        "emptyfile": "Datoteka koju ste poslali je prazna. \nOvo je moguće zbog greške u imenu datoteke. \nMolimo Vas da provjerite da li stvarno želite da pošaljete ovu datoteku.",
        "windows-nonascii-filename": "Ova wiki ne podržava imena datoteka sa posebnim znacima.",
-       "fileexists": "Datoteka sa ovim imenom već postoji.\nMolimo Vas da provjerite <strong>[[:$1]]</strong> ako niste sigurni da li želite da je promjenite.\n[[$1|thumb]]",
+       "fileexists": "Datoteka sa ovim imenom već postoji, molimo Vas provjerite <strong>[[:$1]]</strong> ako {{GENDER:|niste}} sigurni da je želite promjeniti.\n[[$1|thumb]]",
        "filepageexists": "Opis stranice za ovu datoteku je već napravljen ovdje <strong>[[:$1]]</strong>, ali datoteka sa ovim nazivom trenutno ne postoji.\nSažetak koji ste naveli neće se pojaviti na stranici opisa.\nDa bi se Vaš opis ovdje našao, potrebno je da ga ručno uredite.\n[[$1|thumb]]",
-       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nMolimo Vas da izaberete drugačiji naziv.",
+       "fileexists-extension": "Datoteka sa sličnim nazivom postoji: [[$2|thumb]]\n* Naziv datoteke koja se postavlja: <strong>[[:$1]]</strong>\n* Naziv postojeće datoteke: <strong>[[:$2]]</strong>\nDa li možda želite koristiti drugačiji naziv?",
        "fileexists-thumbnail-yes": "Izgleda da je datoteka slika smanjene veličine ''(\"thumbnail\")''. [[$1|thumb]]\nMolimo provjerite datoteku <strong>[[:$1]]</strong>.\nAko je provjerena datoteka ista slika originalne veličine, nije potrebno postavljati dodatnu sliku.",
        "file-thumbnail-no": "Naziv datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o smanjenoj slici ''(\"thumbnail\")''.\nAko imate ovu sliku u punoj rezoluciji, postavite nju; ili promijenite naslov ove datoteke.",
        "fileexists-forbidden": "Datoteka sa ovim imenom već postoji i ne može biti presnimljena.\nAko i dalje želite da postavite ovu datoteku, molimo Vas da se vratite i pošaljete ovu datoteku pod novim imenom. [[File:$1|thumb|center|$1]]",
        "uploaddisabledtext": "Postavljanje datoteka je onemogućeno.",
        "php-uploaddisabledtext": "Postavljanje datoteka preko PHP je onemogućeno. \nMolimo provjerite postavku za postavljanje datoteka.",
        "uploadscripted": "Ova datoteka sadrži HTML ili skriptni kod koji može izazvati grešku kod internet preglednika.",
+       "upload-scripted-pi-callback": "Datoteka koja sadrži instrukcije za obradu XML stilskog oblika se ne može postaviti.",
+       "uploaded-script-svg": "Pronađen skriptni element \"$1\" u postavljenoj SVG datoteci.",
+       "uploaded-hostile-svg": "Pronađen nesiguran CSS u stilskom elementu postavljene SVG datoteke.",
+       "uploaded-event-handler-on-svg": "Nije dozvoljeno postavljanje atributa koji kontroliraju događaje <code>$1=\"$2\"</code> u SVG datotekama.",
+       "uploaded-href-attribute-svg": "href atributi <code>&lt;$1 $2=\"$3\"&gt;</code> sa nelokalnom metom (npr. http://, javascript:, etc) nisu dozvoljeni u SVG datotekama.",
+       "uploaded-href-unsafe-target-svg": "Pronađen href sa nesigurnom metom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-animate-svg": "Pronađena \"animate\" oznaka koja možda mijenja href koristeći se \"from\" atributom <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-event-handler-svg": "Postavljanje kontrole događaja je blokirano, pronađeno <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-href-svg": "Blokirano je korištenje \"set\" oznake kako bi se dodao \"href\" atribut glavnom elementu.",
+       "uploaded-wrong-setting-svg": "Blokirano je korištenje oznake \"set\" kako bi se dodao atribut udaljenoj/podatkovnoj/skriptnoj meti. Pronađeno <code>&lt;set to=\"$1\"&gt;</code> u postavljenoj SVG datoteci.",
+       "uploaded-setting-handler-svg": "SVG datoteka koja koristi atribut \"handler\" sa udaljenom/podatkovnoj/skriptnom vrijednosti je blokirana. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
+       "uploaded-remote-url-svg": "SVG datoteka koja postavlja stilski atribut koristeći se vanjskim linkom je blokiranja. Pronađeno <code>$1=\"$2\"</code> u postavljenoj SVG datoteci.",
+       "uploaded-image-filter-svg": "Pronađen slikovni filter sa URLom: <code>&lt;$1 $2=\"$3\"&gt;</code> u postavljenoj SVG datoteci.",
        "uploadscriptednamespace": "Ova SVG datoteka sadrži pogrešan imenski prostor „$1“",
        "uploadinvalidxml": "XML u postavljenoj datoteci nije mogao biti parsiran.",
        "uploadvirus": "Fajl sadrži virus!  Detalji:  $1",
        "upload-options": "Opcije postavljanja",
        "watchthisupload": "Prati ovu datoteku",
        "filewasdeleted": "Datoteka s ovim nazivom je ranije postavljana i nakon toga obrisana.\nPrije nego što nastavite da je ponovno postavite trebate provjeriti $1.",
+       "filename-thumb-name": "Ovo izgleda kao thumbnail naslov. Molimo ne postavljate thumbnaile natrag na istu wiki. Ukoliko je riječ o nečemu drugome, molimo popravite ime datoteke tako da ima više značenja i nema thumbnail prefiks.",
        "filename-bad-prefix": "Naziv datoteke koju postavljate počinje sa '''\"$1\"''', što je naziv koji obično automatski dodjeljuju digitalni fotoaparati i kamere.\nMolimo Vas da odaberete naziv datoteke koji opisuje njen sadržaj.",
        "upload-success-subj": "Uspješno slanje",
        "upload-success-msg": "Vaša datoteka iz [$2] je uspješno postavljena. Dostupna je ovdje: [[:{{ns:file}}:$1]]",
        "upload-too-many-redirects": "URL sadrži previše preusmjerenja",
        "upload-http-error": "Desila se HTTP greška: $1",
        "upload-copy-upload-invalid-domain": "Kopije postavljanja nisu dostupni na ovom domenu.",
+       "upload-dialog-title": "Postavi datoteku",
+       "upload-dialog-button-cancel": "Odustani",
+       "upload-dialog-button-done": "Urađeno",
+       "upload-dialog-button-save": "Snimi",
+       "upload-dialog-button-upload": "Postavi",
+       "upload-form-label-select-file": "Izaberi datoteku",
+       "upload-form-label-infoform-title": "Detalji",
+       "upload-form-label-infoform-name": "Ime",
+       "upload-form-label-infoform-description": "Opis",
+       "upload-form-label-usage-title": "Korištenje",
+       "upload-form-label-usage-filename": "Ime datoteke",
+       "foreign-structured-upload-form-label-own-work": "Ovo je moje djelo",
+       "foreign-structured-upload-form-label-infoform-categories": "Kategorije",
+       "foreign-structured-upload-form-label-infoform-date": "Datum",
+       "foreign-structured-upload-form-label-own-work-message-local": "Potvrđujem kako postavljam ovu datoteku u skladu sa uvjetima korištenja i politikom licenciranja na {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Ukoliko niste u stanju postaviti ovu datoteku pod politikom {{SITENAME}}, molimo zatvorite ovaj dijalog i pokušajte drugom metodom.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Također možete pokušati [[Special:Upload|na standarnoj stranici za postavljanje]].",
+       "foreign-structured-upload-form-label-own-work-message-default": "Razumijem kako postavljam ovu datoteku na dijeljeno skladište. Potvrđujem kako to činim u skladu sa uvjetima korištenja i ovdašnjom politikom licenciranja.",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "Ukoliko niste u stanju postaviti ovu datoteku pod politikom dijeljene ostave, molimo zatvorite ovaj dijalog i pokušajte drugu metodu.",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "Možete također pokušati koristeći  [[Special:Upload|stranicu za postavljanje na  {{SITENAME}}]], ukoliko se ova datoteka može postaviti pod tamošnjom politikom.",
+       "foreign-structured-upload-form-label-own-work-message-shared": "Potvrđujem da posjedujem autorska prava za ovu datoteku i slažem se da ću je neopozivo postaviti na Wikimedia Commons pod licencom [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0], te se slažem s [https://wikimediafoundation.org/wiki/Terms_of_Use Uvjetima korištenja].",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "Ako ne posjedujete autorska prava za ovu datoteku ili je želite postaviti pod drugom licencom, imajte na umu da možete koristiti [https://commons.wikimedia.org/wiki/Special:UploadWizard čarobnjak za postavljanje datoteka na Commonsu].",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "Također možete koristiti [[Special:Upload|stranicu za postavljanje datoteka na projektu {{SITENAME}}]] ako politika stranice dozvoljava postavljanje ove datoteke.",
        "backend-fail-stream": "Ne mogu da emitujem datoteku $1.",
        "backend-fail-backup": "Ne mogu da napravim rezervu datoteke $1.",
        "backend-fail-notexists": "Datoteka $1 ne postoji.",
        "license": "Licenca - Лиценца",
        "license-header": "Licenciranje",
        "nolicense": "Ništa nije odabrano",
+       "licenses-edit": "Uredi izbor licenci",
        "license-nopreview": "(Pregled nije dostupan)",
-       "upload_source_url": "(valjani, javno dostupni URL)",
-       "upload_source_file": "(datoteka na Vašem kompjuteru)",
+       "upload_source_url": "(vaša izabrana datoteka od validnih, javno dostupnih URL-a)",
+       "upload_source_file": "(vaša odabrana datoteka sa Vašeg računara)",
+       "listfiles-delete": "obriši",
        "listfiles-summary": "Ova posebna stranica prikazuje sve postavljene datoteke.",
        "listfiles_search_for": "Traži ime medija:",
+       "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
        "listfiles_thumb": "Smanjeni pregled",
        "filedelete-maintenance": "Brisanje i povratak datoteka je privremeno onemogućen tokom održavanja.",
        "filedelete-maintenance-title": "Ne mogu obrisati datoteku",
        "mimesearch": "MIME pretraga",
-       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/podvrsta, npr. <code>image/jpeg</code>.",
+       "mimesearch-summary": "Ova stranica omogućava filtriranje datoteka prema njihovoj MIME vrsti.\nUlazni podaci: vrstasadržaja/subvrsta ili vrstasadržaja/*, npr. <code>image/jpeg</code>.",
        "mimetype": "MIME tip:",
        "download": "učitaj",
        "unwatchedpages": "Nepraćene stranice",
        "randomincategory": "Slučajna stranica u kategoriji",
        "randomincategory-invalidcategory": "\"$1\" nije valjano ime kategorije.",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
+       "randomincategory-category": "Kategorija:",
+       "randomincategory-legend": "Slučajna stranica u kategoriji",
+       "randomincategory-submit": "Idi",
        "randomredirect": "Slučajno preusmjerenje / Случајно преусмјерење",
        "randomredirect-nopages": "Nema preusmjerenja u imenskom prostoru \"$1\".",
        "statistics": "Statistike / Статистике",
        "unusedimages": "Neiskorišćene slike / Неискоришћене слике",
        "wantedcategories": "Tražene kategorije",
        "wantedpages": "Tražene stranice / Тражене странице",
+       "wantedpages-summary": "Spisak nepostojećih stranica sa najviše veza ka njima. Na spisku se ne nalaze stranice do kojih vode preusmjerenja. Za spisak nepostojećih stranica na koje su povezana preumsjerenja, pogledajte [[{{#special:BrokenRedirects}}|spisak pokvarenih preusmerenja]].",
        "wantedpages-badtitle": "Nevaljan naslov u setu rezultata: $1",
        "wantedfiles": "Tražene datoteke",
        "wantedfiletext-cat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbačene</del> sa spiska. Pored toga, stranice koje sadrže nepostojeće datoteke se nalaze [[:$1|ovde]].",
+       "wantedfiletext-cat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje. Dodatno, stranice koje ugrađuju datoteke koje ne postoje prikazane su u [[:$1]].",
        "wantedfiletext-nocat": "Sledeće datoteke se koriste, ali ne postoje. Datoteke iz drugih spremnika mogu biti navedene iako ne postoje. Takve datoteke će biti <del>izbačene</del> sa spiska.",
+       "wantedfiletext-nocat-noforeign": "Sljedeće datoteke se koriste, ali ne postoje.",
        "wantedtemplates": "Potrebni šabloni",
        "mostlinked": "Najviše povezanih sa člancima / Највише повезаних са чланцима",
        "mostlinkedcategories": "Najviše povezanih sa kategorijama / Највише повезаних са категоријама",
-       "mostlinkedtemplates": "Šabloni sa najviše linkova",
+       "mostlinkedtemplates": "Stranice s najviše veza",
        "mostcategories": "Stranice sa najviše kategorija",
        "mostimages": "Najviše povezanih sa slikama / Највише повезаних са сликама",
        "mostinterwikis": "Stranice s najviše međuwiki poveznica",
        "protectedpages-unknown-timestamp": "Nepoznato",
        "protectedpages-unknown-performer": "Nepoznati korisnik",
        "protectedtitles": "Zaštićeni naslovi",
+       "protectedtitles-summary": "Na ovoj stranici se nalazi spisak trenutno zaštićenih naslova. Za spisak trenutno zaštićenih stranica vidi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Nema naslova zaštićenih članaka sa ovim parametrima.",
        "listusers": "Spisak korisnika",
        "listusers-editsonly": "Pokaži samo korisnike koji su uređivali",
        "listusers-creationsort": "Sortiraj po datumu pravljenja",
+       "listusers-desc": "Sortiraj u opadajućem redoslijedu",
        "usereditcount": "$1 {{PLURAL:$1|izmjena|izmjene}}",
        "usercreated": "{{GENDER:$3|je napravio|je napravila|je napravio}} dana $1 u $2",
        "newpages": "Nove stranice / Нове странице",
        "nopagetext": "Ciljna stranica koju ste naveli ne postoji.",
        "pager-newer-n": "{{PLURAL:$1|novija 1|novije $1}}",
        "pager-older-n": "{{PLURAL:$1|starija 1|starije $1}}",
-       "suppress": "Nazdor",
+       "suppress": "Sakrij",
        "querypage-disabled": "Ova posebna stranica je onemogućena jer smanjuje performanse.",
+       "apihelp": "API pomoć",
+       "apihelp-no-such-module": "Modul \"$1\" nije pronađen.",
        "booksources": "Književni izvori",
        "booksources-search-legend": "Traži književne izvore",
        "booksources-search": "Traži",
        "booksources-text": "Ispod se nalazi spisak vanjskih linkova na ostale stranice koje prodaju nove ili korištene knjige kao i stranice koje mogu da imaju važnije podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Navedeni ISBN broj nije validan; molimo da provjerite da li je došlo do greške pri kopiranju iz prvobitnog izvora.",
        "specialloguserlabel": "Izvršilac:",
-       "speciallogtitlelabel": "Cilj (naslov ili korisnik):",
+       "speciallogtitlelabel": "Cilj (naslov ili {{ns:user}}:korisničko ime):",
        "log": "Evidencije",
        "all-logs-page": "Sve evidencije - Све евиденције",
        "alllogstext": "Zajednički prikaz svih dostupnih evidencija sa {{SITENAME}}.\nMožete specificirati prikaz izabiranjem specifičnog spiska, korisničkog imena ili promjenjenog članka (razlikovati velika slova).",
        "logempty": "Ne postoji takav zapis.",
        "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane zapise u evidenciji",
+       "log-edit-tags": "Uredi oznake izabranih zapisničkih unosa",
        "allpages": "Sve stranice / Све странице",
        "nextpage": "Sljedeća strana ($1)",
        "prevpage": "Prethodna stranica ($1)",
        "activeusers-noresult": "Nije pronađen korisnik.",
        "listgrouprights": "Prava korisničkih grupa",
        "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pravima pristupa.\nO svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
+       "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Dodano pravo</span>\n* <span class=\"listgrouprights-revoked\">Uklonjeno pravo</span>",
        "listgrouprights-group": "Grupa",
        "listgrouprights-rights": "Prava",
        "listgrouprights-helppage": "Help:Grupna prava",
        "listgrouprights-removegroup-self": "Može ukloniti {{PLURAL:$2|grupu|grupe|grupa}} sa svog računa: $1",
        "listgrouprights-addgroup-self-all": "Može dodati sve grupe na svoj račun",
        "listgrouprights-removegroup-self-all": "Može ukloniti sve grupe sa svog računa",
+       "listgrouprights-namespaceprotection-header": "Ograničenja imenskog prostora",
+       "listgrouprights-namespaceprotection-namespace": "Imenski prostor",
+       "listgrouprights-namespaceprotection-restrictedto": "Prava kojima se dozvoljava korisniku da uređuje",
+       "trackingcategories": "Praćenje kategorija",
+       "trackingcategories-summary": "Ova stranica prikazuje prateće kategorije koje MediaWiki softver automatski popunjava. Njihovi nazivi se mogu promijeniti izmjenom odgovarajućih sistemskih poruka u imenskom prostoru {{ns:8}}.",
+       "trackingcategories-msg": "Praćenje kategorije",
+       "trackingcategories-name": "Ime poruke",
+       "trackingcategories-desc": "Kriterij uključenja kategorije",
+       "noindex-category-desc": "Roboti ne indeksiraju stranicu jer u sebi ima magičnu riječ <code><nowiki>__NOINDEX__</nowiki></code>, te je u imenskom prostoru u kome ta oznaka nije dozvoljena.",
+       "index-category-desc": "Stranica ima u sebi <code><nowiki>__INDEX__</nowiki></code> (te se nalazi u imenskom prostoru gdje je ta oznaka dozvoljena) pa je, samim tim, roboti indeksiraju.",
+       "post-expand-template-inclusion-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja svih šablona, te zbog toga neki šabloni nisu prošireni.",
+       "post-expand-template-argument-category-desc": "Veličina stranice prelazi <code>$wgMaxArticleSize</code> nakon proširenja defincije šablona (nešto što je u trima vitičastim zagradama, poput <code>{{{Foo}}}</code>).",
+       "expensive-parserfunction-category-desc": "Stranica koristi previše ekspenzivnih parserskih funkcija (poput <code>#ifexist</code>). Pogledajte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
+       "broken-file-category-desc": "Stranica sadrži pokvareni link ka datoteci (link koji se nadovezuje na nepostojeću datoteku).",
+       "hidden-category-category-desc": "Kategorija u sebi sadrži <code><nowiki>__HIDDENCAT__</nowiki></code> te se samim tim ne prikazuju u odjeljku za kategoriju na stranicama.",
+       "trackingcategories-nodesc": "Opis nije dostupan.",
+       "trackingcategories-disabled": "Kategorija je onemogućena",
        "mailnologin": "Nema adrese za slanje",
        "mailnologintext": "Morate biti [[Special:UserLogin|prijavljeni]] i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]] da biste slali e-poštu drugim korisnicima.",
        "emailuser": "Pošalji E-mail ovom korisniku",
        "emailccsubject": "Kopiranje Vaše poruke za $1: $2",
        "emailsent": "E-mail poruka poslata",
        "emailsenttext": "Vaša poruka je poslata e-poštom.",
-       "emailuserfooter": "Ovaj e-mail je poslao $1 korisniku $2 putem funkcije \"Pošalji e-mail korisniku\" sa {{SITENAME}}.",
+       "emailuserfooter": "Ovu e-poruku {{GENDER:$1|poslao|poslala}} je $1 {{GENDER:$2|korisniku|korisnici}} $2 pomoću funkcije \"{{int:emailuser}}\" s projekta {{SITENAME}}.",
        "usermessage-summary": "Ostavljanje sistemske poruke.",
        "usermessage-editor": "Sistem za poruke",
        "watchlist": "Spisak praćenja / Списак праћења",
-       "mywatchlist": "Moj popis praćenja / Списак надгледања",
+       "mywatchlist": "Popis praćenja / Списак надгледања",
        "watchlistfor2": "Za $1 $2",
        "nowatchlist": "Nemate ništa na svom spisku praćenih članaka.",
-       "watchlistanontext": "Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.",
+       "watchlistanontext": "Morate biti prijavljeni kako biste vidjeli ili uređivali svoj spisak praćenih članaka.",
        "watchnologin": "Niste logovani / Нисте логовани",
        "addwatch": "Dodaj u popis praćenja",
-       "addedwatchtext": "Stranica \"[[:$1]]\" je dodata vašem [[Special:Watchlist|spisku praćenih članaka]]. \nBuduće promjene ove stranice i njoj pridružene stranice za razgovor će biti navedene ovde.",
+       "addedwatchtext": "Stranica \"[[:$1]]\" i njena stranica za razgovor dodani su na vaš [[Special:Watchlist|spisak praćenja]].",
+       "addedwatchtext-short": "Stranica \"$1\" je dodana na vaš spisak praćenja.",
        "removewatch": "Ukloni sa spiska praćenja",
-       "removedwatchtext": "Stranica \"[[:$1]]\" je uklonjena s [[Special:Watchlist|vaše liste praćenja]].",
+       "removedwatchtext": "Stranica „[[:$1]]“ i njena stranica za razgovor je uklonjena s vašeg [[Special:Watchlist|spiska nadgledanja]].",
+       "removedwatchtext-short": "Stranica \"$1\" je uklonjena sa vašeg spiska praćenja.",
        "watch": "Prati / Прати",
        "watchthispage": "Prati / Прати",
        "unwatch": "Prekini praćenje",
        "unwatchthispage": "Ukinite praćenje",
        "notanarticle": "Nije članak",
        "notvisiblerev": "Posljednja izmjena drugog korisnika je bila izbrisana",
-       "watchlist-details": "{{PLURAL:$1|$1 stranica praćena|$1 stranice praćene|$1 stranica praćeno}} ne računajući stranice za razgovor.",
+       "watchlist-details": "{{PLURAL:$1|$1 stranica|$1 stranice|$1 stranica }} na vašem spisku praćenja, ne računajući posebno stranice za razgovor.",
        "wlheader-enotif": "* Obavještavanje e-poštom je omogućeno.",
        "wlheader-showupdated": "* Stranice koje su izmijenjene od kad ste ih posljednji put posjetili su prikazane '''podebljanim slovima'''",
-       "wlnote": "Ispod {{PLURAL:$1|je posljednja izmjena|su posljednje '''$1''' izmjene|je posljednjih '''$1''' izmjena}} u {{PLURAL:$2|prethodnom satu|prethodna '''$2''' sata|prethodnih '''$2''' sati}}, zaključno sa $3, $4.",
+       "wlnote": "Ispod {{PLURAL:$1|je najskorija izmjena|su <strong>$1</strong> najskorije izmjene|<strong>$1</strong> najskorijih izmjena}} načinjenih {{PLURAL:$2|posljednjeg sata|u posljednjih <strong>$2</strong> sata|u posljednjih <strong>$2</strong> sati}}, od $3, $4.",
        "wlshowlast": "Prikaži posljednjih $1 sati $2 dana",
+       "watchlistall2": "sve",
        "watchlist-options": "Opcije liste praćenja",
        "watching": "Pratim... / Додавање на списак надгледања...",
        "unwatching": "Ne pratim…",
        "enotif_lastvisited": "Pogledajte $1 za sve izmjene od vaše posljednje posjete.",
        "enotif_lastdiff": "Vidi $1 da pregledate ovu promjenu.",
        "enotif_anon_editor": "anonimni korisnik $1",
-       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osima ako posjetite stranicu.\nTakođer možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\n             Vaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki e-mail obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
+       "enotif_body": "Poštovani $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nSažetak urednika: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktirajte urednika:\ne-pošta: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNeće biti drugih obavještenja u slučaju daljnjih izmjena osim ako prijavljeni ponovno posjetite stranicu. Također možete poništiti oznake obavijesti za sve praćene stranice koje imate na vašem spisku praćenja.\n\nVaš prijateljski {{SITENAME}} sistem obavještavanja\n\n--\nZa promjenu vaših postavki email obavijesti, posjetite\n{{canonicalurl:{{#special:Preferences}}}}\n\nZa promjenu postavki vašeg praćenja, posjetite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nDa obrišete stranicu sa vašeg spiska praćenja, posjetite\n$UNWATCHURL\n\nPovratne informacije i daljnja pomoć:\n$HELPPAGE",
        "created": "Napravljen - Направљен",
        "changed": "promijenjena",
        "deletepage": "Izbrišite stranicu",
        "confirm": "Potvrdi / Потврди",
        "excontent": "sadržaj je bio: '$1'",
-       "excontentauthor": "sadržaj je bio: '$1', a jedini urednik '[[Special:Contributions/$2|$2]]'",
+       "excontentauthor": "sadržaj je bio: \"$1\", a jedini urednik \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|razgovor]])",
        "exbeforeblank": "sadržaj prije brisanja je bio: '$1'",
        "delete-confirm": "Brisanje \"$1\"",
        "delete-legend": "Obriši",
-       "historywarning": "'''Upozorenje''':  Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
+       "historywarning": "<strong>Upozorenje</strong>: Stranica koju želite da obrišete ima historiju sa otprilike $1 {{PLURAL:$1|revizijom|revizije|revizija}}:",
        "confirmdeletetext": "Upravo ćete obrisati stranicu sa svom njenom historijom.\nMolimo da potvrdite da ćete to učiniti, da razumijete posljedice te da to činite u skladu sa [[{{MediaWiki:Policy-url}}|pravilima]].",
        "actioncomplete": "Akcija završena\n\nАкција завршена",
        "actionfailed": "Akcija nije uspjela",
        "deletecomment": "Razlog:",
        "deleteotherreason": "Ostali/dodatni razlog/zi:",
        "deletereasonotherlist": "Ostali razlog/zi",
-       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Zahtjev autora\n** Kršenje autorskih prava\n** Vandalizam",
+       "deletereason-dropdown": "*Uobičajeni razlozi brisanja\n** Spam\n** Vandalizam\n** Kršenje autorskih prava\n** Zahtjev autora\n** Pokvareno preusmjerenje",
        "delete-edit-reasonlist": "Uredi razloge brisanja",
        "delete-toobig": "Ova stranica ima veliku historiju promjena, preko $1 {{PLURAL:$1|revizije|revizija}}.\nBrisanje takvih stranica nije dopušteno da bi se spriječilo slučajno preopterećenje servera na kojem je {{SITENAME}}.",
        "delete-warning-toobig": "Ova stranica ima veliku historiju izmjena, preko $1 {{PLURAL:$1|izmjene|izmjena}}.\nNjeno brisanje može dovesti do opterećenja operacione baze na {{SITENAME}};\nnastavite s oprezom.",
+       "deleteprotected": "Ne možete obrisati ovu stranicu jer je zaštićena.",
+       "deleting-backlinks-warning": "'''Upozorenje:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Druge stranice]] sadrže link ili vode na stranicu koju brišete.",
        "rollback": "Vrati izmjene",
        "rollbacklink": "vrati",
        "rollbacklinkcount": "vrati $1 {{PLURAL:$1|izmjenu|izmjene|izmjena}}",
        "alreadyrolled": "Ne može se vratiti posljednja izmjena [[:$1]] od korisnika [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko drugi je već izmjenio ili vratio članak.\n\nPosljednja izmjena je bila od korisnika [[User:$3|$3]] ([[User talk:$3|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Sažetak izmjene je bio: \"''$1''\".",
        "revertpage": "Vraćene izmjene [[Special:Contributions/$2|$2]] ([[User talk:$2|razgovor]]) na posljednju izmjenu korisnika [[User:$1|$1]]",
-       "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju koju je načinio [[User:$1|$1]]",
+       "revertpage-nouser": "Vraćene izmjene skrivenog korisnika na posljednju reviziju, koju je {{GENDER:$1|napravio|napravila}} [[User:$1|$1]]",
        "rollback-success": "Vraćene su izmjene korisnika $1;\nvraćeno na posljednju verziju koju je snimio $2.",
        "sessionfailure-title": "Greška u sesiji",
        "sessionfailure": "Izgleda da postoji problem sa vašom sesijom; ova akcija je otkazana kao prevencija protiv napadanja sesija. Kliknite \"back\" (''nazad'') i osvježite stranicu sa koje ste došli, i opet pokušajte.",
+       "changecontentmodel": "Promijeni model sadržaja stranice",
+       "changecontentmodel-legend": "Promijeni model sadržaja",
+       "changecontentmodel-title-label": "Naslov stranice",
+       "changecontentmodel-model-label": "Novi model sadržaja",
+       "changecontentmodel-reason-label": "Razlog:",
+       "changecontentmodel-success-title": "Model sadržaja je promijenjen",
+       "changecontentmodel-success-text": "Model sadržaja stranice [[:$1]] je promijenjen.",
+       "changecontentmodel-cannot-convert": "Model sadržaja stranice [[:$1]] se ne može pretvoriti u vrstu $2.",
+       "changecontentmodel-nodirectediting": "Model sadržaja $1 ne podržava izravno uređivanje",
+       "log-name-contentmodel": "Zapisnik promjene modela sadržaja",
+       "log-description-contentmodel": "Događaji koji su povezani s modelom sadržaja stranice",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|promijenio|promijenila}} je model sadržaja stranice $3 iz \"$4\" u \"$5\"",
+       "logentry-contentmodel-change-revertlink": "vrati",
+       "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Evidencija zaštite",
        "protectlogtext": "Ispod je spisak promjena zaštićenja stranice.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za pregled trenutno operativnih zaštita stranica.",
        "protectedarticle": "\"[[$1]]\" zaštićeno",
        "protect-locked-blocked": "Ne možete promijeniti nivo zaštite dok ste blokirani.\nOvo su trenutne postavke za stranicu '''$1''':",
        "protect-locked-dblock": "Nivoi zaštite se ne mogu mijenjati jer je aktivna baza podataka zaključana.\nTrenutna postavka za stranicu '''$1''' je:",
        "protect-locked-access": "Nemate ovlasti za mijenjanje stepena zaštite.\nSlijede trenutne postavke stranice '''$1''':",
-       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosnu (kaskadnu) zaštitu.\nMožete promijeniti stepen zaštite ove stranice, ali to neće uticati na prenosnu zaštitu.",
+       "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju}} uključenu prenosivu zaštitu.\nPromjene stepena zaštite ove stranice neće utjecati na prenosnu zaštitu.",
        "protect-default": "Dozvoli svim korisnicima",
        "protect-fallback": "Dopušteno samo korisnicima s dozvolom \"$1\"",
        "protect-level-autoconfirmed": "Dopušteno samo automatski potvrđenim korisnicima",
        "protect-othertime": "Ostali period:",
        "protect-othertime-op": "ostali period",
        "protect-existing-expiry": "Postojeće vrijeme isticanja: $3, $2",
+       "protect-existing-expiry-infinity": "Postojeće vrijeme isteka: trajno",
        "protect-otherreason": "Ostali/dodatni razlog/zi:",
        "protect-otherreason-op": "Ostali razlozi",
        "protect-dropdown": "*Uobičajeni razlozi zaštite\n** Prekomjerni vandalizam\n** Prekomjerno spamovanje\n** Kontraproduktivni uređivački rat\n** Stranica velikog prometa",
        "undeletepagetext": "{{PLURAL:$1|Slijedeća $1 stranica je obrisana|Slijedeće $1 stranice su obrisane|Slijedećih $1 je obrisano}} ali su još uvijek u arhivi i mogu biti vraćene.\nArhiva moše biti periodično čišćena.",
        "undelete-fieldset-title": "Vraćanje revizija",
        "undeleteextrahelp": "Da vratite cijelu historiju članka, ostavite sve kutijice neoznačene i kliknite '''''{{int:undeletebtn}}'''''.\nDa bi izvršili selektivno vraćanje, odaberite kutijice koje odgovaraju revizijama koje želite vratiti, i kliknite '''''{{int:undeletebtn}}'''''.",
-       "undeleterevisions": "{{PLURAL:$1|$1 revizija arhivirana|$1 revizije arhivirane|$1 revizija arhivirano}}",
+       "undeleterevisions": "{{PLURAL:$2|izmjena|$2 izmjena}} {{PLURAL|izbrisana|izbrisane|izbrisano}}",
        "undeletehistory": "Ako vratite stranicu, sve revizije će biti vraćene njenoj historiji.\nAko je nova stranica istog imena napravljena od brisanja, vraćene revizije će se pojaviti u njenoj ranijoj historiji.",
        "undeleterevdel": "Vraćanje obrisanog se neće izvršiti ako bi rezultiralo da zaglavlje stranice ili revizija datoteke bude djelimično obrisano.\nU takvim slučajevima, morate ukloniti označene ili otkriti sakrivene najskorije obrisane revizije.",
        "undeletehistorynoadmin": "Ova stranica je izbrisana.  \nRazlog za brisanje se nalazi ispod u sažetku, zajedno sa detaljima korisnika koji su uređivali ovu stranicu prije brisanja.  \nTekst izbrisane stranice je vidljiv samo administratorima.",
        "undeletedrevisions": "{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}",
        "undeletedrevisions-files": "{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno",
        "undeletedfiles": "{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}",
-       "cannotundelete": "Vraćanje nije uspelo; moguće je da je neko drugi vratio stranu pre vas.",
+       "cannotundelete": "Vraćanje nije uspjelo:\n$1",
        "undeletedpage": "'''$1 je vraćena'''\n\nProvjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih brisanja i vraćanja.",
        "undelete-header": "Pogledajte [[Special:Log/delete|evidenciju brisanja]] za nedavno obrisane stranice.",
        "undelete-search-title": "Pretraga obrisanih stranica",
        "namespace": "Imenski prostor - Именски простор:",
        "invert": "Sve osim odabranog",
        "tooltip-invert": "Označite ovu kutiju za sakrivanje promjena na stranicama u odabranom imenskom prostoru (i povezanim imenskim prostorima ako je označeno)",
+       "tooltip-whatlinkshere-invert": "Označite ovu kutiju za sakrivanje linkova sa stranica u izabranom imenskom prostoru.",
        "namespace_association": "Povezan imenski prostor",
        "tooltip-namespace_association": "Označite ovu kutiju da također uključite razgovor ili imenski prostor teme koja je povezana sa odabranim imenskim prostorom",
        "blanknamespace": "(Glavno)",
        "contributions": "Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}",
        "contributions-title": "Korisnički doprinosi od $1",
        "mycontris": "Doprinosi / Доприноси",
-       "contribsub2": "Za $1 ($2)",
+       "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
+       "contributions-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "nocontribs": "Nisu nađene promjene koje zadovoljavaju ove uslove.",
        "uctop": "(trenutno)",
        "month": "Od mjeseca (i ranije):",
        "sp-contributions-newbies-sub": "Prikaži samo doprinose novih korisnika",
        "sp-contributions-newbies-title": "Doprinosi novih korisnika",
        "sp-contributions-blocklog": "registar blokiranja",
+       "sp-contributions-suppresslog": "obrisani doprinosi korisnika",
        "sp-contributions-deleted": "obrisani doprinosi korisnika",
        "sp-contributions-uploads": "postavljanja",
        "sp-contributions-logs": "registri",
        "sp-contributions-search": "Pretraga doprinosa",
        "sp-contributions-username": "IP adresa ili korisničko ime:",
        "sp-contributions-toponly": "Prikaži samo izmjene koje su posljednje revizije",
+       "sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
        "sp-contributions-submit": "Traži",
        "whatlinkshere": "Što vodi ovdje / Шта води овде",
        "whatlinkshere-title": "Stranice koje vode / Странице које воде до $1",
        "autoblockid": "Automatska blokada #$1",
        "block": "Blokiraj korisnika",
        "unblock": "Odblokiraj korisnika",
-       "blockip": "Blokiraj korisnika",
+       "blockip": "Blokiraj {{GENDER:$1|korisnika|korisnicu}}",
        "blockip-legend": "Blokiranje korisnika",
        "blockiptext": "Upotrebite donji upitnik da biste uklonili prava pisanja sa određene IP adrese ili korisničkog imena.  \nOvo bi trebalo da bude urađeno samo da bi se spriječio vandalizam, i u skladu sa [[{{MediaWiki:Policy-url}}|smjernicama]]. \nUnesite konkretan razlog ispod (na primjer, navodeći koje konkretne stranice su vandalizovane).",
        "ipaddressorusername": "IP adresa ili korisničko ime:",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] je {{GENDER:$1|blokiran|blokirana|blokiran}}.<br />\nBlokiranja možete da pogledate [[Special:BlockList|ovde]].",
        "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-confirmaction": "Ako ste sigurni da želite nastaviti, kliknite na \"{{int:ipb-confirm}}\" polje na dnu stranice.",
        "ipb-edit-dropdown": "Uredi razloge blokiranja",
        "ipb-unblock-addr": "Deblokiraj $1",
        "ipb-unblock": "Deblokiraj korisničko ime ili IP adresu",
        "ipb-blocklist": "Vidi postojeće blokade",
-       "ipb-blocklist-contribs": "Doprinosi za $1",
+       "ipb-blocklist-contribs": "Doprinosi za {{GENDER:$1|$1}}",
        "unblockip": "Odblokiraj korisnika / Одблокирај корисника",
        "unblockiptext": "Upotrebite donji upitnik da bi ste vratili pravo pisanja ranije blokiranoj IP adresi ili korisničkom imenu.",
        "ipusubmit": "Ukloni ovu blokadu",
        "unblocked": "[[User:$1|$1]] je deblokiran",
        "unblocked-range": "$1 je deblokiran",
        "unblocked-id": "Blokada ID oznake $1 je uklonjena",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] je deblokiran.",
        "blocklist": "Blokirani korisnici",
        "ipblocklist": "Blokirani korisnici",
        "ipblocklist-legend": "Traži blokiranog korisnika",
        "range_block_disabled": "Administratorska mogućnost da blokira grupe je isključena.",
        "ipb_expiry_invalid": "Nevaljano vrijeme trajanja.",
        "ipb_expiry_temp": "Sakrivene blokade korisničkih imena moraju biti stalne.",
-       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; možda ima isuviše izmjena.",
+       "ipb_hide_invalid": "Ne može se onemogućiti ovaj račun; on ima više od {{PLURAL:$1|jedne izmjene|$1 izmjena}}.",
        "ipb_already_blocked": "\"$1\" je već blokiran",
        "ipb-needreblock": "$1 je već blokiran. \nDa li želite promijeniti postavke?",
        "ipb-otherblocks-header": "Ostale {{PLURAL:$1|blokada|blokade}}",
        "move-page-legend": "Premjestite stranicu",
        "movepagetext": "Korištenjem ovog formulara možete preimenovati stranicu, premještajući cijelu historiju na novo ime.\nČlanak pod starim imenom će postati stranica koja preusmjerava na članak pod novim imenom. \nMožete automatski izmjeniti preusmjerenje do izvornog naslova.\nAko se ne odlučite na to, provjerite [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|neispravna preusmjeravanja]].\nDužni ste provjeriti da svi linkovi i dalje nastave voditi na prave stranice.\n\nImajte na umu da članak '''neće''' biti preusmjeren ukoliko već postoji članak pod imenom na koje namjeravate da preusmjerite osim u slučaju stranice za preusmjeravanje koja nema nikakvih starih izmjena.\nTo znači da možete vratiti stranicu na prethodno mjesto ako pogriješite, ali ne možete zamijeniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može biti drastična i neočekivana promjena kad su u pitanju popularne stranice;\nMolimo dobro razmislite prije nego što preimenujete stranicu.",
        "movepagetext-noredirectfixer": "Koristeći obrazac ispod ćete preimenovati stranicu i premjestiti cijelu njenu historiju na novi naziv.\nStari naziv će postati preusmjerenje na novi naziv.\nMolimo provjerite da li postoje [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|nedovršena preusmjerenja]].\nVi ste za to odgovorni te morate provjeriti da li su linkovi ispravni i da li vode tamo gdje bi trebali.\n\nImajte na umu da stranica '''neće''' biti premještena ako već postoji stranica s tim imenom, osim ako je prazna ili je preusmjerenje ili nema ranije historije.\nOvo znali da možete preimenovati stranicu nazad gdje je ranije bila preimenovana ako ste pogriješili a ne možete ponovo preimenovati postojeću stranicu.\n\n'''Pažnja!'''\nImajte na umu da preusmjeravanje popularnog članka može biti\ndrastična i neočekivana promjena za korisnike; molimo budite sigurni da ste shvatili posljedice prije nego što nastavite.",
-       "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, će automatski biti premještena istovremeno '''osim:'''\n*Neprazna stranica za razgovor već postoji pod novim imenom, ili\n*Odznačite donju kutiju.\n\nU tim slučajevima, moraćete ručno da premjestite stranicu ukoliko to želite.",
+       "movepagetalktext": "Ako označite ovu kutijucu, pridružena stranica za razgovor će se automatski premjestiti na novi naslov, ukoliko ne-prazna stranica razgovor sa istim imenom već postoji. U tom slučaju ćete morati, ako želite, ručno premjestiti ili spojiti stranicu.",
        "moveuserpage-warning": "'''Upozorenje:''' Premještate korisničku stranicu. Molimo da zapamtite da će se samo stranica premjestiti a korisnik se ''neće'' preimenovati.",
+       "movecategorypage-warning": "<strong>Upozorenje:</strong> Premještate stranicu kategorije. Imajte na umu da će samo stranica biti premještena i da sve stranice u staroj kategoriji <em>neće</em> biti ponovo kategorirane u novu kategoriju.",
        "movenologintext": "Morate se registrovati ili [[Special:Userlogin|prijaviti]] kako biste premjestili članak.<br>\nМорате се регистровати или [[Special:Userlogin|пријавити]] како бисте преместили чланак.",
        "movenotallowed": "Nemate dopuštenje za premještanje stranica.",
        "movenotallowedfile": "Nemate dopuštenja da premještate datoteke.",
        "cant-move-user-page": "Nemate dopuštenje da premještate korisničke stranice (osim podstranica).",
        "cant-move-to-user-page": "Nemate dopuštenje da premjestite stranicu na korisničku stranicu (osim na korisničku podstranicu).",
-       "newtitle": "Novi naziv - Нови назив",
+       "cant-move-category-page": "Nemate dopuštene da premještate stranice kategorija.",
+       "cant-move-to-category-page": "Nemate dopuštenje da premjestite stranicu na stranicu kategorije.",
+       "newtitle": "Novi naslov:",
        "move-watch": "Prati ovu stranicu - Прати ову страницу",
        "movepagebtn": "Premjesti stranicu – Премјести страницу",
        "pagemovedsub": "Premještanje uspjelo",
        "movenosubpage": "Ova stranica nema podstranica.",
        "movereason": "Razlog:",
        "revertmove": "vrati - врати",
-       "delete_and_move": "Brisanje i premještanje",
        "delete_and_move_text": "==Brisanje neophodno==\nOdredišna stranica \"[[:$1]]\" već postoji.\nDa li je želite obrisati kako bi ste mogli izvršiti premještanje?",
        "delete_and_move_confirm": "Da, izbriši stranicu - Да, избриши страницу",
        "delete_and_move_reason": "Obrisano da se oslobodi mjesto za premještanje iz „[[$1]]“",
        "thumbnail-temp-create": "Ne mogu da napravim privremenu smanjenu sliku",
        "thumbnail-dest-create": "Spremanje smanjene slike (\"thumbnail\") na ponuđeno odredište nije moguće.",
        "thumbnail_invalid_params": "Pogrešne postavke smanjenog prikaza",
+       "thumbnail_toobigimagearea": "Datoteka sa dimenzijama većim od $1",
        "thumbnail_dest_directory": "Ne može se napraviti odredišni folder",
        "thumbnail_image-type": "Tip slike nije podržan",
        "thumbnail_gd-library": "Nekompletna konfiguracija GD biblioteke: nedostaje funkcija $1",
        "thumbnail_image-missing": "Čini se da datoteka nedostaje: $1",
+       "thumbnail_image-failure-limit": "Bilo je previše nedavnih greška ($1 ili više) pri pravljenju umanjene slike. Ponovo pokušajte kasnije.",
        "import": "Uvoz stranica",
-       "importinterwiki": "Transwiki uvoz",
-       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi revizije i imena urednika će biti sačuvana.\nSve akcije vezane uz transwiki uvoz su zabilježene u [[Special:Log/import|registru uvoza]].",
+       "importinterwiki": "Uvezeno sa druge wiki",
+       "import-interwiki-text": "Izaberi wiki i naslov stranice za uvoz.\nDatumi i imena autora verzija će biti sačuvani.\nSve akcije pri međuwiki uvozu će biti zapisane u [[Special:Log/import|zapisniku uvoza]].",
+       "import-interwiki-sourcewiki": "Izvorna wiki:",
+       "import-interwiki-sourcepage": "Izvorna stranica:",
        "import-interwiki-history": "Kopiraj sve verzije historije za ovu stranicu",
        "import-interwiki-templates": "Uključi sve šablone",
        "import-interwiki-submit": "Uvezi - Увези",
index 3dcd90b..825774a 100644 (file)
        "nstab-template": "සැකිල්ල",
        "nstab-help": "උදවු පිටුව",
        "nstab-category": "ප්‍රවර්ගය",
+       "mainpage-nstab": "මුල් පිටුව",
        "nosuchaction": "මෙනමින් කාර්යයක් නොමැත",
        "nosuchactiontext": "URL (කලාප ලිපිනය) විසින් හුවා දක්වා ඇත්තේ වලංගු නොවූ කාර්යයකි.\nඔබ සමහරවිට URL (කලාප ලිපිනය) අකුරු වරදවා සටහන් කර ඇත, නැතහොත් වැරදි සබැඳුමක් ඔස්සේ පැමිණ ඇත.\nමෙය සමහරවිට {{SITENAME}} විසින් භාවිතා කරන මෘදුකාංගයන්හි bugදෝෂයක් පිළිඹිබු කරන්නක්ද විය හැක.",
        "nosuchspecialpage": "මෙම නමැති විශේෂ පිටුවක් නොමැත",
        "createaccountreason": "හේතුව:",
        "createacct-reason": "හේතුව",
        "createacct-reason-ph": "ඔබ තවත් ගිණුමක් තනන්නේ කුමක් නිසාද",
-       "createacct-captcha": "ආරක්‍ෂක පරික්‍ෂාව",
-       "createacct-imgcaptcha-ph": "ඉහතින් පෙනෙන වචනය ඇතුළත් කරන්න",
        "createacct-submit": "ඔබේ ගිණුම තනන්න",
        "createacct-another-submit": "තවත් ගිණුමක් ආරම්භ කරන්න",
        "createacct-benefit-heading": "{{SITENAME}} ඔබ වැනි අයෙක් විසින් නිමවා ඇත",
        "wlheader-showupdated": "ඔබ විසින් ඒවාට අවසන් වරට පිවිසුනු පසුව වෙනස්ව තිබෙන පිටු <strong>තදකුරු</strong> වලින් පෙන්වා ඇත.",
        "wlnote": "පහත දැක්වෙන්නේ $3, $4 මෙන්, අවසන් {{PLURAL:$2|පැය|පැය '''$2''' }} තුලදී සිදු කෙරී ඇති {{PLURAL:$1|අවසන් වෙනස්වීම්යි |අවසන් වෙනස්වීම්  '''$1''' යි}}.",
        "wlshowlast": "පසුගිය පැය $1 දින $2 පෙන්වන්න",
+       "watchlistall2": "සියල්ල",
        "watchlist-options": "තෝරාගතහැකි මුර ලැයිස්තු සැකසුම්",
        "watching": "මුර කරමින්...",
        "unwatching": "මුර නොකරමින්...",
        "tooltip-ca-nstab-main": "අන්තර්ගත පිටුව නරඹන්න",
        "tooltip-ca-nstab-user": "පරිශීලක පිටුව නරඹන්න",
        "tooltip-ca-nstab-media": "මාධ්‍ය පිටුව නරඹන්න",
-       "tooltip-ca-nstab-special": "මෙය විශේෂ පිටුවකි, එයම සංස්කරණය කිරීමට ඔබට නොහැක",
+       "tooltip-ca-nstab-special": "මෙය විශේෂ පිටුවකි, එය සංස්කරණය කිරීමට නොහැකි ය",
        "tooltip-ca-nstab-project": "ව්‍යාපෘති පිටුව නරඹන්න",
        "tooltip-ca-nstab-image": "ගොනු පිටුව නරඹන්න",
        "tooltip-ca-nstab-mediawiki": "පද්ධති පණිවුඩය නරඹන්න",
        "feedback-subject": "විෂයය:",
        "feedback-submit": "යොමන්න",
        "feedback-thanks": "ස්තුතියි! ඔබේ ප්‍රතිචාරය \"[$2 $1]\" පිටුවට එක් කරන ලදී.",
+       "feedback-useragent": "පරිශීලක නියෝජිත:",
        "searchsuggest-search": "ගවේශණය කරන්න",
        "searchsuggest-containing": "ඇතුළත් වෙමින් පවතී...",
        "api-error-badaccess-groups": "මෙම විකියට ගොනු උඩුගතකිරීම සඳහා ඔබට අවසර නැත.",
index 10e65c0..93d77c7 100644 (file)
@@ -40,6 +40,7 @@
        "tog-hideminor": "V posledných úpravách nezobrazovať drobné úpravy",
        "tog-hidepatrolled": "Skryť strážené úpravy v Posledných úpravách",
        "tog-newpageshidepatrolled": "Skryť strážené stránky zo zoznamu nových stránok",
+       "tog-hidecategorization": "Skryť kategorizáciu stránok",
        "tog-extendwatchlist": "Rozšíriť zoznam sledovaných stránok, aby zobrazoval všetky úpravy, nie len posledné",
        "tog-usenewrc": "Zoskupiť zmeny v posledných úpravách a na zozname sledovaných stránok podľa stránky",
        "tog-numberheadings": "Automaticky číslovať nadpisy",
@@ -57,7 +58,7 @@
        "tog-enotifwatchlistpages": "Upozorniť ma e-mailom, keď sa zmení stránka alebo súbor z môjho zoznamu sledovaných",
        "tog-enotifusertalkpages": "Upozorniť ma e-mailom po zmene mojej používateľskej diskusnej stránky",
        "tog-enotifminoredits": "Upozorniť ma e-mailom aj na drobné úpravy stránok a súborov",
-       "tog-enotifrevealaddr": "Zobraziť moju emailovú adresu v emailoch s upozorneniami",
+       "tog-enotifrevealaddr": "Zobraziť moju mailovú adresu v notifikačných e-mailoch",
        "tog-shownumberswatching": "Zobraziť počet používateľov sledujúcich stránku",
        "tog-oldsig": "Súčasný podpis:",
        "tog-fancysig": "Považovať podpisy za wikitext (bez automatických odkazov)",
        "tog-watchlisthidebots": "Skryť úpravy botov zo zoznamu sledovaných",
        "tog-watchlisthideminor": "Skryť drobné úpravy zo zoznamu sledovaných",
        "tog-watchlisthideliu": "Skryť úpravy prihlásených používateľov zo zoznamu sledovaných stránok",
+       "tog-watchlistreloadautomatically": "Po zmene nastavení automaticky aktualizovať zoznam sledovaných (vyžaduje JavaScript)",
        "tog-watchlisthideanons": "Skryť úpravy anonymných používateľov zo zoznamu sledovaných stránok",
        "tog-watchlisthidepatrolled": "Skryť strážené úpravy Zozname sledovaných stránok",
+       "tog-watchlisthidecategorization": "Skryť kategorizáciu stránok",
        "tog-ccmeonemails": "Posielať mi kópie e-mailov, ktoré pošlem ostatným používateľom",
        "tog-diffonly": "Nezobrazovať obsah stránky pod rozdielmi",
        "tog-showhiddencats": "Zobraziť skryté kategórie",
        "morenotlisted": "Tento zoznam nie je úplný.",
        "mypage": "Stránka",
        "mytalk": "Diskusia",
-       "anontalk": "Diskusia k tejto IP adrese",
+       "anontalk": "Diskusia",
        "navigation": "Navigácia",
        "and": "&#32;a",
        "qbfind": "Hľadať",
        "nstab-template": "Šablóna",
        "nstab-help": "Pomoc",
        "nstab-category": "Kategória",
+       "mainpage-nstab": "Hlavná stránka",
        "nosuchaction": "Takáto činnosť neexistuje",
        "nosuchactiontext": "Operácia, ktorú vyžadujete pomocou URL nie je platná.\nJe možné, že ste napísali URL chybne alebo ste klikli na chybný odkaz.\nPríčinou tiež môže byť chyba v softvéri, ktorý používa {{SITENAME}}.",
        "nosuchspecialpage": "Takáto špeciálna stránka neexistuje",
        "createacct-emailoptional": "E-mailová adresa (nepovinné)",
        "createacct-email-ph": "Zadajte vašu e-mailovú adresu",
        "createacct-another-email-ph": "Zadajte vašu e-mailovú adresu",
-       "createaccountmail": "Použiť dočasné náhodné heslo a poslať ho na uvedenú emailovú adresu",
+       "createaccountmail": "Použiť dočasné náhodné heslo a poslať ho na uvedenú e-mailovú adresu",
        "createacct-realname": "Skutočné meno (nepovinné)",
        "createaccountreason": "Dôvod:",
        "createacct-reason": "Dôvod",
        "createacct-reason-ph": "Prečo si vytvárate ďalší účet",
-       "createacct-captcha": "Bezpečnostná kontrola",
-       "createacct-imgcaptcha-ph": "Zadajte text, ktorý vidíte vyššie",
        "createacct-submit": "Vytvoriť účet",
-       "createacct-another-submit": "Vytvoriť ďalší účet",
+       "createacct-another-submit": "Vytvoriť účet",
        "createacct-benefit-heading": "{{GRAMMAR:akuzatív|{{SITENAME}}}} tvoria ľudia ako vy.",
        "createacct-benefit-body1": "{{PLURAL:$1|úprava|úpravy|úprav}}",
        "createacct-benefit-body2": "{{PLURAL:$1|stránka|stránky|stránok}}",
        "createacct-benefit-body3": "{{PLURAL:$1|nedávny prispievateľ|nedávni prispievatelia|nedávnych prispievateľov}}",
        "badretype": "Zadané heslá nie sú rovnaké.",
+       "usernameinprogress": "Vytváranie účtu s týmto menom už prebieha. Počkajte prosím.",
        "userexists": "Zadané používateľské meno sa už používa.\nProsím, zvoľte si iné meno.",
        "loginerror": "Chyba pri prihlasovaní",
        "createacct-error": "Chyba pri vytváraní účtu",
        "wrongpasswordempty": "Zadané heslo bolo prázdne. Prosím, skúste to znova.",
        "passwordtooshort": "Heslo musí mať dĺžku aspoň $1 {{PLURAL:$1|znak|znaky|znakov}}.",
        "passwordtoolong": "Heslá nemôžu byť dlhšie než {{PLURAL:$1|1 znak|$1 znaky|$1 znakov}}.",
+       "passwordtoopopular": "Nie je možné použiť priveľmi frekventované heslá. Zvoľte si prosím iné, menej frekventované heslo.",
        "password-name-match": "Vaše heslo musí byť iné ako vaše používateľské meno.",
        "password-login-forbidden": "Použitie tohto používateľského mena a hesla bolo zakázané.",
        "mailmypassword": "Obnoviť heslo",
        "passwordreset-emailtext-ip": "Niekto (pravdepodobne vy z IP adresy $1) požiadal o obnovenie vášho hesla na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto emailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
        "passwordreset-emailtext-user": "Používateľ $1 na {{GRAMMAR:genitív|{{SITENAME}}}} požiadal o obnovenie vášho hesla na na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto emailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
        "passwordreset-emailelement": "Používateľské meno: \n$1\n\nDočasné heslo:\n$2",
-       "passwordreset-emailsent": "Email s novým heslom bol odoslaný.",
+       "passwordreset-emailsentemail": "Pokiaľ je toto e-mailová adresa, zaregistrovaná k vášmu účtu, bude na ňu zaslaný e-mail pre získanie nového hesla.",
+       "passwordreset-emailsentusername": "Pokiaľ je príslušná mailová adresa zaregistrovaná, bude na ňu zaslaný e-mail s novým heslom.",
        "passwordreset-emailsent-capture": "Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie.",
        "passwordreset-emailerror-capture": "Bol odoslaný email s novým heslom, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať {{GENDER:$2|používateľovi}}: $1",
-       "changeemail": "Zmeniť emailovú adresu",
+       "changeemail": "Zmeniť alebo odstrániť e-mailovú adresu",
        "changeemail-header": "Zmena e-mailovej adresy pre účet",
+       "changeemail-passwordrequired": "Pre potvrdenie tejto zmeny budete musieť zadať svoje heslo.",
        "changeemail-no-info": "Na prístup k tejto stránke musíte byť prihlásený.",
        "changeemail-oldemail": "Súčasná e-mailová adresa:",
        "changeemail-newemail": "Nová e-mailová adresa:",
+       "changeemail-newemail-help": "Ak chcete svoju e-mailovú adresu odstrániť, táto položka by mala zostať prázdna. Ak bude e-mailová adresa odstránená, nebudete si môcť obnoviť zbudnuté heslo, ani prijímať e-maily z tejto wiki.",
        "changeemail-none": "(žiadna)",
        "changeemail-password": "Vaše heslo k {{GRAMMAR:lokál|{{SITENAME}}}}:",
        "changeemail-submit": "Zmeniť e-mail",
        "changeemail-throttled": "Uskutočnili ste príliš mnoho neúspešných pokusov o prihlásenie. Prosím, počkajte $1 predtým, než to skúsite znova.",
+       "changeemail-nochange": "Zadajte prosím odlišnú e-mailovú adresu.",
        "resettokens": "Obnoviť tokeny",
        "resettokens-text": "Tu môžete obnoviť tokeny, ktoré umožňujú prístup k určitým súkromným údajom spojeným s vaším účtom.\n\nMali by ste to urobiť, ak ste ich omylom niekomu poskytli alebo ak bolo vaše konto zneužité.",
        "resettokens-no-tokens": "Neexistujú žiadne tokeny, ktoré by bolo možné obnoviť.",
        "search-section": "(sekcia $1)",
        "search-category": "($1 kategória)",
        "search-suggest": "Mali ste na mysli „$1“?",
+       "search-rewritten": "Zobrazujú sa výsledky pre $1. Vyhľadať namiesto toho $2.",
        "search-interwiki-caption": "Sesterské projekty",
        "search-interwiki-default": "$1 výsledkov:",
        "search-interwiki-more": "(viac)",
        "showingresultsinrange": "Nižšie {{PLURAL:$1|je zobrazený|sú zobrazené|je zobrazených}} max <strong>$1</strong> {{PLURAL:$1|výsledok|výsledky|výsledkov}} v rozsahu #<strong>$2</strong> – #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Výsledok <strong>$1</strong> z <strong>$3</strong>|Výsledky <strong>$1 – $2</strong> z <strong>$3</strong>}}",
        "search-nonefound": "Vyhľadávanie nenašlo žiadne výsledky.",
+       "search-nonefound-thiswiki": "Hľadanému výrazu nezodpovedajú na tejto wiki žiadne výskyty.",
        "powersearch-legend": "Pokročilé hľadanie",
        "powersearch-ns": "Hľadať v menných priestoroch:",
        "powersearch-togglelabel": "Skontrolovať:",
        "columns": "Stĺpce:",
        "searchresultshead": "Vyhľadávanie",
        "stub-threshold": "Prah formátovania <a href=\"#\" class=\"stub\">výhonkov</a> (v bajtoch):",
+       "stub-threshold-sample-link": "príklad",
        "stub-threshold-disabled": "Vypnuté",
        "recentchangesdays": "Koľko dní zobrazovať v posledných úpravách:",
        "recentchangesdays-max": "(maximálne $1 {{PLURAL:$1|deň|dni|dní}})",
        "prefs-help-recentchangescount": "Toto sa týka posledných úprav, histórií stránok a záznamov.",
        "prefs-help-watchlist-token2": "Toto je tajný kľúč k webovému kanálu vášho zoznamu sledovaných stránok.\nkaždý, kto ho pozná si bude môcť prečítať váš zoznam sledovaných stránok, preto ho nezverejňujte.\n[[Special:ResetTokens|Kliknite sem, ak potrebujete vytvoriť nový]].",
        "savedprefs": "Vaše nastavenia boli uložené.",
+       "savedrights": "Práva {{GENDER:$1|používateľa|používateľky}} $1 boli uložené.",
        "timezonelegend": "Časové pásmo:",
        "localtime": "Miestny čas:",
        "timezoneuseserverdefault": "Použiť predvoľby wiki ($1)",
        "prefs-diffs": "Rozdiely",
        "prefs-help-prefershttps": "Táto voľba sa prejaví pri vašom ďalšom prihlásení.",
        "prefswarning-warning": "Vykonali ste zmeny v nastaveniach, ktoré zatiaľ nie sú uložené. Ak túto stránku opustíte bez kliknutia na „$1“, vaše nastavenia sa neaktualizujú.",
-       "email-address-validity-valid": "Formát e-mailovej adresy sa zdá byť správny",
-       "email-address-validity-invalid": "Zadajte platnú e-mailovú adresu",
+       "prefs-tabs-navigation-hint": "Tip: prepínať medzi záložkami môžete aj pomocou šípok vľavo a vpravo.",
        "userrights": "Spravovanie používateľských práv",
        "userrights-lookup-user": "Spravovať skupiny používateľov",
        "userrights-user-editname": "Zadajte meno používateľa:",
        "rcshowhidemine": "$1 moje úpravy",
        "rcshowhidemine-show": "Zobraziť",
        "rcshowhidemine-hide": "Skryť",
+       "rcshowhidecategorization": "$1 kategorizáciu stránok",
+       "rcshowhidecategorization-show": "Zobraziť",
+       "rcshowhidecategorization-hide": "Skryť",
        "rclinks": "Zobraziť posledných $1 úprav v posledných $2 dňoch<br />$3",
        "diff": "rozdiel",
        "hist": "história",
        "recentchangeslinked-summary": "Táto špeciálna stránka obsahuje zoznam posledných úprav stránok, ''na ktoré odkazuje'' zadaná stránka (alebo ktoré patria do zadanej kategórie).\nStránky, ktoré sa nachádzajú vo vašom [[Special:Watchlist|zozname sledovaných]] sú vyznačené '''hrubo'''.",
        "recentchangeslinked-page": "Názov stránky:",
        "recentchangeslinked-to": "Zobraziť zmeny na stránkach, ''ktoré odkazujú na'' zadanú stránku",
+       "recentchanges-page-added-to-category": "[[:$1]] zaradená do kategórie",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] a {{PLURAL:$2|jedna ďalšia zaradené|$2 ďalšie zaradené|$2 ďalších zaradených}} do kategórie",
+       "recentchanges-page-removed-from-category": "[[:$1]] vyradená z kategórie",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] a {{PLURAL:$2|jedna ďalšia vyradené|$2 ďalšie vyradené|$2 ďalších vyradených}} z kategórie",
+       "autochange-username": "Automatická úprava MediaWiki",
        "upload": "Nahrať súbor",
        "uploadbtn": "Nahrať súbor",
        "reuploaddesc": "Zrušiť nahrávanie a vrátiť sa späť na nahrávací formulár.",
        "wlheader-showupdated": "Stránky, ktoré boli zmenené od vašej poslednej návštevy sú zobrazené '''tučne'''.",
        "wlnote": "Nižšie {{PLURAL:$1|je posledná úprava|sú posledné <strong>$1</strong> úpravy|je posledných <strong>$1</strong> úprav}} za {{PLURAL:$2|poslednú hodinu|posledné <strong>$2</strong> hodiny|posledných <strong>$2</strong> hodín}} do $4, $3.",
        "wlshowlast": "Zobraziť posledných $1 hodín $2 dní",
+       "watchlistall2": "všetky",
+       "watchlist-hide": "Skryť",
+       "wlshowtime": "Zobraziť posl.:",
+       "wlshowhideminor": "drobné úpravy",
+       "wlshowhidebots": "botov",
+       "wlshowhideliu": "registrovaných",
+       "wlshowhideanons": "anonymov",
+       "wlshowhidepatr": "preverené úpravy",
+       "wlshowhidemine": "moje úpravy",
        "watchlist-options": "Nastavenia zoznamu sledovaných",
        "watching": "Pridávam do zoznamu sledovaných...",
        "unwatching": "Odoberám zo zoznamu sledovaných...",
        "rollback-success": "Úpravy $1 vrátené; obnovená posledná verzia od $2.",
        "sessionfailure-title": "Chyba relácie",
        "sessionfailure": "Zdá sa, že je problém s vašou prihlasovacou reláciou;\ntáto akcia bola zrušená ako prevencia proti zneužitiu relácie (session).\nProsím, stlačte \"naspäť\", obnovte stránku, z ktorej ste sa sem dostali, a skúste to znova.",
+       "log-name-contentmodel": "Záznam zmien modelov obsahu",
+       "log-description-contentmodel": "Udalosti, týkajúce sa modelov obsahu stránok",
        "protectlogpage": "Záznam zamknutí",
        "protectlogtext": "Nižšie je zoznam zmien stavu ochrany stránok.\nMôžete si pozrieť aj [[Special:ProtectedPages|zoznam momentálne platných ochrán stránok]].",
        "protectedarticle": "zamyká „[[$1]]“",
        "contributions": "Príspevky {{GENDER:$1|používateľa|používateľky}}",
        "contributions-title": "Príspevky používateľa pre $1",
        "mycontris": "Príspevky",
+       "anoncontribs": "Príspevky",
        "contribsub2": "Príspevky {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Používateľské konto „$1“ nie je zaregistrované.",
        "nocontribs": "Neboli nájdené úpravy, ktoré by zodpovedali týmto kritériám.",
        "movenosubpage": "Táto stránka nemá podstránky.",
        "movereason": "Dôvod:",
        "revertmove": "obnoviť",
-       "delete_and_move": "Vymazať a presunúť",
        "delete_and_move_text": "==Je potrebné zmazať stránku==\n\nCieľová stránka „[[:$1]]“ už existuje. Chcete ho vymazať a vytvoriť tak priestor pre presun?",
        "delete_and_move_confirm": "Áno, zmaž stránku",
        "delete_and_move_reason": "Vymazané, aby sa umožnil presun z „[[$1]]“",
        "import-error-special": "Stránka „$1“ nie je importovaná, pretože patrí do špeciálneho menného priestoru, ktorý nepovoľuje stránky.",
        "import-error-invalid": "Stránka „$1“ nie je importovaná, pretože jej názov je neplatný.",
        "import-error-unserialize": "Nepodarilo sa deserializovať revíziu $2 stránky „$1“. Revízia mala používať model obsahu $3 serializovaný ako $4.",
+       "import-error-bad-location": "Revíziu $2 s modelom obsahu $3 nie je možné uložiť na \"$1\" na tejto wiki. Takýto model obsahu tu nie je podporovaný.",
        "import-options-wrong": "{{PLURAL:$2|Nesprávna voľba|Nesprávne voľby}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Uvedená koreňová stránka nie je platný názov stránky.",
        "import-rootpage-nosubpage": "Menný priestor „$1“ koreňovej stránky nepodporuje podstránky.",
        "tooltip-pt-preferences": "Vaše nastavenia",
        "tooltip-pt-watchlist": "Zoznam stránok, na ktorých sledujete zmeny.",
        "tooltip-pt-mycontris": "Zoznam vašich príspevkov",
+       "tooltip-pt-anoncontribs": "Zoznam úprav vykonaných z tejto IP adresy",
        "tooltip-pt-login": "Odporúčame vám prihlásiť sa, nie je to však povinné.",
        "tooltip-pt-logout": "Odhlásiť",
        "tooltip-pt-createaccount": "Odporúčame vytvoriť si vlastný účet a prihlásiť sa, nie je to však povinné.",
        "spam_reverting": "Vraciam poslednú verziu, ktorá neobsahuje odkazy na $1",
        "spam_blanking": "Všetky revízie obsahovali odkaz na $1, odstraňujem obsah",
        "spam_deleting": "Všetky revízie obsahovali odkaz na $1, odstraňuje sa",
-       "simpleantispam-label": "Antispamová kontrola.\n'''NEVYPĹŇAJTE''' nasledovné!",
+       "simpleantispam-label": "Antispamová kontrola.\n<strong>Nevypĺňajte</strong> nasledovné!",
        "pageinfo-title": "Informácie o „$1“",
        "pageinfo-not-current": "Ospravedlňujeme sa, túto informáciu nie je možné poskytnúť pre staré revízie.",
        "pageinfo-header-basic": "Základné údaje",
        "pageinfo-robot-index": "Povolené",
        "pageinfo-robot-noindex": "Nepovolené",
        "pageinfo-watchers": "Počet používateľov sledujúcich stránku",
+       "pageinfo-visiting-watchers": "Počet aktívnych sledujúcich používateľov (takí, ktorí videli nedávne úpravy)",
        "pageinfo-few-watchers": "Menej ako $1 {{PLURAL:$1|sledujúci|sledujúci|sledujúcich}}",
+       "pageinfo-few-visiting-watchers": "Nie je isté, či existujú aktívni sledujúci používatelia (takí, ktorí videli nedávne úpravy)",
        "pageinfo-redirects-name": "Počet presmerovaní na túto stránku",
        "pageinfo-subpages-name": "Podstránky tejto stránky",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|presmerovanie|presmerovania|presmerovaní}}; $3 {{PLURAL:$3|nie je presmerovanie|nie sú presmerovania}})",
        "svg-long-error": "Neplatný súbor SVG: $1",
        "show-big-image": "Pôvodný súbor",
        "show-big-image-preview": "Veľkosť tohto náhľadu: $1.",
+       "show-big-image-preview-differ": "Veľkosť tohoto $3 náhľadu tohoto $2 súboru: $1.",
        "show-big-image-other": "Iné {{PLURAL:$2|rozlíšenie|rozlíšenia}}: $1 .",
        "show-big-image-size": "$1 × $2 pixlov",
        "file-info-gif-looped": "v cykle",
        "logentry-newusers-create2": "$1 vytvoril používateľský účet $3",
        "logentry-newusers-byemail": "$1 vytvoril používateľský účet $3 a heslo bolo poslané emailom",
        "logentry-newusers-autocreate": "Používateľský účet $1 bol {{GENDER:$2|vytvorený}} automaticky",
+       "logentry-protect-move_prot": "$1 {{GENDER:$2|presunul|presunula}} nastavenie zámku zo stránky $4 na $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|odomkol|odomkla}} stránku $3",
+       "logentry-protect-protect": "$1 {{GENDER:$2|zamkol|zamkla}} stránku $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zamkol|zamkla}} stránku $3 $4 [kaskádovým zámkom]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|zmenil|zmenila}} úroveň zámku stránky $3 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|zmenil|zmenila}} úroveň zámku stránky $3 $4 [kaskádový zámok]",
        "logentry-rights-rights": "$1 zmenil členstvo $3 v skupinách z $4 na $5",
        "logentry-rights-rights-legacy": "$1 zmenil členstvo $3 v skupinách",
        "logentry-rights-autopromote": "$1 bol automaticky povýšený z $4 na $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|pridal|pridala}} $3",
+       "log-name-managetags": "Záznam správy značiek",
+       "log-description-managetags": "Táto stránka obsahuje zoznam správcovských úkonov týkajúcich sa [[Special:Tags|značiek]]. Záznam obsahuje len akcie, zrealizované manuálne správcom. Značky môže vytvárať a mazať aj priamo softvér wiki, bez zmienky v tomto zázname.",
+       "log-name-tag": "Záznam značiek",
+       "log-description-tag": "Táto stránka zobrazuje doplnenia a odobratia [[Special:Tags|značiek]] stránok a protokolovacích záznamov používateľmi. Zoznam nezahŕňa označenia stránok, ktoré boli súčasťou editačnej úpravy, zmazania alebo obdobnej akcie.",
        "rightsnone": "(žiadne)",
        "revdelete-summary": "zhrnutie úprav",
        "feedback-adding": "Pridáva sa komentár na stránku...",
        "expand_templates_generate_xml": "Zobraziť strom XML",
        "expand_templates_generate_rawhtml": "Zobraziť surové HTML",
        "expand_templates_preview": "Náhľad",
+       "pagelanguage": "Voľba jazyka stránky",
        "pagelang-name": "Stránka",
        "pagelang-language": "Jazyk",
        "pagelang-use-default": "Použiť predvolený jazyk",
        "pagelang-select-lang": "Vybrať jazyk",
        "right-pagelang": "Zmeniť jazyk stránky",
+       "action-pagelang": "meniť jazyk stránky",
        "default-skin-not-found": "Uups! Základná tapeta pre Vašu wiki, popísanú v <code dir=\"ltr\">$wgDefaultSkin</code> ako <code>$1</code>, nie je dostupná. \n\nVaša inštalácia pravdepodobne obsahuje nasledovné tapety. Pozri [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] pre viac informácii o ich aktivácii a zvoľte základnú.\n\n$2\n\n; Ak ste MediaWiki len teraz nainštalovali\n; Zrejme ste to nainštalovali z gitu alebo priamo zo zdrojového kódu inou metódou. Je to očakávané. Skúste nainštalovať nejaké tapety z [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory];\n:*Stiahnutím [https://www.mediawiki.org/wiki/Download tarball installer], ktorý ponúka viacero tapiet a rozšírení. Skopírovať a nalepiť možno priamo z <code>skins/</code>.\n:*Klonovanie jednej zo <code>mediawiki/skins/*</code> schránok cez git do <code dir=\"ltr\">skins/</code> priečinku Vašej Media Wiki inštalácie.\n: S existujúcou git schránkou, ak ste vývojár MediaWiki, by nemal byť konflikt.\n\n: Ak ste upgradeovali MediaWiki\n: MediaWiki 1.24 a novšie už tapety automaticky neaktivujú. (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Nasledovný kód môžete skopírovať do <code>LocalSettings.php</code> pre aktivovanie všetkých dostupných tapiet.\n\n<pre dir=\"ltr\">$3</pre>\n\n; Ak ste upravili <code>LocalSettings.php</code>:\n: Skontrolujte chyby.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (povolený)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''zakázaný''')",
        "special-characters-title-endash": "pomlčka",
        "special-characters-title-emdash": "dlhá pomlčka",
        "special-characters-title-minus": "mínus",
+       "mw-widgets-dateinput-no-date": "Nebol zvolený žiaden dátum",
        "mw-widgets-dateinput-placeholder-day": "RRRR-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
+       "mw-widgets-titleinput-description-new-page": "stránka zatiaľ neexistuje",
+       "mw-widgets-titleinput-description-redirect": "presmerovanie na $1",
        "api-error-blacklisted": "Prosím, zvoľte iný, opisný názov."
 }
index f293154..f5fc47a 100644 (file)
@@ -46,6 +46,7 @@
        "tog-watchlisthidebots": "Na spisku nadzorov skrij urejanja botov",
        "tog-watchlisthideminor": "Na spisku nadzorov skrij manjša urejanja",
        "tog-watchlisthideliu": "Na spisku nadzorov skrij urejanja prijavljenih uporabnikov",
+       "tog-watchlistreloadautomatically": "Samodejno ponovno naloži spisek nadzorov ob spremembi filtra (zahteva JavaScript)",
        "tog-watchlisthideanons": "Na spisku nadzorov skrij urejanja anonimnih uporabnikov",
        "tog-watchlisthidepatrolled": "Na spisku nadzorov skrij pregledana urejanja",
        "tog-watchlisthidecategorization": "Skrij kategorizacijo strani",
        "morenotlisted": "Seznam ni popoln.",
        "mypage": "Stran",
        "mytalk": "Pogovor",
-       "anontalk": "Pogovorna stran IP-naslova",
+       "anontalk": "Pogovorna stran",
        "navigation": "Navigacija",
        "and": "&#32;in",
        "qbfind": "Poišči",
        "databaseerror-query": "Poizvedba: $1",
        "databaseerror-function": "Funkcija: $1",
        "databaseerror-error": "Napaka: $1",
+       "transaction-duration-limit-exceeded": "V izogib ustvarjanju visokega zamika replikacije smo transakcijo prekinili, saj je trajanje zapisovanja ($1) preseglo omejitev $2 sekund.\nČe naenkrat spreminjate več predmetov, poskusite izvesti več manjših operacij.",
        "laggedslavemode": "'''Opozorilo:''' Stran morda ne vsebuje najnovejših posodobitev.",
        "readonly": "Zbirka podatkov je zaklenjena",
        "enterlockreason": "Vnesite razlog za zaklenitev in oceno, kdaj bo urejanje spet mogoče",
        "missingarticle-rev": "(redakcija št.: $1)",
        "missingarticle-diff": "(Primerjanje: $1, $2)",
        "readonly_lag": "Podatkovna zbirka se je samodejno zaklenila, dokler se podrejeni strežniki ne uskladijo z glavnim.",
+       "nonwrite-api-promise-error": "Prejeli smo glavo HTTP 'Promise-Non-Write-API-Action', vendar zahteva je bila poslana na modul API za zapisovanje.",
        "internalerror": "Notranja napaka",
        "internalerror_info": "Notranja napaka: $1",
        "internalerror-fatal-exception": "Usodna izjema vrste »$1«",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zakaj ustvarjate drug račun",
-       "createacct-captcha": "Varnostno preverjanje",
-       "createacct-imgcaptcha-ph": "Vnesite zgornje besedilo",
        "createacct-submit": "Ustvarite svoj račun",
        "createacct-another-submit": "Ustvarite račun",
        "createacct-benefit-heading": "{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.",
        "wrongpasswordempty": "Vpisali ste prazno geslo. Prosimo, poskusite znova.",
        "passwordtooshort": "Geslo mora imeti najmanj $1 {{PLURAL:$1|znak|znaka|znake|znakov|znakov}}.",
        "passwordtoolong": "Gesla ne morejo biti daljša od {{PLURAL:$1|1 znaka|$1 znakov}}.",
+       "passwordtoopopular": "Pogosto izbrana gesla ne morete uporabiti. Prosimo, izberite bolj edinstveno geslo.",
        "password-name-match": "Vaše geslo se mora razlikovati od vašega uporabniškega imena.",
        "password-login-forbidden": "Uporaba tega uporabniškega imena in gesla je prepovedana.",
        "mailmypassword": "Ponastavitev gesla",
        "passwordreset-emailtext-ip": "Nekdo (verjetno vi, z IP-naslova $1) je zahteval ponastavitev vašega\ngesla na {{SITENAME}} ($4). S tem e-poštnim naslovom\n{{PLURAL:$3|je povezan naslednji uporabniški račun|sta povezana naslednja uporabniška računa|so povezani naslednji uporabniški računi}}:\n\n$2\n\n{{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.\nPrijavite se in izberite novo geslo. Če je zahtevo podal\nnekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več\nne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo\nsvojega starega gesla.",
        "passwordreset-emailtext-user": "Uporabnik $1 na strani {{SITENAME}} je zahteval ponastavitev vašega gesla na {{SITENAME}}\n($4). S tem e-poštnim naslovom {{PLURAL:$3|je povezan naslednji uporabniški račun|sta povezana naslednja uporabniška računa|so povezani naslednji uporabniški računi}}:\n\n$2\n\n{{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.\nPrijavite se in izberite novo geslo sedaj. Če je zahtevo podal\nnekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več\nne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo\nsvojega starega gesla.",
        "passwordreset-emailelement": "Uporabniško ime: \n$1\n\nZačasno geslo: \n$2",
-       "passwordreset-emailsent": "Če je to registriran e-poštni naslov za vaš račun, vam bomo poslali e-pošto za postavitev gesla.",
+       "passwordreset-emailsentemail": "Če je to registriran e-poštni naslov za vaš račun, vam bomo poslali e-pošto za postavitev gesla.",
+       "passwordreset-emailsentusername": "Če obstaja pripadajoč registriran e-poštni naslov, vam bomo poslali e-pošto za postavitev gesla.",
        "passwordreset-emailsent-capture": "Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.",
        "passwordreset-emailerror-capture": "Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1",
        "changeemail": "Sprememba ali odstranitev e-poštnega naslova",
        "showingresultsinrange": "Spodaj prikazujem {{PLURAL:$1|1=<strong>1</strong> rezultat|<strong>$1</strong> rezultata|<strong>$1</strong> rezultate|<strong>$1</strong> rezultatov}} v razponu od št. <strong>$2</strong> do št. <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Rezultat <strong>$1</strong> od <strong>$3</strong>|Rezultati <strong>$1–$2</strong> od <strong>$3</strong>}}",
        "search-nonefound": "Ni bilo zadetkov, ki ustrezajo poizvedbi.",
+       "search-nonefound-thiswiki": "Našli nismo nobenega rezultata, ki bi se ujemal s poizvedbo na tej strani.",
        "powersearch-legend": "Napredno iskanje",
        "powersearch-ns": "Iskanje v imenskih prostorih:",
        "powersearch-togglelabel": "Izberi:",
        "prefs-help-prefershttps": "Nastavitev bo začela veljati ob vaši naslednji prijavi.",
        "prefswarning-warning": "V svojih nastavitvah ste naredili spremembe, ki jih še niste shranili. Če odidete s strani brez da bi kliknili »$1«, vaših nastavitev ne bomo posodobili.",
        "prefs-tabs-navigation-hint": "Namig: Za krmarjenje med zavihki na seznamu zavihkov lahko uporabite levo in desno smerno tipko.",
-       "email-address-validity-valid": "E-poštni naslov je videti veljaven",
-       "email-address-validity-invalid": "Vnesite veljaven e-poštni naslov",
        "userrights": "Upravljanje s pravicami uporabnikov",
        "userrights-lookup-user": "Upravljanje z uporabniškimi skupinami",
        "userrights-user-editname": "Vpišite uporabniško ime:",
        "recentchanges-label-plusminus": "uporabnik je velikost strani spremenil za tolikšno število bajtov",
        "recentchanges-legend-heading": "'''Legenda:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (glej tudi [[Special:NewPages|seznam novih strani]])",
+       "recentchanges-submit": "Prikaži",
        "rcnotefrom": "{{PLURAL:$5|Navedena je sprememba|Navedeni sta spremembi|Navedene so spremembe}} od <strong>$3 $4</strong> dalje (prikazujem jih do <strong>$1</strong>).",
        "rclistfrom": "Prikaži spremembe od $3 $2 naprej",
        "rcshowhideminor": "$1 manjša urejanja",
        "mostrevisions": "Največkrat urejane strani",
        "prefixindex": "Vse strani s predpono",
        "prefixindex-namespace": "Vse strani s predpono (imenski prostor $1)",
+       "prefixindex-submit": "Prikaži",
        "prefixindex-strip": "Na seznamu odreži predpono",
        "shortpages": "Kratke strani",
        "longpages": "Dolge strani",
        "protectedpages-performer": "Zaščitni uporabnik",
        "protectedpages-params": "Parametri zaščite",
        "protectedpages-reason": "Razlog",
+       "protectedpages-submit": "Prikaži strani",
        "protectedpages-unknown-timestamp": "Neznano",
        "protectedpages-unknown-performer": "Neznani uporabnik",
        "protectedtitles": "Zaščiteni naslovi",
        "protectedtitles-summary": "Stran navaja obstoječe strani, ki so trenutno zaščitene pred ustvarjanjem. Za seznam obstoječih strani, ki so zaščitene, glej [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Noben naslov ni trenutno zaščiten s temi parametri.",
+       "protectedtitles-submit": "Prikaži naslove",
        "listusers": "Seznam uporabnikov",
        "listusers-editsonly": "Pokaži samo uporabnike z urejanji",
        "listusers-creationsort": "Razvrsti po datumu ustvaritve",
        "usereditcount": "$1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
        "usercreated": "{{GENDER:$3|Ustvarjen|Ustvarjena}} dne $1 ob $2",
        "newpages": "Nove strani",
+       "newpages-submit": "Prikaži",
        "newpages-username": "Uporabniško ime:",
        "ancientpages": "Najdlje nespremenjeni članki",
        "move": "Preimenuj",
        "specialloguserlabel": "Izvajalec:",
        "speciallogtitlelabel": "Cilj (naslov ali {{ns:user}}:uporabniškoime za uporabnika):",
        "log": "Dnevniki",
+       "logeventslist-submit": "Prikaži",
        "all-logs-page": "Vsi javni dnevniki",
        "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.",
        "cachedspecial-viewing-cached-ts": "Ogledujete si predpomnjeno različico strani, ki morda ni popolnoma posodobljena.",
        "cachedspecial-refresh-now": "Ogled najnovejše.",
        "categories": "Kategorije",
+       "categories-submit": "Prikaži",
        "categoriespagetext": "{{PLURAL:$1|Naslednja $1 kategorija vsebuje|Naslednji $1 kategoriji vsebujeta|Naslednje $1 kategorije vsebujejo|Naslednjih $1 kategorij vsebuje}} strani ali datoteke.\n[[Special:UnusedCategories|Neuporabljene kategorije]] niso prikazane.\nGlej tudi [[Special:WantedCategories|želene kategorije]].",
        "categoriesfrom": "Prikaži kategorije, ki se začnejo na:",
        "special-categories-sort-count": "razvrsti po številu",
        "activeusers-hidebots": "Skrij bote",
        "activeusers-hidesysops": "Skrij administratorje",
        "activeusers-noresult": "Noben uporabnik ni bil najden.",
+       "activeusers-submit": "Prikaži dejavne uporabnike",
        "listgrouprights": "Pravice uporabniških skupin",
        "listgrouprights-summary": "Tu je na razpolago seznam uporabniških skupin na tem wikiju z navedbo dodeljenih pravic dostopa.\nMorda so na razpolago tudi [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o posameznih skupinah.",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Dodeljena pravica</span>\n* <span class=\"listgrouprights-revoked\">Odvzeta pravica</span>",
        "wlheader-showupdated": "Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
        "wlnote": "{{PLURAL:$1|Navedena je zadnja|Navedeni sta zadnji|Navedene so zadnje|Navedenih je zadnjih}} <strong>$1</strong> {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb}} v {{PLURAL:$2|zadnji <strong>$2</strong> uri|zadnjih <strong>$2</strong> urah}}, od $3, $4.",
        "wlshowlast": "Prikaži zadnjih $1 ur; $2 dni",
+       "watchlistall2": "vse",
+       "watchlist-hide": "Skrij",
+       "watchlist-submit": "Prikaži",
+       "wlshowtime": "Časovno obdobje za prikaz:",
+       "wlshowhideminor": "manjša urejanja",
+       "wlshowhidebots": "boti",
+       "wlshowhideliu": "registrirani uporabniki",
+       "wlshowhideanons": "brezimni uporabniki",
+       "wlshowhidepatr": "pregledana urejanja",
+       "wlshowhidemine": "moja urejanja",
        "watchlist-options": "Možnosti spiska nadzorov",
        "watching": "Nadziranje ...",
        "unwatching": "Nenadziranje ...",
        "delete-confirm": "Brisanje »$1«",
        "delete-legend": "Izbriši",
        "historywarning": "<strong>Opozorilo:</strong> Stran, ki jo nameravate izbrisati, ima zgodovino s približno $1 {{PLURAL:$1|redakcijo|redakcijama|redakcijami}}:",
+       "historyaction-submit": "Prikaži",
        "confirmdeletetext": "Iz zbirke podatkov boste izbrisali stran ali sliko skupaj z vso njeno zgodovino.\nProsimo, '''potrdite''', da to resnično želite, da razumete posledice dejanja in da se ravnate po [[{{MediaWiki:Policy-url}}|pravilih]].",
        "actioncomplete": "Poseg je končan",
        "actionfailed": "Dejanje spodletelo",
        "contributions": "{{GENDER:$1|Uporabnikovi|Uporabničini}} prispevki",
        "contributions-title": "Prispevki uporabnika $1",
        "mycontris": "Prispevki",
+       "anoncontribs": "Prispevki",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Uporabniški račun »$1« ni registriran.",
        "nocontribs": "Ne najdem nobene merilom ustrezajoče spremembe.",
        "whatlinkshere-hidelinks": "$1 povezave",
        "whatlinkshere-hideimages": "$1 povezave datotek",
        "whatlinkshere-filters": "Filtri",
+       "whatlinkshere-submit": "Pojdi",
        "autoblockid": "Samodejna blokada št. $1",
        "block": "Blokiraj uporabnika",
        "unblock": "Odblokiraj uporabnika",
        "movenosubpage": "Ta stran nima podstrani.",
        "movereason": "Razlog:",
        "revertmove": "vrni",
-       "delete_and_move": "Briši in prestavi",
        "delete_and_move_text": "==Treba bi bilo brisati==\n\nCiljna stran »[[:$1]]« že obstaja. Ali jo želite, da bi pripravili prostor za prestavitev, izbrisati?",
        "delete_and_move_confirm": "Da, izbriši stran",
        "delete_and_move_reason": "Izbrisano z namenom pripraviti prostor za »[[$1]]«",
        "tooltip-pt-preferences": "Vaše nastavitve",
        "tooltip-pt-watchlist": "Seznam strani, katerih spremembe spremljate",
        "tooltip-pt-mycontris": "Seznam vaših prispevkov",
+       "tooltip-pt-anoncontribs": "Seznam urejanj s tega IP-naslova",
        "tooltip-pt-login": "Prijava ni obvezna, vendar je zaželena",
        "tooltip-pt-logout": "Odjavite se",
        "tooltip-pt-createaccount": "Predlagamo vam, da ustvarite račun in se prijavite, vendar pa to ni obvezno.",
        "exif-compression-4": "Kodiranje CCITT skupina 4 faks",
        "exif-copyrighted-true": "Avtorsko zaščiteno",
        "exif-copyrighted-false": "Stanje avtorske pravice ni določeno",
+       "exif-photometricinterpretation-1": "Črno in belo (črno je 0)",
        "exif-unknowndate": "neznan datum",
        "exif-orientation-1": "Navadna",
        "exif-orientation-2": "Vodoravno zrcaljeno",
        "htmlform-cloner-required": "Zahtevana je vsaj ena vrednost.",
        "htmlform-title-badnamespace": "[[:$1]] ni v imenskem prostoru »{{ns:$2}}«.",
        "htmlform-title-not-creatable": "»$1« je naslov strani, ki ga ni mogoče ustvariti",
-       "htmlform-title-not-exists": "[[:$1]] ne obstaja.",
+       "htmlform-title-not-exists": "$1 ne obstaja.",
        "htmlform-user-not-exists": "<strong>$1</strong> ne obstaja.",
        "htmlform-user-not-valid": "<strong>$1</strong> ni veljavno uporabniško ime.",
        "sqlite-has-fts": "$1 s podporo iskanju polnih besedil",
        "logentry-suppress-block": "$1 je {{GENDER:$2|blokiral|blokirala|blokiral(-a)}} {{GENDER:$4|$3}} s časom poteka $5 $6",
        "logentry-suppress-reblock": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} nastavitve blokade za {{GENDER:$4|$3}} s časom poteka $5 $6",
        "logentry-import-upload": "$1 je {{GENDER:$2|uvozil|uvozila|uvozil(-a)}} $3 z nalaganjem datoteke",
+       "logentry-import-upload-details": "$1 je {{GENDER:$2|uvozil|uvozila|uvozil(-a)}} $3 z nalaganjem datoteke ($4 {{PLURAL:$4|redakcija|redakciji|redakcije|redakcij}})",
        "logentry-import-interwiki": "$1 je {{GENDER:$2|uvozil|uvozila|uvozil(-a)}} $3 z drugega wikija",
+       "logentry-import-interwiki-details": "$1 je {{GENDER:$2|uvozil|uvozila|uvozil(-a)}} $3 iz $5 ($4 {{PLURAL:$4|redakcija|redakciji|redakcije|redakcij}})",
        "logentry-merge-merge": "$1 je {{GENDER:$2|združil|združila|združil(-a)}} $3 z $4 (redakcije do $5)",
        "logentry-move-move": "$1 je {{GENDER:$2|premaknil|premaknila|premaknil(-a)}} stran $3 na $4",
        "logentry-move-move-noredirect": "$1 je {{GENDER:$2|prestavil|prestavila|prestavil(-a)}} stran $3 na $4 brez preusmeritve",
index 4fda64f..33ddb6c 100644 (file)
@@ -38,6 +38,7 @@
        "tog-hideminor": "Fshih redaktimet e vogla nga ndryshimet e fundit",
        "tog-hidepatrolled": "Fshih redaktimet e paturlluara nga ndryshimet e fundit",
        "tog-newpageshidepatrolled": "Fshih faqet e patrulluara nga lista e faqeve të reja",
+       "tog-hidecategorization": "Fshih kategorizimin e faqeve",
        "tog-extendwatchlist": "Zgjero listën e faqeve të vëzhguara që t'i tregojë të gjitha ndryshimet, jo vetëm më të fundit.",
        "tog-usenewrc": "Grupo ndryshimet sipas faqeve në ndryshime së fundmi dhe listën mbikqyrëse (kërkon JavaScript)",
        "tog-numberheadings": "Numëro automatikish titujt",
@@ -67,6 +68,7 @@
        "tog-watchlisthideliu": "Fshih redaktimet e përdoruesve nga lista e faqeve të vëzhguara",
        "tog-watchlisthideanons": "Fshih redaktimet përdoruesve anonim nga lista e faqeve të vëzhguara",
        "tog-watchlisthidepatrolled": "Fshih redaktimet e vrojtuara nga lista e faqeve të vëzhguara",
+       "tog-watchlisthidecategorization": "Fshih kategorizimin e faqeve",
        "tog-ccmeonemails": "Më dërgo kopje të mesazheve që u dërgoj të tjerëve",
        "tog-diffonly": "Mos trego përmbajtjen e faqes nën diff-e",
        "tog-showhiddencats": "Trego kategoritë e fshehura",
        "createaccountreason": "Arsyeja:",
        "createacct-reason": "Arsyeja",
        "createacct-reason-ph": "Pse ju jeni duke krijuar një llogari tjetër",
-       "createacct-captcha": "kontroll sigurie",
-       "createacct-imgcaptcha-ph": "Shkruaj tekstin që ju shihni më lartë",
        "createacct-submit": "Krijoni llogarinë tuaj",
        "createacct-another-submit": "Krijo një llogari",
        "createacct-benefit-heading": "{{SITENAME}} është bërë nga njerëz si ju.",
        "passwordreset-emailtext-ip": "Dikush (ndoshta ju, nga IP adresa $1) kërkoi një kujtesë për \ndetajet e llogarisë suaj {{SITENAME}} ($4).Përdoruesi në vijim {{PLURAL:$3|llogari është|llogaritë janë}} të lidhur me këtë postë elektronike:\n\n$2\n\n{{PLURAL:$3|Ky fjalëkalim i përkohshëm|Këto fjalëkalime të përkohshme}} do të përfundojë për {{PLURAL:$5|një ditë|$5 ditë}}.\n\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
        "passwordreset-emailtext-user": "Përdoruesi  $1 në {{SITENAME }} ka kërkuar një kujtesë për të dhënat e llogarisë suaj për {{SITENAME }} ($4). Përdoruesi në vijim {{PLURAL:$3 | llogaria është | llogaritë janë}} të lidhur me këtë postë elektronike: \n\n$2\n\n{{PLURAL:$3 | Ky fjalëkalim i përkohshëm | Këto fjalëkalime të përkohshme}} do të përfundojë në {{PLURAL:$5 | një ditë | $5 ditë}}.\nJu duhet të kyçeni dhe të zgjidhni një fjalëkalim të ri tani. Nëse dikush tjetër e ka bërë këtë kërkesës, ose në qoftë se ju mbani mend fjalëkalimin tuaj origjinal, dhe ju nuk dëshirojni të ndryshoni atë, ju mund të injoroni këtë mesazh dhe do të vazhdoni përdorimin e fjalëkalimit tuaj të vjetër.",
        "passwordreset-emailelement": "Emri i përdoruesit: \n$1\n\nFjalëkalimi i përkohshëm: \n$2",
-       "passwordreset-emailsent": "Një email për rivendosjen e fjalëkalimit është dërguar.",
+       "passwordreset-emailsent": "Nëse kjo është një adresë emaili e regjistruar për llogarinë tuaj, atëherë një email për rivendosjen e fjalëkalimit do të dërgohet.",
        "passwordreset-emailsent-capture": "Një email për rivendosjen e fjalëkalimit është dërguar, i cili tregohet më poshtë.",
        "passwordreset-emailerror-capture": "U dërgua një e-mail kujtesë, i cili tregohet më poshtë, por dërgesa për tek përdoruesi qe e pamundur: $1",
-       "changeemail": "Ndrysho postën elektronike",
+       "changeemail": "Ndrysho ose hiq postën elektronike",
        "changeemail-header": "Ndrysho llogarinë e adresës së postës elektronike",
        "changeemail-no-info": "Ju duhet të identifikoheni në mënyrë që të keni të drejtë hyrjeje në këtë faqe.",
        "changeemail-oldemail": "Adresa aktuale e emailit:",
        "wlheader-showupdated": "Faqet që kanë ndryshuar nga vizita juaj e fundit do të tregohen të '''trasha'''",
        "wlnote": "Më poshtë {{PLURAL:$1|është ndryshimi i fundit|janë '''$1''' ndryshimet e fundit}} në {{PLURAL:$2|orën e fundit|'''$2''' orët e fundit}}, që nga $3, $4.",
        "wlshowlast": "Trego $1 orët $2 ditët",
+       "watchlistall2": "të gjitha",
        "watchlist-options": "Mundësitë e listës mbikqyrëse",
        "watching": "Duke mbikqyrur...",
        "unwatching": "Mos e mbikqyr më...",
        "movenosubpage": "Kjo faqe nuk ka nën-faqe.",
        "movereason": "Arsyeja:",
        "revertmove": "ktheje",
-       "delete_and_move": "Grise dhe zhvendose",
        "delete_and_move_text": "==Nevojitet grisje==\n\nFaqja \"[[:$1]]\" ekziston, dëshironi ta grisni për të mundësuar zhvendosjen?",
        "delete_and_move_confirm": "Po, fshi këtë faqe",
        "delete_and_move_reason": "U gris për të liruar vendin për përcjellim të \"[[$1]]\"",
        "tooltip-ca-nstab-main": "Shikoni përmbajtjen e atikullit.",
        "tooltip-ca-nstab-user": "Shfaq faqen e përdoruesit",
        "tooltip-ca-nstab-media": "Shfaq faqen e medias",
-       "tooltip-ca-nstab-special": "Kjo është një faqe speciale. Ju nuk mundeni ta redaktoni këtë faqe",
+       "tooltip-ca-nstab-special": "Kjo është një faqe speciale. dhe nuk mund të redaktohet",
        "tooltip-ca-nstab-project": "Shfaq faqen e projektit",
        "tooltip-ca-nstab-image": "Shikoni faqen e figurës",
        "tooltip-ca-nstab-mediawiki": "Shikoni mesazhet e sistemit",
index 77c6418..929c885 100644 (file)
@@ -28,7 +28,9 @@
                        "Nemo bis",
                        "Aktron",
                        "Srdjan m",
-                       "Macofe"
+                       "Macofe",
+                       "Сербијана",
+                       "Xð"
                ]
        },
        "tog-underline": "Подвлачење веза:",
@@ -37,7 +39,7 @@
        "tog-newpageshidepatrolled": "Сакриј патролиране странице са списка нових страница",
        "tog-hidecategorization": "Сакриј категоризацију страница",
        "tog-extendwatchlist": "Прошири списак надгледања за приказ свих измена, не само скорашњих",
-       "tog-usenewrc": "Ð\9fÑ\80омене Ñ\83 Ð³Ñ\80Ñ\83пи Ð¿Ð¾ Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\83 Ñ\81пиÑ\81кÑ\83 Ñ\81коÑ\80аÑ\88Ñ\9aиÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° Ð¸ Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ð½Ð¸Ñ\85 Ñ\81Ñ\82Ñ\80аниÑ\86а",
+       "tog-usenewrc": "Ð\93Ñ\80Ñ\83пни Ð¿Ñ\80иказ Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\81ваке Ð¿Ð¾Ñ\98единаÑ\87не Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\83 Ñ\81коÑ\80аÑ\88Ñ\9aим Ð¸Ð·Ð¼ÐµÐ½Ð°Ð¼Ð° Ð¸ Ñ\81пиÑ\81кÑ\83 Ð½Ð°Ð´Ð³Ð»ÐµÐ´Ð°Ñ\9aа",
        "tog-numberheadings": "Аутоматски нумериши поднаслове",
        "tog-showtoolbar": "Прикажи траку с алаткама за уређивање",
        "tog-editondblclick": "Уређивање страница двоструким кликом",
        "tog-minordefault": "Означавај све измене као мање",
        "tog-previewontop": "Прикажи преглед пре оквира за уређивање",
        "tog-previewonfirst": "Прикажи преглед на првој измени",
-       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 када се промени страница или датотека коју надгледам",
-       "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 када се промени моја страница за разговор",
-       "tog-enotifminoredits": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ðµ-поÑ\80Ñ\83кÑ\83 и за мање измене у страницама и датотекама",
-       "tog-enotifrevealaddr": "Ð\9fÑ\80икажи Ð¼Ð¾Ñ\98Ñ\83 Ðµ-адресу у порукама обавештења",
+       "tog-enotifwatchlistpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л када се промени страница или датотека коју надгледам",
+       "tog-enotifusertalkpages": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л када се промени моја страница за разговор",
+       "tog-enotifminoredits": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ Ð¸Ð¼ÐµÑ\98л и за мање измене у страницама и датотекама",
+       "tog-enotifrevealaddr": "Ð\9fÑ\80икажи Ð¼Ð¾Ñ\98Ñ\83 Ð¸Ð¼ÐµÑ\98л адресу у порукама обавештења",
        "tog-shownumberswatching": "Прикажи број корисника који надгледају",
        "tog-oldsig": "Текући потпис:",
        "tog-fancysig": "Сматрај потпис као викитекст (без самоповезивања)",
-       "tog-uselivepreview": "Ð\9aоÑ\80иÑ\81Ñ\82и Ñ\82Ñ\80енÑ\83Ñ\82ан преглед",
+       "tog-uselivepreview": "Ð\9aоÑ\80иÑ\81Ñ\82и Ñ\82Ñ\80енÑ\83Ñ\82ни преглед",
        "tog-forceeditsummary": "Упозори ме када не унесем опис измене",
        "tog-watchlisthideown": "Сакриј моје измене са списка надгледања",
        "tog-watchlisthidebots": "Сакриј измене ботова са списка надгледања",
@@ -66,7 +68,7 @@
        "tog-watchlisthideanons": "Сакриј измене анонимних корисника са списка надгледања",
        "tog-watchlisthidepatrolled": "Сакриј патролиране измене са списка надгледања",
        "tog-watchlisthidecategorization": "Сакриј категоризацију страница",
-       "tog-ccmeonemails": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\98е Ðµ-поÑ\80Ñ\83ка које пошаљем другим корисницима",
+       "tog-ccmeonemails": "Ð\9fоÑ\88аÑ\99и Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ñ\98е Ð¸Ð¼ÐµÑ\98лова које пошаљем другим корисницима",
        "tog-diffonly": "Не приказуј садржај странице испод разлика",
        "tog-showhiddencats": "Прикажи скривене категорије",
        "tog-norollbackdiff": "Изостави разлику након извршеног враћања",
        "category-media-header": "Датотеке у категорији „$1“",
        "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ова категорија тренутно не садржи странице или датотеке.''</div>",
        "hidden-categories": "{{PLURAL:$1|Сакривена категорија|Сакривене категорије}}",
-       "hidden-category-category": "СакÑ\80ивене ÐºÐ°Ñ\82егоÑ\80иÑ\98е",
+       "hidden-category-category": "Скривене категорије",
        "category-subcat-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу поткатегорију.|Ова категорија има {{PLURAL:$1|1=следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}, од укупно $2.}}",
        "category-subcat-count-limited": "Ова категорија садржи {{PLURAL:$1|следећу поткатегорију|следеће $1 поткатегорије|следећих $1 поткатегорија}}.",
        "category-article-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу страницу.|{{PLURAL:$1|Следећа страница је|Следеће $1 странице су|Следећих $1 страница је}} у овој категорији, од укупно $2.}}",
        "morenotlisted": "Ова листа није комплетна.",
        "mypage": "Страница",
        "mytalk": "Разговор",
-       "anontalk": "Разговор за ову ИП адресу",
+       "anontalk": "Разговор",
        "navigation": "Навигација",
        "and": "&#32;и",
        "qbfind": "Пронађи",
        "viewhelppage": "Погледај страницу помоћи",
        "categorypage": "Погледај страницу категорија",
        "viewtalkpage": "Погледај разговор",
-       "otherlanguages": "Ð\94Ñ\80Ñ\83ги Ñ\98езиÑ\86и",
+       "otherlanguages": "Ð\9dа Ð´Ñ\80Ñ\83гим Ñ\98езиÑ\86има",
        "redirectedfrom": "(преусмерено са $1)",
        "redirectpagesub": "Преусмерење",
        "redirectto": "Преусмерава на:",
        "confirmable-no": "Не",
        "thisisdeleted": "Погледати или вратити $1?",
        "viewdeleted": "Погледати $1?",
-       "restorelink": "{{PLURAL:$1|обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
+       "restorelink": "{{PLURAL:$1|1=обрисану измену|$1 обрисане измене|$1 обрисаних измена}}",
        "feedlinks": "Довод:",
        "feed-invalid": "Неисправна врста довода.",
        "feed-unavailable": "Доводи нису доступни",
        "userlogin-helplink2": "Помоћ при пријављивању",
        "userlogin-loggedin": "Већ сте пријављени као {{GENDER:$1|$1}}.\nКористите доњи образац да бисте се пријавили као други корисник.",
        "userlogin-createanother": "Отвори још један налог",
-       "createacct-emailrequired": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е",
-       "createacct-emailoptional": "Ð\90дÑ\80еÑ\81а Ðµ-поÑ\88Ñ\82е (опционо)",
-       "createacct-email-ph": "УнеÑ\81иÑ\82е Ð²Ð°Ñ\88Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е",
-       "createacct-another-email-ph": "УнеÑ\81иÑ\82е Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е",
-       "createaccountmail": "Ð\9aоÑ\80иÑ\81Ñ\82иÑ\82е Ð¿Ñ\80ивÑ\80еменÑ\83, Ñ\81лÑ\83Ñ\87аÑ\98но Ñ\81Ñ\82воÑ\80енÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¸ Ð¿Ð¾Ñ\88аÑ\99иÑ\82е Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 ÐµÐ»ÐµÐºÑ\82Ñ\80онÑ\81ке Ð¿Ð¾Ñ\88Ñ\82е",
+       "createacct-emailrequired": "Ð\98меÑ\98л Ð°Ð´Ñ\80еÑ\81а",
+       "createacct-emailoptional": "Ð\98меÑ\98л Ð°Ð´Ñ\80еÑ\81а (опционо)",
+       "createacct-email-ph": "УнеÑ\81иÑ\82е Ð\92аÑ\88Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83",
+       "createacct-another-email-ph": "УнеÑ\81иÑ\82е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83",
+       "createaccountmail": "Ð\9aоÑ\80иÑ\81Ñ\82иÑ\82е Ð¿Ñ\80ивÑ\80еменÑ\83, Ñ\81лÑ\83Ñ\87аÑ\98но Ñ\81Ñ\82воÑ\80енÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð¸ Ð¿Ð¾Ñ\88аÑ\99иÑ\82е Ð½Ð° Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83",
        "createacct-realname": "Право име (опционо)",
        "createaccountreason": "Разлог:",
        "createacct-reason": "Разлог",
        "createacct-reason-ph": "Зашто правите још један налог?",
-       "createacct-captcha": "Сигурносна провера",
-       "createacct-imgcaptcha-ph": "Унесите текст који видите изнад",
        "createacct-submit": "Отвори налог",
        "createacct-another-submit": "Отвори налог",
        "createacct-benefit-heading": "{{SITENAME}} је направљен од стране људи као што сте ви.",
        "mailmypassword": "Ресетуј лозинку",
        "passwordremindertitle": "{{SITENAME}} — привремена лозинка",
        "passwordremindertext": "Неко, вероватно ви, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСтворена је привремена лозинка за {{GENDER:$2|корисника|корисницу|корисника}} $2 која гласи $3.\nУколико је ово ваш захтев, сада се пријавите и поставите нову лозинку.\nПривремена лозинка истиче за {{PLURAL:$5|један дан|$5 дана|$5 дана}}.\n\nАко је неко други затражио промену лозинке, или сте се сетили ваше лозинке и не желите да је мењате, занемарите ову поруку.",
-       "noemail": "Ð\9dе Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ðµ-адреса за {{GENDER:$1|корисника|корисницу}} $1.",
-       "noemailcreate": "Ð\9cоÑ\80аÑ\82е Ð½Ð°Ð²ÐµÑ\81Ñ\82и Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адÑ\80еÑ\81Ñ\83",
-       "passwordsent": "Ð\9dова Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ðµ-адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
+       "noemail": "Ð\9dе Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ð¸Ð¼ÐµÑ\98л адреса за {{GENDER:$1|корисника|корисницу}} $1.",
+       "noemailcreate": "Ð\9cоÑ\80аÑ\82е Ð½Ð°Ð²ÐµÑ\81Ñ\82и Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83.",
+       "passwordsent": "Ð\9dова Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ð¸Ð¼ÐµÑ\98л адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
        "blocked-mailpassword": "Вашој ИП адреси је онемогућено уређивање страница, као и могућност захтевања нове лозинке.",
-       "eauthentsent": "Ð\9dа Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ðµ-адÑ\80еÑ\81Ñ\83 Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82 Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´.\nÐ\9fÑ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\88аÑ\99емо Ð´Ð°Ñ\99Ñ\9aе Ð¿Ð¾Ñ\80Ñ\83ке, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\83пÑ\83Ñ\82Ñ\81Ñ\82ва Ñ\81 Ðµ-поÑ\88Ñ\82е да бисте потврдили да сте ви отворили налог.",
+       "eauthentsent": "Ð\9dа Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82 Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´.\nÐ\9fÑ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\88аÑ\99емо Ð´Ð°Ñ\99Ñ\9aе Ð¿Ð¾Ñ\80Ñ\83ке, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\83пÑ\83Ñ\82Ñ\81Ñ\82ва Ñ\81 Ð¸Ð¼ÐµÑ\98ла да бисте потврдили да сте ви отворили налог.",
        "throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
        "mailerror": "Грешка при слању поруке: $1",
        "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу ИП адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога|$1 налога}} претходни дан, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове ИП адресе тренутно не могу отворити више налога.",
-       "emailauthenticated": "Ð\92аÑ\88а Ðµ-адреса је потврђена $2 у $3.",
-       "emailnotauthenticated": "Ð\92аÑ\88а Ðµ-адреса још није потврђена.\nПоруке неће бити послате ни у једном од следећих случајева.",
-       "noemailprefs": "УнеÑ\81иÑ\82е Ðµ-адресу како би ове могућности радиле.",
-       "emailconfirmlink": "Ð\9fоÑ\82вÑ\80диÑ\82е Ñ\81воÑ\98Ñ\83 Ðµ-адресу",
-       "invalidemailaddress": "Ð\95-адреса не може бити прихваћена јер је неисправног облика.\nУнесите исправну адресу или оставите празно поље.",
-       "cannotchangeemail": "Ð\9dа Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\80омениÑ\82и Ðµ-адресу налога.",
-       "emaildisabled": "Ð\9eваÑ\98 Ñ\81аÑ\98Ñ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\88аÑ\99е Ðµ-поÑ\80Ñ\83ке.",
+       "emailauthenticated": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л адреса је потврђена $2 у $3.",
+       "emailnotauthenticated": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л адреса још није потврђена.\nПоруке неће бити послате ни у једном од следећих случајева.",
+       "noemailprefs": "УнеÑ\81иÑ\82е Ð¸Ð¼ÐµÑ\98л адресу како би ове могућности радиле.",
+       "emailconfirmlink": "Ð\9fоÑ\82вÑ\80диÑ\82е Ñ\81воÑ\98Ñ\83 Ð¸Ð¼ÐµÑ\98л адресу",
+       "invalidemailaddress": "Ð\98меÑ\98л адреса не може бити прихваћена јер је неисправног облика.\nУнесите исправну адресу или оставите празно поље.",
+       "cannotchangeemail": "Ð\9dа Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿Ñ\80омениÑ\82и Ð¸Ð¼ÐµÑ\98л адресу налога.",
+       "emaildisabled": "Ð\9eваÑ\98 Ñ\81аÑ\98Ñ\82 Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\88аÑ\99е Ð¸Ð¼ÐµÑ\98лове.",
        "accountcreated": "Налог је отворен",
        "accountcreatedtext": "Кориснички налог [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) је отворен.",
        "createaccount-title": "Отварање корисничког налога за {{SITENAME}}",
-       "createaccount-text": "Ð\9dеко Ñ\98е Ð¾Ñ\82воÑ\80ио Ð½Ð°Ð»Ð¾Ð³ Ñ\81 Ð²Ð°Ñ\88ом Ðµ-адресом на {{SITENAME}} ($4) под именом $2 и лозинком $3.\nПријавите се и промените своју лозинку.\n\nАко је ово грешка, занемарите ову поруку.",
+       "createaccount-text": "Ð\9dеко Ñ\98е Ð¾Ñ\82воÑ\80ио Ð½Ð°Ð»Ð¾Ð³ Ñ\81 Ð²Ð°Ñ\88ом Ð¸Ð¼ÐµÑ\98л адресом на {{SITENAME}} ($4) под именом $2 и лозинком $3.\nПријавите се и промените своју лозинку.\n\nАко је ово грешка, занемарите ову поруку.",
        "login-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
        "login-abort-generic": "Неуспешна пријава – прекинуто",
        "login-migrated-generic": "Ваш налог је мигриран и ваше корисничко више не постоји на овом викију.",
        "pt-createaccount": "Отвори налог",
        "pt-userlogout": "Одјави ме",
        "php-mail-error-unknown": "Непозната грешка у функцији PHP mail().",
-       "user-mail-no-addy": "Ð\9fокÑ\83Ñ\88али Ñ\81Ñ\82е Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð±ÐµÐ· Ðµ-адресе.",
-       "user-mail-no-body": "Ð\9fокÑ\83Ñ\88ано Ñ\81лаÑ\9aе ÐµÐ»ÐµÐºÑ\82Ñ\80онÑ\81ке Ð¿Ð¾Ñ\80Ñ\83ке с празним или неразумно кратким садржајем.",
+       "user-mail-no-addy": "Ð\9fокÑ\83Ñ\88али Ñ\81Ñ\82е Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð±ÐµÐ· Ð¸Ð¼ÐµÑ\98л адресе.",
+       "user-mail-no-body": "Ð\9fокÑ\83Ñ\88ано Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98ла с празним или неразумно кратким садржајем.",
        "changepassword": "Промени лозинку",
        "resetpass_announce": "Да бисте завршили пријаву, подесите нову лозинку овде.",
        "resetpass_text": "<!-- Овде унесите текст -->",
        "resetpass-expired-soft": "Ваша лозинка је истекла и морате поставити нову. Поставите нову лозинку или кликните „{{int:resetpass-submit-cancel}}“ да је поставите касније.",
        "resetpass-validity-soft": "Ваша лозинка није ваљана: $1\n\nМолимо изаберите нову или кликните „{{int:resetpass-submit-cancel}}“ да ресетујете касније.",
        "passwordreset": "Обнављање лозинке",
-       "passwordreset-text-one": "Ð\9fопÑ\83ниÑ\82е Ð¾Ð²Ð°Ñ\98 Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð½Ð° Ðµ-поÑ\88Ñ\82Ñ\83.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ð\98Ñ\81пÑ\83ниÑ\82е Ñ\98едно Ð¾Ð´ Ð¿Ð¾Ñ\99а ÐºÐ°ÐºÐ¾ Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð½Ð° Ðµ-поÑ\88Ñ\82Ñ\83.}}",
+       "passwordreset-text-one": "Ð\9fопÑ\83ниÑ\82е Ð¾Ð²Ð°Ñ\98 Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð½Ð° Ð¸Ð¼ÐµÑ\98л.",
+       "passwordreset-text-many": "{{PLURAL:$1|Ð\98Ñ\81пÑ\83ниÑ\82е Ñ\98едно Ð¾Ð´ Ð¿Ð¾Ñ\99а ÐºÐ°ÐºÐ¾ Ð±Ð¸Ñ\81Ñ\82е Ð´Ð¾Ð±Ð¸Ð»Ð¸ Ð¿Ñ\80ивÑ\80еменÑ\83 Ð»Ð¾Ð·Ð¸Ð½ÐºÑ\83 Ð½Ð° Ð¸Ð¼ÐµÑ\98л.}}",
        "passwordreset-disabled": "Обнављање лозинке је онемогућено на овом викију.",
-       "passwordreset-emaildisabled": "Ð\95-поÑ\88Ñ\82а Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена на овом викију.",
+       "passwordreset-emaildisabled": "Ð\98меÑ\98л Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bен на овом викију.",
        "passwordreset-username": "Корисничко име:",
        "passwordreset-domain": "Домен:",
        "passwordreset-capture": "Погледати крајњу поруку?",
-       "passwordreset-capture-help": "Ð\90ко Ð¾Ð·Ð½Ð°Ñ\87иÑ\82е Ð¾Ð²Ñ\83 ÐºÑ\83Ñ\9bиÑ\86Ñ\83, Ðµ-поÑ\80Ñ\83ка Ñ\81 Ð¿Ñ\80ивÑ\80еменом Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼ Ñ\9bе Ð±Ð¸Ñ\82и Ð¿Ñ\80иказана Ð¸ Ð¿Ð¾Ñ\81лаÑ\82а кориснику.",
-       "passwordreset-email": "Ð\95-адреса:",
+       "passwordreset-capture-help": "Ð\90ко Ð¾Ð·Ð½Ð°Ñ\87иÑ\82е Ð¾Ð²Ñ\83 ÐºÑ\83Ñ\9bиÑ\86Ñ\83, Ð¸Ð¼ÐµÑ\98л Ñ\81 Ð¿Ñ\80ивÑ\80еменом Ð»Ð¾Ð·Ð¸Ð½ÐºÐ¾Ð¼ Ñ\9bе Ð±Ð¸Ñ\82и Ð¿Ñ\80иказан Ð¸ Ð¿Ð¾Ñ\81лаÑ\82 кориснику.",
+       "passwordreset-email": "Ð\98меÑ\98л адреса:",
        "passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Неко, вероватно Ви, са ИП адресе $1 је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом е-адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
-       "passwordreset-emailtext-user": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник Ñ\98е Ð·Ð°Ñ\82Ñ\80ажио|Ð\9aоÑ\80иÑ\81ниÑ\86а Ñ\98е Ð·Ð°Ñ\82Ñ\80ажила}} Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ð¾ Ð¿Ð¾Ð´Ð°Ñ\86има Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}} ($4).\nСледеÑ\9bи {{PLURAL:$3|коÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ Ñ\98е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½|коÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð·Ð¸ Ñ\81Ñ\83 Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð¸}} Ñ\81 Ð¾Ð²Ð¾Ð¼ Ðµ-адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
+       "passwordreset-emailtext-ip": "Неко (вероватно Ви, са ИП адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
+       "passwordreset-emailtext-user": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник Ñ\98е Ð·Ð°Ñ\82Ñ\80ажио|Ð\9aоÑ\80иÑ\81ниÑ\86а Ñ\98е Ð·Ð°Ñ\82Ñ\80ажила}} Ð¿Ð¾Ð´Ñ\81еÑ\82ник Ð¾ Ð¿Ð¾Ð´Ð°Ñ\86има Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}} ($4).\nСледеÑ\9bи {{PLURAL:$3|коÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ Ñ\98е Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½|коÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð·Ð¸ Ñ\81Ñ\83 Ð¿Ð¾Ð²ÐµÐ·Ð°Ð½Ð¸}} Ñ\81 Ð¾Ð²Ð¾Ð¼ Ð¸Ð¼ÐµÑ\98л адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку.",
        "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
-       "passwordreset-emailsent": "Подсетник о лозинци је послат на вашу адресу.",
-       "passwordreset-emailsent-capture": "Послат је подсетник преко е-поште (приказан доле).",
-       "passwordreset-emailerror-capture": "Е-порука за ресетовање лозинке, приказана испод је послата, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1",
-       "changeemail": "Промени или уклони е-адресу",
-       "changeemail-header": "Промените е-адресу налога",
+       "passwordreset-emailsentemail": "Ако је ово имејл адреса регистована на Вашем налогу, подсетник о лозинци ће бити послат на имејл.",
+       "passwordreset-emailsentusername": "Ако сте навели имејл адресу приликом регистрације, биће послат имејл за ресетовање лозинке.",
+       "passwordreset-emailsent-capture": "Послат је подсетник преко имејла, који је приказан доле.",
+       "passwordreset-emailerror-capture": "Имејл за ресетовање лозинке, приказан испод је послат, али слање {{GENDER:$2|кориснику|корисници}} није успело: $1",
+       "changeemail": "Промени или уклони имејл адресу",
+       "changeemail-header": "Попуните овај образац да би сте променили Вашу имејл адресу. Ако жели да ускратите приступ било којој имејл адреси Вашем налогу, оставите празно поље за нову имејл адресу приликом попуњавање обрасца.",
        "changeemail-passwordrequired": "Морате унети лозинку да би потврдили ову измену.",
        "changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
-       "changeemail-oldemail": "ТÑ\80енÑ\83Ñ\82на Ðµ-адреса:",
-       "changeemail-newemail": "Ð\9dова Ðµ-адреса:",
+       "changeemail-oldemail": "ТÑ\80енÑ\83Ñ\82на Ð¸Ð¼ÐµÑ\98л адреса:",
+       "changeemail-newemail": "Ð\9dова Ð¸Ð¼ÐµÑ\98л адреса:",
        "changeemail-none": "(ништа)",
        "changeemail-password": "Ваша лозинка:",
        "changeemail-submit": "Промени",
        "changeemail-throttled": "Превише пута сте покушали да се пријавите.\nМолимо вас да сачекате $1 пре него што покушате поново.",
+       "changeemail-nochange": "Унесите другу имејл адресу.",
        "resettokens": "Ресетовање жетона",
        "resettokens-text": "Можете поново поставити жетоне који ће вам омогућити приступ одређеним приватним подацима повезаним са вашим налогом овде.\n\nТребали бисте то да урадите ако их мимо воље поделите с неким или ако је ваш налог угрожен.",
        "resettokens-no-tokens": "Нема жетона за ресетовање.",
        "nowiki_sample": "Убаците необликован текст овде",
        "nowiki_tip": "Занемари вики обликовање",
        "image_sample": "Пример.jpg",
-       "image_tip": "УгÑ\80аÑ\92ена Ð´Ð°Ñ\82оÑ\82ека",
+       "image_tip": "УбаÑ\86иваÑ\9aе Ð´Ð°Ñ\82оÑ\82еке",
        "media_sample": "Пример.ogg",
        "media_tip": "Веза",
        "sig_tip": "Ваш потпис са тренутним временом",
        "preview": "Претпреглед",
        "showpreview": "Прикажи претпреглед",
        "showdiff": "Прикажи измене",
-       "blankarticle": "<strong>Упозорење:</strong> страница коју правите нема никакав садржај.\nАко још једном притиснете „{{int:savearticle}}“ направићете страницу без садржаја.",
+       "blankarticle": "<strong>Упозорење:</strong> страница коју правите нема никакав садржај.\nАко још једном притиснете „{{int:savearticle}}“ направићете празну страницу.",
        "anoneditwarning": "<strong>Упозорење:</strong> нисте пријављени. Ваша ИП адреса ће бити јавно видљива у историји ове странице ако начините било какву измену. Ако се <strong>[$1 пријавите]</strong> или <strong>[$2 отворите налог]</strong> ваше измене ће бити приписане вашем корисничком имену.",
        "anonpreviewwarning": "''Нисте пријављени. Ваша ИП адреса ће бити забележена у историји ове странице.''",
        "missingsummary": "'''Напомена:''' нисте унели опис измене.\nАко поново кликнете на „{{int:savearticle}}“, ваша измена ће бити сачувана без описа.",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Догодила се грешка приликом приказивања ваших измена.",
        "blockedtitle": "Корисник је блокиран",
-       "blockedtext": "<strong>Ð\92аÑ\88е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸Ð»Ð¸ Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана.</strong>\n\nÐ\91локиÑ\80аÑ\9aе Ñ\98е {{GENDER:$4|извÑ\80Ñ\88ио|извÑ\80Ñ\88ила}} $1.\nРазлог: <em>$2</em>.\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9eÐ\9fоÑ\88аÑ\99и Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
-       "autoblockedtext": "Ð\92аÑ\88а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ñ\98еÑ\80 Ñ\98Ñ\83 Ñ\98е Ñ\83поÑ\82Ñ\80ебÑ\99авао Ð´Ñ\80Ñ\83ги ÐºÐ¾Ñ\80иÑ\81ник, ÐºÐ¾Ð³Ð° Ñ\98е {{GENDER:$4|блокиÑ\80ао|блокиÑ\80ала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\n\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9eÐ\9fоÑ\88аÑ\99и Ð¿Ð¾Ñ\80Ñ\83кÑ\83 Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "blockedtext": "<strong>Ð\92аÑ\88е ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð¸Ð»Ð¸ Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана.</strong>\n\nÐ\91локиÑ\80аÑ\9aе Ñ\98е {{GENDER:$4|извÑ\80Ñ\88ио|извÑ\80Ñ\88ила}} $1.\nРазлог: <em>$2</em>.\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9eÐ\9fоÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу у [[Special:Preferences|подешавањима]].\nВаша блокирана ИП адреса је $3, а ID блокирања $5.\nНаведите све податке изнад при стварању било каквих упита.",
+       "autoblockedtext": "Ð\92аÑ\88а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81а Ñ\98е Ð±Ð»Ð¾ÐºÐ¸Ñ\80ана Ñ\98еÑ\80 Ñ\98Ñ\83 Ñ\98е Ñ\83поÑ\82Ñ\80ебÑ\99авао Ð´Ñ\80Ñ\83ги ÐºÐ¾Ñ\80иÑ\81ник, ÐºÐ¾Ð³Ð° Ñ\98е {{GENDER:$4|блокиÑ\80ао|блокиÑ\80ала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Ð\94аÑ\82Ñ\83м Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\9aа: $8\n* Ð\91локиÑ\80аÑ\9aе Ð¸Ñ\81Ñ\82иÑ\87е: $6\n* Ð\98ме ÐºÐ¾Ñ\80иÑ\81ника: $7\n\nÐ\9eбÑ\80аÑ\82иÑ\82е Ñ\81е {{GENDER:$4|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}} $1 Ð¸Ð»Ð¸ [[{{MediaWiki:Grouppage-sysop}}|админиÑ\81Ñ\82Ñ\80аÑ\82оÑ\80Ñ\83]] Ð´Ð° Ñ\80азÑ\98аÑ\81ниÑ\82е Ñ\81Ñ\82ваÑ\80.\n\nÐ\9dе Ð¼Ð¾Ð¶ÐµÑ\82е ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82 â\80\9eÐ\9fоÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83â\80\9c Ð°ÐºÐ¾ Ð½Ð¸Ñ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу у [[Special:Preferences|подешавањима]].\n\nВаша блокирана ИП адреса је $3, а ID $5.\nНаведите све податке изнад при стварању било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "За уређивање странице је потребно да будете $1.",
-       "confirmedittext": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ñ\81воÑ\98Ñ\83 Ðµ-адÑ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ñ\83Ñ\80еÑ\92иваÑ\9aа Ñ\81Ñ\82Ñ\80аниÑ\86а.\nÐ\9fоÑ\81Ñ\82авиÑ\82е Ð¸ Ð¿Ð¾Ñ\82вÑ\80диÑ\82е адресу преко [[Special:Preferences|подешавања]].",
+       "confirmedittext": "Ð\9cоÑ\80аÑ\82е Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ñ\81воÑ\98Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ñ\83Ñ\80еÑ\92иваÑ\9aа Ñ\81Ñ\82Ñ\80аниÑ\86а.\nÐ\9fоÑ\81Ñ\82авиÑ\82е Ð¸ Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ð¸Ð¼ÐµÑ\98л адресу преко [[Special:Preferences|подешавања]].",
        "nosuchsectiontitle": "Не могу да пронађем одељак",
        "nosuchsectiontext": "Покушали сте да уредите одељак који не постоји.\nМожда је премештен или обрисан док сте прегледали страницу.",
        "loginreqtitle": "Потребна је пријава",
        "protectedpagewarning": "<strong>Упозорење: ова страница је заштићена, тако да само администратори могу да је мењају.</strong>\nПоследњи запис у дневнику је приказан испод:",
        "semiprotectedpagewarning": "'''Напомена:''' ова страница је заштићена, тако да само регистровани корисници могу да је уређују.\nПоследњи запис у дневнику је приказан испод:",
        "cascadeprotectedwarning": "<strong>Упозорење:</strong> ова страница је заштићена тако да је могу уређивати само администратори, јер је она укључена у {{PLURAL:$1|следећу страницу која је|следеће странице које су}} заштићене „преносивом“ заштитом:",
-       "titleprotectedwarning": "'''Упозорење: ова страница је заштићена тако да је могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].'''",
+       "titleprotectedwarning": "<strong>Упозорење: ову страницу могу направити само корисници [[Special:ListGroupRights|с одређеним правима]].</strong>\nИспод су наведени последњи записи у дневнику:",
        "templatesused": "{{PLURAL:$1|Шаблон|Шаблони}} на овој страници:",
        "templatesusedpreview": "{{PLURAL:$1|Шаблон|Шаблони}} у овом прегледу:",
        "templatesusedsection": "{{PLURAL:$1|Шаблон|Шаблони}} у овом одељку:",
        "permissionserrors": "Грешка у дозволи",
        "permissionserrorstext": "Немате овлашћење за ову радњу из {{PLURAL:$1|1=следећег|следећих}} разлога:",
        "permissionserrorstext-withaction": "Немате дозволу за $2 из {{PLURAL:$1|следећег|следећих}} разлога:",
-       "recreate-moveddeleted-warn": "'''Упозорење: поново правите страницу која је претходно обрисана.'''\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
+       "recreate-moveddeleted-warn": "<strong>Упозорење: поново правите страницу која је претходно обрисана.</strong>\n\nРазмотрите да ли је прикладно да наставите с уређивањем ове странице.\nОвде је наведена историја брисања и премештања с образложењем:",
        "moveddeleted-notice": "Ова страница је обрисана.\nИсторија њеног брисања и премештања налази се испод:",
        "moveddeleted-notice-recent": "Жао нам је, ова страница је недавно обрисана (у последњих 24 сата).\nОвде је наведена историја брисања и премештања с образложењем.",
        "log-fulllog": "Погледај целу историју",
        "parser-template-recursion-depth-warning": "Дубина укључивања шаблона је прекорачена ($1)",
        "language-converter-depth-warning": "Прекорачена је граница дубине језичког претварача ($1)",
        "node-count-exceeded-category": "Странице у којима је прекорачен број чворова",
-       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86а Ñ\98е Ð¿Ñ\80екоÑ\80аÑ\87ила Ð±Ñ\80оÑ\98 Ñ\87воÑ\80ова.",
+       "node-count-exceeded-category-desc": "СÑ\82Ñ\80аниÑ\86е Ñ\81а Ð¿Ñ\80евиÑ\88е Ñ\87воÑ\80ова (node).",
        "node-count-exceeded-warning": "Страница у којој је прекорачен број чворова",
        "expansion-depth-exceeded-category": "Странице у којима је прекорачена дубина проширења",
        "expansion-depth-exceeded-category-desc": "Страница је прекорачила највећу дубину проширења.",
        "revdelete-selected-text": "{{PLURAL:$1|Изабрана измена|Изабране измене}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Изабрана верзија датотеке|Изабране верзије датотеке}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Изабрана ставка у историји|Изабране ставке у историји}}:",
-       "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступну.",
-       "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступну.",
-       "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступну.",
+       "revdelete-text-text": "Избрисане измене ће и даље бити видљиве у историји странице, али делови њиховог садржаја неће бити јавно доступни.",
+       "revdelete-text-file": "Избрисане верзије датотеке ће и даље бити видљиве у историји датотеке, али делови њиховог садржаја неће бити јавно доступни.",
+       "logdelete-text": "Избрисани уноси у дневницима ће и даље бити видљиви у дневницима, али делови њиховог садржаја неће бити јавно доступни.",
        "revdelete-text-others": "Остали администратори ће и даље моћи да приступе скривеном садржају и врате га, осим ако се поставе додатна ограничења.",
        "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "revdelete-suppress-text": "Сакривање измена би требало користити <strong>само</strong> у следећим случајевима:\n* злонамерни или погрдни подаци\n* неприкладни лични подаци\n*: <em>кућна адреса и број телефона, број кредитне картице, ЈМБГ итд.</em>",
        "prefs-watchlist-token": "Жетон списка надгледања:",
        "prefs-misc": "Друга подешавања",
        "prefs-resetpass": "Промени лозинку",
-       "prefs-changeemail": "Ð\9fÑ\80омени Ð¸Ð»Ð¸ Ñ\83клони Ðµ-адресу",
-       "prefs-setemail": "Ð\9fоÑ\81Ñ\82ави Ðµ-адресу",
-       "prefs-email": "Ð\9fоÑ\81Ñ\82авке Ðµ-поÑ\88Ñ\82е",
+       "prefs-changeemail": "Ð\9fÑ\80омени Ð¸Ð»Ð¸ Ñ\83клони Ð¸Ð¼ÐµÑ\98л адресу",
+       "prefs-setemail": "Ð\9fоÑ\81Ñ\82ави Ð¸Ð¼ÐµÑ\98л адресу",
+       "prefs-email": "Ð\9fоÑ\81Ñ\82авке Ð¸Ð¼ÐµÑ\98ла",
        "prefs-rendering": "Изглед",
        "saveprefs": "Сачувај",
        "restoreprefs": "Врати све на подразумевано (у свим одељцима)",
        "timezoneregion-europe": "Европа",
        "timezoneregion-indian": "Индијски океан",
        "timezoneregion-pacific": "Тихи океан",
-       "allowemail": "Ð\9eмогÑ\83Ñ\9bи Ð¿Ñ\80имаÑ\9aе Ðµ-поÑ\80Ñ\83ка од других корисника",
+       "allowemail": "Ð\9eмогÑ\83Ñ\9bи Ð¿Ñ\80имаÑ\9aе Ð¸Ð¼ÐµÑ\98ла од других корисника",
        "prefs-searchoptions": "Претрага",
        "prefs-namespaces": "Именски простори",
        "default": "подразумевано",
        "prefs-files": "Датотеке",
        "prefs-custom-css": "Прилагођени CSS",
        "prefs-custom-js": "Прилагођени јаваскрипт",
-       "prefs-common-css-js": "Дељени CSS/јаваскрипт за све теме:",
+       "prefs-common-css-js": "Дељени CSS/Јаваскрипт за све теме:",
        "prefs-reset-intro": "Можете користити ову страницу да поништите своје поставке на подразумеване вредности.\nОва радња се не може вратити.",
-       "prefs-emailconfirm-label": "Ð\9fоÑ\82вÑ\80да Ðµ-адÑ\80еÑ\81е:",
-       "youremail": "Ð\95-адÑ\80еÑ\81а:",
+       "prefs-emailconfirm-label": "Ð\9fоÑ\82вÑ\80да Ð¸Ð¼ÐµÑ\98ла:",
+       "youremail": "Ð\98меÑ\98л:",
        "username": "{{GENDER:$1|Корисничко име}}:",
        "prefs-memberingroups": "{{PLURAL:$1|Група|Групе}}:",
        "prefs-memberingroups-type": "$1",
-       "prefs-registration": "Ð\92Ñ\80еме Ñ\83пиÑ\81а:",
+       "prefs-registration": "Ð\92Ñ\80еме Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\98е:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Право име:",
        "yourlanguage": "Језик:",
        "gender-male": "Он уређује вики странице",
        "gender-female": "Она уређује вики странице",
        "prefs-help-gender": "Необавезно: користи се за исправно обраћање софтвера корисницима, зависно од њиховог пола.\nОвај податак ће бити јаван.",
-       "email": "Ð\95-адÑ\80еÑ\81а",
+       "email": "Ð\98меÑ\98л",
        "prefs-help-realname": "Право име није обавезно.\nАко изаберете да га унесете, оно ће бити коришћено за приписивање вашег рада.",
-       "prefs-help-email": "Ð\95-адреса није обавезна, али је потребна у случају да заборавите лозинку.",
+       "prefs-help-email": "Ð\98меÑ\98л адреса није обавезна, али је потребна у случају да заборавите лозинку.",
        "prefs-help-email-others": "Можете је користити и да омогућите другима да вас контактирају преко корисничке странице или странице за разговор, без откривања свог идентитета.",
-       "prefs-help-email-required": "Ð\9fоÑ\82Ñ\80ебна Ñ\98е Ðµ-адреса.",
+       "prefs-help-email-required": "Ð\9fоÑ\82Ñ\80ебна Ñ\98е Ð¸Ð¼ÐµÑ\98л адреса.",
        "prefs-info": "Основни подаци",
        "prefs-i18n": "Интернационализација",
        "prefs-signature": "Потпис",
        "prefs-help-prefershttps": "Ова подешавања ће ступити на снагу при следећој пријави.",
        "prefswarning-warning": "Променили сте ваша подешавања али нисте их још сачували.\nАко не притиснете „$1“ ваша подешавања ће бити изгубљена.",
        "prefs-tabs-navigation-hint": "Савет: можете користити типке са левом и десном стрелицом за кретање кроз картице.",
-       "email-address-validity-valid": "Е-адреса је исправна",
-       "email-address-validity-invalid": "Унесите исправну е-адресу",
        "userrights": "Управљање корисничким правима",
        "userrights-lookup-user": "Управљање корисничким групама",
        "userrights-user-editname": "Корисничко име:",
        "right-viewsuppressed": "прегледање измена скривених од свих корисника",
        "right-suppressionlog": "прегледање приватних дневника",
        "right-block": "блокирање даљих измена других корисника",
-       "right-blockemail": "онемогÑ\83Ñ\9bаваÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ð´Ð° Ñ\88аÑ\99Ñ\83 Ðµ-поÑ\80Ñ\83ке",
+       "right-blockemail": "онемогÑ\83Ñ\9bаваÑ\9aе ÐºÐ¾Ñ\80иÑ\81ниÑ\86има Ð´Ð° Ñ\88аÑ\99Ñ\83 Ð¸Ð¼ÐµÑ\98лове",
        "right-hideuser": "блокирање корисничког имена и његово сакривање од јавности",
        "right-ipblock-exempt": "заобилажење блокирања ИП адресе, аутоматска блокирања и блокирања опсега",
        "right-proxyunbannable": "заобилажење аутоматских блокирања посредника",
        "right-viewmywatchlist": "види сопствени списак надгледања",
        "right-editmywatchlist": "уређивање сопственог списка надгледања; неке предузете радње ће свеједно додати странице на списак и без овог права",
        "right-viewmyprivateinfo": "видите своје личне податке (нпр. адресу е-поште, право име)",
-       "right-editmyprivateinfo": "Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81опÑ\81Ñ\82вениÑ\85 Ð»Ð¸Ñ\87ниÑ\85 Ð¿Ð¾Ð´Ð°Ñ\82ака (нпÑ\80. Ð°Ð´Ñ\80еÑ\81Ñ\83 Ðµ-поÑ\88Ñ\82е, право име)",
+       "right-editmyprivateinfo": "Ñ\83Ñ\80еÑ\92иваÑ\9aе Ñ\81опÑ\81Ñ\82вениÑ\85 Ð»Ð¸Ñ\87ниÑ\85 Ð¿Ð¾Ð´Ð°Ñ\82ака (нпÑ\80. Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81а, право име)",
        "right-editmyoptions": "уређивање сопствених подешавања",
        "right-rollback": "брзо враћање измена последњег корисника који је мењао одређену страницу",
        "right-markbotedits": "означавање враћених измена као измене бота",
        "right-userrights-interwiki": "уређивање корисничких права на другим викијима",
        "right-siteadmin": "закључавање и откључавање базе података",
        "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза",
-       "right-sendemail": "Ñ\81лаÑ\9aе Ðµ-поÑ\80Ñ\83ка другим корисницима",
+       "right-sendemail": "Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98ла другим корисницима",
        "right-passwordreset": "прегледање порука за обнављање лозинке",
        "right-managechangetags": "прављење и/или брисање [[Special:Tags|ознака]] из базе података",
        "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене",
        "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
        "newuserlogpage": "Дневник нових корисника",
-       "newuserlogpagetext": "Ð\9eво Ñ\98е Ð¸Ñ\81Ñ\82оÑ\80иÑ\98а нових корисника.",
+       "newuserlogpagetext": "Ð\9eво Ñ\98е Ð´Ð½ÐµÐ²Ð½Ð¸Ðº нових корисника.",
        "rightslog": "Дневник корисничких права",
        "rightslogtext": "Ово је дневник измена корисничких права.",
        "action-read": "читање ове странице",
        "action-userrights": "уређивање свих корисничких права",
        "action-userrights-interwiki": "уређивање корисничких права на другим викијима",
        "action-siteadmin": "закључавање или откључавање базе података",
-       "action-sendemail": "Ñ\81лаÑ\9aе Ðµ-поÑ\80Ñ\83ка",
+       "action-sendemail": "Ñ\81лаÑ\9aе Ð¸Ð¼ÐµÑ\98лова",
        "action-editmywatchlist": "измену сопственог списак надгледања",
        "action-viewmywatchlist": "преглед вашег списак надгледања",
        "action-viewmyprivateinfo": "прегледање ваших личних података",
        "recentchanges-label-plusminus": "Промена величине странице у бајтовима",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|списак нових страница]])",
+       "recentchanges-submit": "Прикажи",
        "rcnotefrom": "Испод {{PLURAL:$5|је измена|су измене}} од <strong>$3, $4</strong> (до <strong>$1</strong> приказано).",
        "rclistfrom": "Прикажи нове измене почев од $2 $3",
        "rcshowhideminor": "$1 мање измене",
        "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|корисник надгледа|корисника надгледају|корисника надгледају}}]",
        "rc_categories": "Ограничи на категорије (раздвоји с усправном цртом):",
-       "rc_categories_any": "Све",
+       "rc_categories_any": "Сви Ð¸Ð·Ð°Ð±Ñ\80ани",
        "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|бајт|бајта|бајтова}} после измене",
        "newsectionsummary": "/* $1 */ нови одељак",
        "upload-too-many-redirects": "Адреса садржи превише преусмерења",
        "upload-http-error": "Дошло је до HTTP грешке: $1",
        "upload-copy-upload-invalid-domain": "Примерци отпремања нису доступни на овом домену.",
+       "upload-dialog-title": "Отпремање датотека",
        "upload-dialog-button-cancel": "Откажи",
        "upload-dialog-button-done": "Готово",
        "upload-dialog-button-save": "Сачувај",
        "mostrevisions": "Странице с највише измена",
        "prefixindex": "Све странице с префиксом",
        "prefixindex-namespace": "Све странице с предметком (именски простор $1)",
+       "prefixindex-submit": "Прикажи",
        "prefixindex-strip": "Сакриј префикс у списку",
        "shortpages": "Кратке странице",
        "longpages": "Дугачке странице",
        "usereditcount": "$1 {{PLURAL:$1|измена|измене|измена}}",
        "usercreated": "{{GENDER:$3|је направио|је направила|је направио}} дана $1 у $2",
        "newpages": "Нове странице",
+       "newpages-submit": "Прикажи",
        "newpages-username": "Корисничко име:",
        "ancientpages": "Најстарије странице",
        "move": "премести",
        "nopagetext": "Тражена страница не постоји.",
        "pager-newer-n": "{{PLURAL:$1|новији 1|новија $1|новијих $1}}",
        "pager-older-n": "{{PLURAL:$1|старији 1|старијих $1}}",
-       "suppress": "Ð\9dадзоÑ\80",
+       "suppress": "РевизиÑ\98а",
        "querypage-disabled": "Ова посебна страница је онемогућена ради побољшања перформанси.",
        "apihelp": "API помоћ",
        "apihelp-no-such-module": "Модул „$1“ није пронађен.",
        "specialloguserlabel": "Извршилац:",
        "speciallogtitlelabel": "Циљ (наслов или {{ns:user}}:корисничко име):",
        "log": "Дневници",
+       "logeventslist-submit": "Прикажи",
        "all-logs-page": "Сви јавни дневници",
        "alllogstext": "Скупни приказ свих доступних историја овог викија.\nМожете сузити приказ одабирући врсту историје, корисничког имена или тражене странице.",
-       "logempty": "Ð\9dема Ð¿Ñ\80онаÑ\92ениÑ\85 Ñ\81Ñ\82авки Ñ\83 Ð¸Ñ\81Ñ\82оÑ\80иÑ\98и.",
+       "logempty": "Ð\9dема Ð¿Ñ\80онаÑ\92ениÑ\85 Ñ\83ноÑ\81а Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83.",
        "log-title-wildcard": "Тражи наслове који почињу с овим текстом",
        "showhideselectedlogentries": "Прикажи/сакриј изабране догађаје",
        "log-edit-tags": "Уреди ознаке изабраних уноса у дневницима",
        "cachedspecial-viewing-cached-ts": "Гледате кеширану верзију ове странице, која може да се разликује од тренутне.",
        "cachedspecial-refresh-now": "Погледај најновију.",
        "categories": "Категоријe",
+       "categories-submit": "Прикажи",
        "categoriespagetext": "{{PLURAL:$1|1=Следећа категорија садржи|Следеће категорије садрже}} странице или датотеке.\n[[Special:UnusedCategories|Некоришћене категорије]] нису приказане овде.\nПогледајте и [[Special:WantedCategories|тражене категорије]].",
        "categoriesfrom": "Прикажи категорије почев од:",
        "special-categories-sort-count": "поређај по броју",
        "listgrouprights-namespaceprotection-namespace": "Именски простор",
        "listgrouprights-namespaceprotection-restrictedto": "Права потребна за уређивање",
        "trackingcategories": "Медијавики категорије",
+       "trackingcategories-summary": "Ова посебна страница је списак категорија које су део Медијавикија, оне се аутоматски ажурирају и њихови називи се могу мењањати уређивањем системских порука у именском простору {{ns:8}}.",
        "trackingcategories-name": "Име поруке",
        "trackingcategories-desc": "Које странице се налазе у категорији",
        "noindex-category-desc": "Странице које у себи имају магичну реч <code><nowiki>__NOINDEX__</nowiki></code>.",
        "trackingcategories-nodesc": "Опис није доступан.",
        "trackingcategories-disabled": "Категорија је онемогућена",
        "mailnologin": "Нема адресе за слање",
-       "mailnologintext": "Ð\9cоÑ\80аÑ\82е Ð±Ð¸Ñ\82и [[Special:UserLogin|пÑ\80иÑ\98авÑ\99ени]] Ð¸ Ð¸Ð¼Ð°Ñ\82и Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адÑ\80еÑ\81Ñ\83 Ñ\83 [[Special:Preferences|подеÑ\88аваÑ\9aима]] Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\81лали Ðµ-поÑ\80Ñ\83ке другим корисницима.",
-       "emailuser": "Ð\9fоÑ\88аÑ\99и Ðµ-поÑ\80Ñ\83кÑ\83",
-       "emailuser-title-target": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке {{GENDER:$1|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и|коÑ\80иÑ\81никÑ\83}}",
-       "emailuser-title-notarget": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ке кориснику",
-       "emailpagetext": "Ð\9cожеÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð´Ð¾Ñ\9aи Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83кÑ\83 {{GENDER:$1|овом ÐºÐ¾Ñ\80иÑ\81никÑ\83|овоÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\86и}}.\nÐ\95-адÑ\80еÑ\81а ÐºÐ¾Ñ\98Ñ\83 сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
-       "defemailsubject": "{{SITENAME}} â\80\94 Ð\95-поÑ\88Ñ\82а од {{GENDER:$1|корисника|кориснице}} $1",
+       "mailnologintext": "Ð\9cоÑ\80аÑ\82е Ð±Ð¸Ñ\82и [[Special:UserLogin|пÑ\80иÑ\98авÑ\99ени]] Ð¸ Ð¸Ð¼Ð°Ñ\82и Ð¸Ñ\81пÑ\80аван Ð¸Ð¼ÐµÑ\98л Ñ\83 [[Special:Preferences|подеÑ\88аваÑ\9aима]] Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\81лали Ð¸Ð¼ÐµÑ\98лове другим корисницима.",
+       "emailuser": "Ð\9fоÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л",
+       "emailuser-title-target": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла {{GENDER:$1|коÑ\80иÑ\81никÑ\83|коÑ\80иÑ\81ниÑ\86и}}",
+       "emailuser-title-notarget": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла кориснику",
+       "emailpagetext": "Ð\9cожеÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð´Ð¾Ñ\9aи Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ð¸Ð¼ÐµÑ\98л {{GENDER:$1|овом ÐºÐ¾Ñ\80иÑ\81никÑ\83|овоÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\86и}}.\nÐ\98меÑ\98л ÐºÐ¾Ñ\98и сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.",
+       "defemailsubject": "{{SITENAME}} â\80\94 Ð\98меÑ\98л од {{GENDER:$1|корисника|кориснице}} $1",
        "usermaildisabled": "Корисничка е-пошта је онемогућена",
-       "usermaildisabledtext": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83ке другим корисницима на овом викију",
-       "noemailtitle": "Ð\9dема Ðµ-адресе",
-       "noemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ð½Ð¸Ñ\98е Ð½Ð°Ð²ÐµÐ¾ Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу.",
-       "nowikiemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ñ\98е Ð¾Ð´Ð»Ñ\83Ñ\87ио Ð´Ð° Ð½Ðµ Ð¿Ñ\80има Ðµ-поÑ\80Ñ\83ке од других корисника.",
+       "usermaildisabledtext": "Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ñ\88аÑ\99еÑ\82е Ð¸Ð¼ÐµÑ\98лове другим корисницима на овом викију",
+       "noemailtitle": "Ð\9dема Ð¸Ð¼ÐµÑ\98л адресе",
+       "noemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ð½Ð¸Ñ\98е Ð½Ð°Ð²ÐµÐ¾ Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу.",
+       "nowikiemailtext": "Ð\9eваÑ\98 ÐºÐ¾Ñ\80иÑ\81ник Ñ\98е Ð¾Ð´Ð»Ñ\83Ñ\87ио Ð´Ð° Ð½Ðµ Ð¿Ñ\80има Ð¸Ð¼ÐµÑ\98лове од других корисника.",
        "emailnotarget": "Непостојеће или неисправно корисничко име примаоца.",
        "emailtarget": "Унос корисничког имена примаоца",
        "emailusername": "Корисничко име:",
        "emailusernamesubmit": "Пошаљи",
-       "email-legend": "СлаÑ\9aе Ðµ-поÑ\80Ñ\83ка другом кориснику",
+       "email-legend": "СлаÑ\9aе Ð¸Ð¼ÐµÑ\98ла другом кориснику",
        "emailfrom": "Од:",
        "emailto": "За:",
        "emailsubject": "Наслов:",
        "emailmessage": "Порука:",
        "emailsend": "Пошаљи",
-       "emailccme": "Пошаљи ми копију поруке на моју е-пошту.",
+       "emailccme": "Пошаљи ми копију поруке на мој имејл.",
        "emailccsubject": "Копија ваше поруке кориснику $1: $2",
        "emailsent": "Порука је послата",
-       "emailsenttext": "Ваша е-порука је послата.",
-       "emailuserfooter": "Ову е-поруку је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
+       "emailsenttext": "Ваш имејл је послат.",
+       "emailuserfooter": "Овај имејл је {{GENDER:$1|послао|послала}} $1 {{GENDER:$2|кориснику|корисници}} $2 помоћу „{{int:emailuser}}“ с викија {{SITENAME}}.",
        "usermessage-summary": "Слање системске поруке.",
        "usermessage-editor": "Уређивач системских порука",
        "usermessage-template": "MediaWiki:UserMessage",
        "notanarticle": "Није страница са садржајем",
        "notvisiblerev": "Измена је обрисана",
        "watchlist-details": "Имате {{PLURAL:$1|$1 страница|$1 странице|$1 страница}} на вашем списку надгледања, не рачунајући странице за разговор.",
-       "wlheader-enotif": "Ð\9eбавеÑ\88Ñ\82еÑ\9aе Ðµ-поÑ\80Ñ\83ком је омогућено.",
+       "wlheader-enotif": "Ð\9eбавеÑ\88Ñ\82еÑ\9aе Ð¸Ð¼ÐµÑ\98лом је омогућено.",
        "wlheader-showupdated": "Странице које су измењене откад сте их последњи пут посетили су '''подебљане'''.",
        "wlnote": "Испод {{PLURAL:$1|је последња измена|су последње <strong>$1</strong> измене|је последњих <strong>$1</strong> измена}} у {{PLURAL:$2|претходном сату|претходна <strong>$2</strong> сата|претходних <strong>$2</strong> сати}}, закључно са $3, $4.",
        "wlshowlast": "Прикажи последњих $1 сати, $2 дана",
+       "watchlistall2": "све",
+       "watchlist-hide": "Сакриј",
+       "watchlist-submit": "Прикажи",
+       "wlshowtime": "Период за приказ:",
+       "wlshowhideminor": "мање измене",
+       "wlshowhidebots": "ботове",
+       "wlshowhideliu": "регистроване кориснике",
+       "wlshowhideanons": "анонимне кориснике",
+       "wlshowhidepatr": "патролиране измене",
+       "wlshowhidemine": "моје измене",
        "watchlist-options": "Поставке списка надгледања",
        "watching": "Надгледање…",
        "unwatching": "Прекидање надгледања…",
        "delete-confirm": "Брисање странице „$1“",
        "delete-legend": "Обриши",
        "historywarning": "<strong>Упозорење:</strong> страница коју желите да обришете има историју са $1 {{PLURAL:$1|изменом|измене|измена}}:",
+       "historyaction-submit": "Прикажи",
        "confirmdeletetext": "Управо ћете обрисати страницу, укључујући и њену историју.\nПотврдите своју намеру, да разумете последице и да ово радите у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "actioncomplete": "Радња је завршена",
        "actionfailed": "Радња није успела",
        "logentry-contentmodel-change-revert": "врати",
        "protectlogpage": "Дневник закључавања",
        "protectlogtext": "Испод је списак заштићених страница.\nПогледајте [[Special:ProtectedPages|списак заштићених страница]] за више детаља.",
-       "protectedarticle": "{{GENDER:|је заштитио|је заштитила}} „[[$1]]“",
+       "protectedarticle": "је заштитио „[[$1]]“",
        "modifiedarticleprotection": "је променио степен заштите за „[[$1]]“",
        "unprotectedarticle": "је скинуо заштиту са странице „[[$1]]“",
        "movedarticleprotection": "је преместио поставке заштите са „[[$2]]“ на „[[$1]]“",
        "contributions": "{{GENDER:$1|Кориснички}} доприноси",
        "contributions-title": "Доприноси {{GENDER:$1|корисника|кориснице}} $1",
        "mycontris": "Доприноси",
+       "anoncontribs": "Доприноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Кориснички налог „$1“ није регистрован.",
        "nocontribs": "Нема измена које одговарају наведеним критеријумима.",
        "whatlinkshere-hidelinks": "$1 везе",
        "whatlinkshere-hideimages": "$1 везе до датотеке",
        "whatlinkshere-filters": "Филтери",
+       "whatlinkshere-submit": "Иди",
        "autoblockid": "Аутоматско блокирање #$1",
        "block": "Блокирај корисника",
-       "unblock": "Ð\94еблокиÑ\80аÑ\98 корисника",
+       "unblock": "Ð\94еблокиÑ\80аÑ\9aе корисника",
        "blockip": "Блокирај {{GENDER:$1|корисника|корисницу}}",
        "blockip-legend": "Блокирај корисника",
        "blockiptext": "Користите доњи образац да бисте забранили приступ за писање с одређене ИП адресе или корисничког имена.\nОво би требало да вршите само ради спречавања вандализма, у складу са [[{{MediaWiki:Policy-url}}|смерницама]].\nИзаберите конкретан разлог испод (пример: навођење конкретних страница које су вандализоване).",
        "ipbreason-dropdown": "*Најчешћи разлози за блокирање\n** Уношење лажних информација\n** Уклањање садржаја са страница\n** Постављање веза до спољашњих сајтова\n** Уношење бесмислица у странице\n** Непристојно понашање\n** Употреба више налога\n** Неприхватљиво корисничко име",
        "ipb-hardblock": "Онемогући пријављеним корисницима да уређују с ове ИП адресе",
        "ipbcreateaccount": "Онемогући отварање налога",
-       "ipbemailban": "Ð\9eнемогÑ\83Ñ\9bи ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ð´Ð° Ñ\88аÑ\99е Ðµ-поÑ\80Ñ\83ке",
+       "ipbemailban": "Ð\9eнемогÑ\83Ñ\9bи ÐºÐ¾Ñ\80иÑ\81никÑ\83 Ð´Ð° Ñ\88аÑ\99е Ð¸Ð¼ÐµÑ\98лове",
        "ipbenableautoblock": "Аутоматски блокирај последњу ИП адресу овог корисника и све даљње адресе с којих покуша да уређује",
        "ipbsubmit": "Блокирај овог корисника",
        "ipbother": "Друго време:",
        "ipb-confirmaction": "Ако сте сигурни да желите наставити означите поље „{{int:ipb-confirm}}“ на дну странице.",
        "ipb-edit-dropdown": "Уреди разлоге блокирања",
        "ipb-unblock-addr": "Деблокирај $1",
-       "ipb-unblock": "Деблокирај корисничко име или ИП адресу",
+       "ipb-unblock": "Деблокирај корисничко име или IP адресу",
        "ipb-blocklist": "Погледај постојећа блокирања",
        "ipb-blocklist-contribs": "Доприноси за {{GENDER:$1|$1}}",
        "unblockip": "Деблокирај корисника",
        "unblocklink": "деблокирај",
        "change-blocklink": "промени блокирање",
        "contribslink": "доприноси",
-       "emaillink": "поÑ\88аÑ\99и Ðµ-поÑ\80Ñ\83кÑ\83",
+       "emaillink": "поÑ\88аÑ\99и Ð¸Ð¼ÐµÑ\98л",
        "autoblocker": "Аутоматски сте блокирани јер делите ИП адресу с корисником/цом [[User:$1|$1]].\nРазлог блокирања: „$2“",
        "blocklogpage": "Дневник блокирања",
        "blocklog-showlog": "{{GENDER:$1|Овај корисник је раније блокиран|Ова корисница је раније блокирана}}.\nИсторија блокирања се налази испод:",
        "move-page-legend": "Премештање странице",
        "movepagetext": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови наслов.\nМожете аутоматски изменити преусмерење до изворног наслова.\nПогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где би требало да иду.\n\nСтраница '''неће''' бити премештена ако већ постоји страница с тим именом, осим ако је она празна, садржи преусмерење или нема историју измена.\nТо значи да можете вратити страницу на претходно место ако погрешите, али не можете заменити постојећу страницу.\n\n'''Пажња!'''\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.",
        "movepagetext-noredirectfixer": "Доњи образац ће преименовати страницу, премештајући целу историју на ново име.\nСтари наслов постаће преусмерење на нови наслов.\nПогледајте [[Special:DoubleRedirects|двострука]] или [[Special:BrokenRedirects|покварена]] преусмерења.\nНа вама је одговорност да везе и даље иду тамо где би требало да иду.\n\nСтраница '''неће''' бити премештена ако већ постоји страница с тим именом, осим ако је она празна, садржи преусмерење или нема историју измена.\nТо значи да можете вратити страницу на претходно место ако погрешите, али не можете заменити постојећу страницу.\n\n'''Пажња!'''\nОво може представљати драстичну и неочекивану измену за популарну страницу;\nдобро размислите о последицама пре него што наставите.",
-       "movepagetalktext": "Ð\9eдговаÑ\80аÑ\98Ñ\83Ñ\9bа Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ñ\80азговоÑ\80, Ð°ÐºÐ¾ Ð¿Ð¾Ñ\81Ñ\82оÑ\98и, Ð±Ð¸Ñ\9bе Ð°Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð¿Ñ\80емеÑ\88Ñ\82ена Ð·Ð°Ñ\98едно Ñ\81 Ñ\9aом, Ð¾Ñ\81им Ð°ÐºÐ¾:\n*Ð\92еÑ\9b Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ñ\80азговоÑ\80 Ñ\81 Ð½Ð¾Ð²Ð¸Ð¼ Ð½Ð°Ñ\81ловом, Ð¸Ð»Ð¸\n*Ð\90ко Ñ\98е Ð¾Ð·Ð½Ð°Ñ\87ено Ð´Ð¾Ð»ÐµÐ½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾ Ð¿Ð¾Ñ\99е.\n\nУ Ð¾Ð²Ð¾Ð¼ Ñ\81лÑ\83Ñ\87аÑ\98Ñ\83 Ð¼Ð¾Ñ\80а Ñ\80Ñ\83Ñ\87но Ð´Ð° Ñ\81е Ð¿Ñ\80емеÑ\81Ñ\82и Ð¸Ð»Ð¸ Ñ\81поÑ\98и, ако има потребе за тим.",
+       "movepagetalktext": "Ð\90ко Ñ\81Ñ\82е Ð¾Ð·Ð½Ð°Ñ\87или Ð¾Ð²Ð°Ñ\98 ÐºÐ²Ð°Ð´Ñ\80аÑ\82иÑ\9b, Ð¾Ð´Ð³Ð¾Ð²Ð°Ñ\80аÑ\98Ñ\83Ñ\9bа Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ñ\80азговоÑ\80 Ð±Ð¸Ñ\9bе Ð°Ñ\83Ñ\82омаÑ\82Ñ\81ки Ð¿Ñ\80емеÑ\88Ñ\82ена Ð½Ð° Ð½Ð¾Ð²Ð¸ Ð½Ð°Ñ\81лов, Ð¾Ñ\81им Ð°ÐºÐ¾ Ð²ÐµÑ\9b Ð¿Ð¾Ñ\81Ñ\82оÑ\98и Ñ\81Ñ\82Ñ\80аниÑ\86а Ð·Ð° Ñ\80азговоÑ\80 Ñ\81а Ð¸Ñ\81Ñ\82им Ð½Ð°Ñ\81ловом.\n\nУ Ñ\82ом Ñ\81лÑ\83Ñ\87аÑ\98Ñ\83, Ð¼Ð¾Ñ\80аÑ\9bеÑ\82е Ñ\80Ñ\83Ñ\87но Ð´Ð° Ñ\98е Ð¿Ñ\80емеÑ\81Ñ\82иÑ\82е Ð¸Ð»Ð¸ Ñ\81поÑ\98иÑ\82е, ако има потребе за тим.",
        "moveuserpage-warning": "'''Упозорење:''' на путу сте да преместите корисничку страницу. Имајте у виду да ће само страница бити премештена, а сам корисник ''неће'' бити преименован.",
        "movecategorypage-warning": "<strong>Упозорење:</strong> премештате страницу категорије. Имајте на уму да ће само страница бити премештена и да све странице у старој категорији <em>неће</em> бити рекатегорисане у нову категорију.",
        "movenologintext": "Морате да будете регистровани и [[Special:UserLogin|пријављени]] да бисте премештали странице.",
        "movenosubpage": "Ова страница нема подстрана.",
        "movereason": "Разлог:",
        "revertmove": "врати",
-       "delete_and_move": "Обриши и премести",
        "delete_and_move_text": "== Потребно брисање ==\n\nОдредишна страница „[[:$1]]“ већ постоји. \nЖелите ли да је обришете да бисте ослободили место за премештање?",
        "delete_and_move_confirm": "Да, обриши страницу",
        "delete_and_move_reason": "Обрисано да се ослободи место за премештање из „[[$1]]“",
        "tooltip-pt-preferences": "Ваша подешавања",
        "tooltip-pt-watchlist": "Списак страница које надгледате",
        "tooltip-pt-mycontris": "Списак ваших доприноса",
+       "tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе",
        "tooltip-pt-login": "Препоручујемо вам да се пријавите, иако то није обавезно.",
        "tooltip-pt-logout": "Одјавите се",
        "tooltip-pt-createaccount": "Охрабрујемо вас да отворите налог и пријавите се али то није обавезно",
        "tooltip-feed-rss": "RSS довод ове странице",
        "tooltip-feed-atom": "Атом довод ове странице",
        "tooltip-t-contributions": "Погледајте списак доприноса овог корисника",
-       "tooltip-t-emailuser": "Ð\9fоÑ\88аÑ\99иÑ\82е Ðµ-поÑ\80Ñ\83кÑ\83 овом кориснику",
+       "tooltip-t-emailuser": "Ð\9fоÑ\88аÑ\99иÑ\82е Ð¸Ð¼ÐµÑ\98л овом кориснику",
        "tooltip-t-info": "Више информација о овој страници",
        "tooltip-t-upload": "Пошаљите датотеке",
        "tooltip-t-specialpages": "Списак свих посебних страница",
        "creditspage": "Аутори странице",
        "nocredits": "Не постоје подаци о аутору ове странице.",
        "spamprotectiontitle": "Филтер за заштиту од непожељних порука",
-       "spamprotectiontext": "Филтера против нежељених порука је блокирао чување ове странице.\nОво је вероватно изазвано везом до спољашњег сајта који се налази на црној листи.",
+       "spamprotectiontext": "Филтера против нежељених порука је блокирао чување ове странице.\nОво је вероватно изазвано везом до спољашњег сајта који се налази на црном списку.",
        "spamprotectionmatch": "Следећи текст је активирао наш филтер за нежељене поруке: $1",
        "spambot_username": "Чишћење непожељних порука у Медијавикији",
        "spam_reverting": "Враћам на последњу измену која не садржи везе до $1",
        "exif-urgency-other": "Прилагођени приоритет ($1)",
        "namespacesall": "сви",
        "monthsall": "све",
-       "confirmemail": "Ð\9fоÑ\82вÑ\80да Ðµ-адресе",
-       "confirmemail_noemail": "Ð\9dиÑ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ðµ-адресу у [[Special:Preferences|подешавањима]].",
-       "confirmemail_text": "{{SITENAME}} Ð·Ð°Ñ\85Ñ\82ева Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ðµ-адÑ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\87неÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ðµ-поÑ\88Ñ\82е.\nÐ\9aликниÑ\82е Ð½Ð° Ð´Ñ\83гме Ð¸Ñ\81под Ð·Ð° Ñ\81лаÑ\9aе Ð¿Ð¾Ñ\80Ñ\83ке Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ðµ-адÑ\80еÑ\81Ñ\83.\nУ Ð¿Ð¾Ñ\80Ñ\83Ñ\86и Ñ\9bе Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸Ñ\82и Ð²ÐµÐ·Ð° Ñ\81 Ð¿Ð¾Ñ\82вÑ\80дним ÐºÐ¾Ð´Ð¾Ð¼;\nÑ\83неÑ\81иÑ\82е Ñ\98е Ñ\83 Ð¿Ñ\80егледаÑ\87 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ñ\98е Ð²Ð°Ñ\88а Ðµ-адреса исправна.",
+       "confirmemail": "Ð\9fоÑ\82вÑ\80да Ð¸Ð¼ÐµÑ\98л адресе",
+       "confirmemail_noemail": "Ð\9dиÑ\81Ñ\82е Ñ\83нели Ð¸Ñ\81пÑ\80авнÑ\83 Ð¸Ð¼ÐµÑ\98л адресу у [[Special:Preferences|подешавањима]].",
+       "confirmemail_text": "{{SITENAME}} Ð·Ð°Ñ\85Ñ\82ева Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80диÑ\82е Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð¿Ñ\80е Ð½ÐµÐ³Ð¾ Ñ\88Ñ\82о Ð¿Ð¾Ñ\87неÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла.\nÐ\9aликниÑ\82е Ð½Ð° Ð´Ñ\83гме Ð¸Ñ\81под Ð·Ð° Ñ\81лаÑ\9aе Ð¿Ð¾Ñ\80Ñ\83ке Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83.\nУ Ð¿Ð¾Ñ\80Ñ\83Ñ\86и Ñ\9bе Ñ\81е Ð½Ð°Ð»Ð°Ð·Ð¸Ñ\82и Ð²ÐµÐ·Ð° Ñ\81 Ð¿Ð¾Ñ\82вÑ\80дним ÐºÐ¾Ð´Ð¾Ð¼;\nÑ\83неÑ\81иÑ\82е Ñ\98е Ñ\83 Ð¿Ñ\80егледаÑ\87 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ñ\98е Ð²Ð°Ñ\88а Ð¸Ð¼ÐµÑ\98л адреса исправна.",
        "confirmemail_pending": "Потврдни код вам је већ послат. Ако сте управо отворили налог, онда вероватно треба да сачекате неколико минута да пристигне, пре него што поново затражите нови код.",
        "confirmemail_send": "Пошаљи потврдни код",
        "confirmemail_sent": "Потврдна порука је послата.",
-       "confirmemail_oncreate": "Ð\9fоÑ\81лаÑ\82 Ñ\98е Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´ Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ðµ-адÑ\80еÑ\81Ñ\83.\nÐ\9eваÑ\98 ÐºÐ¾Ð´ Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\82Ñ\80ебан Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе, Ð°Ð»Ð¸ Ð²Ð°Ð¼ Ñ\82Ñ\80еба Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\83кÑ\99Ñ\83Ñ\87или Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ðµ-поÑ\88Ñ\82е на викију.",
-       "confirmemail_sendfailed": "{{SITENAME}} Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99е Ð¿Ð¾Ñ\80Ñ\83кÑ\83.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е Ðµ-адреса правилно написана.\n\nГрешка: $1",
+       "confirmemail_oncreate": "Ð\9fоÑ\81лаÑ\82 Ñ\98е Ð¿Ð¾Ñ\82вÑ\80дни ÐºÐ¾Ð´ Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83.\nÐ\9eваÑ\98 ÐºÐ¾Ð´ Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\82Ñ\80ебан Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе, Ð°Ð»Ð¸ Ð²Ð°Ð¼ Ñ\82Ñ\80еба Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\83кÑ\99Ñ\83Ñ\87или Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла на викију.",
+       "confirmemail_sendfailed": "{{SITENAME}} Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99е Ð¸Ð¼ÐµÑ\98л Ð¿Ð¾Ñ\82вÑ\80дÑ\83.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е Ð¸Ð¼ÐµÑ\98л адреса правилно написана.\n\nГрешка: $1",
        "confirmemail_invalid": "Потврдни код је неисправан. Вероватно је истекао.",
-       "confirmemail_needlogin": "Ð\9cоÑ\80аÑ\82е Ð±Ð¸Ñ\82и $1 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ðµ-адресу.",
-       "confirmemail_success": "Ð\92аÑ\88а Ðµ-адреса је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]]. Желимо вам пријатан боравак на викију.",
-       "confirmemail_loggedin": "Ð\92аÑ\88а Ðµ-адреса је сада потврђена.",
-       "confirmemail_subject": "{{SITENAME}} â\80\93 Ð¿Ð¾Ñ\82вÑ\80да Ðµ-адресе",
-       "confirmemail_body": "Неко, вероватно ви, са ИП адресе $1 је отворио налог „$2“ на викију {{SITENAME}}, наводећи ову е-адресу.\n\nДа потврдите да овај налог стварно припада вама, као и да\nомогућите могућности е-поште, отворите ову везу у прегледачу:\n\n$3\n\nУколико нисте отворили налог, пратите везу\nиспод како бисте прекинули поступак уписа:\n\n$5\n\nОвај потврдни код истиче $6 у $5.",
-       "confirmemail_body_changed": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1 Ñ\98е Ð¿Ñ\80оменио Ðµ-адÑ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}}.\n\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð°ÐºÑ\82ивиÑ\80али Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ðµ-поÑ\88Ñ\82е, Ð¾Ñ\82воÑ\80иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ñ\83 Ð¿Ñ\80егледаÑ\87Ñ\83:\n\n$3\n\nÐ\90ко Ð½Ð°Ð»Ð¾Ð³ *не* Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð°, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð° Ð¾Ñ\82кажеÑ\82е Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ðµ-адресе:\n\n$5\n\nОвај потврдни код истиче $6 у $7",
-       "confirmemail_body_set": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1 \nÑ\98е Ð¿Ñ\80оменио Ðµ-адÑ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° {{SITENAME}}.\n\nÐ\94а Ð±Ð¸Ñ\81мо Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð°ÐºÑ\82ивиÑ\80али Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ðµ-поÑ\88Ñ\82е Ð½Ð° {{SITENAME}}, Ð¾Ñ\82воÑ\80иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ñ\83 Ð¿Ñ\80егледаÑ\87Ñ\83:\n\n$3\n\nÐ\90ко Ð½Ð°Ð»Ð¾Ð³ *не* Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð°, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð° Ð¾Ñ\82кажеÑ\82е Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ðµ-адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
-       "confirmemail_invalidated": "Ð\9fоÑ\82вÑ\80да Ðµ-поÑ\88Ñ\82е је отказана",
-       "invalidateemail": "Ð\9eÑ\82казиваÑ\9aе Ð¿Ð¾Ñ\82вÑ\80де Ðµ-поÑ\88Ñ\82е",
+       "confirmemail_needlogin": "Ð\9cоÑ\80аÑ\82е Ð±Ð¸Ñ\82и $1 Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð¸Ð¼ÐµÑ\98л адресу.",
+       "confirmemail_success": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л адреса је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]]. Желимо вам пријатан боравак на викију.",
+       "confirmemail_loggedin": "Ð\92аÑ\88а Ð¸Ð¼ÐµÑ\98л адреса је сада потврђена.",
+       "confirmemail_subject": "{{SITENAME}} â\80\93 Ð¿Ð¾Ñ\82вÑ\80да Ð¸Ð¼ÐµÑ\98л адресе",
+       "confirmemail_body": "Неко, вероватно ви, са ИП адресе $1 \nје променио имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали могућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
+       "confirmemail_body_changed": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1 Ñ\98е Ð¿Ñ\80оменио Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 {{SITENAME}}.\n\nÐ\94а Ð±Ð¸Ñ\81Ñ\82е Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð°ÐºÑ\82ивиÑ\80али Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла, Ð¾Ñ\82воÑ\80иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ñ\83 Ð¿Ñ\80егледаÑ\87Ñ\83:\n\n$3\n\nÐ\90ко Ð½Ð°Ð»Ð¾Ð³ *не* Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð°, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð° Ð¾Ñ\82кажеÑ\82е Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ð¸Ð¼ÐµÑ\98л адресе:\n\n$5\n\nОвај потврдни код истиче $6 у $7",
+       "confirmemail_body_set": "Ð\9dеко, Ð²ÐµÑ\80оваÑ\82но Ð²Ð¸, Ñ\81а Ð\98Ð\9f Ð°Ð´Ñ\80еÑ\81е $1 \nÑ\98е Ð¿Ñ\80оменио Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð°Ð»Ð¾Ð³Ð° â\80\9e$2â\80\9c Ñ\83 Ð¾Ð²Ñ\83 Ð°Ð´Ñ\80еÑ\81Ñ\83 Ð½Ð° {{SITENAME}}.\n\nÐ\94а Ð±Ð¸Ñ\81мо Ð¿Ð¾Ñ\82вÑ\80дили Ð´Ð° Ð¾Ð²Ð°Ñ\98 Ð½Ð°Ð»Ð¾Ð³ Ñ\81Ñ\82ваÑ\80но Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð° Ð¸ Ð¿Ð¾Ð½Ð¾Ð²Ð¾ Ð°ÐºÑ\82ивиÑ\80али Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла Ð½Ð° {{SITENAME}}, Ð¾Ñ\82воÑ\80иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ñ\83 Ð¿Ñ\80егледаÑ\87Ñ\83:\n\n$3\n\nÐ\90ко Ð½Ð°Ð»Ð¾Ð³ *не* Ð¿Ñ\80ипада Ð²Ð°Ð¼Ð°, Ð¿Ñ\80аÑ\82иÑ\82е Ñ\81ледеÑ\9bÑ\83 Ð²ÐµÐ·Ñ\83 Ð´Ð° Ð¾Ñ\82кажеÑ\82е Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ð¸Ð¼ÐµÑ\98л адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
+       "confirmemail_invalidated": "Ð\9fоÑ\82вÑ\80да Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81е је отказана",
+       "invalidateemail": "Ð\9eÑ\82казиваÑ\9aе Ð¿Ð¾Ñ\82вÑ\80де Ð¸Ð¼ÐµÑ\98ла",
        "scarytranscludedisabled": "[Међувики укључивање шаблона је онемогућено]",
        "scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "tags-deactivate-not-allowed": "Није могуће деактивирати ознаку „$1“.",
        "tags-deactivate-submit": "Декативирај",
        "tags-edit-title": "Уреди ознаке",
+       "tags-edit-manage-link": "Управљај ознакама",
        "tags-edit-existing-tags": "Постојеће ознаке:",
        "tags-edit-new-tags": "Нове ознаке:",
        "tags-edit-reason": "Разлог:",
        "htmlform-cloner-create": "Додај још",
        "htmlform-cloner-delete": "Уклони",
        "htmlform-cloner-required": "Бар једна вредност је потребна.",
-       "htmlform-title-not-exists": "[[:$1]] не постоји.",
+       "htmlform-title-badnamespace": "[[:$1]] није у именском простору „{{ns:$2}}“.",
+       "htmlform-title-not-exists": "$1 не постоји.",
        "htmlform-user-not-exists": "<strong>$1</strong> не постоји.",
        "htmlform-user-not-valid": "<strong>$1</strong> није исправно корисничко име.",
        "sqlite-has-fts": "$1 с подршком претраге целог текста",
        "logentry-suppress-block": "$1 је {{GENDER:$2|блокирао|блокирала}} {{GENDER:$4|$3}} у трајању од $5 $6",
        "logentry-suppress-reblock": "$1 је {{GENDER:$2|променио|променила}} подешавања за блокирање {{GENDER:$4|корисника|кориснице}} {{GENDER:$4|$3}} у трајању од $5 $6",
        "logentry-import-upload": "$1 је {{GENDER:$2|увезао|увезла}} $3 отпремањем датотеке",
+       "logentry-import-upload-details": "$1 је {{GENDER:$2|увезао|увезла}} $3 отпремањем датотеке ($4 {{PLURAL:$4|измена|измене|измена}})",
        "logentry-import-interwiki": "$1 је {{GENDER:$2|увезао|увезла}} $3 с другог викија",
+       "logentry-import-interwiki-details": "$1 је {{GENDER:$2|увезао|увезла}} $3 из $5 ($4 {{PLURAL:$4|измена|измене|измена}})",
        "logentry-merge-merge": "$1 је {{GENDER:$2|спојио|спојила}} $3 у $4 (све до измене $5)",
        "logentry-move-move": "$1 је {{GENDER:$2|преместио|преместила}} страницу $3 на $4",
        "logentry-move-move-noredirect": "$1 је {{GENDER:$2|преместио|преместила}} страницу $3 на $4 без остављања преусмерења",
        "logentry-newusers-newusers": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог",
        "logentry-newusers-create": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог",
        "logentry-newusers-create2": "$1 је {{GENDER:$2|отворио|отворила}} кориснички налог $3",
-       "logentry-newusers-byemail": "$1 Ñ\98е {{GENDER:$2|оÑ\82воÑ\80ио|оÑ\82воÑ\80ила}} ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ $3 Ð¸ Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ðµ-поÑ\88Ñ\82Ñ\83",
+       "logentry-newusers-byemail": "$1 Ñ\98е {{GENDER:$2|оÑ\82воÑ\80ио|оÑ\82воÑ\80ила}} ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ $3 Ð¸ Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° Ð¸Ð¼ÐµÑ\98л",
        "logentry-newusers-autocreate": "Кориснички налог $1 је аутоматски {{GENDER:$2|отворен}}",
        "logentry-protect-move_prot": "$1 је {{GENDER:$2|преместио|преместила}} поставке заштите са $4 на $3",
        "logentry-protect-unprotect": "$1 je {{GENDER:$2|скинуо|скинула}} заштиту са странице $3",
        "logentry-managetags-activate": "$1 је {{GENDER:$2|активирао|активирала}} ознаку „$4“ за употребу од стране корисника и ботова",
        "logentry-managetags-deactivate": "$1 је {{GENDER:$2|деактивирао|деактивирала}} ознаку „$4“ за употребу од стране корисника и ботова",
        "log-name-tag": "Дневник ознака",
+       "log-description-tag": "Овај дневник приказује додавање/уклањање [[Special:Tags|ознака]] на појединачне измене или уносе у дневницима. Овај дневник не приказује означавање када су она део уређивања, брисања или неке друге радње.",
        "rightsnone": "(нема)",
        "revdelete-summary": "опис измене",
        "feedback-adding": "Додајем повратну информацију на страницу…",
        "feedback-bugornote": "Ако сте спремни да детаљно опишете технички проблем, онда [$1 пријавите грешку].\nУ супротном, послужите се једноставним обрасцем испод. Ваш коментар ће стајати на страници „[$3 $2]“, заједно с корисничким именом и прегледачем који користите.",
        "feedback-cancel": "Откажи",
        "feedback-close": "Урађено",
+       "feedback-external-bug-report-button": "Пријави баг",
        "feedback-error-title": "Грешка",
        "feedback-error1": "Грешка: непрепознат резултат од АПИ-ја",
        "feedback-error2": "Грешка: уређивање није успело",
        "feedback-message": "Порука:",
        "feedback-subject": "Наслов:",
        "feedback-submit": "Пошаљи",
+       "feedback-termsofuse": "Прихватам да пошаљем повратне информације у складу са условима коришћења.",
        "feedback-thanks": "Хвала! Ваша повратна информација је постављена на страницу „[$2 $1]“.",
        "feedback-thanks-title": "Хвала вам!",
        "searchsuggest-search": "Претрага",
        "special-characters-group-thai": "тајландски",
        "special-characters-group-lao": "лаоски",
        "special-characters-group-khmer": "кмерски",
+       "mw-widgets-dateinput-no-date": "Датум није изабран",
        "mw-widgets-dateinput-placeholder-day": "ГГГГ-ММ-ДД",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
index b9c646c..a272a9a 100644 (file)
@@ -19,7 +19,9 @@
                        "아라",
                        "Nemo bis",
                        "Srdjan m",
-                       "Macofe"
+                       "Macofe",
+                       "Сербијана",
+                       "Xð"
                ]
        },
        "tog-underline": "Podvlačenje veza:",
@@ -27,7 +29,7 @@
        "tog-hidepatrolled": "Sakrij patrolirane izmene u spisku skorašnjih izmena",
        "tog-newpageshidepatrolled": "Sakrij patrolirane stranice sa spiska novih stranica",
        "tog-extendwatchlist": "Proširi spisak nadgledanja za prikaz svih izmena, ne samo skorašnjih",
-       "tog-usenewrc": "Promene u grupi po stranici u spisku skorašnjih izmena i nadgledanih stranica",
+       "tog-usenewrc": "Grupni prikaz izmena svake pojedinačne stranice u skorašnjim izmenama i spisku nadgledanja",
        "tog-numberheadings": "Automatski numeriši podnaslove",
        "tog-showtoolbar": "Prikaži traku s alatkama za uređivanje",
        "tog-editondblclick": "Uređivanje stranica dvostrukim klikom",
        "category-media-header": "Datoteke u kategoriji „$1“",
        "category-empty": "<div style=\"margin:2em 1em 0 1em; padding:0.5em; border:1px solid #AAA; text-align:center;\">''Ova kategorija trenutno ne sadrži stranice ili datoteke.''</div>",
        "hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}}",
-       "hidden-category-category": "Sakrivene kategorije",
+       "hidden-category-category": "Skrivene kategorije",
        "category-subcat-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću potkategoriju.|Ova kategorija ima {{PLURAL:$1|1=sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}, od ukupno $2.}}",
        "category-subcat-count-limited": "Ova kategorija sadrži {{PLURAL:$1|sledeću potkategoriju|sledeće $1 potkategorije|sledećih $1 potkategorija}}.",
        "category-article-count": "{{PLURAL:$2|1=Ova kategorija sadrži samo sledeću stranicu.|{{PLURAL:$1|Sledeća stranica je|Sledeće $1 stranice su|Sledećih $1 stranica je}} u ovoj kategoriji, od ukupno $2.}}",
        "morenotlisted": "Ova lista nije kompletna.",
        "mypage": "Stranica",
        "mytalk": "Razgovor",
-       "anontalk": "Razgovor za ovu IP adresu",
+       "anontalk": "Razgovor",
        "navigation": "Navigacija",
        "and": "&#32;i",
        "qbfind": "Pronađi",
        "viewhelppage": "Pogledaj stranicu pomoći",
        "categorypage": "Pogledaj stranicu kategorija",
        "viewtalkpage": "Pogledaj razgovor",
-       "otherlanguages": "Drugi jezici",
+       "otherlanguages": "Na drugim jezicima",
        "redirectedfrom": "(preusmereno sa $1)",
        "redirectpagesub": "Preusmerenje",
        "redirectto": "Preusmerava na:",
        "confirmable-no": "Ne",
        "thisisdeleted": "Pogledati ili vratiti $1?",
        "viewdeleted": "Pogledati $1?",
-       "restorelink": "{{PLURAL:$1|obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
+       "restorelink": "{{PLURAL:$1|1=obrisanu izmenu|$1 obrisane izmene|$1 obrisanih izmena}}",
        "feedlinks": "Dovod:",
        "feed-invalid": "Neispravna vrsta dovoda.",
        "feed-unavailable": "Dovodi nisu dostupni",
        "createaccountreason": "Razlog:",
        "createacct-reason": "Razlog",
        "createacct-reason-ph": "Zašto pravite još jedan nalog?",
-       "createacct-captcha": "Sigurnosna provera",
-       "createacct-imgcaptcha-ph": "Unesite tekst koji vidite iznad",
        "createacct-submit": "Otvori nalog",
        "createacct-another-submit": "Otvori nalog",
        "createacct-benefit-heading": "{{SITENAME}} je napravljen od strane ljudi kao što ste vi.",
        "passwordreset-emailtext-ip": "Neko, verovatno Vi, sa IP adrese $1 je zatražio novu lozinku na vikiju {{SITENAME}} ($4).\nSledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom e-adresom:\n\n$2\n\n{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.\nPrijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku i nastavite koristiti staru lozinku.",
        "passwordreset-emailtext-user": "{{GENDER:$1|Korisnik je zatražio|Korisnica je zatražila}} podsetnik o podacima za prijavu na vikiju {{SITENAME}} ($4).\nSledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom e-adresom:\n\n$2\n\n{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.\nPrijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku.",
        "passwordreset-emailelement": "Korisničko ime: \n$1\n\nPrivremena lozinka: \n$2",
-       "passwordreset-emailsent": "Podsetnik o lozinci je poslat na vašu adresu.",
+       "passwordreset-emailsentemail": "Podsetnik o lozinci je poslat na vašu adresu.",
        "passwordreset-emailsent-capture": "Poslat je podsetnik preko e-pošte (prikazan dole).",
        "passwordreset-emailerror-capture": "E-poruka za resetovanje lozinke, prikazana ispod je poslata, ali slanje {{GENDER:$2|korisniku|korisnici}} nije uspelo: $1",
        "changeemail": "Promeni ili ukloni e-adresu",
        "changeemail-password": "Vaša lozinka:",
        "changeemail-submit": "Promeni",
        "changeemail-throttled": "Previše puta ste pokušali da se prijavite.\nMolimo vas da sačekate $1 pre nego što pokušate ponovo.",
+       "changeemail-nochange": "Unesite drugu imejl adresu.",
        "resettokens": "Resetovanje žetona",
        "resettokens-no-tokens": "Nema žetona za resetovanje.",
        "resettokens-tokens": "Žetoni:",
        "preview": "Pregled",
        "showpreview": "Prikaži pretpregled",
        "showdiff": "Prikaži izmene",
-       "blankarticle": "<strong>Upozorenje:</strong> stranica koju pravite nema nikakav sadržaj.\nAko još jednom pritisnete „{{int:savearticle}}“ napravićete stranicu bez sadržaja.",
+       "blankarticle": "<strong>Upozorenje:</strong> stranica koju pravite nema nikakav sadržaj.\nAko još jednom pritisnete „{{int:savearticle}}“ napravićete praznu stranicu.",
        "anoneditwarning": "<strong>Upozorenje:</strong> niste prijavljeni. Vaša IP adresa će biti javno vidljiva u istoriji ove stranice ako načinite bilo kakvu izmenu. Ako se <strong>[$1 prijavite]</strong> ili <strong>[$2 otvorite nalog]</strong> vaše izmene će biti pripisane vašem korisničkom imenu.",
        "anonpreviewwarning": "''Niste prijavljeni. Vaša IP adresa će biti zabeležena u istoriji ove stranice.''",
        "missingsummary": "'''Napomena:''' niste uneli opis izmene.\nAko ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvana bez opisa.",
        "protectedpagewarning": "<strong>Upozorenje: ova stranica je zaštićena, tako da samo administratori mogu da je menjaju.</strong>\nPoslednji zapis u dnevniku je prikazan ispod:",
        "semiprotectedpagewarning": "'''Napomena:''' ova stranica je zaštićena, tako da samo registrovani korisnici mogu da je uređuju.\nPoslednji zapis u dnevniku je prikazan ispod:",
        "cascadeprotectedwarning": "<strong>Upozorenje:</strong> ova stranica je zaštićena tako da je mogu uređivati samo administratori, jer je ona uključena u {{PLURAL:$1|sledeću stranicu koja je|sledeće stranice koje su}} zaštićene „prenosivom“ zaštitom:",
-       "titleprotectedwarning": "'''Upozorenje: ova stranica je zaštićena tako da je mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].'''",
+       "titleprotectedwarning": "<strong>Upozorenje: ovu stranicu mogu napraviti samo korisnici [[Special:ListGroupRights|s određenim pravima]].</strong>\nIspod su navedeni poslednji zapisi u dnevniku:",
        "templatesused": "{{PLURAL:$1|Šablon|Šabloni}} na ovoj stranici:",
        "templatesusedpreview": "{{PLURAL:$1|Šablon|Šabloni}} u ovom pregledu:",
        "templatesusedsection": "{{PLURAL:$1|Šablon|Šabloni}} u ovom odeljku:",
        "revdelete-selected-text": "{{PLURAL:$1|Izabrana izmena|Izabrane izmene}} [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|Izabrana verzija datoteke|Izabrane verzije datoteke}} [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Izabrana stavka u istoriji|Izabrane stavke u istoriji}}:",
-       "revdelete-text-text": "Izbrisane izmene će i dalje biti vidljive u istoriji stranice, ali delovi njihovog sadržaja neće biti javno dostupnu.",
-       "revdelete-text-file": "Izbrisane verzije datoteke će i dalje biti vidljive u istoriji datoteke, ali delovi njihovog sadržaja neće biti javno dostupnu.",
-       "logdelete-text": "Izbrisani unosi u dnevnicima će i dalje biti vidljivi u dnevnicima, ali delovi njihovog sadržaja neće biti javno dostupnu.",
+       "revdelete-text-text": "Izbrisane izmene će i dalje biti vidljive u istoriji stranice, ali delovi njihovog sadržaja neće biti javno dostupni.",
+       "revdelete-text-file": "Izbrisane verzije datoteke će i dalje biti vidljive u istoriji datoteke, ali delovi njihovog sadržaja neće biti javno dostupni.",
+       "logdelete-text": "Izbrisani unosi u dnevnicima će i dalje biti vidljivi u dnevnicima, ali delovi njihovog sadržaja neće biti javno dostupni.",
        "revdelete-text-others": "Ostali administratori će i dalje moći da pristupe skrivenom sadržaju i vrate ga, osim ako se postave dodatna ograničenja.",
        "revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti <strong>samo</strong> u sledećim slučajevima:\n* zlonamerni ili pogrdni podaci\n* neprikladni lični podaci\n*: <em>kućna adresa i broj telefona, broj kreditne kartice, JMBG itd.</em>",
        "prefs-help-prefershttps": "Ova podešavanja će stupiti na snagu pri sledećoj prijavi.",
        "prefswarning-warning": "Promenili ste vaša podešavanja ali niste ih još sačuvali.\nAko ne pritisnete „$1“ vaša podešavanja će biti izgubljena.",
        "prefs-tabs-navigation-hint": "Savet: možete koristiti tipke sa levom i desnom strelicom za kretanje kroz kartice.",
-       "email-address-validity-valid": "E-adresa je ispravna",
-       "email-address-validity-invalid": "Unesite ispravnu e-adresu",
        "userrights": "Upravljanje korisničkim pravima",
        "userrights-lookup-user": "Upravljanje korisničkim grupama",
        "userrights-user-editname": "Korisničko ime:",
        "right-passwordreset": "pregledanje poruka za obnavljanje lozinke",
        "right-managechangetags": "pravljenje i/ili brisanje [[Special:Tags|oznaka]] iz baze podataka",
        "newuserlogpage": "Dnevnik novih korisnika",
-       "newuserlogpagetext": "Ovo je istorija novih korisnika.",
+       "newuserlogpagetext": "Ovo je dnevnik novih korisnika.",
        "rightslog": "Dnevnik korisničkih prava",
        "rightslogtext": "Ovo je dnevnik izmena korisničkih prava.",
        "action-read": "čitanje ove stranice",
        "log": "Dnevnici",
        "all-logs-page": "Svi javni dnevnici",
        "alllogstext": "Skupni prikaz svih dostupnih istorija ovog vikija.\nMožete suziti prikaz odabirući vrstu istorije, korisničkog imena ili tražene stranice.",
-       "logempty": "Nema pronađenih stavki u istoriji.",
+       "logempty": "Nema pronađenih unosa u dnevniku.",
        "log-title-wildcard": "Traži naslove koji počinju s ovim tekstom",
        "showhideselectedlogentries": "Prikaži/sakrij izabrane događaje",
        "allpages": "Sve stranice",
        "wlheader-showupdated": "Stranice koje su izmenjene otkad ste ih poslednji put posetili su '''podebljane'''.",
        "wlnote": "Ispod {{PLURAL:$1|je poslednja izmena|su poslednje <strong>$1</strong> izmene|je poslednjih <strong>$1</strong> izmena}} u {{PLURAL:$2|prethodnom satu|prethodna <strong>$2</strong> sata|prethodnih <strong>$2</strong> sati}}, zaključno sa $3, $4.",
        "wlshowlast": "Prikaži poslednjih $1 sati, $2 dana",
+       "watchlistall2": "sve",
+       "wlshowtime": "Period za prikaz:",
        "watchlist-options": "Postavke spiska nadgledanja",
        "watching": "Nadgledanje…",
        "unwatching": "Prekidanje nadgledanja…",
        "logentry-contentmodel-change-revert": "vrati",
        "protectlogpage": "Dnevnik zaključavanja",
        "protectlogtext": "Ispod je spisak zaštićenih stranica.\nPogledajte [[Special:ProtectedPages|spisak zaštićenih stranica]] za više detalja.",
-       "protectedarticle": "{{GENDER:|je zaštitio|je zaštitila}} „[[$1]]“",
+       "protectedarticle": "je zaštitio „[[$1]]“",
        "modifiedarticleprotection": "je promenio stepen zaštite za „[[$1]]“",
        "unprotectedarticle": "je skinuo zaštitu sa stranice „[[$1]]“",
        "movedarticleprotection": "je premestio postavke zaštite sa „[[$2]]“ na „[[$1]]“",
        "move-page-legend": "Premeštanje stranice",
        "movepagetext": "Donji obrazac će preimenovati stranicu, premeštajući celu istoriju na novo ime.\nStari naslov postaće preusmerenje na novi naslov.\nMožete automatski izmeniti preusmerenje do izvornog naslova.\nPogledajte [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|pokvarena]] preusmerenja.\nNa vama je odgovornost da veze i dalje idu tamo gde bi trebalo da idu.\n\nStranica '''neće''' biti premeštena ako već postoji stranica s tim imenom, osim ako je ona prazna, sadrži preusmerenje ili nema istoriju izmena.\nTo znači da možete vratiti stranicu na prethodno mesto ako pogrešite, ali ne možete zameniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može predstavljati drastičnu i neočekivanu izmenu za popularnu stranicu;\ndobro razmislite o posledicama pre nego što nastavite.",
        "movepagetext-noredirectfixer": "Donji obrazac će preimenovati stranicu, premeštajući celu istoriju na novo ime.\nStari naslov postaće preusmerenje na novi naslov.\nPogledajte [[Special:DoubleRedirects|dvostruka]] ili [[Special:BrokenRedirects|pokvarena]] preusmerenja.\nNa vama je odgovornost da veze i dalje idu tamo gde bi trebalo da idu.\n\nStranica '''neće''' biti premeštena ako već postoji stranica s tim imenom, osim ako je ona prazna, sadrži preusmerenje ili nema istoriju izmena.\nTo znači da možete vratiti stranicu na prethodno mesto ako pogrešite, ali ne možete zameniti postojeću stranicu.\n\n'''Pažnja!'''\nOvo može predstavljati drastičnu i neočekivanu izmenu za popularnu stranicu;\ndobro razmislite o posledicama pre nego što nastavite.",
-       "movepagetalktext": "Odgovarajuća stranica za razgovor, ako postoji, biće automatski premeštena zajedno s njom, osim ako:\n*Već postoji stranica za razgovor s novim naslovom, ili\n*Ako je označeno dolenavedeno polje.\n\nU ovom slučaju mora ručno da se premesti ili spoji, ako ima potrebe za tim.",
+       "movepagetalktext": "Ako ste označili ovaj kvadratić, odgovarajuća stranica za razgovor biće automatski premeštena na novi naslov, osim ako već postoji stranica za razgovor sa istim naslovom.\n\nU tom slučaju, moraćete ručno da je premestite ili spojite, ako ima potrebe za tim.",
        "moveuserpage-warning": "'''Upozorenje:''' na putu ste da premestite korisničku stranicu. Imajte u vidu da će samo stranica biti premeštena, a sam korisnik ''neće'' biti preimenovan.",
        "movecategorypage-warning": "<strong>Upozorenje:</strong> premeštate stranicu kategorije. Imajte na umu da će samo stranica biti premeštena i da sve stranice u staroj kategoriji <em>neće</em> biti rekategorisane u novu kategoriju.",
        "movenologintext": "Morate da budete registrovani i [[Special:UserLogin|prijavljeni]] da biste premeštali stranice.",
        "movenosubpage": "Ova stranica nema podstrana.",
        "movereason": "Razlog:",
        "revertmove": "vrati",
-       "delete_and_move": "Obriši i premesti",
        "delete_and_move_text": "== Potrebno brisanje ==\n\nOdredišna stranica „[[:$1]]“ već postoji. \nŽelite li da je obrišete da biste oslobodili mesto za premeštanje?",
        "delete_and_move_confirm": "Da, obriši stranicu",
        "delete_and_move_reason": "Obrisano da se oslobodi mesto za premeštanje iz „[[$1]]“",
        "creditspage": "Autori stranice",
        "nocredits": "Ne postoje podaci o autoru ove stranice.",
        "spamprotectiontitle": "Filter za zaštitu od nepoželjnih poruka",
-       "spamprotectiontext": "Filtera protiv neželjenih poruka je blokirao čuvanje ove stranice.\nOvo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj listi.",
+       "spamprotectiontext": "Filtera protiv neželjenih poruka je blokirao čuvanje ove stranice.\nOvo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnom spisku.",
        "spamprotectionmatch": "Sledeći tekst je aktivirao naš filter za neželjene poruke: $1",
        "spambot_username": "Čišćenje nepoželjnih poruka u Medijavikiji",
        "spam_reverting": "Vraćam na poslednju izmenu koja ne sadrži veze do $1",
        "pageinfo-recent-edits": "Broj skorašnjih izmena (u poslednjih $1)",
        "pageinfo-recent-authors": "Broj skorašnjih zasebnih autora",
        "pageinfo-magic-words": "{{PLURAL:$1|Magična reč|Magične reči}} ($1)",
-       "pageinfo-hidden-categories": "{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Skrivena kategorija|Skrivene kategorije}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Stranica|Stranice}} uključene u ($1)",
        "pageinfo-toolboxlink": "Podaci o stranici",
index 56e9aeb..f50abb1 100644 (file)
        "nstab-template": "Citakan",
        "nstab-help": "Pitulung",
        "nstab-category": "Kategori",
+       "mainpage-nstab": "Tepas",
        "nosuchaction": "Teu aya peta kitu",
        "nosuchactiontext": "Peta nu diketik na URL teu dipikawanoh ku wiki.\nKadé bisi salah ketik atawa nuturkeun tumbu nu salah.\nHal ieu bisa ogé kulantaran ayana kutu (bug) dina sopwér nu dipaké ku {{SITENAME}}.",
        "nosuchspecialpage": "Teu aya kaca husus nu kitu",
        "createaccountreason": "Alesan:",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Naha bet nyieun akun séjén",
-       "createacct-captcha": "Pamariksaan kaamanan",
-       "createacct-imgcaptcha-ph": "Asupkeun téks anu kabaca di luhur",
        "createacct-submit": "Jieun akun anjeun",
        "createacct-another-submit": "Jieun akun séjén",
        "createacct-benefit-heading": "{{SITENAME}} téh dijieun ku jalma-jalma siga anjeun.",
        "passwordreset-emailtext-ip": "Aya (sigana anjeun, ti alamat IP $1) ménta nyetél ulang kecap sandi pikeun {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat ieu surélék:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun teu rumasa nyieun ieu paménta, atawa lamun geus inget sandi aslina sarta moal dirobah, ieu surat teu kudu diwaro.",
        "passwordreset-emailtext-user": "Pamaké $1 di {{SITENAME}} ménta nyetél ulang sandi anjeun di {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat surélék ieu:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun henteu rumasa nyieun ieu pamundut atawa lamun geus inget sandi asli sarta moal ngarobah deui, ieu talatah teu kudu dipaliré.",
        "passwordreset-emailelement": "Sandiasma: \n$1\n\nSandi saheulaanan: \n$2",
-       "passwordreset-emailsent": "Surélék pikeun nyetél ulang kecap sandi geus dikirim.",
+       "passwordreset-emailsentemail": "Surélék pikeun nyetél ulang kecap sandi geus dikirim.",
        "passwordreset-emailsent-capture": "Surélék pikeun nyetél ulang kecap sandi geus dikirim, sakumaha ditémbongkeun di handap.",
        "passwordreset-emailerror-capture": "Surélék pikeun nyetél ulang kecap sandi geus dijieun, sakumaha ditémbongkeun di handap, tapi gagal ngirim ka {{GENDER:$2|pamaké}}: $1",
        "changeemail": "Ganti alamat surélék",
        "prefs-displaywatchlist": "Pilihan pidangan",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Béda",
-       "email-address-validity-valid": "Alamat surélék sigana bener",
-       "email-address-validity-invalid": "Asupkeun alamat ratron nu bener",
        "userrights": "Manajemén hak pamaké",
        "userrights-lookup-user": "Atur gorombolan pamaké",
        "userrights-user-editname": "Asupkeun landihan:",
        "wlheader-showupdated": "Kaca nu robah ti panungtungan anjeun sindang ditémbongkeun kalawan '''kandel'''",
        "wlnote": "Di handap ieu mangrupa $1 {{PLURAL:$1|robahan|robahan}} ahir salila '''$2''' jam.",
        "wlshowlast": "Témbongkeun $1 jam $2 poé  ahir",
+       "watchlistall2": "sadaya",
        "watchlist-options": "Pilihan awaskeuneun",
        "watching": "Ngawaskeun...",
        "unwatching": "Eureun ngawaskeun...",
        "movenosubpage": "Ieu kaca teu boga subkaca.",
        "movereason": "Alesan:",
        "revertmove": "balikkeun",
-       "delete_and_move": "Hapus jeung pindahkeun",
        "delete_and_move_text": "==Merlukeun hapusan==\n\nArtikel nu dituju \"[[:$1]]\" geus aya. Badé dihapus baé sangkan bisa mindahkeun?",
        "delete_and_move_confirm": "Enya, hapus kaca éta",
        "delete_and_move_reason": "Hapus sangkan bisa mindahkeun",
        "tooltip-pt-logout": "Kaluar log",
        "tooltip-pt-createaccount": "Najan henteu kudu, Anjeun leuwih hadé nyieun akun sarta asup log",
        "tooltip-ca-talk": "Sawala ngeunaan eusi kaca",
-       "tooltip-ca-edit": "Anjeun bisa ngédit kaca ieu. Paké tombol pramidang méméh nyimpen.",
+       "tooltip-ca-edit": "Édit ieu kaca",
        "tooltip-ca-addsection": "Jieun bahasan anyar",
        "tooltip-ca-viewsource": "Kaca ieu dikonci, tapi anjeun masih bisa muka sumberna.",
        "tooltip-ca-history": "Vérsi heubeul ieu kaca",
        "tooltip-ca-nstab-main": "Témbongkeun eusi kaca",
        "tooltip-ca-nstab-user": "Témbongkeun kaca kontributor",
        "tooltip-ca-nstab-media": "Témbongkeun kaca média",
-       "tooltip-ca-nstab-special": "Ieu kaca husus, anjeun teu bisa nyunting langsung",
+       "tooltip-ca-nstab-special": "Ieu mah kaca husus, teu bisa disunting",
        "tooltip-ca-nstab-project": "Témbongkeun kaca proyék",
        "tooltip-ca-nstab-image": "Témbongkeun kaca gambar",
        "tooltip-ca-nstab-mediawiki": "Témbongkeun pesen sistim",
index 5c50e95..54c3404 100644 (file)
@@ -66,7 +66,9 @@
                        "Marfuas",
                        "Macofe",
                        "Aaoo",
-                       "Josve05a"
+                       "Josve05a",
+                       "Pipetricker",
+                       "Dammråtta"
                ]
        },
        "tog-underline": "Stryk under länkar:",
        "tog-watchlisthidebots": "Visa inte robotredigeringar i bevakningslistan",
        "tog-watchlisthideminor": "Dölj mindre ändringar i bevakningslistan",
        "tog-watchlisthideliu": "Visa inte redigeringar av inloggade användare i bevakningslistan",
+       "tog-watchlistreloadautomatically": "Uppdatera bevakningslistan automatiskt när ett filter ändras (JavaScript krävs)",
        "tog-watchlisthideanons": "Dölj redigeringar av anonyma användare i bevakningslistan",
        "tog-watchlisthidepatrolled": "Dölj patrullerade redigeringar i bevakningslistan",
        "tog-watchlisthidecategorization": "Dölj kategorisering av sidor",
        "december-gen": "december",
        "jan": "jan",
        "feb": "feb",
-       "mar": "mar",
+       "mar": "mars",
        "apr": "apr",
        "may": "maj",
-       "jun": "jun",
-       "jul": "jul",
+       "jun": "juni",
+       "jul": "juli",
        "aug": "aug",
-       "sep": "sep",
+       "sep": "sept",
        "oct": "okt",
        "nov": "nov",
        "dec": "dec",
        "morenotlisted": "Denna lista är inte fullständig.",
        "mypage": "Sida",
        "mytalk": "Diskussion",
-       "anontalk": "Diskussionssida för denna IP-adress",
+       "anontalk": "Diskussion",
        "navigation": "Navigering",
        "and": "&#32;och",
        "qbfind": "Hitta",
        "missingarticle-rev": "(versionsnummer: $1)",
        "missingarticle-diff": "(Skillnad: $1, $2)",
        "readonly_lag": "Databasen har automatiskt skrivskyddats medan slavdatabasservrarna synkroniseras med huvudservern.",
+       "nonwrite-api-promise-error": "HTTP-headern 'Promise-Non-Write-API-Action' skickades men förfrågan var till en API-skrivmodul.",
        "internalerror": "Internt fel",
        "internalerror_info": "Internt fel: $1",
        "internalerror-fatal-exception": "Allvarligt undantag av typen \"$1\"",
        "createaccountreason": "Orsak:",
        "createacct-reason": "Orsak",
        "createacct-reason-ph": "Varför du skapar ett annat konto",
-       "createacct-captcha": "Säkerhetskontroll",
-       "createacct-imgcaptcha-ph": "Fyll i texten du ser ovan",
        "createacct-submit": "Skapa ditt konto",
        "createacct-another-submit": "Skapa konto",
        "createacct-benefit-heading": "{{SITENAME}} är skapad av människor som dig.",
        "wrongpasswordempty": "Lösenordet som angavs var blankt. Var god försök igen.",
        "passwordtooshort": "Lösenord måste innehålla minst {{PLURAL:$1|$1 tecken}}.",
        "passwordtoolong": "Lösenord kan inte vara längre än {{PLURAL:$1|1 tecken|$1 tecken}}.",
+       "passwordtoopopular": "Vanliga lösenord kan inte användas. Välj ett mer unikt lösenord.",
        "password-name-match": "Ditt lösenord måste vara olikt ditt användarnamn.",
        "password-login-forbidden": "Användningen av dessa användarnamn och lösenord har förbjudits.",
        "mailmypassword": "Återställ lösenord",
        "passwordreset-emailtext-ip": "Någon (förmodligen du, från IP-adressen $1) begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
        "passwordreset-emailtext-user": "Användaren $1 på {{SITENAME}} begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
        "passwordreset-emailelement": "Användarnamn: \n$1\n\nTillfälligt lösenord: \n$2",
-       "passwordreset-emailsent": "Om detta är en registrerad e-postadress för ditt konto kommer en lösenordsåterställning via e-post skickas.",
+       "passwordreset-emailsentemail": "Om detta är en registrerad e-postadress för ditt konto kommer en lösenordsåterställning skickas via e-post.",
+       "passwordreset-emailsentusername": "Om det finns en motsvarande e-postadress för ditt konto kommer en lösenordsåterställning skickas via e-post.",
        "passwordreset-emailsent-capture": "En lösenordsåterställning via e-post har skickats, som visas nedan.",
        "passwordreset-emailerror-capture": "En lösenordsåterställning via e-post har skapats, som visas nedan, men det gick inte att skicka den till {{GENDER:$2|användaren}}: $1",
        "changeemail": "Ändra eller ta bort e-postadress",
        "history-feed-description": "Versionshistorik för denna sida på wikin",
        "history-feed-item-nocomment": "$1 den $2",
        "history-feed-empty": "Den begärda sidan finns inte.\nDen kan ha tagits bort från wikin eller bytt namn.\nProva att [[Special:Search|söka på wikin]] för relevanta nya sidor.",
-       "history-edit-tags": "Redigera märken för valda sidversioner",
+       "history-edit-tags": "Redigera taggar för valda sidversioner",
        "rev-deleted-comment": "(redigeringssammanfattning togs bort)",
        "rev-deleted-user": "(användarnamn borttaget)",
        "rev-deleted-event": "(loggdetaljer borttagna)",
        "showingresultsinrange": "Nedan visas upp till {{PLURAL:$3|<strong>1</strong> resultat|<strong>$1</strong> resultat}} mellan nummer <strong>$2</strong> och nummer <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Resultat <strong>$1</strong> av <strong>$3</strong>|Resultat <strong>$1 – $2</strong> av <strong>$3</strong>}}",
        "search-nonefound": "Inga resultat matchade frågan.",
+       "search-nonefound-thiswiki": "Inga resultat matchade frågan på denna webbplats.",
        "powersearch-legend": "Avancerad sökning",
        "powersearch-ns": "Sök i namnrymderna:",
        "powersearch-togglelabel": "Kryssa:",
        "prefs-help-prefershttps": "Ändringar av denna inställning börjar gälla nästa gång du loggar in",
        "prefswarning-warning": "Du har gjort ändringar i dina inställningarna som inte har sparats ännu.\nOm du lämnar denna sida utan att klicka på \"$1\" kommer dina inställningar inte att uppdateras.",
        "prefs-tabs-navigation-hint": "Tips: Du kan använda vänster och höger piltangenterna för att navigera mellan flikarna i listan flikar.",
-       "email-address-validity-valid": "E-postadress ser giltig ut",
-       "email-address-validity-invalid": "Ange en giltig e-postadress",
        "userrights": "Hantering av användarrättigheter",
        "userrights-lookup-user": "Hantera användargrupper",
        "userrights-user-editname": "Skriv in ett användarnamn:",
        "recentchanges-legend-heading": "'''Teckenförklaring:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (se även [[Special:NewPages|listan över nya sidor]])",
        "recentchanges-legend-plusminus": "(''±123'')",
+       "recentchanges-submit": "Visa",
        "rcnotefrom": "Nedan visas {{PLURAL:$5|ändringen|ändringar}} sedan <strong>$3, $4</strong> (upp till <strong>$1</strong> ändringar visas).",
        "rclistfrom": "Visa ändringar från och med $3 $2",
        "rcshowhideminor": "$1 mindre ändringar",
        "mostrevisions": "Sidor med flest ändringar",
        "prefixindex": "Alla sidor med prefix",
        "prefixindex-namespace": "Alla sidor med prefix ($1 namnrymder)",
+       "prefixindex-submit": "Visa",
        "prefixindex-strip": "Avlägsna prefix i lista",
        "shortpages": "Korta sidor",
        "longpages": "Långa sidor",
        "protectedpages-performer": "Skyddande användare",
        "protectedpages-params": "Skyddsparametrar",
        "protectedpages-reason": "Anledning",
+       "protectedpages-submit": "Visa sidor",
        "protectedpages-unknown-timestamp": "Okänd",
        "protectedpages-unknown-performer": "Okänd användare",
        "protectedtitles": "Skyddade titlar",
        "protectedtitles-summary": "Denna sida listar de titlar som skyddas från att skapas. För en lista över befintliga sidor som är skyddade, se [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Just nu finns inga skyddade sidtitlar med de parametrarna.",
+       "protectedtitles-submit": "Visa titlar",
        "listusers": "Användarlista",
        "listusers-editsonly": "Visa endast användare som redigerat",
        "listusers-creationsort": "Sortera efter datum skapat",
        "usereditcount": "$1 {{PLURAL:$1|redigering|redigeringar}}",
        "usercreated": "{{GENDER:$3|Skapad}} den $1 $2",
        "newpages": "Nya sidor",
+       "newpages-submit": "Visa",
        "newpages-username": "Användare:",
        "ancientpages": "Äldsta sidorna",
        "move": "Flytta",
        "specialloguserlabel": "Utförare:",
        "speciallogtitlelabel": "Mål (titel eller {{ns:user}}:användarnamn för användare):",
        "log": "Loggar",
+       "logeventslist-submit": "Visa",
        "all-logs-page": "Alla publika loggar",
        "alllogstext": "Kombinerad visning av alla tillgängliga loggar för {{SITENAME}}.\nDu 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.",
        "cachedspecial-viewing-cached-ts": "Du visar en cachad version av denna sida, som kanske inte är helt aktuell.",
        "cachedspecial-refresh-now": "Visa senaste.",
        "categories": "Kategorier",
+       "categories-submit": "Visa",
        "categoriespagetext": "Följande {{PLURAL:$1|kategori|kategorier}} innehåller sidor eller media.\n[[Special:UnusedCategories|Oanvända kategorier]] visas inte här.\nSe även [[Special:WantedCategories|önskade kategorier]].",
        "categoriesfrom": "Visa kategorier från och med:",
        "special-categories-sort-count": "sortera efter storlek",
        "activeusers-hidebots": "Dölj botar",
        "activeusers-hidesysops": "Dölj administratörer",
        "activeusers-noresult": "Inga användare funna.",
+       "activeusers-submit": "Visa aktiva användare",
        "listgrouprights": "Behörigheter för användargrupper",
        "listgrouprights-summary": "Följande lista visar vilka användargrupper som är definierade på den här wikin och vilka behörigheter grupperna har.\nDet kan finnas [[{{MediaWiki:Listgrouprights-helppage}}|ytterligare information]] om de olika behörigheterna.",
        "listgrouprights-key": "Teckenförklaring:\n* <span class=\"listgrouprights-granted\">Beviljad rättighet</span>\n* <span class=\"listgrouprights-revoked\">Tillbakatagen rättighet</span>",
        "wlheader-showupdated": "Sidor som har ändrats sedan ditt senaste besök visas i '''fetstil.'''",
        "wlnote": "Nedan finns {{PLURAL:$1|den senaste ändringen|de senaste <strong>$1</strong> ändringarna}} under {{PLURAL:$2|den senaste timmen|de senaste <strong>$2</strong> timmarna}} från den $3 kl. $4.",
        "wlshowlast": "Visa senaste $1 timmarna $2 dygnen",
+       "watchlistall2": "alla",
+       "watchlist-hide": "Dölj",
+       "watchlist-submit": "Visa",
+       "wlshowtime": "Tidsperiod att visa:",
+       "wlshowhideminor": "mindre redigering",
+       "wlshowhidebots": "robotar",
+       "wlshowhideliu": "registrerade användare",
+       "wlshowhideanons": "anonyma användare",
+       "wlshowhidepatr": "patrullerade redigeringar",
+       "wlshowhidemine": "mina redigeringar",
        "watchlist-options": "Alternativ för bevakningslistan",
        "watching": "Bevakar...",
        "unwatching": "Avbevakar...",
        "delete-confirm": "Radera \"$1\"",
        "delete-legend": "Radera",
        "historywarning": "<strong>Varning:</strong> Sidan du håller på att radera har en historik med ungefär $1 {{PLURAL:$1|version|versioner}}:",
+       "historyaction-submit": "Visa",
        "confirmdeletetext": "Du håller på att ta bort en sida med hela dess historik.\nBekräfta att du förstår vad du håller på med och vilka konsekvenser detta leder till, och att du följer [[{{MediaWiki:Policy-url}}|riktlinjerna]].",
        "actioncomplete": "Genomfört",
        "actionfailed": "Handlingen misslyckades",
        "contributions": "{{GENDER:$1|Användarbidrag}}",
        "contributions-title": "Bidrag av $1",
        "mycontris": "Bidrag",
+       "anoncontribs": "Bidrag",
        "contribsub2": "För {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Användarkontot \"$1\" är inte registrerat.",
        "nocontribs": "Inga ändringar som motsvarar dessa kriterier hittades.",
        "whatlinkshere-hidelinks": "$1 länkar",
        "whatlinkshere-hideimages": "$1 fillänkar",
        "whatlinkshere-filters": "Filter",
+       "whatlinkshere-submit": "Gå",
        "autoblockid": "Autoblockera #$1",
        "block": "Blockera användare",
        "unblock": "Upphäv blockering av användare",
        "movenosubpage": "Denna sida har inga undersidor.",
        "movereason": "Anledning:",
        "revertmove": "återställ",
-       "delete_and_move": "Radera och flytta",
        "delete_and_move_text": "==Radering krävs==\nDen titel du vill flytta sidan till, \"[[:$1]]\", finns redan. Vill du radera den för att möjliggöra flytt av denna sida dit?",
        "delete_and_move_confirm": "Ja, radera sidan",
        "delete_and_move_reason": "Raderad för att göra plats till flyttning av \"[[$1]]\"",
        "tooltip-pt-preferences": "Dina inställningar",
        "tooltip-pt-watchlist": "Listan över sidor du bevakar för ändringar",
        "tooltip-pt-mycontris": "Lista över dina bidrag",
+       "tooltip-pt-anoncontribs": "En lista över redigeringar från denna IP-adress",
        "tooltip-pt-login": "Du uppmuntras att logga in, men det är inget krav",
        "tooltip-pt-logout": "Logga ut",
        "tooltip-pt-createaccount": "Du uppmuntras att skapa ett konto och logga in, men det är inte obligatoriskt",
        "tooltip-ca-watch": "Lägg till sidan på din bevakningslista",
        "tooltip-ca-unwatch": "Ta bort denna sida från din bevakningslista",
        "tooltip-search": "Sök på {{SITENAME}}",
-       "tooltip-search-go": "Gå till sidan med detta namn om den finns",
+       "tooltip-search-go": "Gå till sidan med exakt detta namn om den finns",
        "tooltip-search-fulltext": "Sök efter sidor som innehåller denna text",
        "tooltip-p-logo": "Besök huvudsidan",
        "tooltip-n-mainpage": "Besök huvudsidan",
        "filedelete-archive-read-only": "Webbservern kan inte skriva till arkivkatalogen \"$1\".",
        "previousdiff": "← Äldre redigering",
        "nextdiff": "Nyare redigering →",
-       "mediawarning": "'''Varning''': Den här filen kan innehålla elak kod.\nOm du kör den kan din dator skadas.",
+       "mediawarning": "'''Varning''': Den här filen kan innehålla skadlig kod.\nOm du kör den kan din dator skadas.",
        "imagemaxsize": "Begränsa bilders storlek:<br />''(för filbeskrivningssidor)''",
        "thumbsize": "Storlek på minibild:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|sida|sidor}}",
        "exif-compression-6": "JPEG (gammal)",
        "exif-copyrighted-true": "Upphovsrättsskyddat",
        "exif-copyrighted-false": "Upphovsrättsstatus inte angivet",
+       "exif-photometricinterpretation-1": "Svart och vit (svart är 0)",
        "exif-unknowndate": "Okänt datum",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Spegelvänd horisontellt",
        "htmlform-cloner-required": "Det krävs minst ett värde.",
        "htmlform-title-badnamespace": "[[:$1]] är inte i \"{{ns:$2}}\"-namnrymden.",
        "htmlform-title-not-creatable": "\"$1\" är inte en sidtitel som kan skapas",
-       "htmlform-title-not-exists": "[[:$1]] finns inte.",
+       "htmlform-title-not-exists": "$1 finns inte.",
        "htmlform-user-not-exists": "<strong>$1</strong> finns inte.",
        "htmlform-user-not-valid": "<strong>$1</strong> är inte ett giltigt användarnamn.",
        "sqlite-has-fts": "$1 med stöd för fulltextsökning",
        "logentry-suppress-block": "$1 {{GENDER:$2|blockerade}} {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|ändrade}} blockeringsinställningar för {{GENDER:$4|$3}} med en varaktighet på $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importerade}} $3 genom filuppladdning",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|importerade}} $3 genom filuppladdning ($4 {{PLURAL:$4|sidversion|sidversioner}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|importerade}} $3 från en annan wiki",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|importerade}} $3 från $5 ($4 {{PLURAL:$4|sidversion|sidversioner}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|slog ihop}} $3 i $4 (versioner t.o.m. $5)",
        "logentry-move-move": "$1 {{GENDER:$2|flyttade}} sidan $3 till $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|flyttade}} sidan $3 till $4 utan att lämna en omdirigering",
        "logentry-upload-upload": "$1 {{GENDER:$2|laddade upp}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|laddade upp}} en ny version av $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|laddade upp}} $3",
-       "log-name-managetags": "Tagghanterings logg",
+       "log-name-managetags": "Märkeshanteringslogg",
        "log-description-managetags": "Denna sida innehåller administrativa [[Special:Tags|märke]]srelaterade uppgifter. Loggen innehåller bara åtgärder som utförts manuellt av en administratör; märken kan skapas eller raderas av wikins mjukvara utan att en post registreras i loggen.",
        "logentry-managetags-create": "$1 {{GENDER:$2|skapade}} taggen \"$4\"",
        "logentry-managetags-delete": "$1 {{GENDER:$2|raderade}} taggen \"$4\" (borttagen från $5 {{PLURAL:$5|version eller loggpost|versioner och/eller loggposter}})",
index 8b8ab4e..59f6b3f 100644 (file)
@@ -42,7 +42,8 @@
                        "Mohammed Ammar",
                        "Shrikarsan",
                        "Matma Rex",
-                       "Anj.balaji"
+                       "Anj.balaji",
+                       "Dineshkumar Ponnusamy"
                ]
        },
        "tog-underline": "இணைப்புகளுக்கு அடிக்கோடிடு",
        "morenotlisted": "இந்தப் பட்டியல் முழுமையானதல்ல.",
        "mypage": "பக்கம்",
        "mytalk": "பேச்சு",
-       "anontalk": "à®\87நà¯\8dத à®\90.பி. à®®à¯\81à®\95வரிà®\95à¯\8dà®\95ான à®ªà¯\87à®\9aà¯\8dà®\9aà¯\81",
+       "anontalk": "பேச்சு",
        "navigation": "வழிசெலுத்தல்",
        "and": " மற்றும்",
        "qbfind": "கண்டுபிடி",
        "nstab-template": "வார்ப்புரு",
        "nstab-help": "உதவிப் பக்கம்",
        "nstab-category": "பகுப்பு",
+       "mainpage-nstab": "முதற் பக்கம்",
        "nosuchaction": "அவ்வித செயற்பாடுகள் எதுவுமில்லை",
        "nosuchactiontext": "யூ.ஆர்.எல். குறித்த செயற்பாடு விக்கி மென்பொருளினால் அடையாளம் காணப்படவில்லை",
        "nosuchspecialpage": "அவ்வாறான சிறப்புப் பக்கங்கள் எதுவுமில்லை",
        "createaccountreason": "காரணம்:",
        "createacct-reason": "காரணம்",
        "createacct-reason-ph": "தாங்கள் ஏன் மற்றொரு கணக்கைத் துவங்குகிறீர்கள்?",
-       "createacct-captcha": "பாதுகாப்பு சோதனை",
-       "createacct-imgcaptcha-ph": "மேலே காணும் சொற்களை உள்ளிடுக",
        "createacct-submit": "உங்கள் கணக்கை உருவாக்குக",
        "createacct-another-submit": "கணக்கை உருவாக்கவும்",
        "createacct-benefit-heading": "{{SITENAME}} தங்களைப் போன்றோர்களால் உருவாக்கப்பட்டது",
        "passwordreset-emailtext-ip": "யாராவது (அநேகமாக நீங்கள், IP முகவரி   $1 ல் இருந்து ), நினைவுபடுத்தி கோரிய உங்கள் கணக்கு\n விவரங்கள் நினைவுபடுத்தி {{SITENAME}} ( $4 ).பின்வரும் பயனர்  {{PLURAL:$3|account is|accounts are}}\n இந்த மின்னஞ்சல் முகவரியுடன் இணைக்கப்பட்டுள்ளது.\n$2\n{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உள்ள நாட்கள் {{PLURAL:$5|one day|$5 days}}.\nநீங்கள் புதிய கடவுச்சொல்லை இப்போதே தேர்வு செய்து வேண்டும், அல்லது வேறு யாராவது இந்த கோரிக்கையை அனுப்பியிருந்தாலோ\nஅல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.",
        "passwordreset-emailtext-user": "பயனர் $1 {{SITENAME}} லிருந்து கடவுச்சொல் மீட்டமையினை {{SITENAME}}\n($4) க்கு கோரியுள்ளார்.பின்வரும் பயனர்  {{PLURAL:$3|account is|accounts are}}\n இந்த மின்னஞ்சல் முகவரியுடன் இணைக்கப்பட்டுள்ளது.\n$2\n{{PLURAL:$3|This temporary password|These temporary passwords}} காலாவதி ஆக உள்ள நாட்கள் {{PLURAL:$5|one day|$5 days}}.\nநீங்கள் புதிய கடவுச்சொல்லை இப்போதே தேர்வு செய்ய வேண்டும், அல்லது வேறு யாராவது இந்த கோரிக்கையை அனுப்பியிருந்தாலோ\nஅல்லது உங்கள் மூல கடவுச்சொல் நினைவில் இருந்தாலோ இதை மாற்ற வேண்டிய அவசியம் இல்லை,நீங்கள் இந்த தகவலை புறக்கணித்துவிட்டுஉங்கள் பழைய கடவுச்சொல்லையே பயன்படுத்திக்கொள்ளலாம்.",
        "passwordreset-emailelement": "பயனர் பெயர்:  \n$1\n\nதற்காலிகக் கடவுச்சொல்: \n$2",
-       "passwordreset-emailsent": "இது உங்கள் கணக்கிற்கான பதிவு செய்யப்பட்ட மின்னஞ்சலாயின், கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்படும்",
+       "passwordreset-emailsentemail": "இது உங்கள் கணக்கிற்கான பதிவு செய்யப்பட்ட மின்னஞ்சலாயின், கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்படும்",
        "passwordreset-emailsent-capture": "கீழே காண்பிக்கப்பட்டுள்ளது போல் கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல் அனுப்பப்பட்டது.",
        "passwordreset-emailerror-capture": "கடவுச்சொல் மீட்டமைக்கும் மின்னஞ்சல்  உருவாக்கப்பட்டுவிட்டது, அது கீழே காட்டப்பட்டுள்ளது, ஆனால் {{GENDER:$2|user}} அனுப்புவது தோல்வியடைந்தது:$1",
        "changeemail": "மின்னஞ்சல் முகவரியை மாற்று / நீக்கு",
        "prefs-help-prefershttps": "இந்த விருப்பத்தேர்வு உங்களின் அடுத்த புகுபதிகையிலிருந்து செயல்பாட்டுக்கு வரும்.",
        "prefswarning-warning": "நீங்கள் உங்கள் விருப்பத்தேர்வுகளில் செய்த மாற்றங்கள் சேமிக்கப்படவில்லை. நீங்கள் $1 இதனை அழுத்தாமல் இப்பக்கத்தை விட்டுச் சென்றால் உங்கள் விருப்பத் தேர்வுகள் புதுப்பிக்கப்படாது.",
        "prefs-tabs-navigation-hint": "குறிப்பு:கீற்றுகளின் பட்டியலில் இடது மற்றும் வலது அம்புக்குறி தட்டச்சுகளைப் பயன்படுத்தி நகரலாம்.",
-       "email-address-validity-valid": "மின்னஞ்சல் முகவரி முறையானதாகத் தோன்றுகிறது",
-       "email-address-validity-invalid": "முறையான மின்னஞ்சல் முகவரியை உள்ளிடுக",
        "userrights": "பயனர் அனுமதி முகாமைத்துவம்",
        "userrights-lookup-user": "பயனர்க் குழுக்களைப் பராமரி",
        "userrights-user-editname": "பயனர் பெயரொன்றை இடுக:",
        "wlheader-showupdated": "உங்கள் கடைசி வருகைக்குப் பின்னர் மாற்றங்கள் செய்யப்பட்ட பக்கங்கள் '''தடித்த எழுத்துக்களில்''' காட்டப்பட்டுள்ளன",
        "wlnote": "பின்வருவன கடைசி {{PLURAL:$2|மணித்தியாலத்தில்|'''$2''' மணித்தியாலங்களில்}} செய்யப்பட்ட {{PLURAL:$1|கடைசி ஒரு மாற்றமாகும்|கடைசி $1 மாற்றங்களாகும்}}.",
        "wlshowlast": "கடைசி $1 மணித்தியாலங்கள் $2 நாட்களைக் காட்டு",
+       "watchlistall2": "அனைத்து",
        "watchlist-options": "கவனிப்பு பட்டியலின் விருப்பத் தேர்வுகள்",
        "watching": "கவனிக்கப்படுகிறது...",
        "unwatching": "கவனிப்பு விடப்படுகிறது...",
        "movenosubpage": "இந்த பக்கம் துணைப்பக்கம் ஏதும் கொண்டிருக்கவில்லை.",
        "movereason": "காரணம்:",
        "revertmove": "முன்நிலையாக்கு",
-       "delete_and_move": "நீக்கிவிட்டு நகர்த்து",
        "delete_and_move_text": "==நீக்கம் தேவை==\n\nநகர்த்தப்படவேண்டியப் பக்கம் \"[[:$1]]\" ஏற்கனவே உள்ளது. நகர்த்தலுக்கு வழி ஏற்படுத்த அப்பக்கத்தை நீக்க வேண்டுமா?",
        "delete_and_move_confirm": "ஆம், இப்பக்கத்தை நீக்குக",
        "delete_and_move_reason": "''[[$1]]'' லிருந்து நகர்த்துவதற்கு இடமளிப்பதற்காக நீக்கப்பட்டது",
index 73b3b6a..23253ef 100644 (file)
@@ -5,32 +5,39 @@
                        "VASANTH S.N.",
                        "VinodSBangera",
                        "아라",
-                       "Vishwanatha Badikana"
+                       "Vishwanatha Badikana",
+                       "Bharathesha Alasandemajalu",
+                       "Soundarya shetty s",
+                       "రహ్మానుద్దీన్"
                ]
        },
        "tog-underline": "ಲಿಂಕ್’ಲೆದ ತಿರ್ತ್ ಗೆರೆ(ಅಂಡರ್ ಲೈನ್) ಪಾಡ್’ಲೆ",
        "tog-hideminor": "ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲೆನ್ ದೆಂಗಾಲೆ",
-       "tog-extendwatchlist": "ಅನ್ವಯಿಸುನಂಚಿನ ಪೂರಾ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾಯೆರೆ ಪಟ್ಟಿನ್(ವಾಚ್ ಲಿಸ್ಟ್) ಬುಡ್ಪಾಲೆ.",
-       "tog-usenewrc": "ಪರಿಷ್ಕರಿಸ್ ನ ಬದಲಾವಣೆಲು (JavaScript)",
+       "tog-hidepatrolled": "ಕಾತೊಂದಿಪ್ಪುನ ಸಂಪದನೆಲೆನ್ ಇಂಚಿಪೊದ ಬದಲಾವಣೆಡ್ ಅಡೆಂಗಲ",
+       "tog-newpageshidepatrolled": "ಕಾತೊಂದಿಪ್ಪುನ ಪುಟೊಲೆನ್ ಪೊಸ ಪುಟೊಕುಲೆ ಪಟ್ಟಿಡ್ ಅಡೆಂಗಲ",
+       "tog-hidecategorization": "ವಿಂಗಡಿತ್‍ನ ಪುಟೊಲೆನ್ ಅಡೆಂಗಲ",
+       "tog-extendwatchlist": "ಕೇವಲೊ ಇಂಚಿಪೊದ ಬದಲಾವಣೆಲತ್ತಂದೆ, ಸಂಬಂದೊ ಇಪ್ಪುನ ಮಾತ ಬದಲಾವಣೆನ್ಲಾ ತೋಜುನಂಚನೆ ಪಟ್ಟಿನ್ ವಿಸ್ತರಿಸಲೆ",
+       "tog-usenewrc": "ಇಂಚಿಪೊದ ಬದಲಾವಣೆ ಬೊಕ್ಕೊ ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಗುಂಪು ಪುಟೊ ಬದಲಾವಣೆ",
        "tog-numberheadings": "ಹೆಡ್ಡಿಂಗ್’ಲೆಗ್ ಸಂಖ್ಯೆಲೆನ್ ತೊಜ್ಪಾಲೆ",
-       "tog-showtoolbar": "ಸಂಪಾದನೆದ ಉಪಕರಣನ್(ಎಡಿಟ್ ಟೂಲ್ ಬಾರ್) ತೊಜ್ಪಾಲೆ (JavaScript)",
-       "tog-editondblclick": "ರಡ್ಡ್ ಸರಿ ಕ್ಲಿಕ್ ಮಲ್ತ್’ದ್ ಪುಟೊನು ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ (JavaScript)",
-       "tog-editsectiononrightclick": "ಪುಟೊತ ವಿಭಾಗೊಲೆನ್ ಐತ ಹೆಡ್ಡಿಂಗ್’ನ್ ರೈಟ್ ಕ್ಲಿಕ್ ಮಲ್ತ್’ದ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆಕ ಉಪ್ಪಡ್ (JavaScript)",
-       "tog-watchcreations": "ಯಾನ್ ಶುರು ಮಲ್ತಿನ ಪುಟೊಲೆನ್ ಯೆನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
-       "tog-watchdefault": "ಯಾನ್ ಸಂಪಾದನೆ ಮನ್ಪುನಂಚಿನ ಪುಟೊಲೆನ್ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
-       "tog-watchmoves": "ಯಾನ್ ಮೂವ್ ಮಲ್ತಿನಂಚಿನ ಪುಟೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
-       "tog-watchdeletion": "ಯಾನ್ ಓಚ್ಚಿನ(ಡಿಲೀಟ್ ಮಲ್ತಿನ) ಪುಟೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
+       "tog-showtoolbar": "ಸಂಪಾದನೆದ ಉಪಕರಣೊ ಪಟ್ಟಿನ್ ತೋಜಾವು",
+       "tog-editondblclick": "ರಡ್ಡ್ ಸರ್ತಿ ಒತ್ತ್‌ನಗ ಪುಟೊನು ಸಂಪೊಲಿಪುನಂಚ ಆವಡ್",
+       "tog-editsectiononrightclick": "ಪುಟೊತ ವಿಬಾಗೊಲೆನ್ ಐತ ಸೀರ್ಸಿಕೆನ್ ರಡ್ಡ್ ಸರ್ತಿ ಒತ್ತ್‌ನಗ ಸಂಪೊಲಿಪುನಂಚ ಉಪ್ಪಡ್",
+       "tog-watchcreations": "ಯಾನ್ ಶುರು ಮಲ್ತಿನ ಲೇಕನೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
+       "tog-watchdefault": "ಯಾನ್ ಸಂಪೊಲಿಪುನ ಪುಟೊಲೆನ್ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
+       "tog-watchmoves": "ಯಾನ್ ಸ್ತಲಾಂತರಿಸುನ ಪುಟೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
+       "tog-watchdeletion": "ಯಾನ್ ದೆತ್ತ್‌ ಪಾಡುನ ಪುಟೊಲೆನ್ ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾಲೆ",
+       "tog-watchrollback": "ಯಾನ್ ಪಿರ ದೆತೊನುನ ಪುಟೊಲೆನ್ ಎನ್ನ ಗುಮನೊಗು ಸೇರಲೆ",
        "tog-minordefault": "ಪೂರಾ ಸಂಪಾದನೆನ್ಲಾ ಎಲ್ಯ ಪಂಡ್’ದ್ ಗುರ್ತ ಮಲ್ಪುಲೆ",
        "tog-previewontop": "ಮುನ್ನೋಟನ್ ಸಂಪಾದನೆ ಅಂಕಣದ ಮಿತ್ತ್ ತೊಜ್ಪಾಲೆ",
        "tog-previewonfirst": "ಶುರುತ ಬದಲಾವಣೆದ ಬೊಕ್ಕ ಮನ್ನೋಟನ್ ತೊಜ್ಪಾಲೆ",
-       "tog-enotifwatchlistpages": "ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಉಪ್ಪುನಂಚಿನ ಒವಾಂಡಲ ಪುಟ ಬದಲಾಂಡ ಎಂಕ್ ಇ-ಮೇಲ್ ಮಲ್ಪುಲೆ",
+       "tog-enotifwatchlistpages": "ಎನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಉಪ್ಪುನಂಚಿನ ಒವಾಂಡಲ ಪುಟೊ ಬದಲಾನಗ ಎಂಕ್ ಇ-ಅಂಚೆ ಕಡಪುಡ್ಲೆ",
        "tog-enotifusertalkpages": "ಎನ್ನ ಚರ್ಚೆ ಪುಟ ಬದಲಾಂಡ ಎಂಕ್ ಇ-ಮೇಲ್ ಕಡಪುಡ್ಲೆ",
-       "tog-enotifminoredits": "à²\8eಲà³\8dಯà³\86ಲà³\8dಯ à²¬à²¦à²²à²¾à²µà²£à³\86 à²\86à²\82ಡಲ à²\8eà²\82à²\95à³\8d à²\87-ಮà³\87ಲà³\8d à²®à²²à³\8dಪà³\81ಲೆ",
+       "tog-enotifminoredits": "à²\8eಲà³\8dಯà³\86ಲà³\8dಯ à²¬à²¦à²²à²¾à²µà²£à³\86 à²\86à²\82ಡಲ à²\8eà²\82à²\95à³\8d à²\87-à²\85à²\82à²\9aà³\86 à²\95ಡಪà³\81ಡà³\8dಲೆ",
        "tog-enotifrevealaddr": "ಪ್ರಕಟಣೆ ಇ-ಮೇಲ್’ಡ್ ಎನ್ನ ಇ-ಮೇಲ್ ವಿಳಾಸನ್ ತೊಜ್ಪಾಲೆ",
        "tog-shownumberswatching": "ಪುಟೊನು ತೂವೊಂದುಪ್ಪುನಂಚಿನ ಸದಸ್ಯೆರ್’ನ ಸಂಖ್ಯೆನ್ ತೊಜ್ಪಾಲೆ",
        "tog-oldsig": "ಇತ್ತೆದ ಸಹಿ",
-       "tog-fancysig": "ಸರಳ à²¸à²¹à²¿à²\97ಳà³\81 (ಲಿà²\82à²\95à³\8d à²\87à²\9cà³\8dà²\9cಂದಿಲೆಕ)",
-       "tog-uselivepreview": "ನೇರ ಮುನ್ನೋಟನ್ ಉಪಯೋಗ ಮಲ್ಪುಲೆ (JavaScript) (ಪ್ರಾಯೋಗಿಕ)",
+       "tog-fancysig": "ವಿà²\95ಿà²\9fà³\86à²\95à³\8dಸà³\8dâ\80\8cà²\9fà³\8dâ\80\8dà²\97à³\8d à²¦à²¸à³\8dà²\95ತà³\8dತà³\8dâ\80\8cದ à²\89ಪà²\9aಾರà³\8a(ಸà³\8dವà²\82ತà³\8a à²\9aಾಲನà³\86ದ à²\95à³\8aà²\82ಡಿ à²\87ದà³\8dಯಂದಿಲೆಕ)",
+       "tog-uselivepreview": "ನೇರೊ ಮುನ್ನೋಟೊನು ಉಪಯೋಗ ಮಲ್ಪುಲೆ",
        "tog-forceeditsummary": "ಸಂಪಾದನೆ ಸಾರಾಂಶೊನು ಖಾಲಿ ಬುಡ್’ನ್ಡ್ ಎಂಕ್ ನೆನಪು ಮಲ್ಪುಲೆ",
        "tog-watchlisthideown": "ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ ತೊಜ್’ಪಾವೊಚಿ",
        "tog-watchlisthidebots": "ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಬಾಟ್ ಸಂಪಾದನೆಲೆನ್ ದೆಂಗಾಲೆ",
        "tog-watchlisthideliu": "ಲಾಗಿನ್ ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್’ನ ಸಂಪಾದನೆಲೆನ್ ವೀಕ್ಷಣಾಪಟ್ಟಿರ್ದ್ ದೆಂಗಾಲೆ",
        "tog-watchlisthideanons": "ಪುದರಿಜ್ಜಂದಿನ ಬಳಕೆದಾರನ ಸಂಪಾದನೆಲೆನ್ ವೀಕ್ಷಣಾಪಟ್ಟಿರ್ದ್ ದೆಂಗಾಲೆ",
        "tog-watchlisthidepatrolled": "ವೀಕ್ಷಣಾಪಟ್ಟಿಡ್ ಬಾಟ್ ಸಂಪಾದನೆಲೆನ್ ದೆಂಗಾಲೆ",
+       "tog-watchlisthidecategorization": "ವಿಂಗಡಿತ್‍ನ ಪುಟೊಲೆನ್ ಅಡೆಂಗಲ",
        "tog-ccmeonemails": "ಯಾನ್ ಬೇತೆ ಸದಸ್ಯೆರೆಗ್ ಕಡಪುಡ್ಪುನಂಚಿನ ಇ-ಮೇಲ್’ಲೆದ ಪ್ರತಿಲೆನ್(copy) ಎಂಕ್ ಕಡಪುಡ್ಲೆ",
        "tog-diffonly": "ವ್ಯತ್ಯಾಸದ ತಿರ್ತುಪ್ಪುನಂಚಿನ ಪುಟೊತ ವಿವರೊಲೆನ್ ತೊಜ್’ಪಾವೊಚಿ",
        "tog-showhiddencats": "ದೆಂಗಾದಿನ ವರ್ಗೊಲೆನ್ ತೊಜ್ಪಾಲೆ",
+       "tog-norollbackdiff": "ದೆತ್ತ್‌ ಪಾಡ್‍ನೆಡ್‍ದ್ ಬುಕ್ಕೊ ವ್ಯತ್ಯಾಸೊನು ಬುಡ್‍ಲೆ",
+       "tog-useeditwarning": "ಸಂಪೊಲಿತ್‍ನೆನ್ ಒರಿಪಾವಂದೆ ಪಿದಡ್ಂಡ ಎನನ್ ಎಚ್ಚರಿಸಲೆ",
+       "tog-prefershttps": "ಏಪೊಗುಲ ಲಾಗಿನ್ ಆಯಿನ ಬುಕ್ಕೊ ಜಾಗ್ರತೆದ ಸಂಪರ್ಕೊನು  ಬಳಕೆ ಮಲ್ಪುಲೆ",
        "underline-always": "ಯಾಪಲ",
        "underline-never": "ಯಾಪಗ್ಲಾ ಇಜ್ಜಿ",
-       "underline-default": "ಬà³\8dರà³\8cಸರà³\8dâ\80\99ದ à²¯à²¥à²¾à²¸à³\8dಥಿತಿ",
+       "underline-default": "ಬà³\8dರà³\8cಸರà³\8dâ\80\8dದ à²¯à²¤à²¾à²¸à³\8dತಿತಿ",
        "editfont-style": "ಬರೆಪುನ ಜಾಗದ ಅಕ್ಷರದ ಶೈಲಿ",
        "editfont-default": "ಬ್ರೌಸರ್’ದ ಯಥಾಸ್ಥಿತಿ",
+       "editfont-monospace": "ಒಂಜಿ ಜಾಗೆದ ಮುದ್ರೆಲಿಪಿ",
        "editfont-sansserif": "ಸಾನ್ಸ್-ಸೆರಿಫ್ ಲಿಪಿ",
        "editfont-serif": "ಸೆರಿಫ್ ಲಿಪಿ",
-       "sunday": "ಐತಾರ",
-       "monday": "ಸà³\8bಮವಾರ",
-       "tuesday": "ಅಂಗರೆ",
-       "wednesday": "ಬà³\81ಧವಾರ",
-       "thursday": "à²\97à³\81ರà³\81ವಾರ",
-       "friday": "ಶà³\81à²\95à³\8dರವಾರ",
-       "saturday": "ಶನಿವಾರ",
-       "sun": "ರವಿ",
+       "sunday": "ಐತಾರ",
+       "monday": "ಸà³\8bಮಾರà³\8a",
+       "tuesday": "à²\85à²\82à²\97ಾರà³\86",
+       "wednesday": "ಬà³\81ದಾರà³\8a",
+       "thursday": "à²\97à³\81ರà³\8dವಾರà³\8a",
+       "friday": "ಶà³\81à²\95à³\8dರಾರà³\8a",
+       "saturday": "ಸನಿಯಾರà³\8a",
+       "sun": "à²\90ತಾರà³\8a",
        "mon": "ಸೋಮ",
-       "tue": "ಮà²\82à²\97ಳ",
-       "wed": "ಬà³\81ಧ",
+       "tue": "à²\85à²\82à²\97ಾರà³\86",
+       "wed": "ಬà³\81ದ",
        "thu": "ಗುರು",
        "fri": "ಶುಕ್ರ",
-       "sat": "à²ನಿ",
+       "sat": "ಸನಿ",
        "january": "ಜನವರಿ",
-       "february": "ಫೆಬ್ರವರಿ",
-       "march": "ಮಾರà³\8dà²\9aà³\8d",
-       "april": "à²\8fಪ್ರಿಲ್",
+       "february": "ಪೆಬ್ರವರಿ",
+       "march": "ಮಾರà³\8dà²\9aಿ",
+       "april": "à²\8eಪ್ರಿಲ್",
        "may_long": "ಮೇ",
        "june": "ಜೂನ್",
-       "july": "à²\9cà³\81ಲà³\88",
-       "august": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\8d",
-       "september": "ಸà³\86ಪà³\8dà²\9fà²\82ಬರà³\8d",
-       "october": "ಅಕ್ಟೋಬರ",
-       "november": "ನವà²\82ಬರà³\8d",
-       "december": "ಡಿಸà²\82ಬರà³\8d",
+       "july": "à²\9cà³\81ಲಾಯಿ",
+       "august": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\81",
+       "september": "ಸಪà³\8dà²\9fà²\82ಬರ",
+       "october": "ಅಕ್ಟೋಬರ",
+       "november": "ನವà²\82ಬರà³\8a",
+       "december": "ದಸà²\82ಬರà³\8a",
        "january-gen": "ಜನವರಿ",
-       "february-gen": "ಫà³\8dರೆಬ್ರವರಿ",
-       "march-gen": "ಮಾರà³\8dà²\9aà³\8d",
-       "april-gen": "à²\8fಪ್ರಿಲ್",
+       "february-gen": "ಪೆಬ್ರವರಿ",
+       "march-gen": "ಮಾರà³\8dà²\9aಿ",
+       "april-gen": "à²\8eಪ್ರಿಲ್",
        "may-gen": "ಮೇ",
        "june-gen": "ಜೂನ್",
-       "july-gen": "à²\9cà³\81ಲà³\88",
-       "august-gen": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\8d",
-       "september-gen": "ಸಪà³\8dà²\9fà²\82ಬರà³\8d",
-       "october-gen": "ಅಕ್ಟೋಬರ",
-       "november-gen": "ನವà²\82ಬರà³\8d",
-       "december-gen": "ಡಿಸà³\86à²\82ಬರà³\8d",
+       "july-gen": "à²\9cà³\81ಲಾಯಿ",
+       "august-gen": "à²\86à²\97à³\8bಸà³\8dà²\9fà³\81",
+       "september-gen": "ಸಪà³\8dà²\9fà²\82ಬರà³\8a",
+       "october-gen": "ಅಕ್ಟೋಬರ",
+       "november-gen": "ನವà²\82ಬರà³\8a",
+       "december-gen": "ದಸà²\82ಬರà³\8a",
        "jan": "ಜನವರಿ",
-       "feb": "ಫೆಬ್ರವರಿ",
-       "mar": "ಮಾರà³\8dà²\9aà³\8d",
-       "apr": "à²\8fಪ್ರಿಲ್",
+       "feb": "ಪೆಬ್ರವರಿ",
+       "mar": "ಮಾರà³\8dà²\9aಿ",
+       "apr": "à²\8eಪ್ರಿಲ್",
        "may": "ಮೇ",
        "jun": "ಜೂನ್",
-       "jul": "ಜುಲೈ",
-       "aug": "ಆಗೋಸ್ಟ್",
-       "sep": "ಸಪ್ಟಂಬರ್",
-       "oct": "ಅಕ್ಟೋಬರ್",
-       "nov": "ನವಂಬರ್",
-       "dec": "ಡಿಸೆಂಬರ್",
-       "pagecategories": "{{PLURAL:$1|ವರ್ಗ|ವರ್ಗೊಲು}}",
-       "category_header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಲೇಖನೊಲು",
-       "subcategories": "ಉಪವರ್ಗೊಲು",
-       "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರ/ಶಬ್ಧ ಫೈಲ್’ಲು",
+       "jul": "ಜುಲಾಯಿ",
+       "aug": "ಅಗೋಸ್ಟು",
+       "sep": "ಸಪ್ಟಂಬರ",
+       "oct": "ಅಕ್ಟೋಬರ",
+       "nov": "ನವಂಬರೊ",
+       "dec": "ದಸಂಬರೊ",
+       "january-date": "ಜನವರಿ $1",
+       "february-date": "ಪೆಬ್ರುವರಿ $1",
+       "march-date": "ಮಾರ್ಚಿ $1",
+       "april-date": "ಎಪ್ರಿಲ್ $1",
+       "may-date": "ಮೇ $1",
+       "june-date": "ಜೂನ್ $1",
+       "july-date": "ಜುಲಾಯಿ $1",
+       "august-date": "ಆಗೋಸ್ಟ್ $1",
+       "september-date": "ಸಪ್ಟಂಬರೊ $1",
+       "october-date": "ಅಕ್ಟೋಬರ $1",
+       "november-date": "ನವಂಬರ $1",
+       "december-date": "ದಸಂಬರ $1",
+       "pagecategories": "{{PLURAL:$1|ವರ್ಗೊ|ವರ್ಗೊಲು}}",
+       "category_header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಲೇಕನೊಲು",
+       "subcategories": "ಉಪ ವರ್ಗೊಲು",
+       "category-media-header": "\"$1\" ವರ್ಗಡುಪ್ಪುನಂಚಿನ ಚಿತ್ರೊ/ಶಬ್ಧೊ ಫೈಲ್‍ಲು",
        "category-empty": "''ಈ ವರ್ಗೊಡು ಸದ್ಯಗ್ ಓವುಲ ಪುಟೊಲಾವಡ್ ಅತ್ತ್’ನ್ಡ ಚಿತ್ರೊಲಾವಡ್ ಇಜ್ಜಿ.''",
-       "hidden-categories": "{{PLURAL:$1|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ತಿನ à²µà²°à³\8dà²\97|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ತಿನ ವರ್ಗೊಲು}}",
+       "hidden-categories": "{{PLURAL:$1|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ಡà³\8dâ\80\8dನ à²µà²°à³\8dà²\97à³\8a|ದà³\86à²\82à²\97ಾದà³\8d à²¦à³\80ಡà³\8dâ\80\8dನ ವರ್ಗೊಲು}}",
        "hidden-category-category": "ದೆಂಗಾದ್ ದೀತಿನ ವರ್ಗೊಲು",
-       "category-subcat-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\89ಪವರà³\8dà²\97 à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-subcat-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\89ಪವರà³\8dà²\97 à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|ಉಪವರ್ಗೊನು|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-subcat-count-limited": "ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ತೊಜ್ಪಾದಿನ {{PLURAL:$1|ಉಪವರ್ಗ|$1 ಉಪವರ್ಗೊಲು}} ಉಂಡು.",
-       "category-article-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\96ಾಲಿ à²\92à²\82à²\9cಿ à²ªà³\81à²\9f à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
+       "category-article-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\95ಾಲಿ à²\92à²\82à²\9cಿ à²ªà³\81à²\9fà³\8a à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|ಪುಟೊನು|$1 ಪುಟೊಲೆನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಪುಟೊಲು ಉಂಡು.}}",
        "category-article-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಪುಟ ಉಂಡು|$1 ಪುಟೊಲು ಉಂಡು}}.",
-       "category-file-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\96ಾಲಿ à²\92à²\82à²\9cಿ à²«à³\88ಲà³\8d à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ {{PLURAL:$1|ಫà³\88ಲà³\8dâ\80\99ನà³\8d|$1 à²«à³\88ಲà³\8dâ\80\99ಲà³\86ನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-file-count": "{{PLURAL:$2|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²\95ಾಲಿ à²\92à²\82à²\9cಿ à²«à³\88ಲà³\8d à²\89à²\82ಡà³\81.|à²\88 à²µà²°à³\8dà²\97à³\8aಡà³\81 à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1| à²«à³\88ಲà³\8dâ\80\8dನà³\8d|$1  à²«à³\88ಲà³\8dâ\80\8dನ್}} ಸೇರ್ಪಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
        "category-file-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಫೈಲ್ ಉಂಡು|$1 ಫೈಲ್’ಲು ಉಂಡು}}.",
-       "listingcontinuesabbrev": "ಮà³\81à²\82ದು.",
+       "listingcontinuesabbrev": "ದà³\81à²\82ಬು.",
        "index-category": "ವಿಷಯ ಸೂಚಿ ಪುಟಕ್‘ಲು",
        "noindex-category": "ವಿಷಯಸೂಚಿ ಇಜ್ಜಾಂದಿನ ಪುಟಕ್‘ಲು",
        "broken-file-category": "ಪುಟಡ್ ಇಜ್ಜಂದಿನ ಕಡತದ ಕೊಂಡಿಲು",
        "about": "ಎಂಕ್ಲೆನ ಬಗ್ಗೆ",
        "article": "ಲೇಖನ ಪುಟ",
-       "newwindow": "(ಪà³\8aಸ à²\95à²\82ಡಿನà³\8d à²\93ಪನà³\8d à²®à²²à³\8dಪà³\81à²\82ಡà³\81)",
-       "cancel": "ವà²\9cಾ à²®à²¨್ಪುಲೆ",
+       "newwindow": "(ಪà³\8aಸ à²\95à²\82ಡಿನà³\8d à²¦à³\86ಪà³\8dಪà³\81ಲà³\86)",
+       "cancel": "ವà²\9cಾ à²®à²²್ಪುಲೆ",
        "moredotdotdot": "ನನಲ...",
-       "mypage": "ಎನ್ನ ಪುಟ",
+       "morenotlisted": "ಈ ಪಟ್ಟಿ ಪೂರ್ತಿ ಆತ್‍ಜಿ.",
+       "mypage": "ಎನ್ನ ಪುಟೊ",
        "mytalk": "ಎನ್ನ ಚರ್ಚೆ",
        "anontalk": "ಈ ಐ.ಪಿ ಗ್ ಪಾತೆರ್’ಲೆ",
-       "navigation": "ಸಂಚಾರ",
+       "navigation": "ಸಂಚಾರ",
        "and": "&#32;ಬೊಕ್ಕ",
        "qbfind": "ನಾಡ್’ಲೆ",
        "qbbrowse": "ಬ್ರೌಸ್",
        "faq": "ಸಾಮಾನ್ಯವಾದ್ ಕೇನುನ ಪ್ರಶ್ನೆಲು",
        "faqpage": "Project:ಸಾಮಾನ್ಯವಾದ್ ಕೇನುನ ಪ್ರಶ್ನೆಲು",
        "actions": "ಕ್ರಿಯೆಕ್ಕುಲು",
-       "namespaces": "ಪುದರ್ ದ ವರ್ಗೊಲು",
-       "variants": "ರà³\82ಪಾà²\82ತರ à²¹à³\8aà²\82ದà³\8dâ\80\98ನ",
-       "navigation-heading": "ಸà²\82à²\9aರಣà³\86 ಮೆನು",
+       "namespaces": "ಪುದರ್ದ ವರ್ಗೊಲು",
+       "variants": "ದಿà²\82à²\9c",
+       "navigation-heading": "ಸà²\82à²\9aಾರà³\8aದ ಮೆನು",
        "errorpagetitle": "ದೋಷ",
-       "returnto": "$1 ಗ್ ಪಿರ ಪೋಲೆ.",
-       "tagline": "{{SITENAME}} ರ್ದ್",
-       "help": "ಸಹಾಯ",
-       "search": "ನಾಡ್",
-       "searchbutton": "ನಾಡ್",
+       "returnto": "$1ಗ್ ಪಿರಪೋಲೆ.",
+       "tagline": "{{SITENAME}}ರ್ದ್",
+       "help": "ಸಹಾಯ",
+       "search": "ನಾಡ್‍ಲೆ",
+       "searchbutton": "ನಾಡ್‍ಲೆ",
        "go": "ಪೋ",
-       "searcharticle": "ಪೋ",
+       "searcharticle": "ಪೋಲೆ",
        "history": "ಪುಟೊತ ಚರಿತ್ರೆ",
-       "history_short": "ಇತಿಹಾಸ",
+       "history_short": "ಇತಿಹಾಸ",
        "updatedmarker": "ಎನ್ನ ಅಕೇರಿದ ವೀಕ್ಷಣೆ ಡ್ದ್ ಬುಕ್ಕ ಆಯಿನ ಬದಲಾವಣೆಲು",
        "printableversion": "ಪ್ರಿಂಟ್ ಆವೃತ್ತಿ",
-       "permalink": "ಸà³\8dಥಿರ à²¸à²\82ಪರà³\8dà²\95",
+       "permalink": "ಸà³\8dತಿರà³\8a à²\95à³\8aà²\82ಡಿ",
        "print": "ಪ್ರಿ೦ಟ್ ಮನ್ಪುಲೆ",
        "view": "ತೂಲೆ",
-       "view-foreign": "$1ಡ್ ತೂಲೆ",
-       "edit": "ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ(Edit this page)",
+       "view-foreign": "$1ಡ್ ಮಿತ್ತ್ ತೂಲೆ",
+       "edit": "ಸಂಪೊಲಿಪುಲೆ",
+       "edit-local": "ಸ್ಥಳೀಯ ವಿವರಣೆನ್ ಸೇರಾಲೆ",
        "create": "ಸೃಷ್ಟಿಸಾಲೆ",
-       "create-local": "ಸ್ಥಳೀಯ ವಿವರಣೆ ಸೇರಾಲೆ",
+       "create-local": "ಸ್ಥಳೀಯ ವಿವರಣೆನ್ ಸೇರಾಲೆ",
        "editthispage": "ಈ ಪುಟೊನು ಬದಲಾಯಿಸಾಲೆ",
        "create-this-page": "ಈ ಪುಟೊನು ಸೃಷ್ಟಿಸಾಲೆ",
        "delete": "ದೆತ್ತ್ ಪಾಡ್ಲೆ",
        "deletethispage": "ಈ ಪುಟೊನು ದೆತ್ತ್ ಪಾಡ್ಲೆ",
+       "undeletethispage": "ಈ ಪುಟೊ ದೆತ್ತ್‌ ಪಾಡುನವು ರದ್ದಾತ್ಂಡ್",
        "undelete_short": "ಪಿರ ಪಾಡ್ಲೆ {{PLURAL:$1|ಒ೦ಜಿ ಬದಲಾವಣೆ|$1 ಬದಲಾವಣೆಲು}}",
        "viewdeleted_short": "ನೋಟ{{PLURAL:$1|1 ಡಿಲೀಟ್ ಆತಿನ ಸಂಪಾದನೆ|$1 ಡಿಲೀಟ್ ಆತಿನ ಸಂಪಾದನೆಲು}}",
        "protect": "ಸ೦ರಕ್ಷಿಸಾಲೆ",
        "protect_change": "ಬದಲಾಲೆ",
        "protectthispage": "ಈ ಪುಟೊನು ಸ೦ರಕ್ಷಿಸಾಲೆ",
-       "unprotect": "ಸ೦ರà²\95à³\8dಷಣà³\86 à²¦à³\86ಪà³\8dಲೆ",
-       "unprotectthispage": "à²\88 à²ªà³\81à²\9fà³\8aತ à²¸à³¦à²°à²\95à³\8dಷಣà³\86ನà³\8d à²¦à³\86ಪà³\8dಲೆ",
+       "unprotect": "ರà²\95à³\8dಷಣà³\86ನà³\8d à²¬à²¦à²²à³\8dâ\80\8dಪà³\81ಲೆ",
+       "unprotectthispage": "à²\88 à²ªà³\81à²\9fà³\8aತ à²°à²\95à³\8dಷಣà³\86ನà³\8d à²¬à²¦à²²à³\8dâ\80\8dಪà³\81ಲೆ",
        "newpage": "ಪೊಸ ಪುಟೊ",
        "talkpage": "ಪುಟದ ಬಗ್ಗೆ ಚರ್ಚೆ ಮನ್ಪುಲೆ",
-       "talkpagelinktext": "ಪಾತೆರ",
+       "talkpagelinktext": "ಪಾತೆರ್ಲೆ",
        "specialpage": "ವಿಶೇಷ ಪುಟ",
-       "personaltools": "ವà³\88ಯà²\95à³\8dತಿà²\95 à²\89ಪà²\95ರಣಲು",
+       "personaltools": "ಸà³\8dವà²\82ತà³\8a à²\89ಪà²\95ರಣà³\8aಲು",
        "articlepage": "ಲೇಖನ ಪುಟೊನು ತೂಲೆ",
        "talk": "ಚರ್ಚೆ",
-       "views": "ನà³\8bà²\9fಲು",
+       "views": "à²\85ಬಿಪà³\8dರಾಯà³\8aಲು",
        "toolbox": "ಉಪಕರಣೊಲು",
        "userpage": "ಸದಸ್ಯೆರ್ನ ಪುಟೊನು ತೂಲೆ",
        "projectpage": "ಪ್ರೊಜೆಕ್ಟ್ ಪುಟೊನು ತೂಲೆ",
-       "imagepage": "ಮà³\80ಡಿಯ ಪುಟೊನು ತೂಲೆ",
+       "imagepage": "ಫà³\88ಲà³\8dâ\80\8dದ ಪುಟೊನು ತೂಲೆ",
        "mediawikipage": "ಸಂದೇಶ ಪುಟೊನು ತೂಲೆ",
        "templatepage": "ಟೆಂಪ್ಲೇಟ್ ಪುಟೊನು ತೂಲೆ",
        "viewhelppage": "ಸಹಾಯ ಪುಟೊನು ತೂಲೆ",
        "categorypage": "ವರ್ಗ ಪುಟೊನು ತೂಲೆ",
        "viewtalkpage": "ಚರ್ಚೆನ್ ತೂಲೆ",
-       "otherlanguages": "ಬà³\87ತà³\86 à²­à²¾à²·ೆಲೆಡ್",
-       "redirectedfrom": "($1 à²°à³\8dದà³\8d à²ªà³\81ನರà³\8dನಿರà³\8dದà³\87ಶಿತ)",
+       "otherlanguages": "ಬà³\87ತà³\86 à²¬à²¾à²¸ೆಲೆಡ್",
+       "redirectedfrom": "($1 à²°à³\8dದà³\8d à²ªà²¿à²° à²¨à²¿à²°à³\8dದà³\87ಸನà³\8aದ)",
        "redirectpagesub": "ಪುನರ್ನಿರ್ದೇಶನ ಪುಟ",
-       "lastmodifiedat": "ಈ ಪುಟ ಇಂದೆತ ದುಂಬು $2, $1 ಕ್ ಬದಲಾತ್’ನ್ಡ್.",
+       "redirectto": "ಪಿರ ಕಡಪುಡ್ಲೆ:",
+       "lastmodifiedat": "ಈ ಪುಟೊ ಇಂದೆತ ದುಂಬು $2, $1 ಗ್ ಬದಲಾತ್ಂಡ್.",
        "viewcount": "ಈ ಪುಟೊನು {{PLURAL:$1|1 ಸರಿ|$1 ಸರಿ}} ತೂತೆರ್.",
        "protectedpage": "ಸಂರಕ್ಷಿತ ಪುಟ",
-       "jumpto": "ಇಡೆ ಪೋಲೆ:",
-       "jumptonavigation": "ಸಂಚಾರ",
-       "jumptosearch": "ನಾಡ್’ಲೆ",
+       "jumpto": "ಇಡೆಗ್ ಪೋಲೆ:",
+       "jumptonavigation": "ಸಂಚಾರೊ",
+       "jumptosearch": "ನಾಡ್‍ಲೆ",
+       "view-pool-error": "ಕ್ಷಮಿಸಲೆ, ಸರ್ವಲು ಈ ಕ್ಷಣೊಡ್ದು ದಿಂಜ ದಿನ್ನೊ ಆತ್ಂಡ್.\nಮಸ್ತ್ ಬಳಕೆದಾರೆರ್ ಈ ಪುಟೊನು ತೂಯೆರೆ ಪ್ರಯತ್ನಿಸವೊಂದುಲ್ಲೆರ್.  ಈರ್ ಬುಕ್ಕೊ \nಈರ್ ಈ ಪುಟೊಕು ನಾನೊರೊ ತೂಯೆರೆ ಪ್ರಯತ್ನಿಸಲೆ ಸುರುಕು ದಯೊಮಲ್ತ್ ಕಾಪುಲೆ.\n$1",
+       "generic-pool-error": "ಕ್ಷಮಿಸಲೆ, ಸರ್ವಲು ಈ ಕ್ಷಣೊಡ್ದು ದಿಂಜ ದಿನ್ನೊ ಆತ್ಂಡ್.\nಮಸ್ತ್ ಬಳಕೆದಾರೆರ್ ಈ ಸಂಪನ್ಮೂಲೊನು ತೂಯೆರೆ ಪ್ರಯತ್ನಿಸವೊಂದುಲ್ಲೆರ್.  ಈರ್ ಈ ಸಂಪನ್ಮೂಲೊನು ನಾನೊರೊ ತೂಯೆರೆ ಪ್ರಯತ್ನಿಸಲೆ ಸುರುಕು ದಯೊಮಲ್ತ್ ಕಾಪುಲೆ.",
+       "pool-timeout": "ಪೊರ್ತಾತ್ಂಡ್ ಬೀಗೊ ದೆಪ್ಪುನೇಟ ಕಾಪುಲೆ",
+       "pool-queuefull": "ಪ್ರಕ್ರಿಯೆದ ವಿಸೇಸೊ ಕ್ಯೂ ಮುಗಿದ್ಂಡ್",
        "pool-errorunknown": "ಗೊತ್ತಿಂಜಂದಿನ  ದೋಷ",
-       "aboutsite": "{{SITENAME}} ದ ಬಗ್ಗೆ",
-       "aboutpage": "Project:ನಮ್ಮ ಬಗ್ಗೆ",
-       "copyright": "ಉಂದು ಈ ಕಾಪಿರೈಟ್‌ಡ್ ಲಭ್ಯವುಂಡು $1.",
-       "copyrightpage": "{{ns:project}}:ಕೃತಿಸ್ವಾಮ್ಯತೆಲು",
+       "pool-servererror": "ಪೂಲ್ ಕೌಂಟರ್ ಸೇವೆ ತಿಕೊಂದಿದ್ದಿ ($1).",
+       "poolcounter-usage-error": "ಬಳಕೆದ ದೋಸೊ: $1",
+       "aboutsite": "{{SITENAME}} ದ ಬಗೆಟ್",
+       "aboutpage": "Project:ಬಗೆಟ್",
+       "copyright": "ವಿಸೇಸವಾದ್ ಪಂಡ್‍ಜಂಡ ಉಂದು \"$1\" ಈ ಕಾಪಿರೈಟ್‌ಡ್ ಲಭ್ಯವುಂಡು.",
+       "copyrightpage": "{{ns:project}}:ಕೃತಿ ಸ್ವಾಮ್ಯತೆಲು",
        "currentevents": "ಇತ್ತೆದ ಸಂಗತಿಲು",
        "currentevents-url": "Project:ಇತ್ತೆದ ಸಂಗತಿಲು",
-       "disclaimers": "ಅಬಾಧ್ಯತೆಲು",
-       "disclaimerpage": "Project:ಸಾಮಾನ್ಯ ಅಬಾಧ್ಯತೆಲು",
-       "edithelp": "ಸಂಪಾದನೆ(ಎಡಿಟ್) ಮಲ್ಪೆರೆ ಸಹಾಯ",
+       "disclaimers": "ಹಕ್ಕ್‌ ಬುಡ್‍ನ",
+       "disclaimerpage": "Project:ಸಾಮಾನ್ಯೊ ಹಕ್ಕ್‌ ಬುಡ್‌ನ",
+       "edithelp": "ಸಂಪಾದನೆಗ್ ಸಹಾಯೊ",
+       "helppage-top-gethelp": "ಸಹಾಯೊ",
        "mainpage": "ಮುಖ್ಯ ಪುಟ",
        "mainpage-description": "ಮುಖ್ಯ ಪುಟ",
        "policy-url": "Project:ನಿಯಮಾವಳಿ",
-       "portal": "ಸಮುದಾಯ ಪುಟ",
-       "portal-url": "Project:ಸಮುದಾಯ ಪುಟ",
-       "privacy": "à²\96ಾಸà²\97ಿ à²¨à²¿à²¯à²®à²¾à²µà²³ಿ",
-       "privacypage": "Project:à²\96ಾಸà²\97ಿಮಾಹಿತಿ à²¨à²¿à²¯à²®",
+       "portal": "ಸಮುದಾಯೊ ಪುಟೊ",
+       "portal-url": "Project:ಸಮುದಾಯೊ ಪುಟೊ",
+       "privacy": "à²\95ಾಸà²\97ಿ à²\95ಾರà³\8dಯà³\8aನà³\80ತಿ",
+       "privacypage": "Project:à²\95ಾಸà²\97ಿ à²\95ಾರà³\8dಯà³\8aನà³\80ತಿ",
        "badaccess": "ಅನುಮತಿ ದೋಷ",
        "badaccess-group0": "ಈರ್ ಕೇನಿನ ಬೇಲೆನ್ ಮಲ್ಪೆರೆ ಇರೆಗ್ ಅನುಮತಿ ಇಜ್ಜಿ.",
-       "badaccess-groups": "ಈರ್ ಕೇನಿನಂಚಿನ ಕ್ರಿಯೆ ಖಾಲಿ $1 ಗುಂಪುಲೆಡ್ ಒಂಜೆಕ್ ಸೇರ್ದುಪ್ಪುನ ಬಳಕೆದಾರೆರೆಗ್ ಮಾತ್ರ.",
+       "badaccess-groups": "ಈರ್ ಕೇನಿನಂಚಿನ ಕ್ರಿಯೆ ಖಾಲಿ ಈ {{PLURAL:$2|ಗುಂಪುಗು|ಗುಂಪುಲೆಡ್ ಒಂಜೆಗ್}} ಸೇರ್ದುಪ್ಪುನ ಬಳಕೆದಾರೆರೆಗ್ ಮಾಂತ್ರೊ: $1.",
        "versionrequired": "ಮೀಡಿಯವಿಕಿಯದ $1 ನೇ ಅವೃತ್ತಿ ಬೋಡು",
        "versionrequiredtext": "ಈ ಪುಟೊನು ತೂಯೆರೆ ಮೀಡಿಯವಿಕಿಯದ $1 ನೇ ಆವೃತ್ತಿ ಬೋಡು.\n[[Special:Version|ಆವೃತ್ತಿ]] ಪುಟನು ತೂಲೆ.",
        "ok": "ಸರಿ",
-       "retrievedfrom": "\"$1\" ರ್ದ್ ದೆತ್ತಿನಂಚಿನ",
+       "retrievedfrom": "\"$1\"ರ್ದ್ ದೆತೊನ್ನಂಚಿನ",
        "youhavenewmessages": "ಇರೆಗ್ $1 ಉಂಡು ($2).",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|ನಿಕ್ಕ್}} {{PLURAL:$3|ನಾನ ಒರಿ ಸದಸ್ಯಡ್ದ್|$3 ಸದಸ್ಯೆರೆಗ್}} $1 ಉಂಡು. ($2)",
+       "youhavenewmessagesmanyusers": " ನಿಕ್ಲೆಗ್ ದಿಂಜ ಸದಸ್ಯೆರೆಡ್ದ್ $1 ಉಂಡು ($2).",
+       "newmessageslinkplural": "{{PLURAL:$1|ಒಂಜಿ ಪೊಸ ಸಂದೇಸೊ|999=ಪೊಸ ಸಂದೇಸೊಲು}}",
+       "newmessagesdifflinkplural": "ಇಂಚಿಪದೊದ{{PLURAL:$1|ಬದಲಾವಣೆ|999=ಬದಲಾವಣೆಲು}}",
        "youhavenewmessagesmulti": "$1 ಡ್ ಇರೆಗ್ ಪೊಸ ಸಂದೇಶೊಲು ಉಂಡು",
-       "editsection": "ಸà²\82ಪಾದನà³\86 à²®à²²à³\8dಪುಲೆ",
-       "editold": "ಸà²\82ಪಾದನà³\86 à²®à²²à³\8dಪುಲೆ",
+       "editsection": "ಸà²\82ಪà³\8aಲಿಪುಲೆ",
+       "editold": "ಸà²\82ಪà³\8aಲಿಪುಲೆ",
        "viewsourceold": "ಮೂಲೊನು ತೂಲೆ",
-       "editlink": "à²\8eಡಿà²\9fà³\8d à²®à²²à³\8dಪುಲೆ",
+       "editlink": "ಸà²\82ಪà³\8aಲಿಪುಲೆ",
        "viewsourcelink": "ಮೂಲೊನು ತೂಲೆ",
-       "editsectionhint": "$1 à²µà²¿à²­à²¾à²\97ದ à²¸à²\82ಪಾದನà³\86 à²®à²²à³\8dಪುಲೆ",
+       "editsectionhint": "$1 à²µà²¿à²¬à²¾à²\97à³\8aನà³\81 à²¸à²\82ಪà³\8aಲಿಪುಲೆ",
        "toc": "ಪರಿವಿಡಿ",
        "showtoc": "ತೊಜ್ಪಾವು",
        "hidetoc": "ದೆಂಗಾವು",
        "collapsible-collapse": "ಕುಗ್ಗಿಸಾಲ",
        "collapsible-expand": "ವಿಸ್ತಾರ ಮಲ್ಪುಲೆ",
+       "confirmable-confirm": "{{GENDER:$1|ನಿಕ್ಲ್}} ಕಂಡಿತೊನೆ?",
+       "confirmable-yes": "ಅಂದ್",
+       "confirmable-no": "ಅತ್ತ್",
        "thisisdeleted": "$1 ನ್ ತೂವೊಡೆ ಅತ್ತ್ ದುಂಬುದ ಲೆಕೆ ಮಲ್ಪೊಡೆ?",
        "viewdeleted": "$1 ನ್ ತೂವೊಡೆ?",
        "restorelink": "{{PLURAL:$1|1 ಡಿಲೀಟ್ ಆತಿನ ಸಂಪಾದನೆ|$1 ಡಿಲೀಟ್ ಆತಿನ ಸಂಪಾದನೆಲು}}",
        "feedlinks": "ಫೀಡ್:",
        "feed-invalid": "ಇನ್ವಾಲಿಡ್ ಸಬ್ಸ್’ಕ್ರಿಪ್ಶನ್ ಫೀಡ್ ಟೈಪ್.",
-       "feed-unavailable": "{{SITENAME}} à²¡à³\8d à²¸à²¿à²\82ಡಿà²\95à³\87ಶನà³\8d à²«à³\80ಡà³\8d à²²à²­à³\8dಯವಿà²\9cà³\8dà²\9cಿ",
+       "feed-unavailable": "{{SITENAME}} à²¡à³\8d à²¸à²¿à²\82ಡಿà²\95à³\87ಶನà³\8d à²«à³\80ಡà³\8d à²²à²¬à³\8dಯà³\8a à²\87ದà³\8dದಿ.",
        "site-rss-feed": "$1 RSS ಫೀಡ್",
        "site-atom-feed": "$1 ಆಟಮ್ ಫೀಡ್",
        "page-rss-feed": "\"$1\" RSS ಫೀಡ್",
        "page-atom-feed": "\"$1\" ಪುಟೊತ Atom ಫೀಡ್",
        "feed-atom": "Atom",
        "feed-rss": "RSS",
-       "red-link-title": "$1 (ಈ ಪುಟ ನನಲ ಅಸ್ತಿತ್ವಡ್ ಇಜ್ಜಿ)",
+       "red-link-title": "$1 (ಈ ಪುಟೊ ನನಲ ಅಸ್ತಿತ್ವೊಡ್ ಇದ್ದಿ)",
        "sort-descending": "ಇಳಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ",
        "sort-ascending": "ಏರಿಕೆ ಕ್ರಮೊಟ್ಟು ಜೋಡಿಸಾಲ",
-       "nstab-main": "ಪುಟ",
-       "nstab-user": "ಸದಸà³\8dಯà³\86ರà³\8dನ à²ªà³\81à²\9f",
+       "nstab-main": "ಪುಟ",
+       "nstab-user": "ಸದಸà³\8dಯà³\86ರà³\86ನ à²ªà³\81à²\9fà³\8a",
        "nstab-media": "ಮೀಡಿಯ ಪುಟ",
-       "nstab-special": "ವಿಶà³\87ಷ à²ªà³\81à²\9f",
-       "nstab-project": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8d à²ªà³\81à²\9f",
+       "nstab-special": "ವಿಸà³\87ಸà³\8a à²ªà³\81à²\9fà³\8a",
+       "nstab-project": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8a",
        "nstab-image": "ಫೈಲ್",
        "nstab-mediawiki": "ಸಂದೇಶ",
-       "nstab-template": "ಫಲà²\95",
+       "nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\86à²\9fà³\8d",
        "nstab-help": "ಸಹಾಯ ಪುಟ",
-       "nstab-category": "ವರ್ಗ",
+       "nstab-category": "ವರ್ಗೊ",
+       "mainpage-nstab": "ಮುಖ್ಯ ಪುಟ",
        "nosuchaction": "ಈ ರೀತಿದ ಓವು ಕ್ರಿಯೆಲಾ(ಆಕ್ಶನ್) ಇಜ್ಜಿ",
-       "nosuchactiontext": "ಈ URLದ ಒಟ್ಟಿಗೆ ಉಪ್ಪುನ ಕ್ರಿಯೆನ್ ವಿಕಿ ಗುರ್ತ ಪತ್ತುಜಿ",
+       "nosuchactiontext": "ಈ URLದ ಒಟ್ಟಿಗೆ ಉಪ್ಪುನ ಕ್ರಿಯೆನ್ ವಿಕಿ ಗುರ್ತ ಪತ್ತುಜಿ{{SITENAME}}.",
        "nosuchspecialpage": "ಈ ಪುದರ್’ದ ಒವುಲಾ ವಿಷೇಶ ಪುಟ ಇಜ್ಜಿ",
        "nospecialpagetext": "<strong>ಈರ್ ಅಸ್ಥಿತ್ವಡ್ ಇಜ್ಜಂದಿನ ವಿಷೇಶ ಪುಟೊನು ಕೇನ್ದರ್.</strong>\n\nಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪುನಂಚಿನ ವಿಷೇಶ ಪುಟೊಲ್ದ ಪಟ್ಟಿ [[Special:SpecialPages|{{int:specialpages}}]] ಡ್ ಉಂಡು.",
        "error": "ದೋಷ",
        "databaseerror": "ಡೇಟಾಬೇಸ್ ದೋಷ",
+       "databaseerror-text": "ಡೇಟಾಬೇಸ್ ವಿಚಾರೊಡು ದೋಸೊ ತೋಜಿದ್ ಬತ್ತ್ಂಡ್.  ಈ ತಂತ್ರಾಸೊ ಒಂಜಿ ದೋಸೊನು ತೋಜಾವೊಂದುಂಡು.",
+       "databaseerror-textcl": "ಡೇಟಾಬೇಸ್ ವಿಚಾರೊಡು ದೋಸೊ ತೋಜಿದ್ ಬರೊಂದುಂಡು.",
+       "databaseerror-query": "ವಿಚಾರೊ: $1",
+       "databaseerror-function": "ಕಾರ್ಯೊ: $1",
+       "databaseerror-error": "ದೋಸೊ: $1",
+       "laggedslavemode": "<strong>ಎಚ್ಚರೊ:</strong> ಪುಟೊಡು ಇಂಚಿಪದ ಬದಲಾವಣೆಲೆನ್ ತೂವೊಲಿ.",
        "readonly": "ಡಾಟಾಬೇಸ್ ಲಾಕ್ ಆತ್೦ಡ್",
+       "enterlockreason": "ಡೇಟಬೇಸ್ ಮುಚ್ಚುನ ಕಾರಣೊನು ಬೊಕ್ಕೊ ನಾನೊರೊ ಅಯಿನ್ ದೆಪ್ಪುನ ಅಂದಾಜಿದ ಪೊರ್ತುನು ತೆರಿಪಾಲೆ",
        "missing-article": "\"$1\" $2 ಪುದರ್’ದ ಪುಟ ದೇಟಬೇಸ್’ಡ್ ಇಜ್ಜಿ.\n\nಡಿಲೀಟ್ ಮಲ್ತಿನ ಪುಟೊಕು ಸಂಪರ್ಕ ಕೊರ್ಪುನ ಇತಿಹಾಸ ಲಿಂಕ್ ಅತ್ತ್’ನ್ಡ ವ್ಯತ್ಯಾಸ ಲಿಂಕ್’ನ್ ಒತ್ತುನೆರ್ದಾದ್ ಈ ದೋಷ ಸಾಧಾರಣವಾದ್ ಬರ್ಪುಂಡು.\n\nಒಂಜಿ ವೇಳೆ ಅಂಚ ಆದಿಜ್ಜಿಂಡ, ಉಂದು ಒಂಜಿ ಸಾಫ್ಟ್-ವೇರ್ ದೋಷ ಆದುಪ್ಪು.\nಇಂದೆನ್  [[Special:ListUsers/sysop|ವಿಕಿ-ಅಧಿಕಾರಿಗ್]] ತೆರಿಪಾಲೆ.",
        "missingarticle-rev": "(ಮರು-ಆವೃತ್ತಿ#: $1)",
        "internalerror": "ಆ೦ತರಿಕ ದೋಷ",
        "badarticleerror": "ಈ ಪುಟಡ್ ಈರ್ ಪ್ರಯತ್ನಿಸಾನ ಕಾರ್ಯ ಸಾದ್ಯ ಇಜ್ಜಿ",
        "cannotdelete": "ಪುಟ ಅಥವಾ ಹೊತ್ತಗೆ \"$1\" ನ್ ಮಾಜಾವರ ಆಪುಜ್ಜಿ.(ಬೇತೆ ಎರೋ ಮಾಜಾದಿಪ್ಪೆರ್)",
        "cannotdelete-title": "\"$1\" ಮಾಜಾವರೆ ಆಪುಜ್ಜಿ",
-       "badtitle": "ಸರಿ à²\87à²\9cà³\8dà²\9cಾಂದಿನ ಪುದರ್",
-       "badtitletext": "à²\88ರà³\8d à²\95à³\8bರಿನ à²ªà³\81à²\9fದ à²¶à³\80ರà³\8dಷಿà²\95à³\86 à²¸à²¿à²\82ಧà³\81 à²\85ತà³\8dತà³\8d à²\85ಥವಾ à²\96ಾಲಿ à²\85ಥವಾ à²¸à²°à²¿à²¯à²¾à²¤à³\8dâ\80\98ನ à²\95à³\8aà²\82ಡಿಯತà³\8dತಾà²\82ದಿನ à²\85à²\82ತರ à²­à²¾à²·à³\86/à²\85à²\82ತರ à²µà²¿à²\95ಿ à²¸à²\82ಪರà³\8dà²\95.\nà²\90à²\9fà³\8d à²\92à²\82à²\9cಿ à²\85ಥವಾ à²¹à³\86à²\9aà³\8dà²\9aಿ à²¶à³\80ರà³\8dಷಿà²\95à³\86ಡà³\8d à²¬à²³à²\95à³\86 à²®à²²à³\8dಪರ à²¨à²¿à²·à²¿à²¦à³\8dದà³\8dà²\9cವಾಯಿನ à²\85à²\95à³\8dಷರಳು ಇಪ್ಪು.",
-       "perfcached": "à²\88 à²®à²¾à²¹à²¿à²¤à²¿à²²à³\81 à²\95à²\82ಪà³\8dಯà³\81à²\9fರà³\8dâ\80\98ದ à²¤à²¾à²¤à³\8dà²\95ಾಲಿà²\95 à²¨à³\86ನà³\86ಪà³\81ಡà³\8dâ\80\98ದà³\8d à²¬à²¤à³\8dತà³\8dâ\80\98ದà³\8dâ\80\98ನ à²¬à³\8aà²\95à³\8dà²\95 à²¸à²°à²¿à²¯à²¾à²¨ à²¸à³\8dಥಿತಿ à²\86ದಿಪà³\8dಪಾà²\82ದà³\8d 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.",
+       "badtitle": "ಸರಿ à²\87ದà³\8dಯಾಂದಿನ ಪುದರ್",
+       "badtitletext": "à²\88ರà³\8d à²\95à³\8bರಿನ à²ªà³\81à²\9fದ à²¶à³\80ರà³\8dಷಿà²\95à³\86 à²¸à²¿à²\82ಧà³\81 à²\85ತà³\8dತà³\8d à²\85ಥವಾ à²\95ಾಲಿ à²\85ಥವಾ à²¸à²°à²¿à²¯à²¾à²¯à²¿à²¨ à²\95à³\8aà²\82ಡಿ à²\85ತà³\8dತಾà²\82ದಿನ à²\85à²\82ತರ à²¬à²¾à²¸à³\86/à²\85à²\82ತರ à²µà²¿à²\95ಿ à²¸à²\82ಪರà³\8dà²\95à³\8a.\nà²\85ಯಿà²\9fà³\8d à²\92à²\82à²\9cಿ à²\85ತà³\8dತà²\82ಡ à²¸à³\80ರà³\8dಸಿà²\95à³\86ಲà³\86 à²¬à²³à²\95à³\86 à²®à²²à³\8dಪರà³\86 à²¨à²¿à²¸à³\87ದà³\8a à²\86ಯಿನ à²\85à²\95à³\8dಷರà³\8aಲು ಇಪ್ಪು.",
+       "perfcached": "à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²®à²¾à²¹à²¿à²¤à²¿à²²à³\81 cacheದà³\8d à²¬à²¤à³\8dತà³\8dà²\82ಡà³\8d à²¬à³\81à²\95à³\8dà²\95à³\8a à²\87ತà³\8dತà³\86ದ à²¸à³\8dತಿತಿನà³\8d à²¬à²¿à²\82ಬಿಸವà³\8aà²\82ದà³\81à²\82ಡà³\81.  à²¦à²¿à²\82à²\9c à²ªà²\82ಡ {{PLURAL:$1|one result is|$1 à²ªà²²à²¿à²¤à²¾à²\82ಸà³\8aಲà³\81}}cacheಡà³\8d à²¤à²¿à²\95à³\81à²\82ಡà³\81.",
+       "perfcachedts": "ಈ ತಿರ್ತ್‍ದ ಮಾಹಿತಿಲು cacheದ್ ಬತ್ತ್ಂಡ್ ಬುಕ್ಕೊ ಇತ್ತೆದ ಸ್ತಿತಿನ್ ಬಿಂಬಿಸವೊಂದುಂಡು.  ದಿಂಜ ಪಂಡ {{PLURAL:$4|one result is|$4 ಪಲಿತಾಂಸೊಲು}}cacheಡ್ ತಿಕುಂಡು.",
        "querypage-no-updates": "ಈ ಪುಟೊತ್ತ ಆಧುನಿಕ ಮಲ್ಪುನ ಕ್ರಿಯೆನ್ ಸದ್ಯಗ್ ಉಂತಾದ್ಂಡ್. ಮುಲ್ಪ ಉಪ್ಪುನ ಮಾಹಿತಿನ್ ನವೀಕರಣ ಮಲ್ಪರಾಪುಜಿ",
-       "viewsource": "ಮೂಲ ಬರಹೊನು ತೂಲೆ",
+       "viewsource": "ಮೂಲ ಬರಹೊನು ತೂಲೆ",
        "viewsource-title": " $1 ಮೂಲ ಬರಹ ತೂಲೆ",
        "actionthrottled": "ಕಾರ್ಯನ್ ದೆಂಗಾದುಂಡು",
-       "protectedpagetext": "à²\88 à²ªà³\81à²\9fನà³\8d à²¸à²\82ಪಾದನà³\86 à²®à²²à³\8dಪà²\82ದಿಲà³\86à²\95à³\8dà²\95 à²¸à²\82ರà²\95à³\8dಷಣà³\86 à²®à²²à³\8dತà³\8dâ\80\98ಂಡ್",
+       "protectedpagetext": "à²\88 à²ªà³\81à²\9fà³\8a à²¸à²\82ಪà³\8aಲಿಪà²\82ದಿನ à²²à³\86à²\95à³\8a à²°à²\95à³\8dಸಣà³\86 à²\86ತà³\8dಂಡ್",
        "viewsourcetext": "ಈರ್ ಈ ಪುಟದ ಮೂಲನ್ ತೂವೊಲಿ ಬೊಕ್ಕ ನಕಲ್ ಮಲ್ಪೊಲಿ",
-       "viewyourtext": "à²\88ರà³\8d à²\88 à²ªà³\81à²\9fದ à²®à³\82ಲನà³\8d à²¤à³\82ವà³\8aಲಿ à²¬à³\8aà²\95à³\8dà²\95 à²¨à²\95ಲà³\8d à²®à²²à³\8dಪà³\8aಲಿ",
-       "protectedinterface": "ಈ ಪುಟ ತಂತ್ರಾಂಶ ಉಪಯೋಗ ಮಲ್ಪುನ ಪಠ್ಯನ್ ಒದಗಿಸಾಪುಂಡ್. ದುರುಪಯೋಗ ಅವಂದಿಲೆಕ್ಕ ಇದೆನ್ ಸಂರಕ್ಷಣೆ ಮಲ್ತ್‘ಂಡ್.",
+       "viewyourtext": "à²\88ರà³\8d à²\88 à²ªà³\81à²\9fà³\8aದ à²®à³\82ಲನà³\8d à²¤à³\82ವà³\8aಲಿ à²¬à³\8aà²\95à³\8dà²\95 à²¨à²\95ಲà³\8d à²®à²²à³\8dಪà³\8aಲಿ <strong>à²\88ರà³\86ನ à²¸à²\82ಪದನà³\86</strong>",
+       "protectedinterface": "ಈ ಪುಟೊ ತಂತ್ರಾಂಸೊ ಉಪಯೋಗೊ ಮಲ್ಪುನ ಪಟ್ಯೊನ್ ಒದಗಿಸಾಪುಂಡ್. ದುರುಪಯೋಗ ಅವಂದಿಲೆಕ್ಕ ಇದೆನ್ ರಕ್ಷಣೆ ಮಲ್ಪುಲೆ.\nಮಾತ ವಿಕಿಲೆಗ್ ಬಾಸಾಂತರೊನು ಕೂಡಯೆರೆ ಅಂಚನೆ ಬದಲ್ಪೆರೆ, [//translatewiki.net/ translatewiki.net], the MediaWiki localisation ಯೋಜನೆನ್ ಉಪಯೊಗಿಸಲೆ\nಕನ್ನಡ",
        "ns-specialprotected": "ವಿಶೇಷ ಪುಟ‘ಕ್‘ಲೆನ್ ಸಂಪಾದನೆ ಮಲ್ಪರೆ ಆಪುಜಿ",
-       "logouttext": "ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಔಟ್ ಆತರ್.\nಈರ್ {{SITENAME}} ನ್ ಅನಾಮಧೇಯರಾತ್ ಉಪಯೋಗ ಮಲ್ಪೊಲಿ,ಅಥವಾ ಕೂಡ ಉಂದುವೇ ಪುದರ್‘ಡ್ ಯಾ ಬೇತೆ ಪುದರ್‘ಡ್ ಉಪಯೋಗ ಮಲ್ಪೊಲಿ.\nಗಮನಿಸಾಲೆ: ಈರೆನ ಬ್ರೌಸರ್‘ಡ್ ಮಾಜುನಾಡೆ ಮುಟ್ಟ ಕೆಲವು ಪುಟಕ್‘ಲು ಈರ್ ಇತ್ತೆಲಾ ಲಾಗ್ ಇನ್ ಆಯಿಲೆಕ್ಕನೇ ತೋಜಾವು.",
+       "logouttext": "<strong>ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಔಟ್ ಆತರ್</strong>\nಗಮನಿಸಲೆ ಈರೆನ ಬ್ರೌಸರ್‍ದ cacheನ್ ದೆತ್ತ ಪಾಡುನೆಟ ಮುಟ್ಟೊ ಕೆಲವು ಪುಟೊಲು ಈರ್ ನಾನಲ ಲಾಗ್ ಇನ್ ಆದಿಪ್ಪುಂಚ ತೋಜುಂಡು.",
+       "welcomeuser": "ಎದ್ಖೊನುವೊ,$1!",
+       "welcomecreation-msg": "ಈರೆನ ಕಾತೆನ್ ದೆತ್ತ್‌ದಾತ್ಂಡ್.  ಈರೆನ [[Special:Preferences|{{SITENAME}} ಆಯ್ಕೆನ್]]ಬದಲ್ಪೆರೆ ಮರಪೊಡ್ಚಿ.",
        "yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "userlogin-yourname": "ಸದಸ್ಯೆರ್ನ ಪುದರ್",
-       "userlogin-yourname-ph": "ಈರೆನೆ ಸದಸ್ಯನಾಮ ಬರೆಲೆ",
+       "userlogin-yourname-ph": "ಈರೆನೆ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
+       "createacct-another-username-ph": "ಈರೆನೆ ಸದಸ್ಯ ಪುದರ್ ಬರೆಲೆ",
        "yourpassword": "ಪಾಸ್-ವರ್ಡ್:",
-       "userlogin-yourpassword": "ಪà³\8dರವà³\87à²ಪದೊ",
-       "userlogin-yourpassword-ph": "ಪà³\8dರವà³\87ಶ à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಾಲೆ",
-       "createacct-yourpassword-ph": "ಪà³\8dರವà³\87ಶ à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಾಲೆ",
+       "userlogin-yourpassword": "ಪà³\8dರವà³\87ಸà³\8aಪದೊ",
+       "userlogin-yourpassword-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಲೆ",
+       "createacct-yourpassword-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²¨à²®à³\82ದಿಸಲೆ",
        "yourpasswordagain": "ಪಾಸ್ವರ್ಡ್ ಪಿರ ಟೈಪ್ ಮಲ್ಪುಲೆ",
-       "createacct-yourpasswordagain": "ಪà³\8dರವà³\87ಶಪದà³\8aನà³\8d à²§à³\83ಡà³\80à²\95ರಣ ಮಲ್ಪುಲೆ",
-       "createacct-yourpasswordagain-ph": "ಪà³\8dರವà³\87ಶಪದà³\8aನà³\81 à²¨à²¨ à²\92ರ à²¨à²®à³\82ದಿಸಾಲೆ",
-       "remembermypassword": "à²\88 à²\95à²\82ಪà³\8dಯà³\82à²\9fರà³\8dâ\80\99ಡà³\8d à²\8eನà³\8dನ à²ªà³\8dರವà³\87ಶ à²ªà²¦à³\8aನà³\81 à²¨à³\86ನಪà³\81 à²¦à³\80ಲ",
+       "createacct-yourpasswordagain": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\81 à²¦à³\83ಡà³\8a ಮಲ್ಪುಲೆ",
+       "createacct-yourpasswordagain-ph": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\81 à²¨à²¨ à²\92ರ à²¨à²®à³\82ದಿಸಲೆ",
+       "remembermypassword": "à²\88 à²\97ಣà²\95ಯà²\82ತà³\8dರà³\8aಡà³\81 à²\8eನà³\8dನ à²²à²¾à²\97ಿನà³\8d à²¨à³\86à²\82ಪà³\81 à²¦à³\80ಡà³\8aನà³\8dಲà³\86(ಹà³\86à²\9aà³\8dà²\9aà³\8d $1 {{PLURAL:$1|ದಿನà³\8aತ|ದಿನà³\8aà²\95à³\8dà²\95à³\81ಲà³\86}}ಮà³\81à²\9fà³\8dà²\9fà³\8a)",
        "userlogin-remembermypassword": "ಎನನ್ ಲಾಗಿನ್ ಆತೇ ದೀಡ್ಲೆ",
+       "userlogin-signwithsecure": "ರಕ್ಷಣೆದ ಕನೆಕ್ಷನ್ ಉಪಯೋಗಿಸಲೆ.",
        "yourdomainname": "ಈರೆನ ಕಾರ್ಯಕ್ಷೇತ್ರ",
-       "login": "ಲಾಗ್ ಇನ್",
+       "password-change-forbidden": "ಈರ್ ಈ ವಿಕಿಡ್ ಪ್ರರವೇಸ ಪದೊನು ಬದಲ್ಪೆರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
+       "login": "ಲಾಗಿನ್ ಆಲೆ",
        "nav-login-createaccount": "ಲಾಗ್-ಇನ್ / ಅಕೌಂಟ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ",
        "userlogin": "ಲಾಗ್-ಇನ್ / ಅಕೌಂಟ್ ಸೃಷ್ಟಿ ಮಲ್ಪುಲೆ",
        "userloginnocreate": "ಲಾಗಿನ್ ಆಲೆ",
        "logout": "ಲಾಗ್ ಔಟ್",
        "userlogout": "ಲಾಗ್ ಔಟ್",
        "notloggedin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
-       "userlogin-noaccount": "à²\88ರà³\86ನ à²\96ಾತà³\86 à²\87à²\9cà³\8dà²\9cà³\87?",
+       "userlogin-noaccount": "à²\95ಾತà³\86 à²\87ದà³\8dದಿಯಾ?",
        "userlogin-joinproject": "{{SITENAME}}ಗ್ ಸೇರ್ಲೆ",
        "nologin": "ಈರೆನ ಖಾತೆ ಇಜ್ಜೇ?'''$1'''",
        "nologinlink": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "gotaccount": "ಈರೆನ ಖಾತೆ ಉಂಡೇ?'''$1'''",
        "gotaccountlink": "ಲಾಗಿನ್ ಆಲೆ",
        "userlogin-resetlink": "ಈರೆನ ಲಾಗಿನ್ ವಿವರ ಮರತ್ತ್ಂಡೇ?",
-       "userlogin-resetpassword-link": "ಈರೆನೆ ಪ್ರವೇಶಪದೊ ಮರತ್ತ್‍ಂಡಾ?",
-       "userlogin-helplink2": "ಲಾಗಿನ್ ಆವೊರೆ ಸಹಾಯ",
-       "createacct-emailoptional": "ಮಿಂಚಂಚೆ ವಿಳಾಸೊ (ಐಚ್ಛಿಕ)",
-       "createacct-email-ph": "ಇರೆನ ಇ-ಅಂಚೆ ವಿಳಾಸೊನ್ ನಮೂದಿಸಾಲೆ.",
+       "userlogin-resetpassword-link": "ಈರೆನೆ ಪ್ರವೇಸೊ ಪದೊ ಮರತ್ತ್‌ಂಡಾ?",
+       "userlogin-helplink2": "ಲಾಗಿನ್ ಆಯರ ಸಹಾಯೊ",
+       "userlogin-createanother": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "createacct-emailrequired": "ಇ-ಅಂಚೆ ವಿಳಾಸೊ",
+       "createacct-emailoptional": "ಮಿಂಚಂಚೆ ವಿಲಾಸೊ(ಐಚ್ಛಿಕೊ)",
+       "createacct-email-ph": "ಇರೆನ ಮಿಂಚಂಚೆ ವಿಲಾಸೊನ್ ನಮೂದಿಸಲೆ.",
+       "createacct-another-email-ph": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "createaccountmail": "ಇ ಮೈಲ್ ಮೂಲಕ",
+       "createacct-realname": "ನಿಜವಾಯಿನ ಪುದರ್(ಐಚ್ಛಿಕೊ)",
        "createaccountreason": "ಕಾರಣ",
-       "createacct-submit": "ಪೊಸ ಖಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
-       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪಾದನೆ|ಸಂಪಾದನೆಲು}}",
-       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟ|ಪುಟಕ್ಕುಲು}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|ಕೊಡುಗೆ|ಕೊಡುಗೆಲು}}",
+       "createacct-reason": "ಕಾರಣೊ",
+       "createacct-reason-ph": "ಈರ್ ದಾಯೆ ನಾನಲ ಒಂಜಿ ಕಾತೆ ದೆತ್ತೊಂದುಲ್ಲರ್?",
+       "createacct-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "createacct-another-submit": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "createacct-benefit-heading": "{{SITENAME}}ನಿಕ್ಲೆನಂಚಿತ್ತಿನ ಜನೊಕ್ಲೆಡ್ದ್ ಉಂಡಾಪುಂಡು.",
+       "createacct-benefit-body1": "{{PLURAL:$1|ಸಂಪದನೆ|ಸಂಪದನೆಲು}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|ಪುಟೊ|ಪುಟೊಕ್ಕುಲು}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|ಇನಾಮು|ಇನಾಮುಲು}}",
        "badretype": "ಈರ್ ಕೊರ್ನ ಪ್ರವೇಶ ಪದೆ ಬೇತೆ ಬೇತೆ ಅತ್ಂಡ್",
        "userexists": "ಈರ್ ಕೊರ್ನ ಸದಸ್ಯರ ಪುದರ್ ಬಳಕೆಡ್ ಉಂಡು. ದಯದೀದ್ ಬೇತೆ ಪುದರ್ ಕೊರ್ಲೆ",
        "loginerror": "ಲಾಗಿನ್ ದೋಷ",
-       "createaccounterror": "ಖಾತೆ ಸುರುಮಲ್ಪರೆ ಸಾದ್ಯ ಅವೊಂದಿಜ್ಜಿ",
+       "createacct-error": "ಕಾತೆ ನಿರ್ಮಾಣೊ ದೋಸೊ",
+       "createaccounterror": "ಕಾತೆ ನಿರ್ಮಾಣೊ ಮಲ್ಪೆರೆ ಆವೊಂದಿದ್ದಿ: $1",
        "nocookiesnew": "ಈರೆನ ಬಳಕೆದಾರ ಖಾತೆ ಸೄಷ್ಟಿ ಅತ್ಂಡ್. ಆಂಡ ಈರ್ ಲಾಗ್ ಇನ್ ಆತ್‘ಜ್ಜರ್.\n{{SITENAME}} ಲಾಗ್ ಇನ್ ಮಲ್ಪರ ಕುಕೀಸ್ ಉಪಯೋಗ ಮಲ್ಪುಂಡ್.\nಈರೆನ ಗಣಕಯಂತ್ರಡು ಕುಕೀಸ್ ನಿಷಿದ್ದ ವಾತ್ಂಡ್.\nದಯದೀದ್ ಈ ನಿಷಿದ್ಧನ್ ದೆತ್ತ್‘ದ್, ಈರೆನ ಬಳಕೆದಾರ ಪುದರ್ ಬೊಕ್ಕ  ಪ್ರವೇಶಪದ ಉಪಯೋಗಿಸಾದ್ ಲಾಗ್ ಇನ್ ಆಲೆ.",
        "nocookieslogin": "{{SITENAME}} ಲಾಗ್ ಇನ್ ಮಲ್ಪರ ಕುಕೀಸ್ ಉಪಯೋಗ ಮಲ್ಪುಂಡ್.\nಈರೆನ ಗಣಕಯಂತ್ರಡು ಕುಕೀಸ್ ನಿಷಿದ್ದ ವಾತ್ಂಡ್.\nದಯದೀದ್ ಈ ನಿಷಿದ್ಧನ್ ದೆತ್ತ್‘ದ್, ಕುಡೊರ ಪ್ರಯತ್ನ ಮಲ್ಪುಲೆ.",
        "nocookiesfornew": "ಮೂಲನ್  ನಿರ್ಧರಿಸಾವರ ಆವೊಂದಿಜ್ಜಿ  ಐಡ್‘ದಾವರ  ಈರೆನ ಖಾತೆ ಸೃಷ್ಟಿ ಆತ್‘ಜ್ಜಿ.  .\nದಯದೀದ್ ಕುಕೀಸ್ ನಿಷಿದ್ಧನ್ ದೆತ್ತ್‘ದ್, ಈ ಪುಟನ್ ಪಿರ ದಿಂಜಾದ್ (load)ಪ್ರಯತ್ನಿಸಾಲೆ.",
        "wrongpassword": "ತಪ್ಪು ಪ್ರವೇಶ ಪದ ಕೊರ್ತರ್. ನನ ಒರ ಪ್ರಯತ್ನ ಮಲ್ಪುಲೆ.",
        "wrongpasswordempty": "ಖಾಲಿ ಪ್ರವೇಶ ಪದ ಕೊರ್ತರ್. ನನ ಒರ ಪ್ರಯತ್ನ ಮಲ್ಪುಲೆ.",
        "passwordtooshort": "ಪ್ರವೇಶ ಪದಟ್ ಕನಿಷ್ಟ {{PLURAL:$1|೧ ಅಕ್ಷರ|$1 ಅಕ್ಷರರೊಳೆನ್}} ಉಪ್ಪೊಡ್",
+       "passwordtoolong": "ಪ್ರವೇಸೊ ಪದೊಟು ಕನಿಸ್ಟೊ {{PLURAL:$1|೧ ಅಕ್ಷರ|$1 ಅಕ್ಷರರೊಲು}} ಉಪ್ಪೊಡ್",
        "password-name-match": "ಇರೆನ್ ಪ್ರವೇಶಪದ ಬಳಕೆದಾರೆನ ಪುದರ್‘ಡ್‘ದ್ ಬೇತೆ ಉಪ್ಪೊಡು",
        "password-login-forbidden": "ಈ ಪ್ರವೇಶಪದ ಬೊಕ್ಕ ಬಳಕೆದಾರೆರೆನ ಪುದರ್‘ನ್ ನಿಷಿದ್ಧ ಮಲ್ತ್‘ದ್ಂಡ್",
-       "mailmypassword": "ಪà³\8aಸ à²ªà²¾à²¸à³\8d-ವರà³\8dಡà³\8dâ\80\99ನà³\8d à²\87-ಮà³\87ಲà³\8d ಮಲ್ಪುಲೆ",
+       "mailmypassword": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²ªà²¿à²° à²¸à³\8dತಾಪನà³\86 ಮಲ್ಪುಲೆ",
        "passwordremindertitle": "{{SITENAME}}ಗ್ ಪೊಸ ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶ ಪದ",
        "noemail": "ಸದಸ್ಯೆ \"$1\" ಪುದರ್‘ಡ್ ವಾ ಇ-ಅಂಚೆ ವಿಳಾಸೊಲ ದಾಖಲಾತ್‘ಜ್ಜಿ",
        "noemailcreate": "ಈರ್ ಇತ್ತೆ ಉಪ್ಪುನ ಇ-ಅಂಚೆ ವಿಳಾಸ ಕೊರೊಡ್",
        "passwordsent": "\"$1\" ಇಂಬೆರೆನ ಪುದರ್‘ಡ್ ದಾಖಲಾತ್‘ನ ಇ-ಅಂಚೆ ವಿಳಾಸೊಗ್ ಪೊಸ ಪ್ರವೇಶಪದ ಕಡಪುಡ್‘ದುಂಡು.ಐನ್ ತೂದು ಬೊಕ್ಕ ಕುಡ ಲಾಗಿನ್ ಇನ್ ಆಲೆ.",
+       "mailerror": "ಅಂಚೆ ಕಡಪುಡುನೆಡ್ ದೋಸೊ: $1",
        "noemailprefs": "ಈ ಸೌಲಭ್ಯೊಲ್ ಕೆಲಸ ಮಲ್ಪರೆ ಒಂಜಿ ಇ-ಅಂಚೆ ವಿಳಾಸೊನ್ ನಮೂದು ಮಲ್ಪುಲೆ.",
        "emailconfirmlink": "ಇರೆನ ಇ-ಅಂಚೆ ವಿಳಾಸೊನ್ ದೃಡೀಕರಣ ಮಲ್ಪುಲೆ.",
        "accountcreated": "ಖಾತೆ ಸೃಷ್ಟಿಯಾತ್‘ಂಡ್.",
        "login-abort-generic": "ಇರೆನ ಲಾಗ್ ಇನ್ ವಿಫಲ ವಾತ್‘ಂಡ್",
-       "loginlanguagelabel": "ಭಾಷೆ: $1",
-       "pt-login": "ಲಾà²\97ಿನ್",
+       "loginlanguagelabel": "ಬಾಸೆ: $1",
+       "pt-login": "ಲಾà²\97à³\8d à²\87ನ್",
        "pt-login-button": "ಲಾಗಿನ್ ಆಲೆ",
-       "pt-createaccount": "ಪà³\8aಸ à²\96ಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
+       "pt-createaccount": "ಪà³\8aಸ à²\95ಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
        "pt-userlogout": "ಲಾಗ್ ಔಟ್",
        "changepassword": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass_header": "ಈ ಖಾತೆದ ಪ್ರವೇಶಪದ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass-submit-loggedin": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "resetpass-submit-cancel": "ವಜಾ ಮಲ್ಪುಲೆ",
        "resetpass-temp-password": "ತಾತ್ಕಾಲಿಕ ಪ್ರವೇಶಪದ:",
-       "passwordreset": "ಪà³\8dರವà³\87ಶ à²ªà²¦à²¨à³\8d à²°à²¿à²¸à³\86à²\9fà³\8d ಮಲ್ಪುಲೆ",
+       "passwordreset": "ಪà³\8dರವà³\87ಸà³\8a à²ªà²¦à³\8aನà³\8d à²ªà²¿à²° à²¸à³\8dತಾಪನà³\86 ಮಲ್ಪುಲೆ",
        "passwordreset-username": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "passwordreset-email": "ಇ-ಅಂಚೆ ವಿಳಾಸೊ",
        "changeemail-submit": "ಇ-ಅಂಚೆ ವಿಳಾಸ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
-       "bold_sample": "ದಪ್ಪ ಅಕ್ಷರ",
-       "bold_tip": "ದಪ್ಪ ಅಕ್ಷರೊಲು",
+       "resettokens-tokens": "ಸಂಕೇತೊಲು:",
+       "resettokens-token-label": "$1(ಇತ್ತೆದ ಮೌಲ್ಯೊ:$2)",
+       "bold_sample": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
+       "bold_tip": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
        "italic_sample": "ಓರೆ ಅಕ್ಷರೊಲು",
        "italic_tip": "ಓರೆ ಅಕ್ಷರೊಲು",
-       "link_sample": "ಲಿà²\82à²\95à³\8dâ\80\99ದ à²ªà³\81ದರà³\8d",
-       "link_tip": "à²\89ಲಯಿದ à²²à²¿à²\82à²\95à³\8d",
-       "extlink_sample": "http://www.example.com à²²à²¿à²\82à²\95à³\8dâ\80\99ದ à²ªà³\81ದರà³\8d",
-       "extlink_tip": "ಪಿದಯಿದ à²²à²¿à²\82à²\95à³\8d (http:// à²°à³\8dದà³\8d à²¶à³\81ರà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²®à²°à²ªà³\8aಚಿ)",
-       "headline_sample": "ಹà³\86ಡà³\8d-ಲà³\88ನà³\8dâ\80\99ದ à²¬à²°à²¹",
-       "headline_tip": "2ನà³\87 à²²à³\86ವà³\86ಲà³\8dದ à²¹à³\86ಡà³\8d-ಲà³\88ನà³\8d",
-       "nowiki_sample": "à²\88 à²\9cಾà²\97à³\86ಡà³\8d à²¬à²°à³\86ತಿನà²\82à²\9aಿನ à²¬à²°à²¹ à²µà²¿à²\95à³\80à²\95ರಣ à²\86ಪà³\81à²\9cಿ",
-       "nowiki_tip": "ವಿà²\95ಿ à²°à²\9aನಾà²\95à³\8dರಮà³\8aನà³\81(ಫà³\8bರà³\8dಮà³\8dಯಾà²\9fà³\8d) à²\85ಳವಡಿಸà³\8aà²\9aಿ",
-       "image_tip": "à²\8e೦ಬà³\86ಡà³\8d à²®à²²à³\8dತಿನ ಫೈಲ್",
-       "media_tip": "ಫೈಲ್ ದ ಲಿ೦ಕ್",
-       "sig_tip": "ಸಮಯಮುದ್ರೆದೊಟ್ಟಿಗೆ ಇರ್ನ ಸಹಿ",
-       "hr_tip": "ಅಡ್ಡ ಗೆರೆ(ಆಯಿನಾತ್ ಕಮ್ಮಿ ಉಪಯೋಗಿಸಾಲೆ)",
-       "summary": "ಸಾರಾà²\82à²:",
+       "link_sample": "à²\95à³\8aà²\82ಡಿದ à²¸à³\80ರà³\8dಸಿà²\95à³\86",
+       "link_tip": "à²\89ಲಯಿದ à²\95à³\8aà²\82ಡಿ",
+       "extlink_sample": "http://www.example.com à²\95à³\8aà²\82ಡಿದ à²¸à³\80ರà³\8dಸಿà²\95à³\86",
+       "extlink_tip": "ಪಿದಯಿದ à²\95à³\8aà²\82ಡಿ(http://ರà³\8dದà³\8d à²¸à³\81ರà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²®à²°à²ªà³\8aಡà³\8dಚಿ)",
+       "headline_sample": "ಪà²\9fà³\8dಯà³\8aದ à²¸à³\80ರà³\8dಸಿà²\95à³\86",
+       "headline_tip": "2ನà³\87 à²®à²\9fà³\8dà²\9fà³\8aದ à²¸à³\80ರà³\8dಸಿà²\95à³\86",
+       "nowiki_sample": "ಮà³\81ಲà³\8dಪ à²«à²¾à²°à³\8dಮà³\87à²\9fà³\8d à²\86ವà²\82ದಿನà²\82à²\9aಿನ à²ªà²\9fà³\8dಯà³\8aನà³\81 à²¸à³\87ರಲà³\86",
+       "nowiki_tip": "ವಿà²\95ಿ à²«à²¾à²°à³\8dಮà³\8dಯಾà²\9fಿà²\82à²\97à³\8dâ\80\8dನà³\8d à²\95ಡà³\86à²\97ಣಿಸಲà³\86",
+       "image_tip": "ಸà³\87ರà³\8dಪಾಯಿನ ಫೈಲ್",
+       "media_tip": "ಫೈಲ್‍ದ ಕೊಂಡಿ",
+       "sig_tip": "ಪà³\8aರà³\8dತà³\81 ಮುದ್ರೆದೊಟ್ಟಿಗೆ ಇರ್ನ ಸಹಿ",
+       "hr_tip": "ಅಡ್ಡೊ ಗೆರೆ(ಆಯಿನಾತ್ ಕಮ್ಮಿ ಉಪಯೋಗಿಸಲೆ)",
+       "summary": "ಸಾರಾà²\82ಸà³\8a:",
        "subject": "ವಿಷಯ/ಮುಖ್ಯಾ೦ಶ:",
        "minoredit": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
        "watchthis": "ಈ ಪುಟೊನು ತೂಲೆ",
        "savearticle": "ಪುಟೊನು ಒರಿಪಾಲೆ",
        "preview": "ಮುನ್ನೋಟ",
-       "showpreview": "ಮುನ್ನೋಟ ತೊಜ್ಪಾವ್",
-       "showdiff": "ಬದಲಾವಣà³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವ್",
-       "anoneditwarning": "'''ಜಾಗ್ರತೆ:''' ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್.\nಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು.",
+       "showpreview": "ಮುನ್ನೋಟೊ ತೋಜಾವು",
+       "showdiff": "ಬದಲಾವಣà³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವ್",
+       "anoneditwarning": "<strong>ಜಾಗ್‍ರ್ತೆ:</strong> ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತ್‍ಜರ್. ಈರ್ ಸಂಪೊಲಿತರ್ಂಡ ಈರೆನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಮಾಂತೆರೆಗ್ಲಾ ತೆರಿವುಂಡು. ಒಂಜೇಲ್ಯೊ <strong>[$1 ಲಾಗಿನ್ ಆಯರ್ಂದಾಂಡ]</strong> ಅತ್ತಂಡ <strong>[$2 ಈ ಅಕೌಂಟ್ ಮಲ್ತರ್ಂಡ]</strong>, ಈರ್ ಸಂಪೊಲ್ತಿನ ಪೂರ ಬೇತೆ ಲಾಬೊದೊಟ್ಟುಗು ಈರೆನ ಪುದರ್‍ಗ್ ಸೇರುಂಡು.'",
        "anonpreviewwarning": "ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್. ಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು",
        "missingsummary": "'''ಗಮನಿಸಾಲೆ:''' ಈರ್ ಬದಲಾವಣೆದ ಸಾರಾ೦ಶನ್ ಕೊರ್ತಿಜರ್.\nಈರ್ ಪಿರ 'ಒರಿಪಾಲೆ' ಬಟನ್ ನ್ ಒತ್ತ್೦ಡ ಸಾರಾ೦ಶ ಇಜ್ಜ೦ದೆನೇ ಈರ್ನ ಬದಲಾವಣೆ ದಾಖಲಾಪು೦ಡು.",
        "missingcommenttext": "ದಯ ಮಲ್ತ್ ದ ಈರ್ನ ಅಭಿಪ್ರಾಯನ್ ತಿರ್ತ್ ಕೊರ್ಲೆ",
        "summary-preview": "ಸಾರಾ೦ಶ ಮುನ್ನೋಟ:",
        "subject-preview": "ವಿಷಯ/ಮುಖ್ಯಾ೦ಶದ ಮುನ್ನೋಟ:",
        "blockedtitle": "ಈ ಸದಸ್ಯೆರೆನ್ ತಡೆ ಮಲ್ತ್ ದ್೦ಡ್.",
+       "blockednoreason": "ವಾ ಕಾರಣೊಲಾ ಕೊರ್ತ್‍ಜಿ",
        "loginreqlink": "ಲಾಗಿನ್ ಆಲೆ",
        "accmailtitle": "ಪ್ರವೇಶಪದ ಕಡಪುಡ್‘ದುಂಡು",
        "newarticle": "(ಪೊಸತ್)",
-       "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸೃಷ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್’ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್’ನ್ಡ ಇರೆನ ಬ್ರೌಸರ್’ದ '''back''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
-       "noarticletext": "ಈ ಪುಟೊಟು ಸದ್ಯಗ್ ಓ ಬರಹಲಾ ಇಜ್ಜಿ, ಈರ್ ಬೇತೆ ಪೂಟೊಲೆಡ್ [[Special:Search/{{PAGENAME}}|ಈ ಲೇಖನೊನು ನಾಡೊಲಿ]] ಅತ್ತ್’ನ್ಡ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪಾದನೆ ಮಲ್ಪೊಲಿ].",
+       "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಗು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಸ್ರಿಸ್ಟಿ ಮಲ್ಪೆರೆ ತಿರ್ತ್‍ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತಪ್ಪಾದ್ ಬತ್ತಿತ್ತ್ಂಡ ಇರೆನ ಬ್ರೌಸರ್‍ದ '''back''' ಬಟನ್’ನ್ ಒತ್ತ್’ಲೆ.",
+       "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}}}} ಸಂಬಂದೊ ಇತ್ತ್‌ನ ಲಾಗ್‌ನ್ ನಾಡ್‍ಲೆ], ಅತ್ತ್ಂಡ  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ಈ ಪುಟೊನು ಸಂಪೊಲಿಪೊಲಿ]</span>.",
        "userpage-userdoesnotexist": "ಬಳಕೆದಾರ ಖಾತೆ \"<nowiki>$1</nowiki>\" ದಾಖಲಾತ್‘ಜ್ಜಿ. ಈರ್ ಉಂದುವೇ ಪುಟನ್ ಸಂಪಾದನೆ ಮಲ್ಪರ ಉಂಡಾಂದ್ ಖಾತ್ರಿ ಮಲ್ತೊನಿ.",
        "previewnote": "'''ಉಂದು ಕೇವಲ ಮುನ್ನೋಟ; ಪುಟೊನು ನನಲ ಒರಿಪಾದಿಜಿ ಪನ್ಪುನೇನ್ ಮರಪೊರ್ಚಿ!'''",
-       "editing": "$1 à²²à³\87à²\96ನà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
-       "creating": "$1 à²¨à³\8dನà³\81 à²¸à³\83ಷà³\8dà²\9fಿಸಾವà³\8aದುಂಡು",
-       "editingsection": "$1 (ವಿಭಾಗೊನು) ಸಂಪಾದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
+       "editing": "$1 à²²à³\87à²\95ನà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
+       "creating": "$1 à²¨à³\8dನà³\81 à²¸à³\8dರಿಸà³\8dà²\9fಿಸವà³\8aà²\82ದುಂಡು",
+       "editingsection": "$1(ವಿಬಾಗೊನು) ಸಂಪದನೆ ಮಲ್ತೊಂದುಲ್ಲರ್",
        "yourtext": "ಇರೆನ ಸಂಪಾದನೆ",
        "yourdiff": "ವ್ಯತ್ಯಾಸೊಲು",
        "copyrightwarning": "ದಯಮಲ್ತ್’ದ್ ಗಮನಿಸ್’ಲೆ: {{SITENAME}} ಸೈಟ್’ಡ್ ಇರೆನ ಪೂರಾ ಕಾಣಿಕೆಲುಲಾ $2 ಅಡಿಟ್ ಬಿಡುಗಡೆ ಆಪುಂಡು (ಮಾಹಿತಿಗ್ $1 ನ್ ತೂಲೆ). ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಬೇತೆಕುಲು ನಿರ್ಧಾಕ್ಷಿಣ್ಯವಾದ್ ಬದಲ್ ಮಲ್ತ್’ದ್ ಬೇತೆ ಕಡೆಲೆಡ್ ಪಟ್ಟೆರ್. ಇಂದೆಕ್ ಇರೆನ ಒಪ್ಪಿಗೆ ಇತ್ತ್’ನ್ಡ ಮಾತ್ರ ಮುಲ್ಪ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ.<br />\nಅತ್ತಂದೆ ಇರೆನ ಸಂಪಾದನೆಲೆನ್ ಈರ್ ಸ್ವತಃ ಬರೆತರ್, ಅತ್ತ್’ನ್ಡ ಕೃತಿಸ್ವಾಮ್ಯತೆ ಇಜ್ಜಂದಿನ ಕಡೆರ್ದ್ ದೆತೊನ್ದರ್ ಪಂಡ್’ದ್ ಪ್ರಮಾಣಿಸೊಂದುಲ್ಲರ್.\n'''ಕೃತಿಸ್ವಾಮ್ಯತೆದ ಅಡಿಟುಪ್ಪುನಂಚಿನ ಕೃತಿಲೆನ್ ಒಪ್ಪಿಗೆ ಇಜ್ಜಂದೆ ಮುಲ್ಪ ಪಾಡೊಚಿ!'''",
        "templatesused": "ಈ ಪುಟೊಟ್ ಉಪಯೋಗ ಮಲ್ತಿನ {{PLURAL:$1|ಟೆಂಪ್ಲೇಟು|ಟೆಂಪ್ಲೇಟುಗಳು}}:",
        "templatesusedpreview": "ಈ ಮುನ್ನೋಟೊಡು ಉಪಯೋಗ ಮಲ್ತಿನ ಟೆಂಪ್ಲೇಟ್’ಲು:",
-       "template-protected": "(ಸಂರಕ್ಷಿತ)",
-       "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತ)",
-       "hiddencategories": "ಈ ಪುಟ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್’ನ್ಡ್:",
-       "permissionserrorstext-withaction": "$2 à²\97à³\8d à²\87ರà³\86à²\97à³\8d à²\85ನà³\81ಮತಿ à²\87à²\9cà³\8dà²\9cಿ, à²\90à²\95à³\8d {{PLURAL:$1|à²\95ಾರಣ|ಕಾರಣೊಲು}}:",
-       "moveddeleted-notice": "à²\88 à²ªà³\87à²\9cà³\8d à²\85ಸà³\8dತಿತà³\8dವಡà³\8d à²\87à²\9cà³\8dà²\9cಿ.\nಪà³\82à²\9fà³\8aತ à²¡à²¿à²²à³\80ಶನà³\8d à²²à²¾à²\97à³\8dâ\80\99ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²\95à³\8aರà³\8dತà³\81à²\82ಡà³\81.",
-       "viewpagelogs": "à²\88 à²ªà³\81à²\9fà³\8aತ à²¦à²¾à²\96ಲೆಲೆನ್ ತೂಲೆ",
+       "template-protected": "(ಸಂರಕ್ಷಿತ)",
+       "template-semiprotected": "(ಅರೆ-ಸಂರಕ್ಷಿತ)",
+       "hiddencategories": "ಈ ಪುಟೊ {{PLURAL:$1|೧ ಗುಪ್ತ ವರ್ಗೊಗ್|$1 ಗುಪ್ತ ವರ್ಗೊಲೆಗ್}} ಸೇರ್ದ್‍ನ್ಡ್:",
+       "permissionserrorstext-withaction": "$2 à²\97à³\8d à²\87ರà³\86à²\97à³\8d à²\85ನà³\81ಮತಿ à²\87ದà³\8dದಿ, à²\85ಯಿà²\95à³\8d {{PLURAL:$1|à²\95ಾರಣà³\8a|ಕಾರಣೊಲು}}:",
+       "moveddeleted-notice": "à²\88 à²ªà³\81à²\9fà³\8a à²\85ಸà³\8dತಿತà³\8dವà³\8aಡà³\8d à²\87ದà³\8dದಿ.\nಪà³\81à²\9fà³\8aದ à²¡à²¿à²²à³\80ಶನà³\8d à²\85ತà³\8dತà³\8dà²\82ಡà³\8d à²\95ಡಪà³\8dಪà³\81ಡà³\81ನà³\86 à²²à²¾à²\97à³\8dâ\80\8dನà³\8d à²¤à³\82ಯರà³\86 à²¤à²¿à²°à³\8dತà³\8d à²\95à³\8aರà³\8dತà³\8dà²\82ಡà³\8d.",
+       "viewpagelogs": "à²\88 à²ªà³\81à²\9fà³\8aತ à²¦à²¾à²\95ಲೆಲೆನ್ ತೂಲೆ",
        "nohistory": "ಈ ಪುಟಕ್ ಬದಲಾವಣೆದ ಇತಿಹಾಸ ಇಜ್ಜಿ",
        "currentrev": "ಇತ್ತೆದ ಆವೃತ್ತಿ",
-       "currentrev-asof": "$1 ದ ಮುಟ್ಟ ಇತ್ತೆದ ಆವೃತ್ತಿ",
-       "revisionasof": "$1 ದಿನೊತ ಆವೃತ್ತಿ",
-       "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್‍ದ್$7",
-       "previousrevision": "â\86\90ದà³\81à²\82ಬà³\81ದ à²\86ವà³\83ತà³\8dತಿ",
-       "nextrevision": "ಪà³\8aಸ à²®à²°à³\81-à²\86ವà³\83ತà³\8dತಿ",
-       "currentrevisionlink": "à²\87ತà³\8dತà³\86ದ à²\86ವà³\83ತà³\8dತಿ",
-       "cur": "ಸದà³\8dಯದ",
+       "currentrev-asof": "$1ದ ಇಂಚಿಪದ ಆವೃತ್ತಿ",
+       "revisionasof": "$1ದಿನೊತ ಆವೃತ್ತಿ",
+       "revision-info": "ಬದಲಾವಣೆ $1 ಲೆಕ್ಕೊ {{GENDER:$6|$2}} ಇಂಬೆರೆಡ್ದ್ $7",
+       "previousrevision": "â\86\90ದà³\81à²\82ಬà³\8aರà³\8a à²¤à³\82ಯಿನ",
+       "nextrevision": "ದà³\81à²\82ಬà³\81ದ à²¤à²¿à²¦à³\8dದà³\81ಪಡಿ",
+       "currentrevisionlink": "à²\87ತà³\8dತà³\86ದ à²¤à²¿à²¦à³\8dದà³\81ಪಡಿ",
+       "cur": "ಸದà³\8dಯà³\8a",
        "next": "ಬೊಕ್ಕದ",
-       "last": "à²\95ಡà³\86ತ",
+       "last": "ಪಿರವà³\81",
        "page_first": "ಸುರುತ",
        "page_last": "ಕಡೆತ",
        "history-fieldset-title": "ಇತಿಹಾಸಡ್ ನಾಡ್ಲೆ",
        "histlast": "ಇಂಚಿಪ್ಪದ",
        "historyempty": "(ಖಾಲಿ)",
        "history-feed-title": "ಬದಲಾವಣೆಲೆನ ಇತಿಹಾಸೊ",
-       "rev-delundel": "ತà³\8aà²\9cà³\8dಪಾವà³\8d/ದà³\86à²\82à²\97ಾವà³\8d",
+       "rev-delundel": "ತà³\8bà²\9cà³\81ನà³\86ನà³\8d à²¦à³\86à²\82à²\97ಲ",
        "rev-showdeleted": "ತೊಜಾವು",
        "revisiondelete": "ಮಾಜಾಯಿನ/ಮಾಜಾವಂದಿನ ಬದಲಾವಣೆಲು",
        "revdelete-show-file-submit": "ಅಂದ್",
        "mergehistory-reason": "ಕಾರಣ:",
        "revertmerge": "ಅನ್-ಮರ್ಜ್ ಮಲ್ಪುಲೆ",
        "history-title": "\"$1\" ಪುಟೊತ ಆವೃತ್ತಿ ಇತಿಹಾಸೊ",
-       "lineno": "$1 ನೇ ಸಾಲ್:",
+       "difference-title": "ಪಿರ ಪರಿಸೀಲನೆದ ನಡುತ ವ್ಯತ್ವಾಸೊ \"$1\"",
+       "lineno": "$1ನೇ ಸಾಲ್:",
        "compareselectedversions": "ಆಯ್ಕೆ ಮಲ್ತಿನ ಆವೃತ್ತಿಲೆನ್ ಹೊಂದಾಣಿಕೆ ಮಲ್ತ್ ತೂಲೆ",
-       "editundo": "ದುಂಬುದಲೆಕ",
-       "searchresults": "ನಾಡಟದ ಫಲಿತಾಂಶೊಲು",
-       "searchresults-title": "\"$1\" ಕ್ ನಾಡಟದ ಫಲಿತಾಂಶೊಲು",
+       "editundo": "ದುಂಬುದಲೆಕೊ",
+       "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 ಮದ್ಯಂತರೊ ಪರಿಸ್ಕರಣೆ}} ಅವ್ವೇ ಬಳಕೆದಾರೆರೆನ್ ತೋಜಾದ್‍ಜಿ)",
+       "searchresults": "ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
+       "searchresults-title": "\"$1\"ಕ್ ನಾಡ್‍ಪತ್ತ್‌ನೆದ ಪಲಿತಾಂಸೊಲು",
        "notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
-       "prevn": "ದುಂಬುದ {{PLURAL:$1|$1}}",
-       "nextn": "ಬೊಕ್ಕದ {{PLURAL:$1|$1}}",
-       "shown-title": "ಪ್ರತಿ ಪುಟೊಡುಲಾ $1 {{PLURAL:$1|result|results}} ತೋಜಿಪಾವು",
-       "viewprevnext": "ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)",
-       "searchprofile-articles": "ಲೇಖನ ಪುಟೊ",
-       "searchprofile-images": "ಬಹುಮಾಧ್ಯಮ",
-       "searchprofile-everything": "ಪ್ರತಿಯೊಂಜಿ",
-       "searchprofile-advanced": "ಪರಿಣತ",
-       "searchprofile-articles-tooltip": "$1 ಟ್ ನಾಡ್ಲೆ",
-       "searchprofile-images-tooltip": "ಫೈಲ್ ನಾಡ್ಲೆ",
-       "searchprofile-everything-tooltip": "ಮಾತಾ ಪುಟಕ್ಕುಲೆಡ್ ನಾಡ್ಲೆ (ಪಾತೆರದ ಪುತಲ ಸೇರ್ದ್)",
-       "search-result-size": "$1 ({{PLURAL:$2|೧ ಪದ|$2 ಪದೊಲು}})",
-       "search-redirect": "(ಪುನರ್ನಿರ್ದೇಶನ $1)",
-       "search-section": "(ವಿಭಾಗ $1)",
+       "prevn": "ದುಂಬು {{PLURAL:$1|$1}}",
+       "nextn": "ಬೊಕ್ಕೊ {{PLURAL:$1|$1}}",
+       "nextn-title": "ದುಂಬುದ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊಲು}}",
+       "shown-title": "ಪ್ರತಿ ಪುಟೊಡುಲಾ $1 {{PLURAL:$1|result|ಪಲಿತಾಂಸೊ}} ತೋಜಿಪಾವು",
+       "viewprevnext": "ತೂಲೆ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>ಈ ಪುಟೊನು ರಚಿಸಲೆ \"[[:$1]]\" ಈ ವಿಕಿಡ್!</strong> {{PLURAL:$2|0=|See also the page found with your search.|ನಾಡ್‍ನಗ ತೋಜಿದ್ ಬರ್ಪುನ ಪಲಿತಾಂಸೊನು ತೂಲೆ.}}",
+       "searchprofile-articles": "ಲೇಕನೊ ಪುಟೊ",
+       "searchprofile-images": "ಮಲ್ಟಿಮೀಡಿಯೊ",
+       "searchprofile-everything": "ಪ್ರತಿ ವಿಸಯೊ",
+       "searchprofile-advanced": "ಸುದಾರಣೆದ",
+       "searchprofile-articles-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-caption": "ಬಳಗದ ಇತರ ಯೋಜನೆಲು",
        "search-interwiki-default": "$1 ಫಲಿತಾಂಶೊಲು:",
        "search-interwiki-more": "(ಮಸ್ತ್)",
        "searchrelated": "ಸ೦ಬ೦ಧ ಇತ್ತಿನ",
-       "searchall": "ಮಾತಾ",
-       "search-nonefound": "ಈರೆನ ವಿಚಾರಣೆಗ್ ತಕ್ಕುದಾಯಿನ ಪಲಿತಾಂಶೊಲು ಇಜ್ಜಿ.",
+       "searchall": "ಮಾತ",
+       "search-showingresults": "{{PLURAL:$4|ಫಲಿತಾಂಸೊ<strong>$1</strong> of <strong>$3</strong>|ಫಲಿತಾಂಸೊ <strong>$1 - $2</strong> of <strong>$3</strong>}}",
+       "search-nonefound": "ಈರೆನ ವಿಚಾರಣೆಗ್ ತಕ್ಕಂದಿನ ಪಲಿತಾಂಸೊಲು ಇದ್ದಿ.",
+       "search-nonefound-thiswiki": "ಈ ಸೈಟ್‍ಡ್ ಪ್ರಸ್ನೆನೆದ ಪಲಿತಾಂಸೊ ಕೂಡೊಂದಿಜ್ಜಿ",
        "powersearch-legend": "ಅಡ್ವಾನ್ಸ್’ಡ್ ಸರ್ಚ್",
        "powersearch-ns": "ನೇಮ್-ಸ್ಪೇಸ್’ಲೆಡ್ ನಾಡ್ಲೆ",
        "powersearch-toggleall": "ಮಾತಾ",
        "preferences": "ಪ್ರಾಶಸ್ತ್ಯೊಲು",
-       "mypreferences": "ಪà³\8dರಾà²ಸ್ತ್ಯೊಲು",
+       "mypreferences": "ಪà³\8dರಾಸಸ್ತ್ಯೊಲು",
        "prefs-rc": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
        "prefs-resetpass": "ಪ್ರವೇಶಪದೊನ್ ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "prefs-changeemail": "ಇ-ಅಂಚೆ ವಿಳಾಸೊನು ಬದಲಾವಣೆ ಮಲ್ಪುಲೆ",
        "grouppage-sysop": "{{ns:project}}:ನಿರ್ವಾಹಕೆರ್",
        "right-read": "ಪುಟಕ್‍ಲೆನ್ ಓದುಲೆ",
        "right-edit": "ಪುಟೊನ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
+       "right-writeapi": "ಬರೆಯಿನ ಎಪಿಐದ ಬಳಕೆ",
        "right-delete": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ",
        "right-undelete": "ಪುಟೊನ್ ಮಾಜಾವಡೆ",
-       "newuserlogpage": "ಸದಸ್ಯ ರಚನೆ ಲಾಗ್",
+       "newuserlogpage": "ಸದಸ್ಯೆರೆ ಸ್ರಿಸ್ಟಿದ ದಾಕಲೆ",
        "rightslog": "ಸದಸ್ಯೆರ್ನ ಹಕ್ಕು ದಾಖಲೆ",
        "action-read": "ಈ ಪುಟೊನು ಓದುಲೆ",
        "action-edit": "ಈ ಪುಟೊನು ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
        "action-sendemail": "ಇ-ಅಂಚೆ ಕಡಪುಡುಲೆ",
        "nchanges": "$1 {{PLURAL:$1|ಬದಲಾವಣೆ|ಬದಲಾವಣೆಲು}}",
        "enhancedrc-history": "ಇತಿಹಾಸೊ",
-       "recentchanges": "ಇಂಚಿಪದ ಬದಲಾವಣೆಲು",
-       "recentchanges-legend": "à²\87à²\82à²\9aಿಪದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81 ಆಯ್ಕೆಲು",
-       "recentchanges-summary": "à²\88 à²µà²¿à²\95ಿà²\9fà³\8d à²\87à²\82à²\9aಿಪà³\8dಪ à²\86ತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ನà³\8d à²\9fà³\8dರಾà²\95à³\8d à²®à²²à³\8dಪà³\81ಲà³\86",
+       "recentchanges": "à²\87à²\82à²\9aಿಪà³\8aದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81",
+       "recentchanges-legend": "à²\87à²\82à²\9aಿಪà³\8aದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86 ಆಯ್ಕೆಲು",
+       "recentchanges-summary": "à²\88 à²µà²¿à²\95ಿà²\9fà³\8d à²\87à²\82à²\9aಿಪà³\8dಪ à²®à²²à³\8dತà³\8dâ\80\8cನ à²¬à²¦à²²à²¾à²µà²£à³\86ನà³\8d à²\88 à²ªà³\81à²\9fà³\8aಡà³\81 à²\88ರà³\8d à²¤à³\82ವà³\8aಲಿ",
        "recentchanges-feed-description": "ಈ ಫೀಡ್’ಡ್ ವಿಕಿಕ್ ಇಂಚಿಪ್ಪ ಆತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ಟ್ರ್ಯಾಕ್ ಮಲ್ಪುಲೆ.",
        "recentchanges-label-newpage": "ಇರ್ನ ಈ ಬದಲಾವಣೆ ಪೊಸ ಪುಟೊನು ಸುರು ಮಲ್ಪುಂಡು",
        "recentchanges-label-minor": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
-       "recentchanges-label-bot": "ಈ ಸಂಪಾದನೆನ್ ಒಂಜಿ ಬಾಟ್ ಮಲ್ತ್‍ದುಂಡು",
-       "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‍ದಿಜ್ಜಿ.",
-       "rclistfrom": "$3 $2 ರ್ದ್ ಶುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
+       "recentchanges-label-bot": "ಈ ಸಂಪದನೆ ಒಂಜಿ ಬಾಟ್‍ಡ್ ಆತ್ಂಡ್",
+       "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‌ಜಿ.",
+       "recentchanges-label-plusminus": "ಬೈಟ್ಸ್‌ದ ಲೆಕ್ಕೊಡು ಈ ಪಾಲೆದ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
+       "recentchanges-legend-heading": "'''ಲೆಜೆಂಡ್:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
+       "rclistfrom": "$3 $2 ರ್ದ್ ಸುರುವಾತಿನ ಪೊಸ ಬದಲಾವಣೆಲೆನ್ ತೊಜ್ಪಾವು",
        "rcshowhideminor": "$1 ಎಲ್ಯೆಲ್ಯ ಬದಲಾವಣೆಲು",
        "rcshowhideminor-show": "ತೋಜಾಲೆ",
-       "rcshowhideminor-hide": "ದೆಂಗಾವು",
-       "rcshowhidebots": "$1 ಬಾಟ್",
+       "rcshowhideminor-hide": "à²\85ಡೆಂಗಾವು",
+       "rcshowhidebots": "$1ಬೋಟ್‍ಲು",
        "rcshowhidebots-show": "ತೊಜಾವು",
-       "rcshowhidebots-hide": "ದà³\86à²\82à²\97ಾಲà³\86",
-       "rcshowhideliu": "ಲಾà²\97à³\8d-à²\87ನà³\8d ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್ $1",
-       "rcshowhideliu-hide": "ದೆಂಗಾವು",
-       "rcshowhideanons": "à²\85ನಾಮಧà³\87ಯ ಸದಸ್ಯೆರ್ $1",
+       "rcshowhidebots-hide": "à²\85ಡà³\86à²\82à²\97ಾವà³\81",
+       "rcshowhideliu": "ನà³\8bà²\82ದವಣà³\86 ಆತಿನಂಚಿನ ಸದಸ್ಯೆರ್ $1",
+       "rcshowhideliu-hide": "à²\85ಡೆಂಗಾವು",
+       "rcshowhideanons": "ಪà³\81ದರà³\8d à²\87ದà³\8dಯಾà²\82ದಿನ ಸದಸ್ಯೆರ್ $1",
        "rcshowhideanons-show": "ತೋಜಾಲೆ",
-       "rcshowhideanons-hide": "ದೆಂಗಾವು",
+       "rcshowhideanons-hide": "à²\85ಡೆಂಗಾವು",
        "rcshowhidepatr": "$1 ಪರೀಕ್ಷಿಸಾದಿನ ಸಂಪಾದನೆಲು",
        "rcshowhidemine": "ಎನ್ನ ಸಂಪಾದನೆಲೆನ್ $1",
        "rcshowhidemine-show": "ತೋಜಾಲೆ",
-       "rcshowhidemine-hide": "ದೆಂಗಾವು",
-       "rclinks": "ದà³\81à²\82ಬà³\81ದ $2 à²¦à²¿à²¨à³\8aಲà³\86ಡà³\8d à²®à²²à³\8dತಿನ $1 à²\95ಡà³\86ತ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
-       "diff": "ವ್ಯತ್ಯಾಸ",
-       "hist": "ಇತಿಹಾಸ",
-       "hide": "ದೆಂಗಾವು",
-       "show": "ತà³\8aà²\9cà³\8dಪಾವು",
+       "rcshowhidemine-hide": "à²\85ಡೆಂಗಾವು",
+       "rclinks": "ದà³\81à²\82ಬà³\81ದ $2 à²¦à²¿à²¨à³\8aಲà³\86ಡà³\8d à²®à²²à³\8dತಿನ $1 à²ªà²¿à²°à²µà³\81ದ ಬದಲಾವಣೆಲೆನ್ ತೂಲೆ <br />$3",
+       "diff": "ವ್ಯತ್ಯಾಸ",
+       "hist": "ಇತಿಹಾಸ",
+       "hide": "à²\85ಡೆಂಗಾವು",
+       "show": "ತà³\8bà²\9cಾವು",
        "minoreditletter": "ಚು",
        "newpageletter": "ಪೊ",
        "boteditletter": "ಬಾ",
        "rc_categories_any": "ಒವ್ವೇ",
-       "rc-change-size-new": "$1 {{ಬಹುವಚನೊ:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}ಬದಲಾವಣೆದ ಬುಕ್ಕೊ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}ಬದಲಾವಣೆಡ್ದ್ ಬುಕ್ಕೊ",
        "newsectionsummary": "\n/* $1 */ಪೊಸ ವಿಭಾಗ",
        "rc-enhanced-expand": "ವಿವರೊಲೆನ್ ತೊಜ್ಪಾವು (ಜಾವ ಸ್ಕ್ರಿಪ್ಟ್ ಬೋಡಾಪುಂಡು)",
        "rc-enhanced-hide": "ವಿವರೊಲೆನ್ ದೆಂಗಾವು",
-       "recentchangeslinked": "ಸà²\82ಬà²\82ಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
+       "recentchangeslinked": "ಸà²\82ಬà²\82ದà³\8a ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
        "recentchangeslinked-feed": "ಸಂಬಂಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
-       "recentchangeslinked-toolbox": "ಸà²\82ಬà²\82ಧ ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
-       "recentchangeslinked-title": "\"$1\" à²ªà³\81à²\9fà³\8aà²\9fà³\81 à²\86ತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\81",
-       "recentchangeslinked-summary": "à²\92à²\82à²\9cಿ à²¨à²¿à²°à³\8dದಿಷà³\8dà²\9f à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 (à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¨à²¿à²°à³\8dದಿಷà³\8dà²\9f à²µà²°à³\8dà²\97à³\8aà²\97à³\81 à²¸à³\87ರà³\8dದಿನ à²ªà³\81à²\9fà³\8aಲà³\86ರà³\8dದà³\8d) à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪ à²®à²²à³\8dತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²ªà²\9fà³\8dà²\9fಿ à²®à²²à³\8dಪà³\86ರಾತà³\8dâ\80\99ನà³\8dಡà³\8d.\n[[Special:Watchlist|à²\87ರà³\86ನ à²µà³\80à²\95à³\8dಷಣಾಪಟ್ಟಿಡ್]] ಉಪ್ಪುನ ಪುಟೊಲು '''ದಪ್ಪ ಅಕ್ಷರೊಡು''' ಉಂಡು.",
+       "recentchangeslinked-toolbox": "ಸà²\82ಬà²\82ದà³\8a ಉಪ್ಪುನಂಚಿನ ಬದಲಾವಣೆಲು",
+       "recentchangeslinked-title": "\"$1\" à²ªà³\81à²\9fà³\8aà²\9fà³\81 à²\86ಯಿನ à²¬à²¦à²²à²¾à²µà²£à³\86à²\97à³\8d à²¸à²\82ಬà²\82ದಿಸದà³\8d",
+       "recentchangeslinked-summary": "à²\92à²\82à²\9cಿ à²¨à²¿à²°à³\8dದಿಸà³\8dà²\9fà³\8a à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 (à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¨à²¿à²°à³\8dದಿಸà³\8dà²\9fà³\8a à²µà²°à³\8dà²\97à³\8aà²\97à³\81 à²¸à³\87ರà³\8dದಿನ à²ªà³\81à²\9fà³\8aಲà³\86ರà³\8dದà³\8d) à²¸à²\82ಪರà³\8dà²\95à³\8a à²\89ಪà³\8dಪà³\81ನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪ à²®à²²à³\8dತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à²¿à²°à³\8dತà³\8d à²ªà²\9fà³\8dà²\9fಿ à²®à²²à³\8dಪà³\86ರಾತà³\8dà²\82ಡà³\8d.\n[[Special:Watchlist|à²\87ರà³\86ನ à²µà³\80à²\95à³\8dಷಣà³\86 ಪಟ್ಟಿಡ್]] ಉಪ್ಪುನ ಪುಟೊಲು '''ದಪ್ಪ ಅಕ್ಷರೊಡು''' ಉಂಡು.",
        "recentchangeslinked-page": "ಪುಟೊತ ಪುದರ್:",
-       "recentchangeslinked-to": "à²\87à²\82ದà³\86ತ à²¬à²¦à²²à²¿à²\97à³\8d à²\95à³\8aರà³\8dತಿನ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²²à²¿à²\82à²\95à³\8d à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವು",
+       "recentchangeslinked-to": "à²\87à²\82ದà³\86ತ à²¬à²¦à²²à³\8dâ\80\8dà²\97à³\8d à²\95à³\8aರà³\8dತà³\8dâ\80\8dನ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²\95à³\8aà²\82ಡಿ à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ದ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವು",
        "upload": "ಫೈಲ್ ಅಪ್ಲೋಡ್",
        "uploadbtn": "ಫೈಲ್’ನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
        "uploadnologin": "ಲಾಗಿನ್ ಆತ್‘ಜ್ಜರ್",
        "uploadlogpage": "ಅಪ್ಲೋಡ್ ದಾಖಲೆ",
        "filename": "ಕಡತದ ಪುದರ್",
-       "filedesc": "ಸಾರಾà²\82à²",
+       "filedesc": "ಸಾರಾà²\82ಸà³\8a",
        "filesource": "ಮೂಲ",
        "savefile": "ಕಡತನ್ ಒರಿಪಾಲೆ",
        "upload-source": "ಮೂಲ ಕಡತ",
-       "license-header": "ಲà³\88ಸà³\86ನà³\8dಸಿà²\82à²\97à³\8d",
+       "license-header": "ಪರವಾನಿà²\97à³\86",
        "imgfile": "ಫೈಲ್",
        "file-anchor-link": "ಫೈಲ್",
-       "filehist": "ಫà³\88ಲà³\8dâ\80\99ದ à²\87ತಿಹಾಸ",
-       "filehist-help": "ಫà³\88ಲà³\8d à²\86 à²¦à²¿à²¨à³\8aà²\9fà³\81 à²\8eà²\82à²\9a à²\87ತà³\8dತà³\8dâ\80\99ನà³\8dಡà³\8dâ\80\99ನà³\8dದà³\8d à²¤à³\82ಯà³\86ರà³\86 à²\86 à²¦à²¿à²¨/ಪà³\8aರà³\8dತà³\81ದ à²®à²¿à²¤à³\8dತà³\8d à²\95à³\8dಲಿà²\95à³\8d à²®à²²à³\8dಪà³\81ಲà³\86.",
+       "filehist": "ಫà³\88ಲà³\8dâ\80\8dದ à²\87ತಿಹಾಸà³\8a",
+       "filehist-help": "ದಿನà³\8a/ಪà³\8aರà³\8dತà³\81ದ à²®à²¿à²¤à³\8dತà³\8d à²\92ತà³\8dತà³\8dâ\80\8cà²\82ಡ à²\88 à²«à³\88ಲà³\8dâ\80\8dದ à²¨à²¿à²\9cà³\8aಸà³\8dತಿತಿ à²¤à³\8bà²\9cà³\81à²\82ಡà³\81.",
        "filehist-deleteall": "ಮಾತಾ ಮಾಜಾಲೆ",
        "filehist-deleteone": "ಮಾಜಾಲೆ",
-       "filehist-current": "ಪà³\8dರಸà²\95à³\8dತ",
-       "filehist-datetime": "ದಿನ/ಪೊರ್ತು",
-       "filehist-thumb": "ಥà²\82ಬà³\8d-ನà³\88ಲà³\8d",
-       "filehist-thumbtext": "$1 ತ ಲೆಕ್ಕ ಆವೃತ್ತಿದ ತಂಬ್-ನೈಲ್",
-       "filehist-user": "ಸದಸà³\8dಯà³\86",
+       "filehist-current": "à²\87ತà³\8dತà³\86ದ",
+       "filehist-datetime": "ದಿನ/ಪೊರ್ತು",
+       "filehist-thumb": "à²\8eಲà³\8dಯà²\9aಿತà³\8dರà³\8a",
+       "filehist-thumbtext": "$1ತ ಆವೃತ್ತಿದ ಎಲ್ಯಚಿತ್ರೊ",
+       "filehist-user": "ಬಳà²\95à³\86ದಾರà³\86ರà³\8d",
        "filehist-dimensions": "ಆಯಾಮೊಲು",
        "filehist-filesize": "ಫೈಲ್’ದ ಗಾತ್ರ",
-       "filehist-comment": "à²\95ಮà³\86à²\82à²\9fà³\8d",
-       "imagelinks": "ಫೈಲ್ ಲಿಂಕ್’ಲು",
-       "linkstoimage": "à²\88 à²«à³\88ಲà³\8dâ\80\99à²\97à³\8d à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²\88 {{PLURAL:$1|ಪà³\81à²\9f|$1 à²ªà³\81à²\9fà³\8aಲà³\81}} à²²à²¿à²\82à²\95್ ಕೊರ್ಪುಂಡು.",
-       "nolinkstoimage": "ಈ ಫೈಲ್‍ಗ್ ಸಂಪರ್ಕ ಉಪ್ಪುನ ವಾ ಪುಟಲಾ ಇಜ್ಜಿ.",
+       "filehist-comment": "à²\85ಬಿಪà³\8dರಾಯà³\8a",
+       "imagelinks": "ಫೈಲ್‍ದ ಬಳಕೆ",
+       "linkstoimage": "à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ {{PLURAL:$1|ಪà³\81à²\9f|$1 à²ªà³\81à²\9fà³\8aಲà³\86 à²\95à³\8aà²\82ಡಿ}}à²\88 à²«à³\88ಲà³\8dâ\80\8dà²\97್ ಕೊರ್ಪುಂಡು.",
+       "nolinkstoimage": "ಈ ಫೈಲ್‍ಗ್ ಸಂಪರ್ಕೊ ಉಪ್ಪುನ ವಾ ಪುಟೊಲಾ ಇದ್ದಿ.",
        "sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಡುಪ್ಪು.",
-       "upload-disallowed-here": "ಈರ್ ಈ ಕಡತನ್ ಕುಡ ಬರೆವರೆ ಸಾದ್ಯ ಇಜ್ಜಿ.",
+       "sharedupload-desc-here": "ಈ ಪುಟೊ $1ಡ್ದ್ ಬೊಕ್ಕ ಬೇತೆ ಯೋಜನೆಡ್ದ್ ಗಳಸೊಲಿ.\nಈ ಪುಟೊತ ವಿವರೊ [$2 ಪುಟೊತ ವಿವರೊ] ತಿರ್ತ ಸಾಲ್‍ಡ್ ತೋಜಾದ್ಂಡ್",
+       "upload-disallowed-here": "ಈರ್ ಈ ಫೈಲ್‍ನ್ ಕುಡೊರೊ ಬರೆವರೆ ಸಾದ್ಯೊ ಇದ್ದಿ.",
        "filedelete-comment": "ಕಾರಣ",
        "filedelete-submit": "ಮಾಜಾಲೆ",
-       "randompage": "ಯಾದà³\83à²\9aà³\8dà²\9bಿà²\95 à²ªà³\81à²\9f",
+       "randompage": "à²\87à²\9aà³\8dà²\9aà³\86ದ à²ªà³\81à²\9fà³\8a",
        "statistics": "ಅಂಕಿ ಅಂಶೊಲು",
        "statistics-header-pages": "ಪುಟೊತ ಅಂಕಿ ಅಂಶಲು",
        "nbytes": "$1 {{PLURAL:$1|ಬೈಟ್|ಬೈಟ್‍ಲು}}",
        "movethispage": "ಈ ಪುಟೊನು ಮೂವ್ ಮಲ್ಪುಲೆ",
        "pager-newer-n": "{{PLURAL:$1|ಪೊಸ ೧|ಪೊಸ $1}}",
        "pager-older-n": "{{PLURAL:$1|ಪರತ್ತ್ ೧|ಪರತ್ತ್ $1}}",
-       "booksources": "ಪà³\81ಸà³\8dತà²\95à³\8aಲà³\8dದ à²®à³\82ಲ",
-       "booksources-search-legend": "ಪà³\81ಸà³\8dತà²\95à³\8aದ à²®à³\82ಲà³\8aನà³\81 à²¨à²¾à²¡à³\8dಲ",
-       "booksources-search": "ನಾಡà³\8dâ\80\98ಲೆ",
-       "log": "ದಾà²\96ಲೆಲು",
+       "booksources": "ಬà³\82à²\95à³\81ದ à²®à³\82ಲà³\8a",
+       "booksources-search-legend": "ಬà³\82à²\95à³\81ದ à²®à³\82ಲà³\8aನà³\81 à²¨à²¾à²¡à³\8dâ\80\8dಲà³\86",
+       "booksources-search": "ನಾಡà³\8dâ\80\8dಲೆ",
+       "log": "ದಾà²\95ಲೆಲು",
        "allpages": "ಪೂರಾ ಪೂಟೊಲು",
        "allpagesfrom": "ಇಂದೆರ್ದ್ ಶುರುವಾಪುನ ಪುಟೊಲೆನ್ ತೊಜ್ಪಾವು:",
        "allpagesto": "ಇಂದೆರ್ದ್ ಅಂತ್ಯ ಆಪುನ ಪುಟೊಲೆನ್ ತೊಜ್ಪಾವು:",
-       "allarticles": "ಪà³\82ರಾ à²²à³\87à²\96ನೊಲು",
-       "allpagessubmit": "ಪೋ",
+       "allarticles": "ಮಾತ à²ªà³\81à²\9fೊಲು",
+       "allpagessubmit": "ಪೋಲೆ",
        "categories": "ವರ್ಗೊಲು",
        "listgrouprights-members": "(ಸದಸ್ಯೆರ್ನ ಪಟ್ಟಿ)",
        "emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೈಲ್ ಕಡಪುಡ್ಲೆ",
        "watch": "ತೂಲೆ",
        "watchthispage": "ಈ ಪುಟೊನು ತೂಲೆ",
        "unwatch": "ವೀಕ್ಷಣಾಪಟ್ಟಿರ್ದ್ ದೆಪ್ಪು",
+       "watchlistall2": "ಪೂರ",
        "watchlist-options": "ವೀಕ್ಷಣಾಪಟ್ಟಿ ಆಯ್ಕೆಲು",
        "watching": "ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೇರ್ಪಾವೊಂದುಂಡು...",
        "unwatching": "ವೀಕ್ಷಣಾಪಟ್ಟಿರ್ದ್ ದೆತ್ತೊಂದುಂಡು...",
        "actioncomplete": "ಕಾರ್ಯ ಸಂಪೂರ್ಣ",
-       "dellogpage": "ಡಿಲೀಟ್ ಮಲ್ತಿನ ಫೈಲ್’ಲೆದ ದಾಖಲೆ",
-       "rollbacklink": "ಪಿರ ಪೋಲೆ",
-       "protectlogpage": "ಸಂರಕ್ಷಣೆ ದಿನಚರಿ",
+       "dellogpage": "ಡಿಲೀಟ್ ಮಲ್ತಿನ ಫೈಲ್‍ದ ದಾಕಲೆ",
+       "rollbacklink": "ಪುಡತ್ತ್ ಪಾಡ್",
+       "rollbacklinkcount": "ಪಿರ ದೆತೊನ್ಲೆ $1 {{PLURAL:$1|edit|ಸಂಪದನೆಲು}}",
+       "protectlogpage": "ಸೇರಾಯಿನ ದಾಕಲೆ",
        "protectedarticle": "\"[[$1]]\" ಸಂರಕ್ಷಿತವಾದುಂಡು.",
        "modifiedarticleprotection": "\"[[$1]]\" ಪುಟೊತ ಸಂರಕ್ಷಣೆ ಮಟ್ಟ ಬದಲಾಂಡ್",
        "undeletelink": "ದುಂಬುದ ಆವೃತ್ತಿಗ್ ಪೋಲೆ",
        "undeleteviewlink": "ತೂಲೆ",
-       "namespace": "ನà³\87ಮà³\8d-ಸà³\8dಪà³\87ಸà³\8d:",
+       "namespace": "ಪà³\81ದರà³\8dâ\80\8dದ à²¬à²\97à³\86:",
        "invert": "ಆಯ್ಕೆನ್ ತಿರ್ಗಾಲೆ",
+       "tooltip-invert": "ಈ ಚೌಕೊದುಲಯಿಡ್ ಅಡೆಂಗಿನ ಪುದರ್‍ನ್ ಈ ಚೌಕೊಡೆ ಪರೀಕ್ಷಿಸಲೆಲೆ(ಬೊಕ್ಕೊ ಒಟ್ಟುಗಿತ್ತಿನ ಪುದರ್‍ನ್ಲಾ ಪರೀಕ್ಷಿಸವೊಲಿ)",
+       "namespace_association": "ಜತೆಟಿತ್ತಿನ ಪುದರ್",
+       "tooltip-namespace_association": "ಈ ಚೌಕೊನು ಚರ್ಚೆನ್ ಸೇರಾದ್ ಪರೀಕ್ಷಿಸಲೆ ಅತ್ತ್ಂಡ ವಿಸಯೊಗು ಸರಿಯಾಯಿನ ಪುದರ್ದ ಜತೆಟ್ ಸೇರಾಲೆ",
        "blanknamespace": "(ಮುಖ್ಯ)",
-       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}} ಕಾಣಿಕೆಲು",
+       "contributions": "{{$1ಸದಸ್ಯೆರ್ನ}}ಕಾಣಿಕೆಲು",
        "contributions-title": "$1 ಗ್ ಸದಸ್ಯೆರ್ನ ಕಾಣಿಕೆ",
-       "mycontris": "à²\8eನà³\8dನ à²\95ಾಣಿಕೆಲು",
+       "mycontris": "à²\8eನà³\8dನ à²\95ಾನಿಕೆಲು",
        "contribsub2": "$1 ($2) ಗ್",
        "uctop": " (ಮಿತ್ತ್)",
        "month": "ಈ ತಿಂಗೊಲುರ್ದ್ (ಬೊಕ್ಕ ದುಂಬುದ):",
-       "year": "à²\88 à²µà²°à³\8dಷà³\8aರà³\8dದà³\81 (ಬೊಕ್ಕ ದುಂಬುದ):",
+       "year": "à²\88 à²\92ರà³\8dಸà³\8aರà³\8dದà³\81(ಬೊಕ್ಕ ದುಂಬುದ):",
        "sp-contributions-newbies": "ಪೊಸ ಖಾತೆಲೆದ ಕಾಣಿಕೆಲೆನ್ ಮಾತ್ರ ತೊಜ್ಪಾವು",
        "sp-contributions-blocklog": "ತಡೆಪತ್ತುನ ದಾಖಲೆ",
        "sp-contributions-logs": "ದಾಖಲೆಲು",
        "sp-contributions-search": "ಕಾಣಿಕೆಲೆನ್ ನಾಡ್ಲೆ",
        "sp-contributions-username": "ಐ.ಪಿ ವಿಳಾಸ ಅತ್ತ್’ನ್ಡ ಬಳಕೆದ ಪುದರ್:",
        "sp-contributions-submit": "ನಾಡ್",
-       "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊಲು ಲಿಂಕ್ ಕೊರ್ಪುಂಡು",
-       "whatlinkshere-title": "\"$1\" à²ªà³\81à²\9fà³\8aà²\97à³\81 à²²à²¿à²\82à²\95à³\8d ಕೊರ್ಪುನ ಪುಟೊಲು",
-       "whatlinkshere-page": "ಪುಟ:",
-       "linkshere": "'''[[:$1]]'''à²\97à³\8d à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\99ದ à²ªà³\81à²\9fà³\8aಲà³\81 à²²à²¿à²\82à²\95à³\8d ಕೊರ್ಪುಂಡು.",
+       "whatlinkshere": "ಇಡೆ ವಾ ಪುಟೊ ಕೊಂಡಿ ಕೊರ್ಪುಂಡು",
+       "whatlinkshere-title": "\"$1\" à²ªà³\81à²\9fà³\8aà²\97à³\81 à²\95à³\8aà²\82ಡಿ ಕೊರ್ಪುನ ಪುಟೊಲು",
+       "whatlinkshere-page": "ಪುಟ:",
+       "linkshere": "'''[[:$1]]'''à²\97à³\8d à²\88 à²¤à²¿à²°à³\8dತà³\8dâ\80\8dದ à²ªà³\81à²\9fà³\8aà²\97à³\81 à²\95à³\8aà²\82ಡಿ ಕೊರ್ಪುಂಡು.",
        "nolinkshere": "'''[[:$1]]''' ಗ್ ವಾ ಪುಟೊಲುಲಾ ಲಿಂಕ್ ಕೊರ್ಪುಜಿ.",
-       "isredirect": "ಪà³\81ನರà³\8dನಿರà³\8dದà³\87ಶನ à²ªà³\81à²\9f",
-       "istemplate": "ಸà³\87ರà³\8dಪಡೆ",
-       "isimage": "ಫà³\88ಲà³\8dâ\80\8dದ à²²à²¿à³¦à²\95à³\8d",
+       "isredirect": "ಪಿರ à²¨à²¿à²°à³\8dದà³\87ಶನà³\8aದ à²ªà³\81à²\9fà³\8a",
+       "istemplate": "ಸà³\87ರಾವà³\81ನೆ",
+       "isimage": "ಫà³\88ಲà³\8dâ\80\8dದ à²\95à³\8aà²\82ಡಿ",
        "whatlinkshere-prev": "{{PLURAL:$1|ದುಂಬುದ|ದುಂಬುದ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|ಬೊಕ್ಕದ|ಬೊಕ್ಕದ $1}}",
-       "whatlinkshere-links": "â\86\90 à²²à²¿à²\82à²\95à³\8dâ\80\99ಲು",
-       "whatlinkshere-hideredirs": "$1 à²ªà³\81ನರà³\8dನಿರà³\8dದà³\87ಶನà²\97ಳು",
-       "whatlinkshere-hidetrans": "$1 à²\9fà³\8dರಾನà³\8dಸà³\8dâ\80\99à²\95à³\8dಲà³\82ಶನà³\8dಸà³\8d",
+       "whatlinkshere-links": "â\86\90 à²\95à³\8aà²\82ಡಿಲು",
+       "whatlinkshere-hideredirs": "$1 à²ªà²¿à²° à²¨à²¿à²°à³\8dದà³\87ಶನà³\8aಲು",
+       "whatlinkshere-hidetrans": "$1 à²¸à³\87ರಾವà³\81ನà³\86",
        "whatlinkshere-hidelinks": "$1 ಕೊಂಡಿಲು",
        "whatlinkshere-filters": "ಅರಿಪೆಲು",
        "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": "ತಡೆಪತ್ತ್’ದಿನ ಐ.ಪಿ ವಿಳಾಸೊಲು ಅಂಚೆನೆ ಬಳಕೆದ ಪುದರ್’ಲು",
-       "blocklink": "à²\85ಡà³\8dಡ à²ªà²¤à³\8dತà³\8dâ\80\99ಲೆ",
+       "blocklink": "à²\85ಡà³\8dಡ à²ªà²¤à³\8dತà³\8dâ\80\8cಲೆ",
        "unblocklink": "ಅಡ್ಡನ್ ದೆಪ್ಪುಲೆ",
        "change-blocklink": "ಬ್ಲಾಕ್’ನ್ ಬದಲಾಲೆ",
        "contribslink": "ಕಾಣಿಕೆಲು",
        "blocklogentry": "[[$1]] ಖಾತೆನ್ $2 $3 ಮುಟ್ಟ ತಡೆಪತ್ತ್’ದ್’ನ್ಡ್",
        "unblocklogentry": "$1 ಖಾತೆನ್ ಅನ್-ಬ್ಲಾಕ್ ಮಲ್ತ್’ನ್ಡ್",
        "block-log-flags-nocreate": "ಖಾತೆ ಸೃಷ್ಟಿನ್ ತಡೆಪತ್ತ್’ದ್’ನ್ಡ್",
-       "movelogpage": "ಸà³\8dಥಳಾà²\82ತರಿà²\95à³\86 à²¦à²¾à²\96ಲೆ",
+       "movelogpage": "ಸà³\8dತಲಾà²\82ತರà³\8aದ à²¦à²¾à²\95ಲೆ",
        "revertmove": "ದುಂಬುದ ಲೆಕೆ ಮಲ್ಪುಲೆ",
-       "export": "ಪà³\81à²\9fಲà³\86ನà³\8d à²°à²«à³\8dತà³\81 à²®à²²à³\8dಪà³\81ಲೆ",
+       "export": "ಪà³\81à²\9fà³\8aಲà³\86ನà³\8d à²\95ಡಪà³\81ಡà³\8dಲೆ",
        "allmessagesname": "ಪುದರ್",
-       "thumbnail-more": "ಮಲ್ಲ ಮಲ್ಪುಲೆ",
+       "thumbnail-more": "ಮಲ್ಲ ಮಲ್ಪುಲೆ",
        "thumbnail_error": "ಮುನ್ನೋಟ ಚಿತ್ರೊನು ಸೃಷ್ಟಿ ಮನ್ಪುನಗ ದೋಷ: $1",
-       "tooltip-pt-userpage": "ಎನ್ನ ಸದಸ್ಯ ಪುಟ",
-       "tooltip-pt-mytalk": "ಎನ್ನ ಚರ್ಚೆ ಪುಟ",
-       "tooltip-pt-preferences": "à²\8eನà³\8dನ à²\87ಷ್ಟೊಲು",
-       "tooltip-pt-watchlist": "à²\88ರà³\8d à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಾದà³\8d à²¨à²¿à²\97ಾ à²¦à³\80ತಿನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-pt-mycontris": "à²\8eನà³\8dನ à²\95ಾಣಿà²\95à³\86ಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-pt-login": "à²\88ರà³\8d à²²à²¾à²\97à³\8d à²\87ನà³\8d à²\86ವà³\8aಡà³\81à²\82ದà³\81 à²\95à³\8bರà³\8aà²\82ದà³\81ಲà³\8dಲ, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-pt-userpage": "ಎನ್ನ ಸದಸ್ಯ ಪುಟ",
+       "tooltip-pt-mytalk": "ಎನ್ನ ಚರ್ಚೆ ಪುಟ",
+       "tooltip-pt-preferences": "à²\8eನà³\8dನ à²\87ಸ್ಟೊಲು",
+       "tooltip-pt-watchlist": "à²\88ರà³\8d à²¬à²¦à²²à²¾à²µà²£à³\86à²\97ಾದà³\8d à²¨à²¿à²\97ಾ à²¦à³\80ತಿನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನ ಪಟ್ಟಿ",
+       "tooltip-pt-mycontris": "à²\8eನà³\8dನ à²\95ಾನಿà²\95à³\86ಲà³\86 ಪಟ್ಟಿ",
+       "tooltip-pt-login": "à²\88ರà³\8d à²²à²¾à²\97ಿನà³\8d à²\86ವà³\8aಡà³\81à²\82ದà³\81 à²\95à³\87ನà³\8aà²\82ದà³\81ಲà³\8dಲà³\8a, ಆಂಡ ಉಂದು ದಾಲ ಕಡ್ಡಾಯ ಅತ್ತ್.",
        "tooltip-pt-logout": "ಲಾಗ್ ಔಟ್",
-       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಲà³\8dತà³\8dâ\80\8dದà³\8d à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²¸à³\8dವಾà²\97ತ à²®à²²à³\8dಪà³\81ವೊ, ಆಂಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
-       "tooltip-ca-talk": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aತ à²¬à²\97à³\8dà²\97à³\86 ಚರ್ಚೆ",
-       "tooltip-ca-edit": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\88ರà³\8d à²¸à²\82ಪಾದನà³\86 à²®à²²à³\8dಪà³\8aಲಿ. à²¸à³\87ವà³\8d à²®à²²à³\8dಪà³\81ನ à²¦à³\81à²\82ಬà³\81 à²®à³\81ನà³\8dನà³\8bà²\9fದ à²\89ಪಯà³\8aà²\97 à²®à²¨à³\8dತà³\8aನà³\8dಲà³\86.",
-       "tooltip-ca-addsection": "ಪà³\8aಸ à²¸à³\86ಶನà³\8dನà³\8d à²¶ರು ಮಲ್ಪುಲೆ",
-       "tooltip-ca-viewsource": "ಉಂದೊಂಜಿ ಸಂರಕ್ಷಿತ ಪುಟ.\nಇಂದೆತ ಮೂಲೊನು ಈರ್ ತೂವೊಲಿ.",
-       "tooltip-ca-history": "à²\88 à²ªà³\81à²\9fà³\8aತ ಪರತ್ತ್ ಆವೃತ್ತಿಲು",
+       "tooltip-pt-createaccount": "ನಿà²\95à³\81ಲà³\81 à²ªà³\8aಸ à²\96ಾತà³\86 à²¸à³\81ರà³\81ಮಾà²\82ತà³\8dâ\80\8dದà³\8d à²²à²¾à²\97ಿನà³\8d à²\86ಪà³\81ನà³\88ನà³\8d à²ªà³\8dರà³\8bತà³\8dಸಾಹಿಸವೊ, ಆಂಡಲಾ ಉಂದು ಕಡ್ಡಾಯ ಅತ್ತ್.",
+       "tooltip-ca-talk": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aತ à²¬à²\97à³\86à²\9fà³\8d ಚರ್ಚೆ",
+       "tooltip-ca-edit": "à²\88 à²ªà³\81à²\9fà³\8aನà³\8d à²¸à²\82ಪà³\8aಲಿಪà³\81ಲà³\86",
+       "tooltip-ca-addsection": "ಪà³\8aಸ à²µà²¿à²¬à²¾à²\97à³\8aನà³\81 à²¸à³\81ರು ಮಲ್ಪುಲೆ",
+       "tooltip-ca-viewsource": "ಉಂದೊಂಜಿ ಸಂರಕ್ಷಿತ ಪುಟ.\nಇಂದೆತ ಮೂಲೊನು ಈರ್ ತೂವೊಲಿ.",
+       "tooltip-ca-history": "à²\88 à²ªà³\81à²\9fà³\8aದ ಪರತ್ತ್ ಆವೃತ್ತಿಲು",
        "tooltip-ca-protect": "ಈ ಪುಟೊನು ಸಂರಕ್ಷಣೆ ಮಲ್ಪುಲೆ",
        "tooltip-ca-delete": "ಈ ಪುಟೊನು ಡಿಲೀಟ್ ಮಲ್ಪುಲೆ",
-       "tooltip-ca-move": "à²\88 à²ªà³\82à²\9fà³\8aನà³\81 à²®à³\82ವà³\8d(ಸà³\8dಥಳಾà²\82ತರ) à²®à²²à³\8dಪà³\81ಲೆ",
-       "tooltip-ca-watch": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\87ರೆನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೆರ್ಪಾಲೆ",
+       "tooltip-ca-move": "à²\88 à²ªà³\82à²\9fà³\8aನà³\81 à²¬à³\87ತà³\86 à²\95ಡà³\86à²\95à³\8d à²ªà²¾à²¡à³\8dಲೆ",
+       "tooltip-ca-watch": "à²\88 à²ªà³\81à²\9fà³\8aನà³\81 à²\88ರೆನ ವೀಕ್ಷಣಾಪಟ್ಟಿಗ್ ಸೆರ್ಪಾಲೆ",
        "tooltip-ca-unwatch": "ಈ ಪುಟೊನು ಇರೆನ ವೀಕ್ಷಣಾ ಪಟ್ಟಿರ್ದ್ ದೆಪ್ಪುಲೆ",
-       "tooltip-search": "{{SITENAME}}ನà³\8d à²¨à²¾à²¡à³\8dâ\80\99ಲೆ",
-       "tooltip-search-go": "ಉಂದುವೇ ಪುದರ್ದ ಪುಟ ಇತ್ತ್’ನ್ಡ ಅಡೆ ಪೋಲ",
-       "tooltip-search-fulltext": "à²\88 à²ªà² à³\8dಯ à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನà³\8d à²¨à²¾à²¡à³\8dâ\80\99ಲ",
-       "tooltip-p-logo": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9fà³\8aನà³\81 à²¤à³\82ಲೆ",
-       "tooltip-n-mainpage": "ಮುಖ್ಯ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-n-mainpage-description": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9fà³\8aನà³\81 ತೂಲೆ",
-       "tooltip-n-portal": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8dâ\80\99ದ à²¬à²\97à³\8dà²\97à³\86, à²\88ರà³\8d à²¦à²¾à²¦ à²®à²²à³\8dಪà³\8aಲಿ, à²\93ಲà³\81 à²\87à²\82ದà³\86ತ à²¬à²\97à³\8dà²\97à³\86 ತೆರಿಯೊನೊಲಿ",
-       "tooltip-n-currentevents": "ಪà³\8dರಸà²\95à³\8dತ à²\98à²\9fನà³\86ಲà³\8dದ à²¬à²\97à³\8dà²\97à³\86 à²¹à²¿à²¨à³\8dನà³\86ಲà³\86 à²®à²¾à²¹à²¿à²¤à²¿ à²¤à³\86ರಿಯೊನ್ಲೆ",
-       "tooltip-n-recentchanges": "ವಿà²\95ಿಡà³\8d à²¦à³\81à²\82ಬà³\81ದ à²\92à²\82ತà³\86 à²¸à²®à²¯à²¡à³\8d à²\86ತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-n-randompage": "ಯಾದà³\83à²\9aà³\8dà²\9bಿà²\95 à²ªà³\81à²\9fವà³\8aà²\82à²\9cà³\87ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವà³\8d",
-       "tooltip-n-help": "ತà³\86ರಿತà³\8aನà³\86ರà³\86 à²\9cಾà²\97",
-       "tooltip-t-whatlinkshere": "ಇಡೆ ಲಿಂಕ್ ಕೊರ್ಪುನಂಚಿನ ಪೂರ ವಿಕಿ ಪುಟೊಲ್ದ ಪಟ್ಟಿ",
-       "tooltip-t-recentchangeslinked": "à²\88 à²ªà³\81à²\9fà³\8aರà³\8dದà³\81 à²¸à²\82ಪರà³\8dà²\95 à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ಡà³\8d à²\87à²\82à²\9aಿಪದ ಬದಲಾವಣೆಲು",
+       "tooltip-search": "{{SITENAME}}ನà³\8d à²¨à²¾à²¡à³\8dâ\80\8dಲೆ",
+       "tooltip-search-go": "ಉಂದುವೇ ಪುದರ್ದ ಪುಟೊ ಇತ್ತ್‌ಂಡ ಆಡೆ ಪೋಲೆ",
+       "tooltip-search-fulltext": "à²\88 à²ªà²\9fà³\8dಯà³\8aಡà³\8d à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಲà³\86ನà³\8d à²¨à²¾à²¡à³\8dâ\80\8cಲà³\86",
+       "tooltip-p-logo": "ಮà³\81à²\96à³\8dಯ à²ªà³\81à²\9fà²\97à³\8d à²ªà³\8bಲೆ",
+       "tooltip-n-mainpage": "ಮುಖ್ಯಪುಟನ್ ತೂಲೆ",
+       "tooltip-n-mainpage-description": "ಮà³\81à²\95à³\8dಯà³\8a à²ªà³\81à²\9fà³\8aನà³\8d ತೂಲೆ",
+       "tooltip-n-portal": "ಯà³\8bà²\9cನà³\86ದ à²¬à²\97à³\86à²\9fà³\8d, à²\88ರà³\8d à²¦à²¾à²¦ à²®à²²à³\8dಪà³\8aಲಿ, à²\93ಲà³\81 à²\87à²\82ದà³\86ತ à²¬à²\97à³\86à²\9fà³\8d ತೆರಿಯೊನೊಲಿ",
+       "tooltip-n-currentevents": "à²\87ತà³\8dತà³\86ದ à²\86ಪà³\81ಪà³\8bಪà³\81ನ à²¬à²\97à³\86à²\9fà³\8d à²¦à³\81à²\82ಬà³\81ದ à²®à²¾à²¹à²¿à²¤à²¿ à²¦à³\86ತೊನ್ಲೆ",
+       "tooltip-n-recentchanges": "ವಿà²\95ಿಡà³\8d à²¦à³\81à²\82ಬà³\81ದ à²\92à²\82ತà³\86 à²¸à²®à²¯à³\8aಡà³\8d à²\86ತಿನà²\82à²\9aಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನ ಪಟ್ಟಿ",
+       "tooltip-n-randompage": "à²\87à²\9aà³\8dà²\9aà³\86ದ à²ªà³\81à²\9fà³\8a à²\92à²\82à²\9cà³\86ನà³\8d à²¤à³\8bà²\9cಾವà³\81",
+       "tooltip-n-help": "à²\87à²\82ದà³\86ತ à²¬à²\97à³\86à²\9fà³\8d à²¤à³\86ರà³\86ಯà³\8aನà³\81ನ à²\9cಾà²\97à³\86",
+       "tooltip-t-whatlinkshere": "ಇಡೆಗ್ ಕೊಂಡಿ ಕೊರ್ಪುನಂಚಿನ ಪೂರ ವಿಕಿ ಪುಟೊಲೆನ ಪಟ್ಟಿ",
+       "tooltip-t-recentchangeslinked": "à²\88 à²ªà³\81à²\9fà³\8aಡà³\8dದà³\8d à²¸à²\82ಪರà³\8dà²\95à³\8a à²\89ಪà³\8dಪà³\81ನà²\82à²\9aಿನ à²ªà³\81à²\9fà³\8aಡà³\8d à²\87à²\82à²\9aಿಪà³\8aದ ಬದಲಾವಣೆಲು",
        "tooltip-feed-rss": "ಈ ಪುಟೊಗು ಆರ್.ಎಸ್.ಎಸ್ ಫೀಡ್",
-       "tooltip-feed-atom": "ಈ ಪುಟೊಗು Atom ಫೀಡ್",
-       "tooltip-t-contributions": "à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ à²\95ಾಣಿà²\95à³\86ಲà³\8dದ à²ªà²\9fà³\8dà²\9fಿನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವು",
+       "tooltip-feed-atom": "ಈ ಪುಟೊಗು ಆಟಮ್ ಫೀಡ್ ಮಲ್ಪುಲೆ",
+       "tooltip-t-contributions": "à²\88 à²¸à²¦à²¸à³\8dಯà³\86ರà³\8dನ à²\95ಾಣಿà²\95à³\86ದ à²ªà²\9fà³\8dà²\9fಿನà³\8d à²¤à³\8bà²\9cಾವು",
        "tooltip-t-emailuser": "ಈ ಸದಸ್ಯೆರೆಗ್ ಇ-ಮೇಲ್ ಕಡಪುಡ್ಲೆ",
-       "tooltip-t-upload": "ಫà³\88ಲà³\8dâ\80\99ನà³\8d à²\85ಪà³\8dಲà³\8bಡà³\8d à²®à²²à³\8dಪà³\81ಲà³\86",
-       "tooltip-t-specialpages": "ಪà³\82ರ à²µà²¿à²·à³\87ಶ à²ªà³\81à²\9fà³\8aಲà³\8dದ ಪಟ್ಟಿ",
-       "tooltip-t-print": "à²\88 à²ªà³\81à²\9fà³\8aತ à²ªà³\8dರಿà²\82à²\9fà³\8d ಆವೃತ್ತಿ",
-       "tooltip-t-permalink": "ಪà³\81à²\9fà³\8aತ à²\88 à²\86ವà³\83ತà³\8dತಿà²\97à³\8d à²¶à²¾à²¶à³\8dವತ à²²à²¿à²\82à²\95à³\8d",
-       "tooltip-ca-nstab-main": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aನà³\81 ತೂಲೆ",
+       "tooltip-t-upload": "ಫೈಲನ್ ಅಪ್ಲೋಡ್ ಮಲ್ಪುಲೆ",
+       "tooltip-t-specialpages": "ಪà³\82ರ à²ªà³\81à²\9fà³\8aಲà³\86ನ à²µà²¿à²¸à³\87ಸà³\8a ಪಟ್ಟಿ",
+       "tooltip-t-print": "à²\88 à²ªà³\81à²\9fà³\8aದ à²®à³\81ದà³\8dರಣà³\8a à²®à²²à³\8dಪà³\81ನ ಆವೃತ್ತಿ",
+       "tooltip-t-permalink": "ಪà³\81à²\9fà³\8aದ à²\88 à²\86ವà³\83ತà³\8dತಿà²\97à³\8d à²¸à²¾à²¸à²¿à²¤à³\8a à²\95à³\8aà²\82ಡಿ",
+       "tooltip-ca-nstab-main": "ಮಾಹಿತಿ à²ªà³\81à²\9fà³\8aನà³\8d ತೂಲೆ",
        "tooltip-ca-nstab-user": "ಸದಸ್ಯೆರ್ನ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-special": "à²\89à²\82ದà³\8aà²\82à²\9cಿ à²µà²¿à²¶à³\87ಷ à²ªà³\81à²\9f, à²\87à²\82ದà³\86ನà³\8d à²\88ರà³\8d à²\8eಡಿà²\9fà³\8d à²®à²²à³\8dಪೆರೆ ಆಪುಜಿ",
-       "tooltip-ca-nstab-project": "ಪà³\8dರà³\8aà²\9cà³\86à²\95à³\8dà²\9fà³\8d ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-image": "ಫà³\88ಲà³\8dâ\80\99ದ ಪುಟೊನು ತೂಲೆ",
-       "tooltip-ca-nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\87à²\9fà³\8dâ\80\99ನ್ ತೂಲೆ",
+       "tooltip-ca-nstab-special": "à²\89à²\82ದà³\8aà²\82à²\9cಿ à²µà²¿à²¸à³\87ಸ à²ªà³\81à²\9fà³\8a, à²\87à²\82ದà³\86ನà³\8d à²\88ರà³\8d à²¸à²\82ಪà³\8aಲಿಪೆರೆ ಆಪುಜಿ",
+       "tooltip-ca-nstab-project": "ಮಾಹಿತಿ ಪುಟೊನು ತೂಲೆ",
+       "tooltip-ca-nstab-image": "ಫà³\88ಲà³\8dâ\80\8dದ ಪುಟೊನು ತೂಲೆ",
+       "tooltip-ca-nstab-template": "à²\9fà³\86à²\82ಪà³\8dಲà³\87à²\9fà³\8dâ\80\8dನ್ ತೂಲೆ",
        "tooltip-ca-nstab-category": "ವರ್ಗೊದ ಪುಟೊನು ತೂಲೆ",
        "tooltip-minoredit": "ಇಂದೆನ್ ಎಲ್ಯ ಬದಲಾವಣೆ ಪಂಡ್ದ್ ಗುರ್ತ ಮಲ್ಪುಲೆ",
-       "tooltip-save": "à²\88ರà³\8d à²®à²²à³\8dತà³\8dâ\80\99ದಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²\92ರಿಪà³\81ಲೆ",
-       "tooltip-preview": "ಈರ್ ಮಲ್ತಿನ ಬದಲಾವಣೆತ ಮುನ್ನೋಟ - ಈ ಪುಟನ್ ಒರಿಪಾವುನ ದು೦ಬು ನೇನ್ ತೂಲೆ",
-       "tooltip-diff": "à²\88 à²²à³\87à²\96ನà³\8aà²\97à³\8d à²®à²²à³\8dತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8aà²\9cà³\8dಪಾವ್",
+       "tooltip-save": "à²\88ರà³\8d à²®à²²à³\8dತà³\8dâ\80\8cನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²\92ರಿಪà³\8dಪಾಲೆ",
+       "tooltip-preview": "ಈರ್ ಮಲ್ತ‍್‌ನ ಬದಲಾವಣೆತ ಮುನ್ನೋಟ - ಈ ಪುಟನ್ ಒರಿಪಾವುನ ದು೦ಬು ಉಂದೆನ್ ತೂಲೆ",
+       "tooltip-diff": "à²\88 à²²à³\87à²\95ನà³\8aà²\97à³\8d à²®à²²à³\8dತಿನ à²¬à²¦à²²à²¾à²µà²£à³\86ಲà³\86ನà³\8d à²¤à³\8bà²\9cಾವ್",
        "tooltip-compareselectedversions": "ಈ ಪುಟತ ಆಯ್ಕೆ ಮಲ್ತಿನ ರಡ್ಡ್ ಆವೃತ್ತಿದ ವ್ಯತ್ಯಾಸನ್ ತೂಲೆ",
        "tooltip-watch": "ಈ ಪುಟನ್ ಈರ್ನ ತೂಪುನ ಪಟ್ಟಿಗ್ ಸೇರ್ಸಾಲೆ",
        "tooltip-recreate": "ಈ ಪುಟ ಇತ್ತೆ ಇಜ್ಜ೦ಡಲಾ ಐನ್ ಪಿರ ಮಲ್ಪ್",
        "tooltip-upload": "ಅಪ್ಲೋಡ್ ಸುರು ಮಲ್ಪು",
-       "tooltip-rollback": "\"Rollback\", ಈ ಪುಟದ ಕರಿನ ಬದಾಲವಣೆಗ್ ಒ೦ಜಿ ಕ್ಲಿಕ್ ಡ್ ಕೊನೊಪು೦ಡು",
-       "tooltip-undo": "\"Undo\" ಈ ಬದಲಾವಣೆನ್ ದೆತೊನುಜಿ ಬುಕ ಪ್ರಿವ್ಯೂ ಮೋಡ್ ಡ್ ಬದಲಾವಣೆ ಮಲ್ಪೆರ್ ಕೊನೊಪು೦ಡು. ಅ೦ಚೆನೆ ಸಮ್ಮರಿ ಡ್ ಬದಲಾವಣೆ ಗ್ ಕಾರಣ ಕೊರ್ರ್‍ಎ ಆಪು೦ಡು.",
-       "tooltip-summary": "ಒಂಜಿ ಎಲ್ಯ ಸಾರಾಂಶ ಕೊರ್ಲೆ",
-       "pageinfo-toolboxlink": "ಪುಟೊತ ಮಾಹಿತಿ",
-       "previousdiff": "← ದುಂಬುದ ಸಂಪಾದನೆ",
-       "nextdiff": "ಪೊಸ ಎಡಿಟ್ →",
-       "file-info-size": "$1 × $2 ಪಿಕ್ಸೆಲ್, ಫೈಲ್’ದ ಗಾತ್ರ: $3, MIME ಪ್ರಕಾರ: $4",
-       "file-nohires": "ಇಂದೆರ್ದ್ ಜಾಸ್ತಿ ವಿವರವಾಯಿನ ನೋಟ ಇಜ್ಜಿ.",
-       "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಪಿಕ್ಸೆಲ್, ಫೈಲ್’ದ ಗಾತ್ರ: $3",
-       "show-big-image": "ಮೂಲ ಕಡತ",
-       "show-big-image-size": "$1 × $2 ಪಿಕ್ಸೆಲ್‌ಸ್",
+       "tooltip-rollback": "ಅಕೇರಿದ ಸಂಪಾದಕೆರೆನ ಮಾಂತ ಸಂಪದನೆನ್ಲಾ ಮಾಜದ್ ಪಾಡುಂಡು",
+       "tooltip-undo": "\"ವಜಾ ಮಲ್ಪುಲೆ\" ಈ ಬದಲಾವಣೆನ್ ದೆತೊನುಜಿ ಬುಕ್ಕೊ ಪ್ರಿವ್ಯೂ ಮೋಡ್‍ಡ್ ಬದಲಾವಣೆ ಮಲ್ಪೆರ್ ಕೊನೊಪು೦ಡು. ಅ೦ಚೆನೆ ಸಾರಾಂಸೊಡು ಬದಲಾವಣೆಗ್ ಕಾರಣ ಸೇರಾಯರ ಆಪು೦ಡು.",
+       "tooltip-summary": "ಒಂಜಿ ಎಲ್ಯ ಸಾರಾಂಸೊ ಕೊರ್ಲೆ",
+       "simpleantispam-label": "ಯಾಂಟಿ-ಸ್ಪಾಮ್ ಚೆಕ್.\nಮುಲ್ಪ <strong>ದಿಂಜಾವೊಡ್ಚಿ</strong>",
+       "pageinfo-toolboxlink": "ಪುಟೊದ ಮಾಹಿತಿ",
+       "previousdiff": "← ದುಂಬುದ ಸಂಪದನೆ",
+       "nextdiff": "ಬುಕ್ಕೊದ ಸಂಪದನೆ →",
+       "file-info-size": "$1 × $2 ಚಿತ್ರಬಿಂದುಲು, ಫೈಲ್‍ದ ಗಾತ್ರೊ: $3, MIME ಪ್ರಕಾರೊ: $4",
+       "file-nohires": "ಇಂದೆರ್ದ್ ಜಾಸ್ತಿ ರೆಸಲ್ಯೂಶನ್ ಇದ್ದಿ,",
+       "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಚಿತ್ರೊಬಿಂದು, ಫೈಲ್‍ದ ಗಾತ್ರ: $3",
+       "show-big-image": "ಮೂಲೊ ಫೈಲ್",
+       "show-big-image-preview": "ಪಿರವುದ ಪುಟೊದ ಗಾತ್ರೊ: $1.",
+       "show-big-image-other": "ಬೇತೆ{{PLURAL:$2|resolution|ನಿರ್ನಯೊಲು}}: $1.",
+       "show-big-image-size": "$1 × $2 ಚಿತ್ರೊಬಿಂದುಲು",
        "bad_image_list": "ವ್ಯವಸ್ಥೆದ ಆಕಾರ ಈ ರೀತಿ ಉಂಡು:\n\nಪಟ್ಟಿಡುಪ್ಪುನಂಚಿನ ದಾಖಲೆಲೆನ್ (* ರ್ದ್ ಶುರು ಆಪುನ ಸಾಲ್’ಲು) ಮಾತ್ರ ಪರಿಗಣನೆಗ್ ದೆತೊನೆರಾಪುಂಡು.\nಪ್ರತಿ ಸಾಲ್’ದ ಶುರುತ ಲಿಂಕ್ ಒಂಜಿ ದೋಷ ಉಪ್ಪುನಂಚಿನ ಫೈಲ್’ಗ್ ಲಿಂಕಾದುಪ್ಪೊಡು.\nಅವ್ವೇ ಸಾಲ್’ದ ಶುರುತ ಪೂರಾ ಲಿಂಕ್’ಲೆನ್ ಪರಿಗನೆರ್ದ್ ದೆಪ್ಪೆರಾಪುಂಡು, ಪಂಡ ಓವು ಪುಟೊಲೆಡ್ ಫೈಲ್’ದ ಬಗ್ಗೆ ಬರ್ಪುಂಡೋ ಔಲು.",
-       "metadata": "ಮà³\87ಲà³\8dದರà³\8dà²\9cà³\86 à²®à²¾à²¹à²¿à²¤à²¿",
-       "metadata-help": "à²\88 à²«à³\88ಲà³\8dâ\80\99ಡà³\8d à²\9cಾಸà³\8dತಿ à²®à²¾à²¹à²¿à²¤à²¿ à²\89à²\82ಡà³\81. à²ªà³\8dರಾಯಶà²\83 à²«à³\88ಲà³\8dâ\80\99ನà³\8d à²\89à²\82ಡà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²\89ಪಯà³\8bà²\97 à²®à²²à³\8dತಿನ à²¡à²¿à²\9cಿà²\9fಲà³\8d à²\95à³\8dಯಾಮà³\86ರರà³\8dದà³\8d à²\85ತà³\8dತà³\8dâ\80\99ನà³\8dಡ à²¸à³\8dà²\95à³\8dಯಾನರà³\8d à²°à³\8dದà³\8d à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à³\88ದà³\8dâ\80\99ನà³\8dಡà³\8d.\nಮà³\82ಲಪà³\8dರತಿರà³\8dದà³\8d à²\88 à²«à³\88ಲà³\8d à²¬à²¦à²²à²¾à²¦à²¿à²¤à³\8dತà³\8dâ\80\99ನà³\8dಡ, à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¦à²²à²¾à²¤à²¿à²¨ à²«à³\88ಲà³\8dâ\80\99ದ ವಿವರೊಲೆಗ್ ಸರಿಯಾದ್ ಹೊಂದಂದೆ ಉಪ್ಪು.",
+       "metadata": "ಮà³\86à²\9fಾಡà³\87à²\9fಾ",
+       "metadata-help": "à²\88 à²ªà³\88ಲà³\8dâ\80\8dಡà³\8d à²\9cಾಸà³\8dತಿ à²®à²¾à²¹à²¿à²¤à²¿ à²\89à²\82ಡà³\81. à²¹à³\86à²\9aà³\8dà²\9aಿನà²\82ಸà³\8a à²ªà³\88ಲà³\8dâ\80\8dನà³\8d à²\89à²\82ಡà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²\89ಪಯà³\8bà²\97 à²®à²²à³\8dತಿನ à²¡à²¿à²\9cಿà²\9fಲà³\8d à²\95à³\8dಯಾಮà³\86ರರà³\8dದà³\8d à²\85ತà³\8dತà³\8dà²\82ಡ à²¸à³\8dà²\95à³\8dಯಾನರà³\8dâ\80\8cರà³\8dದà³\8d à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¤à³\8dತà³\8dà²\82ಡà³\8d.\nಮà³\82ಲಪà³\8dರತಿರà³\8dದà³\8d à²\88 à²ªà³\88ಲà³\8d à²¬à²¦à²²à²¾à²¦à²¿à²¤à³\8dತà³\8dà²\82ಡà³\8d, à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¦à²²à²¾à²¤à²¿à²¨ à²ªà³\88ಲà³\8dâ\80\8dದ ವಿವರೊಲೆಗ್ ಸರಿಯಾದ್ ಹೊಂದಂದೆ ಉಪ್ಪು.",
        "metadata-expand": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ತೊಜ್ಪಾವು",
        "metadata-collapse": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ದೆಂಗಾವು",
-       "metadata-fields": "ಈ ಸಂದೇಶೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮಿತ್ತ ದರ್ಜೆದ ಮಾಹಿತಿನ್ ಚಿತ್ರ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮಿತ್ತ ದರ್ಜೆ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲಸ್ಥಿತಿಟ್ ಅಗೋಚರವಾದುಪ್ಪುಂಡು.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude \n* gpsaltitude",
-       "exif-datetime": "ಕಡೊತೊನು ಬದಲಾವಣೆ ಮಲ್ತ್‍ನ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯೊ",
-       "exif-make": "ಕ್ಯಾಮೆರಾದ ತಯಾರೆಕೆರ್",
-       "exif-model": "ಕ್ಯಾಮೆರಾ ಮಾದರಿ",
-       "exif-software": "ಉಪಯೋಗ ಮಲ್ತಿನ ತಂತ್ರಾಂಶ",
+       "metadata-fields": "ಈ ಸಂದೇಸೊಡು ಪಟ್ಟಿ ಮಲ್ತಿನಂಚಿನ EXIF ಮಿತ್ತ ದರ್ಜೆದ ಮಾಹಿತಿನ್ ಚಿತ್ರೊ ಪುಟೊಕು ಸೇರ್ಪಾಯೆರೆ ಆವೊಂದುಂಡು. ಪುಟೊಟು ಮಿತ್ತ ದರ್ಜೆ ಮಾಹಿತಿದ ಪಟ್ಟಿನ್ ದೆಪ್ಪುನಗ ಉಂದು ತೋಜುಂಡು.\nಒರಿದನವು ಮೂಲೊ ಸ್ಥಿತಿಟ್ ಅಡೆಂಗ್‍ದುಂಡು.\n*ಮಲ್ಪುಲೆ\n*ಮಾದರಿ\n*ದಿನೊ ಪೊರ್ತು ಮೂಲೊ\n*ಮಾನಾದಿಗೆದ ಸಮಯೊ\n*ಫ್‍ಸಂಖ್ಯೆ\n*ಐಎಸ್ಒ ವೇಗೊದ ರೇಟಿಂಗ್\n*ತೂಪಿನ ಜಾಗೆದ ದೂರ\n*ಕಲಾವಿದೆ\n*ಕೃತಿಸ್ವಾಮ್ಯೊ\n*ಚಿತ್ರೊ ವಿವರಣೆ\n*ಜಿಪಿಎಸ್ ಅಕ್ಷಾಂಸೊ\n*ಜಿಪಿಎಸ್ ರೇಖಾಂಸೊ\n*ಜಿಪಿಎಸ್ ಎತ್ತರೊ",
+       "exif-orientation": "ದಿಕ್ಕ್ ದಿಸೆ",
+       "exif-xresolution": "ಅಡ್ಡಗಲೊದ ರೆಜ಼ಲ್ಯೂಶನ್",
+       "exif-yresolution": "ಉದ್ದೊದ ರೆಜ಼ಲ್ಯೂಶನ್",
+       "exif-datetime": "ಫೈಲ್‍ನ್ ಬದಲಾವಣೆ ಮಲ್ತ್‌ನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-make": "ಕ್ಯಾಮರೊದ ತಯಾರೆಕೆರ್",
+       "exif-model": "ಕ್ಯಾಮರೊದ ಮಾದರಿ",
+       "exif-software": "ಉಪಯೋಗೊ ಮಲ್ತಿನ ತಂತ್ರಾಂಸೊ",
        "exif-exifversion": "Exif ಆವೃತ್ತಿ",
-       "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸೃಷ್ಟಿಯಾಯಿನ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯ",
-       "exif-datetimedigitized": "ಗಣಕೀಕರಣದ ದಿನಾಂಕೊ ಬೊಕ್ಕ ಸಮಯೊ",
-       "exif-orientation-1": "ಸಾಧಾರಣ",
-       "namespacesall": "ಪೂರಾ",
-       "monthsall": "ಪೂರಾ",
+       "exif-colorspace": "ಬಣ್ಣೊದ ಜಾಗೆ",
+       "exif-datetimeoriginal": "ಮಾಹಿತಿ ಸ್ರಿಸ್ಟಿಸಯಿನ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-datetimedigitized": "ಗಣಕೀಕರಣೊದ ದಿನೊ ಬೊಕ್ಕ ಪೊರ್ತು",
+       "exif-orientation-1": "ಸಾದಾರನೊ",
+       "namespacesall": "ಮಾತ",
+       "monthsall": "ಮಾತ",
        "watchlisttools-view": "ಪ್ರಸ್ತುತ ಬದಲಾವಣೆಲ್ ತೋಜಾಲೆ",
        "watchlisttools-edit": "ವೀಕ್ಷಣಾಪಟ್ಟಿನ್ ತೂಲೆ ಬೊಕ್ಕ ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
-       "specialpages": "ವಿಷೇಶ ಪುಟೊಲು",
-       "tag-list-wrapper": "([[ವಿಸೇಸೊ:ಟ್ಯಾಗುಲು|{{ಬಹುವಚನೊ:$1|ಟ್ಯಾಗ್|ಟ್ಯಾಗುಲು}}]]:$2)",
-       "logentry-delete-delete": "$1 {{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}} ಪುಟ $3",
-       "logentry-newusers-create": "ಬಳಕೆದಾರ ಖಾತೆ $1 ನ್ನು {{GENDER:$2|ಸೃಷ್ಟಿ ಮಲ್ತ್‍ದುಂಡು}}",
-       "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‍ದೆರ್}} $3",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ಪಾತೆರ್ಲೆ]])",
+       "specialpages": "ವಿಸೇಸೊ ಪುಟೊಲು",
+       "tag-filter": "[[Special:Tags|ಟ್ಯಾಗ್]]ಅರಿಪೆ:",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|ಟ್ಯಾಗುಲು}}]]:$2)",
+       "logentry-delete-delete": "$1{{GENDER:$2|ಮಾಜಾದ್‍ಂಡ್}}ಪುಟೊ $3",
+       "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
+       "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
+       "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
        "searchsuggest-search": "ನಾಡ್‍ಲೆ"
 }
index c6d54cb..1f88168 100644 (file)
@@ -40,7 +40,7 @@
        "tog-watchdefault": "నేను మార్చే పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
        "tog-watchmoves": "నేను తరలించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
        "tog-watchdeletion": "నేను తొలగించిన పేజీలను మరియు దస్త్రాలను నా వీక్షణ జాబితాకు చేర్చు",
-       "tog-watchrollback": "నా à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95à°¿ à°¨à±\87à°¨à±\81 à°¤à°¿à°ªà±\8dపిà°\95à±\8aà°\9fà±\8dà°\9fà°¿à°¨ à°ªà±\87à°\9cà±\80లను జోడించు",
+       "tog-watchrollback": "à°¨à±\87à°¨à±\81 à°ªà±\81నసà±\8dà°¸à±\8dథాపిà°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80లనà±\81 à°¨à°¾ à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితాà°\95ు జోడించు",
        "tog-minordefault": "అప్రమేయంగా నా మార్పులను చిన్న మార్పులుగా గుర్తించు",
        "tog-previewontop": "వ్యాసం మార్పుల మునుచూపును ఎడిట్ పెట్టె పైన చూపు",
        "tog-previewonfirst": "మొదటి  దిద్దుబాటు చేసినపుడు వ్యాసపు మునుచూపు చూపించు",
        "about": "గురించి",
        "article": "విషయపు పేజీ",
        "newwindow": "(కొత్త కిటికీలో వస్తుంది)",
-       "cancel": "రద్దు",
+       "cancel": "రద్దుచేయి",
        "moredotdotdot": "ఇంకా...",
        "morenotlisted": "ఈ జాబితా సంపూర్ణం కాదు.",
        "mypage": "పుట",
        "mytalk": "చర్చ",
-       "anontalk": "à°\88 à°\90.పి.à°\95à°¿ à°¸à°\82à°¬à°\82ధిà°\82à°\9aà°¿à°¨ à°\9aà°°à±\8dà°\9a",
+       "anontalk": "చర్చ",
        "navigation": "మార్గదర్శకం",
        "and": "&#32;మరియు",
        "qbfind": "వెతుకు",
        "printableversion": "అచ్చుతీయదగ్గ కూర్పు",
        "permalink": "శాశ్వత లంకె",
        "print": "ముద్రించు",
-       "view": "à°\9aà±\82à°\9aà±\81à°\9f",
+       "view": "à°\9aà±\82à°ªà±\81",
        "view-foreign": "$1 లో చూడండి",
        "edit": "సవరించు",
        "edit-local": "ప్రాంతీయ వివరణని మార్చు",
        "jumptonavigation": "మార్గసూచీ",
        "jumptosearch": "వెతుకు",
        "view-pool-error": "క్షమించండి, ప్రస్తుతం సర్వర్లన్నీ ఓవర్‌లోడ్ అయిఉన్నాయి.\nచాలామంది వాడుకరులు ఈ పేజీని చూస్తున్నారు.\nఈ పేజీని వీక్షించడానికి కొద్దిసేపు నిరీక్షించండి.\n\n$1",
-       "generic-pool-error": "à°\95à±\8dషమిà°\82à°\9aà°\82à°¡à°¿, à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°¸à°°à±\8dవరà±\8dలనà±\8dà°¨à±\80 à°\93వరà±\8dâ\80\8cà°²à±\8bà°¡à±\8d à°\85యిà°\89à°¨à±\8dనాయి.\nà°\9aాలామà°\82ది à°µà°¾à°¡à±\81à°\95à°°à±\81à°²à±\81 à°¦à±\80నిని à°\9aà±\82à°¸à±\8dà°¤à±\81à°¨à±\8dనారà±\81.\nà°¦à±\80నిని à°µà±\80à°\95à±\8dà°·à°¿à°\82à°\9aడానిà°\95à°¿ à°\95à±\8aà°¦à±\8dదిసà±\87à°ªà±\81 à°¨à°¿à°°à±\80à°\95à±\8dà°·ించండి.",
+       "generic-pool-error": "à°\95à±\8dషమిà°\82à°\9aà°\82à°¡à°¿, à°ªà±\8dà°°à°¸à±\8dà°¤à±\81à°¤à°\82 à°¸à°°à±\8dవరà±\8dలనà±\8dà°¨à±\80 à°\93వరà±\8dâ\80\8cà°²à±\8bà°¡à±\8d à°\85యిà°\89à°¨à±\8dనాయి.\nà°\9aాలామà°\82ది à°µà°¾à°¡à±\81à°\95à°°à±\81à°²à±\81 à°¦à±\80నిని à°\9aà±\82à°¸à±\87 à°ªà±\8dరయతà±\8dà°¨à°\82 à°\9aà±\87à°¸à±\8dà°¤à±\81à°¨à±\8dనారà±\81.\nà°\95ాసà±\8dà°¸à±\87పాà°\97à°¿à°¨ à°¤à°°à±\81వాత à°®à±\80à°°à±\81 à°\88 à°ªà±\87à°\9cà±\80 à°\9aà±\82à°¸à±\87à°\82à°¦à±\81à°\95à±\81 à°ªà±\8dరయతà±\8dà°¨ించండి.",
        "pool-timeout": "తాళం కొరకు వేచివుండడానికి కాలపరిమితి అయిపోయింది",
        "pool-queuefull": "సమూహపు వరుస నిండుగా ఉంది",
        "pool-errorunknown": "తెలియని లోపం",
        "hidetoc": "దాచు",
        "collapsible-collapse": "కుదించు",
        "collapsible-expand": "విస్తరించు",
-       "confirmable-confirm": "{{GENDER:$1|à°®à±\80à°°à±\81}} à°\92à°ªà±\8dà°ªà±\81à°\95à±\81à°\82à°\9fున్నారా?",
+       "confirmable-confirm": "{{GENDER:$1|à°®à±\80à°°à±\81}} à°¨à°¿à°¶à±\8dà°\9aయిà°\82à°\9aà±\81à°\95ున్నారా?",
        "confirmable-yes": "అవును",
        "confirmable-no": "కాదు",
        "thisisdeleted": "$1ను చూస్తారా, పునఃస్థాపిస్తారా?",
        "nstab-template": "మూస",
        "nstab-help": "సహాయ పేజీ",
        "nstab-category": "వర్గం",
+       "mainpage-nstab": "మొదటి పేజీ",
        "nosuchaction": "అటువంటి కార్యం లేదు",
        "nosuchactiontext": "మీరు URLలో పేర్కొన్న కార్యం సరైనది కాదు.\nమీరు URLని తప్పుగా టైపు చేసివుండవచ్చు లేదా తప్పుడు లింకుని అనుసరించివుండొచ్చు.\n{{SITENAME}} ఉపయోగించే మృదుపరికరంలో దోషమైనా అయివుండవచ్చు.",
        "nosuchspecialpage": "అటువంటి ప్రత్యేక పేజీ లేదు",
        "readonly_lag": "అనుచర (స్లేవ్) డేటాబేసు సర్వర్లు, ప్రధాన (మాస్టరు) సర్వరును అందుకునేందుకుగాను, డేటాబేసు ఆటోమాటిక్‌గా లాకు అయింది.",
        "internalerror": "అంతర్గత లోపం",
        "internalerror_info": "అంతర్గత లోపం: $1",
-       "internalerror-fatal-exception": "\"$1\" à°°à°\95à°\82 à°ªà±\8dరమాదà°\95à°°à°®à±\88à°¨ à°®à°¿à°¨à°¹à°¾à°¯à°¿à°\82à°ªు",
+       "internalerror-fatal-exception": "\"$1\" à°°à°\95à°\82 à°µà°¿à°¨à°¾à°¶à°\95à°° à°\8eà°\95à±\8dà°¸à±\86à°ªà±\8dà°·à°¨ు",
        "filecopyerror": "ఫైలు \"$1\" ను \"$2\" కు కాపీ చెయ్యలేకపోయాం.",
        "filerenameerror": "ఫైలు \"$1\" పేరును \"$2\"గా మార్చలేకపోయాం.",
        "filedeleteerror": "ఫైలు \"$1\"ని తొలగించలేకపోయాం.",
        "directorycreateerror": "\"$1\" అనే డైరెక్టరీని సృష్టించలేక పోయాం.",
-       "directoryreadonlyerror": "\"$1\" à°¸à°\82à°\9aà°¯à°\82 à°®à°¾à°°à±\8dà°\9aà°\9fà°\82 à°µà±\80à°²à±\81పడని స్థితిలో ఉంది.",
-       "directorynotreadableerror": "\"$1\" à°¸à°\82à°\9aà°¯à°\82 à°µà±\80à°\95à±\8dà°·à°£à°\95à±\81 à°\85à°\82à°¦à±\81బాà°\9fà±\81à°²à±\8b లేదు.",
+       "directoryreadonlyerror": "\"$1\" à°¡à±\88à°°à±\86à°\95à±\8dà°\9fà°°à±\80 à°°à±\80à°¡à±\8d-à°\93à°¨à±\8dà°²à±\80 స్థితిలో ఉంది.",
+       "directorynotreadableerror": "\"$1\" à°¡à±\88à°°à±\86à°\95à±\8dà°\9fà°°à±\80ని à°\9aà±\82à°¸à±\87 à°µà±\80à°²à±\81 లేదు.",
        "filenotfound": "ఫైలు \"$1\" కనబడలేదు.",
        "unexpected": "అనుకోని విలువ: \"$1\"=\"$2\".",
        "formerror": "లోపం: ఈ ఫారాన్ని పంపించలేకపోయాం.",
        "title-invalid-empty": "కోరబడిన పేజీ శీర్షిక ఖాళీగా ఉంది లేదా కేవలం పేరుబరి పేరు కలిగి ఉంది.",
        "title-invalid-utf8": "కోరబడిన పేజీ శీర్షికలో చెల్లని UTF-8 అక్షరాలున్నాయి.",
        "title-invalid-interwiki": "శీర్షిక పాఠ్యంలో అంతరవికీ లంకె ఉంది",
-       "title-invalid-talk-namespace": "à°\95à±\8bరబడిన à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95à°\95à±\81 à°¸à°\82à°¬à°\82ధిà°\82à°\9aà°¿à°¨ à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà°²à±\87à°®à±\81.",
+       "title-invalid-talk-namespace": "à°®à±\80à°°à°¡à°¿à°\97à°¿à°¨ à°ªà±\87à°\9cà±\80 à°¶à±\80à°°à±\8dà°·à°¿à°\95 à°\85సలà±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà±\87 à°µà±\80à°²à±\87 à°²à±\87ని à°\9aà°°à±\8dà°\9aà°¾ à°ªà±\87à°\9cà±\80à°\95à°¿ à°\9aà±\86à°\82దినది.",
        "title-invalid-characters": "కోరబడిన పేజీ శీర్షికలో చెల్లని అక్షరాలున్నాయి : \"$1\".",
        "title-invalid-relative": "శీర్షికలో లంకె పాఠ్యం సాపేక్షంగా ఉంది - పూర్తిగా లేదు. సాపేక్ష పేజీ చిరునామాలు (./, ../) గల పేజీ శీర్షికలు ఎక్కువశాతం అందుబాటులో ఉండవు కనుక అవి చెల్లవు.",
        "title-invalid-magic-tilde": "కోరబడిన పేజీ శీర్షిక పాఠ్యం లో చెల్లని మ్యాజిక్ టిల్డా పదాలున్నాయి (<nowiki>~~~</nowiki>).",
        "createaccountreason": "కారణం:",
        "createacct-reason": "కారణం",
        "createacct-reason-ph": "మీరు మరో ఖాతాను ఎందుకు సృష్టించుకుంటున్నారు",
-       "createacct-captcha": "భద్రతా తనిఖీ",
-       "createacct-imgcaptcha-ph": "పైన కనబడే మాటలను ఇక్కడ ఇవ్వండి",
        "createacct-submit": "మీ ఖాతాను సృష్టించుకోండి",
-       "createacct-another-submit": "మరà±\8aà°\95 à°\96ాతానà±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aà±\81",
+       "createacct-another-submit": "ఖాతాను సృష్టించు",
        "createacct-benefit-heading": "{{SITENAME}}ను తయారుచేస్తున్నది మీలాంటి వారే.",
        "createacct-benefit-body1": "{{PLURAL:$1|మార్పు|మార్పులు}}",
        "createacct-benefit-body2": "{{PLURAL:$1|పేజీ|పేజీలు}}",
        "passwordreset-emailtext-ip": "ఎవరో (బహుశా మీరే, ఐపీ అడ్రసు $1 నుంచి)  {{SITENAME}} ($4) లో మీ సంకేతపదాన్ని మార్చమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}\nఈ ఈమెయిలు చిరునామాతో అనుసంధింపబడి ఉన్నాయి:\n\n$2\n\n{{PLURAL:$3|ఈ సంకేతపదానికి|ఈ సంకేతపదాలకు}} {{PLURAL:$5|ఒక్కరోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.\nఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.",
        "passwordreset-emailtext-user": "{{SITENAME}} లోని వాడుకరి $1, {{SITENAME}} ($4) లోని మీ సంకేతపదాన్ని మార్చమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}\nఈ ఈమెయిలు అడ్రసుతో అనుసంధింపబడి ఉన్నాయి:\n\n$2\n\n{{PLURAL:$3|ఈ తాత్కాలిక సంకేతపదానికి|ఈ తాత్కాలిక సంకేతపదాలకు}} {{PLURAL:$5|ఒక్క రోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.\nఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.",
        "passwordreset-emailelement": "వాడుకరిపేరు: \n$1\n\nతాత్కాలిక సంకేతపదం: \n$2",
-       "passwordreset-emailsent": "సంకేతపదం మార్పు ఈమెయిలును పంపించాం.",
+       "passwordreset-emailsentemail": "సంకేతపదం మార్పు ఈమెయిలును పంపించాం.",
        "passwordreset-emailsent-capture": "క్రింద చూపిన సంకేతపదం మార్పు ఈమెయిలును పంపించాం.",
        "passwordreset-emailerror-capture": "కింద చూపిన సంకేతపదం మార్పు ఈమెయిలును తయారుచేసాం. కానీ దాన్ని {{GENDER:$2|వాడుకరికి}} పంపడం విఫలమైంది: $1",
        "changeemail": "ఈ-మెయిలు చిరునామా మార్పు",
-       "changeemail-text": "మీ ఈమెయిలు చిరునామాని మార్చుకోడానికి ఈ ఫారాన్ని నింపండి. ఈ మార్పుని నిర్ధారించడానికి మీ సంకేతపదాన్ని ఇవ్వాల్సివస్తుంది.",
+       "changeemail-header": "ఖాతా ఈ-మెయిల్ చిరునామాని మార్చండి",
        "changeemail-no-info": "ఈ పేజీని నేరుగా చూడటానికి మీరు లాగినయి వుండాలి.",
        "changeemail-oldemail": "ప్రస్తుత ఈ-మెయిలు చిరునామా:",
        "changeemail-newemail": "కొత్త ఈ-మెయిలు చిరునామా:",
        "sig_tip": "సమయంతో సహా మీ సంతకం",
        "hr_tip": "అడ్డగీత (అరుదుగా వాడండి)",
        "summary": "సారాంశం:",
-       "subject": "విషయం/శీర్షిక:",
+       "subject": "విషయం:",
        "minoredit": "ఇది ఒక చిన్న మార్పు",
        "watchthis": "ఈ పుట మీద కన్నేసి ఉంచు",
        "savearticle": "పేజీని భద్రపరచు",
        "missingcommenttext": "కింద ఓ వ్యాఖ్య రాయండి.",
        "missingcommentheader": "<strong>గుర్తు చేస్తున్నాం:</strong> ఈ వ్యాఖ్యకు మీరు విషయం/శీర్షిక పెట్టలేదు.\n\"{{int:savearticle}}\"ని మళ్ళీ నొక్కితే, అది లేకుండానే మీ మార్పును భద్రపరుస్తాం.",
        "summary-preview": "సారాంశం మునుజూపు:",
-       "subject-preview": "విషయà°\82/à°¶à±\80à°°à±\8dà°·à°¿à°\95 మునుజూపు:",
+       "subject-preview": "విషయపà±\81 మునుజూపు:",
        "previewerrortext": "మీ మార్పులు మునుజూపు చూడటంలో తప్పిదమయింది.",
        "blockedtitle": "వాడుకరి నిరోధించబడ్డారు",
        "blockedtext": "<strong>మీ వాడుకరి పేరు లేదా ఐ.పీ. చిరునామా నిరోధించబడింది.</strong>\n\nనిరోధించినది $1.\nఅందుకు ఇచ్చిన కారణం: <em>$2</em>.\n\n* నిరోధం మొదలైన సమయం: $8\n* నిరోధించిన కాలం: $6\n* నిరోధానికి గురైనవారు: $7\n\nఈ నిరోధంపై చర్చించేందుకు మీరు $1 ను గాని, మరెవరైనా [[{{MediaWiki:Grouppage-sysop}}|నిర్వాహకులను]] గాని సంప్రదించవచ్చు.\nమీ [[Special:Preferences|ఖాతా అభిరుచులలో]] సరైన ఈ-మెయిలు చిరునామా ఇచ్చివుండకపోయినా లేదా మిమ్మల్ని  'ఈ వాడుకరికి ఈ-మెయిలు పంపు' సౌలభ్యాన్ని వాడుకోవడం నుండి నిరోధించివున్నా మీరు ఈమెయిలు ద్వారా సంప్రదించలేరు.\nమీ ప్రస్తుత ఐ.పీ. చిరునామా $3, మరియు నిరోధపు ID #$5.\nమీ సంప్రదింపులన్నిటిలోనూ వీటిని పేర్కొనండి.",
        "columns": "నిలువు వరుసలు:",
        "searchresultshead": "వెతుకు",
        "stub-threshold": "<a href=\"#\" class=\"stub\">మొలక లింకు</a> ఫార్మాటింగు కొరకు హద్దు (బైట్లు):",
+       "stub-threshold-sample-link": "నమూనా",
        "stub-threshold-disabled": "అచేతనం",
        "recentchangesdays": "ఇటీవలి మార్పులు లో చూపించవలసిన రోజులు:",
        "recentchangesdays-max": "గరిష్ఠంగా $1 {{PLURAL:$1|రోజు|రోజులు}}",
        "prefs-diffs": "తేడాలు",
        "prefs-help-prefershttps": "ఈ అభిరుచి మీరు పైసారి లాగినైనపుడు అమలౌతుంది.",
        "prefs-tabs-navigation-hint": "చిట్కా: ట్యాబుల జాబితాలో ఓ ట్యాబు నుండి మరోదానికి వెళ్ళేందుకు కుడి ఎడమ బాణాల కీలను వాడవచ్చు.",
-       "email-address-validity-valid": "ఈ-మెయిలు చిరునామా సరిగానే ఉన్నట్టుంది",
-       "email-address-validity-invalid": "దయచేసి సరైన ఈమెయిలు చిరునామాని ఇవ్వండి",
        "userrights": "వాడుకరి హక్కుల నిర్వహణ",
        "userrights-lookup-user": "వాడుకరి సమూహాలను నిర్వహించండి",
        "userrights-user-editname": "వాడుకరిపేరును ఇవ్వండి:",
        "recentchanges-label-plusminus": "ఈ పేజి పరిమాణంలో  జరిగిన మార్పుల  బైట్ల సంఖ్య",
        "recentchanges-legend-heading": "'''సూచిక :'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|కొత్త పేజీల జాబితా]]ను కూడా చూడండి)",
+       "recentchanges-submit": "చూపించు",
        "rcnotefrom": "<strong>$2</strong> నుండి జరిగిన మార్పులు (<strong>$1</strong> వరకు) కింద చూపబడ్డాయి.",
        "rclistfrom": "$3, $2 కు ముందు  జరిగిన మార్పులను చూపించు",
        "rcshowhideminor": "చిన్న మార్పులను $1",
        "rcshowhidemine": "నా మార్పులను $1",
        "rcshowhidemine-show": "చూపించు",
        "rcshowhidemine-hide": "దాచు",
+       "rcshowhidecategorization-show": "చూపించు",
+       "rcshowhidecategorization-hide": "దాచు",
        "rclinks": "గత  $2 రోజుల లోని చివరి $1 మార్పులను చూపించు <br />$3",
        "diff": "తేడాలు",
        "hist": "చరిత్ర",
        "upload-too-many-redirects": "ఆ URLలో చాలా దారిమార్పులు ఉన్నాయి",
        "upload-http-error": "ఒక HTTP పొరపాటు జరిగింది: $1",
        "upload-copy-upload-invalid-domain": "ఈ డొమెయిన్ నుంచి కాపీ ఎక్కింపులు కుదరదు.",
+       "upload-dialog-button-cancel": "రద్దుచేయి",
+       "upload-dialog-button-done": "పూర్తయ్యింది",
+       "upload-dialog-button-save": "భద్రపరచు",
+       "upload-dialog-button-upload": "ఎక్కించు",
+       "upload-form-label-infoform-title": "వివరాలు",
+       "upload-form-label-infoform-name": "పేరు",
+       "upload-form-label-infoform-description": "వివరణ",
+       "upload-form-label-usage-title": "వాడుక",
+       "upload-form-label-usage-filename": "దస్త్రపు పేరు",
+       "foreign-structured-upload-form-label-own-work": "ఇది నా స్వంత కృతి",
+       "foreign-structured-upload-form-label-infoform-categories": "వర్గాలు",
+       "foreign-structured-upload-form-label-infoform-date": "తేదీ",
        "backend-fail-stream": "\"$1\" ఫైలును స్ట్రీమింగు చెయ్యలేకపోయాం.",
        "backend-fail-backup": "\"$1\" ఫైలును బ్యాకప్పు చెయ్యలేకపోయాం.",
        "backend-fail-notexists": "$1 ఫైలు అసలు లేనేలేదు.",
        "mostrevisions": "అధిక సంచికలు గల వ్యాసాలు",
        "prefixindex": "ఉపసర్గతో అన్ని పేజీలు",
        "prefixindex-namespace": "ఉపసర్గతో ఉన్న పేజీలు ($1 పేరుబరి)",
+       "prefixindex-submit": "చూపించు",
        "prefixindex-strip": "జాబితాలో ఆదిపదాన్ని తీసివేయి",
        "shortpages": "చిన్న పేజీలు",
        "longpages": "పొడవు పేజీలు",
        "usereditcount": "$1 {{PLURAL:$1|మార్పు|మార్పులు}}",
        "usercreated": "$1 న $2కి {{GENDER:$3|చేరారు}}",
        "newpages": "కొత్త పేజీలు",
+       "newpages-submit": "చూపించు",
        "newpages-username": "వాడుకరి పేరు:",
        "ancientpages": "పాత పేజీలు",
        "move": "తరలించు",
        "specialloguserlabel": "కర్త:",
        "speciallogtitlelabel": "లక్ష్యం (శీర్షిక లేదా వాడుకరి):",
        "log": "చిట్టాలు",
+       "logeventslist-submit": "చూపించు",
        "all-logs-page": "అన్ని బహిరంగ చిట్టాలు",
        "alllogstext": "{{SITENAME}}  యొక్క అందుబాటులో ఉన్న అన్ని చిట్టాల యొక్క సంయుక్త ప్రదర్శన.\nఒక చిట్టా రకాన్ని గానీ, ఒక వాడుకరి పేరు గానీ (case-sensitive), లేదా ప్రభావిత  పుటని (ఇది కూడా case-sensitive) గానీ ఎంచుకుని సంబంధిత చిట్టాను మాత్రమే చూడవచ్చు.",
        "logempty": "సరిపోలిన అంశాలేమీ చిట్టాలో లేవు.",
        "cachedspecial-viewing-cached-ts": "ఈ పేజీ యొక్క కాషె కూర్పును చూస్తున్నారు. ఇది పూర్తిగా వాస్తవమైన కూర్పు కాకపోవచ్చు.",
        "cachedspecial-refresh-now": "సరికొత్త కూర్పును చూడండి.",
        "categories": "వర్గాలు",
+       "categories-submit": "చూపించు",
        "categoriespagetext": "ఈ క్రింది {{PLURAL:$1|వర్గం పేజీలను లేదా మాధ్యమాలను కలిగివుంది|వర్గాలు పేజీలను లేదా మాధ్యమాలను కలిగివున్నాయి}}.\n[[Special:UnusedCategories|వాడుకలో లేని వర్గాలని]] ఇక్కడ చూపించట్లేదు.\n[[Special:WantedCategories|కోరుతున్న వర్గాలను]] కూడా చూడండి.",
        "categoriesfrom": "ఇక్కడనుండి మొదలుకొని వర్గాలు చూపించు:",
        "special-categories-sort-count": "సంఖ్యల ప్రకారం క్రమపరచు",
        "wlheader-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు <strong>బొద్దు</strong>గా చూపించబడ్డాయి.",
        "wlnote": "$3 నాడు $4 సమయానికి, గడచిన {{PLURAL:$2|గంటలో|'''$2''' గంటలలో}} జరిగిన {{PLURAL:$1|ఒక్క మార్పు కింద ఉంది|'''$1''' మార్పులు కింద ఉన్నాయి}}.",
        "wlshowlast": "గత $1 గంటల $2 రోజులకు చూపించు",
+       "watchlistall2": "అన్నీ",
+       "watchlist-hide": "దాచు",
+       "watchlist-submit": "చూపించు",
+       "wlshowtime": "చూపించాల్సిన కాలం:",
+       "wlshowhideminor": "చిన్న మార్పులు",
+       "wlshowhideliu": "నమోదైన వాడుకరులు",
+       "wlshowhideanons": "అజ్ఞాత వాడుకరులు",
+       "wlshowhidemine": "నా మార్పులు",
        "watchlist-options": "వీక్షణ జాబితా ఎంపికలు",
        "watching": "గమనిస్తున్నారు...",
        "unwatching": "గమనించడం లేదు...",
        "delete-confirm": "\"$1\"ని తొలగించు",
        "delete-legend": "తొలగించు",
        "historywarning": "<strong>హెచ్చరిక:</strong> మీరు తొలగించబోయే పేజీకి $1 {{PLURAL:$1|కూర్పు|కూర్పుల}} చరిత్ర ఉంది:",
+       "historyaction-submit": "చూపించు",
        "confirmdeletetext": "మీరో పేజీనో, బొమ్మనో దాని చరిత్రతోపాటుగా శాశ్వతంగా డేటాబేసు నుండి తీసెయ్యబోతున్నారు. మీరు చెయ్యదలచింది ఇదేననీ, దీని పర్యవసానాలు మీకు తెలుసనీ, దీన్ని [[{{MediaWiki:Policy-url}}|నిభందనల]] ప్రకారమే చేస్తున్నారనీ నిర్ధారించుకోండి.",
        "actioncomplete": "పని పూర్తయింది",
        "actionfailed": "చర్య విఫలమైంది",
        "rollback-success": "$1 చేసిన దిద్దుబాట్లను వెనక్కు తీసుకెళ్ళాం; తిరిగి $2 చేసిన చివరి కూర్పుకు మార్చాం.",
        "sessionfailure-title": "సెషను వైఫల్యం",
        "sessionfailure": "మీ ప్రవేశపు సెషనుతో ఏదో సమస్య ఉన్నట్లుంది;\nసెషను హైజాకు కాకుండా ఈ చర్యను రద్దు చేసాం.\n\"back\" కొట్టి, ఎక్కడి నుండి వచ్చారో ఆ పేజీని మళ్ళీ లోడు చేసి, తిరిగి ప్రయత్నించండి.",
+       "changecontentmodel-reason-label": "కారణం:",
        "protectlogpage": "సంరక్షణల చిట్టా",
        "protectlogtext": "ఈ క్రింద ఉన్నది పేజీల సంరక్షణలకు జరిగిన మార్పుల జాబితా.\nప్రస్తుతం అమలులో ఉన్న సంరక్షణలకై [[Special:ProtectedPages|సంరక్షిత పేజీల జాబితా]]ను చూడండి.",
        "protectedarticle": "\"[[$1]]\" సంరక్షించబడింది.",
        "whatlinkshere-hidelinks": "లింకులను $1",
        "whatlinkshere-hideimages": "$1 దస్త్రాల లంకెలు",
        "whatlinkshere-filters": "వడపోతలు",
+       "whatlinkshere-submit": "వెళ్ళు",
        "autoblockid": "tanaDDu #$1",
        "block": "వాడుకరి నిరోధం",
        "unblock": "వాడుకరిపై నిరోధాన్ని తీసెయ్యండి",
        "cant-move-to-user-page": "మీకు ఒక పేజీని వాడుకరి పేజీగా (వాడుకరి ఉపపేజీగా తప్ప) తరలించే అనుమతి లేదు.",
        "cant-move-category-page": "వర్గాల పేజీలను తరలించే అనుమతి మీకు లేదు.",
        "cant-move-to-category-page": "పేజీలను వర్గాల పేజీలుగా మార్చే అనుమతి మీకు లేదు.",
-       "newtitle": "à°\95à±\8aà°¤à±\8dà°¤ à°ªà±\87à°°à±\81à°\95à°¿",
+       "newtitle": "à°\95à±\8aà°¤à±\8dà°¤ à°¶à±\80à°°à±\8dà°·à°¿à°\95:",
        "move-watch": "ఈ పేజీని గమనించు",
        "movepagebtn": "పేజీని తరలించు",
        "pagemovedsub": "తరలింపు విజయవంతమైనది",
        "movenosubpage": "ఈ పేజీకి ఉపపేజీలు ఏమీ లేవు.",
        "movereason": "కారణం:",
        "revertmove": "వెనక్కు తిప్పు",
-       "delete_and_move": "తొలగించి, తరలించు",
        "delete_and_move_text": "==తొలగింపు అవసరం==\n\nఉద్దేశించిన వ్యాసం \"[[:$1]]\" ఇప్పటికే ఉనికిలో ఉంది. ప్రస్తుత తరలింపుకు వీలుగా దాన్ని తొలగించేయమంటారా?",
        "delete_and_move_confirm": "అవును, పేజీని తొలగించు",
        "delete_and_move_reason": "\"[[$1]]\"ను తరలించడానికి వీలుగా తొలగించారు",
        "tooltip-pt-logout": "లాగౌటవండి",
        "tooltip-pt-createaccount": "మీరొక ఖాతాని సృష్టించుకొని ప్రవేశించటాన్ని సమర్ధిస్తున్నాము; కానీ, అది అవసరం కాదు, ఐచ్ఛికం మాత్రమే.",
        "tooltip-ca-talk": "విషయపు పేజీ గురించి చర్చ",
-       "tooltip-ca-edit": "à°\88 à°ªà±\87à°\9cà±\80ని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dదవà°\9aà±\8dà°\9aà±\81. à°­à°¦à±\8dరపరà°\9aà±\87 à°®à±\81à°\82à°¦à±\81 à°®à±\81à°¨à±\81à°\9cà±\82à°ªà±\81 à°¬à±\8aà°¤à±\8dతానà±\8dని à°µà°¾à°¡à°\82à°¡à°¿.",
+       "tooltip-ca-edit": "à°\88 à°ªà±\87à°\9cà±\80ని à°¸à°µà°°à°¿à°\82à°\9aà°\82à°¡à°¿",
        "tooltip-ca-addsection": "కొత్త విభాగాన్ని మొదలుపెట్టండి",
        "tooltip-ca-viewsource": "ఈ పుటని సంరక్షించారు. మీరు దీని మూలాన్ని చూడవచ్చు",
        "tooltip-ca-history": "ఈ పేజీ యొక్క వెనుకటి కూర్పులు",
        "tooltip-ca-nstab-main": "విషయపు పేజీని చూడండి",
        "tooltip-ca-nstab-user": "వాడుకరి పేజీని చూడండి",
        "tooltip-ca-nstab-media": "మీడియా పేజీని చూడండి",
-       "tooltip-ca-nstab-special": "à°\87ది à°\92à°\95 à°ªà±\8dà°°à°¤à±\8dà°¯à±\87à°\95 à°ªà±\81à°\9f, దీన్ని మీరు సరిదిద్దలేరు",
+       "tooltip-ca-nstab-special": "à°\87ది à°\92à°\95 à°ªà±\8dà°°à°¤à±\8dà°¯à±\87à°\95 à°ªà±\87à°\9cà±\80, దీన్ని మీరు సరిదిద్దలేరు",
        "tooltip-ca-nstab-project": "ప్రాజెక్టు పేజీని చూడండి",
        "tooltip-ca-nstab-image": "ఫైలు పేజీని చూడండి",
        "tooltip-ca-nstab-mediawiki": "వ్యవస్థా సందేశం చూడండి",
        "spam_reverting": "$1 కు లింకులు లేని గత కూర్పుకు తిరిగి తీసుకెళ్తున్నాం",
        "spam_blanking": "$1 కు లింకులు ఉన్న కూర్పులన్నిటినీ ఖాళీ చేస్తున్నాం",
        "spam_deleting": "$1 కు లింకులున్న కూర్పులను తొలగిస్తున్నాం",
-       "simpleantispam-label": "యాà°\82à°\9fà±\80 à°¸à±\8dపామà±\8d à°ªà°°à±\80à°\95à±\8dà°·.\nà°¦à±\80à°¨à±\8dని <strong>à°ªà±\82à°°à°¿à°\82à°\9aకండి</strong>!",
+       "simpleantispam-label": "యాà°\82à°\9fà±\80 à°¸à±\8dపామà±\8d à°ªà°°à±\80à°\95à±\8dà°·.\nà°¦à±\80à°¨à±\8dని <strong>నిà°\82à°ªకండి</strong>!",
        "pageinfo-title": "\"$1\" గురించి సమాచారం",
        "pageinfo-not-current": "పాత కూర్పులకు సంబంధించి ఈ సమాచారాన్ని ఇవ్వడం అసాధ్యం, సారీ.",
        "pageinfo-header-basic": "ప్రాథమిక సమాచారం",
        "exif-compression-1": "కుదించని",
        "exif-copyrighted-true": "నకలుహక్కులుకలది",
        "exif-copyrighted-false": "కాపీహక్కుల స్థితి అమర్చలేదు",
+       "exif-photometricinterpretation-1": "నలుపు మరియు తెలుగు (నలుపుకి 0)",
        "exif-unknowndate": "అజ్ఞాత తేదీ",
        "exif-orientation-1": "సాధారణ",
        "exif-orientation-2": "క్షితిజ సమాంతరంగా తిరగేసాం",
        "special-characters-title-endash": "ఎన్ డాష్",
        "special-characters-title-emdash": "ఎమ్ డాష్",
        "special-characters-title-minus": "మైనస్ గుర్తు",
-       "mw-widgets-titleinput-description-new-page": "పేజీ ఉనికిలో లేదు"
+       "mw-widgets-dateinput-no-date": "ఏ తేదీనీ ఎంచుకోలేదు",
+       "mw-widgets-titleinput-description-new-page": "పేజీ ఇంకా లేదు",
+       "api-error-blacklisted": "వేరే వివరమైన శీర్షకను ఎంచుకోండి"
 }
index 3ac1f1e..e5ddf98 100644 (file)
        "createaccountreason": "เหตุผล:",
        "createacct-reason": "เหตุผล",
        "createacct-reason-ph": "เหตุใดคุณจึงสร้างอีกบัญชี",
-       "createacct-captcha": "ตรวจสอบความปลอดภัย",
-       "createacct-imgcaptcha-ph": "กรอกข้อความที่คุณเห็นด้านบน",
        "createacct-submit": "สร้างบัญชีของคุณ",
        "createacct-another-submit": "สร้างบัญชี",
        "createacct-benefit-heading": "{{SITENAME}}สร้างจากคนเช่นคุณ",
        "sig_tip": "ลายเซ็นของคุณพร้อมตราเวลา",
        "hr_tip": "เส้นนอน (ใช้อย่างจำกัด)",
        "summary": "คำอธิบายอย่างย่อ:",
-       "subject": "เรื่อง/พาดหัว:",
+       "subject": "เรื่อง:",
        "minoredit": "เป็นการแก้ไขเล็กน้อย",
        "watchthis": "เฝ้าดูหน้านี้",
        "savearticle": "บันทึกหน้า",
        "missingsummary": "<strong>อย่าลืม:</strong> คุณยังไม่ได้ให้คำอธิบายการแก้ไข \nถ้าคุณคลิก \"{{int:savearticle}}\" อีก จะบันทึกการแก้ไขของคุณโดยไม่มีคำอธิบายการแก้ไข",
        "selfredirect": "<strong>คำเตือน:</strong> คุณกำลังสร้างการเปลี่ยนทางไปบทความเดียวกัน\nคุณอาจระบุเป้าหมายของการเปลี่ยนทางผิด หรือคถณอาจแก้ไขหน้าผิด \nหากคุณคลิก \"{{int:savearticle}}\" อีกครั้ง จะสร้างการเปลี่ยนทาง",
        "missingcommenttext": "กรุณากรอกความเห็นด้านล่าง",
-       "missingcommentheader": "<strong>อยà¹\88าลืม:</strong> à¸\84ุà¸\93ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\83สà¹\88หัวà¸\82à¹\89อ/à¸\9eาà¸\94หัวสำหรัà¸\9aà¸\84วามà¹\80หà¹\87à¸\99à¸\99ีà¹\89 \nà¸\96à¹\89าà¸\84ุà¸\93à¸\84ลิà¸\81 \"{{int:savearticle}}\" à¸­à¸µà¸\81 à¸\88ะà¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\82à¸\94ยà¹\84มà¹\88มีหัวà¸\82à¹\89อ/à¸\9eาà¸\94หัว",
+       "missingcommentheader": "<strong>อยà¹\88าลืม:</strong> à¸\84ุà¸\93ยัà¸\87à¹\84มà¹\88à¹\84à¸\94à¹\89à¹\83สà¹\88à¹\80รืà¹\88อà¸\87สำหรัà¸\9aà¸\84วามà¹\80หà¹\87à¸\99à¸\99ีà¹\89 \nà¸\96à¹\89าà¸\84ุà¸\93à¸\84ลิà¸\81 \"{{int:savearticle}}\" à¸­à¸µà¸\81 à¸\88ะà¸\9aัà¸\99à¸\97ึà¸\81à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\82อà¸\87à¸\84ุà¸\93à¹\82à¸\94ยà¹\84มà¹\88ระà¸\9aุà¹\80รืà¹\88อà¸\87",
        "summary-preview": "ตัวอย่างคำอธิบาย:",
-       "subject-preview": "ตัวอย่างเรื่อง/พาดหัว:",
+       "subject-preview": "ตัวอย่างเรื่อง:",
        "previewerrortext": "เกิดข้อผิดพลาดขณะกำลังพยายามดูตัวอย่างการเปลี่ยนแปลงของคุณ",
        "blockedtitle": "ผู้ใช้ถูกบล็อก",
        "blockedtext": "<strong>ชื่อผู้ใช้หรือเลขที่อยู่ไอพีของคุณถูกบล็อก</strong>\n\nการบล็อกนี้ดำเนินการโดย $1\nซึ่งให้เหตุผลว่า ''$2''\n\n* เริ่มการบล็อก: $8\n* หมดเขตการบล็อก: $6\n* ผู้ถูกบล็อกที่เจตนา: $7\n\nคุณสามารถติดต่อ $1 หรือ[[{{MediaWiki:Grouppage-sysop}}|ผู้ดูแลระบบ]]คนอื่นเพื่ออภิปรายการบล็อกนี้ได้\nคุณไม่สามารถใช้คุณลักษณะ \"ส่งอีเมลหาผู้ใช้รายนี้ได้\" จนกว่าจะระบุที่อยู่อีเมลให้ถูกต้องใน[[Special:Preferences|การตั้งค่าบัญชี]]ของคุณ และคุณมิได้ถูกห้ามใช้ความสามารถนี้\nเลขที่อยู่ไอพีปัจจุบันของคุณคือ $3 และหมายเลขการบล็อกคือ #$5 \nโปรดแสดงรายละเอียดข้างต้นทั้งหมดในการสอบถามใด ๆ",
        "prefs-help-recentchangescount": "นี่รวมถึงการปรับปรุงล่าสุด ประวิติหน้า และปูม",
        "prefs-help-watchlist-token2": "นี่คือแป้นลับสำหรับเข้าการป้อนเว็บรายการเฝ้าดูของคุณ\nใครก็ตามที่ทราบจะสามารถอ่านรายการเฝ้าดูของคุณได้ ฉะนั้นอย่าบอกผู้อื่น\n[[Special:ResetTokens|คลิกที่นี่หากคุณต้องการตั้งใหม่]]",
        "savedprefs": "บันทึกการตั้งค่าของคุณแล้ว",
+       "savedrights": "บันทึกสิทธิผู้ใช้ของ {{GENDER:$1|$1}} แล้ว",
        "timezonelegend": "เขตเวลา:",
        "localtime": "เวลาท้องถิ่น:",
        "timezoneuseserverdefault": "ใช้ค่าโดยปริยายของวิกิ ($1)",
        "rcshowhidemine": "$1การแก้ไขของฉัน",
        "rcshowhidemine-show": "แสดง",
        "rcshowhidemine-hide": "ซ่อน",
+       "rcshowhidecategorization-show": "แสดง",
+       "rcshowhidecategorization-hide": "ซ่อน",
        "rclinks": "แสดงการปรับปรุงล่าสุด $1 รายการ ในช่วง $2 วันที่ผ่านมา<br />$3",
        "diff": "ต่าง",
        "hist": "ประวัติ",
        "imagelinks": "การใช้ไฟล์",
        "linkstoimage": "$1 หน้าต่อไปนี้โยงมาไฟล์นี้:",
        "linkstoimage-more": "มีหน้าเชื่อมโยงมาไฟล์นี้กว่า $1 หน้า\nรายการต่อไปนี้แสดงการเชื่อมโยง $1 หน้าแรกที่มายังไฟล์นี้เท่านั้น\nมี[[Special:WhatLinksHere/$2|รายการเต็ม]]",
-       "nolinkstoimage": "à¹\84มà¹\88มีหà¸\99à¹\89าà¹\80à¸\8aืà¹\88อมà¹\82ยà¸\87มายัà¸\87à¹\84à¸\9fลà¹\8cà¸\99ีà¹\89",
+       "nolinkstoimage": "ไม่มีหน้าเชื่อมโยงมาไฟล์นี้",
        "morelinkstoimage": "ดู[[Special:WhatLinksHere/$1|การเชื่อมโยง]]มายังไฟล์นี้เพิ่มเติม",
        "linkstoimage-redirect": "$1 (ไฟล์เปลี่ยนทาง) $2",
        "duplicatesoffile": "$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่มเติม]]):",
        "emailccsubject": "คัดลอกสารของคุณไป $1: $2",
        "emailsent": "ส่งอีเมลแล้ว",
        "emailsenttext": "ส่งสารอีเมลของคุณแล้ว",
-       "emailuserfooter": "$1 à¸ªà¹\88à¸\87อีà¹\80มลà¸\96ึà¸\87 $2 à¸\94à¹\89วยà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99 \"อีà¹\80มลà¸\9cูà¹\89à¹\83à¸\8aà¹\89รายà¸\99ีà¹\89\" ที่ {{SITENAME}}",
+       "emailuserfooter": "$1 à¸ªà¹\88à¸\87อีà¹\80มลà¸\99ีà¹\89à¸\96ึà¸\87 $2 à¹\82à¸\94ยà¸\9fัà¸\87à¸\81à¹\8cà¸\8aัà¸\99 \"{{int:emailuser}}\" ที่ {{SITENAME}}",
        "usermessage-summary": "ฝากสารระบบ",
        "usermessage-editor": "ตัวส่งสารของระบบ",
        "watchlist": "รายการเฝ้าดู",
        "wlheader-showupdated": "หน้าที่มีการเปลี่ยนแปลงตั้งแต่คุณเยี่ยมครั้งสุดท้ายแสดงด้วย<strong>ตัวหนา</strong>",
        "wlnote": "ด้านล่างเป็น{{PLURAL:$1|การเปลี่ยนแปลงหลังสุด| <strong>$1</strong> การเปลี่ยนแปลงหลังสุด}} ใน{{PLURAL:$2|ชั่วโมง| <strong>$2</strong> ชั่วโมง}}ที่หลังสุด จนถึง $3, $4",
        "wlshowlast": "แสดง $1 ชั่วโมง $2 วันล่าสุด",
+       "watchlistall2": "ทั้งหมด",
+       "watchlist-hide": "ซ่อน",
+       "wlshowtime": "แสดงล่าสุด:",
+       "wlshowhideminor": "การแก้ไขเล็กน้อย",
+       "wlshowhidebots": "บอต",
+       "wlshowhideliu": "ผู้ใช้ลงทะเบียน",
+       "wlshowhideanons": "ผู้ใช้นิรนาม",
+       "wlshowhidepatr": "การแก้ไขที่ตรวจสอบแล้ว",
+       "wlshowhidemine": "การแก้ไขของฉัน",
        "watchlist-options": "ตัวเลือกรายการเฝ้าดู",
        "watching": "กำลังเฝ้าดู...",
        "unwatching": "กำลังเลิกเฝ้าดู...",
        "deletepage": "ลบหน้า",
        "confirm": "ยืนยัน",
        "excontent": "เนื้อหาเดิม: \"$1\"",
-       "excontentauthor": "เนื้อหาเดิม: \"$1\" (และมีผู้เขียนคนเดียวคือ \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "เนื้อหาเดิม: \"$1\" และมีผู้เขียนคนเดียวคือ \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|พูดคุย]])",
        "exbeforeblank": "เนื้อหาก่อนถูกทำว่างคือ: \"$1\"",
        "delete-confirm": "ลบ \"$1\"",
        "delete-legend": "ลบ",
        "undeletepagetext": "{{PLURAL:$1||$1 }}หน้าต่อไปนี้ถูกลบแล้ว แต่เนื้อหายังคงอยู่ในหน่วยเก็บถาวรและสามารถกู้คืนได้ \nหน่วยเก็บถาวรอาจถูกลบเป็นระยะ",
        "undelete-fieldset-title": "กู้คืนรุ่นปรับปรุง",
        "undeleteextrahelp": "ในการกู้ประวัติของหน้าคืนทั้งหมด ให้เว้นทุกกล่องและคลิก <strong><em>{{int:undeletebtn}}</em></strong>\nถ้าต้องการกู้ประวัติคืนเฉพาะบางส่วน ให้เลือกกล่องที่มีประวัติส่วนที่ต้องการและคลิก <strong><em>{{int:undeletebtn}}</em></strong>",
-       "undeleterevisions": "$1 à¸£à¸¸à¹\88à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81à¹\80à¸\81à¹\87à¸\9aà¸\96าวร",
+       "undeleterevisions": "$1 à¸£à¸¸à¹\88à¸\99à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¸\96ูà¸\81ลà¸\9a",
        "undeletehistory": "เมื่อคุณกู้หน้าคืน รุ่นทั้งหมดจะถูกกู้คืนไปยังประวัติ \nหากมีการสร้างหน้าใหม่ชื่อเดียวกันหลังการลบ รุ่นที่กู้คืนนั้นจะปรากฏในประวัติก่อนหน้า",
        "undeleterevdel": "จะไม่ดำเนินการกู้คืนหากส่งผลให้รุ่นบนสุดของหน้าหรือไฟล์ถูกลบบางส่วน\nในกรณีเช่นนั้น คุณต้องไม่เลือกหรือแสดงรุ่นที่ถูกลบใหม่สุด",
        "undeletehistorynoadmin": "หน้านี้ถูกลบแล้ว\nสาเหตุการลบแสดงในความย่อด้านล่าง ร่วมกับรายละเอียดผู้ใช้ที่เคยแก้ไขหน้านี้ก่อนลบ\nเฉพาะผู้ดูแลระบบที่ดูข้อความแท้จริงของรุ่นที่ถูกลบเหล่านี้ได้",
        "movenosubpage": "หน้านี้ไม่มีหน้าย่อย",
        "movereason": "เหตุผล:",
        "revertmove": "ย้อน",
-       "delete_and_move": "ลบและย้าย",
        "delete_and_move_text": "== ต้องการลบ ==\nมีหน้าปลายทาง \"[[:$1]]\" แล้ว \nคุณต้องการลบหน้าดังกล่าวเพื่อสร้างหนทางสำหรับการย้ายหรือไม่",
        "delete_and_move_confirm": "ใช่ ลบหน้านั้น",
        "delete_and_move_reason": "ถูกลบเพื่อสร้างหนทางสำหรับการย้ายจาก \"[[$1]]\"",
        "tooltip-pt-mytalk": "หน้าพูดคุยของคุณ",
        "tooltip-pt-anontalk": "อภิปรายเกี่ยวกับการแก้ไขจากเลขที่อยู่ไอพีนี้",
        "tooltip-pt-preferences": "การตั้งค่าของคุณ",
-       "tooltip-pt-watchlist": "รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\80à¸\9dà¹\89าà¸\94ูà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81ลà¸\9bง",
+       "tooltip-pt-watchlist": "รายà¸\81ารหà¸\99à¹\89าà¸\97ีà¹\88à¸\84ุà¸\93à¸\81ำลัà¸\87à¹\80à¸\9dà¹\89าà¸\94ูà¸\81ารà¹\80à¸\9bลีà¹\88ยà¸\99à¹\81à¸\9bลง",
        "tooltip-pt-mycontris": "รายการหน้าที่คุณเขียน",
        "tooltip-pt-login": "สนับสนุนให้คุณล็อกอิน แต่ไม่บังคับ",
        "tooltip-pt-logout": "ล็อกเอาต์",
index f7069e7..24b1699 100644 (file)
        "createaccountreason": "Dahilan:",
        "createacct-reason": "Dahilan",
        "createacct-reason-ph": "Bakit ka gagawa ng isa pang account?",
-       "createacct-captcha": "Siyasatin ang seguridad",
-       "createacct-imgcaptcha-ph": "Ilagay ang tekstong makikita sa itaas.",
        "createacct-submit": "Likhain ang iyong account",
        "createacct-another-submit": "Lumikha ng ibang account",
        "createacct-benefit-heading": "{{SITENAME}} ay nilikha ng mga taong iyong katulad.",
        "wrongpassword": "Mali ang ipinasok na password.\nPakisubok muli.",
        "wrongpasswordempty": "Walang laman ang ipinasok na password.\nPakisubok muli.",
        "passwordtooshort": "Ang mga password ay dapat mayroong {{PLURAL:$1|1 panitik|$1 panitik}} (karakter).",
+       "passwordtoopopular": "Hindi maaaring gamitin ang mga hudyat (''password'') na pangkaraniwang pinipili. Mangyaring pumili ng higit na natatanging hudyat.",
        "password-name-match": "Dapat magkaiba ang password mo sa bansag o username mo.",
        "password-login-forbidden": "Ipinagbabawal ang paggamit ng ganitong pangalan ng tagagamit at password.",
        "mailmypassword": "Baguhin ang password",
        "passwordreset-emailtext-ip": "Isang tao (marahil ay ikaw, mula sa IP address na $1) ang humiling ng isang paalala sa iyong mga detalye ng account para sa {{SITENAME}} ($4). Ang sumusunod na {{PLURAL:$3|account ng tagagamit ay|mga account ng tagagamit ay}} may kaugnayan sa email address na ito:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang password na ito|Ang mga pansamantalang password na ito}} ay mawawalan ng bisa sa loob ng {{PLURAL:$5|isang araw|$5 araw}}.\nDapat kang mag-login at pumili ng isang bagong password ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang orihinal mong password, at hindi mo na nais palitan ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng luma mong password.",
        "passwordreset-emailtext-user": "Ang tagagamit na si $1 sa {{SITENAME}} ay humiling ng isang paalala ng iyong mga akawnt ng detalye para sa {{SITENAME}}\n($4). Ang sumusunod na pangtagagamit na {{PLURAL:$3|akawnt ay|mga akawnt ay}} may kaugnayan sa tirahang ito ng e-liham:\n\n$2\n\n{{PLURAL:$3|Ang pansamantalang hudyat na ito|Ang pansamantalang mga hudyat na ito}} mawawalan ng bias sa loob ng {{PLURAL:$5|isang araw|$5 mga araw}}.\nDapat kang lumagda at pumili ng isang hudyat ngayon. Kung ibang tao ang gumawa ng kahilingang ito, o kung naalala mo na ang iyong orihinal na hudyat, at hindi mo na nais palitan pa ito, maaari mong huwag nang pansinin ang mensaheng ito at magpatuloy sa paggamit ng iyong lumang hudyat.",
        "passwordreset-emailelement": "Pangalan ng tagagamit: \n$1\n\nPansamantalang password: \n$2",
-       "passwordreset-emailsent": "Naipadala na ang isang e-liham na pampaalala.",
+       "passwordreset-emailsentemail": "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",
        "changeemail": "Baguhin ang direksiyong e-liham",
        "prefs-displaywatchlist": "Ipakita ang mga pagpipilian",
        "prefs-tokenwatchlist": "Token o susi",
        "prefs-diffs": "Mga pagkakaiba",
-       "email-address-validity-valid": "Mukhang katanggap-tanggap ang direkisyong e-liham",
-       "email-address-validity-invalid": "Magpasok ng isang tanggap na direksiyong e-liham",
        "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:",
        "wlheader-showupdated": "Ipinapakitang may '''makakapal na mga panitik''' ang nabagong/binagong mga pahina mula pa noong huli mong pagdalaw sa kanila",
        "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",
+       "watchlistall2": "lahat",
+       "watchlist-hide": "Itago",
+       "wlshowhideminor": "mga maliliit na edit",
+       "wlshowhidebots": "mga bot",
+       "wlshowhideliu": "mga nakarehistrong tagagamit",
+       "wlshowhideanons": "Mga di-nagpakilalang tagagamit",
+       "wlshowhidepatr": "mga binabantayang edit",
+       "wlshowhidemine": "mga edit ko",
        "watchlist-options": "Mga pagpipilian para sa talaan ng mga binabantayan",
        "watching": "Isinasama sa mga binabantayan...",
        "unwatching": "Tinatanggal mula sa mga binabantayan...",
        "movenosubpage": "Ang pahinang ito ay walang kabahaging mga pahina.",
        "movereason": "Dahilan:",
        "revertmove": "ibalik",
-       "delete_and_move": "Burahin at ilipat",
        "delete_and_move_text": "==Kinakailangan ang pagbura==\n\nMayroon 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 makapagbigay ng daan para sa paglipat mula sa \"[[$1]]\"",
        "htmlform-submit": "Ipasa",
        "htmlform-reset": "Bawiin ang mga pagbabago",
        "htmlform-selectorother-other": "Iba pa",
+       "htmlform-title-not-exists": "Hindi nairal ang $1.",
        "sqlite-has-fts": "$1 na may suportang paghahanap ng buong teksto",
        "sqlite-no-fts": "$1 na walang suporta ng paghahanap ng buong teksto",
        "logentry-delete-delete": "Binura ni $1 ang pahinang $3",
index 7d8807d..22dd623 100644 (file)
                        "McAang",
                        "Captantrips",
                        "Diyapazon",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "HakanIST"
                ]
        },
        "tog-underline": "Bağlantıların altını çiz:",
        "tog-hideminor": "Son değişiklikler sayfasında küçük değişiklikleri gizle",
        "tog-hidepatrolled": "Son değişikliklerde devriye görmüş değişiklikleri gizle",
        "tog-newpageshidepatrolled": "Yeni sayfalar listesinde, devriye görmüş sayfaları gizle",
+       "tog-hidecategorization": "Sayfa kategorilendirmesni gizle",
        "tog-extendwatchlist": "İzleme listesini sadece en son değil, tüm değişiklikleri göstermek üzere genişlet",
        "tog-usenewrc": "Son değişiklikler sayfasındaki ve izleme listesindeki değişiklikleri sayfalara gruplandır",
        "tog-numberheadings": "Başlıkları otomatik numaralandır",
        "tog-watchlisthidebots": "İzleme listemde bot değişikliklerini gizle",
        "tog-watchlisthideminor": "İzleme listemde küçük değişiklikleri gizle",
        "tog-watchlisthideliu": "İzleme listemde, kayıtlı kullanıcılar tarafından yapılan değişiklikleri gizle",
+       "tog-watchlistreloadautomatically": "Filtre değiştiğinde otomatik izleme (JavaScript gerekir)yeniden",
        "tog-watchlisthideanons": "İzleme listemde, anonim kullanıcılar tarafından yapılan değişiklikleri gizle",
        "tog-watchlisthidepatrolled": "İzleme listesinde, devriye görmüş değişiklikleri gizle",
+       "tog-watchlisthidecategorization": "Sayfa kategorilendirmesni gizle",
        "tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların bir kopyasını bana da gönder",
        "tog-diffonly": "Sayfa içeriğini, sürüm farklarının altında gösterme",
        "tog-showhiddencats": "Gizli kategorileri göster",
        "morenotlisted": "Bu liste tam değildir.",
        "mypage": "Sayfa",
        "mytalk": "Mesaj",
-       "anontalk": "Bu IP'nin iletileri",
+       "anontalk": "Mesaj",
        "navigation": "Gezinti",
        "and": "&#32;ve",
        "qbfind": "Bul",
        "redirectedfrom": "($1 sayfasından yönlendirildi)",
        "redirectpagesub": "Yönlendirme sayfası",
        "redirectto": "Şuraya yönlendir:",
-       "lastmodifiedat": "Bu sayfa son olarak $1, $2 tarihinde güncellenmiştir.",
+       "lastmodifiedat": "Bu sayfa son olarak $1 tarihinde ve $2 saatinde güncellenmiştir.",
        "viewcount": "Bu sayfaya {{PLURAL:$1|bir|$1}} defa erişilmiş.",
        "protectedpage": "Korumalı sayfa",
        "jumpto": "Şuraya atla:",
        "viewsource": "Kaynağı gör",
        "viewsource-title": "$1 sayfasının kaynağını görüntüle",
        "actionthrottled": "Eylem kısılmıştır",
-       "actionthrottledtext": "Spam'e karşı alınan önlemler dahilinde belirli bir süre aralığında bu eylemin gerçekleştirilmesine izin verilen miktarı aştınız.\nLütfen birkaç dakika sonra yeniden deneyin.",
+       "actionthrottledtext": "Suistimallere karşı alınan önlemler dahilinde belirli bir süre aralığında bu eylemin gerçekleştirilmesine izin verilen miktarı aştınız.\nLütfen birkaç dakika sonra yeniden deneyin.",
        "protectedpagetext": "Bu sayfa değişiklik ya da diğer eylemlerin yapılmasını engellemek için koruma altına alınmıştır.",
        "viewsourcetext": "Bu sayfanın kaynağını görebilir ve kopyalayabilirsiniz.",
        "viewyourtext": "Bu sayfada <strong>yaptığınız değişikliklerin</strong> kaynağını görünteleyip kopyalayabilirsiniz.",
        "createaccountreason": "Sebep:",
        "createacct-reason": "Gerekçe",
        "createacct-reason-ph": "Neden başka bir hesap oluşturuyorsunuz",
-       "createacct-captcha": "Güvenlik kontrolü",
-       "createacct-imgcaptcha-ph": "Yukarıda gördüğünüz metni girin",
        "createacct-submit": "Hesabınızı oluşturun",
        "createacct-another-submit": "Hesap oluşturun",
        "createacct-benefit-heading": "{{SITENAME}} sizin gibi insanlar tarafından geliştirilir.",
        "wrongpasswordempty": "Boş parola girdiniz. Lütfen tekrar deneyiniz.",
        "passwordtooshort": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
        "passwordtoolong": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
+       "passwordtoopopular": "Sıklıkla seçilen parolalar kullanılamaz. Lütfen daha özgün bir parola belirleyin.",
        "password-name-match": "Şifreniz kullanıcı adınızdan farklı olmalıdır.",
        "password-login-forbidden": "Bu kullanıcı adı ve şifre kullanımı yasaklanmıştır",
        "mailmypassword": "Parolayı sıfırla",
        "passwordreset-emailtext-ip": "Birisi, (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için hesap bilgilerinizin \nhatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Şifre değişimini siz istemediyseniz veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
        "passwordreset-emailtext-user": "$1 adlı kullanıcı, {{SITENAME}} ($4) için hesap bilgilerinizin hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir başkasına aitse veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
        "passwordreset-emailelement": "Kullanıcı adı: \n$1\n\nGeçici şifre: \n$2",
-       "passwordreset-emailsent": "Eğer bu hesabınız için kayıtlı bir e-posta adresi ise, bir parola sıfırlama e-postası gönderilecektir.",
+       "passwordreset-emailsentemail": "Eğer bu hesabınız için kayıtlı bir e-posta adresi ise, bir parola sıfırlama e-postası gönderilecektir.",
        "passwordreset-emailsent-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.",
        "passwordreset-emailerror-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1",
        "changeemail": "E-posta adresini değiştir veya çıkar",
        "search-category": "(kategori $1)",
        "search-file-match": "(dosya içeriğiyle eşleşiyor)",
        "search-suggest": "Bunu mu demek istediniz: $1",
+       "search-rewritten": "$1 için sonuçlar gösteriliyor. Bunun yerine $2 için arama yapılsın mı?",
        "search-interwiki-caption": "Kardeş projeler",
        "search-interwiki-default": "$1 sonuçları:",
        "search-interwiki-more": "(daha çok)",
        "showingresultsinrange": "<strong>$2</strong> ile <strong>$3</strong> arasında toplam <strong>$1</strong> sonuç gösteriliyor.",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> için sonuç|<strong>$3</strong> için <strong>$1 - $2</strong> sonuçlar}}",
        "search-nonefound": "Sorguyla eşleşen bir sonuç yok.",
+       "search-nonefound-thiswiki": "Bu sitede aramanızla eşleşen herhangi bir sonuç yok.",
        "powersearch-legend": "Gelişmiş arama",
        "powersearch-ns": "Ad alanlarında ara:",
        "powersearch-togglelabel": "Seç:",
        "prefs-help-prefershttps": "Bu tercih bir sonraki girişinizde etkili olacaktır.",
        "prefswarning-warning": "Henüz kaydedilmemiş değişiklikler yaptınız. \"$\"'e basmadığınız takdirde tercihleriniz güncellenmeyecektir.",
        "prefs-tabs-navigation-hint": "İpucu: Sekmeler listesindeki sekmeler arasında gezinmek için sağ ve sol ok tuşlarını kullanabilirsiniz.",
-       "email-address-validity-valid": "E-posta adresi geçerli görünüyor",
-       "email-address-validity-invalid": "Geçerli bir e-posta adresi girin",
        "userrights": "Kullanıcı hakları yönetimi",
        "userrights-lookup-user": "Kullanıcı gruplarını düzenle",
        "userrights-user-editname": "Kullanıcı adı giriniz:",
        "recentchanges-label-unpatrolled": "Bu değişiklik henüz gözlenmemiş",
        "recentchanges-label-plusminus": "Sayfa boyutundaki değişikliğin bayt bazında değeri",
        "recentchanges-legend-heading": "'''Gösterge:'''",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (Aynı zamanda bkz: [[Special:NewPages|Yeni sayfaların listesi]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ayrıca [[Special:NewPages|yeni sayfalar listesine]] bakınız)",
        "rcnotefrom": "<strong>$3, $4</strong> tarihinden itibaren yapılan {{PLURAL:$5|değişiklik|değişiklik}} aşağıdadır (<strong>$1</strong> tarhine kadar olanlar gösterilmektedir).",
        "rclistfrom": "$3 $2 tarihinden itibaren yeni değişiklikleri göster",
        "rcshowhideminor": "Küçük değişiklikleri $1",
        "wlheader-showupdated": "Sayfaları son ziyaretinizden beri değişen sayfalar '''kalın''' gösterilmiştir.",
        "wlnote": "$3 saat $4 itibariyle son {{PLURAL:$2|bir saatte|'''$2''' saatte}} yapılan {{PLURAL:$1|son değişiklik|son '''$1''' değişiklik}} aşağıdadır.",
        "wlshowlast": "Son $1 saati $2 günü göster",
+       "watchlistall2": "Hepsini göster",
+       "watchlist-hide": "Gizle",
+       "wlshowhideminor": "küçük değişiklikler",
+       "wlshowhidebots": "botlar",
+       "wlshowhideliu": "kayıtlı kullanıcılar",
+       "wlshowhideanons": "anonim kullanıcılar",
+       "wlshowhidepatr": "incelenmiş değişiklikler",
        "watchlist-options": "İzleme listesi seçenekleri",
        "watching": "İzleniyor...",
        "unwatching": "İzlenmiyor...",
        "contributions": "{{GENDER:$1|Kullanıcı}} katkıları",
        "contributions-title": "$1 için kullanıcı katkıları",
        "mycontris": "Katkılar",
+       "anoncontribs": "Katkılar",
        "contribsub2": "{{GENDER:$3|$1}} ($2) tarafından",
        "contributions-userdoesnotexist": "\"$1\" kullanıcı hesabı kayıtlı değil.",
        "nocontribs": "Bu kriterlere uyan değişiklik bulunamadı",
        "movenosubpage": "Bu sayfanın altsayfası yoktur.",
        "movereason": "Neden:",
        "revertmove": "geri al",
-       "delete_and_move": "Sil ve taşı",
        "delete_and_move_text": "==Silinmesi gerekiyor==\n\n\"[[:$1]]\" isimli bir sayfa zaten mevcut. O sayfayı silerek, isim değişikliğini gerçekleştirmeye devam etmek istiyor musunuz?",
        "delete_and_move_confirm": "Evet, sayfayı sil",
        "delete_and_move_reason": "[[$1]] sayfasının isim değişikliğinin gerçekleşmesi için silindi.",
        "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-anoncontribs": "Bu IP adresinden yapılmış değişiklikler listesi",
        "tooltip-pt-login": "Oturum açmanız tavsiye edilmektedir; ancak bu zorunda değildir",
        "tooltip-pt-logout": "Sistemden çık",
        "tooltip-pt-createaccount": "Bir hesap oluşturup oturum açmanız tavsiye edilmektedir ancak bu zorunlu değildir",
        "htmlform-cloner-delete": "Sil",
        "htmlform-cloner-required": "En az bir değer gereklidir.",
        "htmlform-title-not-creatable": "\"$1\"oluşturulabilir bir sayfa ismi değil.",
-       "htmlform-title-not-exists": "[[:$1]] mevcut değil",
+       "htmlform-title-not-exists": "$1 mevcut değil.",
        "htmlform-user-not-exists": "<strong>$1</strong> mevcut değil.",
        "htmlform-user-not-valid": "<strong>$1</strong> geçerli bir kullanıcı ismi değildir.",
        "sqlite-has-fts": "$1 tam-metin arama desteği ile",
index 4636d0b..c0eaef3 100644 (file)
        "morenotlisted": "Исемлек тулы түгел.",
        "mypage": "Бит",
        "mytalk": "Бәхәс бите",
-       "anontalk": "Бу IP адресы өчен бәхәс бите",
+       "anontalk": "Бәхәс",
        "navigation": "Навигация",
        "and": "&#32;һәм",
        "qbfind": "Эзләү",
        "sort-descending": "Кимү буенча урнаштыру",
        "sort-ascending": "Арту буенча урнаштыру",
        "nstab-main": "Бит",
-       "nstab-user": "Кулланучы бите",
+       "nstab-user": "Кулланучы",
        "nstab-media": "Мультимедиа",
        "nstab-special": "Махсус бит",
        "nstab-project": "Проект бите",
        "createacct-emailrequired": "Электрон почта юлламагыз",
        "createacct-emailoptional": "Электрон почта юлламагыз (мәҗбүри түгел)",
        "createacct-email-ph": "Электрон почта юлламагызны языгыз",
+       "createacct-another-email-ph": "Электрон почта юлламагызны кертегез",
        "createaccountmail": "электрон почта аша",
+       "createacct-realname": "Чын исем (мәҗбүри түгел)",
        "createaccountreason": "Сәбәп:",
-       "createacct-captcha": "Саклыкны тикшерү",
-       "createacct-imgcaptcha-ph": "Өстә күрсәтелгән текстны кертегез",
+       "createacct-reason": "Сәбәп",
+       "createacct-reason-ph": "Нигә сез яңа зисап язмасы төзисез",
        "createacct-submit": "Хисап язмасы төзү",
+       "createacct-another-submit": "Хисап язмасын төзү",
        "createacct-benefit-heading": "{{SITENAME}} — сезнең шикелле кешеләрнең хезмәте.",
        "createacct-benefit-body1": "{{PLURAL:$1|төзәтмә}}",
        "createacct-benefit-body2": "{{PLURAL:$1|мәкалә}}",
        "passwordtooshort": "Сезсүз $1 {{PLURAL:$1|символдан}} торырга тиеш.",
        "password-name-match": "Кертелгән серсүз кулланучы исеменнән аерылырга тиеш.",
        "password-login-forbidden": "Бу кулланучы исемен һәм серсүзне куллану тыелган",
-       "mailmypassword": "ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82ага Ñ\8fңа Ñ\81еÑ\80Ñ\81үз Ò\97ибÓ\99рү",
+       "mailmypassword": "СеÑ\80Ñ\81үзне Ð±ÐµÑ\82ерү",
        "passwordremindertitle": "{{SITENAME}} кулланучысына вакытлы серсүз тапшыру",
        "passwordremindertext": "Кемдер (бәлки, сездер, IP адресы: $1) {{SITENAME}} ($4) өчен яңа серсүз соратты. $2 өчен яңа серсүз: $3. Әгәр бу сез булсагыз, системага керегез һәм серсүзне алмаштырыгыз. Яңа серсүз $5 {{PLURAL:$5|көн}} гамәлдә булачак.\n\nӘгәр сез серсүзне алмаштыруны сорамаган булсагыз яки, оныткан очракта, исегезгә төшергән булсагыз, бу хәбәргә игътибар бирмичә, иске серсүзегезне куллануны дәвам итегез.",
        "noemail": "$1 исемле кулланучы өчен электрон почта адресы язылмаган.",
        "throttled-mailpassword": "Серсүзне электрон почтага җибәрү гамәлен сез {{PLURAL:$1|1=соңгы $1 сәгать}} эчендә кулландыгыз инде. Бу гамәлне явызларча куллануны кисәтү максатыннан аны $1 {{PLURAL:$1|сәгать}} аралыгында бер генә тапкыр башкарып була.",
        "mailerror": "Хат җибәрү хатасы: $1",
        "acct_creation_throttle_hit": "Сезнең IP адресыннан бу тәүлек эчендә {{PLURAL:$1|$1 хисап язмасы}} төзелде инде. Шунлыктан бу гамәл сезнең өчен вакытлыча ябык.",
-       "emailauthenticated": "ЭлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81Ñ\8bгÑ\8bз Ñ\80аÑ\81ландÑ\8b: $3, $2.",
+       "emailauthenticated": "Сезнең Ñ\8dлекÑ\82Ñ\80он Ð¿Ð¾Ñ\87Ñ\82а Ð°Ð´Ñ\80еÑ\81Ñ\8bгÑ\8bз $2 $3 Ñ\80аÑ\81ландÑ\8b.",
        "emailnotauthenticated": "Электрон почта адресыгыз әле дәлилләнмәгән, шуңа викиның электрон почта белән эшләү гамәлләре сүндерелде.",
        "noemailprefs": "Электрон почта адресыгыз күрсәтелмәгән, шуңа викиның электрон почта белән эшләү гамәлләре сүндерелгән.",
        "emailconfirmlink": "Электрон почта адресыгызны дәлилләгез.",
        "passwordreset-emailtext-ip": "Кемдер (бәлки, сездер, $1 IP-адресыннан) {{SITENAME}} ($4) проектында сезнең серсүзне искә төшерүне сорады.\n{{PLURAL:$3|1=Түбәндәге хисап язмасы|Түбәндәге хисап язмалары}} бу электрон әрҗә адресы белән бәйле:\n\n$2\n\n{{PLURAL:$3|1=Бу вакытлы серсүз|Бу вакытлы серсүзләр}} {{PLURAL:$5|$5 көн}} дәвамында эшлиячәкләр.\nСез системага керергә һәм яңа серсүз сайларга тиешсез.\nӘгәр сез серсүз сорамаган булсагыз яки элеккеге серсүзегезне искә төшерсәгез \nһәм аны үзгәртергә теләмәсәгез, бу хатка җавап бирмәгез\nһәм элеккеге серсүзегезне кулланыгыз.",
        "passwordreset-emailtext-user": "{{SITENAME}} проектыннан $1 кулланучысы {{SITENAME}} ($4) проектында сезнең серсүзне искә төшерүне сорады.\n{{PLURAL:$3|1=Түбәндәге хисап язмасы|Түбәндәге хисап язмалары}} бу электрон әрҗә адресы белән бәйле:\n\n$2\n\n{{PLURAL:$3|1=Бу вакытлы серсүз|Бу вакытлы серсүзләр}} {{PLURAL:$5|$5 көн}} дәвамында эшлиячәкләр.\nСез системага керергә һәм яңа серсүз сайларга тиешсез.\nӘгәр сез серсүз сорамаган булсагыз яки элеккеге серсүзегезне искә төшерсәгез \nһәм аны үзгәртергә теләмәсәгез, бу хатка җавап бирмәгез\nһәм элеккеге серсүзегезне кулланыгыз.",
        "passwordreset-emailelement": "Кулланучы исеме: \n$1\n\nВакытлыча серсүз: \n$2",
-       "passwordreset-emailsent": "Электрон әрҗәгә искәртү җибәрелгән иде",
+       "passwordreset-emailsentemail": "Электрон әрҗәгә искәртү җибәрелгән иде",
        "passwordreset-emailsent-capture": "Җибәрелгән хат-искәртү түбәндә китерелә",
        "passwordreset-emailerror-capture": "Түбәндә язылган хат-искәртү китерелгән, аны җибәрмәүнең сәбәбе:$1",
-       "changeemail": "Электрон әрҗә адресын үзгәртү",
+       "changeemail": "Электрон әрҗә адресын үзгәртү яисә бетерү",
        "changeemail-header": "Электрон әрҗә адресын үзгәртү",
        "changeemail-no-info": "Бу сәхифәгә турыдан-туры мөрәҗәгать итәр өчен, сез системага керергә тиешсез",
        "changeemail-oldemail": "Хәзерге электрон әрҗә адресы:",
        "sig_tip": "Имза һәм вакыт",
        "hr_tip": "Горизонталь сызык (еш кулланмагыз)",
        "summary": "Үзгәртүләр тасвирламасы:",
-       "subject": "Тема/башисем:",
+       "subject": "Тема:",
        "minoredit": "Бу кече үзгәртү",
        "watchthis": "Бу битне күзәтү",
        "savearticle": "Битне саклау",
        "missingcommenttext": "Аска тасвирлама язуыгыз сорала.",
        "missingcommentheader": "''Искәртү:''' Сез тасвирламага исем бирмәдегез.\n«{{int:savearticle}}» төймәсенә кабат бассагыз, үзгәртүләр исемсез язылачак.",
        "summary-preview": "Тасвирламаны алдан карау:",
-       "subject-preview": "Ð\91аÑ\88иÑ\81емне Ð°Ð»Ð´Ð°Ð½ ÐºÐ°Ñ\80аÑ\83:",
+       "subject-preview": "Ð\91аÑ\88иÑ\81емне Ð±Ð¾Ð»Ð°Ð¹ Ð±Ñ\83лаÑ\87ак:",
        "blockedtitle": "Кулланучы тыелды",
        "blockedtext": "'''Сезнең хисап язмагыз яки IP адресыгыз тыелган.'''\n\nТыючы идарәче: $1.\nКүрсәтелгән сәбәп: ''$2''.\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны дәлилләмәгән булсагыз ([[Special:Preferences|дәлилләү өчен шәхси көйләүләр монда]]), идарәчегә хат җибәрә алмыйсыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресы — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "autoblockedtext": "Сезнең IP адресыгыз, аның тыелган кулланучы тарафыннан кулланылуы сәбәпле, автомат рәвештә тыелды.\nУл кулланучыны тыючы идарәче: $1. Күрсәтелгән сәбәп:\n\n:''$2''\n\n* Тыю башланган вакыт: $8\n* Тыю ахыры: $6\n* Тыелулар саны: $7\n\nСез $1 яки башка [[{{MediaWiki:Grouppage-sysop}}|идарәчегә]] тыю буенча сорауларыгызны җибәрә аласыз.\nИсегездә тотыгыз: әгәр сез теркәлмәгән һәм электрон почта адресыгызны дәлилләмәгән булсагыз ([[Special:Preferences|дәлилләү өчен шәхси көйләүләр монда]]), идарәчегә хат җибәрә алмыйсыз. Шулай ук тыю вакытында сезнең хат җибәрү мөмкинлегегезне чикләгән булырга да мөмкиннәр.\nСезнең IP адресы — $3, тыю идентификаторы — #$5.\nХатларда бу мәгълүматны күрсәтергә онытмагыз.",
        "nosuchsectiontitle": "Мондый бүлекне табып булмый.",
        "nosuchsectiontext": "Сез булмаган бүлекне төзәтергә телисез.\nСез бу сәхифәне караганда ул бетерелә алды.",
        "loginreqtitle": "Керү кирәк",
-       "loginreqlink": "керү",
+       "loginreqlink": "керергә",
        "loginreqpagetext": "Сез башка битләр карау өчен $1 тиеш.",
        "accmailtitle": "Серсүз җибәрелде.",
        "accmailtext": "[[User talk:$1|$1]] кулланучысы өчен төзелгән серсүз $2 адресына җибәрелде.\n\nСайтка кергәч сез ''[[Special:ChangePassword|серсүзегезне үзгәртә аласыз]]''.",
        "nocreate-loggedin": "Сезгә яңа битләр төзү хокукы бирелмәгән.",
        "sectioneditnotsupported-title": "Бүлекләрне үзгәртү рөхсәт ителми.",
        "sectioneditnotsupported-text": "Бу биттә бүлекләрне үзгәртү рөхсәт ителми.",
-       "permissionserrors": "Ð\9aеÑ\80Ò¯ Ñ\85окÑ\83кÑ\8b Ñ\85аÑ\82алаÑ\80ы",
+       "permissionserrors": "Ð\9aеÑ\80Ò¯ Ñ\85аÑ\82аÑ\81ы",
        "permissionserrorstext": "Түбәндәге {{PLURAL:$1|1=сәбәп|сәбәпләр}} аркасында сез бу гамәлне башкара алмыйсыз:",
        "permissionserrorstext-withaction": "$2 гамәлен башкара алмыйсыз. {{PLURAL:$1|1=Сәбәбе|Сәбәпләре}}:",
        "recreate-moveddeleted-warn": "'''Игътибар: Сез бетерелгән бит урынына яңа бит ясамакчы буласыз.'''\n\nСезгә чыннан да бу битне яңадан ясау кирәкме?\nТүбәндә битнең бетерү һәм күчерү көндәлеге китерелә:",
        "edit-already-exists": "Яңа бит төзеп булмый.\nУл инде бар.",
        "editwarning-warning": "Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.\nӘгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.",
        "duplicate-args-category": "Калыпны чакыруда кабатлап торган аргументларны кулланган битләр",
-       "expensive-parserfunction-warning": "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nЧикләү: $2 {{PLURAL:$2|1=куллану}}, бу очракта {{PLURAL:$1|$1 тапкыр}} башкарырга рөхсәт ителә.",
+       "expensive-parserfunction-warning": "<strong>Игътибар:</strong>  бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nБиттә {{PLURAL:$2|$2 эш куллану}} рөхсәт ителгән очракта, монда $1 {{PLURAL:$1|эш башкарыла}}.",
        "expensive-parserfunction-category": "Хәтерне еш кулланучы функцияләр күп булган битләр",
        "post-expand-template-inclusion-warning": "'''Игътибар:''' Кулланылучы үрнәкләр артык зур.\nКайберләре кабызылмаячак.",
        "post-expand-template-inclusion-category": "Рөхсәт ителгән күләмнән артык булган үрнәкле битләр",
        "revdelete-show-file-submit": "Әйе",
        "logdelete-selected": "Журналның {{PLURAL:$1|1=Сайланган язма|сайланган язмалары}} :",
        "revdelete-legend": "Чикләүләр урнаштыр:",
-       "revdelete-hide-text": "Битнең бу юрамасы текстын яшер",
+       "revdelete-hide-text": "Үзгәртү тексты",
        "revdelete-hide-image": "Файл эчендәгеләрне качыр",
-       "revdelete-hide-name": "Ð\93амÓ\99лне Ò»Ó\99м Ð¾Ð±Ñ\8aекÑ\82нÑ\8b яшерү",
-       "revdelete-hide-comment": "Үзгәртүләр тасвирламасы яшерелсен",
-       "revdelete-hide-user": "Үзгәртүченең исемен/IP адресын яшер",
+       "revdelete-hide-name": "Ð\93амÓ\99лне Ò»Ó\99м ÐºÓ©Ð¹Ð»Ó\99үне яшерү",
+       "revdelete-hide-comment": "Үзгәртүләр тасвирламасы",
+       "revdelete-hide-user": "Кулланучы исеме/IP-адрес",
        "revdelete-hide-restricted": "Мәгълүматлар идарәчеләрдән дә яшерелсен",
        "revdelete-radio-same": "(үзгәртмәү)",
        "revdelete-radio-set": "Яшеренлек",
        "revdelete-radio-unset": "Күренүчәнлек",
        "revdelete-suppress": "Мәгълүматлар идарәчеләрдән дә яшерелсен",
        "revdelete-log": "Сәбәп:",
-       "revdelete-submit": "{{PLURAL:$1|сайланылган версиягә}} кулланырга",
+       "revdelete-submit": "{{PLURAL:$1|1=сайланылган юрамага|сайланылган юрамаларга}} кулланырга",
        "revdelete-success": "'''Версиянең күренүчәнлеге уңышлы рәвештә үзгәртелде'''",
        "revdelete-failure": "'''Версиянең күренүчәнлеге үзгәртелә алмый:'''\n$1",
        "logdelete-success": "Вакыйганың күренүчәнлеге үзгәртелде.",
        "search-relatedarticle": "Бәйле",
        "searchrelated": "бәйле",
        "searchall": "барлык",
-       "showingresults": "Аста № '''$2''' {{PLURAL:$1|башлап}} '''$1''' {{PLURAL:$1|результат}} күрсәтелгән.",
+       "showingresults": "Аста №<strong>$2</strong> башлап {{PLURAL:$1|<strong>1</strong> нәтиҗә күрсәтелгән}}.",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> нәтиҗәдән <strong>$1</strong>| <strong>$3</strong> нәтиҗәләрдән <strong>$1 — $2</strong>}}",
        "search-nonefound": "Сорауга туры килгән нәтиҗәләр табылмады.",
        "powersearch-legend": "Өстәмә эзләү",
        "rows": "Юллар:",
        "columns": "Баганалар:",
        "searchresultshead": "Эзләү",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">Ясалма сылтамаларның</a> бизәлеше буенча чикләүләр (байтларда):",
+       "stub-threshold": "Ясалма сылтамаларның бизәлеше буенча чикләүләр ($1):",
        "stub-threshold-disabled": "Ябылган",
        "recentchangesdays": "Соңгы үзгәртүләрне күрсәтүче көннәр саны:",
-       "recentchangesdays-max": "( $1 {{PLURAL:$1|көннән}} дә артык булмаска тиеш)",
+       "recentchangesdays-max": "(иң күбе $1 {{PLURAL:$1|көн}})",
        "recentchangescount": "Төп буларак кулланучы үзгәртүләр саны:",
        "prefs-help-recentchangescount": "Үз өченә үзгәртүләрне, битләрнең тарихын һәм язлу көндәлеген дә кертә.",
        "savedprefs": "Көйләнмәләрегез сакланды.",
        "timezoneregion-indian": "Һинд океаны",
        "timezoneregion-pacific": "Тын океан",
        "allowemail": "Башка кулланучылардан хатлар алырга рөхсәт ителсен",
-       "prefs-searchoptions": "Эзләү көйләнмәләре",
+       "prefs-searchoptions": "Эзләү",
        "prefs-namespaces": "Исемнәр мәйданы",
        "default": "килешү буенча",
        "prefs-files": "Файллар",
        "prefs-reset-intro": "Бу бит сезнең көйләнмәләрегезне бетерү өчен кулланыла. Бу эшне башкару нәтиҗәсендә сез яңадан үз көйләнмәләрне яңадан кайтара алмыйсыз.",
        "prefs-emailconfirm-label": "E-mail раслау",
        "youremail": "Электрон почта:",
-       "username": "Кулланучы исеме:",
-       "prefs-memberingroups": "Төркем {{PLURAL:$1|әгъзасы}}:",
+       "username": "{{GENDER:$1|Кулланучы исеме}}:",
+       "prefs-memberingroups": "{{PLURAL:$1|Төркем}} {{GENDER:$2|әгъзасы}}:",
        "prefs-memberingroups-type": "$1",
        "prefs-registration": "Теркәлү вакыты:",
        "prefs-registration-date-time": "$1",
        "prefs-help-signature": "Бәхәслек битләрендә сезнең язмаларыгызны калдыру «<nowiki>~~~~</nowiki>» тамгалары куелу нәтиҗәсендә булырга тиеш.",
        "badsig": "Имза дөрес түгел. HTML теглары тикшерегез.",
        "badsiglength": "Имзагыз бигрәк озын.\nУл $1 {{PLURAL:$1|хәрефтән}} күбрәк булырга тиеш түгел.",
-       "yourgender": "Җенес:",
-       "gender-unknown": "билгеÑ\81ез",
+       "yourgender": "Сезгә нинди тасвирлама күбрәк туры килә?",
+       "gender-unknown": "Сезне Ð¸Ñ\81кÓ\99 Ð°Ð»Ð³Ð°Ð½Ð´Ð° Ð¿Ñ\80огÑ\80амма, Ð¼Ó©Ð¼ÐºÐ¸Ð½ Ð±Ñ\83лган Ð¾Ñ\87Ñ\80акÑ\82а, Ò\97енÑ\81и-нейÑ\82Ñ\80алÑ\8c Ñ\81үзлÓ\99Ñ\80 ÐºÑ\83лланаÑ\87ак",
        "gender-male": "Вики-битләрне ир-ат үзгәртә",
        "gender-female": "Вики-битләрне хатын-кыз үзгәртә",
-       "prefs-help-gender": "Мәҗбүри түгел: Ул бары тик кайбер хатларда гына күренәчәк һәм бу мәгълүмат барлык кулланучыларга да билгеле булачак.",
+       "prefs-help-gender": "Әлеге параметрларны куллану мәҗбүри түгел. Ул бары тик Сезгә дөрес итеп өндәшү өчен генә кирәк булачак. Бу мәгълүмат барлык кулланучыларга да билгеле булачак.",
        "email": "Электрон почта",
-       "prefs-help-realname": "Чын исемегез (кирәкми): аны күрсәтсәгез, ул битне үзгәртүче күрсәтү өчен файдалаячак.",
+       "prefs-help-realname": "Чын исемегезне кертү мәҗбүри тугел. Аны күрсәткән очракта, ул Сезнең эшләрдә автор хокуклары буенча күрсәтеләчәк.",
        "prefs-help-email": "Электрон почта адресын күрсәтү мәҗбүри түгел, ләкин әгәрдә сез үзегезнең серсүзне онытсагыз бу сезгә аны яңадан кайтарырга ярдәм итәчәк.",
        "prefs-help-email-others": "Ул шулай ук сезгә башка кулланучылар белән аралашырга ярдәм итчәк, шул ук вакытта сезнең почтагызның юлламасы күрсәтелмәячәк.",
        "prefs-help-email-required": "Электрон почта адресы кирәк.",
        "prefs-signature": "Имза",
        "prefs-dateformat": "Вакытың форматы",
        "prefs-timeoffset": "Вакыт билгеләнеше",
-       "prefs-advancedediting": "Ð\9aиңÓ\99йÑ\82елгÓ\99н көйләүләр",
+       "prefs-advancedediting": "Ð\93омÑ\83ми көйләүләр",
        "prefs-advancedrc": "Киңәйтелгән көйләүләр",
        "prefs-advancedrendering": "Киңәйтелгән көйләүләр",
        "prefs-advancedsearchoptions": "Киңәйтелгән көйләүләр",
        "userrights-lookup-user": "Кулланучы төркемнәре белән идарә итү",
        "userrights-user-editname": "Кулланучының исемен кертегез:",
        "editusergroup": "Кулланучының төркемнәрен алмаштыру",
-       "editinguser": "Кулланучы <strong>[[User:$1|$1]]</strong> $2 хокукларын үзгәртү",
+       "editinguser": "{{GENDER:$1|Кулланучы}} <strong>[[User:$1|$1]]</strong> $2 хокукларын үзгәртү",
        "userrights-editusergroup": "Кулланучының төркемнәрен алмаштыру",
        "saveusergroups": "Кулланучы төркемнәрен саклау",
        "userrights-groupsmember": "Әгъза:",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|идарәче}}",
        "group-bureaucrat-member": "{{GENDER:$1|бюрократ}}",
-       "group-suppress-member": "{{GENDER:$1|Ð\9dазир}}",
+       "group-suppress-member": "{{GENDER:$1|назир}}",
        "grouppage-user": "{{ns:project}}:Кулланучылар",
        "grouppage-autoconfirmed": "{{ns:project}}:Авторасланган кулланучылар",
        "grouppage-bot": "{{ns:project}}:Ботлар",
        "action-createpage": "битләрне язырга",
        "action-createtalk": "бәхәс битен ясарга",
        "action-move": "бу битне күчерерге",
-       "nchanges": "$1 {{PLURAL:$1|1=үзгәртү|үзгәртү}}",
+       "nchanges": "$1 {{PLURAL:$1|үзгәртү}}",
        "enhancedrc-history": "тарих",
        "recentchanges": "Соңгы үзгәртүләр",
        "recentchanges-legend": "Соңгы үзгәртүләр көйләүләре",
        "recentchanges-label-plusminus": "Битнең зурлыгы шуның кадәрле байтка үзгәрде",
        "recentchanges-legend-heading": "'''Легенда:&nbsp;'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|яңа бит]])",
-       "rcnotefrom": "Астарак '''$2''' башлап ('''$1''' кадәр) үзгәртүләр күрсәтелгән.",
+       "rcnotefrom": "Астарак <strong>$3, $4</strong> өчен {{PLURAL:$5|үзгәртүләр күрсәтелгән}} (<strong>$1</strong> артык түгел).",
        "rclistfrom": "$3 $2 башлап яңа үзгәртүләрне күрсәт",
        "rcshowhideminor": "кече үзгәртүләрне $1",
        "rcshowhideminor-show": "күрсәт",
        "rcshowhideminor-hide": "яшер",
        "rcshowhidebots": "ботларны $1",
-       "rcshowhidebots-show": "күрсәт",
+       "rcshowhidebots-show": "Ð\9aүрсәт",
        "rcshowhidebots-hide": "яшер",
        "rcshowhideliu": "теркәлгән кулланучыларны $1",
        "rcshowhideliu-show": "күрсәт",
        "minoreditletter": "к",
        "newpageletter": "Я",
        "boteditletter": "б",
-       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|күзәтеп тора кулланучы}}]",
-       "rc_categories": "Төркемнәрдә генә тора («|» бүлүче)",
-       "rc_categories_any": "Һәрбер",
+       "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": "Ваклыкларны күрсәтү",
        "reuploaddesc": "Файлны йөкләүгә кире кату",
        "upload-tryagain": "Яңартылган файлны җибәрү",
        "uploadnologin": "Сез хисап язмагызга кермәгәнсез",
-       "uploadnologintext": "ФайлнÑ\8b Ð¹Ó©ÐºÐ»Ó\99Ò¯ Ó©Ñ\87ен Ñ\81ез Ð±Ñ\83 Ð±Ð¸Ñ\82кÓ\99 [[Special:UserLogin|кеÑ\80еÑ\80гÓ\99]] Ñ\82иеÑ\88Ñ\81ез.",
+       "uploadnologintext": "ФайллаÑ\80нÑ\8b Ñ\81еÑ\80веÑ\80га Ð¹Ó©ÐºÐ»Ó\99Ò¯ Ó©Ñ\87ен Ð¡ÐµÐ· Ñ\81Ó\99Ñ\85иÑ\84Ó\99гÓ\99 $1 Ñ\82иеÑ\88.",
        "upload_directory_missing": "$1 Йөкләнү директориясе юк",
        "upload_directory_read_only": "Моңа Сезнең хокукларыгыз юк һәм веб-сервер $1 папкасыны йөкли алмый.",
        "uploaderror": "Файлны йөкләүдә хата",
        "upload-recreate-warning": "'''Игътибар: Мондый исемле файл бетерелгән яки исеме алмаштырылган '''",
        "uploadtext": "Бу форманы кулланып серверга файллар йөкли аласыз. Элегрәк йөкләнелгән файлларны карау өчен [[Special:FileList|йөкләнелгән файллар исемлегенә]] мәрәҗәгать итегез. Шулай ук ул [[Special:Log/upload|йөкләнмәләр исемлегенә]] һәм [[Special:Log/delete|бетерелгән файллар]] исемлегенә дә языла.\n\nФайлны мәкаләгә йөкләү өчен Сез менә бу үрнәкләрне куллана аласыз:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Рәсем.jpg]]</nowiki></code>''' файлның тулы юрамасын кую өчен;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Räsem.png|200px|thumb|left|тасвирламасы]]</nowiki></code>'''  200 пиксельга кадәр киңлектәге  һәм текстның сул ягында, тасвирламасы белән;\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''биттә файлны сүрәтләмичә, бары тик сылтамасын гына кую.",
-       "upload-permitted": "Рөхсәт ителгән файл төрләре:$1",
-       "upload-preferred": "Мөмкин булган файл төрләре:$1",
-       "upload-prohibited": "Тыелган файл төрләре:$1",
+       "upload-permitted": "{{PLURAL:$2|Рөхсәт ителгән файл төрләре}}: $1.",
+       "upload-preferred": "{{PLURAL:$2|Мөмкин булган файл төрләре}}: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Тыелган файл төрләре}}: $1.",
        "uploadlogpage": "Йөкләү көндәлеге",
        "uploadlogpagetext": "Аста яңа йөкләнелгән файллар исемлеге бирелә.\nШулай ук [[Special:NewFiles|яңа файллар галлереясын]] карагыз",
        "filename": "Файл исеме",
        "filetype-mime-mismatch": "Файлның кинәйтелмәсе «.$1» аның MIME-төренә туры килми ($2).",
        "filetype-badmime": "MIME-төре «$1» булган файллар, йөкләнмәячәк.",
        "filetype-bad-ie-mime": "Файлны йөкләргә мөмкин түгел, чөнки Internet Explorer аны «$1» дип кабул итәчәк.",
-       "filetype-unwanted-type": "'''\".$1\"''' — тыелган файл төре.\n{{PLURAL:$3|1=Мөмкин булган файл төре булып|Мөмкин булган файл төре:}} $2.",
-       "filetype-banned-type": "'''\".$1\"''' — {{PLURAL:$4|1=тыелган файл төре|тыелган файллар төре}}.\n{{PLURAL:$3|1=Киңәйтелгән файл төре булып|Киңәйтелгән  файл төрләре:}} $2.",
+       "filetype-unwanted-type": "<strong>«.$1»</strong> — тыелган файл төре.\n{{PLURAL:$3|Мөмкин булган файл төре:}} $2.",
+       "filetype-banned-type": "<strong>«.$1»</strong> — {{PLURAL:$4|1=тыелган файл төре|тыелган файллар төре}}.\n{{PLURAL:$3|1=Киңәйтелгән файл төре булып|Киңәйтелгән  файл төрләре:}} $2.",
        "filetype-missing": "Файлның киңәйтелмәсе юк ''(мәсәлән,«.jpg»)''.",
        "empty-file": "Сезнең тарафтан җибәрелгән файл буш.",
        "file-too-large": "Сезнең тарафтан җибәрелгән файл артык зур.",
        "license-header": "Лицензиясе",
        "nolicense": "Юк",
        "license-nopreview": "(Алдан карау мөмкин түгел)",
-       "upload_source_file": "(сезнең санактагы файл)",
+       "upload_source_file": "(сезнең санакта сайланган файл)",
+       "listfiles-summary": "Әлеге махсус бит Сез йөкләгән бөтен файлларны күрсәтә.",
        "imgfile": "файл",
        "listfiles": "Сүрәтләр исемлеге",
        "listfiles_thumb": "Миниатюра",
        "wantedtemplates": "Кирәкле үрнәкләр",
        "mostlinked": "Күп үзенә сылтамалы битләр",
        "mostlinkedcategories": "Күп үзенә сылтамалы төркемнәр",
-       "mostlinkedtemplates": "Иң күп кулланылган үрнәкләр",
+       "mostlinkedtemplates": "Иң күп кулланылган битләр",
        "mostcategories": "Күп төркемләргә кертелгән битләр",
        "mostimages": "Иң кулланган сүрәтләр",
        "mostrevisions": "Күп үзгәртүләр белән битләр",
        "movethispage": "Бу битне күчерү",
        "nopagetitle": "Мондый бит юк",
        "nopagetext": "Күрсәтелгән бит юк.",
-       "pager-newer-n": "{{PLURAL:$1|1=1 яңарак|$1 яңарак}}",
+       "pager-newer-n": "{{PLURAL:$1|$1 яңарак}}",
        "pager-older-n": "$1 {{PLURAL:$1|искерәк}}",
        "suppress": "Яшерү",
        "booksources": "Китап чыганаклары",
        "booksources-text": "Әлеге биттә күрсәтелгән сылтамалар ярәмендә сезнең кызыксындырган китап буенча өстәмә мәгълүматлар табарга мөмкин. Болар интернет-кибетләр һәм китапханә җыентыгында эзләүче системалар.",
        "booksources-invalid-isbn": "Бирелгән ISBN саны бәлки хаталдыр. Зинһар, бирелгән саннарны яңадан тикшерегез.",
        "specialloguserlabel": "Башкаручы:",
-       "speciallogtitlelabel": "Ð\91аÑ\88лам:",
+       "speciallogtitlelabel": "Ð\9cакÑ\81аÑ\82 (аÑ\82ама Ñ\8fиÑ\81Ó\99 {{ns:user}}:кÑ\83лланÑ\83Ñ\87Ñ\8b Ð¸Ñ\81еме):",
        "log": "Көндәлекләр",
        "all-logs-page": "Барлык көндәлекләр",
        "alllogstext": "{{SITENAME}} сәхифәсенең гомуми көндәлекләре исемлеге.\nСез нәтиҗәләрне көндәлек төре, кулланучы исеме (хәреф зурлыгын истә тотыгыз) яки куззаллаган бит (шулай ук хәреф зурлыгын истә тотыгыз) буенча тәртипкә салырга мөмкин.",
        "special-categories-sort-count": "исәп буенча тәртипләү",
        "special-categories-sort-abc": "әлифба буенча тәртипләү",
        "sp-deletedcontributions-contribs": "кертем",
-       "linksearch": "Тышкы сылтамалар",
+       "linksearch": "Тышкы сылтамаларны эзләү",
        "linksearch-pat": "Эзләү өчен үрнәк:",
        "linksearch-ns": "Исемнәр мәйданы:",
        "linksearch-ok": "Эзләү",
        "emailuser-title-target": "{{GENDER:$1|Кулланучыга}} электрон хат язу",
        "emailuser-title-notarget": "Кулланучыга хат җибәрү",
        "emailpagetext": "Әлеге форма ярдәмендә {{GENDER:$1|кулланучының}} электрон почта адресына хат җибәрергә мөмкин. Җибәрелгән адрес исемендә Сезнең [[Special:Preferences|көйләнмәләрдә]] күрсәтелгән адресыгыз күрсәтеләчәк, шуның ярдәмендә Сез ул кулланучы белән турыдан-туры сөйләшә аласыз.",
-       "defemailsubject": "{{SITENAME}}: хат",
+       "defemailsubject": "{{SITENAME}} — $1 кулланучысыннан хат",
        "noemailtitle": "Электрон почта адресы юк",
        "noemailtext": "Бу кулланучы чын электрон әрҗә адресын күрсәтмәде.",
        "nowikiemailtext": "Бу кулланучы башкалардан хат алырга теләмәвен белдерде.",
        "watchlistfor2": "$1 өчен $2",
        "nowatchlist": "Күзәтү исемлегегездә битләр юк.",
        "watchnologin": "Кермәдегез",
-       "addedwatchtext": "\"[[:$1]]\" бите [[Special:Watchlist|күзәтү исемлегегезгә]] өстәлде.\nБу биттә һәм аның бәхәслегендә барлык булачак үзгәртүләр шунда күрсәтелер, һәм, [[Special:RecentChanges|соңгы үзгәртүләр]] исемлегендә бу битне җиңелрәк табу өчен, ул '''калын мәтен''' белән күрсәтелер.",
-       "removedwatchtext": "«[[:$1]]» Ð±Ð¸Ñ\82е [[Special:Watchlist|Ñ\81езнең ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегеннән]] бетерелде.",
+       "addedwatchtext": "\"[[:$1]]\" бите [[Special:Watchlist|күзәтү исемлегегезгә]] өстәлде.",
+       "removedwatchtext": "«[[:$1]]» Ð¼Ó\99калÓ\99Ñ\81е 1Ó\99м Ð°Ð½Ñ\8bÒ£ Ð±Ó\99Ñ\85Ó\99Ñ\81 Ð±Ð¸Ñ\82е [[Special:Watchlist|Ñ\81езнең ÐºÒ¯Ð·Ó\99Ñ\82Ò¯ Ð¸Ñ\81емлегегездән]] бетерелде.",
        "watch": "Күзәтү",
        "watchthispage": "Бу битне күзәтү",
        "unwatch": "Күзәтмәү",
        "unwatchthispage": "Күзәтүне туктат",
        "notanarticle": "Мәкалә түгел",
-       "watchlist-details": "Күзәтү исемлегегездә, бәхәс битләрен санамыйча, {{PLURAL:$1|1=$1 бит|$1 бит}} бар.",
-       "wlshowlast": "Баягы $1 сәгать $2 көн эчендә яки ны күрсәт",
+       "watchlist-details": "Күзәтү исемлегегездә, бәхәс битләрен санамыйча, {{PLURAL:$1|$1 бит}} бар.",
+       "wlshowlast": "$1 сәгать $2 көн өчендә күрсәтү",
+       "watchlistall2": "барлык",
        "watchlist-options": "Күзәтү исемлеге көйләүләре",
        "watching": "Күзәтү исемлегемә өстәүе…",
        "unwatching": "Күзәтү исемлегемнән чыгаруы…",
        "enotif_impersonal_salutation": "{{SITENAME}} кулланучы",
        "enotif_lastvisited": "Соңгы керүегездән соң булган барлык үзгәртүләрне күрер өчен, бу сылтама аша узыгыз: $1",
-       "enotif_body": "Хөрмәтле $WATCHINGUSERNAME,\n\n«{{SITENAME}}» проектының «$PAGETITLE» бите  $PAGEEDITOR  тарафыннан  $PAGEEDITDATE  көнне  $CHANGEDORCREATED. Битне карар өчен $PAGETITLE_URL  буенча узыгыз.\n\n$NEWPAGE\n\nҮзгәртүнең кыска эчтәлеге: $PAGESUMMARY $PAGEMINOREDIT\n\nҮзгәртүчегә язу:\nэл. почта $PAGEEDITOR_EMAIL\nвики $PAGEEDITOR_WIKI\n\nБу биткә кермәсәгез, аның башка үзгәртүләре турында хат җибәрелмәячәк. Шулай ук сез күзәтү исемлегегездә булган битләр өчен хәбәр бирү флагын алып куя аласыз.\n\n             {{grammar:genitive|{{SITENAME}}}} хәбәр бирү системасы\n\n--\nХәбәр итүләр көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКүзәтү исемлеге көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nБитне сезнең күзәтү исемлегездән бетерү:\n$UNWATCHURL\n\nЭлемтә һәм ярдәм:\n$HELPPAGE",
+       "enotif_body": "Хөрмәтле $WATCHINGUSERNAME,\n\n\n$PAGEINTRO $NEWPAGE\n\nҮзгәртүнең кыска эчтәлеге: $PAGESUMMARY $PAGEMINOREDIT\n\nҮзгәртүчегә язу:\nэл. почта $PAGEEDITOR_EMAIL\nвики $PAGEEDITOR_WIKI\n\nБу биткә кермәсәгез, аның башка үзгәртүләре турында хат җибәрелмәячәк. Шулай ук сез күзәтү исемлегегездә булган битләр өчен хәбәр бирү флагын алып куя аласыз.\n\n             {{grammar:genitive|{{SITENAME}}}} хәбәр бирү системасы\n\n--\nХәбәр итүләр көйләүләрен үзгәртү:\n{{canonicalurl:{{#special:Preferences}}}}\n\nКүзәтү исемлеге көйләүләрен үзгәртү:\n$HELPPAGE\n\nБитне сезнең күзәтү исемлегездән бетерү:\n$UNWATCHURL\n\nЭлемтә һәм ярдәм:\n$HELPPAGE",
        "created": "төзелгән",
        "changed": "үзгәртелде",
        "deletepage": "Битне бетерү",
        "confirm": "Раслау",
        "excontent": "эчтәлек: «$1»",
-       "excontentauthor": "эчтәлеге: \"$1\" (бердәнбер үзгәртүче \"[[Special:Contributions/$2|$2]]\" иде)",
+       "excontentauthor": "эчтәлеге: «$1», бердәнбер авторы [[Special:Contributions/$2|$2]] ([[User talk:$2|бәхәс]])",
        "exbeforeblank": "чистартуга кадәр булган эчтәлек: «$1»",
        "delete-confirm": "«$1» бетерү",
        "delete-legend": "Бетерү",
-       "historywarning": "'''Кисәтү''': сез бетерергә теләгән биттә үзгәртү тарихы бар, ул $1дән {{PLURAL:$1|юрамалар}}:",
+       "historywarning": "<strong>Игътибар:</strong> Сез бетерергә теләгән биттә үзгәртү тарихы бар, ул $1 {{PLURAL:$1|юрамадан тора}}:",
        "confirmdeletetext": "Сез бу битнең (яки рәсемнең) тулысынча бетерелүен сорадыгыз.\nЗинһар, моны чыннан да эшләргә теләгәнегезне, моның нәтиҗәләрен аңлаганыгызны һәм [[{{MediaWiki:Policy-url}}]] бүлегендәге кагыйдәләр буенча эшләгәнегезне раслагыз.",
        "actioncomplete": "Гамәл башкарган",
        "actionfailed": "Эш башкарылмаган",
        "deletecomment": "Сәбәп:",
        "deleteotherreason": "Башка/өстәмә сәбәп:",
        "deletereasonotherlist": "Башка сәбәп",
-       "deletereason-dropdown": "* Бетерүнең сәбәпләре\n** вандаллык\n** автор соравы буенча\n** автор хокукларын бозу",
+       "deletereason-dropdown": "* Бетерүнең сәбәпләре\n** спам\n** вандаллык\n** автор хокукларын бозу\n** автор соравы буенча\n** эшсез күчермә",
        "delete-edit-reasonlist": "Сәбәпләр исемлеген үзгәртү",
        "rollbacklink": "кире кайтару",
        "rollbacklinkcount": "$1 {{PLURAL:$1|төзәтмәне}} кире кагу",
        "protect-unchain-permissions": "Өстәмә яклау чараларын ачу",
        "protect-text": "Биредә сез '''$1''' бите өчен яклау дәрәҗәсене карый һәм үзгәрә аласыз.",
        "protect-locked-access": "Хисап язмагызга битләрнең яклау дәрәҗәсен үзгәртү өчен хак җитми. '''$1''' битенең хәзерге көйләүләре:",
-       "protect-cascadeon": "Бу бит якланган, чөнки ул әлеге каскадлы яклаулы {{PLURAL:$1|1=биткә|битләргә}} керә. Сез бу битнең яклау дәрәҗәсен үзгәртә аласыз, әмма каскадлы яклау үзгәрмәячәк.",
+       "protect-cascadeon": "Бу бит якланган, чөнки ул соңрак күрсәтелгән каскадлы яклаулы {{PLURAL:$1|1=биткә|битләргә}} керә. Бу битнең яклау дәрәҗәсен үзгәртү, аның каскадлы яклау дәрәҗәсен үзгәрмәячәк.",
        "protect-default": "Яклаусыз",
-       "protect-fallback": "«$1»нең рөхсәте кирәк",
-       "protect-level-autoconfirmed": "Яңа Ò»Ó\99м Ñ\82еÑ\80кÓ\99лмÓ\99гÓ\99н ÐºÑ\83лланÑ\83Ñ\87Ñ\8bлаÑ\80нÑ\8b ÐºÑ\8bÑ\81Ñ\83",
-       "protect-level-sysop": "Идарәчеләр генә",
+       "protect-fallback": "«$1» хокуклы кулланучыларга гына рөхсәт ителә",
+       "protect-level-autoconfirmed": "Ð\90вÑ\82омаÑ\82ик Ñ\80Ó\99веÑ\88Ñ\82Ó\99 Ñ\80аÑ\81ланган ÐºÑ\83лланÑ\83Ñ\87Ñ\8bлаÑ\80га Ð³Ñ\8bна Ñ\80Ó©Ñ\85Ñ\81Ó\99Ñ\82 Ð¸Ñ\82елÓ\99",
+       "protect-level-sysop": "Идарәчеләргә генә рөхсәт ителә",
        "protect-summary-cascade": "каскадлы",
        "protect-expiring": "$1 үтә (UTC)",
        "protect-expiry-indefinite": "Вакыт чикләнмәгән",
        "undeleteviewlink": "карау",
        "undeleteinvert": "Киресен сайлау",
        "undeletecomment": "Сәбәп:",
-       "undeletedrevisions": "{{PLURAL:$1|1=1 үзгәртү|$1 үзгәртү}} торгызылды",
+       "undeletedrevisions": "$1 {{PLURAL:$1|үзгәреш}} яңадан {{PLURAL:$1|торгызылды}}",
        "undelete-search-submit": "Эзләү",
        "undelete-error-long": "Файлны торгызу вакытында хаталар чыкты:\n\n$1",
        "undelete-show-file-submit": "Әйе",
        "contributions": "{{GENDER:$1|Кулланучының}} кертеме",
        "contributions-title": "$1 исемле кулланучының кертеме",
        "mycontris": "Кертем",
-       "contribsub2": "$1 ($2) өчен",
+       "anoncontribs": "Кертем",
+       "contribsub2": "Кертем {{GENDER:$3|$1}} ($2)",
        "uctop": "(хәзерге)",
        "month": "Айдан башлап (һәм элегрәк):",
        "year": "Елдан башлап (һәм элегрәк):",
        "whatlinkshere-hidelinks": "сылтамаларны $1",
        "whatlinkshere-hideimages": "$1 файл сылтамалары",
        "whatlinkshere-filters": "Фильтрлар",
-       "blockip": "Кулланучыны тыю",
+       "blockip": "{{GENDER:$1|Кулланучыны}} тыю",
        "blockip-legend": "Кулланучыны тыю",
        "ipaddressorusername": "IP адресы яки кулланучы исеме:",
        "ipbexpiry": "Бетә:",
        "unlockbtn": "Мәгълүматлар базасына язу мөмкинлеген кайтару",
        "move-page": "$1 — исемен алмаштыру",
        "move-page-legend": "Битне күчерү",
-       "movepagetext": "Астагы форманы куллану битнең исемен алыштырып, аның барлык тарихын яңа исемле биткә күчерер.\nИске исемле бит яңа исемле биткә юнәлтү булып калыр.\nСез иске исемгә юнәлтүләрне автоматик рәвештә яңа исемгә күчерә аласыз.\nӘгәр моны эшләмәсәгез, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өзелгән юнәлтүләрне]] тикшерегез.\nСез барлык сылтамаларның кирәкле җиргә сылтавына җаваплы.\n\nКүздә тотыгыз: әгәр яңа исем урынында бит булса инде, һәм ул буш яки юнәлтү түгел исә, бит '''күчерелмәячәк'''.\nБу шуны аңлата: сез ялгышып күчерсәгез, битне кайтара аласыз, әмма инде булган битне бетерә алмыйсыз.\n\n'''Игътибар!'''\nПопуляр битләрне күчерү зур һәм көтелмәгән нәтиҗәләргә китерә ала.\nДәвам иткәнче, барлык нәтиҗәләрне аңлавыгызны тагын бер кат уйлагыз.",
+       "movepagetext": "Астагы форманы куллану битнең исемен алыштырып, аның барлык тарихын яңа исемле биткә күчерер.\nИске исемле бит яңа исемле биткә юнәлтү булып калыр.\nСез иске исемгә юнәлтүләрне автоматик рәвештә яңа исемгә күчерә аласыз.\nӘгәр моны эшләмәсәгез, [[Special:DoubleRedirects|икеле]] һәм [[Special:BrokenRedirects|өзелгән юнәлтүләрне]] тикшерегез.\nСез барлык сылтамаларның кирәкле җиргә сылтавына җаваплы.\n\nКүздә тотыгыз: әгәр яңа исем урынында бит булса инде, һәм ул буш яки юнәлтү түгел исә, бит <strong>күчерелмәячәк</strong>.\nБу шуны аңлата: сез ялгышып күчерсәгез, битне кайтара аласыз, әмма инде булган битне бетерә алмыйсыз.\n\n<strong>Игътибар!</strong>\nПопуляр битләрне күчерү зур һәм көтелмәгән нәтиҗәләргә китерә ала.\nДәвам иткәнче, барлык нәтиҗәләрне аңлавыгызны тагын бер кат уйлагыз.",
        "movepagetalktext": "Бу битнең бәхәс бите дә күчереләчәк, '''бу очраклардан тыш''':\n*Андый исемле буш булмаган бәхәс бите бар инде, яисә\n*Сез астагы флажокны куймагансыз.\n\nБу очракларда сезгә битләрне үз кулыгыз белән күчерергә яки кушарга туры килер.",
        "movenotallowed": "Сездә мәкаләләрне күчерү хокуклары юк.",
-       "newtitle": "Яңа Ð±Ð°Ñ\88лам:",
+       "newtitle": "Яңа Ð¸Ñ\81ем:",
        "move-watch": "Бу битне күзәтү",
        "movepagebtn": "Битне күчерү",
        "pagemovedsub": "Бит күчерелде",
        "movelogpage": "Күчерү көндәлеге",
        "movereason": "Сәбәп:",
        "revertmove": "кире кайту",
-       "delete_and_move": "Бетерү һәм исемен алмаштыру",
-       "delete_and_move_reason": "Күчерүне мөмкин итәр өчен бетерелде",
+       "delete_and_move_reason": "Күчерүне мөмкин итәр өчен бетерелде «[[$1]]»",
        "move-leave-redirect": "Юнәлтү калдырылсын",
        "export": "Битләрне чыгаруы",
        "export-submit": "Экспортлау",
        "newimages-legend": "Фильтр",
        "ilsubmit": "Эзләү",
        "hours": "{{PLURAL:$1|$1 cәгать|$1 cәгать}}",
+       "ago": "$1 элек",
        "hours-ago": "$1 cәгать элек",
        "minutes-ago": "$1 минут элек",
        "bad_image_list": "Киләчәк рәвеш кирәк:\n\nИсемлек кисәкләре генә (* символыннан башланучы юллар) саналырлар.\nЮлның беренче сылтамасы куйма өчен тыелган рәсемгә сылтама булырга тиеш.\nШул ук юлның киләчәк сылтамалары чыгармалар, рәсемгә тыелмаган битләре, саналырлар.",
        "htmlform-submit": "Җибәрү",
        "htmlform-reset": "Үзгәртүләрне кире кайтару",
        "htmlform-selectorother-other": "Башка",
+       "htmlform-cloner-delete": "Бетерү",
        "logentry-delete-delete": "$1 $3 битен {{GENDER:$2|бетерә}}",
        "revdelete-content-hid": "эчтәлек яшерелгән",
        "revdelete-summary-hid": "төзәтмәнең тасвирламасы яшерелгән",
        "logentry-patrol-patrol-auto": "$1 $3 мәкаләсенең $4 санлы версиясен автоматик рәвештә {{GENDER:$2|тикшерде}}",
        "logentry-newusers-newusers": "{{GENDER:$2|Кулланучы}} $1 хисап язмасын төзеде",
        "logentry-newusers-create": "{{GENDER:$2|Кулланучы}} $1 хисап язмасын төзеде",
-       "logentry-newusers-create2": "$1 $3 кулланучы хисап язмасын төзеде",
-       "logentry-newusers-autocreate": "Автоматик рәвештә $1 хисап язмасы төзелде.",
+       "logentry-newusers-create2": "$1 - $3 исемле хисап язмасы {{GENDER:$2|төзеде}}",
+       "logentry-newusers-autocreate": "{{GENDER:$2|кулланучының}} автоматик рәвештә $1 хисап язмасы төзелде",
        "logentry-upload-upload": "$1 {{GENDER:$2|йөкләде}} $3",
        "rightsnone": "(юк)",
        "revdelete-summary": "үзгәртүләр тасвирламасы",
        "api-error-unknownerror": "Билгесез хата: \"$1\".",
        "api-error-uploaddisabled": "Бу викидә файллар йөкләү мөмкинлеге сүндерелгән.",
        "api-error-verification-error": "Бәлки, бу файл бозылгандыр яки дөрес түгел киңәйтелмәгә ия.",
+       "duration-minutes": "$1 {{PLURAL:$1|минут}}",
+       "duration-hours": "$1 {{PLURAL:$1|сәгать}}",
+       "duration-days": "$1 {{PLURAL:$1|көн}}",
        "expandtemplates": "Үрнәкләрне ачу",
        "expand_templates_ok": "OK",
        "special-characters-group-latin": "Латин",
index b6a4003..05fd3b7 100644 (file)
@@ -8,7 +8,8 @@
                        "Urhixidur",
                        "לערי ריינהארט",
                        "아라",
-                       "Amire80"
+                       "Amire80",
+                       "Frhdkazan"
                ]
        },
        "tog-underline": "Sıltamalarnıñ astına sızu:",
@@ -23,8 +24,8 @@
        "tog-editsectiononrightclick": "Bülek isemenä tıçqannıñ uñ çirttermäse belän törtkäç üzgärtü bite açılsın (JavaScript kiräk)",
        "tog-watchcreations": "Tözegän bitlärem küzätü isemlegemä östälsen",
        "tog-watchdefault": "Üzgärtkän bitlärem küzätü isemlegemä östälsen",
-       "tog-watchmoves": "Küçergän bitlärem küzätü isemlegemä östälsen",
-       "tog-watchdeletion": "Beterelgän bitläremne küzätü isemlegemgä östäw",
+       "tog-watchmoves": "Küçerelgän bit häm fayllar küzätü isemlegemä östälsen",
+       "tog-watchdeletion": "Min betergän bitlär häm fayllar küzätü isemlegemä östälsen",
        "tog-minordefault": "Barlıq üzgärtülärne kileşü buyınça keçe dip bilgelänsen",
        "tog-previewontop": "Üzgärtü täräzäsennän östäräk bitne aldan qaraw ölkäsen kürsätelsen",
        "tog-previewonfirst": "Üzgärtü bitenä küçkändä başta aldan qaraw bite kürsätelsen",
        "newwindow": "(yaña täräzädä açıla)",
        "cancel": "Baş tartu",
        "moredotdotdot": "Däwamı…",
-       "mypage": "Şäxsi bitem",
-       "mytalk": "Bäxäsem",
+       "mypage": "Bit",
+       "mytalk": "Bäxäs",
        "anontalk": "Bu IP adresı öçen bäxäs bite",
        "navigation": "Küçü",
        "and": "&#32;häm",
        "actions": "Xäräkät",
        "namespaces": "İsemnär mäydanı",
        "variants": "Törlär",
+       "navigation-heading": "Navigatsiä menüsı",
        "errorpagetitle": "Xata",
        "returnto": "$1 bitenä qaytu.",
        "tagline": "{{SITENAME}} proyektınnan",
        "printableversion": "Bastıru versiäse",
        "permalink": "Daimi sıltama",
        "print": "Bastıru",
+       "view": "Qaraw",
+       "view-foreign": "$1'ta qaraw",
        "edit": "Üzgärtü",
        "create": "Tözü",
        "editthispage": "Bu bitne üzgärtü",
        "protect": "Yaqlaw",
        "protect_change": "üzgärtü",
        "protectthispage": "Bu bitne yaqlaw",
-       "unprotect": "Yaqlawnı beterü",
-       "unprotectthispage": "Bu bitneñ yaqlawın beterü",
+       "unprotect": "Yaqlawnı üzgärtü",
+       "unprotectthispage": "Bu bitneñ yaqlawın üzgärtü",
        "newpage": "Yaña bit",
        "talkpage": "Bit turında fiker alışu",
        "talkpagelinktext": "Bäxäs",
        "otherlanguages": "Başqa tellärdä",
        "redirectedfrom": "($1 bitennän yünältelde)",
        "redirectpagesub": "Başqa bitkä yünältü bite",
+       "redirectto": "Aldağı bitkä yünältü:",
        "lastmodifiedat": "Bu bitne soñğı üzgärtü: $2, $1.",
        "viewcount": "Bu bitkä $1 {{PLURAL:$1|tapqır}} möräcäğät ittelär.",
        "protectedpage": "Yaqlanğan bit",
        "pool-timeout": "Qısılunıñ  waqıtı uzdı",
        "pool-queuefull": "Sorawlarnı saqlaw  bite tulı",
        "pool-errorunknown": "Bilgesez  xata",
+       "poolcounter-usage-error": "Qullanılış xatası: $1",
        "aboutsite": "{{SITENAME}} turında",
        "aboutpage": "Project:Taswirlama",
-       "copyright": "Mäğlümat $1 buyınça taratıla.",
+       "copyright": "Başqası belderelmägändä mäğlümat $1 nigezendä taratıla.",
        "copyrightpage": "{{ns:project}}:Avtorlıq xoquqları",
        "currentevents": "Xäzerge waqıyğalar",
        "currentevents-url": "Project:Xäzerge waqıyğalar",
        "disclaimers": "Cawaplılıqtan baş tartu",
        "disclaimerpage": "Project:Cawaplılıqtan baş tartu",
        "edithelp": "Üzgärtü buyınça yärdäm",
+       "helppage-top-gethelp": "Yärdäm",
        "mainpage": "Baş bit",
        "mainpage-description": "Baş bit",
        "policy-url": "Project:Qäğidälär",
        "toc": "Eçtälek",
        "showtoc": "kürsätü",
        "hidetoc": "yäşerü",
+       "collapsible-collapse": "Qaplarğa",
+       "collapsible-expand": "Açırğa",
+       "confirmable-yes": "Äye",
+       "confirmable-no": "Yuq",
        "thisisdeleted": "$1 qararğa yäki torğızırğa telisezme?",
        "viewdeleted": "$1 qararğa telisezme?",
        "restorelink": "{{PLURAL:$1|1 beterelgän üzgärtüne|$1 beterelgän üzgärtüne}}",
        "nstab-template": "Ürnäk",
        "nstab-help": "Yärdäm",
        "nstab-category": "Törkem",
+       "mainpage-nstab": "Baş bit",
        "nosuchaction": "Mondıy ğämäl yuq",
        "nosuchactiontext": "URLda kürsätelgän ğämäl xatalı.\nSez URLnı xatalı cıyğan yäisä xatalı sıltamadan küçkän bulırğa mömkinsez.\nBu şulay uq {{SITENAME}} proyektındağı xata säbäple dä bulırğa mömkin.",
        "nosuchspecialpage": "Mondıy maxsus bit yuq",
        "nospecialpagetext": "<strong>Sez sorıy torğan maxsus bit yuq.</strong>\n\nMaxsus bitlär isemlegen qarağız: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Xata",
        "databaseerror": "Mäğlümatlar bazasında xata",
+       "databaseerror-function": "Funktsiä: $1",
+       "databaseerror-error": "Xata: $1",
        "laggedslavemode": "İğtibar: bittä soñğı yañartular kürsätelmägän bulırğa mömkin.",
        "readonly": "Mäğlümatlar bazasına yazu yabılğan",
        "enterlockreason": "Yabılu säbäben häm waqıtın kürsätegez.",
        "perfcachedts": "Bu mäğlümatlar keştan alınğan, ul soñğı tapqır $1 yañartıldı. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Xäzer bu bitne yañartıp bulmıy. Monda kürsätelgän mäğlümatlar qabul itelmäyäçäk.",
        "viewsource": "Qaraw",
+       "viewsource-title": "$1 çığanağın qaraw",
        "actionthrottled": "Tizlek kimetelgän",
        "actionthrottledtext": "Spamğa qarşı köräş öçen az waqıt eçendä bu ğämälne yış qullanu tıyılğan. Zinhar, soñaraq qabatlağız.",
        "protectedpagetext": "Bu bit üzgärtü öçen yabıq.",
        "virus-scanfailed": "skanerlaw xatası ($1 kodı)",
        "virus-unknownscanner": "bilgesez antivirus:",
        "logouttext": "'''Sez xisap yazmağızdan çıqtığız.'''\n\nSez {{SITENAME}} proyektında anonim räweştä qala yäisä şul uq yäki başqa isem belän yañadan <span class='plainlinks'>[$1 kerä]</span> alasız.\nQayber bitlär Sez kergän kebek kürsätelergä mömkin. Monı beterü öçen brauzer keşın çistartığız.",
+       "welcomeuser": "Räxim itegez, $1!",
        "yourname": "Qullanuçı iseme:",
+       "userlogin-yourname": "Xisap yazması",
+       "userlogin-yourname-ph": "Xisap yazmağıznı kertegez",
+       "createacct-another-username-ph": "Xisap yazmağıznı kertegez",
        "yourpassword": "Sersüz:",
+       "userlogin-yourpassword": "Sersüz",
+       "userlogin-yourpassword-ph": "Sersüzegezne kertegez",
+       "createacct-yourpassword-ph": "Sersüzne kertegez",
        "yourpasswordagain": "Sersüzne qabat kertü:",
+       "createacct-yourpasswordagain": "Sersüzegezne raslağız",
+       "createacct-yourpasswordagain-ph": "Sersüzne yañadan kertegez",
        "remembermypassword": "Xisap yazmamnı bu brauzerda saqlansın (iñ küp $1 {{PLURAL:$1|kön|kön|kön}}gä qädär)",
        "yourdomainname": "Sezneñ domenığız:",
        "externaldberror": "Tışqı mäğlümat bazası yärdämendä awtentifikatsiä ütkändä xata çıqtı, yäisä tışqı xisap yazmağızğa üzgäreşlär kertü xoquqığız yuq.",
        "createaccount": "Yaña qullanuçı terkäw",
        "gotaccount": "Sez inde terkäldegezme? '''$1'''.",
        "gotaccountlink": "Kerü",
-       "createaccountmail": "elektron poçta aşa",
+       "userlogin-resetpassword-link": "Sersüzegezne onıttığızmı?",
+       "createacct-emailrequired": "Email adresı",
+       "createacct-emailoptional": "Email adresı (kürsätü mäcbür tügel)",
+       "createacct-email-ph": "Elektron xatlaşu adresığıznı kertegez",
+       "createacct-another-email-ph": "Elektron xatlaşu adresığıznı kertegez",
+       "createaccountmail": "Waqıtlıça oçraqlı sersüz qullan häm anı kürsätelgän elektron xatlaşu adresına yulla",
+       "createacct-realname": "Çın isemegez (kürsätü mäcbüri tügel)",
        "createaccountreason": "Säbäp:",
+       "createacct-reason": "Säbäp",
+       "createacct-reason-ph": "İkençe xisap yazmanı buldıru säbäben",
+       "createacct-submit": "Xisap yazmağıznı tözegez",
+       "createacct-another-submit": "Xisap yazmanı tözü",
+       "createacct-benefit-heading": "{{SITENAME}} sezneñ kebek keşelär tarafınnan buldırıla.",
+       "createacct-benefit-body1": "{{PLURAL:$1|üzgärtü}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|bit}}",
        "badretype": "Kertelgän sersüzlär ber ük tügel.",
        "userexists": "Kertelgän isem qullanıla.\nZinhar, başqa isem saylağız.",
        "loginerror": "Kerü xatası",
        "login-throttled": "Sez artıq küp tapqır kerergä tırıştığız.\nYañadan qabatlağançı beraz kötüegez sorala.",
        "loginlanguagelabel": "Tel: $1",
        "suspicious-userlogout": "Sezneñ eşçänlekne beterü sorawığız kire qağıldı, çönki ul yalğış brauzer yäisä keşlawçı proksi aşa cibärelerge mömkin.",
+       "pt-login": "Kerü",
+       "pt-login-button": "Kerü",
+       "pt-createaccount": "Xisap yazmanı tözü",
+       "pt-userlogout": "Çığu",
        "changepassword": "Sersüzne üzgärtü",
        "resetpass_announce": "Sez elektron poçta aşa waqıtlıça birelgän sersüz yärdämendä kerdegez. Sistemağa kerüne tögälläw öçen yaña sersüz tözegez.",
        "resetpass_text": "<!-- Monda tekst östägez -->",
        "preview": "Aldan qaraw",
        "showpreview": "Aldan qaraw",
        "showdiff": "Kertelgän üzgärtülär",
-       "anoneditwarning": "'''İğtibar''': Sez sistemağa kermägänsez. IP adresığız bu bitneñ tarixına yazılaçaq.",
+       "anoneditwarning": "<strong>İğtibar:</strong> Sez sistemağa kermägänsez. Üzgärtülär yasasağız, IP adresığız bu bitneñ tarixına yazılaçaq. <strong>[$1 Sistemağa kerü]</strong> yäki <strong>[$2 xisap yazmanı törkäw]</strong> ğämälen qılsağız, başqa östenleklärdän tış üzgärtüläregez qullanuçı xisap yazması isemegezgä bäyle bulaçaq.",
        "anonpreviewwarning": "''Sez sistemada terkälmädegez.Sezneñ taraftan eşlängän barlıq üzgärtülär dä sezneñ IP-yullamağıznı saqlawğa kiterä.''",
        "missingsummary": "'''İskärtü.''' Sez üzgärtügä qısqaça taswirlaw yazmadığız. Sez «Bitne saqlaw» töymäsenä tağın ber tapqır bassağız, üzgärtülär taswirlamasız saqlanaçaq.",
        "missingcommenttext": "Asqa taswirlama yazuığız sorala.",
        "newarticletext": "Sez älegä yazılmağan bitkä kerdegez.\nYaña bit yasaw öçen astağı täräzädä mäqälä tekstın cıyığız ([$1 yärdäm biten] qarıy alasız).\nÄgär sez bu bitkä yalğışlıq belän eläkkän bulsağız, brauzerığıznıñ '''artqa''' töymäsenä basığız.",
        "anontalkpagetext": "----''Bu bäxäs bite sistemada terkälmägän yäisä üz iseme belän kermägän qullanuçınıqı.\nAnı tanu öçen IP adresı faydalanıla.\nÄgär sez anonim qullanuçı häm sezgä yullanmağan xäbärlär aldım dip sanıysız ikän (ber IP adresı küp qullanuçı öçen bulırğa mömkin), başqa mondıy añlaşılmawçanlıqlar kilep çıqmasın öçen [[Special:UserLogin|sistemağa keregez]] yäisä [[Special:UserLogin/signup|terkälegez]].''",
        "noarticletext": "Xäzerge waqıtta bu bittä tekst yuq.\nSez [[Special:Search/{{PAGENAME}}|bu isem kergän başqa mäqälälärne]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} köndäleklärdäge yazmalarnı] taba\nyäki '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} şuşındıy isemle yaña bit tözi]'''</span> alasız.",
-       "noarticletext-nopermission": "Xäzerge waqıtta bu bittä tekst yuq.\nSez [[Special:Search/{{PAGENAME}}|bu isem kergän başqa mäqälälärne]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} köndäleklärdäge yazmalarnı] taba alasız.</span>",
+       "noarticletext-nopermission": "Xäzerge waqıtta bu bittä tekst yuq.\n[[Special:Search/{{PAGENAME}}|Bu başlam qullanılğan başqa bitlärne]] yäki\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} köndäleklärdäge yazmalarnı] ezläp ala alasız</span>, läkin bu bitne tözü röxsätegez yuq.",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» isemle xisap yazması yuq. Sez çınlap ta bu bitne yasarğa yäisä üzgärtergä telisezme?",
        "userpage-userdoesnotexist-view": "\"$1\" isemle xisap yazması yuq.",
        "blocked-notice-logextract": "Bu qullanuçı xäzergä tıyıldı.\nTübändä tıyu köndälegeneñ soñğı yazu birelgän:",
        "edit-gone-missing": "Bitne yañartıp bulmıy.\nUl beterelgän bulırğa mömkin.",
        "edit-conflict": "Üzgärtülär konfliktı.",
        "edit-no-change": "Tekstta üzgäeşlär yasalmaw säbäple, sezneñ üzgärtü kire qağıla.",
+       "postedit-confirmation-saved": "Kertelgän üzgärtmägez saqlanıldı.",
        "edit-already-exists": "Yaña bit tözep bulmıy.\nUl inde bar.",
        "expensive-parserfunction-warning": "'''İğtibar:''' bu bittä xäterne yış qullanuçı funksiälär artıq küp.\n\nÇikläw: $2 {{PLURAL:$2|qullanu}}, bu oçraqta {{PLURAL:$1|$1 tapqır}} başqarırğa röxsät itelä.",
        "expensive-parserfunction-category": "Xäterne yış qullanuçı funksiälär küp bulğan bitlär",
        "mergehistory-reason": "Säbäp:",
        "mergelog": "Berläşterülär köndälege",
        "revertmerge": "Bülü",
-       "history-title": "$1 biteneñ üzgärtü tarixı",
+       "history-title": "$1 biteneñ üzgärtelü tarixı",
        "lineno": "$1 yul:",
        "compareselectedversions": "Saylanğan yuramalarnı çağıştıru",
        "showhideselectedversions": "Saylanğan yuramalarnı kürsätü/yäşerü",
        "notextmatches": "Tiñdäş tekstlı bitlär yuq",
        "prevn": "aldağı {{PLURAL:$1|$1}}",
        "nextn": "çirattağı {{PLURAL:$1|$1}}",
+       "shown-title": "Bitkä $1 {{PLURAL:$1|yul}} kürsät",
        "viewprevnext": "Kürsätelüe: ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-new": "'''«[[:$1]]»  isemle yaña bit yasaw'''",
        "searchprofile-articles": "Töp bitlär",
        "powersearch-togglenone": "Birni dä yuq",
        "search-external": "Tışqı ezläw",
        "preferences": "Köylänmälär",
-       "mypreferences": "Köylänmälärem",
+       "mypreferences": "Köylänmälär",
        "prefs-edits": "Üzgärtülär isäbe:",
        "prefs-skin": "Küreneş",
        "skin-preview": "Aldan qaraw",
        "action-createtalk": "bäxäs biten yasarğa",
        "action-move": "bu bitne küçererge",
        "nchanges": "$1 {{PLURAL:$1|üzgärtü|üzgärtü}}",
+       "enhancedrc-history": "tarixı",
        "recentchanges": "Soñğı üzgärtülär",
        "recentchanges-legend": "Soñğı üzgärtülär köyläwläre",
        "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ü",
+       "recentchanges-label-bot": "Bu üzgärtmä bot tarafınnan yasaldı",
+       "recentchanges-label-unpatrolled": "Bu üzgärtmä älegä raslanmağan",
+       "recentchanges-label-plusminus": "Bit zurlığınıñ baytlardağı üzgäreş",
+       "recentchanges-legend-heading": "'''Añlatma:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (şulay uq [[Special:NewPages|yaña bitlär isemlegen]] qarap alığız)",
        "rcnotefrom": "Astaraq '''$2''' başlap ('''$1''' qädär) üzgärtülär kürsätelgän.",
        "rclistfrom": "$3 $2 başlap yaña üzgärtülärne kürsät",
        "rcshowhideminor": "keçe üzgärtülärne $1",
+       "rcshowhideminor-show": "Kürsätü",
+       "rcshowhideminor-hide": "Yäşerü",
        "rcshowhidebots": "botlarnı $1",
-       "rcshowhideliu": "kergän qullanuçılarnı $1",
+       "rcshowhidebots-show": "Kürsätü",
+       "rcshowhidebots-hide": "Yäşerü",
+       "rcshowhideliu": "$1 terkälgän qullanuçı",
+       "rcshowhideliu-hide": "Yäşerü",
        "rcshowhideanons": "kermägän qullanuçılarnı $1",
+       "rcshowhideanons-show": "Kürsätü",
+       "rcshowhideanons-hide": "Yäşerü",
        "rcshowhidepatr": "tikşerergän üzgärtülärne $1",
        "rcshowhidemine": "minem üzgärtüläremne $1",
+       "rcshowhidemine-show": "Kürsätü",
+       "rcshowhidemine-hide": "Yäşerü",
        "rclinks": "Soñğı $2 kön eçendä soñğı $1 üzgärtüne kürsät<br />$3",
        "diff": "ayırma",
        "hist": "tarix",
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|küzätep tora qullanuçı}}]",
        "rc_categories": "Törkemnärdä genä tora («|» bülüçe)",
        "rc_categories_any": "Härber",
+       "rc-change-size-new": "üzgäreştän soñ $1 {{PLURAL:$1|bayt}}",
        "newsectionsummary": "/* $1 */ yaña bülek",
        "rc-enhanced-expand": "Waqlıqlarnı kürsätü (JavaScript kiräk)",
        "rc-enhanced-hide": "Waqlıqlarnı yäşerü",
        "filename-bad-prefix": "Faylnıñ iseme '''«$1»''' dip başlana. Zinhar, faylnı taswirlawçı isem biregez.",
        "filename-prefix-blacklist": " #<!-- niçek bar şulay qaldırığız --> <pre>\n# Sintaksis töbändägeçä:\n#   *  «#» dip başlanğan barlıq närsä dä qömmentariy dip atalaçaq\n#   * Härber buş rät — faylnıñ isemeneñ prefiksı, sifrlı kamera birüçe isem\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # qaysıber käräzle telefonnar\nIMG # barlıq\nJD # Jenoptik\nMGP # Pentax\nPICT # törle\n #</pre> <!-- niçek bar şulay qaldırığız -->",
        "upload-success-subj": "Yökläw äybät ütte",
+       "upload-form-label-usage-title": "Qullanılış",
+       "foreign-structured-upload-form-label-infoform-categories": "Törkemnär",
+       "foreign-structured-upload-form-label-infoform-date": "Data",
        "license": "Litsenziäse:",
        "license-header": "Litsenziäse",
        "nolicense": "Yuq",
        "filehist-dimensions": "Zurlıq",
        "filehist-filesize": "Faylnıñ zurlığı",
        "filehist-comment": "İskärmä",
-       "imagelinks": "Faylğa sıltamalar",
+       "imagelinks": "Fayl qullanışı",
        "linkstoimage": "Bu faylğa älege {{PLURAL:$1|bit|$1 bit}} sıltıy:",
        "nolinkstoimage": "Bu faylğa sıltağan bitlär yuq.",
        "duplicatesoffile": "{{PLURAL:$1|Älege $1 fayl }} astağı faylnıñ küçerelmäse bulıp tora ([[Special:FileDuplicateSearch/$2|tulıraq]]):",
        "filepage-nofile-link": "Mondıy isemle fayl  yuq. Sez anı [$1 yökli alasız].",
        "uploadnewversion-linktext": "Bu faylnıñ yaña yuramasın yökläw",
        "shared-repo-from": "$1 dän",
+       "upload-disallowed-here": "Bu faylnı almaştıra almıysız.",
        "filerevert": "$1 yuramasına kire qaytu",
        "filerevert-legend": "Faylnıñ iske yuramasın kire qaytaru",
        "filerevert-comment": "Säbäp:",
        "suppress": "Yäşerü",
        "booksources": "Kitap çığanaqları",
        "booksources-search-legend": "Kitap çığanaqlarını ezläw",
+       "booksources-search": "Ezläw",
        "booksources-text": "Älege bittä kürsätelgän sıltamalar yärämendä sezneñ qızıqsındırğan kitap buyınça östämä mäğlümatlar tabarğa mömkin. Bolar internet-kibetlär häm kitapxanä cıyıntığında ezläwçe sistemalar.",
        "booksources-invalid-isbn": "Birelgän ISBN sanı bälki xataldır. Zinhar, birelgän sannarnı yañadan tikşeregez.",
        "specialloguserlabel": "Qullanuçı:",
        "listgrouprights-helppage": "Help:Törkemnärneñ xoquqları",
        "listgrouprights-members": "(törkem isemlege)",
        "emailuser": "Bu qullanuçığa xat",
-       "emailpage": "Qullanuçığa xat cibärü",
        "defemailsubject": "{{SITENAME}}: xat",
        "noemailtitle": "Elektron poçta adresı yuq",
        "emailfrom": "Kemnän:",
        "emailsent": "Xat cibärelgän",
        "emailsenttext": "E-mail xatığız ciberelde.",
        "watchlist": "Küzätü isemlegem",
-       "mywatchlist": "Küzätü isemlegem",
+       "mywatchlist": "Küzätü isemlege",
        "nowatchlist": "Küzätü isemlegegezdä bitlär yuq.",
        "watchnologin": "Kermädegez",
        "addedwatchtext": "\"[[:$1]]\" bite [[Special:Watchlist|küzätü isemlegegezgä]] östälde.\nBu bittä häm anıñ bäxäslegendä barlıq bulaçaq üzgärtülär şunda kürsäteler, häm, [[Special:RecentChanges|soñğı üzgärtülär]] isemlegendä bu bitne ciñelräk tabu öçen, ul '''qalın mäten''' belän kürsäteler.",
        "notanarticle": "Mäqälä tügel",
        "watchlist-details": "Küzätü isemlegegezdä, bäxäs bitlären sanamıyça, {{PLURAL:$1|$1 bit|$1 bit}} bar.",
        "wlshowlast": "Bayağı $1 säğät $2 kön eçendä yäki nı kürsät",
+       "watchlistall2": "barlıq",
+       "watchlist-hide": "Yäşerü",
        "watchlist-options": "Küzätü isemlege köyläwläre",
        "watching": "Küzätü isemlegemä östäwe…",
        "unwatching": "Küzätü isemlegemnän çığaruı…",
        "rollbacklink": "kire qaytaru",
        "editcomment": "Üzgärtü öçen taswir: \"''$1''\".",
        "revertpage": "[[Special:Contributions/$2|$2]] üzgärtüläre ([[User talk:$2|bäxäs]])  [[User:$1|$1]] yuramasına kire qaytarıldı",
+       "changecontentmodel-title-label": "Bitneñ iseme",
+       "changecontentmodel-reason-label": "Säbäp:",
        "protectlogpage": "Yaqlanu köndälege",
        "protectedarticle": "«[[$1]]» yaqlanğan",
        "modifiedarticleprotection": "\"[[$1]]\" bite öçen yaqlaw däräcäse üzgärtelde",
        "undelete-show-file-submit": "Äye",
        "namespace": "İsemnär mäydanı:",
        "invert": "Kiresen saylaw",
+       "tooltip-invert": "Saylanğan isem qırlarına qarağan bitlärgä (häm bu isem qırına da) kertelgän üzgärtmälärne kürsätmäw öçen bu saylaw tartmasın bilgelägez",
        "blanknamespace": "(Töp)",
-       "contributions": "Qullanuçınıñ kerteme",
+       "contributions": "{{GENDER:$1|Qullanuçınıñ}} kerteme",
        "contributions-title": "$1 isemle qullanuçınıñ kerteme",
-       "mycontris": "Kertemem",
+       "mycontris": "Kertem",
        "contribsub2": "$1 ($2) öçen",
        "uctop": "(axırğı)",
        "month": "Aydan başlap (häm elegräk):",
        "nolinkshere": "'''[[:$1]]''' bitenä başqa bitlär sıltamıylar.",
        "isredirect": "yünältü bite",
        "istemplate": "kertülär",
-       "isimage": "räsem öçen sıltama",
+       "isimage": "fayl qullanılışı",
        "whatlinkshere-prev": "{{PLURAL:$1|aldağı|aldağı $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|çirattağı|çirattağı $1}}",
        "whatlinkshere-links": "← sıltamalar",
        "ipb-unblock": "Qullanuçı yäki IP adresı tıyudan azat itü",
        "unblockip": "Qullanuçını tıyudan azat itü",
        "ipusubmit": "Bu tıyunı tuqtatu",
-       "ipblocklist": "Tıyılğan IP adresları häm qullanuçı isemnäre",
+       "blocklist": "Tıyılğan qullanuçılar",
+       "ipblocklist": "Tıyılğan qullanuçılar",
+       "blocklist-reason": "Säbäp",
        "ipblocklist-submit": "Ezläw",
        "infiniteblock": "bilgele ber waqıtsız",
        "blocklink": "tıyu",
        "move-page-legend": "Bitne küçerü",
        "movepagetext": "Astağı formanı qullanu bitneñ isemen alıştırıp, anıñ barlıq tarixın yaña isemle bitkä küçerer.\nİske isemle bit yaña isemle bitkä yünältü bulıp qalır.\nSez iske isemgä yünältülärne avtomatik räweştä yaña isemgä küçerä alasız.\nÄgär monı eşlämäsägez, [[Special:DoubleRedirects|ikele]] häm [[Special:BrokenRedirects|özelgän yünältülärne]] tikşeregez.\nSez barlıq sıltamalarnıñ kiräkle cirgä sıltawına cawaplı.\n\nKüzdä totığız: ägär yaña isem urınında bit bulsa inde, häm ul buş yäki yünältü tügel isä, bit '''küçerelmäyäçäk'''.\nBu şunı añlata: sez yalğışıp küçersägez, bitne qaytara alasız, ämma inde bulğan bitne beterä almıysız.\n\n'''İğtibar!'''\nPopulyar bitlärne küçerü zur häm kötelmägän näticälärgä kiterä ala.\nDäwam itkänçe, barlıq näticälärne añlawığıznı tağın ber qat uylağız.",
        "movepagetalktext": "Bu bitneñ bäxäs bite dä küçereläçäk, '''bu oçraqlardan tış''':\n*Andıy isemle buş bulmağan bäxäs bite bar inde, yäisä\n*Sez astağı flajoqnı quymağansız.\n\nBu oçraqlarda sezgä bitlärne üz qulığız belän küçerergä yäki quşarğa turı kiler.",
-       "movearticle": "Bitne küçerü:",
        "movenotallowed": "Sezdä mäqälälärne küçerü xoquqları yuq.",
        "newtitle": "Yaña başlam:",
        "move-watch": "Bu bitne küzätü",
        "movelogpage": "Küçerü köndälege",
        "movereason": "Säbäp:",
        "revertmove": "kire qaytu",
-       "delete_and_move": "Beterü häm isemen almaştıru",
        "delete_and_move_reason": "Küçerüne mömkin itär öçen beterelde",
        "move-leave-redirect": "Yünältü qaldırılsın",
        "export": "Bitlärne çığaruı",
        "allmessages-filter-modified": "Üzgärtelgän",
        "allmessages-language": "Tel:",
        "allmessages-filter-submit": "Küçü",
+       "allmessages-filter-translate": "Tärcemä itü",
        "thumbnail-more": "Zuraytu",
        "filemissing": "Fayl tabılmadı",
        "thumbnail_error": "Keçkenä sürät tözüe xatası: $1",
        "import": "Bitlärne yökläw",
+       "import-interwiki-sourcewiki": "Çığanaq wiki:",
+       "import-interwiki-sourcepage": "Çığanaq bit:",
        "import-interwiki-submit": "İmportlaw",
        "import-upload-filename": "Fayl iseme:",
        "import-comment": "İskärmä:",
        "tooltip-pt-mycontris": "Sezneñ kertemengezne isemlege",
        "tooltip-pt-login": "Sez xisap yazması tözi alır idegez, ämma bu mäcbüri tügel.",
        "tooltip-pt-logout": "Çığu",
+       "tooltip-pt-createaccount": "Üzegezneñ xisap yazmanı tözep sistemağa anıñ belän kerergä çaqırabız; şulay da bu mäcbüri tügel",
        "tooltip-ca-talk": "Bitneñ eçtälege turında bäxäs",
-       "tooltip-ca-edit": "Sez bu bit üzgärtä alasız. Zinhar, saqlağançı qarap alunı qullanığız.",
+       "tooltip-ca-edit": "Bu bitne üzgärtü",
        "tooltip-ca-addsection": "Yaña bülek başlaw",
        "tooltip-ca-viewsource": "Bu bit üzgärtüdän yaqlanğan. Sez anıñ çığanaq tekstın ğına qarıy alasız.",
        "tooltip-ca-history": "Bitneñ tözätmälär isemlege",
        "tooltip-feed-atom": "Bu bit öçen Atom translyatsiäse",
        "tooltip-t-contributions": "Qullanuçı kertemeneñ isemlegene qaraw",
        "tooltip-t-emailuser": "Bu qullanuçığa xat cibärü",
+       "tooltip-t-info": "Bu bit turında östämä mäğlümat",
        "tooltip-t-upload": "Fayllarnı yökläw",
        "tooltip-t-specialpages": "Barlıq maxsus bitlär isemlege",
        "tooltip-t-print": "Bu bitneñ bastıru versiäse",
        "tooltip-ca-nstab-main": "Mäqäläneñ eçtälege",
        "tooltip-ca-nstab-user": "Qullanuçınıñ şäxsi bite",
        "tooltip-ca-nstab-media": "Media-fayl",
-       "tooltip-ca-nstab-special": "Bu maxsus bit, sez anı Ã¼zgärtü almıysız",
+       "tooltip-ca-nstab-special": "Bu maxsus bit, sez anı Ã¼zgärtä almıysız",
        "tooltip-ca-nstab-project": "Proyektnıñ bite",
        "tooltip-ca-nstab-image": "Sürätneñ bite",
        "tooltip-ca-nstab-mediawiki": "MediaWiki - xat bite",
        "siteusers": "{{SITENAME}} {{PLURAL:$2|qullanuçısı|qullanuçıları}} $1",
        "creditspage": "Räxmätlär",
        "spamprotectiontitle": "Spam filtrı",
+       "simpleantispam-label": "Anti-spam tikşerüe.\nBu urınğa simvollar kert<strong>mä</strong>gez!",
+       "pageinfo-header-edits": "Üzgärtülär tarixı",
+       "pageinfo-toolboxlink": "Bit turında mäğlümat",
+       "pageinfo-contentpage-yes": "Äye",
+       "pageinfo-protect-cascading-yes": "Äye",
+       "pageinfo-category-pages": "Bitlär sanı",
+       "pageinfo-category-subcats": "Astörkemnär sanı",
+       "pageinfo-category-files": "Fayllar sanı",
+       "markaspatrolleddiff": "Tikşerelgän dip tamğalaw",
        "markaspatrolledtext": "Bu mäqäläne tikşerelgän dip tamğalaw",
        "markedaspatrolled": "Tikşerelgän dip tamğalandı",
        "markedaspatrolledtext": "Saylanğan [[:$1]] mäqäläseneñ älege yuraması tikşerelgän dip tamğalandı.",
        "file-info-size": "$1 × $2 noqta, faylnıñ zurlığı: $3, MIME tibı: $4",
        "file-nohires": "Yuğarı açıqlıq belän yurama yuq.",
        "svg-long-desc": "SVG faylı, şartlı $1 × $2 noqta, faylnıñ zurlığı: $3",
-       "show-big-image": "Tulı açıqlıq",
+       "show-big-image": "Original fayl",
+       "show-big-image-size": "$1 × $2 piksel",
        "newimages": "Yaña sürätlär cıyılması",
        "newimages-legend": "Filtr",
        "ilsubmit": "Ezläw",
        "metadata-fields": "Bu isemlekkä kergän metabirelmälär qırları räsem bitendä kürsäteler, qalğannarı isä kileşü buyınça yäşereler.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Kiñlek",
        "exif-imagelength": "Bieklek",
+       "exif-orientation": "Yünäleş",
+       "exif-datetime": "Faylnıñ üzgärtelü köne häm waqıtı",
        "exif-imagedescription": "Räsemneñ iseme",
        "exif-make": "Kameranıñ citeşterüçese",
        "exif-model": "Kameranıñ töre",
        "exif-gpsspeedref": "Tizlekne isäpläw berämlege",
        "exif-gpsspeed": "Xäräkät tizlege",
        "exif-gpsdatestamp": "Data",
+       "exif-languagecode": "Tel",
+       "exif-iimcategory": "Törkem",
+       "exif-usageterms": "Qullanu şartları",
+       "exif-exposureprogram-1": "Qullanma",
        "exif-meteringmode-255": "Başqa",
        "exif-lightsource-0": "Bilgesez",
        "exif-gaincontrol-0": "Yuq",
        "monthsall": "barlıq",
        "recreate": "Yañadan yasaw",
        "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-watch-top": "Bu bitne sezneñ küzätü isemlegezgä östärgäme?",
+       "confirm-unwatch-button": "OK",
+       "confirm-unwatch-top": "Bu bitne sezneñ küzätü isemlegezdän beterergäme?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← aldağı bit",
        "imgmultipagenext": "aldağı bit →",
        "imgmultigo": "Küçü!",
        "hijri-calendar-m1": "Möxärräm",
        "hijri-calendar-m7": "Racäb",
        "hijri-calendar-m9": "Ramazan",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|bäxäse]])",
        "version": "Yurama",
        "version-other": "Başqa",
        "version-license": "Litsenziä",
        "specialpages-group-spam": "Spamğa qarşı qorallar",
        "blankpage": "Buş bit",
        "intentionallyblankpage": "Bu bit maxsus buş qaldırılğan",
+       "tag-filter": "[[Special:Tags|Teglar]] filtrı:",
        "tag-filter-submit": "Filtrlaw",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Teg|Teglar}}]]: $2)",
+       "tags-title": "Teglar",
+       "tags-tag": "Teg iseme",
+       "tags-source-header": "Çığanağı",
+       "tags-active-yes": "Äye",
+       "tags-active-no": "Yuq",
        "tags-edit": "üzgärtü",
+       "tags-create-reason": "Säbäp:",
+       "tags-create-submit": "Tözü",
+       "tags-delete-title": "Tegnı beterü",
+       "tags-delete-reason": "Säbäp:",
+       "tags-activate-reason": "Säbäp:",
+       "tags-deactivate-reason": "Säbäp:",
+       "tags-edit-title": "Teglarnı üzgärtü",
+       "tags-edit-reason": "Säbäp:",
        "compare-submit": "Çağıştır",
        "dberr-problems": "Ğafu itegez! Saytta texnik qıyınlıqlar çıqtı.",
        "htmlform-submit": "Cibärü",
        "htmlform-reset": "Üzgärtülärne kire qaytaru",
        "htmlform-selectorother-other": "Başqa",
+       "htmlform-no": "Yuq",
+       "htmlform-yes": "Äye",
+       "htmlform-cloner-delete": "Çığaru",
        "revdelete-restricted": "çikläwlär idaräçelärgä dä qullanıla",
+       "logentry-newusers-create": "$1 qullanuçı xisap yazması {{GENDER:$2|tözelde}}",
        "rightsnone": "(yuq)",
-       "revdelete-summary": "üzgärtülär taswirlaması"
+       "revdelete-summary": "üzgärtülär taswirlaması",
+       "feedback-back": "Kire qaytu",
+       "feedback-cancel": "Baş tartu",
+       "feedback-close": "Yasaldı",
+       "feedback-error-title": "Xata",
+       "feedback-message": "Xäbär:",
+       "feedback-subject": "Tema:",
+       "feedback-submit": "Cibärü",
+       "feedback-thanks-title": "Räxmät!",
+       "searchsuggest-search": "Ezläw",
+       "expand_templates_output": "Näticä",
+       "expand_templates_ok": "OK",
+       "expand_templates_preview": "Aldan qaraw",
+       "pagelang-name": "Bit",
+       "pagelang-language": "Tel",
+       "mediastatistics-table-count": "Fayllar sanı",
+       "mediastatistics-header-unknown": "Bilgesez",
+       "mediastatistics-header-audio": "Audio",
+       "mediastatistics-header-video": "Videolar",
+       "special-characters-group-latin": "Latinça",
+       "special-characters-group-latinextended": "Kiñäytelgän latinça",
+       "special-characters-group-cyrillic": "Kirilça",
+       "special-characters-group-arabic": "Ğäräbçä"
 }
index 4f12c93..57ac62a 100644 (file)
@@ -8,7 +8,8 @@
                        "Sborsody",
                        "friends at tyvawiki.org",
                        "לערי ריינהארט",
-                       "아라"
+                       "아라",
+                       "Монгуш Салим"
                ]
        },
        "tog-underline": "Холбааны шыяры:",
        "underline-never": "Кажан-даа",
        "underline-default": "Кештиң азы веб-браузерниң ниити үнези",
        "editfont-default": "Веб-браузерниң ниити үнези",
-       "sunday": "Улуг хүн",
+       "sunday": "Улуг-хүн",
        "monday": "Бир дугаар хүн",
        "tuesday": "Ийи дугаар хүн",
        "wednesday": "Үш дугаар хүн",
        "thursday": "Дөрт дугаар хүн",
        "friday": "Беш дугаар хүн",
-       "saturday": "ЧаÑ\80Ñ\82Ñ\8bк Ñ\83лÑ\83г хүн",
+       "saturday": "Ð\90лдÑ\8b Ð´Ñ\83гааÑ\80 хүн",
        "sun": "Улуг-хүн",
        "mon": "Пн",
        "tue": "Вт",
        "thu": "Чт",
        "fri": "Пт",
        "sat": "Сб",
-       "january": "Бир ай",
-       "february": "ийи ай",
-       "march": "Үш ай",
-       "april": "Ð\94Ó©Ñ\80Ñ\82 Ð°Ð¹",
-       "may_long": "Ð\91еÑ\88 ай",
-       "june": "Ð\90лдÑ\8b Ð°Ð¹",
-       "july": "Чеди Ð°Ð¹",
-       "august": "СеÑ\81 Ð°Ð¹",
-       "september": "Тос ай",
-       "october": "Ð\9eн Ð°Ð¹",
-       "november": "Ð\9eн Ð±Ð¸Ñ\80 Ð°Ð¹",
-       "december": "Ð\9eн Ð¸Ð¹Ð¸ Ð°Ð¹",
+       "january": "январь",
+       "february": "февраль",
+       "march": "март",
+       "april": "апÑ\80елÑ\8c",
+       "may_long": "май",
+       "june": "иÑ\8eнÑ\8c",
+       "july": "иÑ\8eлÑ\8c",
+       "august": "авгÑ\83Ñ\81Ñ\82",
+       "september": "сентябрь",
+       "october": "окÑ\82Ñ\8fбÑ\80Ñ\8c",
+       "november": "ноÑ\8fбÑ\80Ñ\8c",
+       "december": "декабÑ\80Ñ\8c",
        "january-gen": "Бир айның",
-       "february-gen": "Ð\98йи Ð°Ð¹Ð½Ñ\8bÒ£",
+       "february-gen": "ФевÑ\80алÑ\8c",
        "march-gen": "Үш айның",
        "april-gen": "Дөрт айның",
        "may-gen": "Беш айның",
        "october-gen": "Он айның",
        "november-gen": "Он бир айның",
        "december-gen": "Он ийи айның",
-       "jan": "1 ай",
-       "feb": "2 ай",
-       "mar": "3 ай",
-       "apr": "4 ай",
-       "may": "ай",
-       "jun": "6 ай",
-       "jul": "7 ай",
-       "aug": "8 ай",
-       "sep": "9 ай",
-       "oct": "10 ай",
-       "nov": "11 ай",
-       "dec": "12 ай",
-       "pagecategories": "{{PLURAL:$1|Ð\90ңгÑ\8bлал}}",
-       "category_header": "«$1» Ð´ÐµÐ¿ Ð±Ó©Ð»Ò¯ÐºÑ\82Ò¯ң арыннары",
+       "jan": "январь",
+       "feb": "фев",
+       "mar": "март",
+       "apr": "апрель",
+       "may": "май",
+       "jun": "июнь",
+       "jul": "июль",
+       "aug": "август",
+       "sep": "сентябрь",
+       "oct": "октябрь",
+       "nov": "ноябрь",
+       "dec": "декабрь",
+       "pagecategories": "{{PLURAL:$1|Ð\9aаÑ\82егоÑ\80иÑ\8f\9aаÑ\82егоÑ\80иÑ\8fлаÑ\80}}",
+       "category_header": "«$1» ÐºÐ°Ñ\82егоÑ\80иÑ\8fнÑ\8bң арыннары",
        "subcategories": "Адаккы бөлүктер",
        "category-media-header": "«$1» деп бөлүкте файлдар",
        "category-empty": "''Амгы бо бөлүкте медиа база арыннар чок.''",
-       "hidden-categories": "{{PLURAL:$1|1=ЧажÑ\8bÑ\82 Ð°Ò£Ð³Ñ\8bлал|ЧажÑ\8bÑ\82 Ð°Ò£Ð³Ñ\8bлалдар}}",
+       "hidden-categories": "{{PLURAL:$1|1=Ð\9aөзүлбеÑ\81 ÐºÐ°Ñ\82егоÑ\80иÑ\8f\9aөзүлбеÑ\81 ÐºÐ°Ñ\82егоÑ\80иÑ\8fлар}}",
        "hidden-category-category": "Чажыт бөлүктер",
-       "category-subcat-count": "{{PLURAL:$2|1=Ð\91о Ð°Ò£Ð³Ñ\8bлал Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð°Ò£Ð³Ñ\8bламнÑ\8bг.|Ð\91о Ð°Ò£Ð³Ñ\8bлалдÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 Ð°Ò£Ð³Ñ\8bламнаÑ\80нÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан Ð´Ð°Ñ\80аазÑ\8bнда $1 Ð°Ò£Ð³Ñ\8bламнÑ\8b ÐºÓ©Ñ\80гүÑ\81кен.}}",
+       "category-subcat-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fлÑ\8bг.|Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð±Ð°Ñ\80-ла $2 Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fлаÑ\80нÑ\8bÒ£ $1 Ð´ÐµÐ¿ Ð¸Ñ\88Ñ\82ики ÐºÐ°Ñ\82егоÑ\80иÑ\8fзÑ\8b ÐºÓ©Ñ\81Ñ\82үп Ñ\82Ñ\83Ñ\80аÑ\80.}}",
        "category-subcat-count-limited": "Бо аңгылал {{PLURAL:$1|1=бир|$1}} аңгыламныг.",
-       "category-article-count": "{{PLURAL:$2|1=Ð\91о Ð°Ò£Ð³Ñ\8bлал Ñ\87үгле Ð´Ð°Ñ\80аазÑ\8bнда Ð°Ñ\80Ñ\8bннаÑ\80лÑ\8bг.|Ð\91о Ð°Ò£Ð³Ñ\8bлалдÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 Ð°Ñ\80Ñ\8bннаÑ\80Ñ\8bнÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан Ð´Ð°Ñ\80аазÑ\8bнда $1 Ð°Ñ\80Ñ\8bнÑ\8bн көргүскен.}}",
-       "category-file-count": "{{PLURAL:$2|1=Ð\91о Ð±Ó©Ð»Ò¯Ðº Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ñ\84айлдÑ\8bг.|Ð\91о Ð±Ó©Ð»Ò¯ÐºÑ\82Ò¯Ò£ Ð½Ð¸Ð¸Ñ\82и $2 файлының $1 файлын көргүскен.}}",
+       "category-article-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ð°Ñ\80Ñ\8bн Ð±Ð°Ñ\80.|Ук ÐºÐ°Ñ\82егоÑ\80иÑ\8fда Ð±Ð°Ñ\80 $2 Ð°Ñ\80Ñ\8bннаÑ\80Ñ\8bнÑ\8bÒ£ Ð°Ñ\80азÑ\8bндан}} |{{PLURAL:$1 Ð°Ñ\80Ñ\8bннÑ\8b ÐºÓ©Ñ\80гүÑ\81кен| $1 Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8b көргүскен.}}",
+       "category-file-count": "{{PLURAL:$2|1=Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\87үгле Ñ\87аңгÑ\8bÑ\81 Ñ\84айлдÑ\8bг.|Ð\91о ÐºÐ°Ñ\82егоÑ\80иÑ\8fнÑ\8bÒ£ Ñ\88Ñ\83пÑ\82Ñ\83 $2 файлының $1 файлын көргүскен.}}",
        "listingcontinuesabbrev": "(уланчы)",
        "noindex-category": "Индекстелбес арынар",
        "broken-file-category": "Ажылдавайн турар файл-шөлүлгелиг арыннар",
        "about": "Дугайында",
        "article": "Допчу арын",
-       "newwindow": "(чаа көзенээ ажыытынар)",
-       "cancel": "СокÑ\81ааÑ\80Ñ\8b",
+       "newwindow": "(чаа көзенекке)",
+       "cancel": "ЫнÑ\87анмаÑ\81",
        "moredotdotdot": "Артык...",
        "mypage": "Арын",
        "mytalk": "Чугаа",
        "faqpage": "Project:БлСА",
        "actions": "Кылыглар",
        "namespaces": "Аттар делгемнери",
-       "variants": "Бир янзы",
+       "variants": "Янзы-хевирлери",
+       "navigation-heading": "Навигация менюзу",
        "errorpagetitle": "Алдаг",
        "returnto": "«$1» деп арынже эглири.",
-       "tagline": "{{SITENAME}} деп веб-сайттан",
+       "tagline": "{{SITENAME}} сайттан",
        "help": "Дуза",
-       "search": "Диле",
+       "search": "Дилээр",
        "searchbutton": "Дилээр",
        "go": "Баары",
-       "searcharticle": "Ð\9aÒ¯Ò¯cедиÑ\80и",
+       "searcharticle": "Че-ве",
        "history": "Арынның төөгүзү",
        "history_short": "Төөгү",
-       "printableversion": "СаазÑ\8bнга Ò¯Ð½Ð´Ò¯Ñ\80еÑ\80ин ÐºÓ©Ó©Ñ\80Ò¯",
-       "permalink": "ТÑ\83Ñ\80Ñ\83м Ð°Ð¹Ñ\82Ñ\8bг",
+       "printableversion": "Ð\9fаÑ\80лап Ò¯Ð½Ð´Ò¯Ñ\80еÑ\80 Ñ\8fнзÑ\8bзÑ\8b",
+       "permalink": "Ð\94окÑ\82аамал Ñ\88өлүлге",
        "print": "Саазынга үндүрер",
-       "view": "Көөрү",
+       "view": "Көөр",
+       "view-foreign": "$1 сайттан көөр",
        "edit": "Эдер",
        "create": "Чогаадыры",
+       "create-local": "Кызыы тайылбыр немээр",
        "editthispage": "Бо арынны өскертири",
        "create-this-page": "Бо арынны чогаадыры",
        "delete": "Ыраары",
        "unprotectthispage": "Бо арынның камгалалын өскертири",
        "newpage": "Чаа арын",
        "talkpage": "Бо арын дугайында чугаалажыры",
-       "talkpagelinktext": "Чугаа",
+       "talkpagelinktext": "Чугаалажып сайгарар",
        "specialpage": "Тускай арын",
        "personaltools": "Хууда херекселдер",
        "articlepage": "Допчу арынны көөрү",
-       "talk": "ЧÑ\83гаа",
-       "views": "Көрүүшкүннери",
+       "talk": "СайгаÑ\80Ñ\8bлга",
+       "views": "Көрүлделер",
        "toolbox": "Херекселдер",
        "userpage": "Ажыглакчының арынын көөрү",
        "projectpage": "Төлевилелдиң арынын көөрү",
        "categorypage": "Бөлүктүң арынын көөрү",
        "viewtalkpage": "Чугааны көөрү",
        "otherlanguages": "Өске дылдарга",
-       "redirectedfrom": "($1 шигленген)",
+       "redirectedfrom": "($1 катап чоруткан)",
        "redirectpagesub": "шигледир арын",
-       "lastmodifiedat": "Бо арын сөөлгү катап $1, $2 өскерилген.",
+       "lastmodifiedat": "Бо арын сөөлгү катап $1-ның хүнүнде, $2 турда өскерилген.",
        "protectedpage": "Камгалаган арын",
        "jumpto": "Шилчиир:",
        "jumptonavigation": "навигация",
-       "jumptosearch": "дилээри",
+       "jumptosearch": "дилээр",
        "pool-errorunknown": "Билбес алдаг",
        "aboutsite": "{{SITENAME}} дугайында",
        "aboutpage": "Project:Дугайында",
-       "copyrightpage": "{{ns:project}}:ЧогаалÑ\87Ñ\8bнÑ\8bң эргелери",
+       "copyrightpage": "{{ns:project}}:авÑ\82оÑ\80нÑ\83ң эргелери",
        "currentevents": "Амгы үеде болуушкуннар",
        "currentevents-url": "Project:Амгы үеде болуушкуннар",
-       "disclaimers": "Ð\90жÑ\8bглааÑ\80 Ñ\85аÑ\80Ñ\8bÑ\81аалгазÑ\8bн Ñ\87Ó©Ñ\80Ñ\87Ò¯Ò¯Ñ\80Ò¯ (ойÑ\82алааÑ\80Ñ\8b)",
-       "disclaimerpage": "Project:Ð\90жÑ\8bглааÑ\80 Ñ\85аÑ\80Ñ\8bÑ\81аалгазÑ\8bн Ð¾Ð¹Ñ\82алааÑ\80Ñ\8b",
+       "disclaimers": "ХаÑ\80Ñ\8bÑ\8bÑ\81алгадан Ð¾Ð¹Ñ\82алал",
+       "disclaimerpage": "Project:ХаÑ\80Ñ\8bÑ\8bÑ\81алгадан Ð¾Ð¹Ñ\82алааÑ\88кÑ\8bн",
        "edithelp": "Эдеринге дуза",
-       "mainpage": "Ð\9aол Ð\90рын",
-       "mainpage-description": "Ð\9aол Ð\90рын",
+       "mainpage": "Ð\9aол Ð°рын",
+       "mainpage-description": "Ð\9aол Ð°рын",
        "policy-url": "Project:Чурум",
-       "portal": "Ниитилел хаалгазы",
-       "portal-url": "Project:Ниитилел хаалгазы",
-       "privacy": "Ð\90кÑ\82Ñ\8bг Ð±үзүрел дугуржулгазы",
-       "privacypage": "Project:Ð\90кÑ\82Ñ\8bг Ð±үзүрел дугуржулгазы",
+       "portal": "Ниитилелдиң порталы",
+       "portal-url": "Project:Ниитилелдиң порталы",
+       "privacy": "Ð\91үзүрел дугуржулгазы",
+       "privacypage": "Project:Ð\91үзүрел дугуржулгазы",
        "badaccess": "Алдаг:Эргеңер чок.",
        "versionrequired": "МедиаВикиниң $1 үндүреризи херек",
        "ok": "Чөп",
-       "retrievedfrom": "«$1» деп адрестен парлаттынган",
+       "retrievedfrom": "Дөзү - «$1»",
        "youhavenewmessages": "Силерде $1 ($2) бар.",
        "youhavenewmessagesmulti": "«$1» деп арында силерге чаа чагаалар бар.",
        "editsection": "эдер",
        "editold": "эдер",
        "viewsourceold": "дөзү кодун көөрү",
        "editlink": "эдер",
-       "viewsourcelink": "дөзү кодун көөрү",
-       "editsectionhint": "«$1» деп салбырны эдер",
+       "viewsourcelink": "Үндезин кодту көөр",
+       "editsectionhint": "«$1» салбырны эдер",
        "toc": "Допчузу",
        "showtoc": "көргүзери",
        "hidetoc": "чажырары",
        "feedlinks": "Агым:",
        "feed-invalid": "Бижидилгениң агым хевири багай-дыр.",
        "site-rss-feed": "$1 RSS Медээ Агымы",
-       "site-atom-feed": "$1 Atom Медээ Агымы",
+       "site-atom-feed": "$1 Atom-лента",
        "page-rss-feed": "«$1» RSS Медээ Агымы",
        "page-atom-feed": "«$1» Atom Медээ Агымы",
-       "red-link-title": "$1 (арны чок)",
+       "red-link-title": "$1 (арын чок)",
        "nstab-main": "Арын",
        "nstab-user": "Ажыглакчының арыны",
        "nstab-media": "Медиа арыны",
-       "nstab-special": "ТÑ\83Ñ\81кай арын",
+       "nstab-special": "Ð\90лбан-Ñ\85аакÑ\87Ñ\8bÑ\82 арын",
        "nstab-project": "Төлевилел дугайында",
        "nstab-image": "Файл",
        "nstab-mediawiki": "Чагаа",
        "nstab-template": "Майык",
        "nstab-help": "Дуза",
-       "nstab-category": "Аңгылал",
+       "nstab-category": "Категория",
+       "mainpage-nstab": "Кол арын",
        "nosuchaction": "Ындыг кылыг чок",
        "nosuchspecialpage": "Ындыг тускай арын чок",
        "error": "Алдаг",
        "internalerror_info": "Иштики алдаг: $1",
        "badtitle": "Багай ат",
        "badtitletext": "Негеттинип турар арын ады меге, куруг, чок болза өске дылда азы интервикиде ады шын эвес айыттынган.\n\nАттарга ажыглавас ужурлуг демдектер, үжүктер бары чадапчок.",
-       "viewsource": "Ð\94өзүн ÐºÓ©Ó©Ñ\80Ò¯",
+       "viewsource": "Ð\9aÓ©Ñ\80үлде",
        "actionthrottled": "Шеглээн дүрген",
        "exception-nologin": "Кирбес",
        "welcomeuser": "Кирип моорлаңар, %s!",
        "yourname": "Aжыглакчының ады",
+       "userlogin-yourname": "Бүрүткел ат",
+       "userlogin-yourname-ph": "Бүрүткедир адыңар киириңер",
        "yourpassword": "Чажыт сөс",
+       "userlogin-yourpassword": "Пароль",
        "yourpasswordagain": "Чажыт сөзүңерни катап бижиңер:",
        "remembermypassword": "Мени бо компьютерде сактып алыры ($1 {{PLURAL:$1|1=хүн|хүн}}ге чедир)",
        "login": "Кирери",
        "accountcreatedtext": "«$1» деп ажыглакчының бүрүткел бижиини бүдүрген.",
        "login-abort-generic": "Системаже таптыг эвес кирип тур силер",
        "loginlanguagelabel": "Дыл: $1",
+       "pt-login": "Кирер",
+       "pt-createaccount": "Бүрүткел бижик кылыр",
        "pt-userlogout": "Үнер",
        "php-mail-error-unknown": "PHP-ниң mail() ажыл-чорудулгазында билбес алдаг бар.",
        "changepassword": "Чажыт сөстү өскертири",
        "passwordreset-email": "Э-чагааның адреси:",
        "passwordreset-emailelement": "Ажыглакчы ады: \n$1\n\nТүр чажыт сөс: \n$2",
        "changeemail": "Э-чагааның адресин өскертири",
+       "changeemail-header": "Бүрүткел бижиктиң э-чагааның адресин өскертири",
        "changeemail-oldemail": "Амгы э-чагааның адреси:",
        "changeemail-newemail": "Чаа э-чагааның адреси:",
        "changeemail-none": "(чок)",
        "changeemail-submit": "Э-чагааны өскертири",
-       "bold_sample": "Кара сөзүглел",
-       "bold_tip": "Кара сөзүглел",
-       "italic_sample": "Ð\98йлендиÑ\80еÑ\80 Ñ\81өзүглел",
-       "italic_tip": "Курсив бижик",
-       "link_sample": "ХолбаанÑ\8bң ады",
-       "link_tip": "Ð\98Ñ\88Ñ\82ики Ñ\85олбаа",
+       "bold_sample": "семис үжүк",
+       "bold_tip": "семис үжүк",
+       "italic_sample": "кÑ\83Ñ\80Ñ\81ив Ñ\85евиÑ\80",
+       "italic_tip": "Курсив хевир",
+       "link_sample": "Шөлүлгениң ады",
+       "link_tip": "Ð\98Ñ\88Ñ\82ики Ñ\88өлүлге",
        "extlink_sample": "http://www.example.com холбааның ады",
-       "extlink_tip": "Ð\94аÑ\88Ñ\82Ñ\8bкÑ\8b Ñ\85олбаа (\"http://\" Ñ\87үве Ñ\81акÑ\82Ñ\8bп Ð°Ð»Ñ\8bр)",
-       "headline_sample": "Ð\9aÑ\8bÑ\80Ñ\8bкÑ\8b сөзүглели",
-       "headline_tip": "2-ги деңнелдиг кырыкы ады",
-       "nowiki_sample": "Форматтаваан сөзүглелини бээр салыры",
-       "nowiki_tip": "Вики форматтаарын херекке албас",
+       "extlink_tip": "Ð\94аÑ\88Ñ\82Ñ\8bкÑ\8b Ñ\88өлүлге (\"http://\" Ð¿Ñ\80еÑ\84икÑ\81 Ð´Ñ\83гайÑ\8bнда Ñ\83Ñ\82паңар)",
+       "headline_sample": "Эге Ð°Ñ\82Ñ\82Ñ\8bÒ£ сөзүглели",
+       "headline_tip": "2-ги деңнелдиң эге ады",
+       "nowiki_sample": "Форматтавас сөзүглелди бээр салыңар",
+       "nowiki_tip": "Вики-форматтаашкын кылбас",
        "image_sample": "Чижек.jpg",
-       "image_tip": "Киир туткан файл",
+       "image_tip": "Киирген файл",
        "media_sample": "Чижек.ogg",
-       "media_tip": "Файлдың холбаазы",
-       "sig_tip": "Шак-биле Ñ\85ол Ò¯Ð¶Ò¯Ò£ÐµÑ\80",
+       "media_tip": "Файлче шөлүлге",
+       "sig_tip": "ХолÑ\83ңаÑ\80 Ò¯Ð¶Ò¯Ò¯, Ò¯Ðµ-Ñ\88агÑ\8b",
        "hr_tip": "Доора шугум (көвей ажыглаваңар)",
        "summary": "Түңнел:",
        "subject": "Кол сөс:",
        "minoredit": "Бо эдилге бичии-дир",
-       "watchthis": "Бо арынны хайгаараары",
-       "savearticle": "Арын шыгжаар",
+       "watchthis": "Бо арынны хайгаараар",
+       "savearticle": "Арынны шыгжаар",
        "preview": "Чижеглей көөрү",
-       "showpreview": "Чижеглей ÐºÓ©Ó©Ñ\80Ò¯",
-       "showdiff": "Өскерлиишкиннерни көргүзери",
-       "anoneditwarning": "<strong>Кичээңгейлиг!</strong> Силер сайтче кирип албаан силер. Чаартылгалар киирер болзуңарза, Силерниң IP-адрезиңер чүүлдүң төөгүзүнге көстүп кээр. Кажан сайтче <strong>[$1 шолаңар-биле кире бээриңерге]</strong> азы <strong>[$2 чаа шола чаяап алырыңарга]</strong>, эдилгеңерни шолаңар-биле холбаап каар база Силерге ажыктыг тускай херекселдер тыптып келир.",
+       "showpreview": "Чижек ÐºÓ©Ñ\80үлде",
+       "showdiff": "Кииртинген эдилгелер",
+       "anoneditwarning": "<strong> Кичээңгейлиг! </strong> Сайтта бүрүткеттинмээн-дир силер. Кандыг-даа бол эдилгелер киирер болзуңарза, IP-адрезиңер хөйге көскү болур. Сайтче <strong>[$1 кире бээр азы]</strong> азы <strong>[$2 бүрүткеттинип алыр] болзуңарза, эдилгелер силерниң адыңар-биле холбаалыг апаар, силерге өске-даа эптиг аргаларлыг тыптып кээр.",
        "missingcommenttext": "Тайылбырни адаанда чогаадыңар.",
        "summary-preview": "Түңнелдү чижеглей көөрү:",
        "subject-preview": "Кол сөс чижеглей көөрү:",
        "blockednoreason": "чылдагаан чок",
        "nosuchsectiontitle": "Бо салбыр чок",
-       "loginreqlink": "кирери",
+       "loginreqlink": "кирер",
        "accmailtitle": "Чажыт сөс чоргустунган.",
        "accmailtext": "A randomly generated password for [[User talk:$1|$1]] has been sent to $2.\n\nThe password for this new account can be changed on the ''[[Special:ChangePassword|change password]]'' page upon logging in.",
        "newarticle": "(Чаа)",
        "newarticletext": "Амдыызында чаяатынмаан арынче шөлүглеп шилчий бердиңер.\nОну чаяарда адакы көзенекке сөзүглелден таналап киириңер ([$1 тайылбыр арынын] тода көрүңер).. \nМаңаа алдаг аайы-биле шилчий берген болзуңарза, браузериңерниң \"дедир\"  деп таназын базыптыңар.",
        "noarticletext": "Амдыызында ук арында сөзүглел чок.\nОл дилеп турар [[Special:Search/{{PAGENAME}}|арыныңар дугайында өске чүүлдерге бижээнин тып аап]] болур силер,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдар аразынга айытканын көрүп болур силер] азы '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} шак ындыг аттыг арын чаяап болур силер]'''</span>.,",
-       "noarticletext-nopermission": "Ð\90мдÑ\8bÑ\8bзÑ\8bнда Ñ\83к Ð°Ñ\80Ñ\8bнда Ñ\81өзүглел Ñ\87ок.\nÐ\9eл Ð´Ð¸Ð»ÐµÐ¿ Ñ\82Ñ\83Ñ\80аÑ\80 [[Special:Search/{{PAGENAME}}|аÑ\80Ñ\8bнÑ\8bңаÑ\80 Ð´Ñ\83гайÑ\8bнда Ó©Ñ\81ке Ñ\87үүлдеÑ\80ге Ð±Ð¸Ð¶Ñ\8dÑ\8dнин Ñ\82Ñ\8bп Ð°Ð°Ð¿]] Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, Ð°Ð·Ñ\8b\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ð¶Ñ\83Ñ\80налдаÑ\80 Ð°Ñ\80азÑ\8bнга Ð°Ð¹Ñ\8bÑ\82канÑ\8bн ÐºÓ©Ñ\80үп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80]. Ð¨Ð°Ðº Ñ\8bндÑ\8bг Ñ\83к Ð°Ñ\80Ñ\8bн Ñ\87аÑ\8fаÑ\80 Ñ\87Ó©Ñ\88пÑ\8dÑ\8dÑ\80елиңеÑ\80 чок.",
+       "noarticletext-nopermission": "Ð\90мгÑ\8b Ò¯ÐµÐ´Ðµ Ð±Ð¾ Ð°Ñ\80Ñ\8bнда Ñ\81өзүглел Ñ\87ок. Ð£Ðº Ð°Ñ\82Ñ\82Ñ\8b Ó©Ñ\81ке Ð°Ñ\80Ñ\8bннаÑ\80дан Ñ\82Ñ\8bп Ð°Ð¿, Ð°Ð·Ñ\8b [[Special:Search/{{PAGENAME}}|аÑ\80Ñ\8bнÑ\8bңаÑ\80 Ð´Ñ\83гайÑ\8bнда Ó©Ñ\81ке Ñ\87үүлдеÑ\80ге Ð±Ð¸Ð¶Ñ\8dÑ\8dнин Ñ\82Ñ\8bп Ð°Ð¿]] Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, Ð°Ð·Ñ\8b\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Ð´ÐµÐ¿Ñ\82еÑ\80леÑ\80де Ñ\87огÑ\83Ñ\83Ñ\80 Ð±Ð¸Ð¶Ð¸ÐºÑ\82еÑ\80ни Ñ\82Ñ\8bп Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80]. Ð£Ðº Ð°Ñ\80Ñ\8bннÑ\8b ÐºÑ\8bлÑ\8bÑ\80 Ñ\87өпÑ\88Ñ\8dÑ\8dÑ\80ел Ñ\81илеÑ\80де чок.",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» деп ажыглакчы is not registered.\nPlease check if you want to create/edit this page.",
        "userpage-userdoesnotexist-view": "«$1» деп ажыглакчы not registered.",
        "note": "'''Тайылбыр:'''",
        "editingcomment": "«$1» деп арынны өскертип турар (чаа салбыр)",
        "yourtext": "Силерниң сөзүглелиңер",
        "yourdiff": "Ылгалдар",
-       "templatesused": "Ð\91о Ð°Ñ\80Ñ\8bнда Ð°Ð¶Ñ\8bглаан {{PLURAL:$1|1=Ð\9cайÑ\8bк|Ð\9cайыктар}}:",
+       "templatesused": "Ð\91о Ð°Ñ\80Ñ\8bнда Ð°Ð¶Ñ\8bглап Ñ\82Ñ\83Ñ\80аÑ\80{{PLURAL:$1|1=майÑ\8bк|майыктар}}:",
        "template-protected": "(камгалаан)",
-       "template-semiprotected": "(Ñ\87еÑ\82пеÑ\81 ÐºÐ°Ð¼Ð³Ð°Ð»Ð°Ð°Ð½)",
-       "hiddencategories": "Бо арын {{PLURAL:$1|$1 чажыт бөлүкке}} хамааржыр:",
-       "permissionserrorstext-withaction": "Мында «'''$2'''» силерниң эргеңер чок, {{PLURAL:$1|1=чылдагааны|чылдагааннары}}:",
+       "template-semiprotected": "(Ñ\87аÑ\80Ñ\82Ñ\8bк-Ñ\87амдÑ\8bÑ\8bзÑ\8b ÐºÐ°Ð¼Ð³Ð°Ð»Ð°Ð»Ð´Ñ\8bг)",
+       "hiddencategories": "Бо арын{{PLURAL:$1|$1 көзүлбес категорияга|$1 көзүлбес категорияларга|1=бир көзүлбес категорияга}} хамааржыр:",
+       "permissionserrorstext-withaction": "{{PLURAL:$1|1=дараазында чылдагаан-биле|дараазында чылдагааннар-биле}} $2-ни ажыглаар эрге силерде чок:",
        "recreate-moveddeleted-warn": "'''Кичээңейлиг. Ооң мурнунда казыттынган арынны катап тургузар деп тур Силер.'''\n\nОл арынны катап тургузары шынап-ла чугула бе, боданыңар.\nБо адаанда ол арынның казыышкыннар болгаш өскээр адалгалар журналдарын көргүскен.",
        "moveddeleted-notice": "Бо арын ап каавыткан.\nАдаанда ап каавыткан биле өскээр адаан бижиктер шынзылгазын көргүскен.",
        "post-expand-template-inclusion-warning": "Сагындырыг: Кошкан майыктарның ниити хемчээли дендии улуг.\nЧамдык майыктар коштунмаан боор.",
        "currentrev-asof": "Амгы $1 үениң бижээни",
        "revisionasof": "$1 версиязы",
        "revision-info": "$2 киржикчиниң $1 хүнүнде киирилдези",
-       "previousrevision": "←Артык эрги үндүрери",
+       "previousrevision": "←Амдыы арын",
        "nextrevision": "Артык чаа үндүрери→",
        "currentrevisionlink": "Амгы үе үндүрери",
        "cur": "амгы",
        "next": "дараазында",
-       "last": "эрткен",
+       "last": "амдыы",
        "page_first": "бирги",
        "page_last": "сөөлгү",
        "histlegend": "Версиялар шилиири: деңнээр дээн арыныңар версияларын имнеңеш, бээр базыптыңар '''{{int:compare-submit}}'''.<br />\nТайылбыр: '''({{int:cur}})''' — амгы версиядан ылгавыр; '''({{int:last}})''' — эрткен версиядан ылгавыр;  '''{{int:minoreditletter}}''' — биче өскерилгелер.",
        "history-title": "«$1» деп арынның эдилге төөгүзү",
        "lineno": "Одуруг $1:",
        "compareselectedversions": "Шилип алган хевирлери деңнээри",
-       "editundo": "чөрчүүрү",
-       "searchresults": "ТүңнелдеÑ\80",
-       "searchresults-title": "«$1» Ð´ÐµÐ¿ Ð´Ð¸Ð»Ðµ",
-       "prevn": "эрткен {{PLURAL:$1|$1}}",
+       "editundo": "ойталаар",
+       "searchresults": "Ð\94илÑ\8dÑ\8dÑ\88кинниң Ñ\82үңнелдеÑ\80и",
+       "searchresults-title": "«$1» Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80",
+       "prevn": "амдыы {{PLURAL:$1|$1}}",
        "nextn": "дараазында {{PLURAL:$1|$1}}",
        "prevn-title": "Эрткен $1 {{PLURAL:$1|1=бижик|бижик}}",
        "nextn-title": "Дараазында $1 {{PLURAL:$1|1=бижик|бижик}}",
-       "shown-title": "Арынга $1 {{PLURAL:$1|түңнел}} көргүзер",
-       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) көөрү",
+       "shown-title": "Арынга $1 {{PLURAL:$1|бижикти, бижиктерни, бижиктерин}} көргүзер",
+       "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) көөр",
        "searchmenu-exists": "'''Бо викиде \"[[:$1]]\" деп арын бар.'''",
-       "searchmenu-new": "'''Бо викиде «[[:$1]]» арынны чогаадыры'''",
+       "searchmenu-new": "Бо вики-төлевилелге «[[:$1]]» деп арынны кылыр.{{PLURAL:$2|0=|Ол ышкаш дилээшкиниңерниң түңнелинде тывылган арынны база көрүңер.|Ол ышкаш дилээшкиниңерниң түңнелдерин база көрүңер.}}",
        "searchprofile-articles": "үндезин арыннар",
        "searchprofile-images": "Мультимедиа",
-       "searchprofile-everything": "Ð\91үгүде",
-       "searchprofile-advanced": "Ð\9aалбайÑ\82Ñ\8bÑ\80",
+       "searchprofile-everything": "каÑ\8fа-даа",
+       "searchprofile-advanced": "Ð\94елгеÑ\80еңгей",
        "searchprofile-articles-tooltip": "$1 иштинден дилээри",
        "searchprofile-images-tooltip": "Файлдар дилээри",
-       "searchprofile-everything-tooltip": "Шупту арыннардан дилээри (сумележиишкиннерден база)",
+       "searchprofile-everything-tooltip": "Шупту арыннардан дилээр (сайгаржылга арыннарындан база)",
        "searchprofile-advanced-tooltip": "Айыткан аттар делгемнеринден дилээри",
-       "search-result-size": "$1 ({{PLURAL:$2|$2 сөс}})",
+       "search-result-size": "$1 ({{PLURAL:$2|$2 сөс|$2 сөстер|$2}})",
        "search-result-category-size": "{{PLURAL:$1|1=1 кежигүүн|$1 кежигүүн}} ({{PLURAL:$2|1=1 аңгылам|$2 аңгылам}}, {{PLURAL:$3|1=1 файл|$3 файл}})",
-       "search-redirect": "($1-н Ñ\88иглелге)",
+       "search-redirect": "($1-ден Ñ\8dде Ñ\87оÑ\80Ñ\83дÑ\83г)",
        "search-section": "(«$1» деп салбыр)",
        "search-suggest": "Силер «$1» деп бодадыңар чадавас",
        "search-interwiki-more": "(артык)",
        "searchrelated": "холбаалыг",
        "searchall": "шупту",
-       "search-nonefound": "Ð\90йÑ\8bÑ\82кан Ð½ÐµÐ³ÐµÐ»Ð´ÐµÐ½Ð¸Ò£ Ñ\82үңнели Ñ\87ок",
+       "search-nonefound": "Ð\90йÑ\8bÑ\82кан Ð½ÐµÐ³ÐµÐ»Ð´ÐµÐ³Ðµ Ð´Ò¯Ð³Ð¶Ò¯Ñ\80 Ñ\87Ò¯Ò¯-даа Ñ\82Ñ\8bвÑ\8bлбаан.",
        "powersearch-ns": "Аттар делгемнеринден дилээри:",
        "powersearch-toggleall": "Шупту",
        "preferences": "Шилилгелер",
        "right-createaccount": "Чаа бүрүткел бижиктерин бүдүрери",
        "right-move": "Арыннарны шимчээри",
        "right-movefile": "Файлдарны шимчээри",
+       "right-writeapi": "API-ни бижикке ажыглаары",
        "right-editusercssjs": "Өске ажыглакчыларның CSS база Javascript файлдарын өскертири.",
        "right-editusercss": "Өске ажыглакчыларның CSS файлдарын өскертири.",
        "right-edituserjs": "Өске ажыглакчыларның JavaScript файлдарын өскертири.",
-       "newuserlogpage": "Чаа Ð°Ð¶Ñ\8bглакÑ\87Ñ\8b ÐºÑ\8bÑ\80Ñ\8bнда Ð¶Ñ\83Ñ\80нал",
+       "newuserlogpage": "Ð\9aиÑ\80жикÑ\87илеÑ\80 Ð±Ò¯Ñ\80Ò¯Ñ\82кÑ\8dÑ\8dÑ\80 Ð´ÐµÐ¿Ñ\82еÑ\80",
        "action-read": "бо арынны номчууру",
        "action-edit": "бо арынның эдилгези",
        "action-createpage": "арыннарны чогаадыры",
        "action-movefile": "бо файлды шимчээри",
        "action-sendemail": "э-чагаалар чорудары",
        "nchanges": "$1 {{PLURAL:$1|өскерлиишкин}}",
-       "recentchanges": "Ð\90мгÑ\8b Ó©Ñ\81кеÑ\80лииÑ\88киннер",
-       "recentchanges-legend": "Ð\90мгÑ\8b Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ниң Ñ\8dдиглеÑ\80и",
-       "recentchanges-summary": "Ð\91о Ð°Ð³Ñ\8bмда Ð²Ð¸ÐºÐ¸Ð½Ð¸Ò£ Ñ\81өөлгү Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ин ÐºÓ©Ó©Ñ\80Ò¯.",
+       "recentchanges": "Чаа Ñ\8dдилгелер",
+       "recentchanges-legend": "Чаа Ñ\8dдилгелеÑ\80ни Ð°Ð°Ð¹Ð»Ð°Ð°Ñ\80",
+       "recentchanges-summary": "Ð\9cооң Ð°Ð´Ð°Ð°Ð½Ð´Ð° Ð°Ñ\80Ñ\8bннаÑ\80да Ñ\81өөлгү Ó©Ñ\81кеÑ\80илгелеÑ\80ни Ò¯Ðµ-Ñ\88ак Ð°Ð°Ð¹Ñ\8b-биле Ñ\87изелеп Ñ\87Ñ\8bÑ\81кааган.",
        "recentchanges-feed-description": "Бо агымда викиниң сөөлгү өскерлиишкиннерин көөрү.",
-       "recentchanges-label-newpage": "Бо өскерлиишкин чаа арынны чогааткан.",
-       "recentchanges-label-minor": "Ð\91о Ó©Ñ\81кеÑ\80лииÑ\88кин Ð±Ð¸Ñ\87ии",
+       "recentchanges-label-newpage": "Бо эдилге-биле чаа арын кылдынган.",
+       "recentchanges-label-minor": "УлÑ\83г Ñ\8dвеÑ\81 Ó©Ñ\81кеÑ\80Ñ\82илге-диÑ\80",
        "recentchanges-label-bot": "Бо эдилгени робот күүсеткен.",
-       "recentchanges-label-unpatrolled": "Бо өскертилге истетинмээн (патрульдаттынмаан)",
+       "recentchanges-label-unpatrolled": "Бо эдилгени кым-даа хайгаараваан",
        "recentchanges-label-plusminus": "Арынның сөзүглели бердинген түң байт-биле өскерилген",
-       "recentchanges-legend-newpage": "$1 — чаа арын",
+       "recentchanges-legend-newpage": " $1 — чаа арыннар даңзызы",
        "rcnotefrom": "<strong>$2</strong> үеде <strong>$1</strong> чедир өскертилгелерни санаан.",
-       "rclistfrom": "$3 $2 тура чаа өскерилгелерни көргүзер",
-       "rcshowhideminor": "Бичии өскерлиишкиннерни $1",
+       "rclistfrom": "$3 $2 тура өскерилгелерни көргүзер",
+       "rcshowhideminor": "$1 биче эдилгелер",
        "rcshowhideminor-show": "көргүзер",
        "rcshowhideminor-hide": "чажырар",
        "rcshowhidebots": "Роботтарны $1",
-       "rcshowhideliu": "Кирген киржикчилерни $1",
+       "rcshowhidebots-show": "Көргүзер",
+       "rcshowhideliu": "бүрүткеттинген киржикчилер $1",
        "rcshowhideliu-show": "көргүзер",
-       "rcshowhideliu-hide": "чажырар",
-       "rcshowhideanons": "Адыжок киржикчилерни $1",
+       "rcshowhideliu-hide": "Чажырар",
+       "rcshowhideanons": "Ады билдинмес киржикчилер $1",
        "rcshowhideanons-show": "көргүзер",
        "rcshowhideanons-hide": "чажырар",
        "rcshowhidepatr": "истээн өскерлиишкиннерни $1",
        "rcshowhidepatr-show": "көргүзер",
        "rcshowhidepatr-hide": "чажырар",
-       "rcshowhidemine": "Эдиглеримни $1",
+       "rcshowhidemine": "$1 боттуң эдилгелери",
        "rcshowhidemine-show": "көргүзер",
        "rcshowhidemine-hide": "чажырар",
-       "rclinks": "Сөөлгү $2 Ñ\85үн Ð¸Ñ\88Ñ\82инде Ð±Ð¾Ð»Ð³Ð°Ð½ $1 өскерлиишкиннерни көргүзер<br />$3",
+       "rclinks": "ЧооккÑ\83 $2 Ñ\85үн Ð¸Ñ\88Ñ\82инде Ñ\81өөлгү $1 өскерлиишкиннерни көргүзер<br />$3",
        "diff": "ылгал",
        "hist": "төөгү",
        "hide": "Чажырар",
        "newpageletter": "Ч",
        "boteditletter": "р",
        "number_of_watching_users_pageview": "[$1 хайгаараар {{PLURAL:$1|ажыглакчы}}]",
+       "rc-change-size-new": "Өскертилге соонда хемчээли:$1 {{PLURAL:$1|байт}}",
        "newsectionsummary": "/* $1 */ чаа салбыр",
        "rc-enhanced-expand": "Тодаларны көргүзери (JavaScript херек)",
        "rc-enhanced-hide": "Тодаларны чажырары",
-       "recentchangeslinked": "ХамааÑ\80Ñ\8bÑ\88кан өскерилгелер",
-       "recentchangeslinked-toolbox": "ХамааÑ\80Ñ\8bÑ\88кан өскерилгелер",
-       "recentchangeslinked-title": "«$1» деп арынга хамаарыштырган өскерлиишкиннер",
+       "recentchangeslinked": "ТÑ\83дÑ\83Ñ\88 өскерилгелер",
+       "recentchangeslinked-toolbox": "ТÑ\83дÑ\83Ñ\88 өскерилгелер",
+       "recentchangeslinked-title": "«$1» деп арынга кошкан эдилгелер",
        "recentchangeslinked-summary": "Айыткан арынның (азы айыткан аңгылалга хамаарышкан) шөлүлүглериниң чедер арыннарнының чаа өскерилгер даңзызы.\n[[Special:Watchlist|Силерниң хайгаарал даңзызынче]] кирип турар арыннарны '''ылгап каан'''.",
        "recentchangeslinked-page": "Арынның ады:",
-       "recentchangeslinked-to": "Ð\90йÑ\8bÑ\82кан Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүп Ñ\82Ñ\83Ñ\80аÑ\80 Ð°Ñ\80Ñ\8bннаÑ\80га өскерилгелерни көргүзер",
-       "upload": "Файл чүдүрер",
+       "recentchangeslinked-to": "Ð\90йÑ\8bÑ\82кан Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүп Ñ\82Ñ\83Ñ\80аÑ\80 Ð°Ñ\80Ñ\8bннаÑ\80да өскерилгелерни көргүзер",
+       "upload": "Файлды киир чүдүрер",
        "uploadbtn": "Файлды салыры",
        "uploadnologin": "Кирбес",
        "uploaderror": "Кииреринге алдаг",
        "upload-misc-error": "Билбес кииреринге алдаг",
        "http-read-error": "HTTP-биле номчуур алдаг.",
        "license": "Хоойлужудары:",
-       "license-header": "ХоойлÑ\83жÑ\83дары",
+       "license-header": "Ð\9bиÑ\86ензиÑ\8fлаары",
        "imgfile": "файл",
        "listfiles": "Файл даңзызы",
        "listfiles_name": "Ат",
        "listfiles_count": "Үндүрерилер",
        "file-anchor-link": "Файл",
        "filehist": "Файлдың төөгүзү",
-       "filehist-help": "Ð\9eл Ò¯ÐµÐ´Ðµ Ñ\84айлдÑ\8bÒ£ ÐºÓ©Ñ\81Ñ\82Ò¯Ñ\80үн ÐºÓ©Ó©Ñ\80де, Ð´Ð°Ñ\82а/үеже Ð±Ð°Ð·Ñ\8bпÑ\82Ñ\8bңар.",
+       "filehist-help": "Ð\90й-Ñ\85үн/үе-Ñ\88акÑ\87е Ð±Ð°Ð·Ñ\8bпкаÑ\88, Ñ\84айлдÑ\8bÒ£ Ñ\8bнÑ\87ан ÐºÐ°Ð½Ð´Ñ\8bг Ñ\82Ñ\83Ñ\80ганÑ\8bн ÐºÓ©Ñ\80үңер.",
        "filehist-deleteall": "шуптуну ырадыры",
        "filehist-deleteone": "ырадыры",
        "filehist-revert": "эгидип тургузары",
        "filehist-current": "амгы",
-       "filehist-datetime": "Ай, Хүн/Шак",
-       "filehist-thumb": "Ð\91иÑ\87ии Ñ\87Ñ\83Ñ\80Ñ\83мал",
-       "filehist-thumbtext": "$1 Ñ\85амааÑ\80жÑ\8bÑ\80 Ñ\85евиÑ\80иниң Ð±Ð¸Ñ\87е Ñ\87Ñ\83Ñ\80Ñ\83малÑ\8b (миниаÑ\82Ñ\8eÑ\80азÑ\8b)",
-       "filehist-user": "Ð\90жÑ\8bглакÑ\87Ñ\8b",
+       "filehist-datetime": "Ай-хүн/Үе-шак",
+       "filehist-thumb": "Ынай Ñ\87Ñ\83Ñ\80Ñ\83к",
+       "filehist-thumbtext": "$1 Ñ\8fнзÑ\8bзÑ\8bнга Ñ\8bнай Ñ\87Ñ\83Ñ\80Ñ\83к",
+       "filehist-user": "Ð\9aиÑ\80жикÑ\87и",
        "filehist-dimensions": "Хемчээлдери",
        "filehist-filesize": "Файл хемчээли",
        "filehist-comment": "Тайылбыр",
        "imagelinks": "Файлдың ажыглаашкыны",
-       "linkstoimage": "Ð\91еÑ\80динген Ñ\84айлÑ\87е Ð´Ð°Ñ\80аазÑ\8bнда {{PLURAL:$1|1=аÑ\80Ñ\8bн Ñ\88өлүдүп Ñ\82Ñ\83Ñ\80|$1 Ð°Ñ\80Ñ\8bн Ñ\88өлүдүп Ñ\82Ñ\83Ñ\80}}:",
+       "linkstoimage": "Ð\94аÑ\80аазÑ\8bнда {{PLURAL:$1|1=аÑ\80Ñ\8bн|$1 Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8bÒ£ Ñ\88өлүлгези Ñ\84айл}}:",
        "nolinkstoimage": "Бердинген файлче шөлүп турар арыннар чок.",
-       "sharedupload-desc-here": "Моон $1 алган файл өске төлевилелдерге ажыглаттынып болур.\nОоң [$2 допчу тайылбыр арынындан] медеглели адаанда бердинген.",
+       "sharedupload-desc-here": "Моон $1 алган файл өске төлевилелдерге база ажыглаттынып болур.\nОоң [$2 тайылбыр арнындан] медээни адаанда киирген.",
+       "upload-disallowed-here": "Бо файлды эде бижидип шыдавас силер.",
        "filerevert": "$1 эгидип тургузары",
        "filerevert-legend": "Файлды эгидип тургузары",
        "filerevert-comment": "Чылдагаан:",
        "unwatchedpages": "Хайгаарабас арыннар",
        "unusedtemplates": "Ажыглаан эвес майыктар",
        "unusedtemplateswlh": "өске холбаалар",
-       "randompage": "Душ арын",
+       "randompage": "Дужа-келби таварышкан арын",
        "statistics": "Статистика",
        "statistics-pages": "Арыннар",
        "brokenredirects-edit": "өскертири",
        "nbytes": "$1 {{PLURAL:$1|байт}}",
        "ncategories": "$1 {{PLURAL:$1|аңгылал}}",
        "nlinks": "$1 {{PLURAL:$1|холбаа}}",
-       "nmembers": "$1 {{PLURAL:$1|кежигүн}}",
+       "nmembers": "$1 {{PLURAL:$1|кежигүн|кежигүннер}}",
        "nrevisions": "$1 {{PLURAL:$1|үндүрери}}",
        "specialpage-empty": "Бо илеткелдиң түңнели чок.",
        "lonelypages": "Чааскаан арыннар",
        "move": "Шимчээри",
        "movethispage": "Бо арынны шимчээри",
        "pager-newer-n": "{{PLURAL:$1|артык чаа}}",
-       "pager-older-n": "{{PLURAL:$1|аÑ\80Ñ\82Ñ\8bк Ñ\8dÑ\81ки}}",
+       "pager-older-n": "{{PLURAL:$1|аÑ\80Ñ\82Ñ\8bк Ñ\8dÑ\80ги}}",
        "booksources": "Номнарның үнген дөзү",
        "booksources-search-legend": "Номнуң медээлерин дилээри",
        "specialloguserlabel": "Күүседикчи:",
        "speciallogtitlelabel": "Target (aтка азы ажыглакчыга):",
-       "log": "Ð\96Ñ\83Ñ\80налдар",
+       "log": "Ð\94епÑ\82еÑ\80лер",
        "allpages": "Шупту арыннар",
        "nextpage": "Дараазында арын ($1)",
        "prevpage": "Эрткен арын ($1)",
        "allarticles": "Шупту арыннар",
-       "allpagessubmit": "Ð\9aÒ¯Ò¯cедиÑ\80и",
+       "allpagessubmit": "Че-ве",
        "categories": "Аңгылалдар",
        "sp-deletedcontributions-contribs": "дадывыр",
        "linksearch": "Даштыкы холбааларга дилээри",
        "namespace": "Аттар делгеми:",
        "invert": "Шилээнин аңдарар. (Обратить выбранное)",
        "blanknamespace": "(Кол)",
-       "contributions": "{{GENDER:$1|Ð\90жÑ\8bглакÑ\87Ñ\8bнÑ\8bÒ£}} Ñ\81алÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80Ñ\8b",
+       "contributions": "{{GENDER:$1|киÑ\80жикÑ\87иниң}} Ò¯Ð»Ò¯Ò¯",
        "contributions-title": "«$1» деп ажыглакчының салыышкыннары",
        "mycontris": "Дадывыр",
        "contribsub2": "$1 ($2)",
        "isredirect": "шиглидер арын",
        "istemplate": "киирткен арыннар",
        "isimage": "файлдың холбаазы",
-       "whatlinkshere-prev": "{{PLURAL:$1|1=эрткен|эрткен $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|1= амдыы|амдыы $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|1=дараазында|дараазында $1}}",
        "whatlinkshere-links": "← холбаалар",
        "whatlinkshere-hideredirs": "$1-че шиглиглер",
        "blocklist-reason": "Чылдагаан",
        "ipblocklist-submit": "Дилээр",
        "infiniteblock": "кезээ-мөңгеде",
-       "blocklink": "кÑ\8bзÑ\8bгааÑ\80лааÑ\80Ñ\8b",
+       "blocklink": "доÑ\81Ñ\82Ñ\83Ñ\80аÑ\80",
        "unblocklink": "ажыдып хостаар",
        "change-blocklink": "кызыгаарлаашкынны өскертири",
-       "contribslink": "дадывыр",
+       "contribslink": "үлүг",
        "blocklogpage": "Кызыгаарлаашкынның журналы",
        "blocklogentry": ", [[$1]] $2 дургузунда кызыгаарлаттынган: $3",
        "block-log-flags-anononly": "чүгле адыжок киржикчилер",
        "unlockbtn": "Медээ шыгжамырын ажыттынар",
        "move-page": "«$1» деп арынны шимчээри",
        "move-page-legend": "Арынны шимчээр",
-       "movearticle": "Бо арынны шимчээри:",
        "newtitle": "Чаа ат:",
        "move-watch": "Бо арынны хайгаараары",
        "movepagebtn": "Арынны шимчээри",
        "tooltip-pt-preferences": "Силерниң шилилгеңер",
        "tooltip-pt-watchlist": "Карактап (хынап) турар өскертилгелерге хамааржыр арыннарның даңзызы",
        "tooltip-pt-mycontris": "Силерниң салыышкыннарыңарның даңзызы",
-       "tooltip-pt-login": "Ð\9cаңаа Ñ\81иÑ\81Ñ\82емаже ÐºÐ¸Ð¸Ñ\80 Ð±Ò¯Ñ\80Ò¯Ñ\82кенип Ð±Ð¾Ð»Ñ\83Ñ\80, Ñ\8bнÑ\87алза-даа Ð¾Ð» албан эвес.",
+       "tooltip-pt-login": "Ð\9cаңаа Ñ\81иÑ\81Ñ\82емага Ð±Ò¯Ñ\80Ò¯Ñ\82кедип Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80, Ñ\87огÑ\83м албан эвес.",
        "tooltip-pt-logout": "Үнери",
-       "tooltip-ca-talk": "Бо арын дугайында чыгаалажыры",
-       "tooltip-ca-edit": "Ук арынны эдип болур силер. Эдилгеңер бижидерин бертинде чижеглей көөрүн утпаңар.",
-       "tooltip-ca-addsection": "Чаа салбыр чаяар",
-       "tooltip-ca-viewsource": "Бо арын камгалаттырган.\nДөзү кодун көрүп болур силер.",
-       "tooltip-ca-history": "Арынның мурнуку өскерлиишкиннери",
+       "tooltip-pt-createaccount": "Албан эвес-даа болза, бүрүткел бижикти кылгаш, системаже кирерин силерге саналдап тур бис.",
+       "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": "СилеÑ\80ниң Ñ\85айгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bнга Ð±Ð¾ Ð°Ñ\80Ñ\8bннÑ\8b Ð½ÐµÐ¼ÐµÑ\80елÑ\8dÑ\8dÑ\80и",
+       "tooltip-ca-watch": "Ð\91о Ð°Ñ\80Ñ\8bннÑ\8b Ñ\85айгааÑ\80алÑ\8bңаÑ\80 Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bнÑ\87е Ð½ÐµÐ¼Ñ\8dÑ\8dÑ\80",
        "tooltip-ca-unwatch": "Силерниң хайгаарал даңзызындан бо арынны ырадыры",
-       "tooltip-search": "{{grammar:locative|{{SITENAME}}}} дилээри",
-       "tooltip-search-go": "Шак Ñ\8bндÑ\8bг Ð°Ñ\82Ñ\82Ñ\8bг Ð°Ñ\80Ñ\8bнÑ\87е Ñ\89илчиир",
-       "tooltip-search-fulltext": "Ð\91о Ð±Ð¸Ð¶Ð¸ÐºÐµ Ð°Ñ\80Ñ\8bннаÑ\80дан Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80и",
-       "tooltip-p-logo": "Ð\9aол Ð\90Ñ\80Ñ\8bн",
-       "tooltip-n-mainpage": "Ð\9aол Ð\90рынче шилчиир",
-       "tooltip-n-mainpage-description": "Ð\9aол Ð\90Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80и",
-       "tooltip-n-portal": "Төлевилел Ð´Ñ\8bгайÑ\8bнда, Ñ\87үнү ÐºÑ\8bлÑ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\81илеÑ\80, ÐºÐ°Ð¹Ð´Ð° Ñ\87Ò¯Ò¯ Ñ\87Ñ\8bдарыл",
-       "tooltip-n-currentevents": "Ам болуп турар таварылгалар даңзызы",
-       "tooltip-n-recentchanges": "Ð\92икиниң Ñ\8dниÑ\80 Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80и",
-       "tooltip-n-randompage": "Душ арынны көөрү",
-       "tooltip-n-help": "Төлевилелдиң Ñ\82айÑ\8bлбÑ\8bÑ\80Ñ\8b Â«{{SITENAME}}»",
-       "tooltip-t-whatlinkshere": "Ð\91үгү Ð¼Ð°Ò£Ð°Ð° Ñ\88өлүÑ\82ген Ð²Ð¸ÐºÐ¸ арыннарның даңзызы",
-       "tooltip-t-recentchangeslinked": "Бо арындан шөлүткен өске арыннарның сөөлгү өскерлиишкиннери",
+       "tooltip-search": "{{grammar:locative|{{SITENAME}}}} дилээр",
+       "tooltip-search-go": "Шак Ñ\8bндÑ\8bг Ð°Ñ\82Ñ\82Ñ\8bг Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88илчиир",
+       "tooltip-search-fulltext": "Ð\90йÑ\8bÑ\82Ñ\82Ñ\8bнган Ñ\81өзүглелдиг Ð°Ñ\80Ñ\8bннаÑ\80нÑ\8b Ð´Ð¸Ð»Ñ\8dÑ\8dÑ\80",
+       "tooltip-p-logo": "Ð\9aол Ð°Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80",
+       "tooltip-n-mainpage": "Ð\9aол Ð°рынче шилчиир",
+       "tooltip-n-mainpage-description": "Ð\9aол Ð°Ñ\80Ñ\8bнÑ\87е ÐºÐ¸Ñ\80еÑ\80",
+       "tooltip-n-portal": "Төлевилел Ð´Ñ\83гайÑ\8bнда, Ð¼Ð°Ò£Ð°Ð°  Ñ\87үнү ÐºÑ\8bлÑ\8bп Ð±Ð¾Ð»Ñ\83Ñ\80Ñ\83л, Ð¾Ð» Ñ\8bÑ\88каÑ\88 ÐºÐ°Ð¹Ð´Ð° Ñ\87Ò¯Ò¯ Ð±арыл",
+       "tooltip-n-currentevents": "Амгы болуушкуннар дугайында медээ",
+       "tooltip-n-recentchanges": "Ð\92икиниң Ñ\81өөлгү Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80 Ð´Ð°Ò£Ð·Ñ\8bзÑ\8b",
+       "tooltip-n-randompage": "Дужа-келби таварышкан арынны көөр",
+       "tooltip-n-help": "ШÑ\8bнзÑ\8bлга Ð°Ð¿ Ð±Ð¾Ð»Ñ\83Ñ\80 Ñ\87еÑ\80",
+       "tooltip-t-whatlinkshere": "Ук Ð°Ñ\80Ñ\8bнÑ\87е Ñ\88өлүлгелиг Ñ\88Ñ\83пÑ\82Ñ\83 арыннарның даңзызы",
+       "tooltip-t-recentchangeslinked": "Бо арындан шөлүлгелиг арыннарында сөөлгү өскерилгелер",
        "tooltip-feed-rss": "Бо арының РСС медээ агымы",
        "tooltip-feed-atom": "Бо арының Атом медээ агымы",
        "tooltip-t-contributions": "Бо ажыглакчының салыышкыннарының даңзазын көөрү.",
        "tooltip-t-emailuser": "Бо ажыглакчыга э-чагааны чорудаары",
-       "tooltip-t-upload": "Файлдарны киирери",
-       "tooltip-t-specialpages": "ШÑ\83пÑ\82Ñ\83 Ñ\82Ñ\83Ñ\81кай арыннар даңзызы",
-       "tooltip-t-print": "Бо арынның парлаттынар хевири",
-       "tooltip-t-permalink": "Ук арынның амгы янзызының турум айтыы",
-       "tooltip-ca-nstab-main": "Ð\94опÑ\87Ñ\8b Ð°Ñ\80Ñ\8bнÑ\8bн ÐºÓ©Ó©Ñ\80Ò¯",
+       "tooltip-t-upload": "Файлдарны киир чүдүрери",
+       "tooltip-t-specialpages": "Ð\90лбан-Ñ\85аакÑ\87Ñ\8bÑ\82 арыннар даңзызы",
+       "tooltip-t-print": "Бо арынның парлап үндүрер янзызы",
+       "tooltip-t-permalink": "Ук арынның амгы янзызының доктаамал шөлүлгези",
+       "tooltip-ca-nstab-main": "Ð\9aол Ð°Ñ\80Ñ\8bннÑ\8b ÐºÓ©Ó©Ñ\80",
        "tooltip-ca-nstab-user": "Ажыглакчының арынын көөрү",
        "tooltip-ca-nstab-media": "Медиа арынын көөрү",
-       "tooltip-ca-nstab-special": "Ð\91о Ð±Ó©Ð»Ð³Ñ\8dÑ\8dÑ\82 Ð°Ñ\80Ñ\8bн-дÑ\8bÑ\80 (Ñ\81лÑ\83жебнаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а), Ð¾Ð¾Ò£ эдери болдунмас.",
+       "tooltip-ca-nstab-special": "Ð\91о Ð°Ð»Ð±Ð°Ð½-Ñ\85аакÑ\87Ñ\8bÑ\82 Ð°Ñ\80Ñ\8bн-дÑ\8bÑ\80, Ð¾Ð½Ñ\83 эдери болдунмас.",
        "tooltip-ca-nstab-project": "Төлевилелдиң арынын көөрү",
-       "tooltip-ca-nstab-image": "Файлдың арынын көөрү",
+       "tooltip-ca-nstab-image": "Файлдың арны",
        "tooltip-ca-nstab-template": "Майыкты көөрү",
        "tooltip-ca-nstab-help": "Дуза арынын көөрү",
-       "tooltip-ca-nstab-category": "Ð\90ңгÑ\8bлалдÑ\8bÒ£ Ð°Ñ\80Ñ\8bнÑ\8bн ÐºÓ©Ó©Ñ\80Ò¯",
+       "tooltip-ca-nstab-category": "Ð\9aаÑ\82егоÑ\80иÑ\8f Ð°Ñ\80нÑ\8b",
        "tooltip-minoredit": "Бо өскертилгени \"биче\" деп демдеглээр",
-       "tooltip-save": "СилеÑ\80ниң Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80иңеÑ\80ни Ñ\88Ñ\8bгжааÑ\80Ñ\8b",
-       "tooltip-preview": "ШÑ\8bгжааÑ\80 Ð¼Ñ\83Ñ\80нÑ\83нда Ñ\81илеÑ\80ниң Ó©Ñ\81кеÑ\80лииÑ\88киннеÑ\80ин Ñ\87ижеглеп ÐºÓ©Ñ\80ем!",
-       "tooltip-diff": "Бо сөзүглелге хамаарыштыр кандыг өскертилгелерни кылган Силер - ону көргүзер.",
+       "tooltip-save": "ЭдилгелеÑ\80иңеÑ\80ни Ñ\88Ñ\8bгжап Ð°Ñ\80Ñ\82Ñ\82Ñ\8bÑ\80аÑ\80",
+       "tooltip-preview": "Ð\90Ñ\80Ñ\8bннÑ\8bÒ£ Ñ\87ижек ÐºÓ©Ñ\80үлдези: Ñ\88Ñ\8bгжааÑ\80 Ð±ÐµÑ\82инде Ð¾Ð½Ñ\83 Ð°Ð¶Ñ\8bглааÑ\80 Ñ\81илеÑ\80!",
+       "tooltip-diff": "Үндезин сөзүглелге хамаарыштыр кылдынган өскерлиишкиннерни көргүзер.",
        "tooltip-compareselectedversions": "Бо арынның шилиттинген ийи хевиринниң ылгалын көөр.",
        "tooltip-watch": "Силерниң хайгаарал даңзызынга бо арынны немерелээри",
        "tooltip-rollback": "Сөөлгү киржикчиниң өскерилгелерин чаңгыс баскаш, ойталаар",
        "tooltip-undo": "Киирген эдигни казааш, ойталалдың чылдагаанын айтыр аргалыг мурнай көргүзүүн көргүзер.",
-       "tooltip-summary": "Кысказы-биле бижиңер",
+       "tooltip-summary": "Кыска тайылбырны киириңер",
        "anonymous": "{{grammar:genitive|{{SITENAME}}}} адыжок {{PLURAL:$1|киржикчизи}}",
+       "simpleantispam-label": "Спам-га удур хыналда.\nМону <strong>долдуруңар </strong>долдурбаңар",
        "pageinfo-title": "«$1» дугайында",
        "pageinfo-header-basic": "Кол медээлел",
        "pageinfo-toolboxlink": "Арын дугайында",
        "file-info-size-pages": "$1 × $2 пикcелдер, файл хемчээли: $3, MIME хевири: $4, $5 {{PLURAL:$5|1=арын|арын}}",
        "file-nohires": "Оон улуг хевири чок",
        "svg-long-desc": "SVG файл, $1 x $2 пиксел, файл хемчээли: $3",
-       "show-big-image": "Улуг чурумал",
+       "show-big-image": "Үндезин файл",
        "show-big-image-size": "$1 × $2 пиксел",
        "newimages-legend": "Шүүрү",
        "noimages": "Nothing to see.",
        "ago": "$1 бурунгаар",
        "bad_image_list": "Формады мындыг боор ужурлуг:\n\nЧүгле даңзының идегеттери (элементилери) санатынар боор (* деп демдектен эгелээн одуруглар).\nОдуругнуң бирги шөлүдүү салдынмас чурумалче шөлүдүг болуру албан.\nОл-ла одуругнуң арткан шөлүдүглери онзагай кылдыр азы чурумал капсырып болур чүүлдер кылдыр санаттынар.",
        "metadata": "Чурумал дугайында медээлер",
-       "metadata-help": "Бо файл немелде данныйларлыг:санныг камералар азы сканнерлер дугайында медеглел. Файл чаяанының соонда эдидип турган болза, чамдык параметрлери амгы чурумалга меге кылдыр хамааржып болур.",
+       "metadata-help": "Бо файлда цифралыг камераларның болгаш сканерлерниң немеп каары немелде медээлер бар. Файлды кылган соонда эдип турган болза, ооң чамдык параметрлери ооң амгы чуруунга дүүшпес бооп болур.",
        "metadata-fields": "Бо даңзыда айыткан чурумалдар метаданныйларның кезектери чурумалдың арынынга көстүп кээр, метаданныйлар таблицазын дүрүп каан болур. \nАрткан кезектер аайлаан ёзугаар чажыт көстүр.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "Калбаа",
        "exif-imagelength": "Бедик",
+       "exif-orientation": "Кадрның ориентациязы",
+       "exif-xresolution": "доора разрешение",
+       "exif-yresolution": "узун дургаар разрешение",
+       "exif-datetime": "Файлды өскерткен ай-хүн, үе-шак",
        "exif-imagedescription": "Чурумалдың ады",
+       "exif-make": "Камераның бүдүрүкчүзү",
+       "exif-model": "Камераның модели",
        "exif-artist": "Чогаадыкчы",
+       "exif-colorspace": "Өңнер девискээри",
        "exif-usercomment": "Ажыглакчының тайылбырлары",
+       "exif-datetimeoriginal": "Шын ай-хүн болгаш үе-шак",
        "exif-jpegfilecomment": "JPEG фалй тайылбыры",
        "exif-headline": "Баш ат",
        "exif-languagecode": "Дыл",
        "compare-submit": "Дөмейлээри",
        "htmlform-submit": "Күүcедири",
        "htmlform-selectorother-other": "Өске",
+       "logentry-delete-delete": "$1 {{GENDER:$2|арынны баладып каапкан}} $3",
        "rightsnone": "(чок)",
        "feedback-cancel": "Соксаары",
        "feedback-message": "Чагаа:",
        "feedback-subject": "Кол сөс:",
-       "searchsuggest-search": "Ð\94илÑ\8dÑ\8dÑ\88кин",
+       "searchsuggest-search": "Ð\94илÑ\8dÑ\8dÑ\80",
        "duration-seconds": "$1 {{PLURAL:$1|секунда|секунда}}",
        "duration-minutes": "$1 {{PLURAL:$1|минут|минут}}",
        "duration-hours": "$1 {{PLURAL:$1|шак|шак}}",
index a623dcb..d469206 100644 (file)
                        "Lxlalexlxl",
                        "Капитан Джон Шепард",
                        "Translatemyname",
-                       "Dars"
+                       "Dars",
+                       "Mix Gerder"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "tog-hideminor": "Приховати незначні редагування у списку останніх змін",
        "tog-hidepatrolled": "Приховувати патрульовані редагування у списку нових редагувань",
        "tog-newpageshidepatrolled": "Приховувати патрульовані сторінки у списку нових сторінок",
+       "tog-hidecategorization": "Приховати категоризацію сторінок",
        "tog-extendwatchlist": "Розгорнути список спостереження, щоб показати всі зміни, а не лише останні",
        "tog-usenewrc": "Групувати редагування на сторінках останніх змін та списку спостереження",
        "tog-numberheadings": "Автоматично нумерувати заголовки",
        "tog-watchlisthidebots": "Приховати редагування ботів у списку спостереження",
        "tog-watchlisthideminor": "Приховати незначні редагування у списку спостереження",
        "tog-watchlisthideliu": "Приховати редагування зареєстрованих дописувачів у списку спостереження",
+       "tog-watchlistreloadautomatically": "Перезавантажувати список спостереження автоматично кожного разу, коли зміниться фільтр (вимагається JavaScript)",
        "tog-watchlisthideanons": "Приховати редагування анонімних користувачів у списку спостереження",
        "tog-watchlisthidepatrolled": "Приховати відпатрульовані редагування у списку спостереження",
+       "tog-watchlisthidecategorization": "Приховати категоризацію сторінок",
        "tog-ccmeonemails": "Надсилати мені копії листів, які я надсилаю іншим користувачам",
        "tog-diffonly": "Не показувати вміст сторінки під різницею версій",
        "tog-showhiddencats": "Показувати приховані категорії",
        "morenotlisted": "Цей список неповний.",
        "mypage": "Сторінка",
        "mytalk": "Обговорення",
-       "anontalk": "Обговорення для цієї IP-адреси",
+       "anontalk": "Обговорення",
        "navigation": "Навігація",
        "and": "&#32;і",
        "qbfind": "Знайти",
        "databaseerror-query": "Запит: $1",
        "databaseerror-function": "Функція: $1",
        "databaseerror-error": "Помилка: $1",
+       "transaction-duration-limit-exceeded": "Для того, щоб уникнути лагу при реплікації, ця транзакція була перервана, оскільки тривалість запису ($1) перевищила лімів в $2 сек.\nЯкщо ви змінюєте декілька елементів за один раз, постарайтесь замість цього зробити декілька невеликих операцій.",
        "laggedslavemode": "Увага: сторінка може не містити останніх редагувань.",
        "readonly": "Запис до бази даних заблокований",
        "enterlockreason": "Зазначте причину і приблизний термін блокування",
        "missingarticle-rev": "(версія № $1)",
        "missingarticle-diff": "(Різниця: $1, $2)",
        "readonly_lag": "База даних автоматично заблокована від змін, доки вторинний сервер бази даних не синхронізується з первинним.",
+       "nonwrite-api-promise-error": "Був надісланий HTTP-заголовок 'Promise-Non-Write-API-Action', але запит був до API-модуля запису.",
        "internalerror": "Внутрішня помилка",
        "internalerror_info": "Внутрішня помилка: $1",
        "internalerror-fatal-exception": "Критичний виняток типу «$1»",
        "createaccountreason": "Причина:",
        "createacct-reason": "Причина",
        "createacct-reason-ph": "Чому ви створюєте інший обліковий запис",
-       "createacct-captcha": "Перевірка безпеки",
-       "createacct-imgcaptcha-ph": "Введіть текст, який ви бачите вище",
        "createacct-submit": "Створіть ваш обліковий запис",
        "createacct-another-submit": "Створити обліковий запис",
        "createacct-benefit-heading": "{{SITENAME}} створюється такими самими людьми, як і ви.",
        "wrongpasswordempty": "Ви не ввели пароль. Будь ласка, спробуйте ще раз.",
        "passwordtooshort": "Ваш пароль закороткий, він має містити принаймні $1 {{PLURAL:$1|символ|символи|символів}}.",
        "passwordtoolong": "Пароль не може бути довшим ніж {{PLURAL:$1|1 символ|$1 символи|$1 символів}}.",
+       "passwordtoopopular": "Паролі, що часто обираються, не можуть бути використані. Будь ласка, оберіть більш унікальний пароль.",
        "password-name-match": "Ваш пароль має відрізнятися від імені користувача.",
        "password-login-forbidden": "Використання цього імені користувача і пароля заборонено.",
        "mailmypassword": "Перевстановити пароль",
        "noemailcreate": "Вам треба вказати правильну адресу електронної пошти",
        "passwordsent": "Новий пароль був надісланий на адресу електронної пошти, зазначену для \"$1\".\nБудь ласка, ввійдіть до системи після отримання пароля.",
        "blocked-mailpassword": "Редагування з вашої IP-адреси заборонено, заблокована також функція відновлення пароля, щоб запобігти зловживанням.",
-       "eauthentsent": "На вказану адресу електронної пошти відправлено лист підтвердження.\nЩоб отримувати надалі будь-які повідомлення, необхідно підтвердити, що обліковий рахунок належить справді вам, за процедурою, описаною в листі.",
+       "eauthentsent": "На вказану адресу електронної пошти відправлено лист підтвердження.\nЩоб отримувати надалі будь-які повідомлення, необхідно підтвердити, що обліковий запис належить справді Вам, за процедурою, описаною в листі.",
        "throttled-mailpassword": "Листа для оновлення пароля вже було надіслано електронною поштою протягом {{PLURAL:$1|1=останньої години|останніх $1 годин}}.\nДля попередження зловживань дозволено надсилати тільки одного листа оновлення пароля за {{PLURAL:$1|годину|$1 години|$1 годин}}.",
        "mailerror": "Помилка надсилання пошти: $1",
        "acct_creation_throttle_hit": "Відвідувачі з вашої IP-адреси вже створили $1 {{PLURAL:$1|обліковий запис|облікових записи|облікових записів}} за останню добу, що є максимумом для цього відрізка часу.\nТаким чином, користувачі з цієї IP-адреси не можуть на цей момент створювати нових облікових записів.",
        "passwordreset-emailtext-ip": "Хтось (імовірно ви, з IP-адреси $1) попросив нагадати деталі вашого облікового запису для {{SITENAME}} ($4). З вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль стане недійсним|Ці тимчасові паролі стануть недійсними}} через $5 {{PLURAL:$5|день|дні|днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший або ви згадали свій старий пароль і не бажаєте його змінювати, можете ігнорувати це повідомлення та продовжувати використовувати старий пароль.",
        "passwordreset-emailtext-user": "Користувач $1 з {{SITENAME}} попросив нагадати деталі вашого облікового запису для {{SITENAME}} ($4). З вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль|Ці тимчасові паролі}} стануть нечинні через {{PLURAL:$5|день|$5 дні|$5 днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший, або ви згадали свій старий пароль і не бажаєте його змінювати, можете просто ігнорувати це повідомлення та продовжувати використовувати старий пароль.",
        "passwordreset-emailelement": "Ім'я користувача: \n$1\n\nТимчасовий пароль: \n$2",
-       "passwordreset-emailsent": "Якщо це зареєстрована адреса електронної пошти для вашого облікового запису, то буде надісланий лист для відновлення пароля.",
+       "passwordreset-emailsentemail": "Якщо це зареєстрована адреса електронної пошти для вашого облікового запису, то буде надісланий лист для відновлення пароля.",
        "passwordreset-emailsent-capture": "Електронний лист скидання пароля було надіслано, як показано нижче.",
        "passwordreset-emailerror-capture": "Електронний лист для відновлення пароля мав бути надісланий, як показано нижче, але його надсилання {{GENDER:$2|користувачеві|користувачці}} $1 не вдалося.",
        "changeemail": "Змінити або вилучити адресу електронної пошти",
        "permissionserrors": "Помилка доступу",
        "permissionserrorstext": "У вас нема прав на виконання цієї операції з {{PLURAL:$1|1=наступної причини|наступних причин}}:",
        "permissionserrorstext-withaction": "У вас нема дозволу на $2 з {{PLURAL:$1|1=такої причини|таких причин}}:",
+       "contentmodelediterror": "Ви не можете редагувати це доопрацювання, оскільки його зміст моделі становить <code>$1</code>, і в поточній моделі вмісту сторінки становить <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Попередження: ви намагаєтеся створити сторінку, яка раніше вже була вилучена.'''\n\nПеревірте, чи справді вам справді потрібно створювати цю сторінку.\nНижче, для зручності, наведений журнал вилучень і перейменувань:",
        "moveddeleted-notice": "Ця сторінка була вилучена.\nДля довідки нижче наведені відповідні записи з журналів вилучень і перейменувань.",
        "moveddeleted-notice-recent": "На жаль, ця сторінка нещодавно була вилучена (протягом останніх 24 годин). Для довідки нижче наведені відповідні записи з журналів вилучень і перейменувань.",
        "showingresultsinrange": "Нижче показано до {{PLURAL:$1|<strong>1</strong> результату|<strong>$1</strong> результатів}} у діапазоні від #<strong>$2</strong> до #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> із <strong>$3</strong>|Результати <strong>$1 — $2</strong> із <strong>$3</strong>}}",
        "search-nonefound": "Не знайдено результатів, що відповідають запиту.",
+       "search-nonefound-thiswiki": "Немає результатів, що відповідають запиту на цьому сайті.",
        "powersearch-legend": "Розширений пошук",
        "powersearch-ns": "Пошук у просторах назв:",
        "powersearch-togglelabel": "Позначити:",
        "stub-threshold-disabled": "Вимкнений",
        "recentchangesdays": "За скільки днів показувати нові редагування:",
        "recentchangesdays-max": "(максимум $1 {{PLURAL:$1|день|дні|днів}})",
-       "recentchangescount": "Кількість редагувань для показу за умовчанням:",
+       "recentchangescount": "Кількість редагувань для показу за замовчуванням:",
        "prefs-help-recentchangescount": "Це стосується нових редагувань, історій сторінок і журналів.",
        "prefs-help-watchlist-token2": "Це секретний ключ до веб-каналу вашого списку спостереження.\nБудь-хто, хто його знає, матиме можливість читати ваш список спостереження, тому не поширюйте його.\n[[Special:ResetTokens|Натисніть тут, якщо вам потрібно скинути його]].",
        "savedprefs": "Ваші налаштування збережено.",
+       "savedrights": "Права користувача {{GENDER:$1|$1}} були збережені.",
        "timezonelegend": "Часовий пояс:",
        "localtime": "Місцевий час:",
        "timezoneuseserverdefault": "Використовувати стандартне налаштування вікі ($1)",
        "allowemail": "Дозволити електронну пошту від інших користувачів",
        "prefs-searchoptions": "Пошук",
        "prefs-namespaces": "Простори назв",
-       "default": "за умовчанням",
+       "default": "за замовчуванням",
        "prefs-files": "Файли",
        "prefs-custom-css": "Власний CSS",
        "prefs-custom-js": "Власний JS",
        "prefs-help-prefershttps": "Цей параметр набуде чинності при вашому наступному вході у систему.",
        "prefswarning-warning": "Ви внесли в свої налаштування зміни, які ще не були збережені.\nЯкщо ви залишите цю сторінку, не натиснувши \"$1\", налаштування не будуть оновлені.",
        "prefs-tabs-navigation-hint": "Порада: Ви можете використовувати клавіші стрілок вліво і вправо для переходу між вкладками в списку вкладок.",
-       "email-address-validity-valid": "Адреса електронної пошти є чинною",
-       "email-address-validity-invalid": "Введіть чинну адресу електронної пошти",
        "userrights": "Керування правами користувачів",
        "userrights-lookup-user": "Керування групами користувача",
        "userrights-user-editname": "Введіть ім'я користувача:",
        "recentchanges-label-minor": "Це незначна зміна",
        "recentchanges-label-bot": "Це редагування зроблене ботом",
        "recentchanges-label-unpatrolled": "Це редагування ще не було відпатрульоване",
-       "recentchanges-label-plusminus": "Розмір сторінки змінився на таке число байтів",
+       "recentchanges-label-plusminus": "Розмір сторінки змінився на таку кількість байтів",
        "recentchanges-legend-heading": "'''Легенда:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (див. також [[Special:NewPages|список нових сторінок]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "rcshowhidemine": "$1 мої редагування",
        "rcshowhidemine-show": "показати",
        "rcshowhidemine-hide": "приховати",
+       "rcshowhidecategorization": "$1 категоризацію сторінок",
+       "rcshowhidecategorization-show": "Показати",
+       "rcshowhidecategorization-hide": "Приховати",
        "rclinks": "Показати останні $1 редагувань за $2 днів<br />$3",
        "diff": "різн.",
        "hist": "історія",
        "filepage-nofile": "Не існує файлу з такою назвою.",
        "filepage-nofile-link": "Не існує файлу з такою назвою, але ви можете [$1 завантажити його].",
        "uploadnewversion-linktext": "Завантажити нову версію цього файлу",
-       "shared-repo-from": "з $1",
+       "shared-repo-from": "з {{GRAMMAR:genitive|$1}}",
        "shared-repo": "спільного сховища",
        "shared-repo-name-wikimediacommons": "Вікісховища",
        "filepage.css": "/* Розміщений тут CSS-код розміщений на сторінці опису файла, також і для іноземних користувачів вікі */",
        "booksources-text": "На цій сторінці наведено список посилань на сайти, де ви, можливо, знайдете додаткову інформацію про книгу. Це інтернет-магазини й системи пошуку в бібліотечних каталогах.",
        "booksources-invalid-isbn": "Вказаний номер ISBN, судячи з усього, містить помилку. Будь ласка, перевірте, що при перенесенні номера з першоджерела не виникло спотворень.",
        "specialloguserlabel": "Виконавець:",
-       "speciallogtitlelabel": "Ціль (назва або {{ns:user}}:ім'я для користувача):",
+       "speciallogtitlelabel": "Ціль (назва сторінки або {{ns:user}}:ім'я користувача):",
        "log": "Журнали",
        "all-logs-page": "Усі публічні журнали",
        "alllogstext": "Комбінований показ журналів {{grammar:genitive|{{SITENAME}}}}.\nВи можете відфільтрувати результати за типом журналу, іменем користувача (враховується регістр) або зазначеною сторінкою (також враховується регістр).",
-       "logempty": "Ð\92 журналі немає подібних записів.",
+       "logempty": "У журналі немає подібних записів.",
        "log-title-wildcard": "Знайти заголовки, що починаються з цих символів",
        "showhideselectedlogentries": "Показати/приховати виділені записи журналу",
        "log-edit-tags": "Змінити мітки для вибраних записів журналів",
        "wlheader-showupdated": "Сторінки, що змінилися після вашого останнього їх відвідування, виділені '''жирним''' шрифтом.",
        "wlnote": "Нижче наведено {{PLURAL:$1|останнє $1 редагування|останні $1 редагування|останні $1 редагувань}} за {{PLURAL:$2|останню|останні|останні}} <strong>$2</strong> {{PLURAL:$2|годину|години|годин}}, на час $3 $4.",
        "wlshowlast": "Показати зміни за останні $1 годин $2 днів",
+       "watchlistall2": "всі",
+       "watchlist-hide": "Приховати",
+       "wlshowtime": "Період часу для відображення:",
+       "wlshowhideminor": "незначні редагування",
+       "wlshowhidebots": "ботів",
+       "wlshowhideliu": "зареєстрованих користувачів",
+       "wlshowhideanons": "анонімних користувачів",
+       "wlshowhidepatr": "перевірені редагування",
+       "wlshowhidemine": "мої редагування",
        "watchlist-options": "Налаштування списку спостереження",
        "watching": "Додавання до списку спостереження…",
        "unwatching": "Вилучення зі списку спостереження…",
        "undelete-error-long": "Під час відновлення файлу виникли помилки:\n\n$1",
        "undelete-show-file-confirm": "Ви впевнені, що хочете переглянути вилучену версію файлу «<nowiki>$1</nowiki>» від $3 $2?",
        "undelete-show-file-submit": "Так",
-       "namespace": "Простір назв:",
+       "namespace": "Простір&nbsp;назв:",
        "invert": "Крім вибраного",
        "tooltip-invert": "Встановіть цей прапорець, щоб приховати зміни на сторінках, в межах обраного простору імен (і пов'язаних просторів імен, за потреби)",
        "tooltip-whatlinkshere-invert": "Поставте цю галочку, щоб приховати зміни на сторінках із обраного простору назв.",
        "contributions": "Внесок {{GENDER:$1|користувача|користувачки}}",
        "contributions-title": "Внесок користувача $1",
        "mycontris": "Внесок",
+       "anoncontribs": "Внесок",
        "contribsub2": "Для {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Обліковий запис користувача  «$1» не зареєстровано.",
        "nocontribs": "Редагувань, що задовольняють заданим умовам не знайдено.",
        "movenosubpage": "Ця сторінка не має підсторінок.",
        "movereason": "Причина:",
        "revertmove": "відкинути",
-       "delete_and_move": "Вилучити і перейменувати",
        "delete_and_move_text": "== Потрібне вилучення ==\nСторінка з назвою [[:$1|«$1»]] вже існує.\nБажаєте вилучити її для можливості перейменування?",
        "delete_and_move_confirm": "Так, вилучити для перейменування",
        "delete_and_move_reason": "Вилучена для можливості перейменування сторінки «[[$1]]»",
        "tooltip-pt-preferences": "Ваші налаштування",
        "tooltip-pt-watchlist": "Список сторінок, за змінами в яких Ви спостерігаєте",
        "tooltip-pt-mycontris": "Ваш внесок",
+       "tooltip-pt-anoncontribs": "Список редагувань, зроблених з цієї IP-адреси",
        "tooltip-pt-login": "Тут можна зареєструватися в системі, але це не обов'язково.",
        "tooltip-pt-logout": "Вихід із системи",
        "tooltip-pt-createaccount": "Пропонуємо створити обліковий запис і увійти в систему; однак, це не обов'язково",
        "svg-long-error": "неправильний SVG-файл: $1",
        "show-big-image": "Повна роздільність",
        "show-big-image-preview": "Розмір при попередньому перегляді: $1.",
+       "show-big-image-preview-differ": "Розмір цього $3-превью для вихідного $2-файлу: $1.",
        "show-big-image-other": "{{PLURAL:$2|1=Інша роздільність|Інші роздільності}}: $1.",
        "show-big-image-size": "$1 × $2 пікселів",
        "file-info-gif-looped": "кільцеве",
        "intentionallyblankpage": "Цю сторінку навмисне залишили порожньою",
        "external_image_whitelist": "  #Залиште цей рядок таким, яким він є<pre>\n#Записуйте тут фрагменти регулярних виразів (ту частину, що знаходиться між //)\n#Вони будуть зіставлені з URL зовнішніх зображень.\n#Потрібні будуть показані як зображення, решта будуть показані як посилання на зображення\n#Рядки, що починаються з #, вважаються коментарями.\n#Рядки чутливі до регістра\n\n#Розміщуйте фрагменти регулярних виразів над цією строчкою. Залиште цей рядок таким, яким він є.</pre>",
        "tags": "Чинні мітки змін",
-       "tag-filter": "Фільтр [[Special:Tags|міток]]:",
+       "tag-filter": "Фільтр&nbsp;[[Special:Tags|міток]]:",
        "tag-filter-submit": "Відфільтрувати",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Мітка|Мітки|Міток}}]]: $2)",
        "tags-title": "Мітки",
        "htmlform-cloner-required": "Необхідно принаймні одне значення.",
        "htmlform-title-badnamespace": "[[:$1]] не в просторі назв «{{ns:$2}}».",
        "htmlform-title-not-creatable": "«$1» — назва сторінки, яку не можна створити",
-       "htmlform-title-not-exists": "[[:$1]] не існує.",
+       "htmlform-title-not-exists": "$1 не існує.",
        "htmlform-user-not-exists": "<strong>$1</strong> не існує.",
        "htmlform-user-not-valid": "<strong>$1</strong> не є дійсним іменем користувача.",
        "sqlite-has-fts": "$1 з підтримкою повнотекстового пошуку",
        "logentry-suppress-block": "$1 {{GENDER:$2|заблокував}} {{GENDER:$4|$3}} строком на $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|змінив}} блокування для {{GENDER:$4|$3}} на період $5 $6",
        "logentry-import-upload": "$1 імпортува{{GENDER:$2|в|ла}} $3 через завантаження файлів",
+       "logentry-import-upload-details": "$1 {{GENDER:$2|імпортував|імпортувала}} $3 за допомогою файлового завантаження ($4 {{PLURAL:$4|версія|версій|версії}})",
        "logentry-import-interwiki": "$1 імпортува{{GENDER:$2|в|ла}} $3 з іншої вікі",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|імпортував|імпортувала}} $3 з $5 ($4 {{PLURAL:$4|версія|версій|версії}})",
        "logentry-merge-merge": "$1 {{GENDER:$2|приєднав|приєднала}} $3 до $4 (версії до $5)",
        "logentry-move-move": "$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4 без створення перенаправлення",
index c2ef7ac..7ad6b90 100644 (file)
                        "عرفان ارشد",
                        "Obaid Raza",
                        "عثمان خان شاہ",
-                       "Syedalinaqinaqvi"
+                       "Syedalinaqinaqvi",
+                       "محمد افضل"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
-       "tog-hideminor": "حالیہ تبدیلیوں میں معمولی ترامیم چھپائیے",
-       "tog-hidepatrolled": "حالیہ تبدیلیوں میں گشتی ترامیم چھپائیے",
-       "tog-newpageshidepatrolled": "جدید صفحات کی فہرست میں گشتی صفحات چھپائیے",
-       "tog-extendwatchlist": "زÛ\8cر Ù\86ظر Ù\81Û\81رست Ú©Û\8c ØªÙ\88سÛ\8cع Ú©Û\8cجئÛ\92 ØªØ§Ú©Û\81 ØªÙ\85اÙ\85 ØªØ¨Ø¯Û\8cÙ\84Û\8cاںØ\8c Ù\86Û\81 Ú©Û\81 ØµØ±Ù\81 Ø³Ø¨ Ø³Û\92 Ø­Ø§Ù\84Û\8cÛ\81 ØªØ¯Ø§Ù\88Û\8cÙ\86 Ø¯Û\8cÚ©Ú¾Û\8c Ú©Ø¬Ø§ Ø³Ú©یں",
-       "tog-usenewrc": "حالیہ تبدیلیوں میں اور زیر نظر فہرست میں تبدیلیوں کو بلحاظ صفحہ گروہ بند کیجئے",
-       "tog-numberheadings": "سرخیوں کو خودکار نمبر دیجئے",
-       "tog-showtoolbar": "تدÙ\88Û\8cÙ\86Û\8c Ø§Ù\88زارداÙ\86 Ø¯Ú©Ú¾Ø§Ø¦Û\8cÛ\92",
-       "tog-editondblclick": "Ø·Ù\82Û\8cÙ\86 Ù¾Ø± ØµÙ\81حات Ú©Û\8c ØªØ±Ù\85Û\8cÙ\85 Ú©Û\8cجئÛ\92",
-       "tog-editsectiononrightclick": "سطری عنوانات پر دایاں طق (رائیٹ کلک) کے ذریعے سطری ترمیم کاری فعال بناؤ",
-       "tog-watchcreations": "میرے تخلیق کردہ صفحات اور میری زبر اثقال کردہ ملفات کو میری زیر نظر فہرست میں شامل کیا کیجئے",
-       "tog-watchdefault": "Ù\85Û\8cرÛ\92 ØªØ¯Ù\88Û\8cÙ\86 Ø´Ø¯Û\81 ØµÙ\81حات Ø§Ù\88ر Ù\85Ù\84Ù\81ات Ú©Ù\88 Ù\85Û\8cرÛ\8c Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ù\85Û\8cÚº Ø´Ø§Ù\85Ù\84 Ú©Û\8cا Ú©Û\8cجئÛ\92",
-       "tog-watchmoves": "Ù\85Û\8cرÛ\92 Ù\85Ù\86تÙ\82Ù\84 Ú©Ø±Ø¯Û\81 ØµÙ\81حات Ø§Ù\88ر Ù\85Ù\84Ù\81ات Ú©Ù\88 Ù\85Û\8cرÛ\8c Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ù\85Û\8cÚº Ø´Ø§Ù\85Ù\84 Ú©Û\8cا Ú©Û\8cجئÛ\92",
-       "tog-watchdeletion": "Ù\85Û\8cرÛ\92 Ø­Ø°Ù\81 Ú©Ø±Ø¯Û\81 ØµÙ\81حات Ø§Ù\88ر Ù\85Ù\84Ù\81ات Ú©Ù\88 Ù\85Û\8cرÛ\8c Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ù\85Û\8cÚº Ø´Ø§Ù\85Ù\84 Ú©Û\8cا Ú©Û\8cجئÛ\92",
-       "tog-watchrollback": "میں جن صفحات کو استرجع کروں وہ میری زیر نظر فہرست میں شامل کیا کریں",
-       "tog-minordefault": "تمام ترمیمات کو ہمیشہ بطورِ معمولی ترمیم نشانزد کیا کرو",
-       "tog-previewontop": "تدÙ\88Û\8cÙ\86Û\8c Ø®Ø§Ù\86Û\81 Ø³Û\92 Ù¾Û\81Ù\84Û\92 Ù\86Ù\85ائش Ø¯Ú©Ú¾Ø§Ø¤",
-       "tog-previewonfirst": "Ù¾Û\81Ù\84Û\8c ØªØ±Ù\85Û\8cÙ\85 Ù¾Ø± Ù\86Ù\85ائش Ø¯Ú©Ú¾Ø§Ø¤",
-       "tog-enotifwatchlistpages": "جب Ù\85Û\8cرÛ\92 Ø²Û\8cر Ù\86ظر ØµÙ\81Ø­Û\81 Û\8cا Ù\85Ù\84Ù\81 Ù\85Û\8cÚº Ú©Ù\88ئÛ\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c Û\81Ù\88 ØªÙ\88 Ù\85جھÛ\92 Ø¨Ø±Ù\82Û\8c Ú\88اک Ø¨Ú¾Û\8cجئÛ\92",
-       "tog-enotifusertalkpages": "جب میرا تبادلۂ خیال صفحہ میں تبدیلی واقع ہو تو مجھے برقی ڈاک بھیجو",
-       "tog-enotifminoredits": "Ù\85جھÛ\92 ØµÙ\81حات Ø§Ù\88ر Ù\85Ù\84Ù\81ات Ù\85Û\8cÚº Ú©Û\8c Ø¬Ø§Ù\86Û\92 Ù\88اÙ\84Û\8c Ù\85عÙ\85Ù\88Ù\84Û\8c ØªØ±Ø§Ù\85Û\8cÙ\85 Ú©Û\8c Ø®Ø¨Ø± Ø¨Ú¾Û\8c Ø¨Ø°Ø±Û\8cعÛ\81 Ø¨Ø±Ù\82Û\8c Ú\88اک Ø¯Û\8cجئÛ\92",
-       "tog-enotifrevealaddr": "خبردارÛ\8c Ø¨Ø±Ù\82Û\8c Ø®Ø·Ù\88Ø· Ù\85Û\8cÚº Ù\85Û\8cرا Ø¨Ø±Ù\82Û\8c Ú\88اک Ù¾ØªÛ\81 Ø¸Ø§Û\81ر Ú©Ø±Ù\88",
-       "tog-shownumberswatching": "دÛ\8cÚ©Ú¾Ù\86Û\92 Ù\88اÙ\84Û\92 ØµØ§Ø±Ù\81Û\8cÙ\86 Ú©Û\8c ØªØ¹Ø¯Ø§Ø¯ Ø¯Ú©Ú¾Ø§Ø¤",
+       "tog-hideminor": "حالیہ تبدیلیوں میں معمولی ترامیم چھپائیں",
+       "tog-hidepatrolled": "حالیہ تبدیلیوں میں گشتی ترامیم چھپائیں",
+       "tog-newpageshidepatrolled": "جدید صفحات کی فہرست میں مراجعت شدہ صفحات چھپائیں",
+       "tog-extendwatchlist": "حاÙ\84Û\8cÛ\81 ØªØ±Û\8cÙ\86 ØªØ¨Ø¯Û\8cÙ\84Û\8cÙ\88Úº Ú©Û\92 Ø¨Ø¬Ø§Ø¦Û\92 Ø¬Ù\85Ù\84Û\81 ØªØ¨Ø¯Û\8cÙ\84Û\8cاں Ø¯Û\8cÚ©Ú¾Ù\86Û\92 Ú©Û\92 Ù\84Û\8cÛ\92 Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ú©Û\8c ØªÙ\88سÛ\8cع Ú©Ø±یں",
+       "tog-usenewrc": "حالیہ تبدیلیاں اور زیر نظر فہرست میں تبدیلیوں کو بلحاظ صفحہ گروہ بند کیجئے",
+       "tog-numberheadings": "سرخیوں کو خودکار نمبر دیں",
+       "tog-showtoolbar": "Ø¢Ù\84ات ØªØ±Ù\85Û\8cÙ\85 Ø¯Ú©Ú¾Ø§Ø¦Û\8cÚº",
+       "tog-editondblclick": "دÙ\88 Ú©Ù\84Ú© Ù¾Ø± ØµÙ\81حات Ú©Û\8c ØªØ±Ù\85Û\8cÙ\85 Ú©Ø±Û\8cÚº",
+       "tog-editsectiononrightclick": "قطعہ کے عنوانات پر رائیٹ کلک کے ذریعے قطعہ کی ترمیم کاری فعال کریں",
+       "tog-watchcreations": "میرے تخلیق کردہ صفحات اور اپلوڈ کردہ فائلوں کو میری زیر نظر فہرست میں شامل کریں",
+       "tog-watchdefault": "Ù\85Û\8cرÛ\92 ØªØ±Ù\85Û\8cÙ\85 Ø´Ø¯Û\81 ØµÙ\81حات Ø§Ù\88ر Ù\81ائÙ\84Ù\88Úº Ú©Ù\88 Ù\85Û\8cرÛ\8c Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ù\85Û\8cÚº Ø´Ø§Ù\85Ù\84 Ú©Ø±Û\8cÚº",
+       "tog-watchmoves": "Ù\85Û\8cرÛ\92 Ù\85Ù\86تÙ\82Ù\84 Ú©Ø±Ø¯Û\81 ØµÙ\81حات Ø§Ù\88ر Ù\81ائÙ\84Ù\88Úº Ú©Ù\88 Ù\85Û\8cرÛ\8c Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ù\85Û\8cÚº Ø´Ø§Ù\85Ù\84 Ú©Ø±Û\8cÚº",
+       "tog-watchdeletion": "Ù\85Û\8cرÛ\92 Ø­Ø°Ù\81 Ú©Ø±Ø¯Û\81 ØµÙ\81حات Ø§Ù\88ر Ù\81ائÙ\84Ù\88Úº Ú©Ù\88 Ù\85Û\8cرÛ\8c Ø²Û\8cر Ù\86ظر Ù\81Û\81رست Ù\85Û\8cÚº Ø´Ø§Ù\85Ù\84 Ú©Ø±Û\8cÚº",
+       "tog-watchrollback": "میرے استرجع کردہ صفحات کو میری زیر نظر فہرست میں شامل کریں",
+       "tog-minordefault": "ہمیشہ میری تمام ترامیم کو معمولی ترمیم کے طور پر نشان زد کریں",
+       "tog-previewontop": "خاÙ\86Û\81 ØªØ±Ù\85Û\8cÙ\85 Ø³Û\92 Ù¾Û\81Ù\84Û\92 Ù\86Ù\85ائش Ø¯Ú©Ú¾Ø§Ø¦Û\8cÚº",
+       "tog-previewonfirst": "Ù¾Û\81Ù\84Û\8c ØªØ±Ù\85Û\8cÙ\85 Ù¾Ø± Ù\86Ù\85ائش Ø¯Ú©Ú¾Ø§Ø¦Û\8cÚº",
+       "tog-enotifwatchlistpages": "جب Ù\85Û\8cرÛ\92 Ø²Û\8cر Ù\86ظر ØµÙ\81Ø­Û\81 Û\8cا Ù\81ائÙ\84 Ù\85Û\8cÚº Ú©Ù\88ئÛ\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c Û\81Ù\88 ØªÙ\88 Ù\85جھÛ\92 Ø¨Ø±Ù\82Û\8c Ú\88اک Ø¨Ú¾Û\8cجÛ\8cÚº",
+       "tog-enotifusertalkpages": "جب میرے تبادلۂ خیال صفحہ میں تبدیلی ہو تو مجھے برقی ڈاک بھیجیں",
+       "tog-enotifminoredits": "Ù\85جھÛ\92 ØµÙ\81حات Ø§Ù\88ر Ù\81ائÙ\84Ù\88Úº Ù\85Û\8cÚº Ú©Û\8c Ø¬Ø§Ù\86Û\92 Ù\88اÙ\84Û\8c Ù\85عÙ\85Ù\88Ù\84Û\8c ØªØ±Ø§Ù\85Û\8cÙ\85 Ú©Û\8c Ø®Ø¨Ø± Ø¨Ú¾Û\8c Ø¨Ø°Ø±Û\8cعÛ\81 Ø¨Ø±Ù\82Û\8c Ú\88اک Ø¨Ú¾Û\8cجÛ\8cÚº",
+       "tog-enotifrevealaddr": "اطÙ\84اعاتÛ\8c Ø¨Ø±Ù\82Û\8c Ø®Ø·Ù\88Ø· Ù\85Û\8cÚº Ù\85Û\8cرا Ø¨Ø±Ù\82Û\8c Ú\88اک Ù¾ØªÛ\81 Ø¸Ø§Û\81ر Ú©Ø±Û\8cÚº",
+       "tog-shownumberswatching": "دÛ\8cÚ©Ú¾Ù\86Û\92 Ù\88اÙ\84Û\92 ØµØ§Ø±Ù\81Û\8cÙ\86 Ú©Û\8c ØªØ¹Ø¯Ø§Ø¯ Ø¯Ú©Ú¾Ø§Ø¦Û\8cÚº",
        "tog-oldsig": "موجودہ دستخط:",
-       "tog-fancysig": "(سادہ دستخط بلا خودکار ربط)",
-       "tog-uselivepreview": "براÛ\81 Ø±Ø§Ø³Øª Ù\86Ù\85ائش (آزÙ\85ائشÛ\8c) Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Û\8cجئÛ\92",
-       "tog-forceeditsummary": "جب Ù\85Û\8cÚº ØªØ±Ù\85Û\8cÙ\85Û\8c Ø®Ù\84اصÛ\81 Ø®Ø§Ù\84Û\8c Ú\86Ú¾Ù\88Ú\91Ù\88Úº ØªÙ\88 Ù\85جھÛ\92 Ø¢Ú¯Ø§Û\81 Ú©Ø±Ù\88",
-       "tog-watchlisthideown": "زیرِنظرفہرست سے میری ترمیمات چھپاؤ",
-       "tog-watchlisthidebots": "زیرِنظرفہرست میں سے روبالی ترمیمات چھپاؤ",
-       "tog-watchlisthideminor": "زیرِنظرفہرست سے معمولی ترمیمات چھپاؤ",
-       "tog-watchlisthideliu": "زیرِنظرفہرست میں سے داخلِ نوشتہ شدہ صارفین کی ترمیمات چھپاؤ",
-       "tog-watchlisthideanons": "زیرِنظرفہرست میں سے نامعلوم صارفین کی ترمیمات چھپاؤ",
-       "tog-watchlisthidepatrolled": "زیرِنظرفہرست میں سے گشت شدہ ترمیمات چھپاؤ",
-       "tog-ccmeonemails": "دیگر صارفین کو ارسال کردہ برقی خطوط کی نقول مجھے ارسال کریں۔",
-       "tog-diffonly": "Ù\85ختÙ\84Ù\81ات Ú©Û\92 Ù\86Û\8cÚ\86Û\92 ØµÙ\81Ø­Û\92 Ú©Û\8c Ù\85Ø´Ù\85Ù\88Ù\84ات Ù\85ت Ø¯Ú©Ú¾Ø§Ø¤",
-       "tog-showhiddencats": "Ù¾Ù\88Ø´Û\8cدÛ\81 Ø²Ù\85رÛ\81 Ø¬Ø§Øª Ø¯Ú©Ú¾Ø§Ø¤",
-       "tog-norollbackdiff": "استرجع کی انجام دہی کے بعد فرق ترک کیجئے",
-       "tog-useeditwarning": "خبردار Ù\85جھÛ\92 Ø¬Ø¨ Ù\85Û\8cÚº ØºÛ\8cر Ù\85Ø­Ù\81Ù\88ظ Ú©Ø±Ø¯Û\81 ØªØ¨Ø¯Û\8cÙ\84Û\8cÙ\88Úº Ú©Û\92 Ø³Ø§ØªÚ¾ Ø§Û\8cÚ© ØªØ±Ù\85Û\8cÙ\85 Ú©Û\92 ØµÙ\81Ø­Û\92 Ú©Ù\88 Ú\86Ú¾Ù\88Ú\91 Ø¯Ù\88",
-       "tog-prefershttps": "دخول نوشتہ کے دوران محفوظ کنکشن استعمال کیجئے",
+       "tog-fancysig": "سادہ دستخط (بلا خودکار ربط)",
+       "tog-uselivepreview": "راست Ù\86Ù\85ائش Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Ø±Û\8cÚº",
+       "tog-forceeditsummary": "Ø®Ù\84اصÛ\81 ØªØ±Ù\85Û\8cÙ\85 Ø®Ø§Ù\84Û\8c Ú\86Ú¾Ù\88Ú\91Ù\86Û\92 Ù¾Ø± Ù\85جھÛ\92 Ø¢Ú¯Ø§Û\81 Ú©Ø±Û\8cÚº",
+       "tog-watchlisthideown": "زیرِنظر فہرست سے میری ترامیم چھپائیں",
+       "tog-watchlisthidebots": "زیرِنظر فہرست سے روبہ جاتی ترامیم چھپائیں",
+       "tog-watchlisthideminor": "زیرِنظر فہرست سے معمولی ترامیم چھپائیں",
+       "tog-watchlisthideliu": "زیرِنظر فہرست سے داخلِ نوشتہ شدہ صارفین کی ترامیم چھپائیں",
+       "tog-watchlisthideanons": "زیرِنظر فہرست سے نامعلوم صارفین کی ترامیم چھپائیں",
+       "tog-watchlisthidepatrolled": "زیرِنظر فہرست سے مراجع شدہ ترامیم چھپائیں",
+       "tog-ccmeonemails": "دÛ\8cگر ØµØ§Ø±Ù\81Û\8cÙ\86 Ú©Ù\88 Ø§Ø±Ø³Ø§Ù\84 Ú©Ø±Ø¯Û\81 Ø¨Ø±Ù\82Û\8c Ø®Ø·Ù\88Ø· Ú©Û\8c Ù\86Ù\82Ù\88Ù\84 Ù\85جھÛ\92 Ø¨Ú¾Û\8c Ø§Ø±Ø³Ø§Ù\84 Ú©Ø±Û\8cÚºÛ\94",
+       "tog-diffonly": "Ù\81رÙ\82 Ú©Û\92 Ù\86Û\8cÚ\86Û\92 ØµÙ\81Ø­Û\92 Ú©Û\92 Ù\85Ø´Ù\85Ù\88Ù\84ات Ù\86Û\81 Ø¯Ú©Ú¾Ø§Ø¦Û\8cÚº",
+       "tog-showhiddencats": "Ù¾Ù\88Ø´Û\8cدÛ\81 Ø²Ù\85رÛ\81 Ø¬Ø§Øª Ø¯Ú©Ú¾Ø§Ø¦Û\8cÚº",
+       "tog-norollbackdiff": "استرجع کی انجام دہی کے بعد فرق ترک کریں",
+       "tog-useeditwarning": "غÛ\8cر Ù\85Ø­Ù\81Ù\88ظ ØªØ¨Ø¯Û\8cÙ\84Û\8cاں Ú\86Ú¾Ù\88Ú\91Ù\86Û\92 Ù¾Ø± Ù\85جھÛ\92 Ø¢Ú¯Ø§Û\81 Ú©Ø±Û\8cÚº",
+       "tog-prefershttps": "لاگ ان رہنے کے دوران ہمیشہ محفوظ کنیکشن استعمال کریں",
        "underline-always": "ہمیشہ",
        "underline-never": "کبھی نہیں",
-       "underline-default": "جلد یا متصفح کا ڈیفالٹ",
-       "editfont-style": "خاÙ\86Û\82 ØªØ¯Ù\88Û\8cÙ\86 Ú©Ø§ Ø§Ù\86دازÙ\90 ØªØ­Ø±Û\8cر:",
-       "editfont-default": "متصفح کا طے شدہ",
-       "editfont-monospace": "یکفضائی نویسہ",
-       "editfont-sansserif": "بÛ\92Ø­Ù\84Û\8cÛ\81 Ù\86Ù\88Û\8cسÛ\81",
-       "editfont-serif": "Ø­Ù\84Û\8cÛ\81 Ù\86Ù\88Û\8cسÛ\81",
+       "underline-default": "جلد یا براؤزر کا ڈیفالٹ",
+       "editfont-style": "خاÙ\86Û\82 ØªØ±Ù\85Û\8cÙ\85 Ú©Ø§ Ù\81اÙ\86Ù¹:",
+       "editfont-default": "براؤزر کا ڈیفالٹ",
+       "editfont-monospace": "مونوسپیسڈ فونٹ",
+       "editfont-sansserif": "سÙ\86س Ø³Û\8cرÙ\81 Ù\81Ù\88Ù\86Ù¹",
+       "editfont-serif": "سÛ\8cرÙ\81 Ù\81Ù\88Ù\86Ù¹",
        "sunday": "اتوار",
        "monday": "پير",
        "tuesday": "منگل",
        "november-date": "$1 نومبر",
        "december-date": "$1 دسمبر",
        "pagecategories": "{{PLURAL:$1|زمرہ|زمرہ جات}}",
-       "category_header": "زمرہ \"$1\" میں مضامین",
+       "category_header": "زمرہ \"$1\" میں صفحات",
        "subcategories": "ذیلی زمرہ جات",
-       "category-media-header": "زÙ\85رÛ\81 \"$1\" Ù\85Û\8cÚº Ù\88سÛ\8cØ·",
-       "category-empty": "‘‘اِس زمرہ میں ابھی کوئی صفحات یا وسیط موجود نہیں.’’",
+       "category-media-header": "زÙ\85رÛ\81 \"$1\" Ù\85Û\8cÚº Ù\85Û\8cÚ\88Û\8cا",
+       "category-empty": "<em>اس زمرہ میں ابھی کوئی صفحہ یا میڈیا موجود نہیں ہے۔</em>",
        "hidden-categories": "{{PLURAL:$1|پوشیدہ زمرہ|پوشیدہ زمرہ جات}}",
        "hidden-category-category": "پوشیدہ زمرہ جات",
-       "category-subcat-count": "{{PLURAL:$2|اِس زمرہ میں صرف درج ذیل ذیلی زمرہ ہے.|اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ|$1 ذیلی زمرہ جات}}, کل $2 میں سے.}}",
+       "category-subcat-count": "{{PLURAL:$2|اِس زمرہ میں محض درج ذیل ذیلی زمرہ موجود ہے.|اِس زمرہ میں کل $2 میں سے درج ذیل {{PLURAL:$1|ذیلی زمرہ|$1 ذیلی زمرہ جات}} موجود ہیں۔}}",
        "category-subcat-count-limited": "اِس زمرہ میں درج ذیل {{PLURAL:$1|ذیلی زمرہ ہے|$1 ذیلی زمرہ جات ہیں}}.",
-       "category-article-count": "{{PLURAL:$2|اس زمرہ میں صرف درج ذیل صفحہ شامل کیا گیا ہے۔|اس زمرہ کے کل $2 صفحات میں سے $1 {{PLURAL:$1|صفحہ|صفحات}} درج ذیل {{PLURAL:$1|ہے|ہیں}}۔",
-       "category-article-count-limited": "یہ درج ذیل {{PLURAL:$1|صفحہ|$1 صفحات}} اس زمرہ میں مشمول {{PLURAL:$1|ہے|ہیں}}۔",
-       "category-file-count": "{{PLURAL:$2|اس Ø²Ù\85رÛ\81 Ù\85Û\8cÚº ØµØ±Ù\81 Ø¯Ø±Ø¬ Ø°Û\8cÙ\84 Ù\85Ù\84Ù\81 Ø´Ø§Ù\85Ù\84 Ú©Û\8c Ú¯Ø¦Û\8c Û\81Û\92Û\94|اس Ø²Ù\85رÛ\81 Ú©Û\8c Ú©Ù\84 $2 Ù\85Ù\84Ù\81ات Ù\85Û\8cÚº Ø³Û\92 $1 {{PLURAL:$1|Ù\85Ù\84Ù\81\85Ù\84Ù\81ات}} Ø¯Ø±Ø¬ Ø°Û\8cÙ\84 {{PLURAL:$1|Û\81Û\92\81Û\8cÚº}}۔",
-       "category-file-count-limited": "یہ درج ذیل {{PLURAL:$1|صفحہ|$1 صفحات}} اس زمرہ میں شامل {{PLURAL:$1|ہے|ہیں}}۔",
-       "listingcontinuesabbrev": "۔جاری",
+       "category-article-count": "{{PLURAL:$2|اس زمرہ میں محض درج ذیل صفحہ موجود ہے۔|اس زمرہ کے کل $2 صفحات میں سے $1 {{PLURAL:$1|صفحہ|صفحات}} درج ذیل {{PLURAL:$1|ہے|ہیں}}}}۔",
+       "category-article-count-limited": "درج ذیل {{PLURAL:$1|صفحہ|$1 صفحات}} اس زمرہ میں شامل {{PLURAL:$1|ہے|ہیں}}۔",
+       "category-file-count": "{{PLURAL:$2|اس Ø²Ù\85رÛ\81 Ù\85Û\8cÚº ØµØ±Ù\81 Ø¯Ø±Ø¬ Ø°Û\8cÙ\84 Ù\81ائÙ\84 Ù\85Ù\88جÙ\88د Û\81Û\92Û\94|اس Ø²Ù\85رÛ\81 Ú©Û\8c Ú©Ù\84 $2 Ù\81ائÙ\84Ù\88Úº Ù\85Û\8cÚº Ø³Û\92 $1 {{PLURAL:$1|Ù\81ائÙ\84\81ائÙ\84Û\8cÚº}} Ø¯Ø±Ø¬ Ø°Û\8cÙ\84 {{PLURAL:$1|Û\81Û\92\81Û\8cÚº}}}}۔",
+       "category-file-count-limited": "درج ذیل {{PLURAL:$1|فائل|$1 فائلیں}} اس زمرہ میں شامل {{PLURAL:$1|ہے|ہیں}}۔",
+       "listingcontinuesabbrev": "جاری۔",
        "index-category": "فہرست شدہ صفحات",
-       "noindex-category": "غÛ\8cر Ù\85Ù\86درج صفحات",
-       "broken-file-category": "صفحات بمعہ شکستہ فائل روابط",
+       "noindex-category": "غÛ\8cر Ù\81Û\81رست Ø´Ø¯Û\81 صفحات",
+       "broken-file-category": "صفحات مع شکستہ فائل روابط",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "تعارف",
-       "article": "صÙ\81Ø­Û\82 Ù\85Ø´Ù\85Ù\88Ù\84",
-       "newwindow": "(نـئی ونـڈو میـں)",
+       "article": "صÙ\81Ø­Û\81 Ù\85Ù\88اد",
+       "newwindow": "(نـئی ونـڈو میـں کھولیں)",
        "cancel": "منسوخ",
-       "moredotdotdot": "اور...",
+       "moredotdotdot": "مزید...",
        "morenotlisted": "یہ فہرست مکمل نہیں ہے۔",
-       "mypage": "میرا صفحہ",
+       "mypage": "صفحہ",
        "mytalk": "تبادلۂ خیال",
-       "anontalk": "اس IP کیلیے بات چیت",
+       "anontalk": "اس آئی پی پتہ کا تبادلۂ خیال",
        "navigation": "رہنمائی",
        "and": "&#32;اور",
-       "qbfind": "ڈھونڈ",
-       "qbbrowse": "تصفّح",
+       "qbfind": "تلاش",
+       "qbbrowse": "مطالعہ",
        "qbedit": "ترمیم",
-       "qbpageoptions": "صفحۂ ہٰذا",
+       "qbpageoptions": "یہ صفحہ",
        "qbmyoptions": "میرے صفحات",
-       "faq": "معلوماتِ عامہ",
+       "faq": "عام طور پر پوچھے جانے والے سوالات",
        "faqpage": "Project:معلوماتِ عامہ",
        "actions": "ایکشنز",
        "namespaces": "جائے نام",
        "disclaimerpage": "Project:عام اعلان",
        "edithelp": "معاونت براۓ ترمیم",
        "helppage-top-gethelp": "مدد",
-       "mainpage": "صÙ\81Ø­Û\82 Ø§Ù\88Ù\84",
-       "mainpage-description": "صفحہ اول",
+       "mainpage": "سرÙ\88رÙ\82",
+       "mainpage-description": "صفحہ اول/سرورق",
        "policy-url": "Project:حکمتِ عملی",
        "portal": "دیوان عام",
        "portal-url": "Project:دیوان عام",
        "nstab-template": "سانچہ",
        "nstab-help": "معاونت",
        "nstab-category": "زمرہ",
+       "mainpage-nstab": "صفحۂ اول",
        "nosuchaction": "کوئی سا عمل نہیں",
        "nosuchactiontext": "URL کی جانب سے مختص کیا گیا عمل درست نہیں.\nآپ نے شاید URL غلط لکھا، یا کسی غیر صحیح ربط کی پیروی کی ہے.\n{{اِس سے SITENAME کے زیرِ استعمال مصنع لطیف میں کھٹمل کی نشاندہی کا بھی اندیشہ ہے}}.",
        "nosuchspecialpage": "کوئی ایسا خاص صفحہ نہیں",
        "viewsource": "مسودہ",
        "viewsource-title": "$1 کا مسودہ دیکھیں",
        "actionthrottled": "Action throttled",
-       "actionthrottledtext": "بطÙ\88رÙ\90 Ø§Û\8cÚ© Ø¶Ø¯Ø³Ù¾Ù\85 ØªØ¯Ø¨Û\8cرØ\8c Ø¢Ù¾ Ú©Ù\88 Ù\85ختصر Ù\88Ù\82ت Ù\85Û\8cÚº Ú©Ø¦Û\8c Ø¨Ø§Ø± Û\8cÛ\81 Ø¹Ù\85Ù\84 Ø¨Ø¬Ø§ Ù\84اÙ\86Û\92 Ø³Û\92 Ù\85حدÙ\88د Ú©Û\8cا Ú¯Û\8cاØ\8c Ø§Ù\88ر Ø¢Ù¾ Û\8cÛ\81 Ø­Ø¯ Ù¾Ø§Ø± Ú©Ø±Ú\86Ú©Û\92 Û\81Û\8cÚº.\nبراÛ\81Ù\90 Ú©Ø±Ù\85Ø\8c Ú©Ú\86Ú¾ Ù\85Ù\86Ù¹ Ø¨Ø¹Ø¯ Ú©Ù\88شش Ú©Û\8cجئÛ\92.",
+       "actionthrottledtext": "اÛ\8cÚ© Ø¶Ø¯ Ø³Ù¾Ù\85 Ù\85عÛ\8cار Ú©Û\92 Ø·Ù\88ر Ù¾Ø± Ø¢Ù¾ Ú©Û\92 Ù\84Û\8cÛ\92 Ù\85ختصر Ù\88Ù\82ت Ù\85Û\8cÚº Ù\85تعدد Ø¯Ù\81عÛ\81 Û\8cÛ\81 Ø§Ù\82داÙ\85 Ú©Ø±Ù\86Û\92 Ú©Û\92 Ù\84Û\8cÛ\92 Ø­Ø¯ Ù\85تعÛ\8cÙ\86 Ú©Û\8c Ú¯Ø¦Û\8c Û\81Û\92Ø\8c Ø§Ù\88ر Ø¢Ù¾ Û\8cÛ\81 Ø­Ø¯ Ù¾Ø§Ø± Ú©Ø±Ú\86Ú©Û\92 Û\81Û\8cÚº.\nبراÛ\81Ù\90 Ú©Ø±Ù\85Ø\8c Ú©Ú\86Ú¾ Ù\85Ù\86ٹس Ø¨Ø¹Ø¯ Ø¯Ù\88بارÛ\81 Ú©Ù\88شش Ú©Ø±Û\8cÚºÛ\94",
        "protectedpagetext": "اس صفحہ کو تدوین سے محفوظ رکھنے کیلیے مقفل کر دیا گیا ہے۔",
        "viewsourcetext": "آپ صرف مسودہ دیکھ سکتے ہیں اور اسکی نقل اتار سکتے ہیں۔",
        "viewyourtext": "آپ اس مواد کو دیکھ سکتے ہیں اور اٹھا (کاپی) سکتے ہیں <strong>آپ کی ترامیم</strong> اس صفحہ پر۔",
        "userloginnocreate": "داخلِ نوشتہ ہوجائیے",
        "logout": "اخراج",
        "userlogout": "خارج ہوجائیں",
-       "notloggedin": "داخلہ نہیں ہوا",
+       "notloggedin": "داخل نہیں",
        "userlogin-noaccount": "کیا آپ نے کھاتہ نہیں بنایا ہوا؟",
        "userlogin-joinproject": "منسلک ہو {{SITENAME}} سے",
        "nologin": "کیا آپ نے کھاتہ نہیں بنایا ہوا؟ '''$1'''۔",
        "createacct-emailoptional": "ای میل ایڈریس (اختیاری)",
        "createacct-email-ph": "اپنا برقی پتہ لکھیں",
        "createacct-another-email-ph": "برقی پتہ لکھیں",
-       "createaccountmail": "بذرÛ\8cعÛ\82 Ø¨Ø±Ù\82Û\8c Ú\88اک",
+       "createaccountmail": "عارضÛ\8c Ù¾Ø§Ø³Ù\88رÚ\88 Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Ø±Û\8cÚº Ø§Ù\88ر Ø§Ø³Û\92 Ù\85تعÛ\8cÙ\86Û\81 Ø¨Ø±Ù\82Û\8c Ú\88اک Ù¾ØªÛ\81 Ù¾Ø± Ø§Ø±Ø³Ø§Ù\84 Ú©Ø±Û\8cÚº",
        "createacct-realname": "اصلی نام (اختیاری)",
        "createaccountreason": "وجہ:",
        "createacct-reason": "وجہ",
        "createacct-reason-ph": "آپ دوسرا کھاتہ کیوں تخلیق کررہے ہیں",
-       "createacct-captcha": "حفاظتی تدبیر",
-       "createacct-imgcaptcha-ph": "آپ اوپر دیکھ متن داخل کریں",
        "createacct-submit": "آپ کا کھاتا بنائیں",
-       "createacct-another-submit": "دوسرا کھاتہ تخلیق کریں",
+       "createacct-another-submit": "کھاتہ بنائیں",
        "createacct-benefit-heading": "{{SITENAME}} آپ جیسے لوگوں کی طرف سے بنایا گیا ہے ۔",
        "createacct-benefit-body1": "{{PLURAL:$1|ترمیم|ترامیم}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|صفحہ|صفحات}}",
        "invalidemailaddress": "برقی پتہ قبول نہیں کیا جاسکتا کیونکہ یہ غلط شکل میں ہے.\nبراہِ کرم! ایک برقی پتہ صحیح شکل میں درج کیجئے یا جگہ کو خالی چھوڑ دیجئے.",
        "emaildisabled": "اس سائٹ سے برقی خط نہیں بھیجے جاسکتے",
        "accountcreated": "تخلیقِ کھاتہ",
-       "accountcreatedtext": "تخیلقِ کھاتۂ صارف براۓ $1۔",
+       "accountcreatedtext": "[[{{ns:صارف}}:$1|$1]] ([[{{ns:تبادلۂ خیال صارف}}:$1|تبادلۂ خیال]]) کا صارف کھاتہ بن چکا ہے۔",
        "createaccount-title": "کھاتہ سازی برائے {{SITENAME}}",
        "createaccount-text": "کسی نے {{SITENAME}} ($4) پر \"$2\" کے نام سے اور \"$3\" پارلفظ کے ساتھ آپ کا برقی پتہ استعمال کرتے ہوئے کھاتہ بنایا ہے.\nآپ کو چاہئے کہ ابھی داخلِ نوشتہ ہوکر اپنا پارلفظ تبدیل کردیں.\n\nاگر یہ کھاتہ غلطی سے بنا تھا تو آپ یہ پیغام نظرانداز کرسکتے ہیں.",
-       "login-throttled": "آپ Ù\86Û\92 Ø¯Ø§Ø®Ù\84Ù\90 Ù\86Ù\88شتÛ\81 Û\81Ù\88Ù\86Û\92 Ú©Û\8cÙ\84ئÛ\92 Ø¨Û\81ت Ø²Û\8cادÛ\81 Ø­Ø§Ù\84Û\8cÛ\81 Ú©Ù\88ششÛ\8cÚº Ú©Û\8cÚº.\nدÙ\88بارÛ\81 Ú©Ù\88شش Ú©Ø±Ù\86Û\92 Ø³Û\92 Ù¾Û\81Ù\84Û\92 Ø§Ù\86تظار Ù\81رÙ\85ائÛ\8cÛ\92.",
+       "login-throttled": "آپ Ù\86Û\92 Ø­Ø§Ù\84 Û\81Û\8c Ù\85Û\8cÚº Ù\85تعدد Ù\85رتبÛ\81 Ù\84اگ Ø§Ù\86 Û\81Ù\88Ù\86Û\92 Ú©Û\8c Ú©Ù\88شش Ú©Û\8c Û\81Û\92Û\94\nدÙ\88بارÛ\81 Ú©Ù\88شش Ú©Ø±Ù\86Û\92 Ø³Û\92 Ù¾Û\81Ù\84Û\92 $1 Ø§Ù\86تظار Ù\81رÙ\85ائÛ\8cÛ\92Û\94",
        "loginlanguagelabel": "زبان: $1",
        "pt-login": "داخل ہوجائیے",
        "pt-login-button": "داخل ہو",
        "changeemail-newemail": "نیا برقی ڈاک پتہ:",
        "changeemail-none": "(کوئی نہیں)",
        "changeemail-submit": "برقی ڈاک تبدیل کریں",
+       "resettokens-tokens": "ٹوکن:",
+       "resettokens-token-label": "$1 (موجودہ قدر: $2)",
        "bold_sample": "دبیز متن",
        "bold_tip": "دبیز متن",
        "italic_sample": "ترچھا متن",
        "sig_tip": "آپکا دستخط بمع مہرِوقت",
        "hr_tip": "اُفقی لکیر (زیادہ استعمال نہ کریں)",
        "summary": "خلاصہ:",
-       "subject": "مضمون/شہ سرخی:",
+       "subject": "عنوان:",
        "minoredit": "معمولی ترمیم",
        "watchthis": "یہ صفحہ زیر نظر کیجیۓ",
        "savearticle": "محفوظ",
        "preview": "نمائش",
        "showpreview": "نمائش",
        "showdiff": "تبدیلیاں دکھاؤ",
-       "anoneditwarning": "آپ {{SITENAME}} میں داخل نہیں ہوئے لہذا آپکا IP پتہ اس صفحہ کے تاریخچۂ  ترمیم میں محفوظ ہوجائے گا۔",
+       "anoneditwarning": "<strong>انتباہ:</strong> آپ ویکیپیڈیا میں داخل نہیں ہوئے ہیں۔ لہذا اگر آپ اس صفحہ میں کوئی ترمیم کرتے ہیں تو آپکا آئی پی ایڈریس (IP) اس صفحہ کے تاریخچہ ترمیم میں محفوظ ہوجائے گا۔ اگر آپ  <strong>[$1 لاگ ان]</strong> ہوتے ہیں یا کھاتہ نہ ہونے کی صورت میں <strong>[$2 کھاتہ بنا لیتے ہیں]</strong> تو تو آپ کی ترامیم آپ کے صارف نام سے محفوظ ہوگی، جنھیں آپ کسی بھی وقت ملاحظہ کر سکتے ہیں۔",
        "missingsummary": "'''انتباہ:''' آپ نے ترمیمی خلاصہ مہیّا نہیں کیا.\nاگر آپ نے محفوظ کا بٹن دوبارہ دبایا تو آپ کی ترمیم بغیر کسی خلاصہ کے محفوظ ہوجائے گی.",
        "missingcommenttext": "براہِ کرم! تبصرہ نیچے درج کیجئے.",
-       "missingcommentheader": "<strong>انتباہ:</strong>  آپ نے اِس تبصرہ کیلئے عنوان یا شہ سرخی مہیّا نہیں کی۔\nاگر آپ نے محفوظ کا بٹن دوبارہ دبایا تو آپ کا تبصرہ بغیر کسی عنوان کے محفوظ ہوجائے گا۔",
+       "missingcommentheader": "<strong>یاددہانی:</strong>  آپ نے اِس تبصرہ کیلئے عنوان یا شہ سرخی مہیّا نہیں کی ہے۔\nاگر آپ نے \"{{int:savearticle}}\" کا بٹن دوبارہ دبایا تو آپ کا تبصرہ بغیر کسی عنوان کے محفوظ ہوجائے گا۔",
        "summary-preview": "نمائش خلاصہ:",
-       "subject-preview": "عنوان/شہ سرخی کا پیش منظر:",
+       "subject-preview": "عنوان/شہ سرخی کی نمائش:",
        "blockedtitle": "صارف مسدود ہے",
        "blockedtext": "'''آپکا اسمِ صارف یا آئی پی پتہ پر پابندی ہے.'''\n\n$1 نے پابندی لگائی تھی.\nوجہ یہ بتائی گئی کہ ''$2''.\n\n* پابندی کی ابتداء : $8\n* پابندی کا اختتام : $6\n* Intended blockee: $7\n\nآپ $1 یا کسی دوسرے [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سے رابطہ کرکے پابندی پر بات چیت کرسکتے ہیں.\nآپ ‘صارف کو برقی خط ارسال کریں’ کی خاصیت اُس وقت تک استعمال نہیں کرسکتے جب تک آپ اپنے [[Special:Preferences|کھاتہ کے ترجیحات]] میں صحیح برقی پتہ معیّن نہ کریں، اور آپ کو اِسے استعمال کرنے سے پابند نہیں کیا گیا ہے.\nآپکا موجودہ آئی پی پتہ $3 ہے، اور پابندی کی شناخت #$5 ہے.\nبراہِ مہربانی کسی بھی قسم کے استفسار میں درج بالا تمام تفاصیل شامل کریں.",
        "blockednoreason": "کوئی وجہ نہیں دی گئی",
        "loginreqlink": "داخلہ",
        "loginreqpagetext": "دوسرے صفحات ملاحظہ کرنے کیلئے آپکا $1 ضروری ہے.",
        "accmailtitle": "کلمہ شناخت بھیج دیا گیا۔",
-       "accmailtext": "[[User talk:$1|$1]] Ú©Û\8cÙ\84ئÛ\92 Ø®Ù\88دکار Ø·Ø±Û\8cÙ\82Û\92 Ø³Û\92 ØªØ®Ù\84Û\8cÙ\82 Ú©Û\8cا Ú¯Û\8cا Ù¾Ø§Ø±Ù\84Ù\81ظ $2 Ú©Ù\88 Ø¨Ú¾Û\8cج Ø¯Û\8cا Ú¯Û\8cا Û\81Û\92.\n\nداخÙ\84Ù\90 Ù\86Ù\88شتÛ\81 Û\81Ù\88Ù\86Û\92 Ù¾Ø± Ø§Ù\90س Ø¬Ø¯Û\8cد Ú©Ú¾Ø§ØªÛ\92 Ú©Û\8cÙ\84ئÛ\92 Ù¾Ø§Ø±Ù\84Ù\81ظ ''[[Special:ChangePassword|پارÙ\84Ù\81ظ Ú©Û\8c ØªØ¨Ø¯Û\8cÙ\84Û\8c]]'' Ù\85Û\8cÚº ØªØ¨Ø¯Û\8cÙ\84 Ú©Û\8cا Ø¬Ø§Ø³Ú©ØªØ§ Û\81Û\92.",
+       "accmailtext": "[[User talk:$1|$1]] Ú©Û\92 Ù\84Û\8cÛ\92 Ø®Ù\88دکار Ø·Ø±Û\8cÙ\82Û\92 Ø³Û\92 ØªØ®Ù\84Û\8cÙ\82 Ú©Û\8cا Ú¯Û\8cا Ù¾Ø§Ø³Ù\88رÚ\88 $2 Ú©Ù\88 Ø¨Ú¾Û\8cج Ø¯Û\8cا Ú¯Û\8cا Û\81Û\92.\n\nÙ\84اگ Ø§Ù\86 Û\81Ù\88Ù\86Û\92 Ú©Û\92 Ø¨Ø¹Ø¯ <em>[[Special:ChangePassword|اسÛ\92 ØªØ¨Ø¯Û\8cÙ\84]]</em> Ú©Û\8cا Ø¬Ø§ Ø³Ú©ØªØ§ Û\81Û\92Û\94",
        "newarticle": "(نیا)",
        "newarticletext": "آپ نے ایک ایسے صفحے کے ربط کی پیروی کی ہے جو کہ ابھی موجود نہیں ہے.\nیہ صفحہ تخلیق کرنے کیلئے درج ذیل خانہ میں متن درج کیجئے (مزید معلومات کیلئے [$1 صفحۂ معاونت] ملاحظہ فرمائیے).\nاگر آپ یہاں غلطی سے پہنچے ہیں تو پچھلے صفحے پر واپس جانے کیلئے اپنے متصفح پر '''back''' کا بٹن ٹک کیجئے.",
        "anontalkpagetext": "----''یہ صفحہ ایک ایسے صارف کا ہے جنہوں نے یا تو اب تک اپنا کھاتا نہیں بنایا یا پھر وہ اسے استعمال نہیں کر رہے/ رہی ہیں۔ لہٰذا ہمیں انکی شناخت کے لئے ایک عددی آئی پی پتہ استعمال کرنا پڑرہا ہے۔ اس قسم کا آئی پی پتہ ایک سے زائد صارفین کے لئے مشترک بھی ہوسکتا ہے۔ اگر آپکی موجودہ حیثیت ایک گمنام صارف کی ہے اور آپ محسوس کریں کہ اس صفحہ پر آپکی جانب منسوب یہ بیان غیرضروری ہے تو براہ کرم [[Special:UserLogin/signup|کھاتہ بنائیں]] یا [[Special:UserLogin|داخلِ نوشتہ]] ہوجائیے تاکہ مستقبل میں آپکو گمنام صارفین میں شمار کرنے سے پرہیز کیا جاسکے۔\"",
        "editing": "آپ \"$1\" میں ترمیم کر رہے ہیں۔",
        "creating": "زیر تخلیق $1",
        "editingsection": "$1 کے قطعہ کی تدوین",
-       "editingcomment": "زیرترمیم $1 (تبصرہ)",
+       "editingcomment": "زیرترمیم $1 (نیا قطعہ)",
        "editconflict": "تنازعہ ترمیم:$1",
        "explainconflict": "آپکی تدوین شروع ہونے کے بعد شاید کسی نے یہ صفحہ تبدیل کردیا ہے.\nبالائی خانۂ متن میں صفحہ کا موجودہ مواد ہے.\nآپ کی تبدیلیاں نچلے متن خانہ میں دکھائی گئی ہیں.\nآپ کو اپنی تبدیلیاں موجودہ متن میں ضم کرنا ہوں گی.\n\"محفوظ\" کا بٹن ٹک کرنے سے '''صرف''' بالائی متن محفوظ ہوگا.",
        "yourtext": "آپ کی تحریر",
        "nocreate-loggedin": "آپ کو نئے صفحات تخلیق کرنے کی اجازت نہیں ہے.",
        "sectioneditnotsupported-title": "قطعہ کی تدوین حمایت شدہ نہیں ہے",
        "sectioneditnotsupported-text": "اِس صفحہ میں قطعہ کی تدوین حمایت شدہ نہیں ہے.",
-       "permissionserrors": "اخطائÛ\92 Ø§Ø¬Ø§Ø²Øª",
+       "permissionserrors": "خطائے اجازت",
        "permissionserrorstext": "درج ذیل {{PLURAL:$1|وجہ|وجوہات}} کی بناء پر آپ کو ایسا کرنے کی اجازت نہیں ہے:",
        "permissionserrorstext-withaction": "درج ذیل {{PLURAL:$1|وجہ|وجوہات}} کی بناء پر آپ کو $2 کرنے کی اجازت نہیں ہے:",
        "recreate-moveddeleted-warn": "''' انتباہ: آپ ایک گزشتہ حذف شدہ صفحہ دوبارہ تخلیق کررہے ہیں. '''\n\nآپ کو اِس بات پر غور کرنا چاہئے کہ آیا اِس صفحہ کی تدوین جاری رکھنا موزوں ہے یا نہیں.\nصفحہ کا نوشتۂ حذف شدگی و منتقلی یہاں سہولت کی خاطر مہیّا کیا جارہا ہے:",
        "revdelete-legend": "رویتی پابندیاں لگائیں",
        "revdelete-hide-text": "نظرثانی متن چھپاؤ",
        "revdelete-hide-image": "مشمولاتِ ملف چھپاؤ",
-       "revdelete-hide-name": "عمل اور ہدف کو چھپاؤ",
+       "revdelete-hide-name": "ہدف اور پیرامیٹرز کو چھپائیں",
        "revdelete-hide-comment": "ترمیمی تبصرہ چھپاؤ",
        "revdelete-hide-user": "ترمیم کار کا اسمِ صارف / آئی.پی پتہ چُھپاؤ",
        "revdelete-radio-same": "(تبدیل مت کرو)",
        "search-result-category-size": "{{PLURAL:$1|1 رُکن|$1 اراکین}} ({{PLURAL:$2|1 ذیلی زمرہ|$2 ذیلی زمرہ جات}}, {{PLURAL:$3|1 ملف|$3 ملفات}})",
        "search-redirect": "(رجوع مکرر $1)",
        "search-section": "(حصہ $1)",
+       "search-category": "(زمرہ $1)",
        "search-suggest": "کیا آپ کا مطلب تھا: $1",
        "search-interwiki-caption": "ساتھی منصوبے",
        "search-interwiki-default": "$1 نتائج:",
        "badsig": "ناقص خام دستخط.\nHTML tags جانچئے.",
        "badsiglength": "آپ کا دستخط کافی طویل ہے.\nیہ $1 {{PLURAL:$1|حرف|حروف}} سے زیادہ نہیں ہونا چاہئے.",
        "yourgender": "جنس:",
-       "gender-unknown": "غÛ\8cرÙ\85ختص Ø´Ø¯Û\81",
+       "gender-unknown": "آپ Ú©Û\92 ØªØ°Ú©Ø±Û\81 Ú©Û\92 Ù\88Ù\82تØ\8c Ø³Ù\88Ù\81Ù¹Ù\88Û\8cئر ØºÛ\8cر Ø¬Ø§Ù\86بدار Ø¬Ù\86سÛ\8c Ø§Ù\84Ù\81اظ Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Ø±Û\92 Ú¯Ø§ Ø§Ú¯Ø± Ù\85Ù\85Ú©Ù\86 Û\81Ù\88",
        "gender-male": "مرد",
        "gender-female": "عورت",
        "prefs-help-gender": "اختیاری: مصنع‌لطیف کی طرف سے صحیح‌الجنس تخاطب کیلئے استعمال ہوتا ہے. یہ معلومات عام ہوگی.",
        "prefs-advancedrendering": "اعلی اختیارات",
        "prefs-advancedsearchoptions": "اعلی اختیارات",
        "prefs-advancedwatchlist": "اعلی اختیارات",
+       "prefs-tokenwatchlist": "ٹوکن",
        "prefs-diffs": "فروق",
        "userrights": "حقوقِ صارف کی نظامت",
        "userrights-lookup-user": "گروہائے صارف کا انتظام",
        "userrights-user-editname": "کوئی اسم‌صارف داخل کیجئے:",
        "editusergroup": "ترمیم گروہائے صارف",
-       "editinguser": "تبدیلئ اختیارات برائے صارف '''[[صارف:$1|$1]]''' $2",
+       "editinguser": "تبدیلی اختیارات صارف برائے {{GENDER:$1|صارف}} <strong>[[صارف:$1|$1]]</strong> $2",
        "userrights-editusergroup": "ترمیم گروہائے صارف",
        "saveusergroups": "گروہائے صارف محفوظ",
        "userrights-groupsmember": "رکنِ:",
        "group-bot": "روبالات",
        "group-sysop": "منتظمین",
        "group-bureaucrat": "مامورین اداری",
-       "group-suppress": "نگران",
+       "group-suppress": "Suppressors",
        "group-all": "(تمام)",
        "group-user-member": "صارف",
        "group-autoconfirmed-member": "خودتوثیق شدہ صارف",
        "group-bot-member": "خودکار صارف",
        "group-sysop-member": "منتظم",
        "group-bureaucrat-member": "{{GENDER:$1|مامور اداری}}",
-       "group-suppress-member": "{{GENDER:$1|نگران}}",
+       "group-suppress-member": "{{GENDER:$1|suppressor}}",
        "grouppage-user": "{{ns:project}}:صارفین",
        "grouppage-autoconfirmed": "{{ns:project}}:خود توثیق شدہ صارف",
        "grouppage-bot": "{{ns:project}}:روبہ جات",
        "recentchanges-label-unpatrolled": "اس ترمیم کی اب تک مراجعت نہیں کی گئی",
        "recentchanges-label-plusminus": "صفحہ کا حجم تبدیل شدہ بلحاظ بائٹ مقدار",
        "recentchanges-legend-heading": "'''اختیارات'''",
-       "rcnotefrom": "ذیل میں '''$2''' سے کی گئی تبدیلیاں ہیں ('''$1''' تبدیلیاں دکھائی جارہی ہیں)۔",
+       "rcnotefrom": "ذیل میں <strong>$3, $4</strong> سے کی گئی {{PLURAL:$5|تبدیلی|تبدیلیاں}} <strong>$1</strong> تک دکھائی جا رہی ہیں۔",
        "rclistfrom": "$3 $2 سےنئی تبدیلیاں دکھانا شروع کریں",
        "rcshowhideminor": "معمولی ترامیم $1",
        "rcshowhideminor-show": "دکھائیں",
        "minoreditletter": "م",
        "newpageletter": "نیا ..",
        "boteditletter": " خودکار",
-       "rc_categories_any": "کوئی بھی",
+       "rc_categories_any": "کوئی بھی منتخب",
        "rc-change-size-new": "$1 {{PLURAL:$1|بائٹ|بائٹس}} تبدیلی کے بعد",
-       "rc-enhanced-expand": "تفصیلات دِکھائیں (JavaScript درکار)",
+       "rc-enhanced-expand": "تفصیلات دکھائیں",
        "rc-enhanced-hide": "تفصیلات چھپائیے",
        "recentchangeslinked": "متعلقہ تبدیلیاں",
        "recentchangeslinked-feed": "متعلقہ تبدیلیاں",
        "recentchangeslinked-title": "\"$1\" سے متعلقہ تبدیلیاں",
        "recentchangeslinked-summary": "یہ ان تبدیلیوں کی فہرست ہے جو حال ہی میں کسی مخصوص صفحہ سے مربوط صفحات (یا مخصوص زمرہ کے اراکین) میں کی گئی ہیں\n\n[[Special:Watchlist|آپ کی زیر نظر فہرست]] میں یہ صفحات متجل (bold) نظر آئیں گےـ",
        "recentchangeslinked-page": "صفحۂ منصوبہ دیکھئے",
-       "upload": "فائل اثقال",
+       "upload": "فائل اثقال/اپلوڈ فائل",
        "uploadbtn": "زبراثقال ملف (اپ لوڈ فائل)",
        "reuploaddesc": "زبراثقال ورقہ (فارم) کیجانب واپس۔",
        "uploadnologin": "آپ داخل شدہ حالت میں نہیں",
-       "uploadnologintext": "زبراثقال ملف (فائل اپ لوڈ) کے لیۓ آپکو  [[Special:UserLogin|داخل شدہ]] حالت میں ہونا لازم ہے۔",
-       "uploadtext": "\n'''یادآوری''': اگر آپ اپنی ملف (فائل) زبراثقال کرتے وقت ، خلاصہ کے خانے میں ،  درج ذیل دو باتوں کی وضاحت نہیں کرتے تو ملف کو حذف کیا جاسکتا ہے:\n#ملف یا فائل کا '''مـاخـذ''' ، یعنی:\n#*اگر یہ آپ نے خود تخلیق کی ہے تو بیان کردیجیۓ۔\n#*اگر یہ روۓ خط (آن لائن) دستیاب ہے ، تو اس وقوع یعنی سائٹ کا  '''رابطہ (لنک)''' دیجیۓ۔\n#*اگر آپ نے اسے کسی دوسری زبان کے {{SITENAME}} سے لیا ہے تو اسکا نام تحریر کردیجیۓ۔\n#صاحب ِحق ِطبع و نشر اور ملف کے اجازہ (لائسنس) کے بارے میں:\n#*ملف کے اجازہ کے بارے میں یہ تحریر کیجیۓ کہ اسکی موجودہ حیثیت کیا ہے۔\n#*اگر آپ خود اسکا حق ِطبع و نشر رکھتے ہیں تو آپ پر لازم ہے کہ آپ اسے ٹ [[دائرۂ عام]] ن (پبلک ڈومین) میں بھی آذاد کردیں۔\n\nجب کوئی صارف مستقل ایسی ملف زبراثقال کرتا رہے کہ جس کے اجازہ کے بارے میں غلط بیانی کی گئی ہو یا وہ مستقل ایسے عکس زبراثقال کرتا رہے کہ جنکے بارے میں کوئی بیان تحریر نہ کیا گیا ہو تو ایسی صورت میں پابندی لگاۓ جانے کا قوی امکان موجود ہے۔\n\nمِلَف (فائل) بھیجنے کیلیے درج ذیل ورقہ (فارم) استعمال کیجیے، اگر آپ اب تک ارسال کردہ تصاویر کو دیکھنا یا تلاش کرنا چاہتے ہیں تو [[Special:FileList|ارسال کردہ تصاویر]] کے ربط پر جائیے۔ <br /> تمام ارسال و حذف کی گئی تصاویر کو [[Special:Log/upload|نوشتۂ منتقلی]] میں درج کر لیا جاتا ہے۔\n\nتصویر کی منتقلی کے بعد، اسکو کسی صفحہ پر رکھنے کیلیے مندرجہ ذیل صورت میں رمـز (کوڈ) استعمال کیجیۓ۔\n\n'''<nowiki>[[تصویر:ملف کا نام|متبادل متن]]</nowiki>'''\n\n* مندرجہ بالا رموز آپ  انگریزی میں بھی درج کرسکتے ہیں، یعنی\n<nowiki>[[Image:File name|Alt.text]]</nowiki>\n* ملف کے ساتھ براہ راست رابطہ کیلیے\nکی طرز میں ربط استعمال کیجیۓ۔ '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''\n* ملف کا نام ؛ حرف ابجد کے لیۓ حساس ہے لہذا اگر زبراثقال کرتے وقت ملف کا نام -- name:JPG  ہے اور آپ رابطہ رکھتے وقت name:jpg یــا Name:jpg رکھتے ہیں تو ربط کام نہیں کرے گا",
+       "uploadnologintext": "فائلیں اپلوڈ کرنے کے لیے براہ کرم $1 ہوں",
+       "uploadtext": "\n'''اطلاع''': اگر آپ اپنی فائل اپلوڈ کرتے وقت خلاصہ کے خانے میں درج ذیل دو باتوں کی وضاحت نہیں کریں گے تو اس فائل کو حذف کیا جاسکتا ہے:\n# فائل کا '''مـاخـذ''' ، یعنی:\n#*اگر یہ آپ نے خود تخلیق کی ہے تو اسے بیان کریں۔\n#*اگر یہ آن لائن دستیاب ہے تو اس سائٹ کا  '''ربط''' درج کریں۔\n#*اگر آپ نے اسے کسی دوسری زبان کے {{SITENAME}} سے لیا ہے تو اسکا نام تحریر کریں۔\n#صاحب حق طبع و نشر اور فائل کے اجازت نامہ کے بارے میں:\n#* فائل کے اجازت نامہ کے متعلق یہ درج کریں کہ اس کی موجودہ حیثیت کیا ہے۔\n#*اگر آپ خود اسکا حق طبع و نشر رکھتے ہیں تو آپ پر لازم ہے کہ آپ اسے [[دائرۂ عام]] (پبلک ڈومین) میں بھی شائع کریں۔\n\nجب کوئی صارف مستقل ایسی فائل اپلوڈ کرتا رہے جس کے اجازت نامہ کے بارے میں غلط بیانی کی گئی ہو یا وہ مستقل ایسی تصاویر اپلوڈ کرے جن کے بارے میں کوئی وضاحت موجود نہ ہو تو ایسی صورت میں اس صارف پر پابندی لگائے جانے کا قوی امکان موجود ہے۔\n\nفائل اپلوڈ کرنے کے لیے ذیل میں موجود فارم استعمال کریں، اگر آپ جملہ اپلوڈ کردہ تصاویر کو دیکھنا یا تلاش کرنا چاہتے ہیں تو [[Special:FileList|اس فہرست]] کو ملاحظہ فرمائیں۔ <br /> تمام اپلوڈ کردہ و حذف شدہ تصاویر کو [[Special:Log/upload|نوشتۂ منتقلی]] میں درج کر لیا جاتا ہے۔\n\nتصویر کی منتقلی کے بعد، اسکو کسی صفحہ پر رکھنے کیلیے مندرجہ ذیل طریقہ سے استعمال کریں۔\n\n'''<nowiki>[[تصویر:فائل کا نام|متبادل متن]]</nowiki>'''\n\n* مندرجہ بالا رموز آپ انگریزی میں بھی درج کرسکتے ہیں، یعنی\n<nowiki>[[Image:File name|Alt.text]]</nowiki>\n* فائل کا ربط درج کرنے کے لیے۔ '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''\n* ملف کا نام؛ حرف ابجد کے لیے حساس ہے لہذا اگر اپلوڈ کرتے وقت فائل کا نام -- name:JPG  ہے اور آپ name:jpg یــا Name:jpg کا ربط درج کرتے ہیں تو ربط کام نہیں کرے گا۔",
        "uploadlogpage": "نوشتۂ زبراثقال (اپ لوڈ لاگ)",
        "uploadlogpagetext": "درج ذیل میں حالیہ زبراثقال (اپ لوڈ) کی گئی املاف (فائلوں) کی فہرست دی گئی ہے۔",
        "filedesc": "خلاصہ",
        "ignorewarning": "انتباہ نظرانداز کرتے ہوۓ بہرصورت ملف (فائل) کو محفوظ کرلیا جاۓ۔",
        "ignorewarnings": "ہر انتباہ نظرانداز کردیا جاۓ۔",
        "badfilename": "ملف (فائل) کا نام \"$1\" ، تبدیل کردیا گیا۔",
-       "fileexists": "اس Ù\86اÙ\85 Ø³Û\92 Ø§Û\8cÚ© Ù\85Ù\84Ù\81 (Ù\81ائÙ\84) Ù¾Û\81Ù\84Û\92 Û\81Û\8c Ù\85Ù\88جÙ\88د Û\81Û\92Ø\8c Ø§Ú¯Ø± Ø¢Ù¾ Ú©Ù\88 Û\8cÙ\82Û\8cÙ\86 Ù\86Û\81 Û\81Ù\88 Ú©Û\81 Ø§Ø³Û\92 Ø­Ø°Ù\81 Ú©Ø±Ø¯Û\8cا Ø¬Ø§Ù\86ا Ú\86اÛ\81Û\8cÛ\93 ØªÙ\88 Ø¨Ø±Ø§Û\81 Ú©Ø±Ù\85  <strong>[[:$1]]</strong> Ú©Ù\88 Ø§Û\8cÚ© Ù\86ظر Ø¯Û\8cÚ©Ú¾ Ù\84Û\8cجÛ\8cÛ\93۔ [[$1|thumb]]",
+       "fileexists": "اس Ù\86اÙ\85 Ø³Û\92 Ø§Û\8cÚ© Ù\81ائÙ\84 Ù¾Û\81Ù\84Û\92 Ø³Û\92 Ù\85Ù\88جÙ\88د Û\81Û\92Ø\8c Ø§Ú¯Ø± Ø¢Ù¾ Ú©Ù\88 Û\8cÙ\82Û\8cÙ\86 Ù\86Û\81 Û\81Ù\88 Ú©Û\81 Ø§Ø³Û\92 Ø­Ø°Ù\81 Ú©Ø±Ø¯Û\8cا Ø¬Ø§Ù\86ا Ú\86اÛ\81Û\8cÛ\92 ØªÙ\88 Ø¨Ø±Ø§Û\81 Ú©Ø±Ù\85  <strong>[[:$1]]</strong> Ú©Ù\88 Ø§Û\8cÚ© Ù\86ظر Ø¯Û\8cÚ©Ú¾ Ù\84Û\8cجÛ\8cÛ\92۔ [[$1|thumb]]",
        "uploadwarning": "انتباہ بہ سلسلۂ زبراثقال",
        "savefile": "فائل محفوظ کریں",
        "sourcefilename": "اسم ملف (فائل) کا منبع:",
        "ncategories": "{{PLURAL:$1|زمرہ|زمرہ جات}} $1",
        "nmembers": "{{PLURAL:$1|رکن|اراکین}}",
        "lonelypages": "يتيم صفحات",
-       "lonelypagestext": "مندرجہ ذیل صفحات وہ صفحات ہیں جنھیں اس وکی میں موجود صفحوں سے کوئی ربط حاصل نہیں ہوپارہا۔",
+       "lonelypagestext": "ذیل میں ان صفحات کی فہرست ہے جو {{SITENAME}} میں موجود دیگر صفحات سے مربوط یا ان میں شامل نہیں ہیں۔",
        "uncategorizedpages": "بے زمرہ صفحات",
        "uncategorizedcategories": "بے زمرہ زمرہ جات",
        "uncategorizedimages": "بے زمرہ تصاویر",
        "booksources-search-legend": "تلاش برائے مآخذاتِ کتاب",
        "booksources-search": "تلاش",
        "specialloguserlabel": "صارف:",
-       "speciallogtitlelabel": "عنوان:",
+       "speciallogtitlelabel": "ہدف (عنوان یا {{ns:user}}:صارف نام برائے صارف):",
        "log": "نوشتہ جات",
        "allpages": "تمام صفحات",
        "nextpage": "اگلا صفحہ ($1)",
        "allpagessubmit": "چلو",
        "allpagesprefix": "مطلوبہ سابقہ سے شروع ہونے والے صفحات کی نمائش:",
        "categories": "زمرہ",
-       "categoriespagetext": "مندرجہ ذیل زمرہ جات اس وکی میں موجود ہیں۔\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
+       "categoriespagetext": "ذیل میں موجود {{PLURAL:$1|زمرہ|زمرہ جات}} میں صفحات یا میڈیا موجود ہے۔\n[[Special:UnusedCategories|غیر مستعمل زمرہ جات]] یہاں نہیں دکھائے گئے ہیں۔\nنیز [[Special:WantedCategories|مطلوبہ زمرہ جات کی فہرست]] بھی ملاحظہ فرمائیں۔",
        "linksearch-ok": "تلاش",
        "linksearch-line": "$1 مربوط ہے $2 سے",
        "listusers-submit": "دکھاؤ",
        "watchlist-details": "آپ کی زیرِنظرفہرست پر {{PLURAL:$1|$1 صفحہ ہے|$1 صفحات ہیں}}، اِس میں تبادلۂ خیال صفحات کی تعداد شامل نہیں.",
        "wlnote": "نیچےآخری $1 تبدیلیاں ہیں جو کے پیچھلے <b>$2</b> گھنٹوں میں کی گئیں۔",
        "wlshowlast": "دکھائیں آخری $1 گھنٹے $2 دن",
+       "watchlistall2": "تمام",
        "watchlist-options": "اختیارات برائے زیرِنظرفہرست",
+       "enotif_reset": "جملہ صفحات کو بطور زیارت شدہ نشان زد کریں",
+       "enotif_subject_deleted": "{{SITENAME}} میں صفحہ $1 صارف $2 نے {{GENDER:$2|حذف کیا}}",
+       "enotif_subject_created": "{{SITENAME}} میں صفحہ $1 کو $2 نے {{GENDER:$2|تخلیق کیا}}",
+       "enotif_subject_moved": "{{SITENAME}} میں صفحہ $1 کو $2 نے {{GENDER:$2|منتقل کیا}}",
+       "enotif_subject_restored": "{{SITENAME}} میں صفحہ $1 کو $2 نے {{GENDER:$2|بحال کیا}}",
+       "enotif_subject_changed": "{{SITENAME}} کے صفحہ $1 میں $2 نے {{GENDER:$2|تبدیلی کی}}",
+       "enotif_body_intro_deleted": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|حذف کر دیا}} ہے، ملاحظہ فرمائیں $3۔",
+       "enotif_body_intro_created": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|تخلیق کیا}}، موجودہ نسخہ دیکھنے کے لیے $3 ملاحظہ فرمائیں۔",
+       "enotif_body_intro_moved": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|منتقل کر دیا}} ہے، موجودہ نسخہ دیکھنے کے لیے $3 ملاحظہ فرمائیں۔",
+       "enotif_body_intro_restored": "{{SITENAME}} میں صفحہ $1 کو بتاریخ $PAGEEDITDATE صارف $2 نے {{GENDER:$2|بحال کیا}}، موجودہ نسخہ دیکھنے کے لیے $3 ملاحظہ فرمائیں۔",
+       "enotif_body_intro_changed": "{{SITENAME}} میں صفحہ $1 میں بتاریخ $PAGEEDITDATEء صارف $2 نے {{GENDER:$2|تبدیلی کی}}، موجودہ نسخہ دیکھنے کے لیے $3 ملاحظہ فرمائیں۔",
+       "enotif_lastvisited": "آپ کی آخری آمد کے بعد سے ہونے والی تمام تبدیلیوں کو دیکھنے کے لیے $1 کو ملاحظہ فرمائیں۔",
+       "enotif_lastdiff": "اس تبدیلی کو دیکھنے کے لیے $1 کو ملاحظہ فرمائیں۔",
+       "enotif_body": "جناب $WATCHINGUSERNAME!\n\n$PAGEINTRO $NEWPAGE\n\nخلاصہ ترمیم: $PAGESUMMARY $PAGEMINOREDIT\n\nصارف سے رابطہ کریں:\nبذریعہ برقی خط: $PAGEEDITOR_EMAIL\nبذریعہ ویکی: $PAGEEDITOR_WIKI\n\nاس صفحہ میں آئندہ ہونے والی تبدیلیوں کی اطلاعات آپ کو موصول نہیں ہوگی جب تک آپ لاگ ان ہو کر اس صفحہ کو ملاحظہ نہ کر لیں۔ نیز آپ اپنی زیر نظر فہرست میں موجود تمام صفحات سے اطلاعی علامتیں بھی ختم کر سکتے ہیں۔\n\nفقط\nآپ کا خادم، {{SITENAME}} نظام اطلاعات\n\n--\nاطلاعات بذریعہ برقی خط کی ترتیبات تبدیل کرنے کے لیے\n{{canonicalurl:{{#special:Preferences}}}} ملاحظہ فرمائیں\n\nاپنی زیر نظر فہرست کی ترتیبات میں تبدیلی کے لیے\n{{canonicalurl:{{#special:EditWatchlist}}}} ملاحظہ فرمائیں\n\nاس صفحہ کو اپنی زیر نظر فہرست سے حذف کرنے کے لیے\n$UNWATCHURL ملاحظہ فرمائیں\n\nتجاویز اور مزید معاونت کے لیے ملاحظہ فرمائیں:\n$HELPPAGE",
        "created": "بنا دیا گیا",
        "changed": "تبدیل کردیاگیا",
        "deletepage": "صفحہ ضائع کریں",
        "contributions": "{{GENDER:$1|صارف}} شراکتیں",
        "contributions-title": "مساہماتِ صارف برائے $1",
        "mycontris": "شراکت",
+       "anoncontribs": "شراکتیں",
        "contribsub2": "براۓ $1 ($2)",
        "uctop": " (اوپر)",
        "month": "مہینہ (اور اُس سے قبل):",
        "sp-contributions-uploads": "اثقالات",
        "sp-contributions-logs": "نوشتہ جات",
        "sp-contributions-talk": "گفتگو",
-       "sp-contributions-userrights": "صارÙ\81 Ú©Û\92 Ø­Ù\82Ù\88Ù\82 Ú©Ø§ Ø§Ù\86تظاÙ\85",
+       "sp-contributions-userrights": "اÙ\86تظاÙ\85 Ø§Ø®ØªÛ\8cارات ØµØ§Ø±Ù\81",
        "sp-contributions-search": "تلاش برائے مساہمات",
        "sp-contributions-username": "آئی.پی پتہ یا اسمِ صارف:",
        "sp-contributions-toponly": "صرف حالیہ ترین نظرثانی ترمیمات دِکھاؤ",
        "contribslink": "شراکت",
        "blocklogpage": "نوشتۂ پابندی",
        "block-log-flags-nocreate": "کھاتے کی تخلیق غیرفعال",
-       "move-page": "منتقلی",
+       "move-page": "منتقلی $1",
        "move-page-legend": "منتقلئ صفحہ",
-       "movepagetext": "نیچے دیا گیا تشکیلہ (فـارم) استعمال کرکے اس صفحہ کا عنوان دوبارہ منتخب کیا جاسکتا ہے، ساتھ ہی اس سے منسلک تاریخچہ بھی نۓ نام پر منتقل ہوجاۓ گا۔ اسکے بعد سے اس صفحے کا پرانا نام ، نۓ نام کی جانب -- لوٹایا گیا صفحہ -- کی حیثیت اختیار کرلے گا۔ لیکن یادآوری کرلیجیۓ دیگر صفحات پر ، پرانے صفحہ کی جانب دیۓ گۓ روابط (لنکس) تبدیل نہیں ہونگے؛ اس بات کو یقینی بنانا ضروری ہے کہ کوئی دوہرا یا شکستہ -- پلٹایا گیا ربط -- نہ رہ جاۓ۔\n\nلہذا یہ یقینی بنانا آپکی ذمہ داری ہے کہ تمام روابط درست صفحات کی جانب رہنمائی کرتے رہیں۔\n\nیہ بات بھی ذہن نشین کرلیجیۓ کہ اگر نۓ منتخب کردہ نام کا صفحہ پہلے سے ہی موجود ہو تو ہوسکتا ہے کہ صفحہ منتقل نہ ہو ، ؛ ہاں اگر پہلے سے موجود صفحہ خالی ہے ، یا وہ صرف ایک -- لوٹایا گیا صفحہ -- ہو اور اس سے کوئی تاریخچہ منسلک نہ ہو تو منتقلی ہوجاۓ گی۔ گویا ، کسی خامی کی صورت میں آپ صفحہ کو دوبارہ اسی پرانے نام کی جانب منتقل کرسکتے ہیں اور اس طرح پہلے سے موجود کسی صفحہ میں کوئی حذف و خامی نہیں ہوگی۔\n\n''' انـتـبـاہ !'''\n کسی اہم اور مقبول صفحہ کی منتقلی ، غیرمتوقع اور پریشان کن بھی ہی ہوسکتی ہے اس لیۓ ؛ منتقلی سے قبل براہ کرم یقین کرلیجۓ کہ آپ اسکے منطقی نتائج سے باخبر ہیں۔",
+       "movepagetext": "درج ذیل فارم کے ذریعہ صفحہ کو نیا نام دیا جاسکتا ہے، اس کے ساتھ صفحہ کا تاریخچہ بھی منتقل ہو جائے گا اور\nنئے عنوان کے جانب قدیم عنوان کو رجوع مکرر کردیا جائے گا۔\n\nاس بات کا یقین کر لیں کہ [[Special:DoubleRedirects|دوہرے]] یا [[Special:BrokenRedirects|شکستہ رجوع مکررات]] موجود نہ ہوں۔\n\nنیز آپ اس بات کو بھی یقینی بنانے کے ذمہ دار ہیں کہ روابط انہیں جگہوں سے مربوط رہیں جہاں ہونا چاہیے۔\n\nخیال رہے کہ یہ صفحہ منتقل '''نہیں''' ہوگا اگر نئے عنوان کے ساتھ صفحہ پہلے سے موجود ہو، ہاں اگر صفحہ خالی ہو اور اس کا گذشتہ ترمیمی تاریخچہ موجود نہ ہو تو منتقل کیا جا سکتا ہے۔\nاس کا مطلب ہے آپ سے اگر غلطی ہوجائے تو آپ صفحہ کو اسی جگہ لوٹا سکتے ہیں، تاہم موجود صفحہ پر برتحریر (overwrite) نہیں کرسکتے۔\n\n'''انتباہ!'''\nکسی اہم اور مقبول صفحہ کی منتقلی، غیرمتوقع اور پریشان کن بھی ہی ہوسکتی ہے اس لیے \nمنتقلی سے قبل براہ کرم یقین کرلیں کہ آپ اس کے منطقی نتائج سے باخبر ہیں۔",
        "movepagetext-noredirectfixer": "درج ذیل ورقہ کے ذریعہ صفحہ کو نیا نام دیا جاسکتا ہے، اس کے ساتھ صفحہ کا تاریخچہ بھی منتقل ہوجائیگا۔\nنئے عنوان کے جانب قدیم عنوان کو رجوع مکرر کردیا جائیگا۔\n\nیقین کرلیں کہ [[Special:DoubleRedirects|مکرر]] یا [[Special:BrokenRedirects|شکستہ رجوع مکررات]] موجود نہیں ہیں۔\nآپ اس بات کو یقینی بنانے کے ذمہ دار ہیں کہ روابط انہیں جگہوں سے مربوط ہیں جن کو فرض کیا گیا ہے۔\n\nخیال رہے کہ یہ صفحہ منتقل '''نہیں''' ہوگا اگر نئے عنوان کے ساتھ صفحہ پہلے سے موجود ہو، سوائے اس کے کہ صفحہ خالی ہو اور اس کا گذشتہ ترمیمی تاریخچہ موجود نہ ہو۔\nاس کا مطلب ہے آپ سے اگر غلطی ہوجائے تو آپ صفحہ کو اسی جگہ لوٹا سکتے ہیں، تاہم موجود صفحہ پر برتحریر (overwrite) نہیں کرسکتے۔\n\n'''انتباہ!'''\nکسی اہم اور مقبول صفحہ کی منتقلی، غیرمتوقع اور پریشان کن بھی ہی ہوسکتی ہے اس لیۓ؛ \nمنتقلی سے قبل براہ کرم یقین کرلیجۓ کہ آپ اسکے منطقی نتائج سے باخبر ہیں۔",
-       "movearticle": "مـنـتـقـل کـریں",
-       "newtitle": "نـیــا عـنــوان",
+       "newtitle": "نـیــا عـنــوان:",
        "move-watch": "صفحہ زیر نظر",
        "movepagebtn": "مـنـتـقـل",
        "pagemovedsub": "انتقال کامیاب",
        "movelogpage": "نوشتۂ منتقلی",
        "movereason": "وجہ:",
        "revertmove": "رجوع",
-       "delete_and_move": "حذف اور منتقل",
        "delete_and_move_text": "==حذف شدگی لازم==\n\nمنتقلی کے سلسلے میں انتخاب کردہ مضمون \"[[:$1]]\" پہلے ہی موجود ہے۔ کیا آپ اسے حذف کرکے منتقلی کیلیۓ راستہ بنانا چاہتے ہیں؟",
        "delete_and_move_confirm": "ہاں، صفحہ حذف کر دیا جائے",
-       "delete_and_move_reason": "منتقلی کے سلسلے میں حذف",
+       "delete_and_move_reason": "[[$1]] سے منتقلی کے سلسلے میں حذف",
        "export": "برآمد صفحات",
        "allmessages": "نظامی پیغامات",
        "allmessagesname": "نام",
        "tooltip-pt-logout": "خارجِ نوشتہ ہوجائیں",
        "tooltip-pt-createaccount": "آپ کو مدعو کیا جاتا ہے کہ کھاتہ بنائیں۔تاہم کھاتہ بنانا لازم نہیں۔",
        "tooltip-ca-talk": "مضمون بارے تبادلۂ خیال",
-       "tooltip-ca-edit": "آپ Ø§Ø³ ØµÙ\81Ø­Û\81 Ù\85Û\8cÚº ØªØ±Ù\85Û\8cÙ\85 Ú©Ø±Ø³Ú©ØªÛ\92 Û\81Û\8cÚº.\nبرائÛ\92 Ù\85Û\81رباÙ\86Û\8c! Ø§Ù¾Ù\86Û\8c ØªØ±Ù\85Û\8cÙ\85ات Ù\85Ø­Ù\81Ù\88ظ Ú©Ø±Ù\86Û\92 Ø³Û\92 Ù¾Û\81Ù\84Û\92 Ù\86Ù\85ائش Ú©Ø§ Ø¨Ù¹Ù\86 Ø§Ø³ØªØ¹Ù\85اÙ\84 Ú©Û\8cجئÛ\92",
+       "tooltip-ca-edit": "اس ØµÙ\81Ø­Û\92 Ù¾Ø± ØªØ±Ù\85Û\8cÙ\85 Ú©Ø±Û\8cÚº",
        "tooltip-ca-addsection": "نیا قطعہ شروع کیجئے",
        "tooltip-ca-viewsource": "یہ ایک محفوظ شدہ صفحہ ہے.\nآپ اِس کا مآخذ دیکھ سکتے ہیں",
        "tooltip-ca-history": "صفحۂ ہٰذا کی سابقہ نظرثانی",
index e835306..0d8c1b9 100644 (file)
        "november-date": "Noyabr $1",
        "december-date": "Dekabr $1",
        "pagecategories": "{{PLURAL:$1|Turkum}}",
-       "category_header": "\"$1\" turkumidagi sahifalar",
+       "category_header": "„$1“ turkumidagi sahifalar",
        "subcategories": "Ostturkumlar",
-       "category-media-header": "\"$1\" turkumidagi fayllar",
+       "category-media-header": "„$1“ turkumidagi fayllar",
        "category-empty": "''Ushbu turkumda hozircha sahifa yoki fayllar yoʻq.''",
        "hidden-categories": "{{PLURAL:$1|Yashirin turkum}}",
        "hidden-category-category": "Yashirin turkumlar",
        "portal-url": "Project:Jamoa portali",
        "privacy": "Maxfiylik siyosati",
        "privacypage": "Project:Maxfiylik siyosati",
-       "badaccess": "Ruxsatlilik xatosi",
+       "badaccess": "Ruxsat yoʻq",
        "badaccess-group0": "Sizda soʻralgan amallarni bajarish huquqi yoʻq.",
-       "badaccess-groups": "Soʻralgan amallarni kamida $1 {{PLURAL:$2|guruhi|guruhlari}} foydalanuvchilari amalga oshirishi mumkin.",
+       "badaccess-groups": "Soʻralgan amallarni kamida «$1» {{PLURAL:$2|guruhi|guruhlari}} aʼzosi amalga oshirishi mumkin.",
        "versionrequired": "$1 versiyasidagi MediaWiki talab etiladi",
        "versionrequiredtext": "Bu sahifada ishlash uchun MediaWikining $1-versiyasi talab etiladi.\n[[Special:Version|Dasturiy taʼminot haqida axborot]]ni koʻring.",
        "ok": "OK",
        "retrievedfrom": " \"$1\" dan olindi",
-       "youhavenewmessages": "Sizga $1 keldi ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Sizga}} $1 keldi ($2).",
        "youhavenewmessagesfromusers": "Siz {{PLURAL:$3|boshqa foydalanuvchidan|$3 ta foydalanuvchidan}} $1 oldingiz ($2).",
        "youhavenewmessagesmanyusers": "Siz ko'p foydalanuvchilardan $1 oldingiz ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|yangi xabar|999=yangi xabarlar}}",
        "newmessagesdifflinkplural": "oxirgi {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}",
-       "youhavenewmessagesmulti": "Siz $1ga yangi xat oldingiz",
+       "youhavenewmessagesmulti": "Sizga $1da yangi xat keldi",
        "editsection": "tahrirlash",
        "editold": "tahrirlash",
        "viewsourceold": "manbasini koʻrish",
        "protectedpagetext": "Bu sahifa tahrirlash va boshqa oʻzgarishlar kiritishdan himoyalangan.",
        "viewsourcetext": "Siz bu sahifaning manbasini koʻrishingiz va uni nusxasini olishingiz mumkin:",
        "protectedinterface": "Ushbu sahifada dasturiy taʼminot interfeysi xabari mavjud. Bezoriliklardan saqlash uchun uni oʻzgartirish taʼqiqlangan.\nUshbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
-       "editinginterface": "'''Diqqat:''' Siz dasturiy taʼminot interfeysi matni mavjud boʻlgan sahifani tahrirlamoqdasiz.\nUning oʻzgartirilishi ushbu vikidagi boshqa foydalanuvchilar uchun ham interfeys oʻzgarishiga olib keladi.\nUshbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
+       "editinginterface": "<strong>Eʼtibor bering:</strong> Siz interfeys matnini aks ettiruvchi sahifani tahrirlamoqdasiz.\nUning oʻzgartirilishi boshqa foydalanuvchilar uchun ham interfeys oʻzgarishiga olib keladi.",
+       "translateinterface": "Ushbu xabar tarjimasini qoʻshish yoki oʻzgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] mahalliylashtirish saytidan foydalaning.",
        "namespaceprotected": "Sizda '''$1''' nomfazosi sahifalarini tahrirlash huquqi yoʻq",
        "customcssprotected": "Sizda uchbu CSS sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.",
        "customjsprotected": "Sizda uchbu JavaScript sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.",
        "createaccountreason": "Sabab:",
        "createacct-reason": "Sabab",
        "createacct-reason-ph": "Nimaga yana boshqa hisob yaratyapsiz",
-       "createacct-captcha": "Xavfsizlik tekshiruvi",
-       "createacct-imgcaptcha-ph": "Yuqoridagi yozuvni bu yerga kiriting",
        "createacct-submit": "Hisob yaratish",
        "createacct-another-submit": "Boshqa hisob yaratish",
        "createacct-benefit-heading": "{{SITENAME}} Sizga oʻxshagan odamlar tomonidan yaratiladi",
-       "createacct-benefit-body1": "tahrirlar soni",
+       "createacct-benefit-body1": "{{PLURAL:$1|tahrirlar soni}}",
        "createacct-benefit-body2": "sahifalar soni",
        "createacct-benefit-body3": "soʻnggi paytdagi ishtirokchilar soni",
        "badretype": "Siz tomondan kiritilgan maxfiy so'zlar mos kelmayapti.",
        "passwordreset-email": "Elektron pochta manzilingiz:",
        "passwordreset-emailelement": "Foydalanuvchi ismi: \n$1\n\nVaqtinchalik maxfiy so'z: \n$2",
        "changeemail": "Elektron pochta manzilini oʻzgartirish",
+       "changeemail-header": "Elektron pochta manzilini o'zgaritish",
        "changeemail-oldemail": "Joriy elektron pochta manzili",
        "changeemail-newemail": "Elektron pochtaning yangi manzili",
        "changeemail-none": "(yoʻq)",
        "whitelistedittext": "Siz sahifalarni oʻzgartirish uchun $1.",
        "nosuchsectiontitle": "Boʻlimni topishni iloji yoʻq",
        "nosuchsectiontext": "Siz mavjud boʻlmagan boʻlimni tahrirlamoqchi boʻldingiz. Ushbu boʻlim sahifani koʻrayotganingizda oʻchirilgan yoki koʻchirilgan boʻlishi mumkin.",
-       "loginreqtitle": "Shaxsiyatni aniqlash talab etiladi",
+       "loginreqtitle": "Tizimga kirish talab etiladi",
        "loginreqlink": "Kirish",
        "loginreqpagetext": "Boshqa sahifalarni koʻrish uchun $1",
        "accmailtitle": "Maxfiy soʻz joʻnatildi",
        "nocreate-loggedin": "Sizda yangi sahifalar yaratishga ruxsat yoʻq.",
        "sectioneditnotsupported-title": "Boʻlimlarni tahrirlash imkoniyati yoʻq",
        "sectioneditnotsupported-text": "Ushbu sahifada boʻlimlarni tahrirlash imkoniyati yoʻq.",
-       "permissionserrors": "Ruxsat huquqida xato",
+       "permissionserrors": "Ruxsat yoʻq",
        "permissionserrorstext-withaction": "Sizda quyidagi {{PLURAL:$1|sabab|sabablar}}ga koʻra '''$2'''ga ruxsat mavjud emas:",
        "recreate-moveddeleted-warn": "<strong>Diqqat: Siz avval oʻchirilgan sahifani qaytadan yaratmoqchisiz.</strong>\n\nU avval nega oʻchirilgani bilan qiziqib koʻring.\nQuyida ushbu sahifaga oid oʻchirish va koʻchirish qaydlari keltirilgan:",
        "moveddeleted-notice": "Bu sahifa oʻchirilgan.\nMaʼlumot uchun quyida oʻchirish va qayta nomlash jurnallaridan mos yozuvlar keltirilgan.",
        "post-expand-template-inclusion-category": "Qo'llaniladigan andozalarning mumkin bo'lgan miqdoridan oshgan sahifalar",
        "post-expand-template-argument-category": "Andozalarning to'ldirilmagan o'zgaruvchilariga ega sahifalar",
        "undo-success": "Tahrirni bekor qilish imkoniyati bor. Iltimos, solishtirish oynasini koʻrib chiqib, aynan shu oʻzgarishlarni bekor qilmoqchiligingizga ishonch hosil qiling va undan keyin «Saqla» tugmasini bosing.",
+       "undo-failure": "Keyingi tahrirlar bilan chalkashib ketgani sababli, ushbu tahrirni alohida oʻzini bekor qilishni iloji yoʻq.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|mun.]]) tomonidan qilingan $1-sonli tahrir qaytarildi",
        "cantcreateaccounttitle": "Ro‘yxatdan o‘tib bo‘lmadi",
        "cantcreateaccount-text": "[[User:$3|$3]] ushbu IP manzil (<strong>$1</strong>) orqali ro‘yxatdan o‘tishni bloklab qo‘ygan.\n\n$3 <em>$2</em>ni sabab qilib ko‘rsatdi",
        "prefs-displayrc": "Tasvirlash moslamalari",
        "prefs-displaywatchlist": "Tasvirlash moslamalari",
        "prefs-diffs": "Versiyalar farqi",
-       "userrights": "Foydalanuvchi huquqlarini oʻzgartirish",
+       "userrights": "Huquqlarini oʻzgartirish",
+       "userrights-lookup-user": "Foydalanuvchini tanlash",
        "userrights-user-editname": "Foydalanuvchi nomi:",
-       "editusergroup": "Guruhlardagi aʼzoligini oʻzgartirish",
-       "userrights-groupsmember": "Aʼzolik:",
-       "userrights-groupsmember-auto": "Quyidagi guruhlarga kiradi:",
+       "editusergroup": "Shu foydalanuvchi huquqlarini oʻzgartirish",
+       "editinguser": "{{GENDER:$1|Foydalanuvchi}} <strong>[[User:$1|$1]]</strong> $2 huquqlarini oʻzgartirish",
+       "userrights-editusergroup": "Guruhlardagi aʼzoligini oʻzgartirish",
+       "saveusergroups": "Oʻzgarishlarni saqlash",
+       "userrights-groupsmember": "Ushbu guruhlar aʼzosi:",
+       "userrights-groupsmember-auto": "Shuningdek, ushbu texnik guruhlar aʼzosi:",
+       "userrights-groups-help": "Ushbu foydalanuvchining guruhlardagi aʼzoligini oʻzgartirishingiz mumkin:\n* Guruh nomi yonida belgi turgan boʻlsa, demak foydalanuvchi ushbu guruh aʼzosidir\n* Guruh nomi yonida belgi yoʻq boʻlsa, demak foydalanuvchi ushbu guruh aʼzosi emas\n* * (yulduzcha) belgisi foydalanuvchini guruhga qoʻshsangiz, qaytarib chiqarib tashlay olmasligingizni (yoki chiqarib tashlasangiz, qaytarib qoʻsha olmasligingizni) anglatadi",
        "userrights-reason": "Sabab:",
-       "userrights-changeable-col": "Siz o'zgartirishingiz mumkin bo'lgan guruhlar",
-       "userrights-unchangeable-col": "Siz o'zgartira olmaydigan guruhlar",
+       "userrights-changeable-col": "Quyidagi guruhlarga qoʻsha olasiz",
+       "userrights-unchangeable-col": "Quyidagi guruhlarga qoʻsha olmaysiz",
        "group": "Guruh",
        "group-user": "Foydalanuvchilar",
        "group-autoconfirmed": "Tasdiqlangan foydalanuvchilar",
        "action-move": "bu sahifani koʻchirish",
        "action-move-subpages": "Bu sahifani va uning ostsahifalarini koʻchirish",
        "action-deletedhistory": "ushbu sahifaning oʻchirilgan tarixini koʻrish",
+       "action-block": "ushbu foydalanuvchining tahrirlash imkoniyatlarini cheklash",
        "action-sendemail": "elektron xatlar jo'natish",
        "nchanges": "$1 {{PLURAL:$1|oʻzgarish|oʻzgarishlar}}",
        "enhancedrc-history": "tarix",
        "recentchanges": "Yangi oʻzgarishlar",
        "recentchanges-legend": "Yangi oʻzgarishlar moslamalari",
-       "recentchanges-summary": "Bu sahifada siz {{SITENAME}}da sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.",
+       "recentchanges-summary": "Bu sahifada {{SITENAME}} loyihasida sodir boʻlgan soʻnggi oʻzgarishlarni koʻrishingiz mumkin.",
        "recentchanges-noresult": "Koʻrsatilgan muddatga va shartlarga oid oʻzgarishlar topilmadi.",
        "recentchanges-feed-description": "Vikida mazkur oqimdagi oxirgi oʻzgarishlarni kuzatish",
        "recentchanges-label-newpage": "Bu tahrir orqali yangi sahifa yaratilgan",
        "statistics-users-active-desc": "Oxirgi $1 kun ichida kamida bitta amal qilgan foydalanuvchilar",
        "pageswithprop-prop": "Xossa nomi:",
        "pageswithprop-submit": "Oʻtish",
+       "brokenredirects-edit": "tahrirlash",
        "nbytes": "$1 {{PLURAL:$1|bayt}}",
        "ncategories": "$1 {{PLURAL:$1|turkum|turkumlar}}",
-       "nmembers": "$1 {{PLURAL:$1|ta a'zo}}",
+       "nmembers": "$1 {{PLURAL:$1|ta sahifa}}",
        "lonelypages": "Yetim sahifalar",
        "uncategorizedpages": "Turkumlashtirilmagan sahifalar",
        "uncategorizedcategories": "Turkumlashtirilmagan turkumlar",
        "wantedcategories": "Talab qilinayotgan turkumlar",
        "mostcategories": "Eng koʻp turkumli sahifalar",
        "prefixindex": "Prefiksli barcha sahifalar",
+       "prefixindex-strip": "Natijalar roʻyxatida prefiks koʻrsatilmasin",
        "protectedpages": "Himoyalangan sahifalar",
        "listusers": "Foydalanuvchilar roʻyxati",
        "usercreated": "$1, $2 da {{GENDER:$3|roʻyxatdan oʻtgan}}",
        "prevpage": "Avvalgi sahifa ($1)",
        "allpagesfrom": "Quyidagidan boshlanuvchi sahifalarni koʻrsatish:",
        "allarticles": "Barcha sahifalar",
+       "allinnamespace": "$1 nomfazosidagi barcha sahifalar",
        "allpagessubmit": "Oʻtish",
        "allpagesprefix": "Shunday prefiksli sahifalarni koʻrsatish:",
        "allpages-hide-redirects": "Yoʻnaltirishlarni yashirish",
        "listgrouprights-rights": "Huquqlar",
        "listgrouprights-helppage": "Help:Guruhlar huquqlari",
        "listgrouprights-members": "(a’zolar ro‘yxati)",
-       "emailuser": "Foydalanuvchiga maktub",
+       "emailuser": "Maktub yuborish",
        "emailuser-title-target": "Ushbu {{GENDER:$1|foydalanuvchi}}ga maktub joʻnatish",
        "emailuser-title-notarget": "Foydalanuvchiga elektron maktub yozish",
        "defemailsubject": "{{SITENAME}} — $1 tomonidan maktub",
        "usermaildisabled": "Foydalanuvchi elektron pochtasi o‘chirilgan",
        "noemailtitle": "Elektron pochta manzili mavjud emas",
        "noemailtext": "Bu foydalanuvchi e-mail manzil koʻrsatgani yoʻq.",
-       "emailtarget": "Oluvchi ishtirokchining ismini kiriting",
+       "emailtarget": "Kimga xat joʻnatmoqchisiz?",
        "emailusername": "Foydalanuvchi nomi:",
-       "emailusernamesubmit": "Jo'natish",
-       "email-legend": "Boshqa {{SITENAME}} ishtirokchisiga xat jo'natish",
+       "emailusernamesubmit": "Joʻnatish",
+       "email-legend": "{{SITENAME}} loyihasining boshqa bir foydalanuvchisiga xat joʻnatish",
        "emailfrom": "Kimdan:",
        "emailto": "Kimga:",
        "emailsubject": "Sarlavha:",
        "emailsend": "Joʻnatish",
        "emailccme": "Maktub nusxasi mening elektron pochtamga joʻnatilsin",
        "emailccsubject": "$1ga maktubingizning nusxasi: $2",
-       "emailsent": "Xat jo'natildi",
+       "emailsent": "Xat joʻnatildi",
        "emailsenttext": "Sizning elektron maktubingiz jo'natildi.",
        "usermessage-summary": "Tizimli xabar qoldirish.",
        "usermessage-editor": "Tizimli etkazish",
        "nowatchlist": "Kuzatuv roʻyxatingizda hech nima yoʻq.",
        "watchnologin": "Siz tizimda o'zingizni tanishtirmadingiz",
        "addwatch": "Kuzatuv ro'yxatiga qo'shish",
-       "addedwatchtext": "\"[[:$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv roʻyxatingizga]] qoʻshildi. Bu sahifada va uning munozara sahifasida boʻladigan oʻzgarishlar u yerda koʻrsatiladi.",
+       "addedwatchtext": "„[[:$1]]“ sahifasi (va uning munozara sahifasi) [[Special:Watchlist|kuzatuv roʻyxatingizga]] qoʻshildi.",
        "removewatch": "Kuzatuv roʻyxatidan oʻchirish",
-       "removedwatchtext": "\"[[:$1]]\" sahifasi [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.",
+       "removedwatchtext": "„[[:$1]]“ sahifasi (va uning munozara sahifasi) [[Special:Watchlist|kuzatuv roʻyxatingizdan]] oʻchirildi.",
        "watch": "Kuzatish",
        "watchthispage": "Sahifani kuzatish",
        "unwatch": "Kuzatmaslik",
        "wlheader-showupdated": "Siz oxirgi marta kirganingizdan keyin oʻzgartirilgan sahifalar '''qalin''' yozuv bilan ajratib koʻrsatilgan.",
        "wlnote": "Quyida oxirgi $2 soat ichida sodir boʻlgan {{PLURAL:$1|oxirgi oʻzgarish|<strong>$1</strong> ta oʻzgarishlar}} koʻrsatilgan. $3, $4.",
        "wlshowlast": "Oxirgi $1 soatdagi $2 kundagi tahrirlarni koʻrsatish",
+       "watchlistall2": "hammasi",
        "watchlist-options": "Kuzatuv roʻyxati moslamalari",
        "watching": "Kuzatish...",
        "unwatching": "Kuzatuv roʻyxatidan oʻchirilmoqda...",
        "undeleteviewlink": "koʻrib chiqish",
        "undeleteinvert": "Tanlash tartibini almashtirish",
        "undeletecomment": "Sababi:",
+       "undeletedrevisions": "{{PLURAL:$1|1 ta oʻzgarish|$1 ta tahrirlar}} tiklandi",
+       "undeletedfiles": "{{PLURAL:$1|Bitta fayl|$1 ta fayl}} tiklandi",
        "undelete-search-title": "O'chirilgan sahifalarni qidirish",
        "undelete-search-box": "O'chirilgan sahifalarni qidirish",
        "undelete-search-prefix": "Bundan boshlangan sahifalarni koʻrsatish:",
        "sp-contributions-toponly": "Faqat oxirgi deb hisoblangan tahrirlarni koʻrsat",
        "sp-contributions-submit": "Qidirish",
        "whatlinkshere": "Bogʻliq sahifalar",
-       "whatlinkshere-title": "\"$1\"ga bogʻlangan sahifalar",
+       "whatlinkshere-title": "„$1“ga bogʻlangan sahifalar",
        "whatlinkshere-page": "Sahifa:",
        "linkshere": "Quyidagi sahifalar '''[[:$1]]''' sahifasiga bogʻlangan:",
        "nolinkshere": "'''[[:$1]]''' sahifasiga hech qaysi sahifa bog‘lanmagan.",
        "autoblockid": "Avtochetlashtirish #$1",
        "block": "Foydalanuvchini chetlashtirish",
        "unblock": "Foydalanuvchiga yo'l ochish",
-       "blockip": "{{GENDER:$1|Foydalanuvchini}} chetlashtirish",
+       "blockip": "Chetlashtirish",
        "blockip-legend": "Foydalanuvchini chetlashtirish",
        "ipaddressorusername": "IP-manzil yoki foydalanuvchi nomi:",
        "ipbexpiry": "Tugash muddati:",
        "ipbreason": "Sabab:",
        "ipbreason-dropdown": "* Chetlashtirishning odatiy sabablari\n** Yolgʻon maʼlumot kiritish\n** Sahifa matnini toʻliq oʻchirish\n** Tashqi saytlarga spam-havolalar\n** Maʼnosiz matn/axlat qoʻshish\n** Foydalanuvchilarga tahdid qilish, ularni taʼqib qilish\n** Bir nechta hisob yozuvlaridan oʻz manfaatlarida foydalanish\n** Nomaqbul foydalanuvchi nomi",
+       "ipb-hardblock": "Tasdiqlangan foydalanuvchilarga ham ushbu IP-manzildan tahrirlashni taʼqiqlash",
+       "ipbcreateaccount": "Yangi hisob yozuvlari yaratishni taʼqiqlash",
+       "ipbemailban": "Elektron pochta orqali maktub joʻnatishni taʼqiqlash",
+       "ipbenableautoblock": "Foydalanuvchiga tegishli boʻlgan va unga aloqasi bor IP-manzillarni avtomatik chetlashtirish",
        "ipbsubmit": "Ushbu foydalanuvchini chetlashtirish",
        "ipbother": "Boshqa muddat:",
        "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",
+       "ipbwatchuser": "Foydalanuvchining shaxsiy sahifasini va munozara sahifasini kuzatuv roʻyxatimga qoʻshish",
+       "ipb-disableusertalk": "Oʻz munozara sahifasini tahrirlashni ham taʼqiqlash (chetlatish muddati davomida)",
        "ipb-edit-dropdown": "Sabablar ro‘yxatini tahrirlash",
        "ipb-unblock-addr": "$1dan toʻsiqni olish",
+       "ipb-unblock": "Foydalanuvchidan (yoki IP-manzildan) toʻsiqni olib tashlash",
+       "ipb-blocklist": "Mavjud chetlatishlarni koʻrsat",
        "unblockip": "Foydalanuvchidan to‘siqni olib tashlash",
        "ipusubmit": "Ushbu chetlashtirishni olib tashlash",
        "unblocked": "[[User:$1|$1]]dan to‘siq olib tashlandi",
        "unblocked-range": "$1dan to‘siq olib tashlandi",
        "blocklist": "Chetlashtirilgan foydalanuvchilar",
        "ipblocklist": "Chetlashtirilgan foydalanuvchilar",
+       "ipblocklist-legend": "Chetlatilgan foydalanuvchini qidirish",
        "blocklist-timestamp": "Sana/vaqt",
-       "blocklist-target": "Maqsad",
+       "blocklist-target": "Chetlatiluvchi",
        "blocklist-expiry": "Tugaydi",
-       "blocklist-by": "Chetlashtirgan maʻmur",
+       "blocklist-by": "Chetlashtirgan administrator",
        "blocklist-params": "Chetlashtirish moslamalari",
        "blocklist-reason": "Sabab",
        "ipblocklist-submit": "Qidiruv",
        "block-log-flags-nousertalk": "o'zining munozara sahifasini tahrirlay olmaydi",
        "move-page": "$1 — qayta nomlash",
        "move-page-legend": "Sahifani qayta nomlash",
-       "movearticle": "Hozirgi nomi:",
        "newtitle": "Yangi nom:",
        "move-watch": "Ushbu sahifani kuzatuv roʻyxatingizga qoʻshish",
        "movepagebtn": "Sahifani koʻchirish",
        "movepage-moved": "'''Sahifa nomi «$1»dan «$2»ga koʻchirildi'''",
        "movepage-moved-redirect": "Qayta yo‘naltirish yaratildi.",
        "movetalk": "Mos munozara sahifasini qayta nomlash",
-       "move-subpages": "Ostsahifalarni ham qayta nomlash ($1 gacha)",
-       "move-talk-subpages": "Munozara sahifasining ostsahifalarini ham qayta nomlash ($1 gacha)",
+       "move-subpages": "Ostsahifalarni ham qayta nomlash ($1 tadan kam)",
+       "move-talk-subpages": "Munozara sahifasining ostsahifalarini ham qayta nomlash ($1 tadan kam)",
        "movepage-page-moved": "Sahifa nomi «$1»dan «$2»ga koʻchirilgan edi.",
        "movelogpage": "Koʻchirish qaydlari",
        "movesubpage": "{{PLURAL:$1|Ostsahifa|Ostsahifalar}}",
        "movenosubpage": "Bu sahifa ostsahifalarga ega emas.",
        "movereason": "Sabab:",
        "revertmove": "qaytarish",
-       "delete_and_move": "O‘chirish va qayta nomlash",
        "delete_and_move_confirm": "Ha, ushbu sahifa o‘chirilsin",
        "fix-double-redirects": "Oldingi nomga yoʻnaltirishlarni toʻgʻrilash",
        "move-leave-redirect": "Qayta yoʻnaltirish qoldirish",
        "thumbnail_error": "Tasvir yaratishda xatolik: $1",
        "importlogpage": "Import qilish qaydlari",
        "tooltip-pt-userpage": "Foydalanuvchi sahifangiz",
-       "tooltip-pt-anonuserpage": "Siznig ip manzilingiz foydalanuvchi sahifasi",
+       "tooltip-pt-anonuserpage": "Siznig IP-manzilingiz uchun foydalanuvchi sahifasi",
        "tooltip-pt-mytalk": "Suhbat sahifangiz",
        "tooltip-pt-anontalk": "Bu ip manzildan amalga oshirilgan tahrirlar munozarasi",
        "tooltip-pt-preferences": "Moslamalaringiz",
        "tooltip-ca-protect": "Bu sahifani himoyalash",
        "tooltip-ca-unprotect": "Ushbu sahifaning himoyasini o'zgaritish",
        "tooltip-ca-delete": "Ushbu sahifani o‘chirish",
-       "tooltip-ca-undelete": "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
+       "tooltip-ca-undelete": "Bu sahifa oʻchirilmasidan 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ʻyxatingizdan oʻchirish",
        "tooltip-feed-rss": "Bu sahifa uchun RSS ta'minot",
        "tooltip-feed-atom": "Bu sahifa uchun Atom ta'minot",
        "tooltip-t-contributions": "Ushbu foydalanuvchi qoʻshgan hissasini koʻrish",
-       "tooltip-t-emailuser": "Ushbu foydalanuvchiga xat jo‘natish",
+       "tooltip-t-emailuser": "Ushbu foydalanuvchiga elektron maktub yozish",
        "tooltip-t-upload": "Rasmlar yoki media fayllar yuklash",
        "tooltip-t-specialpages": "Maxsus sahifalar ro‘yxati",
        "tooltip-t-print": "Ushbu sahifaning bosma uchun versiyasi",
        "pageinfo-redirectsto": "Qayta yoʻnaltirish",
        "markaspatrolledtext": "Bu sahifani tekshirilgan deb belgilash",
        "markedaspatrolledtext": "[[:$1]] sahifasining ushbu versiyasi tekshirilgan deb belgilandi.",
-       "markedaspatrollednotify": "[[:$1]] sahifasidagi ushbu oʻzgarish tekshirilgan deb belgilandi.",
+       "markedaspatrollednotify": "„$1“ sahifasidagi ushbu oʻzgarish tekshirilgan deb belgilandi.",
+       "markedaspatrollederrornotify": "Oʻzgarishni tekshirilgan deb belgilab boʻlmadi.",
        "patrol-log-page": "Patrullash qaydlari",
        "previousdiff": "← Avvalgi tahrir",
        "nextdiff": "Keyingi tahrir →",
        "table_pager_first": "Birinchi sahifa",
        "table_pager_last": "Oxirgi sahifa",
        "table_pager_limit_label": "Bir sahifadagi yozuvlar soni:",
-       "autosumm-blank": "Sahifa tozalandi",
+       "autosumm-blank": "Sahifadagi barcha matn oʻchirib tashlandi",
        "autoredircomment": "[[$1]]ga yoʻnaltirildi",
-       "autosumm-new": "\"$1\" yozuvi orqali yangi sahifa yaratildi",
+       "autosumm-new": "„$1“ yozuvi orqali yangi sahifa yaratildi",
        "size-bytes": "$1 bayt",
        "watchlisttools-view": "Mos oʻzgarishlar",
        "watchlisttools-edit": "Kuzatuv roʻyxatimni koʻrish/oʻzgartirish",
        "htmlform-reset": "Oʻzgarishlarni bekor qilish",
        "htmlform-selectorother-other": "Boshqa",
        "logentry-delete-delete": "$1 $3 sahifasini {{GENDER:$2|oʻchirdi}}",
+       "logentry-delete-restore": "$1 $3 sahifasini {{GENDER:$2|tikladi}}",
        "logentry-move-move": "$1 $3 sahifasini $4ga koʻchirdi",
        "logentry-move-move-noredirect": "$1 $3 sahifasini $4ga {{GENDER:$2|koʻchirdi}}",
        "logentry-move-move_redir": "$1 sahifa nomini $3dan $4ga yoʻnaltirish ustidan {{GENDER:$2|koʻchirdi}}",
index 2c1d958..01629cb 100644 (file)
@@ -19,7 +19,9 @@
                        "לערי ריינהארט",
                        "아라",
                        "Macofe",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "V6rg",
+                       "C.R."
                ]
        },
        "tog-underline": "Sotołinea i cołegamenti:",
        "createaccountreason": "Motivassion:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Com'èla te sì drio crear n'altra utensa",
-       "createacct-captcha": "Controlo de sicuresa",
-       "createacct-imgcaptcha-ph": "Inserissi el testo che te vedi de sora",
        "createacct-submit": "Crea la to utensa",
        "createacct-another-submit": "Crèa n'altra utensa",
        "createacct-benefit-heading": "{{SITENAME}} xe fato da gente come ti.",
        "wlheader-showupdated": "Le pagine che xe stà canbià da la to ultima visita le xe segnà in '''grosso'''",
        "wlnote": "Cuà soto te cati {{PLURAL:$1|'l ultimo canbiamento|i ultimi '''$1''' canbiamenti}} inte {{PLURAL:$2|l'ultema ora|łe ultime '''$2''' ore}}; i dati i xe axornai a łe $4 del $3.",
        "wlshowlast": "Mostra le ultime $1 ore $2 zorni",
+       "watchlistall2": "tute",
        "watchlist-options": "Inpostassion de le pagine tegnùe d'ocio",
        "watching": "Taco a tegner d'ocio...",
        "unwatching": "Desmeto de tegner d'ocio...",
        "movenosubpage": "Sta pagina no la gà nissuna sotopagina.",
        "movereason": "Motivo:",
        "revertmove": "ripristina",
-       "delete_and_move": "Scanceła e sposta",
        "delete_and_move_text": "==Scancełassion richiesta==\n\nLa voxe specificà come destinassion \"[[:$1]]\" l'esiste xà. Vóto scancełarla par proseguir con ło spostamento?",
        "delete_and_move_confirm": "Sì, scancèla la pagina",
        "delete_and_move_reason": "Scanselà par rendar posibiłe el spostamento da \"[[$1]]\"",
index c48232f..16169eb 100644 (file)
@@ -8,7 +8,8 @@
                        "Triple-ADHD-AS",
                        "Игорь Бродский",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Sebranik"
                ]
        },
        "tog-underline": "Jonoštada kosketused:",
        "permalink": "Kaikenaigaine kosketuz",
        "print": "Painda",
        "view": "Nähta",
+       "view-foreign": "Kacta $1-saital",
        "edit": "Redaktiruida",
        "create": "Säta",
        "editthispage": "Redaktiruida nece lehtpol'",
        "nstab-template": "Šablon",
        "nstab-help": "Abun lehtpol'",
        "nstab-category": "Kategorii",
+       "mainpage-nstab": "Pälehtpol'",
        "nosuchaction": "Mugošt tegendad ei ole",
        "nosuchactiontext": "URLas ozutadud tegend om petuzline.\nTö olet tehnu petusen URLan kirjutades vai männu värad kosketustme.\nNece voib mugažo ozutada viga {{SITENAME}}-projektan programmištos.",
        "nosuchspecialpage": "Mugošt speciališt lehtpol't ei ole",
        "createaccountreason": "Sü:",
        "createacct-reason": "Sü",
        "createacct-reason-ph": "Mikš sädad kävutajanprofilid?",
-       "createacct-captcha": "Varuitomuden kodvind",
-       "createacct-imgcaptcha-ph": "Kirjutagat tekst pälpäi",
        "createacct-submit": "Säta kävutajanprofil'",
        "createacct-another-submit": "Säta toine kävutajanprofil'",
        "createacct-benefit-heading": "{{SITENAME}}-saitad tehtas teiden pojavad ristitud.",
        "login-throttled": "Tö olet tehnu äjahkon naprindoid kirjutadas sistemha.\nOlgat hüväd, varastagat $1 aigad edel ut naprindad.",
        "login-abort-generic": "Teiden naprind tulda sistemha om satusetoi - Azotadud",
        "loginlanguagelabel": "Kel’: $1",
+       "pt-login": "Kirjutagatoiš sistemha",
+       "pt-createaccount": "Sada registracii",
        "php-mail-error-unknown": "Tundmatoi petuz PHP:n mail()-funkcijas",
        "user-mail-no-addy": "Tö ladit oigeta kirjeine e-počtan adresata.",
        "changepassword": "Peitsanan toižetuz",
        "passwordreset-capture": "Ozutada-k loptud kirjeine?",
        "passwordreset-email": "E-počtan adres:",
        "passwordreset-emailelement": "Kävutajannimi: \n$1\n\nAigaline peitsana: \n$2",
-       "passwordreset-emailsent": "Muštatai kirjeine uden peitsananke oigetihe e-počtadme.",
+       "passwordreset-emailsentemail": "Muštatai kirjeine uden peitsananke oigetihe e-počtadme.",
        "changeemail": "Toižetada e-počtan adres",
        "changeemail-no-info": "Miše kirjutada necil lehtpolel, teile pidab kirjutadas sistemha.",
        "changeemail-oldemail": "Nügüdläine e-počtan adres:",
        "preview": "Ezikacund",
        "showpreview": "Ozutada ezikacund",
        "showdiff": "Ozutada toižetused",
-       "anoneditwarning": "'''Homaikat:''' Tö et olgoi kirjutanus sistemha.\nTeiden IP-adres om kirjutadud necen lehtpolen redaktiruindan istorijaha.",
+       "anoneditwarning": "<strong>Homaikat:<strong> Tö et olgoi kirjutanus sistemha. Teiden IP-adres kirjutadas necen lehtpolen redaktiruindan istorijaha, ku toižetaškandet sidä. Ku tö <strong>[$1 kirjutatoiš sistemha]</strong> vai <strong>[$2 sat registracijan]</strong>, ka teiden redakcijad sidotas teiden kävutajannimehe. Siloi teil linneb toižid-ki ližavoimuzid.",
        "missingsummary": "'''Muštatez:''' Tö et olgoi andnuded toižetusiden lühüdad ümbrikacundad.\nKu tö valičet völ kerdan \"Kirjutada lehtpol'\", ka teiden toižetused kirjutase ningoižeta ümbrikacundata.",
        "missingcommenttext": "Olgat hüväd, pangat teiden tedotuz alahaks.",
        "missingcommentheader": "'''Muštatez:''' Tö et olgoi andnuded toižetusiden ümbrikacundoiden pälkirjutest.\nKu tö valičet völ kerdan ”{{int:savearticle}}” \"Kirjutada lehtpol'\", ka teiden toižetusiden ümbrikacund kirjutase ningoižeta pälkirjuteseta.",
        "shown-title": "Ozutada $1 {{PLURAL:$1|rezul'tat|rezul'tatad}} lehtpoleks",
        "viewprevnext": "Kacta ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Neciš Wikiš om jo lehtpol' ningoižen nimenke: \"[[:$1]]\"'''",
-       "searchmenu-new": "'''Säta lehtpol' \"[[:$1]]\" neciš Wikiš!'''",
+       "searchmenu-new": "<strong>Säta lehtpol' \"[[:$1]]\" neciš Wikiš!<strong> {{PLURAL:$2|0=|Kackat mugažo löutud lehtpol'he.|Kackat mugažo ecindan rezul'tatoihe.}}",
        "searchprofile-articles": "Südäimištlehtpoled",
        "searchprofile-images": "Mul'timedii",
        "searchprofile-everything": "Kaikjal",
        "searchrelated": "sidotud",
        "searchall": "kaik",
        "showingresults": "Alemba ozutadas {{PLURAL:$1|'''1''' rezul'tat|'''$1''' rezul'tatad}} nomeraspäi #'''$2''' augotaden.",
+       "search-showingresults": "Rezul'tatad $1–$2 $3-späi",
        "search-nonefound": "Ecmižhe ei löudnus rezul'tatoid.",
        "powersearch-legend": "Levitoittud ecind",
        "powersearch-ns": "Ecind nimiavaruziš:",
        "prefs-displaywatchlist": "Nägun opcijad",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Erod",
-       "email-address-validity-valid": "Verkpočtan adres nägub korrektižeks.",
-       "email-address-validity-invalid": "Antkat verkpočtan korrektine adres",
        "userrights": "Kävutajiden oiktusiden ohjandamine",
        "userrights-lookup-user": "Kävutajiden gruppiden ohjendamine",
        "userrights-user-editname": "Kävutajan nimi:",
        "recentchanges-label-minor": "Nece redakcii om penikaine",
        "recentchanges-label-bot": "Necen redakcijan tegi bot",
        "recentchanges-label-unpatrolled": "Necidä redakcijad ei völ patruliruinugoi",
+       "recentchanges-label-plusminus": "Suruden toižetamine baitoiš",
        "recentchanges-legend-newpage": "$1 - uz' lehtpol'",
        "rcnotefrom": "Alemba oma anttud toižetused '''$2'''-späi ( '''$1'''-hesai).",
        "rclistfrom": "Ozutada uded toižetused dataspäi $3 $2 augotaden",
        "rcshowhideminor": "$1 pened redakcijad",
+       "rcshowhideminor-hide": "Peitta",
        "rcshowhidebots": "$1 botad",
+       "rcshowhidebots-show": "Ozutada",
        "rcshowhideliu": "$1 sistemha kirjutadud kävutajad",
+       "rcshowhideliu-hide": "Peitta",
        "rcshowhideanons": "$1 anonimišt kävutajad",
+       "rcshowhideanons-hide": "Peitta",
        "rcshowhidepatr": "$1 kodvdud toižetust",
        "rcshowhidemine": "$1 ičein redakcijad",
+       "rcshowhidemine-hide": "Peitta",
        "rclinks": "Ozutada jäl'gmäižed $1 toižetust $2 päiväs<br />$3",
        "diff": "erod",
        "hist": "istorii",
        "watchlist-details": "Teiden kaclendnimikirjuteses om {{PLURAL:$1|$1 lehtpol'|$1 lehtpol't}}. Lodulehtpoled ei olgoi neciš lugus.",
        "wlheader-enotif": "Tedotand e-počtadme om kävutamas.",
        "wlshowlast": "Ozutada jäl'gmäižiš $1 časuiš da $2 päiviš",
+       "watchlistall2": "kaik",
        "watchlist-options": "Kaclendnimikirjutesen järgendused",
        "watching": "Ližaduz kaclendnimikirjuteshe...",
        "unwatching": "Heitmine kaclendnimikirjutesespäi...",
        "movenosubpage": "Necil lehtpolel ei ole alalehtpolid.",
        "movereason": "Sü:",
        "revertmove": "heitta pätand",
-       "delete_and_move": "Čuta poiš da udesnimitada",
        "delete_and_move_confirm": "Ka, čuta lehtpol' poiš",
        "delete_and_move_reason": "Čutud poiš \"[[$1]]\"n udesnimitamižen voimusen täht.",
        "immobile-source-namespace": "Ei voi udesnimitada lehtpolid \"$1\"-nimiavaruses",
        "tooltip-pt-mycontris": "Minun redakcijoiden nimikirjutez",
        "tooltip-pt-login": "Naku sab kirjutadas sistemha, no necidä ei tarbiž radon täht",
        "tooltip-pt-logout": "Lähtta sistemaspäi",
+       "tooltip-pt-createaccount": "Mö taričem teile sada registracii i kirjutadas sistemha, no mö em tarbhaikoi necidä.",
        "tooltip-ca-talk": "Diskussii neciš lehtpoles",
-       "tooltip-ca-edit": "Sab redaktiruida necidä lehtpol't.\nOlgat hüväd, kävutagat ezikacund.",
+       "tooltip-ca-edit": "Sab redaktiruida necidä lehtpol't.",
        "tooltip-ca-addsection": "Augotada uz' jaguz",
        "tooltip-ca-viewsource": "Nece lehtpol' om kaitud.\nSab lugeda sen augotižkod da kopiruida se.",
        "tooltip-ca-history": "Necen lehtpolen enččed versijad",
        "tooltip-ca-nstab-main": "Südäimištlehtpol'",
        "tooltip-ca-nstab-user": "Kacta kävutajan lehtpol'he",
        "tooltip-ca-nstab-media": "Mediafail",
-       "tooltip-ca-nstab-special": "Nece om specialine lehtpol', tö et voigoi toižetada sidä",
+       "tooltip-ca-nstab-special": "Nece om specialine lehtpol', sidä ei sa toižetada",
        "tooltip-ca-nstab-project": "Kacta projektan lehtpol'he",
        "tooltip-ca-nstab-image": "Kacta failan lehtpol'he",
        "tooltip-ca-nstab-mediawiki": "Lugeda sisteman tedotuz",
        "spamprotectiontext": "Lehtpolen, kudamban tö tahtoit kirjutada muštho, om blokiruidud spamanfil'tral.\nVoib olda, necil lehtpolel om kosketuz irdsaitale, kudamb om mustas nimikirjuteses.",
        "spamprotectionmatch": "Meiden spamanfil'tr tedoti necil statjal mugošt: $1",
        "spambot_username": "MediaWikid puhtastadas spamaspäi",
+       "simpleantispam-label": "Spamanvastaine kodv.\n<strong>Algat</strong> täutkoi necidä!",
        "pageinfo-header-edits": "Redakcijoiden istorii",
        "pageinfo-article-id": "Lehtpolen ID",
        "pageinfo-watchers": "Lehtpolen kaclijoiden lugu",
        "pageinfo-edits": "Redakcijoiden lugumär",
        "pageinfo-authors": "Erazvuiččiden avtoroiden lugu",
+       "pageinfo-toolboxlink": "Lehtpolen informacii",
        "pageinfo-contentpage-yes": "Ka",
        "pageinfo-protect-cascading-yes": "Ka",
        "pageinfo-category-pages": "Lehtpoliden lugumär",
        "tags": "Aktualižed toižetusiden vestatesed",
        "tag-filter": "[[Special:Tags|Vestatesiden]] fil'tr:",
        "tag-filter-submit": "Fil'tr",
+       "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Virg|Virgad}}]]: $2)",
        "tags-title": "Virgad",
        "tags-intro": "Necil lehtpolel om virgoiden nimikirj i neniden virgoiden znamoičendad. Programmad znamoitas virgoil toižetusid.",
        "tags-tag": "Tegan (virgan) nimi",
        "sqlite-no-fts": " $1 täuz'tekstaižen ecindan tügedamižeta",
        "revdelete-restricted": "kaidendused administratoriden täht",
        "revdelete-unrestricted": "kaidendused heittud administratoriden täht",
+       "logentry-newusers-create": "{{GENDER:$2|tegihe}} $1-kävutajaks",
        "rightsnone": "(ei ole)",
        "revdelete-summary": "kaik toižetused",
        "feedback-cancel": "Heitta pätand",
index 8703ea8..37d5cec 100644 (file)
                        "KhangND",
                        "Darcy Le",
                        "Quenhitran",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Xð"
                ]
        },
        "tog-underline": "Gạch chân liên kết:",
        "tog-hideminor": "Ẩn sửa đổi nhỏ trong thay đổi gần đây",
        "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-hidecategorization": "Ẩn việc xếp thể loạ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": "Thu gọn các thay đổi theo trang trong thay đổi gần đây và danh sách theo dõi",
        "tog-numberheadings": "Tự động đánh số các đề mục",
@@ -68,6 +70,7 @@
        "tog-watchlisthideliu": "Ẩn sửa đổi của thành viên đã đăng nhập khỏi danh sách theo dõi",
        "tog-watchlisthideanons": "Ẩn sửa đổi của người dùng vô danh khỏi danh sách theo dõi",
        "tog-watchlisthidepatrolled": "Ẩn sửa đổi đã tuần tra trong danh sách theo dõi",
+       "tog-watchlisthidecategorization": "Ẩn việc xếp thể loại",
        "tog-ccmeonemails": "Gửi bản sao cho tôi khi gửi thư điện tử cho người khác",
        "tog-diffonly": "Không hiển thị nội dung trang dưới phần so sánh phiên bản",
        "tog-showhiddencats": "Hiển thị thể loại ẩn",
        "october-date": "$1 tháng 10",
        "november-date": "$1 tháng 11",
        "december-date": "$1 tháng 12",
-       "pagecategories": "{{PLURAL:$1|Thể loại|Thể loại}}",
+       "pagecategories": "{{PLURAL:$1}}Thể loại",
        "category_header": "Các trang trong thể loại “$1”",
        "subcategories": "Thể loại con",
        "category-media-header": "Các tập tin trong thể loại “$1”",
        "category-empty": "''Thể loại này hiện không có trang hay tập tin nào.''",
-       "hidden-categories": "{{PLURAL:$1|Thể loại ẩn|Thể loại ẩn}}",
+       "hidden-categories": "{{PLURAL:$1}}Thể loại ẩn",
        "hidden-category-category": "Thể loại ẩn",
-       "category-subcat-count": "Thể loại này gồm {{PLURAL:$2|thể loại con sau|{{PLURAL:$1||$1}} thể loại con sau, trên tổng số $2 thể loại con}}.",
+       "category-subcat-count": "Thể loại này gồm {{PLURAL:$2|thể loại con sau|{{PLURAL:$1|thể loại|$1 thể loại}} con sau, trên tổng số $2 thể loại con}}.",
        "category-subcat-count-limited": "Thể loại này gồm {{PLURAL:$1|thể loại con|$1 thể loại con}} sau.",
        "category-article-count": "{{PLURAL:$2|Thể loại này gồm trang sau.|{{PLURAL:$1|Trang|$1 trang}} sau nằm trong thể loại này, trên tổng số $2 trang.}}",
        "category-article-count-limited": "{{PLURAL:$1|Trang|$1 trang}} sau nằm trong thể loại hiện hành.",
        "morenotlisted": "Danh sách này không có đầy đủ.",
        "mypage": "Trang cá nhân",
        "mytalk": "Tin nhắn",
-       "anontalk": "Thảo luận với IP này",
+       "anontalk": "Thảo luận",
        "navigation": "Xem nhanh",
        "and": "&#32;và",
        "qbfind": "Tìm kiếm",
        "viewhelppage": "Xem trang trợ giúp",
        "categorypage": "Xem trang thể loại",
        "viewtalkpage": "Xem trang thảo luận",
-       "otherlanguages": "Ngôn ngữ khác",
+       "otherlanguages": "Trong các ngôn ngữ khác",
        "redirectedfrom": "(đổi hướng từ $1)",
        "redirectpagesub": "Trang đổi hướng",
        "redirectto": "Đổi hướng đến:",
        "missingarticle-rev": "(số phiên bản: $1)",
        "missingarticle-diff": "(Khác: $1, $2)",
        "readonly_lag": "Cơ sở dữ liệu bị khóa tự động trong khi các máy chủ cập nhật thông tin của nhau.",
+       "nonwrite-api-promise-error": "Đầu đề HTTP “Promise-Non-Write-API-Action” được gửi nhưng yêu cầu là cho mô đun ghi của API.",
        "internalerror": "Lỗi nội bộ",
        "internalerror_info": "Lỗi nội bộ: $1",
        "internalerror-fatal-exception": "Ngoại lệ chí tử loại “$1”",
        "badtitle": "Tựa trang sai",
        "badtitletext": "Tựa trang yêu cầu không đúng, rỗng, hoặc là một liên kết ngôn ngữ hoặc liên kết wiki sai. Nó có thể chứa một hoặc nhiều ký tự mà tựa trang không thể sử dụng.",
        "title-invalid-empty": "Tiêu đề trang được yêu cầu rỗng hoặc chỉ chứa tên của một không gian tên.",
-       "title-invalid-utf8": "Tiêu đề trang được yêu cầu chứa một chuỗi UTF-8 không hợp lệ",
-       "title-invalid-interwiki": "Tiêu đề trang yêu cầu có chứa một liên kết liên wiki mà không thể được sử dụng làm tiêu đề",
+       "title-invalid-utf8": "Tiêu đề trang được yêu cầu chứa một chuỗi UTF-8 không hợp lệ.",
+       "title-invalid-interwiki": "Tiêu đề trang yêu cầu có chứa một liên kết liên wiki mà không thể được sử dụng làm tiêu đề.",
        "title-invalid-talk-namespace": "Tiêu đề trang đã yêu cầu chỉ đến trang thảo luận không thể tồn tại.",
-       "title-invalid-characters": "Tiêu đề trang đã yêu cầu chứa ký tự không hợp lệ: \"$1\".",
+       "title-invalid-characters": "Tiêu đề trang đã yêu cầu chứa ký tự không hợp lệ: “$1”.",
        "title-invalid-relative": "Tiêu đề có đường dẫn tương đối. Tiêu đề trang tương đối (./, ../) là không hợp lệ , bởi chúng thường sẽ không thể đến được khi được xử lý bởi trình duyệt của người dùng.",
        "title-invalid-magic-tilde": "Tiêu đề trang đã yêu cầu chứa dãy dấu ngã không hợp lệ (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "Tiêu đề trang đã yêu cầu quá dài. Tiêu đề phải ngắn hơn $1 {{PLURAL:$1|byte|bytes}} byte theo mã hóa UTF-8.",
+       "title-invalid-too-long": "Tiêu đề trang đã yêu cầu quá dài. Tiêu đề phải ngắn hơn $1 byte theo mã hóa UTF-8.",
        "title-invalid-leading-colon": "Tiêu đề trang đã yêu cầu chứa dấu hai chấm ở đầu là không hợp lệ.",
        "perfcached": "Dữ liệu sau được lấy từ bộ nhớ đệm và có thể đã lỗi thời. Tối đa có sẵn {{PLURAL:$1|một kết quả|$1 kết quả}} trong bộ nhớ đệm.",
        "perfcachedts": "Dữ liệu dưới đây được đưa vào vùng nhớ đệm và được cập nhật lần cuối lúc $1. Tối đa có sẵn {{PLURAL:$4|một kết quả|$4 kết quả}} trong vùng nhớ đệm.",
        "createaccountreason": "Lý do:",
        "createacct-reason": "Lý do",
        "createacct-reason-ph": "Nhập lý do tạo một tài khoản khác",
-       "createacct-captcha": "Kiểm tra an toàn",
-       "createacct-imgcaptcha-ph": "Nhập dòng chữ bạn thấy bên dưới",
        "createacct-submit": "Tạo tài khoản",
        "createacct-another-submit": "Mở tài khoản",
        "createacct-benefit-heading": "{{SITENAME}} được xây dựng bởi những người như bạn.",
        "accountcreated": "Mở tài khoản thành công",
        "accountcreatedtext": "Tài khoản thành viên cho [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|thảo luận]]) đã được mở.",
        "createaccount-title": "Tài khoản mới tại {{SITENAME}}",
-       "createaccount-text": "Ai đó đã tạo một tài khoản với tên $2 tại {{SITENAME}} ($4). Mật khẩu của \"$2\" là \"$3\". Bạn nên đăng nhập và đổi mật khẩu ngay bây giờ.\n\nXin hãy bỏ qua thông điệp này nếu tài khoản này không phải do bạn tạo ra.",
+       "createaccount-text": "Ai đó đã tạo một tài khoản với tên $2 tại {{SITENAME}} ($4). Mật khẩu của “$2” là “$3”. Bạn nên đăng nhập và đổi mật khẩu ngay bây giờ.\n\nXin hãy bỏ qua thông điệp này nếu tài khoản này không phải do bạn tạo ra.",
        "login-throttled": "Bạn đã hết quyền thử mật khẩu tài khoản này vì bạn đã nhập sai quá nhiều. Xin hãy đợi $1 rồi hãy thử lại.",
        "login-abort-generic": "Thất bại khi đăng nhập",
        "login-migrated-generic": "Tài khoản của bạn đã được hợp nhất, và tên đăng nhập của bạn không còn tồn tại trên wiki này.",
        "passwordreset-emailtext-ip": "Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu tái tạo mật khẩu của bạn \ntại {{SITENAME}} ($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền \nvới địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu\nhoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailtext-user": "Thành viên $1 tại {{SITENAME}} đã yêu cầu tái tạo mật khẩu tại {{SITENAME}} \n($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền với địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu hoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailelement": "Tên người dùng: \n$1\n\nMật khẩu tạm: \n$2",
-       "passwordreset-emailsent": "Nếu đây là đúng địa chỉ thư điện tử của tài khoản của bạn, một thư điện tử để tái tạo mật khẩu sẽ được gửi cho bạn.",
+       "passwordreset-emailsentemail": "Nếu đây là đúng địa chỉ thư điện tử của tài khoản của bạn, một thư điện tử để tái tạo mật khẩu sẽ được gửi cho bạn.",
        "passwordreset-emailsent-capture": "Thư điện tử để tái tạo mật khẩu đã được gửi, nội dung như sau.",
        "passwordreset-emailerror-capture": "Chúng tôi đã tạo thư tái tạo mật khẩu dưới đây, nhưng không thể gửi đến {{GENDER:$2}}người dùng: $1",
        "changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
-       "changeemail-header": "Đổi địa chỉ thư điện tử của tài khoản",
+       "changeemail-header": "Điền biểu mẫu này để đổi địa chỉ thư điện tử của bạn. Nếu bạn muốn gỡ địa chỉ thư điện tử nào khỏi tài khoản của bạn, để trống hộp địa chỉ thư điện tử mới và lưu biểu mẫu.",
+       "changeemail-passwordrequired": "Bạn sẽ cần phải nhập mật khẩu của bạn để xác nhận thay đổi này.",
        "changeemail-no-info": "Bạn phải đăng nhập mới có thể truy cập trực tiếp trang này.",
        "changeemail-oldemail": "Địa chỉ thư điện tử hiện tại:",
        "changeemail-newemail": "Địa chỉ thư điện tử mới:",
        "missingsummary": "'''Nhắc nhở:''' Bạn đã không ghi lại tóm lược sửa đổi. Nếu bạn nhấn Lưu trang một lần nữa, sửa đổi của bạn sẽ được lưu mà không có tóm lược.",
        "selfredirect": "<strong>Cảnh báo:</strong> Bạn sắp đổi hướng trang này đến chính trang này.\nCó lẽ bạn đã định rõ mục tiêu sai hoặc bạn đang sửa trang sai.\nNếu bạn bấm “{{int:savearticle}}” lần nữa, trang đổi hướng sẽ được tạo ra.",
        "missingcommenttext": "Xin hãy gõ vào lời bàn luận ở dưới.",
-       "missingcommentheader": "'''Nhắc nhở:''' Bạn chưa ghi chủ đề/tiêu đề cho bàn luận này.\nNếu bạn nhấn nút \"{{int:savearticle}}\" lần nữa, sửa đổi của bạn sẽ được lưu mà không có đề mục.",
+       "missingcommentheader": "<strong>Nhắc nhở:</strong> Bạn chưa ghi chủ đề/tiêu đề cho bàn luận này.\nNếu bạn nhấn nút “{{int:savearticle}}” lần nữa, sửa đổi của bạn sẽ được lưu mà không có đề mục.",
        "summary-preview": "Xem trước dòng tóm lược:",
        "subject-preview": "Xem trước đề mục:",
        "previewerrortext": "Có lỗi xảy ra khi xem trước những thay đổi của bạn.",
        "yourdiff": "Khác",
        "copyrightwarning": "Xin chú ý rằng tất cả các đóng góp của bạn tại {{SITENAME}} được xem là sẽ phát hành theo giấy phép $2 (xem $1 để biết thêm chi tiết). Nếu bạn không muốn trang của bạn bị sửa đổi không thương tiếc và không sẵn lòng cho phép phát hành lại, đừng đăng trang ở đây.<br />\nBạn phải đảm bảo với chúng tôi rằng chính bạn là người viết nên, hoặc chép nó từ một nguồn thuộc phạm vi công cộng hoặc tự do tương đương.\n'''ĐỪNG ĐĂNG TÁC PHẨM CÓ BẢN QUYỀN MÀ CHƯA XIN PHÉP!'''",
        "copyrightwarning2": "Xin chú ý rằng tất cả các đóng góp của bạn tại {{SITENAME}} có thể được sửa đổi, thay thế, hoặc xóa bỏ bởi các thành viên khác. Nếu bạn không muốn trang của bạn bị sửa đổi không thương tiếc, đừng đăng trang ở đây.<br />\nBạn phải đảm bảo với chúng tôi rằng chính bạn là người viết nên, hoặc chép nó từ một nguồn thuộc phạm vi công cộng hoặc tự do tương đương (xem $1 để biết thêm chi tiết).\n'''ĐỪNG ĐĂNG TÁC PHẨM CÓ BẢN QUYỀN MÀ CHƯA XIN PHÉP!'''",
-       "editpage-cannot-use-custom-model": "Mẫu nội dung của trang này không thể thay.",
+       "editpage-cannot-use-custom-model": "Không thể thay đổi kiểu nội dung của trang này.",
        "longpageerror": "'''Lỗi: Văn bạn mà bạn muốn lưu dài $1 kilôbyte, dài hơn độ dài tối đa cho phép $2 kilôbyte.'''\nKhông thể lưu trang.",
        "readonlywarning": "'''CẢNH BÁO: Cơ sở dữ liệu đã bị khóa để bảo dưỡng, do đó bạn không thể lưu các sửa đổi của mình. Bạn nên cắt-dán đoạn bạn vừa sửa vào một tập tin và lưu nó lại để sửa đổi sau này.'''\n\nBảo quản viên khi khóa dữ liệu đã đưa ra lý do: $1",
        "protectedpagewarning": "'''Cảnh báo: Trang này đã bị khóa và chỉ có các thành viên có quyền quản lý mới có thể sửa được.'''\nThông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
        "sectioneditnotsupported-title": "Không hỗ trợ sửa đổi đề mục",
        "sectioneditnotsupported-text": "Trang sửa đổi này không hỗ trợ sửa đổi đề mục.",
        "permissionserrors": "Không có quyền thực hiện",
-       "permissionserrorstext": "Bạn không có quyền thực hiện thao tác đó, vì {{PLURAL:$1|lý do|lý do}}:",
-       "permissionserrorstext-withaction": "Bạn không quyền $2, với {{PLURAL:$1|lý do|lý do}} sau:",
+       "permissionserrorstext": "Bạn không có quyền thực hiện thao tác đó, vì {{PLURAL:$1|lý do|các lý do}} sau:",
+       "permissionserrorstext-withaction": "Bạn không quyền $2, với {{PLURAL:$1|lý do|các lý do}} sau:",
+       "contentmodelediterror": "Bạn không thể sửa đổi phiên bản này vì kiểu nội dung của nó là <code>$1</code>, trong khi kiểu nội dung của trang là <code>$2</code>.",
        "recreate-moveddeleted-warn": "'''Cảnh báo: Bạn sắp tạo lại một trang từng bị xóa trước đây.'''\n\nBạn nên cân nhắc trong việc tiếp tục soạn thảo trang này.\nCác nhật trình xóa và di chuyển của trang được đưa ra dưới đây để tiện theo dõi:",
        "moveddeleted-notice": "Trang này đã bị xóa.\nCác nhật trình xóa và di chuyển của trang được đưa ra dưới đây để tiện theo dõi.",
        "moveddeleted-notice-recent": "Rất tiếc, trang này vừa bị xóa (trong vòng 24 giờ trước).\nCác nhật trình xóa và di chuyển của trang được đưa ra dưới đây để tiện theo dõi.",
        "content-not-allowed-here": "Không cho phép đưa nội dung “$1” vào trang [[$2]]",
        "editwarning-warning": "Rời khỏi trang này sẽ khiến bạn mất các sửa đổi đã thực hiện.\nNếu đã đăng nhập, bạn có thể tắt cảnh báo này tại mục “{{int:prefs-editing}}” trong tùy chọn cá nhân.",
        "editpage-notsupportedcontentformat-title": "Không hỗ trợ định dạng nội dung",
-       "editpage-notsupportedcontentformat-text": "Mô hình nội dung $2 không hỗ trợ định dạng nội dung $1.",
+       "editpage-notsupportedcontentformat-text": "Kiểu nội dung $2 không hỗ trợ định dạng nội dung $1.",
        "content-model-wikitext": "mã wiki",
        "content-model-text": "văn bản thuần",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-json-empty-object": "Đối tượng trống",
        "content-json-empty-array": "Mảng trống",
-       "duplicate-args-warning": "<strong>Cảnh báo:</strong> [[:$1]] đang gọi  [[:$2]] với nhiều hơn một giá trị cho thông số \"$3\". Chỉ giá trị cuối cùng mới được sử dụng.",
+       "duplicate-args-warning": "<strong>Cảnh báo:</strong> [[:$1]] đang gọi  [[:$2]] với nhiều hơn một giá trị cho thông số “$3”. Chỉ giá trị cuối cùng mới được sử dụng.",
        "duplicate-args-category": "Trang đưa đối số thừa vào bản mẫu",
        "duplicate-args-category-desc": "Trang đưa một đối số nhiều lần vào một bản mẫu được nhúng, thí dụ <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> hoặc <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
-       "expensive-parserfunction-warning": "Cảnh báo: Trang này có quá nhiều lần gọi hàm cú pháp cần mức độ xử lý cao.\n\nNó nên ít hơn $2 {{PLURAL:$2|lần gọi|lần gọi}}, hiện giờ đang là {{PLURAL:$1|$1 lần gọi|$1 lần gọi}}.",
+       "expensive-parserfunction-warning": "Cảnh báo: Trang này có quá nhiều lần gọi hàm cú pháp cần mức độ xử lý cao.\n\nNó nên ít hơn $2 lần gọi, hiện giờ đang là $1 lần gọi.",
        "expensive-parserfunction-category": "Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao",
        "post-expand-template-inclusion-warning": "Cảnh báo: Kích thước bản mẫu nhúng vào quá lớn.\nMột số bản mẫu sẽ không được đưa vào.",
        "post-expand-template-inclusion-category": "Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép",
        "history-feed-description": "Lịch sử thay đổi của trang này ở wiki",
        "history-feed-item-nocomment": "$1 vào lúc $2",
        "history-feed-empty": "Trang bạn yêu cầu không tồn tại. Có thể là nó đã bị xóa khỏi wiki hay được đổi tên. Hãy [[Special:Search|tìm kiếm trong wiki]] về các trang mới có liên quan.",
-       "history-edit-tags": "Sửa đổi thẻ đánh dấu của các bản xem trước đã chọn",
+       "history-edit-tags": "Sửa đổi thẻ của các phiên bản đã chọn",
        "rev-deleted-comment": "(tóm lược sửa đổi đã bị xóa)",
        "rev-deleted-user": "(tên người dùng đã bị xóa)",
        "rev-deleted-event": "(chi tiết nhật trình đã bị xóa)",
        "mergehistory-go": "Hiển thị các sửa đổi có thể trộn được",
        "mergehistory-submit": "Trộn các sửa đổi",
        "mergehistory-empty": "Không thể trộn được sửa đổi nào.",
-       "mergehistory-done": "$3 {{PLURAL:$3|sửa đổi|sửa đổi}} của $1 đã được trộn vào [[:$2]].",
+       "mergehistory-done": "$3 phiên bản của $1 đã được trộn vào [[:$2]].",
        "mergehistory-fail": "Không thể thực hiện được việc trộn lịch sử sửa đổi, vui lòng chọn lại trang cũng như thông số ngày giờ.",
        "mergehistory-fail-toobig": "Không thể trộn lịch sử vì phải di chuyển $1 phiên bản và vượt quá giới hạn cho phép.",
        "mergehistory-no-source": "Trang nguồn $1 không tồn tại.",
        "nextn": "{{PLURAL:$1|$1}} mục sau",
        "prev-page": "Trang trước",
        "next-page": "Trang sau",
-       "prevn-title": "$1 {{PLURAL:$1|kết quả|kết quả}} trước",
-       "nextn-title": "$1 {{PLURAL:$1|kết quả|kết quả}} sau",
-       "shown-title": "Hiển thị $1 {{PLURAL:$1|kết quả|kết quả}} mỗi trang",
+       "prevn-title": "$1 kết quả trước",
+       "nextn-title": "$1 kết quả sau",
+       "shown-title": "Hiển thị $1 kết quả mỗi trang",
        "viewprevnext": "Xem ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "<strong>Có trang với tên “[[:$1]]” trên wiki này.</strong> {{PLURAL:$2|0=|Xem thêm các kết quả tìm kiếm bên dưới:}}",
        "searchmenu-new": "'''Tạo trang “[[:$1]]” trên wiki này!''' {{PLURAL:$2|0=|Xem thêm {{PLURAL:$2|kết quả|các kết quả}} tìm kiếm:}}",
        "search-relatedarticle": "Liên quan",
        "searchrelated": "có liên quan",
        "searchall": "tất cả",
-       "showingresults": "Dưới đây là {{PLURAL:$1|'''1'''|'''$1'''}} kết quả bắt đầu từ #'''$2'''.",
+       "showingresults": "Dưới đây là cho đến <strong>$1</strong> kết quả bắt đầu từ #<strong>$2</strong>.",
        "showingresultsinrange": "Dưới đây là cho tới <strong>$1</strong> kết quả từ #<strong>$2</strong> đến #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Kết quả thứ <strong>$1</strong> trong tổng số <strong>$3</strong>|Các kết quả <strong>$1–$2</strong> trong tổng số <strong>$3</strong>}}",
        "search-nonefound": "Không có kết quả nào khớp với câu truy vấn.",
+       "search-nonefound-thiswiki": "Không có kết quả nào khớp với truy câu truy vấn trong website này.",
        "powersearch-legend": "Tìm kiếm nâng cao",
        "powersearch-ns": "Tìm trong không gian tên:",
        "powersearch-togglelabel": "Chọn:",
        "prefs-rc": "Thay đổi gần đây",
        "prefs-watchlist": "Theo dõi",
        "prefs-editwatchlist": "Sửa các trang tôi theo dõi",
-       "prefs-editwatchlist-label": "Chỉnh sửa các mục trong danh sách theo dõi của bạn:",
+       "prefs-editwatchlist-label": "Sửa đổi các mục trong danh sách theo dõi của bạn:",
        "prefs-editwatchlist-edit": "Xem và xoá các tiêu đề trong danh sách theo dõi của bạn",
        "prefs-editwatchlist-raw": "Sửa danh sách theo dõi dạng thô",
        "prefs-editwatchlist-clear": "Xóa sạch danh sách theo dõi của bạn",
        "stub-threshold-sample-link": "ví dụ",
        "stub-threshold-disabled": "Tắt",
        "recentchangesdays": "Số ngày hiển thị trong thay đổi gần đây:",
-       "recentchangesdays-max": "(tối đa $1 {{PLURAL:$1|ngày|ngày}})",
+       "recentchangesdays-max": "(tối đa $1 ngày)",
        "recentchangescount": "Số sửa đổi hiển thị mặc định:",
        "prefs-help-recentchangescount": "Số này bao gồm các thay đổi gần đây, lịch sử trang, và nhật trình.",
        "prefs-help-watchlist-token2": "Đây là chìa khóa bí mật cho nguồn cấp dữ liệu danh sách theo dõi của bạn.\nBất cứ ai biết nó sẽ có thể để đọc danh sách theo dõi của bạn, vì vậy đừng chia sẻ nó.\n[[Special:ResetTokens|Nhấn chuột vào đây nếu bạn cần phải thiết lập lại nó]].",
        "savedprefs": "Đã lưu các tùy chọn cá nhân.",
+       "savedrights": "Đã lưu các quyền hạn của người dùng {{GENDER:$1}}$1.",
        "timezonelegend": "Múi giờ:",
        "localtime": "Giờ hiện tại:",
        "timezoneuseserverdefault": "Sử dụng giờ mặc định của wiki ($1)",
        "badsig": "Chữ ký không hợp lệ; hãy kiểm tra thẻ HTML.",
        "badsiglength": "Chữ ký của bạn quá dài.\nNó không được dài quá $1 ký tự.",
        "yourgender": "Bạn muốn được miêu tả như thế nào?",
-       "gender-unknown": "Khi nhắc nhở bạn, phần mềm sẽ sử dụng các từ chỉ giới tính trung tính bất cứ khi nào có thể",
+       "gender-unknown": "Khi nhắc đến bạn, phần mềm sẽ sử dụng các từ chỉ giới tính trung tính bất cứ khi nào có thể",
        "gender-male": "Nam",
        "gender-female": "Nữ",
        "prefs-help-gender": "Tùy chỉnh này không được bắt buộc.\nPhần mềm sử dụng giá trị này để xưng hô bạn với giới tính đúng.\nThông tin này là công khai.",
        "prefs-help-prefershttps": "Đăng xuất và đăng nhập lại để áp dụng tùy chọn này.",
        "prefswarning-warning": "Bạn chưa lưu những thay đổi tùy chọn đã thực hiện.\nNếu bạn rời khỏi trang này mà không bấm “$1”, các tùy chọn của bạn sẽ không được cập nhật.",
        "prefs-tabs-navigation-hint": "Mẹo: Bạn có thể bấm các phím mũi tên trái phải để luân chuyển qua các thẻ trong danh sách thẻ.",
-       "email-address-validity-valid": "Có vẻ hợp lệ",
-       "email-address-validity-invalid": "Yêu cầu địa chỉ hợp lệ!",
        "userrights": "Quản lý quyền thành viên",
        "userrights-lookup-user": "Quản lý nhóm thành viên",
        "userrights-user-editname": "Nhập tên thành viên:",
        "editusergroup": "Sửa nhóm thành viên",
-       "editinguser": "Thay đổi quyền hạn thành viên  của {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
+       "editinguser": "Thay đổi quyền hạn của người dùng <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Sửa nhóm thành viên",
        "saveusergroups": "Lưu nhóm thành viên",
        "userrights-groupsmember": "Thuộc nhóm:",
        "right-protect": "Thay đổi mức khóa và sửa trang khóa theo tầng",
        "right-editprotected": "Sửa trang khóa ở mức “{{int:protect-level-sysop}}”",
        "right-editsemiprotected": "Sửa trang khóa ở mức “{{int:protect-level-autoconfirmed}}”",
-       "right-editcontentmodel": "Sửa mô hình nội dung của trang",
+       "right-editcontentmodel": "Sửa kiểu nội dung của trang",
        "right-editinterface": "Sửa giao diện người dùng",
        "right-editusercssjs": "Sửa tập tin CSS và JS của người dùng khác",
        "right-editusercss": "Sửa tập tin CSS của người dùng khác",
        "right-passwordreset": "Xem các thư điện tử đặt lại mật khẩu",
        "right-managechangetags": "Tạo và xóa [[Special:Tags|thẻ]] từ cơ sở dữ liệu",
        "right-applychangetags": "Áp dụng [[Special:Tags|thẻ]], cùng với những thay đổi của một người",
-       "right-changetags": "Thêm và loại bỏ tùy ý các [[Special:Tags|thẻ]]  vào các phiên bản cá nhân và các mục đăng nhập",
+       "right-changetags": "Thêm và loại bỏ tùy ý các [[Special:Tags|thẻ]] vào các phiên bản riêng và các mục nhật trình",
        "newuserlogpage": "Nhật trình mở tài khoản",
        "newuserlogpagetext": "Đây là danh sách những tài khoản thành viên mở lên gần đây.",
        "rightslog": "Nhật trình cấp quyền thành viên",
        "action-viewmywatchlist": "xem danh sách theo dõi của mình",
        "action-viewmyprivateinfo": "xem thông tin cá nhân của bạn",
        "action-editmyprivateinfo": "sửa đổi thông tin cá nhân của bạn",
-       "action-editcontentmodel": "sửa mô hình nội dung của trang",
+       "action-editcontentmodel": "sửa kiểu nội dung của trang",
        "action-managechangetags": "tạo và xóa các thẻ từ cơ sở dữ liệu",
        "action-applychangetags": "áp dụng các thẻ cùng với những thay đổi của bạn",
-       "action-changetags": "thêm và loại bỏ các thẻ tùy ý trên các phiên bản cá nhân và các mục đăng nhập",
-       "nchanges": "$1 {{PLURAL:$1|thay đổi|thay đổi}}",
+       "action-changetags": "thêm và loại bỏ các thẻ tùy ý trên các phiên bản riêng và các mục nhật trình",
+       "nchanges": "$1 thay đổi",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sau lần truy cập vừa rồi}}",
        "enhancedrc-history": "lịch sử",
        "recentchanges": "Thay đổi gần đây",
        "rcshowhidemine": "$1 sửa đổi của tôi",
        "rcshowhidemine-show": "Hiện",
        "rcshowhidemine-hide": "Ẩn",
+       "rcshowhidecategorization": "$1 việc xếp thể loại",
+       "rcshowhidecategorization-show": "Hiện",
+       "rcshowhidecategorization-hide": "Ẩn",
        "rclinks": "Xem $1 sửa đổi gần đây nhất trong $2 ngày qua; $3.",
        "diff": "khác",
        "hist": "sử",
        "uploaddisabledtext": "Chức năng tải tập tin đã bị tắt.",
        "php-uploaddisabledtext": "Việc tải tập tin trong PHP đã bị tắt. Xin hãy kiểm tra lại thiết lập file_uploads.",
        "uploadscripted": "Tập tin này có chứa mã HTML hoặc kịch bản có thể khiến trình duyệt web thông dịch sai.",
-       "upload-scripted-pi-callback": "Không thể tải lên một file có chứa lệnh xử lý XML-stylesheet",
+       "upload-scripted-pi-callback": "Không thể tải lên một tập tin có chứa lệnh xử lý xml-stylesheet.",
        "uploaded-script-svg": "Tìm thấy phần tử “$1” có khả năng chạy kịch bản trong tập tin SVG được tải lên.",
        "uploaded-hostile-svg": "Tìm thấy CSS nguy hiểm trong phần tử style của tập tin SVG được tải lên.",
        "uploaded-event-handler-on-svg": "Không cho phép đặt thuộc tính xử lý sự kiện <code>$1=\"$2\"</code> trong tập tin SVG.",
        "uploaded-href-unsafe-target-svg": "Tìm thấy href đến đích nguy hiểm <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
        "uploaded-animate-svg": "Tìm thấy thẻ “animate” có thể thay đổi href qua thuộc tính “from” <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
        "uploaded-setting-event-handler-svg": "Đã ngăn cản việc đặt thuộc tính xử lý sự kiện khi tìm thấy <code>&lt;$1 $2=\"$3\"&gt;</code> trong tập tin SVG được tải lên.",
-       "uploaded-setting-href-svg": "Sử dụng tag \"set\" để thêm thuộc tính \"href\" tới thành phần mẹ bị khóa.",
+       "uploaded-setting-href-svg": "Cấm sử dụng thẻ “set” để thêm thuộc tính “href” vào phần tử mẹ.",
        "uploaded-wrong-setting-svg": "Đã ngăn cản việc sử dụng thẻ “set” để thêm đích bên ngoài/dữ liệu/kịch bản vào thuộc tính nào đó. Tìm thấy <code>&lt;set to=\"$1\"&gt;</code> trong tập tin SVG được tải lên.",
        "uploaded-setting-handler-svg": "Đã ngăn cản mã SVG đặt thuộc tính “handler” là từ xa/dữ liệu/kịch bản. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
        "uploaded-remote-url-svg": "Đã ngăn cản mã SVG đặt thuộc tính style nào đó là URL ngoài máy. Tìm thấy <code>$1=\"$2\"</code> trong tập tin SVG được tải lên.",
        "upload-options": "Tùy chọn tải lên",
        "watchthisupload": "Theo dõi tập tin này",
        "filewasdeleted": "Một tên với tên này đã được tải lên trước đã rồi sau đó bị xóa. Bạn nên kiểm tra lại $1 trước khi tải nó lên lại lần nữa.",
+       "filename-thumb-name": "Hình như đây là tên của một hình thu nhỏ được tự động tạo ra. Xin đừng tải lên những hình nhỏ lại vào wiki ban đầu. Nếu không phải, xin vui lòng sửa tên tập tin để rõ ràng hơn và dời tiền tố cỡ hình khỏi tên.",
        "filename-bad-prefix": "Tên cho tập tin mà bạn đang tải lên bắt đầu bằng '''“$1”''', đây không phải là dạng tên tiêu biểu có tính chất miêu tả do các máy chụp ảnh số tự động đặt. Xin hãy chọn một tên có tính chất miêu tả và gợi nhớ hơn cho tập tin của bạn.",
        "filename-prefix-blacklist": " #<!-- xin để nguyên hàng này --> <pre>\n# Cú pháp như sau:\n#   * Các ký tự từ dấu \"#\" trở đến cuối hàng là chú thích\n#   * Các dòng sau là các tiền tố do các máy ảnh số gán tự động cho tên tập tin\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # một số điện thoại di động\nIMG # tổng quát\nJD # Jenoptik\nMGP # Pentax\nPICT # khác\n #</pre> <!-- xin để nguyên hàng này -->",
        "upload-success-subj": "Đã tải xong",
        "foreign-structured-upload-form-label-own-work": "Đây là tác phẩm của chính tôi",
        "foreign-structured-upload-form-label-infoform-categories": "Thể loại",
        "foreign-structured-upload-form-label-infoform-date": "Ngày tháng",
+       "foreign-structured-upload-form-label-own-work-message-local": "Tôi xác nhận rằng tôi tải lên tập tin này tuân theo các điều khoản sử dụng và quy định giấy phép của {{SITENAME}}.",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "Nếu bạn không được phép tải lên tập tin này tuân theo quy định của {{SITENAME}}, xin vui lòng đóng hộp thoại này và thử tải lên bằng một phương pháp khác.",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "Bạn cũng có thể muốn sử dụng [[Special:Upload|trang tải lên mặc định]].",
        "foreign-structured-upload-form-label-own-work-message-default": "Tôi hiểu rằng tôi đang tải tập tin này lên một kho dùng chung. Tôi xác nhận rằng tôi làm việc này tuân theo các điều khoản sử dụng và quy định về giấy phép tại đấy.",
        "foreign-structured-upload-form-label-not-own-work-message-default": "Nếu bạn không có thể tải tập tin này lên mà tuân theo quy định của kho dùng chung, xin vui lòng đóng hộp thoại này và thử một cách khác.",
        "foreign-structured-upload-form-label-not-own-work-local-default": "Bạn có thể muốn thử [[Special:Upload|trang tải lên tại {{SITENAME}}]] nếu tập tin này có thể được tải lên đấy theo các quy định của họ.",
        "listfiles-delete": "xóa",
        "listfiles-summary": "Trang đặc biệt này liệt kê các tập tin được tải lên.",
        "listfiles_search_for": "Tìm kiếm theo tên tập tin:",
-       "listfiles-userdoesnotexist": "Tài khoản người dùng \"$1\" không được đăng ký.",
+       "listfiles-userdoesnotexist": "Tài khoản người dùng “$1” không được đăng ký.",
        "imgfile": "tập tin",
        "listfiles": "Danh sách tập tin",
        "listfiles_thumb": "Hình nhỏ",
        "withoutinterwiki-legend": "Tiền tố",
        "withoutinterwiki-submit": "Xem",
        "fewestrevisions": "Trang có ít sửa đổi nhất",
-       "nbytes": "$1 {{PLURAL:$1|byte|byte}}",
-       "ncategories": "$1 {{PLURAL:$1|thể loại|thể loại}}",
+       "nbytes": "$1 byte",
+       "ncategories": "$1 thể loại",
        "ninterwikis": "$1 liên kết liên wiki",
-       "nlinks": "$1 {{PLURAL:$1|liên kết|liên kết}}",
+       "nlinks": "$1 liên kết",
        "nmembers": "$1 trang",
        "nmemberschanged": "$1 → $2 trang",
        "nrevisions": "$1 phiên bản",
        "listusers-editsonly": "Chỉ hiện thành viên có tham gia sửa đổi",
        "listusers-creationsort": "Xếp theo ngày khởi tạo",
        "listusers-desc": "Sắp xếp thứ tự giảm dần",
-       "usereditcount": "$1 {{PLURAL:$1|sửa đổi|sửa đổi}}",
+       "usereditcount": "$1 sửa đổi",
        "usercreated": "{{GENDER:$3}}mở $1 lúc $2",
        "newpages": "Trang mới",
        "newpages-username": "Tên người dùng:",
        "listgrouprights-removegroup-self-all": "Có thể loại tài khoản của chính mình ra khỏi tất cả các nhóm",
        "listgrouprights-namespaceprotection-header": "Hạn chế không gian tên",
        "listgrouprights-namespaceprotection-namespace": "Không gian tên",
-       "listgrouprights-namespaceprotection-restrictedto": "Quyền cho phép người dùng chỉnh sửa",
+       "listgrouprights-namespaceprotection-restrictedto": "Quyền cho phép người dùng sửa đổi",
        "trackingcategories": "Thể loại phần mềm",
        "trackingcategories-summary": "Đây là danh sách các thể loại được phần mềm MediaWiki tự động xếp trang vào. Các tên thể loại được định rõ trong các thông điệp thuộc không gian tên {{ns:8}}.",
        "trackingcategories-msg": "Thể loại phần mềm",
        "emailuser-title-target": "{{GENDER:$1}}Gửi thư cho người dùng này",
        "emailuser-title-notarget": "Gửi thư cho người dùng",
        "emailpagetext": "{{GENDER:$1}}Mẫu dưới đây sẽ gửi một bức thư điện tử tới người dùng này.\nĐịa chỉ thư điện tử mà bạn đã cung cấp trong [[Special:Preferences|tùy chọn cá nhân của mình]] sẽ xuất hiện trong phần địa chỉ “Người gửi” của bức thư, do đó người nhận sẽ có thể trả lời trực tiếp cho bạn.",
-       "defemailsubject": "Thư của người dùng \"$1\" tại {{SITENAME}}",
+       "defemailsubject": "Thư của người dùng “$1” tại {{SITENAME}}",
        "usermaildisabled": "Chức năng gửi thư cho người dùng đã bị tắt.",
        "usermaildisabledtext": "Bạn không thể gửi thư điện tử cho những người dùng khác trên wiki này.",
        "noemailtitle": "Không có địa chỉ nhận thư",
        "wlheader-showupdated": "Các trang đã thay đổi kể từ lần cuối bạn xem chúng được in '''đậm'''",
        "wlnote": "Dưới đây là {{PLURAL:$1|thay đổi duy nhất|<strong>$1</strong> thay đổi gần nhất}} trong {{PLURAL:$2|giờ|<strong>$2</strong> giờ}} qua, tính tới $3 lúc $4.",
        "wlshowlast": "Hiển thị $1 giờ $2 ngày gần đây",
+       "watchlistall2": "tất cả",
+       "wlshowtime": "Thời gian để hiển thị:",
+       "wlshowhideminor": "sửa đổi nhỏ",
+       "wlshowhidebots": "bot",
+       "wlshowhideliu": "người dùng có tài khoản",
+       "wlshowhideanons": "người dùng vô danh",
+       "wlshowhidepatr": "sửa đổi đã tuần tra",
+       "wlshowhidemine": "sửa đổi của tôi",
        "watchlist-options": "Tùy chọn về danh sách theo dõi",
        "watching": "Đang theo dõi…",
        "unwatching": "Đang ngừng theo dõi…",
        "deletereasonotherlist": "Lý do khác",
        "deletereason-dropdown": "*Các lý do xóa phổ biến\n** Đăng tỉ thư rác\n** Phá hoại\n** Vi phạm bản quyền\n** Tác giả yêu cầu\n** Chuyển hướng sai",
        "delete-edit-reasonlist": "Sửa lý do xóa",
-       "delete-toobig": "Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.\nViệc xóa các trang như vậy bị hạn chế để ngăn ngừa phá hoại do vô ý cho {{SITENAME}}.",
-       "delete-warning-toobig": "Trang này có lịch sử sửa đổi lớn, đến hơn {{PLURAL:$1|lần|lần}} sửa đổi.\nViệc xóa các trang có thể làm tổn hại đến hoạt động của cơ sở dữ liệu {{SITENAME}};\nhãy cẩn trọng khi thực hiện.",
+       "delete-toobig": "Trang này có lịch sử sửa đổi lớn, đến hơn $1 lần sửa đổi.\nViệc xóa các trang như vậy bị hạn chế để ngăn ngừa phá hoại do vô ý cho {{SITENAME}}.",
+       "delete-warning-toobig": "Trang này có lịch sử sửa đổi lớn, đến hơn $1 lần sửa đổi.\nViệc xóa các trang có thể làm tổn hại đến hoạt động của cơ sở dữ liệu {{SITENAME}};\nhãy cẩn trọng khi thực hiện.",
        "deleteprotected": "Bạn không thể xóa trang này vì nó đã được khóa lại.",
        "deleting-backlinks-warning": "'''Cảnh báo:''' Có [[Special:WhatLinksHere/{{FULLPAGENAME}}|trang khác]] liên kết đến hoặc nhúng trang mà bạn sắp xóa.",
        "rollback": "Lùi tất cả sửa đổi",
        "changecontentmodel-model-label": "Kiểu nội dung mới",
        "changecontentmodel-reason-label": "Lý do:",
        "changecontentmodel-success-title": "Kiểu nội dung đã thay đổi",
-       "changecontentmodel-success-text": "Loại nội dung của [[:$1]] đã được thay đổi.",
+       "changecontentmodel-success-text": "Kiểu nội dung của [[:$1]] đã được thay đổi.",
        "changecontentmodel-cannot-convert": "Không thể chuyển đổi nội dung [[:$1]] thành nội dung dưới dạng $2.",
-       "changecontentmodel-nodirectediting": "Mô hình nội dung $1 không hỗ trợ sửa đổi trực tiếp",
-       "log-name-contentmodel": "Nhật trình thay đổi mô hình nội dung",
-       "log-description-contentmodel": "Sự kiện có liên quan đến mô hình nội dung của trang.",
-       "logentry-contentmodel-change": "$1 {{GENDER:$2}}đã thay đổi mô hình nội dung của trang $3 từ “$4” thành “$5”",
+       "changecontentmodel-nodirectediting": "Kiểu nội dung $1 không hỗ trợ sửa đổi trực tiếp",
+       "log-name-contentmodel": "Nhật trình thay đổi kiểu nội dung",
+       "log-description-contentmodel": "Sự kiện có liên quan đến kiểu nội dung của trang.",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2}}đã thay đổi kiểu nội dung của trang $3 từ “$4” thành “$5”",
        "logentry-contentmodel-change-revertlink": "lùi lại",
        "logentry-contentmodel-change-revert": "lùi lại",
        "protectlogpage": "Nhật trình khóa",
        "undeleteviewlink": "xem",
        "undeleteinvert": "Đảo sự lựa chọn",
        "undeletecomment": "Lý do:",
-       "undeletedrevisions": "$1 {{PLURAL:$1|bản|bản}} được phục hồi",
-       "undeletedrevisions-files": "$1 {{PLURAL:$1|bản|bản}} và $2 {{PLURAL:$2|tập tin|tập tin}} đã được phục hồi",
-       "undeletedfiles": "$1 {{PLURAL:$1|tập tin|tập tin}} đã được phục hồi",
+       "undeletedrevisions": "$1 phiên bản được phục hồi",
+       "undeletedrevisions-files": "$1 phiên bản và $2 tập tin đã được phục hồi",
+       "undeletedfiles": "$1 tập tin đã được phục hồi",
        "cannotundelete": "Phục hồi thất bại:\n$1",
        "undeletedpage": "'''$1 đã được khôi phục'''\n\nXem nhật trình xóa và phục hồi các trang gần đây tại [[Special:Log/delete|nhật trình xóa]].",
        "undelete-header": "Xem các trang bị xóa gần đây tại [[Special:Log/delete|nhật trình xóa]].",
        "contributions": "{{GENDER:$1}}Đóng góp của thành viên",
        "contributions-title": "Đóng góp của thành viên $1",
        "mycontris": "Đóng góp",
+       "anoncontribs": "Đóng góp",
        "contribsub2": "Của {{GENDER:$3}}$1 ($2)",
        "contributions-userdoesnotexist": "Chưa có tài khoản với tên “$1”.",
        "nocontribs": "Không tìm thấy thay đổi nào khớp với yêu cầu.",
        "movelogpage": "Nhật trình di chuyển",
        "movelogpagetext": "Dưới đây là danh sách các trang đã được di chuyển.",
        "movesubpage": "{{PLURAL:$1|Trang con|Các trang con}}",
-       "movesubpagetext": "Trang này có $1 {{PLURAL:$1|trang con|trang con}} như hiển thị dưới đây.",
+       "movesubpagetext": "Trang này có $1 trang con như hiển thị dưới đây.",
        "movenosubpage": "Trang này không có trang con.",
        "movereason": "Lý do:",
        "revertmove": "lùi lại",
-       "delete_and_move": "Xóa và đổi tên",
        "delete_and_move_text": "==Cần xóa==\n\nTrang với tên “[[:$1]]” đã tồn tại. Bạn có muốn xóa nó để dọn chỗ di chuyển tới tên này không?",
        "delete_and_move_confirm": "Xóa trang để đổi tên",
        "delete_and_move_reason": "Xóa để có chỗ đổi tên “[[$1]]”",
        "immobile-target-namespace-iw": "Không cho phép di chuyển trang đến một liên kết liên wiki.",
        "immobile-source-page": "Bạn không thể di chuyển trang này.",
        "immobile-target-page": "Không thể di chuyển đến tựa đề đích.",
-       "bad-target-model": "Trang đích sử dụng mô hình nội dung khác. Không thể chuyển đổi nội dung từ $1 đến $2.",
+       "bad-target-model": "Trang đích sử dụng kiểu nội dung khác. Không thể chuyển đổi nội dung từ $1 đến $2.",
        "imagenocrossnamespace": "Không thể di chuyển tập tin ra khỏi không gian tên Tập tin",
        "nonfile-cannot-move-to-file": "Không thể di chuyển những gì không phải là tập tin vào không gian tên Tập tin",
        "imagetypemismatch": "Phần mở rộng trong tên tập tin mới không hợp dạng của tập tin",
        "import-error-interwiki": "Trang “$1” không được nhập vì tên của nó được dành riêng cho liên kết ngoài (liên wiki).",
        "import-error-special": "Trang “$1” không được nhập vì nó thuộc về không gian tên đặc biệt không cho phép các trang không mặc định.",
        "import-error-invalid": "Trang “$1” không được nhập vì ứng với một tên tập tin không hợp lệ trên wiki này.",
-       "import-error-unserialize": "Không thể giải tuần tự hóa phiên bản $2 của trang “$1”. Tập tin kết xuất cho rằng phiên bản có mô hình nội dung $3 được tuần tự hóa theo định dạng $4.",
-       "import-error-bad-location": "Không thể lưu giữ phiên bản $2 với mô hình nội dung $3 vào “$1” trên wiki này vì trang này không hỗ trợ mô hình đó.",
+       "import-error-unserialize": "Không thể giải tuần tự hóa phiên bản $2 của trang “$1”. Tập tin kết xuất cho rằng phiên bản có kiểu nội dung $3 được tuần tự hóa theo định dạng $4.",
+       "import-error-bad-location": "Không thể lưu giữ phiên bản $2 với kiểu nội dung $3 vào “$1” trên wiki này vì trang này không hỗ trợ kiểu đó.",
        "import-options-wrong": "{{PLURAL:$2|Tùy chọn|Các tùy chọn}} có vấn đề: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Trang đích không hợp lệ.",
        "import-rootpage-nosubpage": "Không gian tên “$1” của trang gốc không cho phép các trang con.",
        "tooltip-pt-logout": "Đăng xuất",
        "tooltip-pt-createaccount": "Khuyến khích bạn mở tài khoản và đăng nhập; tuy nhiên, không phải bắt buộc phải có tài khoản",
        "tooltip-ca-talk": "Thảo luận về trang này",
-       "tooltip-ca-edit": "Chỉnh sửa trang này",
+       "tooltip-ca-edit": "Sửa đổi trang này",
        "tooltip-ca-addsection": "Bắt đầu một đề mục mới",
        "tooltip-ca-viewsource": "Trang này được khóa. Bạn có thể xem mã nguồn.",
        "tooltip-ca-history": "Các phiên bản cũ của trang này",
        "svg-long-error": "Tập tin SVG có lỗi: $1",
        "show-big-image": "Tập tin gốc",
        "show-big-image-preview": "Kích thước của hình xem trước: $1.",
+       "show-big-image-preview-differ": "Kích thước bản xem trước $3 này của tập tin $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Độ phân giải|Các độ phân giải}} khác: $1.",
        "show-big-image-size": "$1×$2 điểm ảnh",
        "file-info-gif-looped": "có lặp",
-       "file-info-gif-frames": "$1 {{PLURAL:$1|khung ảnh|khung ảnh}}",
+       "file-info-gif-frames": "$1 khung ảnh",
        "file-info-png-looped": "có lặp",
        "file-info-png-repeat": "chơi $1 lần",
        "file-info-png-frames": "$1 khung ảnh",
        "file-no-thumb-animation": "'''Lưu ý: Do hạn chế kỹ thuật, các hình nhỏ của tập tin này sẽ không phải là hình động.'''",
        "file-no-thumb-animation-gif": "'''Lưu ý: Do hạn chế kỹ thuật, các hình nhỏ của những hình GIF có độ phân giải cao, chẳng hạn tập tin này, sẽ không phải là hình động.'''",
        "newimages": "Trang trưng bày hình ảnh mới",
-       "imagelisttext": "Dưới đây là danh sách '''$1''' {{PLURAL:$1|tập tin|tập tin}} xếp theo $2.",
+       "imagelisttext": "Dưới đây là danh sách <strong>$1</strong> tập tin xếp theo $2.",
        "newimages-summary": "Trang đặc biệt này hiển thị các tập tin được tải lên gần đây nhất.",
        "newimages-legend": "Bộ lọc",
        "newimages-label": "Tên tập tin (hoặc một phần tên):",
        "exif-datetime": "Ngày giờ sửa tập tin",
        "exif-imagedescription": "Tiêu đề của hình",
        "exif-make": "Hãng máy ảnh",
-       "exif-model": "Kiểu máy ảnh",
-       "exif-software": "Phần mềm đã dùng",
+       "exif-model": "Dòng máy ảnh",
+       "exif-software": "Phần mềm sử dụng",
        "exif-artist": "Tác giả",
        "exif-copyright": "Bản quyền",
        "exif-exifversion": "Phiên bản Exif",
        "exif-subsectime": "Ngày giờ nhỏ hơn giây",
        "exif-subsectimeoriginal": "Ngày giờ gốc nhỏ hơn giây",
        "exif-subsectimedigitized": "Ngày giờ số hóa nhỏ hơn giây",
-       "exif-exposuretime": "Thời gian mở ống kính",
+       "exif-exposuretime": "Tốc độ màn trập",
        "exif-exposuretime-format": "$1 giây ($2)",
-       "exif-fnumber": "Số F",
+       "exif-fnumber": "Khẩu độ ống kính",
        "exif-fnumber-format": "f/$1",
-       "exif-exposureprogram": "Chương trình phơi sáng",
+       "exif-exposureprogram": "Chế độ phơi sáng",
        "exif-spectralsensitivity": "Độ nhạy quang phổ",
-       "exif-isospeedratings": "Điểm tốc độ ISO",
+       "exif-isospeedratings": "Độ nhạy sáng (tốc độ ISO)",
        "exif-shutterspeedvalue": "Tốc độ cửa chớp (APEX)",
        "exif-aperturevalue": "Độ mở ống kính (APEX)",
        "exif-brightnessvalue": "Độ sáng (APEX)",
        "exif-exposureprogram-2": "Chương trình chuẩn",
        "exif-exposureprogram-3": "Ưu tiên độ mở ống kính",
        "exif-exposureprogram-4": "Ưu tiên tốc độ sập",
-       "exif-exposureprogram-5": "Chương trình sáng tạo (thiên về chiều sâu)",
+       "exif-exposureprogram-5": "Chế độ sáng tạo (thiên về độ sâu trường ảnh)",
        "exif-exposureprogram-6": "Chương trình chụp (thien về tốc độ sập nhanh)",
        "exif-exposureprogram-7": "Chế độ chân dung (đối với ảnh chụp gần với phông nền ở ngoài tầm tiêu cự)",
        "exif-exposureprogram-8": "Chế độ phong cảnh (đối với ảnh phong cảnh với phông ở trong tiêu cự)",
        "exif-subjectdistance-value": "$1 mét",
        "exif-meteringmode-0": "Không biết",
        "exif-meteringmode-1": "Trung bình",
-       "exif-meteringmode-2": "Trung bình trọng lượng ở giữa",
+       "exif-meteringmode-2": "Đo sáng trung bình, tập trung vào vùng trung tâm",
        "exif-meteringmode-3": "Vết",
        "exif-meteringmode-4": "Đa vết",
        "exif-meteringmode-5": "Lấy mẫu",
        "confirmemail_success": "Thư điện tử của bạn đã được xác nhận. Bạn đã có thể đăng nhập và bắt đầu sử dụng wiki.",
        "confirmemail_loggedin": "Địa chỉ thư điện tử của bạn đã được xác nhận.",
        "confirmemail_subject": "Xác nhận thư điện tử tại {{SITENAME}}",
-       "confirmemail_body": "Ai đó, có thể là bạn, từ địa chỉ IP $1,\nđã mở tài khoản có tên \"$2\" với địa chỉ thư điện tử này tại {{SITENAME}}.\n\nĐể xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt tính năng thư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:\n\n$3\n\nNếu bạn *không* mở tài khoản, hãy nhấn vào liên kết này\nđể hủy thủ tục xác nhận địa chỉ thư điện tử:\n\n$5\n\nMã xác nhận này sẽ hết hạn vào $4.",
-       "confirmemail_body_changed": "Ai đó, có thể là bạn, từ địa chỉ IP $1, đã mở tài khoản có\ntên \"$2\" với địa chỉ thư điện tử này tại {{SITENAME}}.\n\nĐể xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt tính năng\nthư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:\n\n$3\n\nNếu tài khoản *không* phải là của bạn, hãy nhấn vào liên kết này để hủy thủ\ntục xác nhận địa chỉ thư điện tử:\n\n$5\n\nMã xác nhận này sẽ hết hạn vào $4.",
-       "confirmemail_body_set": "Ai đó, có thể là bạn, từ địa chỉ IP $1, đã đặt địa chỉ này là địa\nchỉ thư điện tử của tài khoản \"$2\" tại {{SITENAME}}.\n\nĐể xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt các tính năng\nthư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:\n\n$3\n\nNếu tài khoản *không* phải là của bạn, hãy nhấn vào liên kết này để hủy thủ tục\nxác nhận địa chỉ thư điện tử:\n\n$5\n\nMã xác nhận này sẽ hết hạn vào $4.",
+       "confirmemail_body": "Ai đó, có thể là bạn, từ địa chỉ IP $1,\nđã mở tài khoản có tên “$2” với địa chỉ thư điện tử này tại {{SITENAME}}.\n\nĐể xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt tính năng thư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:\n\n$3\n\nNếu bạn *không* mở tài khoản, hãy nhấn vào liên kết này\nđể hủy thủ tục xác nhận địa chỉ thư điện tử:\n\n$5\n\nMã xác nhận này sẽ hết hạn vào $4.",
+       "confirmemail_body_changed": "Ai đó, có thể là bạn, từ địa chỉ IP $1, đã mở tài khoản có\ntên “$2” với địa chỉ thư điện tử này tại {{SITENAME}}.\n\nĐể xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt tính năng\nthư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:\n\n$3\n\nNếu tài khoản *không* phải là của bạn, hãy nhấn vào liên kết này để hủy thủ\ntục xác nhận địa chỉ thư điện tử:\n\n$5\n\nMã xác nhận này sẽ hết hạn vào $4.",
+       "confirmemail_body_set": "Ai đó, có thể là bạn, từ địa chỉ IP $1, đã đặt địa chỉ này là địa\nchỉ thư điện tử của tài khoản “$2” tại {{SITENAME}}.\n\nĐể xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt các tính năng\nthư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:\n\n$3\n\nNếu tài khoản *không* phải là của bạn, hãy nhấn vào liên kết này để hủy thủ tục\nxác nhận địa chỉ thư điện tử:\n\n$5\n\nMã xác nhận này sẽ hết hạn vào $4.",
        "confirmemail_invalidated": "Đã hủy xác nhận địa chỉ thư điện tử",
        "invalidateemail": "Hủy xác nhận thư điện tử",
        "scarytranscludedisabled": "[Nhúng giữa các wiki bị tắt]",
        "bitrate-zetabits": "$1 Zbit/s",
        "bitrate-yottabits": "$1 Ybit/s",
        "lag-warn-normal": "Những thay đổi trong vòng $1 {{PLURAL:||}}giây trở lại đây có thể chưa xuất hiện trong danh sách.",
-       "lag-warn-high": "Do độ trễ của máy chủ cơ sở dữ liệu, những thay đổi trong vòng $1 {{PLURAL:$1||}}giây trở lại đây có thể chưa xuất hiện trong danh sách.",
+       "lag-warn-high": "Do độ trễ của máy chủ cơ sở dữ liệu, những thay đổi trong vòng $1 giây trở lại đây có thể chưa xuất hiện trong danh sách.",
        "watchlistedit-normal-title": "Sửa các trang tôi theo dõi",
        "watchlistedit-normal-legend": "Gỡ trang khỏi danh sách",
        "watchlistedit-normal-explain": "Tên các trang bạn theo dõi được hiển thị dưới đây. Để xóa một tên trang, chọn vào hộp kiểm bên cạnh nó, rồi nhấn “{{int:Watchlistedit-normal-submit}}”. Bạn cũng có thể [[Special:EditWatchlist/raw|sửa danh sách theo dạng thô]].",
        "watchlistedit-normal-submit": "Bỏ trang đã chọn",
-       "watchlistedit-normal-done": "$1 {{PLURAL:$1|tựa đề|tựa đề}} đã được xóa khỏi danh sách các trang theo dõi:",
+       "watchlistedit-normal-done": "$1 tựa đề đã được xóa khỏi danh sách các trang theo dõi:",
        "watchlistedit-raw-title": "Sửa danh sách theo dõi dạng thô",
        "watchlistedit-raw-legend": "Sửa danh sách theo dõi dạng thô",
        "watchlistedit-raw-explain": "Danh sách này có tên các trang bạn theo dõi để bạn sửa chữa bằng cách thêm vào hoặc bỏ ra khỏi danh sách; mỗi trang một hàng.\nKhi xong, nhấn nút ”{{int:Watchlistedit-raw-submit}}”.\nBạn cũng có thể [[Special:EditWatchlist|dùng trang sửa đổi bình thường]] để sửa danh sách này.",
        "watchlistedit-raw-titles": "Tên các trang:",
        "watchlistedit-raw-submit": "Cập nhật Trang tôi theo dõi",
        "watchlistedit-raw-done": "Danh sách các trang bạn theo dõi đã được cập nhật.",
-       "watchlistedit-raw-added": "$1 {{PLURAL:$1|tựa đề|tựa đề}} đã được thêm vào:",
-       "watchlistedit-raw-removed": "$1 {{PLURAL:$1|tựa đề|tựa đề}} đã được xóa khỏi danh sách:",
+       "watchlistedit-raw-added": "$1 tựa đề đã được thêm vào:",
+       "watchlistedit-raw-removed": "$1 tựa đề đã được xóa khỏi danh sách:",
        "watchlistedit-clear-title": "Đã xóa sạch danh sách theo dõi",
        "watchlistedit-clear-legend": "Xóa sạch danh sách theo dõi",
        "watchlistedit-clear-explain": "Tất cả các tiêu đề sẽ được xóa khỏi danh sách theo dõi của bạn.",
        "tags-delete": "xóa",
        "tags-activate": "Kích hoạt",
        "tags-deactivate": "vô hiệu",
-       "tags-hitcount": "$1 {{PLURAL:$1|thay đổi|thay đổi}}",
+       "tags-hitcount": "$1 thay đổi",
        "tags-manage-no-permission": "Bạn không có quyền hạn để quản lý các thẻ thay đổi.",
        "tags-create-heading": "Tạo một thẻ mới",
        "tags-create-explanation": "Theo mặc định, các thẻ mới được tạo ra sẽ được hợp lệ hóa để người dùng và các bot sử dụng.",
        "tags-create-no-name": "Bạn phải chỉ định một tên thẻ.",
        "tags-create-invalid-chars": "Tên thẻ không được chứa dấu phẩy (<code>,</code>) hoặc dấu gạch chéo lên (<code>/</code>).",
        "tags-create-invalid-title-chars": "Tên thẻ không được chứa các ký tự mà không thể được sử dụng trong tiêu đề của trang .",
-       "tags-create-already-exists": "Các từ khóa \"$1\" đã tồn tại.",
-       "tags-create-warnings-above": "{{PLURAL:$2| Cảnh báo}} sau gặp phải khi cố gắng để tạo ra các thẻ \"$1\":",
+       "tags-create-already-exists": "Các từ khóa “$1” đã tồn tại.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Cảnh báo|Các cảnh báo}} sau gặp phải khi cố gắng để tạo ra thẻ “$1”:",
        "tags-create-warnings-below": "Bạn có muốn tiếp tục tạo thẻ này?",
        "tags-delete-title": "Xóa thẻ",
-       "tags-delete-explanation-initial": "Bạn muốn xóa thẻ \"$1\" từ cơ sở dữ liệu.",
-       "tags-delete-explanation-in-use": "Nó sẽ được gỡ bỏ từ {{PLURAL:$2|$2 mục sửa đổi hoặc mục đăng nhập|tất cả $2 bản sửa đổi và/hoặc đăng nhập các mục}} mà nó hiện đang áp dụng.",
+       "tags-delete-explanation-initial": "Bạn muốn xóa thẻ “$1” từ cơ sở dữ liệu.",
+       "tags-delete-explanation-in-use": "Nó sẽ được gỡ bỏ từ {{PLURAL:$2|$2 phiên bản hoặc mục nhật trình|tất cả $2 phiên bản và/hoặc mục nhật trình}} mà nó hiện đang áp dụng.",
        "tags-delete-explanation-warning": "Hành động này là <strong>không thể đảo ngược</strong> và <strong>không thể hoàn tác</strong>, ngay cả bởi người quản trị cơ sở dữ liệu. Hãy chắc chắn đây là thẻ mà bạn muốn xóa.",
        "tags-delete-explanation-active": "<strong>Thẻ “$1” vẫn còn kích hoạt.</strong> Để ngừng áp dụng thẻ này trong tương lai, đi đến những nơi áp dụng thẻ và vô hiệu nó tại đấy.",
        "tags-delete-reason": "Lý do:",
        "tags-delete-submit": "Không thể phục hồi xóa thẻ này",
        "tags-delete-not-allowed": "Thẻ được định nghĩa bởi một mở rộng không thể bị xóa trừ khi mở rộng đặc biệt cho phép điều đó xảy ra.",
-       "tags-delete-not-found": "Thẻ \"$1\" không tồn tại.",
-       "tags-delete-too-many-uses": "Từ khóa \"$1\" được áp dụng cho hơn $2 {{PLURAL:$2|phiên bản}}, có nghĩa là nó không thể bị xóa.",
+       "tags-delete-not-found": "Thẻ “$1” không tồn tại.",
+       "tags-delete-too-many-uses": "Thẻ “$1” được áp dụng cho hơn $2 phiên bản, có nghĩa là nó không thể bị xóa.",
        "tags-delete-warnings-after-delete": "Thẻ “$1” bị xóa thành công, nhưng gặp {{PLURAL:$2|cảnh báo|các cảnh báo}} sau:",
        "tags-activate-title": "Kích hoạt thẻ",
-       "tags-activate-question": "Bạn sắp sửa kích hoạt thẻ \"$1\".",
+       "tags-activate-question": "Bạn sắp sửa kích hoạt thẻ “$1”.",
        "tags-activate-reason": "Lý do:",
-       "tags-activate-not-allowed": "Không thể kích hoạt thẻ \"$1\".",
-       "tags-activate-not-found": "Thẻ \"$1\" không tồn tại.",
+       "tags-activate-not-allowed": "Không thể kích hoạt thẻ “$1”.",
+       "tags-activate-not-found": "Thẻ “$1” không tồn tại.",
        "tags-activate-submit": "Kích hoạt",
        "tags-deactivate-title": "Vô hiệu thẻ",
-       "tags-deactivate-question": "Bạn sắp sửa vô hiệu thẻ \"$1\".",
+       "tags-deactivate-question": "Bạn sắp sửa vô hiệu thẻ “$1”.",
        "tags-deactivate-reason": "Lý do:",
-       "tags-deactivate-not-allowed": "Không thể vô hiệu hóa thẻ \"$1\".",
+       "tags-deactivate-not-allowed": "Không thể vô hiệu hóa thẻ “$1”.",
        "tags-deactivate-submit": "Vô hiệu",
        "tags-apply-no-permission": "Bạn không có quyền áp dụng các thẻ thay đổi cùng các thay đổi của bạn.",
-       "tags-apply-not-allowed-one": "Thẻ \"$1\" không được phép được áp dụng thủ công.",
-       "tags-apply-not-allowed-multi": "{{PLURAL:$2|tag is|Các thẻ đánh dấu}} sau không được phép áp dụng thủ công: $1",
-       "tags-update-no-permission": "Bạn không có quyền thêm hoặc loại bỏ các thẻ thay đổi từ phiên bản cá nhân hoặc mục đăng nhập.",
-       "tags-update-add-not-allowed-one": "Thẻ \"$1\" không được phép thêm vào thủ công.",
-       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|tag is|Các thẻ đánh dấu}} sau không được phép thêm thủ công: $1",
-       "tags-update-remove-not-allowed-one": "Thẻ đánh dấu \"$1\" không được phép loại bỏ.",
-       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|tag is|Các thẻ đánh dấu}} sau không được phép loại bỏ thủ công: $1",
-       "tags-edit-title": "Chỉnh sửa thẻ",
+       "tags-apply-not-allowed-one": "Thẻ “$1” không được phép được áp dụng thủ công.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Thẻ|Các thẻ}} sau không được phép áp dụng thủ công: $1",
+       "tags-update-no-permission": "Bạn không có quyền thêm hoặc loại bỏ các thẻ thay đổi từ phiên bản riêng hoặc mục nhật trình.",
+       "tags-update-add-not-allowed-one": "Thẻ “$1” không được phép thêm vào thủ công.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Thẻ|Các thẻ}} sau không được phép thêm thủ công: $1",
+       "tags-update-remove-not-allowed-one": "Thẻ đánh dấu “$1” không được phép loại bỏ.",
+       "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Thẻ|Các thẻ}} sau không được phép loại bỏ thủ công: $1",
+       "tags-edit-title": "Sửa đổi thẻ",
        "tags-edit-manage-link": "Quản lý thẻ",
        "tags-edit-revision-selected": "{{PLURAL:$1|Phiên bản|Các phiên bản}} [[:$2]] được chọn:",
        "tags-edit-logentry-selected": "{{PLURAL:$1|Nhật trình đã chọn|Các nhật trình đã chọn}}:",
-       "tags-edit-revision-legend": "Thêm và loại bỏ các thẻ đánh dấu từ {{PLURAL:$1|bản xem trước này|tất cả $1 bản xem trước}}",
+       "tags-edit-revision-legend": "Thêm và loại bỏ các thẻ từ {{PLURAL:$1|phiên bản này|tất cả $1 phiên bản}}",
        "tags-edit-logentry-legend": "Thêm và loại bỏ thẻ đánh dấu từ {{PLURAL:$1|mục nhật trình này|tất cả $1 mục nhật trình}}",
        "tags-edit-existing-tags": "Thẻ đã có:",
        "tags-edit-existing-tags-none": "''Không''",
        "tags-edit-chosen-placeholder": "Chọn vài thẻ",
        "tags-edit-chosen-no-results": "Không thẻ nào được tìm thấy trùng khớp",
        "tags-edit-reason": "Lý do:",
-       "tags-edit-revision-submit": "Áp dụng các thay đổi lên {{PLURAL:$1|bản xem trước này|$1 bản xem trước}}",
-       "tags-edit-logentry-submit": "Áp dụng các thay đổi đối với {{PLURAL:$1|this log entry|$1 log entries}}",
+       "tags-edit-revision-submit": "Áp dụng các thay đổi lên {{PLURAL:$1|phiên bản này|$1 phiên bản}}",
+       "tags-edit-logentry-submit": "Áp dụng các thay đổi đối với {{PLURAL:$1|mục nhật ký này|$1 mục nhật trình}}",
        "tags-edit-success": "Các thay đổi được áp dụng thành công.",
        "tags-edit-failure": "Các thay đổi không thể được áp dụng: $1",
        "tags-edit-nooldid-title": "Kiểm tra các mục tiêu không hợp lệ",
-       "tags-edit-nooldid-text": "Bạn chưa định rõ đối tượng xem trước để thực hiện chức năng này hoặc bản xem trước đã định không tồn tại.",
+       "tags-edit-nooldid-text": "Bạn chưa định rõ phiên bản đích để thực hiện tác vụ này, hoặc phiên bản đã định không tồn tại.",
        "tags-edit-none-selected": "Vui lòng chọn ít nhất một thẻ để thêm hoặc loại bỏ.",
        "comparepages": "So sánh trang",
        "compare-page1": "Trang 1",
        "htmlform-cloner-required": "Cần ít nhất một giá trị.",
        "htmlform-title-badnamespace": "[[:$1]] không phải trong không gian tên “{{ns:$2}}”.",
        "htmlform-title-not-creatable": "Không cho phép tạo ra trang với tên “$1”",
-       "htmlform-title-not-exists": "[[:$1]] không tồn tại.",
+       "htmlform-title-not-exists": "$1 không tồn tại.",
        "htmlform-user-not-exists": "<strong>$1</strong> không tồn tại.",
        "htmlform-user-not-valid": "<strong>$1</strong> không phải là tên người dùng.",
        "sqlite-has-fts": "$1 với sự hỗ trợ tìm kiếm toàn văn",
        "logentry-block-reblock": "$1 {{GENDER:$2}}đã cấu hình lại vụ cấm {{GENDER:$4}}$3 hết hạn $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2}}đã cấm {{GENDER:$4}}$3 hết hạn $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2}}đã cấu hình lại vụ cấm {{GENDER:$4}}$3 hết hạn $5 $6",
-       "logentry-import-upload": "$1 {{GENDER:$2|đã nhập}} $3 bằng cách tải lên tập tin",
-       "logentry-import-interwiki": "$1 {{GENDER:$2|đã nhập}} $3 từ một wiki khác",
+       "logentry-import-upload": "$1 {{GENDER:$2}}đã nhập $3 bằng cách tải lên tập tin",
+       "logentry-import-interwiki": "$1 {{GENDER:$2}}đã nhập $3 từ một wiki khác",
        "logentry-merge-merge": "$1 {{GENDER:$2}}đã hợp nhất $3 vào $4 (các phiên bản cho tới $5)",
        "logentry-move-move": "$1 {{GENDER:$2}}đã đổi $3 thành $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2}}đã đổi $3 thành $4 (đã tắt đổi hướng)",
        "logentry-upload-revert": "$1 {{GENDER:$2}}đã tải lên $3",
        "log-name-managetags": "Danh sách quản lý thẻ",
        "log-description-managetags": "Trang này có các công việc quản lý [[Special:Tags|thẻ]]. Nhật trình chỉ bao gồm các tác vụ do bảo quản viên thực hiện thủ công; phần mềm wiki có thể tạo hoặc xóa thẻ mà không ghi tác vụ vào nhật trình này.",
-       "logentry-managetags-create": "$1 {{GENDER:$2| đã tạo}} thẻ \"$4\"",
+       "logentry-managetags-create": "$1 {{GENDER:$2}}đã tạo thẻ “$4”",
        "logentry-managetags-delete": "$1 {{GENDER:$2}}đã xóa thẻ “$4” (và gỡ nó khỏi $5 phiên bản hoặc mục nhật trình)",
-       "logentry-managetags-activate": "$1 {{GENDER:$2|đã kích hoạt}} tag \"$4\" để sử dụng bởi người dùng và các bot",
-       "logentry-managetags-deactivate": "$1 {{GENDER:$2|đã vô hiệu}} thẻ \"$4\" để sử dụng bởi người dùng và các bot",
+       "logentry-managetags-activate": "$1 {{GENDER:$2}}đã kích hoạt thẻ “$4” để sử dụng bởi người dùng và các bot",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2}}đã vô hiệu thẻ “$4” để sử dụng bởi người dùng và các bot",
        "log-name-tag": "Nhật trình đánh dấu",
-       "log-description-tag": "Trang này hiện khi người dùng vừa thêm hoặc loại bỏ [[Special:Tags|thẻ đánh dấu]] từ các bản xem trước hoặc các mục nhật trình riêng biệt. Nhật trình không liệt kê các hoạt động đánh dấu khi chúng là một phần của hoạt động sửa đổi, xóa hoặc các hoạt động tương tự.",
-       "logentry-tag-update-add-revision": "$1 {{GENDER:$2|đã thêm}} {{PLURAL:$7|thẻ đánh dấu|thẻ đánh dấu}} $6 vào bản xem trước $4 của trang $3",
-       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2|đã thêm}} {{PLURAL:$7|thẻ đánh dấu|thẻ đánh dấu}} $6 vào mục nhật trình $5 của trang $3",
-       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2|đã loại bỏ}} {{PLURAL:$9|thẻ đánh dấu|thẻ đánh dấu}} $8 khỏi bản xem trước $4 của trang $3",
-       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2|đã loại bỏ}} {{PLURAL:$9|thẻ đánh dấu|thẻ đánh dấu}} $8 khỏi mục nhật trình $5 của trang $3",
-       "logentry-tag-update-revision": "$1 {{GENDER:$2|đã cập nhật}} thẻ đánh dấu của bản xem trước $4 của trang $3 ({{PLURAL:$7|đã thêm}} $6; {{PLURAL:$9|loại bỏ}} $8)",
-       "logentry-tag-update-logentry": "$1 {{GENDER:$2|đã cập nhật}} thẻ đánh dấu của mục nhật trình $5 của trang $3 ({{PLURAL:$7|đã thêm}} $6; {{PLURAL:$9|loại bỏ}} $8)",
+       "log-description-tag": "Trang này hiện khi người dùng vừa thêm hoặc loại bỏ [[Special:Tags|thẻ đánh dấu]] từ các phiên bản hoặc các mục nhật trình riêng biệt. Nhật trình không liệt kê các hoạt động đánh dấu khi chúng là một phần của hoạt động sửa đổi, xóa, hoặc các hoạt động tương tự.",
+       "logentry-tag-update-add-revision": "$1 {{GENDER:$2}}đã thêm {{PLURAL:$7|thẻ|các thẻ}} $6 vào phiên bản $4 của trang $3",
+       "logentry-tag-update-add-logentry": "$1 {{GENDER:$2}}đã thêm {{PLURAL:$7|thẻ|các thẻ}} $6 vào mục nhật trình $5 của trang $3",
+       "logentry-tag-update-remove-revision": "$1 {{GENDER:$2}}đã loại bỏ {{PLURAL:$9|thẻ|các thẻ}} $8 khỏi phiên bản $4 của trang $3",
+       "logentry-tag-update-remove-logentry": "$1 {{GENDER:$2}}đã loại bỏ {{PLURAL:$9|thẻ|các thẻ}} $8 khỏi mục nhật trình $5 của trang $3",
+       "logentry-tag-update-revision": "$1 {{GENDER:$2}}đã cập nhật thẻ của phiên bản $4 của trang $3 ({{PLURAL:$7}}đã thêm $6; {{PLURAL:$9}}loại bỏ $8)",
+       "logentry-tag-update-logentry": "$1 {{GENDER:$2}}đã cập nhật thẻ của mục nhật trình $5 của trang $3 ({{PLURAL:$7}}đã thêm $6; {{PLURAL:$9}}loại bỏ $8)",
        "rightsnone": "(không có)",
        "revdelete-summary": "tóm lược sửa đổi",
        "feedback-adding": "Đang thêm thông tin phản hồi vào trang…",
        "feedback-back": "Lùi",
        "feedback-bugcheck": "Tuyệt! Chỉ cần kiểm tra nó chưa được [$1 báo cáo trước đây].",
-       "feedback-bugnew": "Tôi đã kiểm tra – báo cáo lỗi mới",
-       "feedback-bugornote": "Nếu bạn đã sẵn sàng để miêu tả các chi tiết của một vấn đề kỹ thuật, xin vui lòng [$1 báo cáo lỗi].\nNếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới. Lời ghi của bạn sẽ được đăng lên trang “[$3 $2]”, cùng với tên người dùng và trình duyệt của bạn.",
+       "feedback-bugnew": "Tôi đã kiểm tra – báo lỗi mới",
+       "feedback-bugornote": "Nếu bạn đã sẵn sàng để miêu tả các chi tiết của một vấn đề kỹ thuật, xin vui lòng [$1 báo lỗi].\nNếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới. Lời ghi của bạn sẽ được đăng lên trang “[$3 $2]”, cùng với tên người dùng của bạn.",
        "feedback-cancel": "Hủy bỏ",
        "feedback-close": "Xong",
        "feedback-external-bug-report-button": "Tạo một công việc kỹ thuật",
        "mw-widgets-dateinput-no-date": "Không chọn ngày tháng",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD (năm-tháng-ngày)",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM (năm-tháng)",
-       "mw-widgets-titleinput-description-new-page": "Trang này chưa tồn tại",
-       "mw-widgets-titleinput-description-redirect": "Ä\90ổi hướng đến $1",
+       "mw-widgets-titleinput-description-new-page": "trang này chưa tồn tại",
+       "mw-widgets-titleinput-description-redirect": "Ä\91ổi hướng đến $1",
        "api-error-blacklisted": "Xin vui lòng chọn một tên khác miêu tả đầy đủ."
 }
index 4c3f099..3e055ed 100644 (file)
@@ -6,7 +6,8 @@
                        "Matma Rex",
                        "Midnight Gambler",
                        "Silvicola",
-                       "아라"
+                       "아라",
+                       "Zombie45764"
                ]
        },
        "tog-underline": "Linggs undârschdrajchn:",
        "nstab-template": "Foorlaach",
        "nstab-help": "Hilfs-sajdn",
        "nstab-category": "Ghadegorii",
+       "mainpage-nstab": "Haubdsajdn",
        "nosuchaction": "Des schded ned dsur auswaal",
        "nosuchactiontext": "Di agdsjoon, dii in dr URL schdäd, ged ned.\nFilajchd is di URL falsch gschriiwn, odr duu bisch âm falschn lingg nôôch.\nS'ghend aa â brogramiirfäälâr in dr sofdwäâr sâj, dii baj {{SITENAME}} lefd.",
        "nosuchspecialpage": "Dii sôndâr-sajdn gajd's ned",
        "viewpagelogs": "Logbicher fär dii sajdn dsajchn",
        "currentrev-asof": "Jedsiche wärsjoon, am $2 um $3 gmachd",
        "revisionasof": "Wärsjoon fom $2 um $3 Uur",
-       "revision-info": "Version vom $1 Uhr von $2",
+       "revision-info": "Version vom $1 Uhr von {{GENDER:$6|$2}}$7",
        "previousrevision": "← wärsjoon dâfoor",
        "nextrevision": "Nägsdnajâre wärsjoon →",
        "currentrevisionlink": "Geechnwärdiche wärsjoon",
        "unwatch": "Nimmä beoobachdn",
        "watchlist-details": "Duu häldsch {{PLURAL:$1|1 sajdn|$1 sajdn}} undâr beoobachdung.",
        "wlshowlast": "Dsajch dii ändrunga fo di ledsdn $1 schdundn, $2 dooch odär",
+       "watchlistall2": "ale",
        "watchlist-options": "Was un wii alles af Dajnâr beobachdungslisdn dsajchd wärn sol",
        "watching": "Ghumd undâr beoobachdung ...",
        "unwatching": "Beobachdn ajschränggn",
        "delete-toobig": "Dii sajdn had iiwâr $1 {{PLURAL:$1|Wersjoon|Wersjoon'n}}, des is fiil. Solche sajdn däf mr nima miir nigs diir nigs leschn, damid dii seewâr ned in d'gnii geen.",
        "delete-warning-toobig": "Dii sajdn had mäa wii $1 {{PLURAL:$1|wärsjoon|wärsjoon'n}}, des is fiil. Wem ma solchene leschd, ghan dr seerwâr fiir {{SITENAME}} ins scholbârn ghomn.",
        "rollback": "D'ändrungn riggängich machn",
-       "rollback_short": "riggängich machn",
        "rollbacklink": "Dsrigsedsn",
        "rollbackfailed": "Riggängich machn is ned gangn.",
        "protectlogpage": "Sajdnschbär-Logbuch",
        "namespace": "Nôômâraum:",
        "invert": "Auswaal umdreâ",
        "blanknamespace": "(Sajdn)",
-       "contributions": "Eichne Beidrääch",
+       "contributions": "{{GENDER:$1|Beidrääch}}",
        "contributions-title": "Bajdrääch fo „$1“",
        "mycontris": "Bajdreech",
        "contribsub2": "Von {{GENDER:$3|$1}} ($2)",
        "block-log-flags-nocreate": "Naj ôôdsmeldn is gschbärd.",
        "movepagetext": "Mid dem fôrmulaar hiir wärd â sajdn umdaafd, midsamd alle foorichâ wärsjoona. Dii sajdn mi'm aldn nôômâ blajbd, fârwajsd danôôch awâr bloos noch af dii naje.\nWajdârlajdunga af den aldn sajdn-nôômâ ghansd audomaadisch ghôrigiirn lasn. Wenns´d des ned magsd,  gug ob's ned dsu [[Special:DoubleRedirects|dobldâ]] odär [[Special:BrokenRedirects|ghabude wajdârlajdunga]] fiird. Du musd dâfiir sorgn, das dii aldn fârwajse aa ghinfdich wajdâr fungdsjoniirn!\n\nWen's scho â sajdn mid dem naja nôômâ gibd, wärd dii sajdn ned umdaafd wärn, es saj den, dii sajdn mi'm naja nôômâ wäär läär odär bloos â wajdârladung oone äldâre wärsjoon.\n\nDesdaweechn ghansd â beschdeende sajdn nii aus fârseen iwârschrajwn, und wen'D doch an feelâr gmachd hasd mi'm umdaafn, ghansd des dan aa oone wajdârs widâr righgengich machn.\n\n'''Achdung'''\nWen'D des mid'râr  beliibdn sajdn duusd, ghan soo a umdaaf-agdsion â hefdiche sach saj, neemlich mid folchng, di fär andâre rächd iwârraschnd sin. Magg's also bloos, wenn´sd genau waasd, was´d ôôrichsd.",
        "movepagetalktext": "Dii droôhängnde  disghusjoonssajdn wärd mid umdaafd, '''ausâr wen:'''\n*es scho undârm naja nôômâ â disghusjoonssajdn geem dääd\n*duu sechsd undn, das'd es hald ned wilsd.\nDan musd hald was drinschded fon hand riiwârschafn odr dsamschdudârn, wen de des dôô hôôm wilsd.\nSchrajb bide den '''naja'' nôômâ fo dâr sajdn undârals '''Dsiil'' nâj un '''nen dâ grund''' fir des umgedaaf drundâr.",
-       "movearticle": "Sajdn fârschiibm:",
        "newtitle": "Dôôhi:",
        "move-watch": "Alde un naje sajdn beoobachdn.",
        "movepagebtn": "Sajdn fârschiibm",
        "tooltip-pt-login": "S'is gän gseen, das mä´ si ôômäld, mâ däf awâr aa soo raj",
        "tooltip-pt-logout": "Abmeldn",
        "tooltip-ca-talk": "Disghusjoon dsur sajdn hiir",
-       "tooltip-ca-edit": "Dii sajdn ghansd beärbâdn.\nBidde gug's mi´m foorschau-gnobf ôô fôrm schbajchan",
+       "tooltip-ca-edit": "Dii sajdn ändârn",
        "tooltip-ca-addsection": "An naja abschnid ôôfanga",
        "tooltip-ca-viewsource": "Dii sajdn is gecha ändrunga gschbärd. Mär ghôô awâr den gwäl-dhägsd ôôschaua.",
        "tooltip-ca-history": "Friâre Fassunga fo där sajdn",
index 07dbf4b..e838938 100644 (file)
@@ -17,6 +17,7 @@
        "tog-hideminor": "Tago-a an mga gagmay nga pagliwat ha mga bag-o pa la nga mga kabag-ohan",
        "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-hidecategorization": "Igtago an kategorisasyon han mga pakli",
        "tog-extendwatchlist": "Padako-a an angay timan-an agod makita an tanan nga kabag-ohan, diri la an gibag-ohi",
        "tog-usenewrc": "Grupo nga mga pagbag-o kada pakli ha kababag-o pala ngan mga barantayon nga talaan",
        "tog-numberheadings": "Auto-nga-ihap nga mga pagngaran",
@@ -27,6 +28,7 @@
        "tog-watchdefault": "Igdugang in mga pakli ngan mga paypay nga akon ginliwat ngadto han akon angay timan-an",
        "tog-watchmoves": "Igdugang in mga pakli nga mga paypay nga akon ginpamalhin ngadto han akon angay timan-an",
        "tog-watchdeletion": "Igdugang in mga pakli ngan mga paypay nga akon ginpamara ngadto han akon angay timan-an",
+       "tog-watchrollback": "Igdugang an mga pakli ha akon watchlist an ak mga gin-rollback",
        "tog-minordefault": "Tigamni an ngatanan nga mga pagliwat nga gudti hin default",
        "tog-previewontop": "Igpakita in prevista o pan-ugsa-nga-lantaw ugsa hiton pagliwat nga kahon",
        "tog-previewonfirst": "Igpakita in prevista o pan-ugsa-nga-lantaw ha syahan nga pagliwat",
@@ -37,7 +39,7 @@
        "tog-shownumberswatching": "Igpakita an ihap han mga nangingita nga mga nagamit",
        "tog-oldsig": "Aada nga pirma:",
        "tog-fancysig": "Tratuha it pirma komo uska wikitext (nga waray automatiko nga sumpay)",
-       "tog-uselivepreview": "Gamita an buhi nga pahiuna nga pagawas (eksperimental)",
+       "tog-uselivepreview": "Gamita an buhi nga pahiuna nga pagawas",
        "tog-forceeditsummary": "Pasabti ako kun waray ko ginsurat ha dalikyat-nga-tigaman han pagliwat (edit summary)",
        "tog-watchlisthideown": "Tago-a an akon mga ginliwat tikang han angay timan-an",
        "tog-watchlisthidebots": "Tago-a an ginliwat hin bot tikang han angay timan-an",
@@ -45,6 +47,7 @@
        "tog-watchlisthideliu": "Igatag an mga ginliwat han naka log-in nga mga gumaramit tikang ha gintitiman-an",
        "tog-watchlisthideanons": "Igtago an mga ginliwat han mga waray nagpakilala nga nagamit tikang ha gintitiman-an",
        "tog-watchlisthidepatrolled": "Igatag an mga pinatrolya nga mga pagliwat tikang ha angay timan-an",
+       "tog-watchlisthidecategorization": "Igtago an kategorisasyon han mga pakli",
        "tog-ccmeonemails": "Padad-i ak hin mga kopya hin mga email nga akon ginpapadara ha iba nga mga gumaramit",
        "tog-diffonly": "Ayaw igpakita an sulod han pakli ha ilarom han pagkakaiba",
        "tog-showhiddencats": "Igpakita an mga tinago nga mga kaarangay",
        "errorpagetitle": "Sayop",
        "returnto": "Balik ngadto ha $1.",
        "tagline": "Tikang ha {{SITENAME}}",
-       "help": "Bulig",
+       "help": "Pabulig",
        "search": "Bilnga",
        "searchbutton": "Bilnga",
        "go": "Kadto-a",
        "imagepage": "Kitaa in pakli hin paypay",
        "mediawikipage": "Kitaa in pakli hin mensahe",
        "templatepage": "Kitaa in pakli hin plantilya",
-       "viewhelppage": "Kitaa in pakli hin bulig",
+       "viewhelppage": "Kitaa in pakli hin pabulig",
        "categorypage": "Kitaa in pakli hin kaarangay",
        "viewtalkpage": "Kitaa in hiruhimangraw",
        "otherlanguages": "Ha iba nga mga yinaknan",
        "pool-queuefull": "Puno an katitirok nga pila",
        "pool-errorunknown": "Waray kasabti nga kasaypanan",
        "pool-servererror": "An pool nga pag-ihap nga serbisyo diri yanâ magagamit ($)",
+       "poolcounter-usage-error": "Sayop ha paggamit: $1",
        "aboutsite": "Mahitungod han {{SITENAME}}",
        "aboutpage": "Project:Mahitungod han",
        "copyright": "An sulod mabiblingan ha ilarom han $1 antes may-ada pasabot.",
        "currentevents-url": "Project:Mga panhitabo",
        "disclaimers": "Mga Disclaimer",
        "disclaimerpage": "Project:Kasahiran nga disclaimer",
-       "edithelp": "Bulig hin pagliwat",
+       "edithelp": "Pagliwat hin pabulig",
+       "helppage-top-gethelp": "Pabulig",
        "mainpage": "Syahan nga Pakli",
        "mainpage-description": "Syahan nga Pakli",
        "policy-url": "Project:Polisiya",
        "hidetoc": "tago-a",
        "collapsible-collapse": "Rumpag",
        "collapsible-expand": "Latag",
+       "confirmable-confirm": "Sigurado {{GENDER:$1|ka}}?",
+       "confirmable-yes": "Oo",
+       "confirmable-no": "Diri",
        "thisisdeleted": "¿Kitaa o balika in $1?",
        "viewdeleted": "¿Kitaa in $1?",
        "restorelink": "{{PLURAL:$1|usa nga ginpara nga pagliwat|$1 ka ginpara nga mga pagliwat}}",
        "nstab-image": "Paypay",
        "nstab-mediawiki": "Mensahe",
        "nstab-template": "Batakan",
-       "nstab-help": "Pakli hin bulig",
+       "nstab-help": "Pakli hin pabulig",
        "nstab-category": "Kaarangay",
        "mainpage-nstab": "Panguna nga pakli",
        "nosuchaction": "Waray sugad nga buhat",
        "readonly_lag": "Ginlugaring pagtranka han database samtang an mga nasunod nga mga database nga server naglalanat pa han agaron",
        "internalerror": "Sayop ha sulod",
        "internalerror_info": "Sayop ha sulod: $1",
+       "internalerror-fatal-exception": "Fatal exception han klase \"$1\"",
        "filecopyerror": "Diri nakokopya an paypay nga ''$1'' ha ''$2''.",
        "filerenameerror": "Diri nababalyuan an ngaran han paypay nga ''$1'' ha ''$2''.",
        "filedeleteerror": "Diri napapara an paypay nga ''$1''.",
        "directorycreateerror": "Waray makahimo han direktoryo nga \"$1\".",
+       "directoryreadonlyerror": "Direktorya \"$1\" in pagbasa la.",
+       "directorynotreadableerror": "Direktorya \"$1\" in diri nababasahan.",
        "filenotfound": "Diri nabibilngan an paypay nga \"$1\"",
        "unexpected": "Diri ginlalauman nga balor: \"$1\"=\"$2\".",
        "formerror": "Sayop: Diri nasusumite an porma.",
        "no-null-revision": "Diri nakakahimo hin bag-o nga null rebisyon para han pakli \"$1\"",
        "badtitle": "Maraot nga titulo",
        "badtitletext": "An ginhangyo nga pakli diri puyde, waray sulod, o sayop nga nasumpay nga inter-pinunongan o inter-wiki nga titulo.\nBangin mayda usa o damo nga mga agi nga diri puyde magamit ha mga titulo.",
+       "title-invalid-empty": "An ginhangyo nga titulo han pakli in waray sulod o nagsusulod la han ngaran han uska ngaran-latáng.",
+       "title-invalid-utf8": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid UTF-8 sequence.",
+       "title-invalid-interwiki": "An ginhangyo nga titulo han pakli in nagsusulod hin uska interwiki nga sumpay nga diri magagamitan ha mga titulo.",
+       "title-invalid-talk-namespace": "An ginhangyo nga titulo hin pakli in natudlok ha hiruhimangraw nga pakli nga waray pa.",
+       "title-invalid-characters": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid characters: \"$1\".",
+       "title-invalid-relative": "An titulo in may-ada relative path. An mga relative page title (./, ../) in diri gintutugotan, tungod nga hira in agsob diri maaabtan kun gamiton han kanan gumaramit browser.",
+       "title-invalid-magic-tilde": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid magic tilde sequence (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "An ginhangyo nga titulo han pakli in halaba hin duro. Diri dapat mas halaba kaysa $1 {{PLURAL:$1|ka byte|ka mga byte}} ha UTF-8 encoding.",
+       "title-invalid-leading-colon": "An ginhangyo nga titulo han pakli in nagsusulod hin invalid colon ha katikangan.",
        "perfcached": "An nasunod nga data gin-cache ngan bangin diri amo an yana. In maximum hin {{PLURAL:$1|usa ka resulta|$1 ka mga resulta}} aada hit cache.",
        "perfcachedts": "An nasunod nga data gin-cache, ngan kataposan ginbag-o dida han $1. In maximum hin {{PLURAL:$4|usa ka resulta|$4 ka resulta}} aada hit cache.",
        "querypage-no-updates": "An mga kabag-ohan para hini nga pakli ha yana diri mahihimo.\nAn data dini diri mahihimo nga bag-o.",
        "viewsource": "Kitaa an ginkuhaan",
        "viewsource-title": "Kitaa an tinikangan para han $1",
        "actionthrottled": "Ginpahinay an ginbuhat",
-       "actionthrottledtext": "Komo uska pangontra ha spam, ikaw in ginlilimitaran paghimo hini nga pagbuhat hin sobra kadamo ha sulod hin gutiay nga oras, ngan ikaw in naglapos hini nga katubtuban.\nAlayon pagutro kahuman hin pipira ka mga minuto.",
+       "actionthrottledtext": "Komo uska pangontra han abuso, ikaw in ginlilimitahan paghimo hini nga pagbuhat hin sobra kadamo ha sulod hin gutiay nga panahon, ngan ikaw in naglapos hini nga katubtuban.\nAlayon pagutro kahuman hin pipira ka mga minuto.",
        "protectedpagetext": "Ginpanalipdan ini nga pakli basi mapugngan an pagliwat o iba pa nga mga maburuhat.",
-       "viewsourcetext": "Puydi ka kinmita ngan kinmopya han gintikangan han pakli:",
-       "viewyourtext": "Puydi nim makit-an ngan makopya an tinikangan han '''imo mga pagliwat''' ha dinhi nga pakli:",
+       "viewsourcetext": "Puydi ka kumita ngan kumopya han gintikangan han pakli.",
+       "viewyourtext": "Puydi nim makit-an ngan makopya an tinikangan <strong>imo mga pagliwat</strong> dinhi nga pakli:",
        "protectedinterface": "Ini nga pakli in nahatag hin teksto hit interface para han software han hin nga wiki, ngan in pinasasaliporan para makalikay hit pag-abuso.\nPara makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an kanan MediaWiki proyekto hin lokalisasyon.",
        "editinginterface": "'''Pahimatngon:''' Imo ginliliwat an pakli nga gingagamit paghatag hin interface text para han software.\nAn mga pagbag-o hini nga pakli in makakaapekto han user interface han iba nga mga gumaramit hini nga wiki.\nPara makadugang o makabag-o han mga paghubad para han ngatanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an lokalisasyon nga proyekto han MediaWiki.",
        "cascadeprotected": "Ini nga pakli in pinapasaliporan hin pagliwat tungod ini in nalalakip ha masunod nga {{PLURAL:$1|pakli, kun diin |mga pakli, kun diin}} pinapasaliporan hit \"cascading\" nga pagpili nga pinaandar:\n$2",
        "gotaccountlink": "Sakob",
        "userlogin-resetlink": "Nangalimot han imo detalye han pagsakob?",
        "userlogin-resetpassword-link": "¿Nangalimot ka han imo tigaman-pansulod?",
-       "userlogin-helplink2": "Búlig hin pagsakob",
+       "userlogin-helplink2": "Pabúlig hin pagsakob",
        "userlogin-loggedin": "Nakalog-in kana komo hi {{GENDER:$1|$1}}.\nGamiti an porma ha ubos para makalog-in komo iba nga gumaramit.",
        "userlogin-createanother": "Paghimo hin iba nga akawnt",
        "createacct-emailrequired": "Email address",
        "createaccountreason": "Rason:",
        "createacct-reason": "Rason",
        "createacct-reason-ph": "Kay ano nahimo ka hin usa pa nga akawnt",
-       "createacct-captcha": "Pagkita han seguridad",
-       "createacct-imgcaptcha-ph": "Igbutang an sinurat nga nakikita mo ha igbaw",
        "createacct-submit": "Ighimo an im akawnt",
-       "createacct-another-submit": "Paghimo hin lain nga akant",
+       "createacct-another-submit": "Paghimo hin account",
        "createacct-benefit-heading": "{{SITENAME}} in ginhimo hin tawo nga sugad ha imo.",
        "createacct-benefit-body1": "{{PLURAL:$1|pagliwat|mga pagliwat}}",
        "createacct-benefit-body2": "{{PLURAL:$1|ka pakli|ka mga pakli}}",
        "createacct-benefit-body3": "bag-o pala nga {{PLURAL:$1|mag-aramot|mga mag-aramot}}",
        "badretype": "Diri naangay an mga tigaman-pagsulod nga im ginbutang",
+       "usernameinprogress": "An paghimo hin account para hinin nga ngaran hit gumaramit in ginpoproseso na. Alayon paghulat.",
        "userexists": "An agnay hiton gumaramit nga im ginbutang in gingamit na.\nAlayon pagpili hin lain nga ngaran.",
        "loginerror": "Sayop hin pagsakob",
        "createacct-error": "Pakyas an paghimo han akawnt",
        "wrongpassword": "Sayop nga tigaman-pagsulod an nahibutang.\nAlayon pagutro pagbutang.",
        "wrongpasswordempty": "An tigaman-pagsulod nga ginbutang in waray sulod.\nAlayon pagutro pagbutang.",
        "passwordtooshort": "An tigaman-pagsulod dapat diri maubos hit {{PLURAL:$1|1 nga agi|$1 nga agi}}.",
+       "passwordtoolong": "It mga password in diri puydi mas huruhilaba hin {{PLURAL:$1|1 ka karakter|$1 ka mga karakter}}.",
        "password-name-match": "An imo tigaman-pagsulod in kinahanglan iba ha imo agnay-hiton-gumaramit.",
        "password-login-forbidden": "An paggamit hini nga agnay-hit-gumaramit ngan tigaman-pagsulod in diri gintutugotan.",
        "mailmypassword": "Ig-reset an tigaman-pagsulod",
        "passwordreset-emailsent": "Ginpadangat an password reset email.",
        "passwordreset-emailsent-capture": "Ginpadangat an password reset email, nga ginpakita ha ubos.",
        "passwordreset-emailerror-capture": "Ginhimo an password reset email, kun diin nakikita ha ubos, pero pakyas an pagpadara ha  {{GENDER:$2|gumaramit}}: $1",
-       "changeemail": "Igliwan an e-mail address",
+       "changeemail": "Igliwat o igtanggal an e-mail address",
        "changeemail-header": "Igliwan an e-mail address akawnt",
+       "changeemail-passwordrequired": "Kinahanglan nim igbutang an imo password para igkompirma inin nga pagbag-o.",
        "changeemail-no-info": "Kinahanglanon mo mag-log-in para ka direkta makasakob hini nga pakli.",
        "changeemail-oldemail": "Yana nga e-mail address:",
        "changeemail-newemail": "Bag-o nga e-mail address:",
        "log-fulllog": "Kitaa an bug-os nga taramdan",
        "edit-conflict": "Diri pagkakauroyon han pagliwat.",
        "edit-no-change": "Ginpabay-an an im pagliwat, mahitungod nga waray pagbalyo nga nabuhat ha nakasurat.",
+       "postedit-confirmation-created": "Nahimo an pakli.",
        "postedit-confirmation-saved": "Natipig an imo ginliwat.",
        "edit-already-exists": "Diri nakakahimo hin bag-o nga pakli.\nAada na ito.",
        "defaultmessagetext": "Aada-nga-daan nga teksto han mensahe",
        "compareselectedversions": "Igkumpara an mga pinili nga pagbabag-o",
        "editundo": "Igpawara an ginbuhat",
        "diff-empty": "(Waray pagkakaiba)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Usa nga intermediate revision|$1 mga intermediate revision}} han pareho nga gumaramit nga waray ginpakita)",
        "diff-multi-manyusers": "({{PLURAL:$1|Uska sapit-nahiuna nga rebisyon|$1 nga mga sapit-nanhiuna nga rebisyon}} nga may labaw nga $2 {{PLURAL:$2|gumaramit|mga gumaramit}} in diri ginpapakita)",
        "searchresults": "Mga nabilingan han pagbiling",
        "searchresults-title": "Mga nabilngan han pagbiling para han \"$1\"",
        "search-relatedarticle": "kasumapy",
        "searchrelated": "kadugtong",
        "searchall": "ngatanan",
+       "search-showingresults": "{{PLURAL:$4|Resulta <strong>$1</strong> han <strong>$3</strong>|Mga resulta <strong>$1 - $2</strong> han <strong>$3</strong>}}",
        "search-nonefound": "Waray resulta an nakakabaton han pakiana.",
        "powersearch-legend": "Abansado nga pagbiling",
        "powersearch-ns": "Pamiling ha mga ngaran-lat'ang:",
        "recentchanges-label-unpatrolled": "Ini nga pagliwat in diri pa nakapatrol",
        "recentchanges-label-plusminus": "An kadako han pakli in nabag-o hin ini nga numero nga mga byte",
        "recentchanges-legend-heading": "'''Leyenda:'''",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (kitaa gihapon [[Special:NewPages|talaan han mga bag-o nga pakli]])",
        "rcnotefrom": "An ha ubos in mga pagbabag-o tikang han <strong>$2</strong> (kutob ngadto ha <strong>$1</strong> nga ginpakita).",
        "rclistfrom": "Pakit-a an mga ginbag-ohan tikang han $3 $2",
        "rcshowhideminor": "$1 gudti nga mga pagliwat",
        "upload-file-error": "Sayop ha sulod",
        "upload-misc-error": "Waray kasasabti nga sayop hin pagkarga-paigbaw",
        "upload-http-error": "Mayda nahitabo nga sayop hin HTTP: $1",
+       "upload-dialog-button-cancel": "Pasagda",
+       "upload-dialog-button-done": "Tima na",
+       "upload-dialog-button-save": "Igtipig",
+       "upload-dialog-button-upload": "Upload",
+       "upload-form-label-select-file": "Pagpili hin file",
+       "upload-form-label-infoform-title": "Mga detalye",
+       "upload-form-label-infoform-name": "Ngaran",
+       "upload-form-label-usage-title": "Paggamit",
+       "upload-form-label-usage-filename": "Ngaran han file",
+       "foreign-structured-upload-form-label-own-work": "Buhat ko ini",
+       "foreign-structured-upload-form-label-infoform-categories": "Mga kategorya",
+       "foreign-structured-upload-form-label-infoform-date": "Petsa",
        "backend-fail-notexists": "Waray ngada an paypay nga $1.",
        "backend-fail-delete": "Diri nakakapara han paypay nga \"$1\".",
        "backend-fail-alreadyexists": "May-ada na paypay nga \"$1\".",
        "notvisiblerev": "An urhi nga pagliwat han iba nga gumaramit in ginpara",
        "watchlist-details": "{{PLURAL:$1|$1 nga pakli|$1 nga mga pakli}} nga aada ha imo talaan nga binabantayan, diri bulag nga paglakip han mga hiruhimangraw-nga-pakli.",
        "wlshowlast": "Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw",
+       "watchlistall2": "ngatanan",
        "watchlist-options": "Mga pirilian han talaan han binabantayan",
        "watching": "Ginbabantay...",
        "unwatching": "Diri na ginbabantay...",
        "undelete-show-file-submit": "Oo",
        "namespace": "Ngaran-lat'ang",
        "invert": "Baliskara an pirilion",
+       "tooltip-invert": "Ig-check inin nga kahon para igtago an mga pagbag-o han mga pakli ha sulod han pipira nga ngaran-latáng (ngan an may pagkahisumpay nga ngaran-latáng kun gin-check)",
        "namespace_association": "Kasumpay nga mga ngaran-lat'ang",
+       "tooltip-namespace_association": "Igcheck inin nga kahon para liwat iglakip an hiruhimangraw o himangrawon nga ngaran-latáng nga may pagkahisumpay ha pinili nga ngaran-lat'ang",
        "blanknamespace": "(Panguna)",
        "contributions": "Mga ámot ni {{GENDER:$1|User}}",
        "contributions-title": "Mga amot han gumaramit para ha $1",
        "tooltip-ca-nstab-image": "Kitaa an pakli han fayl",
        "tooltip-ca-nstab-mediawiki": "Kitaa an mensahe han sistema",
        "tooltip-ca-nstab-template": "Kitaa an plantilya",
-       "tooltip-ca-nstab-help": "Kitaa an pakli hin bulig",
+       "tooltip-ca-nstab-help": "Kitaa an pakli han pabulig",
        "tooltip-ca-nstab-category": "Kitaa an pakli hin kaarangay",
        "tooltip-minoredit": "Tigamni ini nga gamay nga pagliwat",
        "tooltip-save": "Ig-seyb an imo mga pagbabag-o",
index 80de25e..288734a 100644 (file)
        "editfont-monospace": "Dayoob mbind genn dig-digal",
        "editfont-sansserif": "Dayoob mbind bu amul-dig",
        "editfont-serif": "Dayoob mbind bu am-dig",
-       "sunday": "dibéer",
-       "monday": "altine",
-       "tuesday": "talaata",
+       "sunday": "Dibéer",
+       "monday": "Altine",
+       "tuesday": "Talaata",
        "wednesday": "àllarba",
        "thursday": "alxamis",
-       "friday": "àjjuma",
-       "saturday": "gaawu",
+       "friday": "Ã\80jjuma",
+       "saturday": "Gaawu",
        "sun": "dib",
        "mon": "alt",
-       "tue": "tal",
+       "tue": "Tal",
        "wed": "àll",
        "thu": "alx",
        "fri": "àjj",
        "sat": "gaa",
-       "january": "Semwiyee",
+       "january": "Samwiyee",
        "february": "Fewriyee",
        "march": "Maars",
        "april": "Awril",
@@ -79,7 +79,7 @@
        "september": "Sattumbar",
        "october": "Oktoobar",
        "november": "Nowembar",
-       "december": "Deesàmbar",
+       "december": "Samwiye",
        "january-gen": "Samwie",
        "february-gen": "Fewirie",
        "march-gen": "Maars",
        "actions": "Jëf",
        "namespaces": "Barabu tur",
        "variants": "Wuute",
-       "navigation-heading": "Njëlul joowiin",
+       "navigation-heading": "Njëlu joowiin",
        "errorpagetitle": "Njuumte",
        "returnto": "Dellu ci wii xët $1.",
        "tagline": "Jóge  {{SITENAME}}.",
        "unprotectthispage": "Aaradil wii xët",
        "newpage": "Xët wu bees",
        "talkpage": "Xëtu waxtaanuwaay",
-       "talkpagelinktext": "Diisoo",
+       "talkpagelinktext": "Waxtaan",
        "specialpage": "Xëtu jagleel",
        "personaltools": "Samay jumtukaay",
        "articlepage": "Gis jukki bi",
        "talk": "Waxtaan",
-       "views": "Xool yo",
-       "toolbox": "Boyotu jumtukaay yi",
+       "views": "Wone yi",
+       "toolbox": "Boyotu jumtukaay",
        "userpage": "Xëtu jëfandikukat",
        "projectpage": "Wone xëtu sémb wi",
        "imagepage": "Wone xëtu dencukaay bi",
        "redirectedfrom": "(Yoonalaat gu jóge $1)",
        "redirectpagesub": "Xëtu yoonalaat",
        "redirectto": "Jëmalewaat:",
-       "lastmodifiedat": "Coppite bu mujj bu xët wii $1 ci $2.<br />",
+       "lastmodifiedat": "Coppite gu mujj gu xët wii $1 ci $2.<br />",
        "viewcount": "Xët wii nemmeeku nañ ko {{PLURAL:$1|$1 yoon|$1 yoon}}.",
        "protectedpage": "Xët wees aar",
-       "jumpto": "Dem :",
+       "jumpto": "Dem:",
        "jumptonavigation": "Joowiin",
        "jumptosearch": "Seet",
        "view-pool-error": "jéggalu, joxekaay yi dañoo xat nii-nii.\nJëfandikukat yiy jéem a ubbi xët wii dañoo bari.\nTaaxiirlul ba ci kanam nga jéemaat.\n\n$1",
        "aboutpage": "Project:Ci mbiri",
        "copyright": "Ëmbit laa ngi  jàppandi ci $1.",
        "copyrightpage": "{{ns:project}}:Copyright",
-       "currentevents": "Luy xew",
-       "currentevents-url": "Project:Luy xew",
+       "currentevents": "Liy xew",
+       "currentevents-url": "Project:Liy xew",
        "disclaimers": "Ay aartu",
        "disclaimerpage": "Project:Aartu yu daj",
        "edithelp": "Ndimbal",
        "editlink": "soppi",
        "viewsourcelink": "xool gongikuwaayam",
        "editsectionhint": "Soppi bii xaaj : $1",
-       "toc": "Tëraliin",
+       "toc": "Ëmbiit",
        "showtoc": "Wone",
        "hidetoc": "Nëbb",
        "thisisdeleted": "Da ngaa bëgg a wone walla delloowaat $1 ?",
        "createacct-emailoptional": "Màkkaanu m-bataaxal (mu-neex-la)",
        "createacct-email-ph": "Duggalal sa màkkaanu m-bataaxal",
        "createaccountmail": "Jaare ko ci m-bataaxal",
-       "createacct-captcha": "Caytug kaaraange",
-       "createacct-imgcaptcha-ph": "Duggalal mbind  miy toftal mi ngay gis",
        "createacct-submit": "Sos sa sàq",
        "createacct-benefit-heading": "{{SITENAME}} ñu mel ni yaw a koy toppatoo.",
        "createacct-benefit-body1": "{{PLURAL:$1|Coppite}}",
        "templatesused": "{{PLURAL:$1| Royuwaay bi| Royuwaay yi}} nekk ci wii xët :",
        "templatesusedpreview": "{{PLURAL:$1| Royuwaay  bi|Royuwaay yi}} nekk ci gii wonendi :",
        "templatesusedsection": "Royuwaay yi ne ci bii xaaj:",
-       "template-protected": "(aar)",
+       "template-protected": "(aarees)",
        "template-semiprotected": "(aar-diggu)",
        "hiddencategories": "{{PLURAL:$1|wàll bu nëbbu bu|wàll yu nëbbu yu }} xët wii bokk :",
        "nocreatetext": "Jëfandikukat yi bindu rekk a man a sosi xët ci {{SITENAME}}. Man nga dellu ginnaaw walla soppi aw xët wu am ba noppi, [[Special:UserLogin|duggu walla sos am sàq]].",
        "rcshowhidemine-hide": "Nëbb",
        "rclinks": "Wone $1 coppite yi mujj ci $2  fan yi mujj <br />$3.",
        "diff": "wuute",
-       "hist": "Jaar",
+       "hist": "jaar",
        "hide": "Nëbb",
        "show": "Wone",
        "minoreditletter": "m",
        "filehist-current": "teew",
        "filehist-datetime": "Taariix ak Waxtu",
        "filehist-thumb": "Tuutal",
-       "filehist-thumbtext": "Tuutal gu  sumb bu $1",
+       "filehist-thumbtext": "Tuutal gu sumb bu $1",
        "filehist-user": "Jëfandikukat",
        "filehist-dimensions": "Dayoo",
        "filehist-filesize": "Dayoo ŋara wi",
        "tooltip-pt-preferences": "Say tànneef",
        "tooltip-pt-watchlist": "Limu xët yi ngay topp",
        "tooltip-pt-mycontris": "Limu say cëru",
-       "tooltip-pt-login": "Woo nan la ngir nga xammeku, waaye doonul lu manuta ñakk.",
+       "tooltip-pt-login": "Woo nan la ngir nga xammeku, waaye doonul lu manul-ñàkk.",
        "tooltip-pt-logout": "Génn",
        "tooltip-pt-createaccount": "Dees na la digal nga bindu te dugg, donte doonul lu manul-ñàkk",
        "tooltip-ca-talk": "Waxtaan yi ñeel xët wii",
        "tooltip-ca-move": "Tuddewaatal xët wii",
        "tooltip-ca-watch": "Yokk xët wii ci sa limu toppte",
        "tooltip-ca-unwatch": "Jële xët wii ci sa limu toppte",
-       "tooltip-search": "Seet ci biir {{SITENAME}}",
+       "tooltip-search": "Seet ci {{SITENAME}}",
        "tooltip-search-go": "Dem ci xët wi tudd ni nga wax, su dee am na.",
-       "tooltip-search-fulltext": "Seet xët yi ëmb kàddu gi",
+       "tooltip-search-fulltext": "Seet mbind mi ci biir xët yi",
        "tooltip-p-logo": "Xët wu njëkk",
-       "tooltip-n-mainpage": "Nemmeeku xëtu njëlbéen",
-       "tooltip-n-mainpage-description": "Nemmeku xët wu njëkk wi",
-       "tooltip-n-portal": "Ngir xam dara ci mbiri sémb bi, noo ci mana jàppe",
+       "tooltip-n-mainpage": "Nemmeeku xët wu njëkk wi",
+       "tooltip-n-mainpage-description": "Nemmeeku xët wu njëkk wi",
+       "tooltip-n-portal": "Ngir xam dara ci mbiri sémb bi, noo ci man a jàppe",
        "tooltip-n-currentevents": "Xibaar ci xew-xew yu teew yi",
        "tooltip-n-recentchanges": "Limu coppite yi mujj ci wiki bi",
        "tooltip-n-randompage": "Wone aw xët ci mbetteel",
-       "tooltip-n-help": "Xëtu ndimbal wi",
-       "tooltip-t-whatlinkshere": "limu xët yi ci wiki bi yi lëkkalook wii",
+       "tooltip-n-help": "Xëtu ndimbal",
+       "tooltip-t-whatlinkshere": "Limu xët yi ci wiki bi te lëkkalook wii",
        "tooltip-t-recentchangeslinked": "Limu coppite yu mujj yu xët yi lëkkalook wii",
        "tooltip-feed-rss": "Walug RSS ngir wii xët",
        "tooltip-feed-atom": "Walug Atom ngir wii xët",
        "tooltip-t-emailuser": "Yónne ab m-bataaxal bii jëfandikukat",
        "tooltip-t-upload": "Yeb ay dencukaay",
        "tooltip-t-specialpages": "Limu xëti jagleel yépp",
-       "tooltip-t-print": "Sumb bu móolu bu xët wii",
+       "tooltip-t-print": "Sumb bu móolu bu wii xët",
        "tooltip-t-permalink": "Lëkkalekaay bu sax buy jëme ci bii sumb bu xët wi",
        "tooltip-ca-nstab-main": "Xool jukki bi",
        "tooltip-ca-nstab-user": "Xool xëtu jëfandikukat wi",
        "tooltip-ca-nstab-media": "Xool xëtu dencukaay wi",
-       "tooltip-ca-nstab-special": "Lii aw xëtu jagleel la, kenn manu kaa soppi.",
+       "tooltip-ca-nstab-special": "Lii aw xëtu jagleel la, kenn manu koo soppi.",
        "tooltip-ca-nstab-project": "Xool xëtu sémb wi",
        "tooltip-ca-nstab-image": "Xool xëtu dencukaay wi",
        "tooltip-ca-nstab-mediawiki": "Xool bataaxalu noste bi",
        "tooltip-watch": "Yokk xët wii ci sa limu toppte",
        "tooltip-recreate": "Sosaat xët wi donte dañ kaa faroon",
        "tooltip-upload": "Door yeb gi",
-       "tooltip-rollback": "\"Delloowaat\" dafay neenal coppitey cërukat bi mujj ci xët wii ci benn cuq.",
+       "tooltip-rollback": "\"Delloowaat\" dafay neenal coppitey cërukat bi mujj ci xët wii ci benn kilig.",
        "tooltip-undo": "\"Neenal\" dafay far coppite yi te ubbi palanteeru coppite bi ci anamug wonendi.\nDafay tax nga man a bind ngirte li ci boyotu tënk bi.",
        "tooltip-summary": "Def ci ab tënk",
        "common.css": "/* CSS yiñ def fii dañuy am ay njeexit ci col yépp  */",
index 4ec3136..b79e7ee 100644 (file)
                        "Fitoschido",
                        "Poiuyt",
                        "反共复国",
-                       "姑苏小恐龙"
+                       "姑苏小恐龙",
+                       "飞舞回堂前"
                ]
        },
        "tog-underline": "鏈接下橫線:",
        "tog-hideminor": "此垡變化裏囥脫小編",
        "tog-hidepatrolled": "此垡變化裏囥脫巡脫編",
        "tog-newpageshidepatrolled": "新頁表裏囥脫巡脫頁",
+       "tog-hidecategorization": "囥脱对页面个分类",
        "tog-extendwatchlist": "擴大關注表,顯示全部變化,弗單清此垡個",
        "tog-usenewrc": "使用折叠版个近段辰光个改动搭关注表",
        "tog-numberheadings": "標題自動編號",
@@ -56,7 +58,8 @@
        "tog-watchlisthideliu": "關注表裏囥脫已登用戶所編",
        "tog-watchlisthideanons": "關注表裏囥脫隱姓埋名用戶所編",
        "tog-watchlisthidepatrolled": "關注表裏囥脫巡脫編",
-       "tog-ccmeonemails": "我發畀各許用戶箇電子信也發份畀我",
+       "tog-watchlisthidecategorization": "囥脱对页面个分类",
+       "tog-ccmeonemails": "拿我发畀其他用户个电子邮件也发只副本畀我自家",
        "tog-diffonly": "比較兩版弗樣到弗顯示頁內容",
        "tog-showhiddencats": "顯示囥脫分類",
        "tog-norollbackdiff": "执行退回之后弗显示两样",
        "oct": "10月",
        "nov": "11月",
        "dec": "12月",
-       "january-date": "1月 $1",
-       "february-date": "2月 $1",
-       "march-date": "3月 $1",
-       "april-date": "4月 $1",
-       "may-date": "5月 $1",
-       "june-date": "6月 $1",
-       "july-date": "7月 $1",
-       "august-date": "8月 $1",
-       "september-date": "9月 $1",
-       "october-date": "10月 $1",
-       "november-date": "11月 $1",
-       "december-date": "12月 $1",
+       "january-date": "1月$1号",
+       "february-date": "2月$1号",
+       "march-date": "3月$1号",
+       "april-date": "4月$1号",
+       "may-date": "5月$1号",
+       "june-date": "6月$1号",
+       "july-date": "7月$1号",
+       "august-date": "8月$1号",
+       "september-date": "9月$1号",
+       "october-date": "10月$1号",
+       "november-date": "11月$1号",
+       "december-date": "12月$1号",
        "pagecategories": "{{PLURAL:$1|分类}}",
        "category_header": "“$1”分類裏個頁",
        "subcategories": "子分类",
        "noindex-category": "朆索引个页",
        "broken-file-category": "有无用文件链接个页",
        "about": "有关",
-       "article": "å\85§å®¹é \81",
+       "article": "å\86\85容页é\9d¢",
        "newwindow": "(用新窗口开)",
        "cancel": "取消",
        "moredotdotdot": "還多...",
        "morenotlisted": "箇張表還朆完成。",
        "mypage": "我个页面",
        "mytalk": "我个讨论",
-       "anontalk": "箇IP地址個話",
+       "anontalk": "讲张",
        "navigation": "导航",
        "and": "&#32;搭",
        "qbfind": "尋",
        "create-local": "添加本地说明",
        "editthispage": "編箇頁",
        "create-this-page": "建箇頁",
-       "delete": "å\88ª",
+       "delete": "å\88 é\99¤",
        "deletethispage": "刪箇頁",
        "undeletethispage": "弗删箇页",
        "undelete_short": "復原消脫個$1個編寫",
        "protect": "保",
        "protect_change": "改",
        "protectthispage": "保箇頁",
-       "unprotect": "變更保態",
-       "unprotectthispage": "變更箇頁保態",
+       "unprotect": "更改保护",
+       "unprotectthispage": "更改此页个保护",
        "newpage": "新页",
        "talkpage": "探討箇頁",
        "talkpagelinktext": "讨论",
        "specialpage": "特別頁",
        "personaltools": "私人家伙",
-       "articlepage": "æ\9c\9bå\85§å®¹é \81",
+       "articlepage": "æ\9c\9bå\86\85容页",
        "talk": "讨论",
        "views": "望",
        "toolbox": "家生",
        "helppage-top-gethelp": "帮忙",
        "mainpage": "封面",
        "mainpage-description": "封面",
-       "policy-url": "Project:策略",
+       "policy-url": "Project:政策",
        "portal": "社区门堂",
        "portal-url": "Project:社区门堂",
        "privacy": "隐私政策",
        "ok": "好",
        "retrievedfrom": "取自“$1”",
        "youhavenewmessages": "你侬有$1($2)。",
-       "youhavenewmessagesfromusers": "侬有来自{{PLURAL:$3|其他用户|$3个用户}}的$1($2)。",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|侬有}}来自{{PLURAL:$3|其他用户|$3个用户}}个$1($2)。",
+       "youhavenewmessagesmanyusers": "你有从多个用户来个$1($2)。",
        "newmessageslinkplural": "{{PLURAL:$1|新消息|999=新消息}}",
        "newmessagesdifflinkplural": "此垡̺{{PLURAL:$1|变化|999=变化}}",
        "youhavenewmessagesmulti": "爾徠$1裏有新信息",
        "nstab-template": "模板",
        "nstab-help": "幫忙頁",
        "nstab-category": "分类",
+       "mainpage-nstab": "封面",
        "nosuchaction": "嘸能操作",
        "nosuchactiontext": "URL指定個命令無效。爾嘸數畀URL打錯哉,要勿点击仔出錯個鏈接。也嘸數{{SITENAME}}用個軟件本身出錯緣故。",
        "nosuchspecialpage": "嘸能個特別頁",
        "viewsource": "望源码",
        "viewsource-title": "望“$1”个源代码",
        "actionthrottled": "动作已压制",
-       "actionthrottledtext": "基于反垃圾链接个考量,限制垃拉短时间内多趟重复箇只操作。请过脱几分钟再试试看。",
+       "actionthrottledtext": "基于反滥用个考量,限制垃拉短时间内多趟重复箇只操作。请过脱几分钟再试试看。",
        "protectedpagetext": "箇页锁牢定,防编搭各许操作。",
        "viewsourcetext": "侬可以查看搭仔复制箇只页面个源码。",
        "viewyourtext": "你侬好望也好畀'''你侬编个'''复制到箇页:",
        "protectedinterface": "箇页为箇维基个软件提供界面文本,锁牢定防乱用。\n加改全部维基个译文,用[//translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。",
        "editinginterface": "<strong>警告:</strong>侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。",
        "translateinterface": "要加入或着更改所有个wiki个翻译,请侬访问MediaWiki本地化项目个网站[//translatewiki.net/ translatewiki.net]。",
-       "cascadeprotected": "箇只页面拨保护拉许,因为箇只页面拨下底已经标注“级联保护”个{{PLURAL:$1|一只|多只}}被保护页面包含:\n$2",
+       "cascadeprotected": "箇只页面畀保护拉许,因为渠已嵌入到下底已经标注“级联保护”个{{PLURAL:$1|一只|多只}}畀保护页面:\n$2",
        "namespaceprotected": "侬无没编辑'''$1'''名字空间里向页面个权限。",
        "customcssprotected": "箇CSS页你呒处编,箇页有各许用户个私人设置。",
        "customjsprotected": "箇JavaScript页你呒处编,箇页有各许用户个私人设置。",
        "createaccountreason": "理由:",
        "createacct-reason": "理由:",
        "createacct-reason-ph": "为何物建别样账号",
-       "createacct-captcha": "保险检查",
-       "createacct-imgcaptcha-ph": "畀上向望着个字打箇里",
        "createacct-submit": "建你侬个账号",
-       "createacct-another-submit": "建别样账号",
+       "createacct-another-submit": "建账号",
        "createacct-benefit-heading": "{{SITENAME}} 是搭你侬样个人建起个。",
        "createacct-benefit-body1": "{{PLURAL:$1|编写}}",
        "createacct-benefit-body2": "{{PLURAL:$1|页}}",
        "createacct-benefit-body3": "此垡 {{PLURAL:$1|出力个人}}",
-       "badretype": "倷输入个密码搭倪个档案弗配。",
+       "badretype": "侬输入个密码弗匹配。",
        "usernameinprogress": "迭个用户名个账户创建已经勒了进行。请侬等一等。",
-       "userexists": "用戶名有人用哉。相勞爾揀別樣名字。",
+       "userexists": "输入个用户名有人用哉。请再选个两样个名字。",
        "loginerror": "登录错误",
        "createacct-error": "建账号出错",
        "createaccounterror": "无法建立账户:$1",
        "retypenew": "再打一遍新密码:",
        "resetpass_submit": "设置密码再登录",
        "changepassword-success": "密碼改好哉!\n能界登錄當中...",
+       "changepassword-throttled": "侬试登录忒多次哉。等$1再试试看。",
        "resetpass_forbidden": "密码弗好更改",
        "resetpass-no-info": "侬必须登录仔再好直接进入箇只页面。",
        "resetpass-submit-loggedin": "更改密码",
        "resetpass-wrong-oldpass": "无效个临时或者现有密码。\n侬作兴已经成功拿密码改脱,或者已经请求一个新个临时密码。",
        "resetpass-recycled": "请重置侬个密码是忒侬当前密码不同个密码。",
        "resetpass-temp-password": "临时密码:",
+       "resetpass-abort-generic": "密码更改已经畀扩展程序中止。",
+       "resetpass-expired": "侬个密码到期哉。请设置新个登录密码。",
        "passwordreset": "重置密码",
        "passwordreset-username": "用戶名",
+       "passwordreset-capture": "啊要看生成个电子邮件?",
+       "passwordreset-email": "电子邮件地址:",
+       "passwordreset-emailtitle": "{{SITENAME}}上个账号详细信息",
+       "passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
+       "changeemail": "更改或删脱电子邮箱地址",
+       "changeemail-passwordrequired": "侬需要输入密码来确认本次更改。",
+       "changeemail-no-info": "侬必须登录著再好直接进入箇只页面。",
+       "changeemail-oldemail": "当前电子邮件地址:",
+       "changeemail-newemail": "新个电子邮件地址:",
+       "changeemail-password": "侬个{{SITENAME}}密码:",
+       "changeemail-submit": "更改电子邮箱",
+       "changeemail-nochange": "请输入一个弗同个新电子邮件地址。",
+       "resettokens-no-tokens": "呒不可以重置个密钥。",
+       "resettokens-tokens": "密钥:",
+       "resettokens-token-label": "$1(当前值:$2)",
+       "resettokens-done": "密钥已重置。",
+       "resettokens-resetbutton": "重置选中个密钥",
        "bold_sample": "粗体文字",
        "bold_tip": "粗体文字",
        "italic_sample": "斜体文本",
        "sig_tip": "签名搭辰光戳",
        "hr_tip": "水平线 (小心用)",
        "summary": "摘要:",
-       "subject": "主题 / 标题:",
+       "subject": "主题:",
        "minoredit": "箇是小变化",
        "watchthis": "关注箇页",
        "savearticle": "保存页面",
        "preview": "望望相",
        "showpreview": "显示望望相",
        "showdiff": "显示变化",
+       "blankarticle": "<strong>警告:</strong>侬要创建个页面是空白个。如果侬再次点击“{{int:savearticle}}”,一只呒不任何内容个页面会畀创建。",
        "anoneditwarning": "<strong>警告:</strong>你呒不登录。如果你做仔啥编辑,箇么你个IP地址会公开可见。如果你<strong>[$1 登录]</strong>或<strong>[$2 创建]</strong>一个账号,你个编辑会归功于你用户名下底,而且会有其他好处。",
        "anonpreviewwarning": "''侬弗曾登录。侬个IP位址会得记录拉此页个编辑历史里向。''",
        "missingsummary": "'''提示:''' 侬弗曾提供编辑摘要。假使侬再次单击保存,侬个编辑将弗带编辑摘要保存。",
+       "selfredirect": "<strong>警告:</strong>侬来上拿本页面重定向到它自家。\n侬可能搞错重定向目标,或者侬来上编辑错个页面。\n如果侬再次点击“{{int:savearticle}}”,重定向弗管哪亨会畀创建。",
        "missingcommenttext": "请垃下头输入备注。",
-       "missingcommentheader": "'''提示:''' 侬弗曾为此评论提供只标题。如果侬再次单击“{{int:savearticle}}”,侬个编辑将弗带标题保存。",
+       "missingcommentheader": "<strong>提示:</strong>侬弗曾为此评论提供标题。如果侬再次单击“{{int:savearticle}}”,侬个编辑将弗带标题保存。",
        "summary-preview": "摘要预览:",
-       "subject-preview": "主题 / 标题 预览:",
+       "subject-preview": "主题预览:",
        "blockedtitle": "用户拨查封",
        "blockedtext": "侬个用户名或IP地址已经拨$1查封。\n\n箇趟查封是由$1所封个。原因是''$2''。\n\n* 箇趟查封开始个辰光是:$8\n* 箇趟查封到期个辰光是:$6\n* 对于畀查封者:$7\n\n侬可以联络$1或者其他个 [[{{MediaWiki:Grouppage-sysop}}|管理员]],讨论箇趟查封。\n除非侬已经垃侬个 [[Special:Preferences|个人设置]]里向设置仔一只有效个电子邮件地址,弗然侬弗好使用「e-mail箇位用户」功能。当设置了一只有效个电子邮件地址之后,箇只功能是弗会畀封锁个。\n\n侬个IP地址是$3,而该查封ID是 #$5。 请垃拉侬个查询里向注明以上所有资料。",
        "autoblockedtext": "侬个IP地址已经自动查封,由于之前另一位 搭侬用一样IP个用户畀$1所查封。\n而查封个原因是:\n\n:''$2''\n\n* 箇趟查封个开始辰光是:$8\n* 箇趟查封个到期辰光是:$6\n* 对于畀查封者:$7\n\n侬可以联络$1或者其他个 [[{{MediaWiki:Grouppage-sysop}}|管理员]],讨论箇趟查封。\n除非侬已经垃侬个 [[Special:Preferences|个人设置]]里向设置仔一只有效个电子邮件地址,弗然侬弗好使用「e-mail箇位用户」功能。当设置了一只有效个电子邮件地址之后,箇只功能是弗会畀封锁个。\n\n侬个IP地址是$3,而该查封ID是 #$5。 请垃拉侬个查询里向注明以上所有资料。",
        "blockednoreason": "朆畀出原因",
-       "whitelistedittext": "侬必须$1才能编辑。",
+       "whitelistedittext": "请$1编辑。",
        "confirmedittext": "垃拉编辑此页之前侬必须确认侬个邮箱地址。请通过[[Special:Preferences|个人设置]]设置并验证侬个邮箱地址。",
        "nosuchsectiontitle": "寻弗着箇只段落",
        "nosuchsectiontext": "侬尝试编辑个章节弗存在。\n作兴是垃拉侬查看页面个辰光已经移动或者畀删除。",
        "userjsyoucanpreview": "'''提示:''' 垃拉保存之前请用“{{int:showpreview}}”揿钮来测试新 JavaScript 。",
        "usercsspreview": "'''注意侬只是垃许预览侬个 CSS。'''\n'''还弗曾保存!'''",
        "userjspreview": "'''注意侬只是垃许测试/预览侬个 JavaScript。'''\n'''还弗曾保存!'''",
+       "sitecsspreview": "<strong>注意侬现在只是来上预览该CSS,还弗曾保存!</strong>",
+       "sitejspreview": "<strong>注意侬现在只是来上预览该JavaScript代码,还弗曾保存!</strong>",
        "userinvalidcssjstitle": "'''警告:''' 弗存在皮肤\"$1\"。注意自定义个 .css 搭 .js 页要使用小写标题,譬如,{{ns:user}}:Foo/vector.css 弗同于 {{ns:user}}:Foo/Vector.css。",
        "updated": "(已更新)",
        "note": "'''注意:'''",
        "previewnote": "'''记牢!箇还是“望望相”;你侬个修改还朆保存起!'''",
+       "continue-editing": "到编辑区去",
        "previewconflict": "箇个预览显示了上头文字编辑区里向个内容。渠会得垃拉侬保存之后出现。",
        "session_fail_preview": "'''弗好意思!由于会话数据落失,我伲弗好处理侬个编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|登出]]之后重新登录。",
        "session_fail_preview_html": "'''弗好意思!我伲弗好处理侬垃拉进程数据落失辰光个编辑。'''\n\n''由于{{SITENAME}}允许使用原始个 HTML,为著防范 JavaScript 攻击,预览已畀隐藏。''\n\n'''如果这是一次合法的编辑,请重新进行尝试。'''如果还不行,请 [[Special:UserLogout|退出]]并重新登录。",
        "token_suffix_mismatch": "'''由于侬用户端里向个编辑令牌毁损仔一些标点符号字元,为防止编辑个文字损坏,侬个编辑已经畀回头。'''\n箇种情况通常出现垃拉使用含有交关bug、以网络为主个匿名代理服务个辰光。",
        "editing": "来里编$1",
        "creating": "创建“$1”",
-       "editingsection": "徕里编写$1(段)",
+       "editingsection": "来里编辑$1(段落)",
        "editingcomment": "垃许编辑 $1 (新段落)",
        "editconflict": "编辑冲突: $1",
        "explainconflict": "有人垃拉侬开始编辑之后更改仔页面。\n上头个文字框内显示个是箇歇本页个内容。\n侬个修改显示垃拉下底只文字框里向。\n侬应当拿侬个修改加入到现有个内容里向。\n<b>只有</b>上头文字框里向个内容会得垃侬点击\"保存页面\"之后畀保存。",
        "copyrightwarning": "请注意你侬对{{SITENAME}}个一切贡献全必须徕$2下头发布,查$1望细节。\n假使你侬弗想自己个文字遭到随意修改搭转发,覅提交上来。<br />\n你侬也要向我里保证,箇是你侬自家写个,要勿从弗受版权保护个要勿差弗多个自由资源来。\n'''覅徕朆获得授权个情况下发表!'''<br />",
        "copyrightwarning2": "请注意侬对{{SITENAME}}个所有贡献\n侪可能畀别个贡献者编辑,修改或删除。\n假使侬弗希望侬个文字畀任意修改搭仔再发布,请弗要提交。<br />\n侬同时也要向我伲保证侬提交个内容是侬自家所作,或得自一个弗受版权保护或相似自由个来源(参阅$1个细节)。\n''' 弗要垃拉弗曾获得授权个情况下头发表!'''",
        "longpageerror": "'''错误:侬提交个文本长度有$1KB,大于$2KB个顶大值。'''该文本弗能保存。",
-       "readonlywarning": "'''警告:数据库锁定垃许维护,侬箇歇弗好保存侬个修改。'''侬作兴希望先拿本段文字复制并保存到文本文件,等歇再修改。\n\n管理员有如下解释:$1",
+       "readonlywarning": "<strong>警告:数据库锁定垃许维护,侬箇歇弗好保存侬个修改。</strong>侬作兴希望先拿侬个文字复制并保存到文本文件,等歇再修改。\n\n锁牢数据库个管理员有如下解释:$1",
        "protectedpagewarning": "'''警告:此页已经畀保护,只有拥有管理员权限个用户再好修改。'''\n最近个日志垃拉下底提供以便参考:",
        "semiprotectedpagewarning": "'''注意:''' 本页面畀锁定,仅限注册用户编辑。\n最近个日志垃拉下底提供以便参考:",
-       "cascadeprotectedwarning": "警告:本页已经畀保护,只有拥有管理员权限个用户再好修改,因为本页已畀下底眼级联保护个{{PLURAL:$1|一只|多只}}页面所包含:",
+       "cascadeprotectedwarning": "<strong>警告:</strong>本页已经畀保护,只有拥有管理员权限个用户再好修改,因为本页已畀下底眼级联保护个{{PLURAL:$1|一只|多只}}页面所嵌入:",
        "titleprotectedwarning": "'''警告:本页面已畀锁定,需要[[Special:ListGroupRights|指定权限]]方可创建。'''\n最近个日志垃拉下底提供以便参考:",
        "templatesused": "箇页有{{PLURAL:$1|个模板}}:",
        "templatesusedpreview": "{{PLURAL:$1|只模板}}垃拉箇趟预览里向拨使用:",
        "sectioneditnotsupported-text": "此页面弗支持编辑段落。",
        "permissionserrors": "权限错误",
        "permissionserrorstext": "为仔下头个{{PLURAL:$1|原因|原因}}咾侬无权进行箇只操作:",
-       "permissionserrorstext-withaction": "ä¸\8b头个{{PLURAL:$1|å\8e\9få\9b |å\8e\9få\9b }}ä¹\8bæ\95\85ï¼\8c你侬å\91\92å¤\84进行$2操作:",
+       "permissionserrorstext-withaction": "为ä»\94ä¸\8b头个{{PLURAL:$1|å\8e\9få\9b |å\8e\9få\9b }}å\92¾ä¾¬æ\97 æ\9d\83进行$2操作:",
        "recreate-moveddeleted-warn": "'''警告: 你侬要转建一个之前删脱过个页面。'''\n\n你侬应该要考虑考虑继续编箇页是否合适。\n方便考虑,箇页个删记录提供到下头:",
        "moveddeleted-notice": "箇页删脱哉。\n箇页个删搭移个日志徕下头提供以便参考。",
        "log-fulllog": "查看完整日志",
        "edit-gone-missing": "弗好更新页面。\n渠作兴齐巧畀删除。",
        "edit-conflict": "编辑冲突",
        "edit-no-change": "侬个编辑畀忽略,因为文本弗曾有改动。",
+       "postedit-confirmation-created": "页面已创建。",
+       "postedit-confirmation-restored": "页面已恢复。",
+       "postedit-confirmation-saved": "侬个编辑已保存。",
        "edit-already-exists": "弗好创建新页面。\n已经有垃许。",
+       "defaultmessagetext": "默认消息文本",
+       "invalid-content-data": "无效内容数据",
+       "content-not-allowed-here": "[[$2]]页面上弗允许“$1”内容",
+       "editpage-notsupportedcontentformat-title": "内容格式弗支持",
+       "content-model-wikitext": "维基文本",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "空个对象",
+       "content-json-empty-array": "空个数组",
+       "duplicate-args-warning": "<strong>警告:</strong>[[:$1]]来上调用[[:$2]]里向超过一个“$3”参数个值。只有最后提供个值会畀使用。",
+       "duplicate-args-category": "调用重复模板参数个页面",
        "expensive-parserfunction-warning": "警告:箇只页面包含忒多占用资源个函数调用。\n\n必须小于$2趟调用,现在有$1趟调用。",
        "expensive-parserfunction-category": "页面包含忒多耗费资源个函数调用",
        "post-expand-template-inclusion-warning": "'''警告:'''模板用忒多。\n一星模板弗'''用'''。",
        "parser-template-loop-warning": "检测着模板循环:[[$1]]",
        "parser-template-recursion-depth-warning": "模板递归深度超限($1)",
        "language-converter-depth-warning": "字词转换器深度超限($1)",
+       "node-count-exceeded-category": "页面个节点数超出限制",
+       "parser-unstrip-recursion-limit": "递归超过限制 ($1)",
+       "converter-manual-rule-error": "来手动语言转换规则当中查着错误",
        "undo-success": "箇只编辑可以撤销。\n请检查下头个比较,确定侬确实想撤销,然后保存下底个更改完成撤销编辑。",
        "undo-failure": "由于相互冲突个中途编辑,箇只编辑弗好撤销。",
        "undo-norev": "由于其版本弗存在或已删除,此编辑弗好撤销。",
+       "undo-nochange": "箇届编辑看出来已经畀撤销。",
        "undo-summary": "撤销由[[Special:Contributions/$2|$2]]([[User talk:$2|讨论]])作出个版本$1",
-       "cantcreateaccounttitle": "å\91\92å¤\84建ç«\8bå¸\90户",
+       "cantcreateaccounttitle": "å¼\97好å¼\80户",
        "cantcreateaccount-text": "从箇只IP地址 (<b>$1</b>) 创建账户已经畀[[User:$3|$3]]禁止。\n\n$3封禁个原因是''$2''",
        "viewpagelogs": "望箇页日志",
        "nohistory": "该只页面呒拨编辑历史。",
        "history-feed-description": "wiki里向本页个修订历史",
        "history-feed-item-nocomment": "$1垃拉$2",
        "history-feed-empty": "请求个页面弗存在。渠作兴已畀删除或重命名。\n尝试[[Special:Search|搜索本站]]获得相关新建页面。",
+       "history-edit-tags": "编辑选中修订版本个标签",
        "rev-deleted-comment": "(编辑摘要畀删脱)",
        "rev-deleted-user": "(用户名已删除)",
        "rev-deleted-event": "(日志细节畀删脱)",
        "rev-showdeleted": "显示",
        "revisiondelete": "删除 / 反删除版本",
        "revdelete-nooldid-title": "无效个目标版本",
-       "revdelete-nooldid-text": "侬è¿\98å¼\97æ\9b¾æ\8c\87å®\9aä¸\80个ç\9b®æ \87ç\89\88æ\9c¬å\8e»è¿\9bè¡\8cç®\87å\8fªå\8a\9fè\83½ã\80\81\næ\89\80æ\8c\87å®\9a个ç\89\88æ\9c¬å¼\97å­\98å\9c¨ï¼\8cæ\88\96è\80\85侬å°\9dè¯\95å\8e»é\9a\90è\97\8f现时个版本。",
+       "revdelete-nooldid-text": "侬è¿\98å¼\97æ\9b¾æ\8c\87å®\9aä»»ä½\95ç\9b®æ \87ç\89\88æ\9c¬æ\9d¥æ\89§è¡\8cç®\87å\8fªå\8a\9fè\83½ï¼\8c\næ\88\96è\80\85æ\89\80æ\8c\87å®\9a个ç\89\88æ\9c¬å¼\97å­\98å\9c¨ï¼\8cæ\88\96è\80\85侬å°\9dè¯\95å\8e»å\9b¥è\84±现时个版本。",
        "revdelete-no-file": "指定文件弗存在。",
        "revdelete-show-file-confirm": "侬阿是真个要查看文件“<nowiki>$1</nowiki>”垃拉$2 $3已经删除个版本?",
        "revdelete-show-file-submit": "是",
+       "revdelete-selected-text": "已选择[[:$2]]个$1只版本:",
+       "revdelete-selected-file": "已选择文件[[:$2]]个$1只版本:",
        "logdelete-selected": "选取$1个日志事件:",
        "revdelete-confirm": "假使侬想箇能介做个闲话,请确认侬已经清爽箇能介做个后果,外加箇个程序符合[[{{MediaWiki:Policy-url}}|政策]]。",
-       "revdelete-suppress-text": "'''只有'''出现下头眼情况再应阻止访问:\n* 弗适合个个人信息\n*: ''家庭地址、电话号码、身份证号码等。''",
+       "revdelete-suppress-text": "<strong>只有</strong>出现下头眼情况再应阻止访问:\n* 潜在个诽谤信息\n* 弗适合个个人信息\n*: <em>家庭地址、电话号码、身份证号码等。</em>",
        "revdelete-legend": "设置可见性之限制",
        "revdelete-hide-text": "修订文本",
        "revdelete-hide-image": "隐藏文件内容",
        "mergelogpagetext": "下底是只最近发生个页面历史合并个记录列表。",
        "history-title": "“$1”的版本历史",
        "difference-title": "“$1”版本间个差别",
+       "difference-title-multipage": "页面“$1”搭“$2”之间个差别",
+       "difference-multipage": "(页面间个差别)",
        "lineno": "第$1排:",
        "compareselectedversions": "比较选中个版本",
        "showhideselectedversions": "显示/囥脱选定修订版本",
        "editundo": "撤销",
+       "diff-empty": "(呒不差别)",
        "diff-multi-sameuser": "(朆显示同一用户个$1个中间版本)",
+       "diff-multi-otherusers": "(朆显示{{PLURAL:$1|另一用户|$2个用户}}个{{PLURAL:$1|$1只中间版本}})",
+       "diff-multi-manyusers": "(朆显示超过$2个用户个$1只中间版本)",
        "searchresults": "搜寻结果",
        "searchresults-title": "搜寻“$1”个结果",
        "titlematches": "页面标题匹配",
        "notextmatches": "呒没匹配个页面文本",
        "prevn": "前$1个",
        "nextn": "下个 {{PLURAL:$1|$1}}",
+       "prev-page": "上页",
+       "next-page": "下页",
        "prevn-title": "前$1个结果",
        "nextn-title": "后$1个结果",
        "shown-title": "一页显示$1个结果",
        "search-result-category-size": "$1个成员($2个儿分类,$3个文件)",
        "search-redirect": "(转戳到 $1)",
        "search-section": "(段落 $1)",
+       "search-category": "(分类$1)",
+       "search-file-match": "(匹配文件内容)",
        "search-suggest": "你侬是寻:$1",
+       "search-rewritten": "显示$1个结果。另寻$2。",
        "search-interwiki-caption": "姊妹项目",
        "search-interwiki-default": "来自$1个结果:",
        "search-interwiki-more": "(更多)",
        "searchrelated": "相关",
        "searchall": "全部",
        "showingresults": "下头显示从第<b>$2</b>条开始个<b>$1</b>条结果:",
+       "showingresultsinrange": "下底显示区间#<strong>$2</strong>到#<strong>$3</strong>个<strong>$1</strong>条结果。",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>条结果里个<strong>$1</strong>条|<strong>$3</strong>条结果里个<strong>$1~$2</strong>条}}",
        "search-nonefound": "查询呒有结果。",
+       "search-nonefound-thiswiki": "来本站寻弗着匹配查询个结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "垃拉箇眼名字空间里向搜索:",
        "powersearch-togglelabel": "选择:",
        "powersearch-toggleall": "全选",
        "powersearch-togglenone": "侪弗选",
+       "powersearch-remember": "记牢选择用于今后个搜寻",
        "search-external": "外部搜索",
        "searchdisabled": "{{SITENAME}}个搜索已禁用。侬可以暂时使用Google搜索,须注意渠拉索引个{{SITENAME}}内容作兴会过时。",
+       "search-error": "搜寻辰光发生错误:$1",
        "preferences": "偏好",
        "mypreferences": "偏好设定",
        "prefs-edits": "编辑数量:",
+       "prefsnologintext2": "请登录来更改侬个用户设置。",
        "prefs-skin": "皮肤",
        "skin-preview": "预览",
        "datedefault": "呒拨偏好",
+       "prefs-labs": "实验性特色",
+       "prefs-user-pages": "用户页",
        "prefs-personal": "用户档案",
        "prefs-rc": "近段辰光个改动",
        "prefs-watchlist": "监控列表",
+       "prefs-editwatchlist": "编辑关注表",
        "prefs-watchlist-days": "勒拉监控列表里向显示个日数:",
        "prefs-watchlist-days-max": "最长$1日天",
        "prefs-watchlist-edits": "勒拉扩展个监控列表里向显示个编辑趟数:",
        "prefs-watchlist-token": "监控列表记认:",
        "prefs-misc": "杂项",
        "prefs-resetpass": "更改密码",
-       "prefs-changeemail": "更改电子邮箱地址",
+       "prefs-changeemail": "更改或删脱电子邮箱地址",
+       "prefs-setemail": "设置电子邮件地址",
        "prefs-email": "邮箱选项",
        "prefs-rendering": "外观",
        "saveprefs": "保存",
        "rows": "行数:",
        "columns": "列数:",
        "searchresultshead": "搜索",
-       "stub-threshold": "<a href=\"#\" class=\"stub\">短页面链接</a>格式门槛值(字节):",
+       "stub-threshold": "短链接格式阈值($1):",
+       "stub-threshold-disabled": "停用",
        "recentchangesdays": "最近更改里向个显示日数:",
        "recentchangesdays-max": "最长 $1 日",
        "recentchangescount": "默认显示个编辑数:",
        "prefs-help-recentchangescount": "箇个包括近段辰光个改动、页面历史以及日志。",
        "savedprefs": "倷个偏好已经保存哉。",
+       "savedrights": "{{GENDER:$1|$1}}个用户权限已经畀保存。",
        "timezonelegend": "时区:",
        "localtime": "当地辰光:",
        "timezoneuseserverdefault": "使用wiki默认值($1)",
        "prefs-namespaces": "名字空间",
        "default": "默认",
        "prefs-files": "文件",
+       "prefs-custom-css": "自定义CSS",
+       "prefs-custom-js": "自定义JavaScript",
+       "prefs-common-css-js": "所有皮肤一道用个CSS/JavaScript:",
+       "prefs-emailconfirm-label": "电子邮件确认:",
        "youremail": "电子信箱:",
        "username": "{{GENDER:$1|用户名}}:",
+       "prefs-registration": "注册辰光:",
        "yourrealname": "真名字:",
        "yourlanguage": "语言:",
        "yournick": "绰号:",
        "badsig": "无效原始签名;检查 HTML 标签。",
+       "yourgender": "侬希望畀哪亨称呼?",
        "gender-unknown": "提到侬个辰光,软件会尽量用性别中立个词汇",
-       "gender-male": "佢写Wiki",
-       "gender-female": "\"姖\"写Wiki",
+       "gender-male": "",
+       "gender-female": "",
        "email": "电子邮件",
        "prefs-help-email": "电子信由你侬填弗填,转设密码用得着。",
        "prefs-help-email-others": "你侬也好来你侬个用户|讨论页里添加自己个电子信连接畀别人联系你用。\n别人联系你是弗晓得你侬个电子信地址个。",
        "prefs-help-email-required": "需要电子邮件地址。",
+       "prefs-info": "基本信息",
+       "prefs-i18n": "闲话",
+       "prefs-signature": "签名",
        "prefs-dateformat": "日脚格式",
+       "prefs-advancedrc": "高级选项",
+       "prefs-advancedrendering": "高级选项",
+       "prefs-advancedsearchoptions": "高级选项",
+       "prefs-advancedwatchlist": "高级选项",
+       "prefs-tabs-navigation-hint": "提示:侬可以用左、右箭头键来选项卡之间切换。",
        "userrights-user-editname": "输入用户名:",
+       "editusergroup": "编辑用户组",
        "group-bot": "机器人",
        "group-sysop": "管理员",
        "group-bureaucrat": "行政员",
        "right-movefile": "移文件",
        "right-upload": "傳文件",
        "right-reupload": "文件以舊換新",
+       "right-upload_by_url": "从URL上传文件",
        "right-writeapi": "使用写入API",
        "right-delete": "刪頁面",
+       "right-bigdelete": "删脱有大量历史个页面",
+       "right-deletelogentry": "删脱搭恢复特定日志项",
+       "right-deleterevision": "删脱搭恢复页面个特定版本",
+       "right-deletedhistory": "检视畀删脱个历史项目,弗包括相关文本",
        "right-browsearchive": "搜尋已刪頁",
+       "right-editusercss": "编辑其他用户个CSS文件",
+       "right-edituserjs": "编辑其他用户个JavaScript文件",
+       "right-editmyusercss": "编辑侬自家个用户CSS文件",
+       "right-editmyuserjs": "编辑侬自家个用户JavaScript文件",
        "right-viewmywatchlist": "望自己個關注表",
+       "right-editmywatchlist": "编辑侬个关注表。请注意就算缺少本权限,某些操作仍旧会拿页面加到关注表。",
+       "right-viewmyprivateinfo": "看侬个私人数据(如电子邮件地址、真实姓名)",
+       "right-editmyprivateinfo": "编辑侬个私人数据(如电子邮件地址、真实姓名)",
+       "right-editmyoptions": "编辑侬个个人设置",
        "right-sendemail": "發郵件畀各許人",
        "newuserlogpage": "用户创建日志",
+       "newuserlogpagetext": "箇是用户创建个记录。",
        "rightslog": "用户权限日志",
        "action-read": "讀箇頁",
-       "action-edit": "编箇页",
+       "action-edit": "编辑箇只页面",
        "action-createpage": "做新頁",
        "action-createtalk": "做討論頁",
        "action-minoredit": "標小編寫",
        "nchanges": "$1趟更改",
        "enhancedrc-history": "歷史",
        "recentchanges": "近段辰光个改动",
-       "recentchanges-legend": "箇阶段个变化选项",
+       "recentchanges-legend": "近段辰光个改动选项",
        "recentchanges-summary": "登该个页面浪跟踪最近对维基百科个改动。",
        "recentchanges-feed-description": "跟踪此订阅垃拉 wiki 高头个最近更改。",
        "recentchanges-label-newpage": "建新页来编",
        "rc-change-size-new": "更改后有$1字节",
        "newsectionsummary": "/* $1 */ 新段落",
        "rc-enhanced-expand": "显示细节",
-       "rc-enhanced-hide": "细节囥脱",
+       "rc-enhanced-hide": "细节囥脱",
        "recentchangeslinked": "搭界个改动",
        "recentchangeslinked-feed": "搭界个改动",
        "recentchangeslinked-toolbox": "相关变化",
        "uploadbtn": "上载文件",
        "reuploaddesc": "弗傳,轉到傳表單",
        "uploadnologin": "朆登录",
-       "uploadnologintext": "倷板定要[[Special:UserLogin|登录]]仔再好上载文件。",
+       "uploadnologintext": "倷板定要$1再好上载文件。",
        "uploaderror": "上载出错",
        "uploadtext": "拿下头只表格来上载文件。要查看或者搜寻之前上载个图片个说法,请到[[Special:FileList|已上载文件列表]],上载搭仔删脱也记录勒拉[[Special:Log/upload|上载日志]]里向。\n\n要勒拉页面里向摆进图片个说法,用下头该种形式个链接\n'''<nowiki>[[{{ns:file}}:文件.jpg]]</nowiki>''',\n'''<nowiki>[[{{ns:file}}:文件.png|替代文本]]</nowiki>''' 或者用\n'''<nowiki>[[{{ns:media}}:文件.ogg]]</nowiki>''' 直接链到文件。",
        "uploadlogpage": "文件上传日志",
        "filename": "文件名",
        "filedesc": "小结",
        "fileuploadsummary": "小结:",
+       "filereuploadsummary": "文件更改:",
        "filestatus": "版权状态:",
        "filesource": "来源:",
        "ignorewarning": "弗管警告,随便哪亨要保存文件。",
        "minlength1": "文件名至少一個字。",
        "illegalfilename": "“$1”文件名裏有嘸處當頁題目個字。文件名轉改再傳上來試試相。",
        "filename-toolong": "文件名嘸處比240字節長。",
+       "badfilename": "文件名已经改成“$1”。",
        "filename-tooshort": "文件名忒短。",
        "filetype-banned": "弗準箇類型個文件。",
        "illegal-filename": "弗準箇文件名。",
        "upload-failure-subj": "傳個問題",
        "upload-warning-subj": "傳個警告",
        "upload-misc-error": "弗識個傳錯誤",
+       "foreign-structured-upload-form-label-infoform-date": "日脚",
        "backend-fail-delete": "文件“$1”刪弗爻。",
        "backend-fail-move": "嘸處畀“$1”移到“$2”。",
        "backend-fail-opentemp": "臨時文件開弗爻。",
        "statistics-users-active": "活跃用户",
        "pageswithprop-submit": "去",
        "brokenredirects": "坏脱个重定向",
-       "brokenredirectstext": "ä¸\8bå\90\91å\80\8bè½\89æ\88³é\8f\88æ\8e¥å\88°æ\9c\86è¦\8bå\80\8bé \81面:",
+       "brokenredirectstext": "ä¸\8båº\95个é\87\8då®\9aå\90\91é\93¾å\88°å¼\97å­\98å\9c¨ä¸ªé¡µ面:",
        "brokenredirects-edit": "编辑",
        "brokenredirects-delete": "删除",
        "withoutinterwiki": "嘸語言鏈接個頁面",
        "specialloguserlabel": "用戶:",
        "speciallogtitlelabel": "目標(標題要弗用戶):",
        "log": "记录",
+       "alllogstext": "所有{{SITENAME}}公开日志个联合展示。侬可以选择日志类型、用户名(区分大小写)或者相关页面(区分大小写)来缩小查询范围。",
        "allpages": "全部页面",
        "nextpage": "下页 ($1)",
        "prevpage": "上一页($1)",
        "allinnamespace": "所有页面 ($1 名字空间)",
        "allpagessubmit": "提交",
        "allpagesprefix": "显示个页面有下底个前缀:",
-       "allpages-bad-ns": "{{SITENAME}}没有叫做\"$1\"个名字空间.",
+       "allpagesbadtitle": "畀定个页面标题是非法个,或者具有一个内部语言或内部 wiki 个前缀。渠作兴包括一个或更多个弗好用于标题个字符。",
+       "allpages-bad-ns": "{{SITENAME}}呒不叫\"$1\"个名字空间。",
        "categories": "页面分类",
-       "linksearch": "外部链接",
+       "deletedcontributions": "删脱个用户贡献",
+       "linksearch": "外部链接搜寻",
        "linksearch-ns": "名字空間:",
        "linksearch-ok": "搜尋",
        "linksearch-line": "从$2链到$1",
        "mywatchlist": "我个关注表",
        "nowatchlist": "倷个监控列表是空个。",
        "watchnologin": "朆登录",
-       "addedwatchtext": "“[[:$1]]”箇頁加進爾個[[Special:Watchlist|關注表]]去哉。\n轉日箇頁搭渠討論頁個變化會排箇耷。",
+       "addedwatchtext": "“[[:$1]]”及其讨论页已经加进侬个[[Special:Watchlist|关注表]]哉。",
        "removewatch": "從關注表移爻",
-       "removedwatchtext": "页面[[:$1]]已经从[[Special:Watchlist|侬个监控页面]]里向拿脱。",
+       "removedwatchtext": "“[[:$1]]”及其讨论页已经从侬个[[Special:Watchlist|关注表]]去脱哉。",
        "watch": "关注",
        "watchthispage": "监控该只页面",
        "unwatch": "弗关注",
        "unwatchthispage": "停止监控",
        "notanarticle": "弗是內容頁",
        "watchlist-details": "弗包括讨论页,有 $1 页徕你侬关注表里向。",
+       "wlheader-showupdated": "勒侬上趟查看之后畀修改个页面<strong>加粗</strong>显示。",
        "wlnote": "下底是{{PLURAL:$2|过去<strong>$2</strong>个钟头}}个{{PLURAL:$1|最后<strong>$1</strong>届更改}},截至$3 $4。",
-       "wlshowlast": "显示上 $1 个钟头 $2 日",
+       "wlshowlast": "显示上$1个钟头$2日天",
+       "watchlistall2": "全部",
        "watchlist-options": "监控列表选项",
        "watching": "监控……",
        "unwatching": "解除监控……",
        "changed": "改变哉",
        "deletepage": "删脱页面",
        "confirm": "确认",
-       "historywarning": "警告:倷要删脱个该只页面有历史:",
+       "historywarning": "<strong>警告:</strong>侬要删脱个页面有$1次{{PLURAL:$1|修订}}历史:",
        "confirmdeletetext": "侬即将删除一只页面或图像以及其历史。\n请确定侬要进行此项操作,并且了解其后果,同时侬个行为符合[[{{MediaWiki:Policy-url}}|the policy]]。",
        "actioncomplete": "操作完成哉",
        "deletedtext": "\"$1\"已经删除。最近删除记录请参见$2。",
        "dellogpage": "删除记录",
+       "dellogpagetext": "下底是最近个删除个列表。",
        "deletionlog": "删除记录",
        "deletecomment": "理由:",
        "deleteotherreason": "其它/附加理由:",
        "rollbacklink": "回退",
        "rollbacklinkcount": "回退$1届编辑",
        "rollbackfailed": "恢复失败",
+       "cantrollback": "弗好恢复编辑;阿末个贡献人是本页唯一个作者。",
+       "alreadyrolled": "恢复弗落[[User:$2|$2]]([[User talk:$2|讲张]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])对[[:$1]]个编辑,其他人已经编辑歇或恢复过该个页面。\n\n最后编辑者是[[User:$3|$3]]([[User talk:$3|讲张]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "revertpage": "恢复[[Special:Contributions/$2|$2]] ([[User talk:$2|讲张]])个改动;恢复到[[User:$1|$1]]个上一版本",
        "protectlogpage": "保护日志",
        "protectedarticle": "保护“[[$1]]”",
        "protect_expiry_old": "到期辰光已经过去哉。",
        "protect-text": "侬好垃拉此地浏览搭仔修改页面<strong>$1</strong>个保护级别。",
        "protect-locked-access": "侬个账户权限弗好修改保护级别。\n下底是<strong>$1</strong>箇歇个保护级别:",
-       "protect-cascadeon": "下底个{{PLURAL:$1|一只|多只}}页面包含 本页面个同时,启动了连锁保护,因此本页面目前也拨保护拉许,弗好编辑。侬可以设置本页面个保护级别,但箇个并弗会对连锁保护有所影响。",
+       "protect-cascadeon": "本页面目前畀保护拉许,因为下底个{{PLURAL:$1|一只|多只}}页面嵌入本页面个同时,启动了连锁保护。更改本页面个保护级别并弗会影响连锁保护。",
        "protect-default": "允许所有用户",
-       "protect-fallback": "需要“$1”个许可",
+       "protect-fallback": "只允许有“$1”权限个用户",
        "protect-level-autoconfirmed": "弗准新用戶搭還朆註冊個用戶",
        "protect-level-sysop": "只准管理員",
        "protect-summary-cascade": "级联",
        "contributions": "{{GENDER:$1|用户}}贡献",
        "contributions-title": "$1个贡献",
        "mycontris": "我个贡献",
-       "contribsub2": "$1个贡献($2)",
+       "contribsub2": "{{GENDER:$3|$1}}个贡献($2)",
        "uctop": "(此垡)",
        "month": "从箇月起 (要勿还要早):",
        "year": "从箇年起 (要勿还要早):",
        "whatlinkshere-prev": "前$1个",
        "whatlinkshere-next": "后$1个",
        "whatlinkshere-links": "←链进",
-       "whatlinkshere-hideredirs": "$1转戳",
+       "whatlinkshere-hideredirs": "$1重定向",
        "whatlinkshere-hidetrans": "$1嵌入",
        "whatlinkshere-hidelinks": "$1链接",
        "whatlinkshere-filters": "过滤器",
-       "blockip": "查封用户",
+       "blockip": "查封{{GENDER:$1|用户}}",
+       "blockiptext": "用下头个表单来禁止来自某一特定IP地址或用户名个修改权限。只有勒勒为仔防止破坏,及符合[[{{MediaWiki:Policy-url}}|政策]]个情况下底再好采取此行动。请勒勒下底输入一个具体个理由(譬如引述一只畀破坏个页面)。",
        "ipaddressorusername": "IP地址或用户名:",
        "ipbreason": "理由:",
        "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",
        "badipaddress": "无效 IP 地址",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]]已经畀查封。<br />\n参看[[Special:BlockList|查封列表]]来复审查封。",
        "ipblocklist": "封脱个用户",
        "infiniteblock": "永远",
        "blocklink": "封禁",
        "unblocklink": "解封",
        "change-blocklink": "改变封禁",
        "contribslink": "贡献",
+       "autoblocker": "因为侬搭“[[User:$1|$1]]”共享一个IP地址了畀自动查封。$1畀查封个理由是“$2”",
        "blocklogpage": "封禁日志",
-       "blocklogentry": "“[[$1]]”查封徕里,$2 $3到期",
-       "blocklogtext": "箇是用戶封搭解封操作個記錄。自動封個IP地址弗排。到[[Special:BlockList|IP 封表]]裏望目前生效個封表。",
+       "blocklogentry": "查封[[$1]],终止辰光为$2$3",
+       "blocklogtext": "该个是用户查封搭著解封操作个记录。自动查封个IP地址弗会列勒该𡍲。到[[Special:BlockList|封禁列表]]去看当前生效个查封。",
        "unblocklogentry": "$1已经拨解封",
        "block-log-flags-nocreate": "建账号禁用哉",
        "lockdb": "鎖數據庫",
        "unlockbtn": "數據庫開鎖",
        "databasenotlocked": "數據庫朆鎖牢。",
        "move-page-legend": "页面捅荡",
-       "movepagetext": "用下底個表會轉名字一張頁面,全部歷史都移到新名字裏。\n老個名字會變成戳到新名字個轉戳頁。\n到旧页面个连接弗会改变;注意检查双重定向或者坏脱个重定向。\n倷有实概个责任,即连接原要连到俚笃应该连到个场呵去。\n\n注意,如果新名字归面搭已经有页面个说话,老名字个页面'''弗'''会拨移动,除非归个是只空页面或者是只重定向并且呒拨编辑历史。个也就是讲,假使倷犯错误个说话,倷好拿一只重命名过个页面还原到原来个名字,但倷弗好覆盖一只已经来浪个页面。\n\n<b>警告!</b>\n箇嘸數會有名氣個引起对一只热门页面剧烈个、想弗着个改变。\n来操作前头请倷确定倷已经充分了解个能做法个后果。",
-       "movepagetalktext": "相关讨论页将自动搭该页面一淘移动,'''除非''':\n*新页面已经有仔一只非空个讨论页,或者\n*侬弗勾选下头个复选框。\n\n垃拉箇星情况下头,侬必须手工移动或合并页面。",
+       "movepagetext": "用下底个表会重命名一只页面,全部历史侪移到新名字里。老个名字会变成戳到新名字个重定向页。注意检查[[Special:DoubleRedirects|双重重定向]]或者[[Special:BrokenRedirects|坏脱个重定向]]。倷有实概个责任,让链接仍旧链到俚笃应该链到个场化去。\n\n注意,如果新名字归面搭已经有页面个说话,老名字个页面'''弗'''会畀移动,除非归个是只空页面或者是只重定向并且呒不编辑历史。箇也就是讲,假使倷犯错误个说话,倷好拿一只重命名过个页面还原到原来个名字,但倷弗好覆盖一只已经来上个页面。\n\n<strong>警告!</strong>箇呒数会引起对一只热门页面剧烈个、想弗着个改变。来操作前头请倷确定倷已经充分了解行为个后果。",
+       "movepagetalktext": "如果侬勾选此框,相关讨论页会自动移动到新标题,除非箇𡍲已经有著一只非空个讨论页。\n\n来箇种情况下底,如果有需要,侬必须手工移动或合并页面。",
        "movenologintext": "倷板定要是已登记用户且勒拉[[Special:UserLogin|登录]]状态下头再好拿页面捅荡。",
-       "newtitle": "新标题:",
+       "newtitle": "新标题",
        "move-watch": "监控来源以及目标页",
        "movepagebtn": "页面移动",
        "pagemovedsub": "移动成功",
        "movelogpagetext": "下底是拨拉捅荡个页面列表。",
        "movereason": "理由:",
        "revertmove": "恢复",
-       "delete_and_move": "删脱搭仔捅荡",
        "delete_and_move_confirm": "对哉,删脱该只页面",
        "export": "页导出",
        "allmessages": "系统讯息",
        "allmessagesname": "名字",
        "allmessagesdefault": "默认文本",
        "allmessagescurrent": "当前文本",
-       "allmessagestext": "该个是MediaWiki名字空间里可用个系统音讯列表。",
+       "allmessagestext": "该个是MediaWiki名字空间里可用个系统消息列表。\n如果想为MediaWiki个本地化贡献翻译,请访问[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki本地化]搭[//translatewiki.net translatewiki.net]。",
        "allmessagesnotsupportedDB": "'''{{ns:special}}:Allmessages''' 呒处显示,因为 '''$wgUseDatabaseMessages''' 关勒浪。",
        "thumbnail-more": "放大",
        "filemissing": "文件寻弗着哉",
        "tooltip-ca-delete": "删脱箇页",
        "tooltip-ca-move": "移箇页",
        "tooltip-ca-watch": "畀箇页加进你侬个关注表里",
-       "tooltip-ca-unwatch": "畀箇页从关注表里删脱",
+       "tooltip-ca-unwatch": "拿箇只页面从侬个关注表里删脱",
        "tooltip-search": "搜寻{{SITENAME}}",
        "tooltip-search-go": "转到页本确切名称,如果存在",
        "tooltip-search-fulltext": "搜寻包含箇星文本个页面",
        "tooltip-n-portal": "有关箇计划,啥好做,应该哪能做",
        "tooltip-n-currentevents": "查寻当前事件个背景信息",
        "tooltip-n-recentchanges": "列出wiki里箇阶段个变化",
-       "tooltip-n-randompage": "打开随机页面",
+       "tooltip-n-randompage": "随机打开只页面",
        "tooltip-n-help": "寻求帮助",
        "tooltip-t-whatlinkshere": "列出全部搭箇页链个页",
        "tooltip-t-recentchangeslinked": "箇页链出去个全部页箇阶段变化",
        "tooltip-ca-nstab-main": "望内容页",
        "tooltip-ca-nstab-user": "查看用户页",
        "tooltip-ca-nstab-media": "查看媒体页",
-       "tooltip-ca-nstab-special": "箇是特殊页,你侬呒处编",
+       "tooltip-ca-nstab-special": "箇是特殊页面,弗能编辑",
        "tooltip-ca-nstab-project": "望项目页",
        "tooltip-ca-nstab-image": "望文件页",
        "tooltip-ca-nstab-mediawiki": "查看系统讯息",
        "tooltip-preview": "望望相你侬个修改,保存之前用!",
        "tooltip-diff": "显示你侬对文本个修改",
        "tooltip-compareselectedversions": "查看本页面两只选定个修订版个差异。",
-       "tooltip-watch": "畀箇页加到你侬个关注表里",
+       "tooltip-watch": "拿箇页加到侬个关注表里",
        "tooltip-rollback": "揿一记“回转”就回退到上一位贡献者个编辑状态",
        "tooltip-undo": "“撤销”可以恢复该编辑并且垃拉预览模式下头打开编辑表单。渠允许垃拉摘要里向说明原因。",
        "tooltip-summary": "打进短摘要",
        "interlanguage-link-title": "̩$1 - $2",
-       "anonymous": "{{SITENAME}}浪个匿名用户",
+       "anonymous": "{{SITENAME}}上个匿名{{PLURAL:$1|用户}}",
        "simpleantispam-label": "反垃圾检查。\n<strong>覅</strong>加进伊个!",
        "pageinfo-toolboxlink": "页面信息",
        "deletedrevision": "拨删脱个旧修订 $1",
        "newimages": "新文件陈列室",
        "ilsubmit": "搜寻",
        "hours": "$1个钟头",
+       "days": "$1日天",
        "hours-ago": "$1个钟头前",
        "bad_image_list": "格式如下:\n\n只列出项目(线开始* )的审议。\n第一个环节上线必须是一个链接到一个坏文件。\n其后的任何链接在同一行被认为是例外情况,即网页的文件,则可能会发生内部。",
        "variantname-zh-tw": "台湾",
        "confirmemail_body": "用IP地址$1嗰人(呒数是你侬),徕translatewiki.net里一个账号“$2”建起,用你侬个电子信箱地址。\n\n确认记箇账号是弗是你侬嘅,激活translatewiki.net里嗰电子信功能。用浏览器打开下向嗰链接:\n\n$3\n\n假使你侬*朆*注册过箇账号,揿下向嗰链接取消电子信确认:\n\n$5\n\n确认码会到$4过期。",
        "confirmemail_body_changed": "用IP地址$1嗰人,(呒数是你侬)徕{{SITENAME}}里一个账号“$2”建起,用你侬个电子信箱地址。\n\n确认记箇账号是弗是你侬嘅,激活{{SITENAME}}里嗰电子信功能。用浏览器打开下向嗰链接:\n\n$3\n\n假使你侬*朆*注册过箇账号,揿下向嗰链接取消电子信确认:\n\n$5\n\n确认码会到$4过期。",
        "scarytranscludetoolong": "[URL忒长]",
+       "deletedwhileediting": "<strong>警告:</strong>此页拉侬开始编辑之后已经畀删脱!",
        "confirmrecreate": "用户[[User:$1|$1]] ([[User talk:$1|讲张]])勒拉倷开始编辑该页面之后拿俚删脱,理由是: : ''$2'' 请拿定章程,倷阿是真个要重建该页面。",
        "confirm_purge_button": "确定",
        "comma-separator": "、",
        "table_pager_last": "阿末一页",
        "table_pager_limit": "显示 $1 条每页",
        "autoredircomment": "重定向页面至[[$1]]",
-       "autosumm-new": "新页面:$1",
+       "autosumm-new": "新页面:“$1”",
        "watchlistedit-normal-title": "编辑监视列表",
        "watchlisttools-view": "望相关修改",
-       "watchlisttools-edit": "æ\9c\9bæ\90­ç¼\96关注表",
+       "watchlisttools-edit": "æ\9f¥ç\9c\8b并ç¼\96è¾\91关注表",
        "watchlisttools-raw": "编写原始关注表",
        "signature": "[[{{ns:user}}:$1|$2]]([[{{ns:user_talk}}:$1|讨论]])",
        "version": "版本",
        "tag-list-wrapper": "([[Special:Tags|$1个标签]]:$2)",
        "tags-active-yes": "好",
        "tags-active-no": "弗",
-       "dberr-info-hidden": "(數據庫服務器連弗上)",
+       "dberr-info-hidden": "(連弗上數據庫)",
        "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3",
        "revdelete-restricted": "已将限制应用到管理员",
        "revdelete-unrestricted": "已移除对管理员个限制",
index 2f86d45..52cc1e8 100644 (file)
@@ -23,6 +23,7 @@
        "tog-hideminor": "באַהאַלטן מינערדיקע רעדאַקטירונגען אין לעצטע ענדערונגען",
        "tog-hidepatrolled": "באַהאַלטן פאַטראלירטע רעדאַקטירונגען אין לעצטע ענדערונגען",
        "tog-newpageshidepatrolled": "באַהאַלטן פאַטראלירטע בלעטער פון דער ליסטע פון נײַע בלעטער",
+       "tog-hidecategorization": "באהאלטן קאעגאריזירן בלעטער",
        "tog-extendwatchlist": "פארברייטערן די אויפפאסן ליסטע צו צייגן אלע פאסנדע ענדערונגען (אנדערשט: בלויז די לעצטע ענדערונג פון יעדן בלאט)",
        "tog-usenewrc": "גרופירן ענדערונגען לויטן בלאט אין \"לעצטע ענדערונגען\" און אויפֿפאסן ליסטע",
        "tog-numberheadings": "נומערירן קעפּלעך אויטאָמאַטיש",
@@ -52,6 +53,7 @@
        "tog-watchlisthideliu": "באהאלטן רעדאקטירונגען פון איינלאגירטע באניצערס פון דער אויפֿפאסונג ליסטע",
        "tog-watchlisthideanons": "באהאלטן רעדאקטירונגען פון אנאנימע באניצערס פון דער אויפֿפאסונג ליסטע",
        "tog-watchlisthidepatrolled": "באַהאַלטן פאַטראלירטע רעדאַקטירונגען פֿון דער אויפֿפאַסונג ליסטע",
+       "tog-watchlisthidecategorization": "באהאלטן קאעגאריזירן בלעטער",
        "tog-ccmeonemails": "שיק מיר קאפיעס פון בליצבריוו וואס איך שיק צו אנדערע באַניצער",
        "tog-diffonly": "ווייז נישט אינהאלט אונטער די דיפערענץ",
        "tog-showhiddencats": "ווײַזן באהאלטענע קאטעגאריעס",
        "morenotlisted": "די ליסטע איז נישט פֿולשטענדיק.",
        "mypage": "מיין בלאַט",
        "mytalk": "שמועס",
-       "anontalk": "×\93×\90ס ×¨×¢×\93×\9f ×¤×\95×\9f ×\93×¢×\9d IP",
+       "anontalk": "ש×\9e×\95עס",
        "navigation": "נאַוויגאַציע",
        "and": "&#32;און",
        "qbfind": "טרעף",
        "createaccountreason": "אורזאַך:",
        "createacct-reason": "אורזאך",
        "createacct-reason-ph": "פֿארוואס שאפֿט איר נאך א קאנטע",
-       "createacct-captcha": "פארזיכערן קאנטראל",
-       "createacct-imgcaptcha-ph": "קלאפט ארײַן דעם טעקסט איר זעט אויבן",
        "createacct-submit": "שאפֿט אײַער קאנטע",
        "createacct-another-submit": "שאַפֿן קאנטע",
        "createacct-benefit-heading": "{{SITENAME}} איז געמאכט דורך מענטשן ווי איר.",
        "passwordreset-emailtext-ip": "עמעצער (מסתמא איר, פון IP אדרעס $1) האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4). די פאלגנדע באניצער {{PLURAL:$3|קאנטע איז|קאנטעס זענען}}\nפארבונדן מיט דעם ע־פאסט אדרעס:\n\n$2\n\n{{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.\nאיר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,\nאדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,\n קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.",
        "passwordreset-emailtext-user": "באניצער $1 אויף  {{SITENAME}} האט געבעטן צוריקצושטעלן אייער פאסווארט פאר {{SITENAME}} ($4).\nדי פאלגנדע באניצער {{PLURAL:$3|קאנטע איז|קאנטעס זענען}} פארבונדן מיט דעם ע־פאסט אדרעס:\n\n$2\n\n{{PLURAL:$3|דאס פראוויזארישע פאסווארט|די פראוויזארישע פאסווערטער}} וועלן אויסגיין נאך {{PLURAL:$5|איין טאג|$5 טעג}}.\nאיר זאלט אריינלאגירן און קלויבן א נייע פאסווארט אצינד. טאמער א צווייטער האט געשיקט די בקשה,\nאדער ווען איר געדענקט יא אייער פריעריקע פאסווארט, און וויל עס נישט ענדערן,\n קענט איר איגנארירן דעם אנזאג און ניצן ווייטער דאס אלטע פאסווארט.",
        "passwordreset-emailelement": "באַניצער נאָמען: \n$1\n\nפראוויזארישער פּאַראָל: \n$2",
-       "passwordreset-emailsent": "טאמער איז דאס אן איינגעשריבענער ע־פאסט אדרעס פאר אייער קאנטע, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
+       "passwordreset-emailsentemail": "טאמער איז דאס אן איינגעשריבענער ע־פאסט אדרעס פאר אייער קאנטע, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
        "passwordreset-emailsent-capture": "מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.",
        "passwordreset-emailerror-capture": "מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1",
        "changeemail": "ענדערן אדער אראפנעמען ע-פּאָסט אַדרעס",
        "prefs-help-recentchangescount": "כולל לעצטע ענדערונגען, בלאַט היסטאָריעס, און לאָגביכער.",
        "prefs-help-watchlist-token2": "דאס איז דער געהיימער שליסל צום וועבפֿיד פון אײַער אויפֿפאסונג ליסטע.\nיעדער וואס ווייסט אים וועט קענען לייענען אײַער אויפֿפאסונג ליסטע; טוט אים נישט טיילן.\n[[Special:ResetTokens|קליקט דא ווען איר דארפט אים צוריקשטעלן]].",
        "savedprefs": "אייערע פרעפערענצן איז אפגעהיטן געווארן.",
+       "savedrights": "די באניצער־רעכטן פֿון {{GENDER:$1|$1}} זענען געווארן געשפייכלערט.",
        "timezonelegend": "צײַט זאנע:",
        "localtime": "לאקאלע צייט:",
        "timezoneuseserverdefault": "ניצן סערווירער גרונט ($1)",
        "prefs-help-prefershttps": "דער פרעפערענץ וועט ארבעטן ביי אײַער נעקסטער ארײַנלאגירונג.",
        "prefswarning-warning": "איר האט געמאכט ענדערונגען צו אײַערע פרעפערענצן וואס זענען נאך נישט אויפגעהיטן.\nאז איר פארלאזט דעם בלאט אן קליקן ״$1״ וועלן אײַערע פרעפערענצן נישט ווערן דערהײַנטיקט.",
        "prefs-tabs-navigation-hint": "טיפ: איר קענט ניצן די רעכטס און לינקס פייל־קלאווישן צו נאוויגירן צווישן די צינגלעך אין דער צינגלעך־ליסטע.",
-       "email-address-validity-valid": "ע-פּאָסט אַדרעס זעט אויס גילטיק",
-       "email-address-validity-invalid": "לייגט אַרײַן א גילטיקן ע־פאסט אַדרעס",
        "userrights": "באַניצער רעכטן פֿאַרוואַלטערשאפט",
        "userrights-lookup-user": "פֿאַרוואַלטן באניצער גרופעס",
        "userrights-user-editname": "לייגט אריין א באַניצער-נאמען:",
        "rcshowhidemine": "$1 מײַנע רעדאַקטירוננגען",
        "rcshowhidemine-show": "ווײַזן",
        "rcshowhidemine-hide": "באַהאַלטן",
+       "rcshowhidecategorization": "$1 בלאט קאטעגאריזירונג",
+       "rcshowhidecategorization-show": "ווײַזן",
+       "rcshowhidecategorization-hide": "באַהאַלטן",
        "rclinks": "װײַזן די לעצטע $1 ענדערונגען אין די לעצטע $2 טעג.<br />$3",
        "diff": "אונטערשייד",
        "hist": "היסטאריע",
        "wlheader-showupdated": "בלעטער געענדערט זײַט אײַער לעצטן וויזיט זען געוויזן '''דיק'''.",
        "wlnote": "אונטן {{PLURAL:$1|איז די לעצטע ענדערונג|זענען די לעצטע <strong>$1</strong> ענדערונגען}} אין {{PLURAL:$2|דער לעצטער שעה|די לעצטע <strong>$2</strong> שעה'ן}} ביז $3, $4.",
        "wlshowlast": "ווײַזן די לעצטע $1 שעה'ן  $2 טעג",
+       "watchlistall2": "אַלע",
+       "watchlist-hide": "באַהאַלטן",
+       "wlshowtime": "ווײַזן לעצטע:",
+       "wlshowhideminor": "מינערדיקער רעדאקטירונגען",
        "watchlist-options": "אויפֿפאַסן ליסטע ברירות",
        "watching": "אויפפאסענדונג…",
        "unwatching": "נעמט אראפ פון אויפפאסונג ליסטע…",
        "contributions": "{{GENDER:$1|באניצער}} בײַשטײַערונגען",
        "contributions-title": "בײַשטײַערונגען פֿון באַניצער $1",
        "mycontris": "בײַשטײַערונגען",
+       "anoncontribs": "בײַשטײַערונגען",
        "contribsub2": "פֿאַר {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "באניצער קאנטע \"$1\" איז נישט איינגעשריבן.",
        "nocontribs": "נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.",
        "movenosubpage": "דער דאָזיגער בלאַט האט נישט קיין אונטערבלעטער.",
        "movereason": "אורזאַך:",
        "revertmove": "צוריקדרייען",
-       "delete_and_move": "אויסמעקן און באוועגן",
        "delete_and_move_text": "== אויסמעקן פארלאנגט ==\nדער ציל בלאַט \"[[:$1]]\" עקזיסטירט שוין.\nצי ווילט איר אים אויסמעקן כדי צו ערמעגליכן די באוועגונג?",
        "delete_and_move_confirm": "יא, מעק אויס דעם בלאט",
        "delete_and_move_reason": "אויסגעמעקט כדי צו קענען באוועגן פֿון \"[[$1]]\"",
        "htmlform-yes": "יא",
        "htmlform-cloner-create": "צולייגן נאך",
        "htmlform-cloner-delete": "אַראָפּנעמען",
+       "htmlform-title-not-exists": "$1 עקזיסטירט נישט",
        "sqlite-has-fts": "$1 מיט פולן-טעקסט זוכן שטיץ",
        "sqlite-no-fts": "$1 אָן פֿולן-טעקסט זוכן שטיץ",
        "logentry-delete-delete": "$1 {{GENDER:$2|האט אויסגעמעקט}} בלאט $3",
index c187396..db12eef 100644 (file)
@@ -32,6 +32,7 @@
        "tog-hideminor": "最新更改唔顯示細修改",
        "tog-hidepatrolled": "響最近修改度隱藏巡查過嘅編輯",
        "tog-newpageshidepatrolled": "響新頁清單度隱藏巡查過嘅版",
+       "tog-hidecategorization": "隱藏頁面分類",
        "tog-extendwatchlist": "展開監視清單去顯示全部更改,唔係淨係最新嘅",
        "tog-usenewrc": "最近修改同監視清單顯示群組修改",
        "tog-numberheadings": "標題自動編號",
@@ -61,6 +62,7 @@
        "tog-watchlisthideliu": "響監視清單度隱藏登入用戶",
        "tog-watchlisthideanons": "響監視清單度隱藏匿名用戶",
        "tog-watchlisthidepatrolled": "響監視清單度隱藏巡查過嘅編輯",
+       "tog-watchlisthidecategorization": "隱藏頁面分類",
        "tog-ccmeonemails": "喺我寄電郵畀其他人嗰陣,寄返封副本畀我。",
        "tog-diffonly": "響差異下面唔顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏類",
        "viewsource": "睇吓原始碼",
        "viewsource-title": "睇 $1 嘅原碼",
        "actionthrottled": "動作已壓制",
-       "actionthrottledtext": "基於反垃圾嘢嘅考量,你而家響呢段短時間之內限制咗去做呢一個動作,而你已經超過咗個上限。請響幾分鐘之後再試過。",
+       "actionthrottledtext": "基於反濫用嘅考量,你而家響呢段短時間之內限制咗去做呢一個動作,而你已經超過咗個上限。請響幾分鐘之後再試過。",
        "protectedpagetext": "呢一版已經保護咗唔畀改或者做其他動作。",
        "viewsourcetext": "你可以睇吓或者複製呢一頁嘅原始碼。",
        "viewyourtext": "你可以睇同複製呢版入面<strong>由你改</strong>嘅原碼。",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "開過個戶口嘅原因",
-       "createacct-captcha": "安全檢查",
-       "createacct-imgcaptcha-ph": "入你下面見到嘅字",
        "createacct-submit": "開戶口",
        "createacct-another-submit": "開戶口",
        "createacct-benefit-heading": "{{SITENAME}}係由你同其他人貢獻。",
        "passwordreset-emailtext-ip": "有人(可能係閣下自己,來自IP地址$1)請求更改閣下喺{{SITENAME}}($4)嘅密碼。同爾個電子郵件有關聯嘅用戶包括:\n\n$2\n\n{{PLURAL:$3|爾個|爾啲}}臨時密碼會喺{{$5}}日之後失效。\n\n如果係閣下自己請求改密碼嘅,請馬上登錄{{SITENAME}}並且更改密碼。如果閣下諗返起自己個密碼,或者根本無申請過改密碼嘅話,請忽略爾條訊息,繼續用返舊密碼。",
        "passwordreset-emailtext-user": "{{SITENAME}}用戶$1請求更改閣下喺{{SITENAME}}道嘅密碼$4。同爾個電子郵件有關聯嘅用戶包括:\n\n$2\n\n{{PLURAL:$3|爾個|爾啲}}臨時密碼會喺{{$5}}日之後失效。\n\n如果係閣下自己請求改密碼嘅,請馬上登錄{{SITENAME}}並且更改密碼。如果閣下諗返起自己個密碼,或者根本無申請過改密碼嘅話,請忽略爾條訊息,繼續用返舊密碼。",
        "passwordreset-emailelement": "用戶名:\n$1\n\n臨時密碼:\n$2",
-       "passwordreset-emailsent": "密碼重設電郵經已送出。",
+       "passwordreset-emailsentemail": "若果你個戶口有登記電郵,密碼重設電郵經已送出。",
        "passwordreset-emailsent-capture": "密碼重設電郵經已送出,下面有顯示。",
        "passwordreset-emailerror-capture": "密碼重設電郵經已送出,下面有顯示,但送畀{{GENDER:$2|user}}時失敗: $1",
-       "changeemail": "改電郵地址",
-       "changeemail-text": "填呢份表去改戶口電郵地址。你需要入密碼確認改動。",
+       "changeemail": "改或者剷走電郵地址",
+       "changeemail-header": "填好呢份表去改戶口電郵地址。若果你想剷走你戶口個電郵地址,填表時請將電郵地址欄留空。",
+       "changeemail-passwordrequired": "你要入密碼去確認改動。",
        "changeemail-no-info": "你一定要簽到咗去直接入來呢一版。",
        "changeemail-oldemail": "而家個電郵地址:",
        "changeemail-newemail": "新電郵地址:",
+       "changeemail-newemail-help": "若果你想剷走你戶口個電翻地址,請留空呢欄,不過萬一你唔記得密碼,就唔會收到幫你重設密碼嘅電郵。",
        "changeemail-none": "(冇)",
        "changeemail-password": "你{{SITENAME}}個密碼:",
        "changeemail-submit": "轉電郵",
        "sig_tip": "你嘅簽名同埋時間戳",
        "hr_tip": "橫線(請小心用)",
        "summary": "摘要:",
-       "subject": "主é¡\8cï¼\8fæ¨\99é¡\8c:",
+       "subject": "主é¡\8cï¼\9a",
        "minoredit": "呢個係小修改",
        "watchthis": "睇實呢一頁",
        "savearticle": "儲存呢頁",
        "missingsummary": "'''提醒:''' 你未提供編輯摘要。如果你再撳多一下「{{int:savearticle}}」嘅話,咁你儲存嘅編輯就會無摘要。",
        "selfredirect": "<strong>警告:</strong> 你個跳轉彈返去自己度。\n你可能設錯咗跳轉目標,或者改錯咗版。\n如果你再撳多「{{int:savearticle}}」一下,就會照幫你開呢個跳轉。",
        "missingcommenttext": "請輸入一個註解。",
-       "missingcommentheader": "'''提醒:'''你響呢個註解度並無提供一個主題/標題。如果你再撳一次「{{int:savearticle}}」,你嘅編輯就會無題。",
+       "missingcommentheader": "<strong>提醒:</strong>你響呢個註解度並無提供一個主題/標題。如果你再撳一次「{{int:savearticle}}」,你嘅編輯就會無題。",
        "summary-preview": "摘要預覽:",
-       "subject-preview": "標題/頭條預覽:",
+       "subject-preview": "標題預覽:",
        "previewerrortext": "預覽你嘅修改嗰陣出錯。",
        "blockedtitle": "用戶已經封鎖",
        "blockedtext": "你嘅用戶名或者 IP 位址已經被 $1 封咗。\n\n呢次封鎖係由$1所封嘅。當中嘅原因係''$2''。\n\n* 呢次封鎖嘅開始時間係:$8\n* 呢次封鎖嘅到期時間係:$6\n* 對於被封鎖者:$7\n\n你可以聯絡 $1 或者其他嘅[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論呢次封鎖。\n除非你已經響你嘅[[Special:Preferences|戶口喜好設定]]入面設定咗有效嘅電郵地址,否則你係唔可以用「電郵呢個用戶」嘅功能。當設定咗一個有效嘅電郵地址之後,呢個功能係唔會封鎖嘅。\n\n你現時嘅 IP 位址係 $3 ,而個封鎖 ID 係 #$5。 請你喺你嘅查詢都註明以上封鎖嘅資料。",
        "permissionserrors": "權限出錯",
        "permissionserrorstext": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做呢樣嘢:",
        "permissionserrorstext-withaction": "根據下面嘅{{PLURAL:$1|原因|原因}},你並無權限去做$2:",
+       "contentmodelediterror": "你唔改得呢版修訂,因為呢個修訂嘅內容模型係 <code>$1</code> ,而家嘅內容模型係 <code>$2</code>。",
        "recreate-moveddeleted-warn": "'''警告: 你而家重開一版係先前曾經刪除過嘅。'''\n\n你應該要考慮吓繼續編輯呢一版係唔係適合嘅。\n為咗方便起見,呢一版嘅刪除同搬版記錄已經響下面提供:",
        "moveddeleted-notice": "呢一版已經刪咗。\n呢版嘅刪除同搬版日誌響下面提供咗以便參考。",
        "moveddeleted-notice-recent": "唔好意思,呢版啱啱刪走咗(最近24個鐘內)。\n呢版刪版同搬版紀錄喺下低做參考。",
        "showingresultsinrange": "下面顯示由第 <strong>$2</strong> 個到第 <strong>$3</strong> 個入面嘅第 {{PLURAL:$1|<strong>$1</strong> 個結果}}:",
        "search-showingresults": "{{PLURAL:$4|第 <strong>$1</strong>個結果,一共有 <strong>$3</strong> 個|第 <strong>$1 - $2</strong> 個結果,一共有 <strong>$3</strong> 個}}",
        "search-nonefound": "響個查詢度無結果配合。",
+       "search-nonefound-thiswiki": "呢個網站無符合呢個查詢條件嘅結果。",
        "powersearch-legend": "進階搵嘢",
        "powersearch-ns": "喺以下嘅空間名度搵:",
        "powersearch-togglelabel": "检查:",
        "prefs-watchlist-token": "監視清單幣:",
        "prefs-misc": "雜項",
        "prefs-resetpass": "改密碼",
-       "prefs-changeemail": "改電郵地址",
+       "prefs-changeemail": "改或者剷走電郵地址",
        "prefs-setemail": "入電郵地址",
        "prefs-email": "電郵選項",
        "prefs-rendering": "外觀",
        "prefs-help-recentchangescount": "呢個包埋最近修改、頁歷史同埋日誌紀錄。",
        "prefs-help-watchlist-token2": "呢個係網上訂閱你個監視清單嘅密匙。\n任何人只要知道個密匙,就會睇到你個監視清單,所以唔好畀人知。\n如果有需要嘅話,[[Special:ResetTokens|你可以重設佢]]。",
        "savedprefs": "你嘅喜好設定已經儲存。",
+       "savedrights": "儲存咗 {{GENDER:$1|$1}} 嘅用戶權限。",
        "timezonelegend": "時區:",
        "localtime": "本地時間:",
        "timezoneuseserverdefault": "用維基預設值($1)",
        "prefs-help-prefershttps": "呢項喜好設定會喺你下次簽到先至開始生效。",
        "prefswarning-warning": "你改嘅喜好設定改動重未記低。\n如果你未撳「$1」就走咗,你嘅喜好設定唔會有更新。",
        "prefs-tabs-navigation-hint": "貼士:可以用鍵盤嘅←或→掣睇一覽內嘅分頁",
-       "email-address-validity-valid": "電郵地址睇嚟有效",
-       "email-address-validity-invalid": "請打一個有效嘅電郵地址",
        "userrights": "用戶權限管理",
        "userrights-lookup-user": "管理用戶組",
        "userrights-user-editname": "輸入一個用戶名:",
        "right-sendemail": "寄電郵畀其他用戶",
        "right-passwordreset": "檢查密碼/重設電郵",
        "right-managechangetags": "從數據庫度開或刪走[[Special:Tags|tags]]",
+       "right-applychangetags": "套用[[Special:Tags|標籤]]到某個人嘅改動",
        "newuserlogpage": "使用者開戶記錄",
        "newuserlogpagetext": "呢個係一個使用者開戶嘅日誌",
        "rightslog": "用戶權限日誌",
        "action-viewmywatchlist": "睇監視清單",
        "action-viewmyprivateinfo": "睇你嘅私人資料",
        "action-editmyprivateinfo": "改你嘅私人資料",
+       "action-editcontentmodel": "改頁面內容模型",
        "action-managechangetags": "從數據庫開或刪走啲符",
+       "action-applychangetags": "套用標籤到你嘅改動",
        "nchanges": "$1次更改",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|你上次嚟之後}}有 $1 個",
        "enhancedrc-history": "歷史",
        "recentchanges-label-plusminus": "頁面位元組大細變化",
        "recentchanges-legend-heading": "'''標記:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (睇埋[[Special:NewPages|新開版]])",
+       "recentchanges-submit": "顯示",
        "rcnotefrom": "下面嘅{{PLURAL:$5|改動}}由 <strong>$3 $4</strong> 開始(顯示到'''$1''')。",
        "rclistfrom": "顯示由$3 $2嘅新更改",
        "rcshowhideminor": "$1小編輯",
        "rcshowhidemine": "$1我嘅編輯",
        "rcshowhidemine-show": "顯示",
        "rcshowhidemine-hide": "收埋",
+       "rcshowhidecategorization": "$1 頁面分類",
+       "rcshowhidecategorization-show": "顯示",
+       "rcshowhidecategorization-hide": "收埋",
        "rclinks": "顯示最後$1次喺$2日內嘅更改<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "recentchangeslinked-summary": "呢一個特別頁列示咗''由''所畀到嘅一版連結到頁嘅最近更改(或者係指定分類嘅成員)。\n響[[Special:Watchlist|你張監視清單]]嘅版會以'''粗體'''顯示。",
        "recentchangeslinked-page": "頁名:",
        "recentchangeslinked-to": "顯示連到所畀到嘅版",
+       "recentchanges-page-added-to-category": "[[:$1]] 加咗落分類",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] 同另外 {{PLURAL:$2|1 版|$2 版}}加咗落分類",
+       "recentchanges-page-removed-from-category": "[[:$1]] 拎走咗分類",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] 同另外 {{PLURAL:$2|1 版|$2 版}}拎走咗分類",
+       "autochange-username": "MediaWiki 自動改動",
        "upload": "上載檔案",
        "uploadbtn": "上載檔案",
        "reuploaddesc": "取消上載再返到去上載表格",
        "upload-dialog-button-done": "搞掂",
        "upload-dialog-button-save": "儲存",
        "upload-dialog-button-upload": "上載",
-       "upload-process-error": "出錯",
-       "upload-process-warning": "警告",
        "upload-form-label-select-file": "揀檔案",
        "upload-form-label-infoform-title": "細節",
        "upload-form-label-infoform-name": "名",
        "upload-form-label-infoform-description": "描述",
        "upload-form-label-usage-title": "用法",
        "upload-form-label-usage-filename": "文件名",
+       "foreign-structured-upload-form-label-own-work": "呢個係我自己嘅作品",
+       "foreign-structured-upload-form-label-infoform-categories": "分類",
+       "foreign-structured-upload-form-label-infoform-date": "日子",
        "backend-fail-stream": "傳送唔到檔案「$1」。",
        "backend-fail-backup": "檔案 \"$1\" 唔備份得。",
        "backend-fail-notexists": "檔案$1唔存在。",
        "mostinterwikis": "有最多跨維基連結嘅頁面",
        "mostrevisions": "有最多修改嘅頁面",
        "prefixindex": "全部頁嘅前綴",
+       "prefixindex-submit": "顯示",
        "shortpages": "短頁",
        "longpages": "長頁",
        "deadendpages": "掘頭頁",
        "protectedpages-performer": "保護用戶",
        "protectedpages-params": "保護參數",
        "protectedpages-reason": "原因",
+       "protectedpages-submit": "顯示頁面",
        "protectedpages-unknown-timestamp": "唔知",
        "protectedpages-unknown-performer": "未知嘅用戶",
        "protectedtitles": "保護咗嘅標題",
        "protectedtitlesempty": "響呢啲參數之下並無標題保護住。",
+       "protectedtitles-submit": "顯示標題",
        "listusers": "用戶一覽",
        "listusers-editsonly": "只顯示有編輯嘅用戶",
        "listusers-creationsort": "按建立日期排序",
        "activeusers-hidebots": "隱藏機械人",
        "activeusers-hidesysops": "隱藏管理員",
        "activeusers-noresult": "搵唔到用戶。",
+       "activeusers-submit": "顯示活躍用戶",
        "listgrouprights": "用戶組權限",
        "listgrouprights-summary": "下面係一個響呢個wiki定義咗嘅用戶權限一覽,同埋佢哋嘅存取權。\n更多有關個別權限嘅[[{{MediaWiki:Listgrouprights-helppage}}|更多細節]]可以響嗰度搵到。",
        "listgrouprights-key": "說明:\n* <span class=\"listgrouprights-granted\">畀咗嘅權限</span>\n* <span class=\"listgrouprights-revoked\">拎咗嘅權限</span>",
        "wlheader-showupdated": "標'''粗體字'''嘅頁響你上次嚟之後畀人改過。",
        "wlnote": "下面係直到$3 $4為止,最近'''$2'''個鐘之內嘅最新$1次修改。",
        "wlshowlast": "顯示最近 $1 個鐘 $2 日",
+       "watchlistall2": "全部",
+       "watchlist-hide": "收埋",
+       "watchlist-submit": "顯示",
+       "wlshowtime": "顯示最後:",
+       "wlshowhideminor": "細編輯",
+       "wlshowhidebots": "機械人",
+       "wlshowhideliu": "註冊用戶",
+       "wlshowhideanons": "匿名用戶",
+       "wlshowhidepatr": "巡過嘅編輯",
+       "wlshowhidemine": "我嘅編輯",
        "watchlist-options": "監視清單選項",
        "watching": "監視緊...",
        "unwatching": "唔再監視緊...",
        "deletepage": "刪除頁面",
        "confirm": "確認",
        "excontent": "內容係:「$1」",
-       "excontentauthor": "內容係:「$1」 (而且唯一嘅貢獻者係「[[Special:Contributions/$2|$2]]」)",
+       "excontentauthor": "內容係:「$1」,而且唯一嘅貢獻者係「[[Special:Contributions/$2|$2]]」([[User talk:$2|talk]])",
        "exbeforeblank": "喺清空之前嘅內容係:「$1」",
        "delete-confirm": "刪除\"$1\"",
        "delete-legend": "刪除",
        "contributions": "{{GENDER:$1|用戶}}貢獻",
        "contributions-title": "$1嘅用戶貢獻",
        "mycontris": "個人貢獻",
+       "anoncontribs": "貢獻",
        "contribsub2": "{{GENDER:$3|$1}}嘅貢獻 ($2)",
        "contributions-userdoesnotexist": "用戶「$1」未有註冊。",
        "nocontribs": "搵唔到符合呢啲條件嘅修改。",
        "whatlinkshere-hidelinks": "$1連結",
        "whatlinkshere-hideimages": "$1檔案連結",
        "whatlinkshere-filters": "過濾器",
+       "whatlinkshere-submit": "去",
        "autoblockid": "自動封鎖 #$1",
        "block": "封鎖用戶",
        "unblock": "解封用戶",
        "move-page-legend": "搬頁",
        "movepagetext": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n你可以自動噉更新指到原先標題嘅跳轉。\n如果你揀咗唔去做嘅話,請務必要檢查吓有冇[[Special:DoubleRedirects|雙重跳轉]]或者[[Special:BrokenRedirects|死跳轉]](嘅情況發生)。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n<strong>警告!</strong>\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
        "movepagetext-noredirectfixer": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n請肯定檢查清楚[[Special:DoubleRedirects|雙重]]或者[[Special:BrokenRedirects|死跳轉]]。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n'''警告!'''\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
-       "movepagetalktext": "相應嘅討論頁會連同佢一齊自動搬過去,'''除非''':\n*新嘅頁面名下面已經有咗一個非空嘅討論頁,又或者\n*你唔剔下面個框。\n\n喺呢啲情況下,需要嘅話你唯有手動搬同合併個頁。",
+       "movepagetalktext": "若果你剔呢格,相應嘅討論頁會連同佢一齊自動搬過去,除非新嘅頁面名下面已經有咗一個唔係空嘅討論頁。\n\n喺呢啲情況下,需要嘅話你唯有手動搬同合併個頁。",
        "moveuserpage-warning": "'''警告:'''你將會搬一個用戶版。請留意嗰版搬咗之後個用戶係''唔會''改名。",
        "movenologintext": "你要係註冊用戶而且要[[Special:UserLogin|登入]]咗先可以搬頁",
        "movenotallowed": "你並無權限去搬版。",
        "movenotallowedfile": "你並無權限去搬檔。",
        "cant-move-user-page": "你並無權限去搬用戶版(佢嘅細版之外)。",
        "cant-move-to-user-page": "你並無權限去搬到一個用戶版(佢嘅細版之外)。",
-       "newtitle": "到新標題:",
+       "cant-move-category-page": "你無權去搬分類頁。",
+       "cant-move-to-category-page": "你無權去搬一版去分類頁。",
+       "newtitle": "新標題:",
        "move-watch": "睇實來源同埋目標版",
        "movepagebtn": "搬頁",
        "pagemovedsub": "搬頁成功",
        "movenosubpage": "呢版無細頁。",
        "movereason": "原因",
        "revertmove": "恢復",
-       "delete_and_move": "刪除並移動",
        "delete_and_move_text": "==需要刪除==\n\n目標頁「[[:$1]]」已經存在。你要唔要刪咗佢空個位出嚟畀個搬文動作?",
        "delete_and_move_confirm": "好,刪咗嗰個頁面",
        "delete_and_move_reason": "已經刪咗「[[$1]]」嚟畀位畀個搬文動作",
        "exif-copyrightowner": "版權人",
        "exif-pngfilecomment": "PNG文件註",
        "exif-disclaimer": "免責聲明",
+       "exif-contentwarning": "內容警告",
        "exif-giffilecomment": "GIF文件註",
        "exif-intellectualgenre": "項類",
        "exif-subjectnewscode": "項碼",
index dca2e5a..5857c5c 100644 (file)
        "tog-watchlisthidebots": "隐藏监视列表中的机器人编辑",
        "tog-watchlisthideminor": "隐藏监视列表中的小编辑",
        "tog-watchlisthideliu": "隐藏监视列表中的登录用户的编辑",
+       "tog-watchlistreloadautomatically": "当一条过滤器规则被更改时,自动重新加载监视列表(需要JavaScript)",
        "tog-watchlisthideanons": "隐藏监视列表中的匿名用户的编辑",
        "tog-watchlisthidepatrolled": "隐藏监视列表中的已巡查编辑",
        "tog-watchlisthidecategorization": "隐藏对页面的分类",
        "morenotlisted": "本列表不完整。",
        "mypage": "页面",
        "mytalk": "讨论",
-       "anontalk": "该IPå\9c°å\9d\80ç\9a\84讨论",
+       "anontalk": "讨论",
        "navigation": "导航",
        "and": "和",
        "qbfind": "查找",
        "databaseerror-query": "查询:$1",
        "databaseerror-function": "函数:$1",
        "databaseerror-error": "错误:$1",
+       "transaction-duration-limit-exceeded": "因为写入时间($1)超过了$2秒的限制,为防止创建大量复制延迟,此次处理已被中止。如果您正在同时更改很多项目,请尝试进行多次小规模操作。",
        "laggedslavemode": "'''警告:'''页面中可能没有包含最近的更新。",
        "readonly": "数据库被锁定",
        "enterlockreason": "请输入锁定的原因,这包括预计解除锁定的时间",
        "missingarticle-rev": "(版本#:$1)",
        "missingarticle-diff": "(差异:$1,$2)",
        "readonly_lag": "附属数据库服务器正在将缓存更新到主服务器上,数据库已被自动锁定",
+       "nonwrite-api-promise-error": "“Promise-Non-Write-API-Action”HTTP报头已发送,但请求是一个API编写模块。",
        "internalerror": "内部错误",
        "internalerror_info": "内部错误:$1",
        "internalerror-fatal-exception": "类型“$1”的致命错误",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您为什么要创建另一个账户",
-       "createacct-captcha": "安全检查",
-       "createacct-imgcaptcha-ph": "请输入上图中的文字",
        "createacct-submit": "创建您的账户",
        "createacct-another-submit": "创建账户",
        "createacct-benefit-heading": "{{SITENAME}}是由同你一样的人们构筑的。",
        "wrongpasswordempty": "密码输入为空。请重试。",
        "passwordtooshort": "您的密码至少需要$1个字符。",
        "passwordtoolong": "密码不能超过{{PLURAL:$1|$1个字符}}。",
+       "passwordtoopopular": "不能使用普遍选择的密码。请选择一个更独一无二的密码。",
        "password-name-match": "您的密码必须和您的用户名不相同。",
        "password-login-forbidden": "这个用户名称及密码的使用是被禁止的。",
        "mailmypassword": "重置密码",
        "passwordreset-emailtext-ip": "有人(可能是您,来自IP地址$1)请求重设{{SITENAME}}($4)上相关账户的密码。以下$3个账户与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
        "passwordreset-emailtext-user": "用户$1请求重设{{SITENAME}}($4)上您的账户的密码。{{PLURAL:$3|以下账户|此账户}}与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
        "passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
-       "passwordreset-emailsent": "如果您的账户有一个已注册的电子邮件地址的话,将发送一封密码重置邮件。",
+       "passwordreset-emailsentemail": "如果您的账户有一个已注册的电子邮件地址的话,将发送一封密码重置邮件。",
+       "passwordreset-emailsentusername": "如果有对应注册的电子邮件地址的话,将发送一封密码重置邮件。",
        "passwordreset-emailsent-capture": "密码重设电子邮件已发送,并在下面显示。",
        "passwordreset-emailerror-capture": "重置密码邮件已生成,但是无法向{{GENDER:$2|下列用户}} 发送:$1",
        "changeemail": "更改或移除电子邮件地址",
        "userpage-userdoesnotexist": "用户账户“$1”没有注册。请在创建/编辑本页前检查。",
        "userpage-userdoesnotexist-view": "用户账户“$1”没有被注册。",
        "blocked-notice-logextract": "这位用户目前已被封禁。以下提供最近的封禁日志以供参考:",
-       "clearyourcache": "'''注意:'''在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* '''Firefox/Safari:'''按住“Shift”的同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)\n* '''Google Chrome:'''按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)\n* '''Internet Explorer:'''按住“Ctrl”的同时单击“刷新”,或按“Ctrl-F5”\n* '''Opera:'''在“工具→首选项”中清除缓存",
+       "clearyourcache": "<strong>注意:</strong>在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。\n* <strong>Firefox或Safari:</strong>按住“Shift”的同时单击“刷新”,或按“Ctrl-F5”或“Ctrl-R”(Mac为“⌘-R”)\n* <strong>Google Chrome:</strong>按“Ctrl-Shift-R”(Mac为“⌘-Shift-R”)\n* <strong>Internet Explorer:</strong>按住“Ctrl”的同时单击“刷新”,或按“Ctrl-F5”\n* <strong>Opera:</strong>在“工具→首选项”中清除缓存",
        "usercssyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 CSS 。",
        "userjsyoucanpreview": "<strong>提示:</strong>在保存前请用“{{int:showpreview}}”按钮来测试您新的 JavaScript 。",
        "usercsspreview": "'''请记住你现在只是在预览你的用户CSS。它尚未保存!'''",
        "showingresultsinrange": "下面显示区间#<strong>$2</strong>至#<strong>$3</strong>的<strong>$1</strong>条结果。",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong>条结果中的<strong>$1</strong>条|<strong>$3</strong>条结果中的<strong>$1~$2</strong>条}}",
        "search-nonefound": "找不到和查询相匹配的结果。",
+       "search-nonefound-thiswiki": "在此网站找不到匹配查询的结果。",
        "powersearch-legend": "高级搜索",
        "powersearch-ns": "搜索名字空间:",
        "powersearch-togglelabel": "选择:",
        "prefs-help-prefershttps": "该设置将在下次登录时生效。",
        "prefswarning-warning": "您对您的参数设置的更改尚未保存。如果您不点击“$1”就离开,您的设置就不会更新。",
        "prefs-tabs-navigation-hint": "提示:您可以通过左、右箭头键在选项卡之间切换。",
-       "email-address-validity-valid": "电子邮件地址有效",
-       "email-address-validity-invalid": "请输入有效的电子邮件地址",
        "userrights": "用户权限管理",
        "userrights-lookup-user": "管理用户组",
        "userrights-user-editname": "输入用户名:",
        "recentchanges-legend-heading": "'''说明:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}(见[[Special:NewPages|新页面列表]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
+       "recentchanges-submit": "显示",
        "rcnotefrom": "下面{{PLURAL:$5|是}}<strong>$3 $4</strong>之后的更改(最多显示<strong>$1</strong>个)。",
        "rclistfrom": "显示$3 $2之后的新更改",
        "rcshowhideminor": "$1小编辑",
        "mostrevisions": "有最多版本的页面",
        "prefixindex": "所有有前缀的页面",
        "prefixindex-namespace": "所有有前缀的页面($1名字空间)",
+       "prefixindex-submit": "显示",
        "prefixindex-strip": "在列表中除去前缀",
        "shortpages": "短页面",
        "longpages": "长页面",
        "protectedpages-performer": "保护用户",
        "protectedpages-params": "保护参数",
        "protectedpages-reason": "原因",
+       "protectedpages-submit": "显示页面",
        "protectedpages-unknown-timestamp": "未知",
        "protectedpages-unknown-performer": "未知用户",
        "protectedtitles": "受保护标题",
        "protectedtitles-summary": "本页面列出当前限制创建的标题。要浏览受限制页面的列表,请参见[[{{#special:ProtectedPages}}|{{int:protectedpages}}]]。",
        "protectedtitlesempty": "在这些参数之下并无标题正在保护。",
+       "protectedtitles-submit": "显示标题",
        "listusers": "用户列表",
        "listusers-editsonly": "只显示有编辑的用户",
        "listusers-creationsort": "按创建日期排序",
        "usereditcount": "$1次编辑",
        "usercreated": "{{GENDER:$3|创建}}于$1 $2",
        "newpages": "新页面",
+       "newpages-submit": "显示",
        "newpages-username": "用户名:",
        "ancientpages": "最老页面",
        "move": "移动",
        "specialloguserlabel": "执行者:",
        "speciallogtitlelabel": "目标(标题,或对于用户使用{{ns:user}}:用户名):",
        "log": "日志",
+       "logeventslist-submit": "显示",
        "all-logs-page": "所有公开日志",
        "alllogstext": "所有{{SITENAME}}公开日志的联合展示。您可以通过选择日志类型、输入用户名(区分大小写)或相关页面(区分大小写)筛选日志条目。",
        "logempty": "在日志中不存在匹配项。",
        "cachedspecial-viewing-cached-ts": "您正浏览此页的缓存版本,不一定是最新的完整版本。",
        "cachedspecial-refresh-now": "查看最新的。",
        "categories": "分类",
+       "categories-submit": "显示",
        "categoriespagetext": "以下{{PLURAL:$1|分类包含}}页面或媒体文件。[[Special:UnusedCategories|未使用分类]]不在这里显示。另请见[[Special:WantedCategories|需要的分类]]。",
        "categoriesfrom": "显示分类开始于:",
        "special-categories-sort-count": "按数量排列",
        "activeusers-hidebots": "隐藏机器人",
        "activeusers-hidesysops": "隐藏管理员",
        "activeusers-noresult": "找不到用户。",
+       "activeusers-submit": "显示活跃用户",
        "listgrouprights": "用户组权限",
        "listgrouprights-summary": "以下是在本wiki定义的用户组及它们的相关访问权限的列表。可能有关于单个权限的[[{{MediaWiki:Listgrouprights-helppage}}|附加信息]]。",
        "listgrouprights-key": "说明:\n* <span class=\"listgrouprights-granted\">被授予的权限</span>\n* <span class=\"listgrouprights-revoked\">被取消的权限</span>",
        "wlheader-showupdated": "您上次访问后发生更改的页面<strong>加粗</strong>显示。",
        "wlnote": "下面是{{PLURAL:$2|过去<strong>$2</strong>小时}}的{{PLURAL:$1|最后<strong>$1</strong>个更改}},截至$3 $4。",
        "wlshowlast": "显示过去$1小时$2天",
+       "watchlistall2": "所有",
+       "watchlist-hide": "隐藏",
+       "watchlist-submit": "显示",
+       "wlshowtime": "显示时段:",
+       "wlshowhideminor": "小编辑",
+       "wlshowhidebots": "机器人",
+       "wlshowhideliu": "注册用户",
+       "wlshowhideanons": "匿名用户",
+       "wlshowhidepatr": "已巡查的编辑",
+       "wlshowhidemine": "我的编辑",
        "watchlist-options": "监视列表选项",
        "watching": "正在监视...",
        "unwatching": "正在取消监视...",
        "delete-confirm": "删除“$1”",
        "delete-legend": "删除",
        "historywarning": "<strong>警告:</strong>您将要删除的页面有约$1次{{PLURAL:$1|修订}}的历史:",
+       "historyaction-submit": "显示",
        "confirmdeletetext": "您即将删除一个页面或图像以及其历史。\n请确定您要进行此项操作,并且了解其后果,同时您的行为符合[[{{MediaWiki:Policy-url}}]]。",
        "actioncomplete": "操作完成",
        "actionfailed": "操作失败",
        "contributions": "{{GENDER:$1|用户}}贡献",
        "contributions-title": "$1的用户贡献",
        "mycontris": "贡献",
+       "anoncontribs": "贡献",
        "contribsub2": "{{GENDER:$3|$1}}的贡献($2)",
        "contributions-userdoesnotexist": "用户“$1”尚未注册。",
        "nocontribs": "没有找到匹配这些规则的更改。",
        "whatlinkshere-hidelinks": "$1链接",
        "whatlinkshere-hideimages": "$1文件链接",
        "whatlinkshere-filters": "过滤器",
+       "whatlinkshere-submit": "提交",
        "autoblockid": "自动封禁#$1",
        "block": "封禁用户",
        "unblock": "解封用户",
        "movenosubpage": "这个页面没有子页面。",
        "movereason": "原因:",
        "revertmove": "恢复",
-       "delete_and_move": "删除并移动",
        "delete_and_move_text": "== 需要删除 ==\n\n目标页面“[[:$1]]”已存在。是否确认删除该页面以便进行移动?",
        "delete_and_move_confirm": "是,删除该页面",
        "delete_and_move_reason": "删除以便移动[[$1]]",
        "tooltip-pt-preferences": "你的设置",
        "tooltip-pt-watchlist": "你正在监视更改的页面的列表",
        "tooltip-pt-mycontris": "你的贡献的列表",
+       "tooltip-pt-anoncontribs": "来自此IP地址的编辑列表",
        "tooltip-pt-login": "我们鼓励您登录;然而,这不是强制性的",
        "tooltip-pt-logout": "退出登录",
        "tooltip-pt-createaccount": "建议您创建一个账户并登录,但这不是强制的",
        "exif-compression-6": "JPEG(旧)",
        "exif-copyrighted-true": "受版权保护",
        "exif-copyrighted-false": "版权状态未设定",
+       "exif-photometricinterpretation-1": "黑白(黑为0)",
        "exif-unknowndate": "未知日期",
        "exif-orientation-1": "标准",
        "exif-orientation-2": "水平翻转",
        "autosumm-newblank": "创建空白页面",
        "size-bytes": "$1字节",
        "lag-warn-normal": "过去$1秒内的更改未必会在这个列表中显示。",
-       "lag-warn-high": "由于数据库的过度延迟,过去$1秒的更改未必会在这个列表中显示。",
+       "lag-warn-high": "由于数据库的过度延迟,$1秒内的更改未必会在这个列表中显示。",
        "watchlistedit-normal-title": "编辑监视列表",
        "watchlistedit-normal-legend": "从监视列表移除标题",
        "watchlistedit-normal-explain": "您的监视列表中的标题显示在下方。要移除标题,请勾选它旁边的复选框,然后点击“{{int:Watchlistedit-normal-submit}}”。您也可以[[Special:EditWatchlist/raw|编辑原始列表]]。",
        "htmlform-cloner-required": "至少一个值是必需的。",
        "htmlform-title-badnamespace": "[[:$1]]不在“{{ns:$2}}”名字空间中。",
        "htmlform-title-not-creatable": "“$1”不是一个可创建的页面标题",
-       "htmlform-title-not-exists": "[[:$1]]不存在",
+       "htmlform-title-not-exists": "$1不存在",
        "htmlform-user-not-exists": "<strong>$1</strong>不存在。",
        "htmlform-user-not-valid": "<strong>$1</strong>不是一个有效的用户名。",
        "sqlite-has-fts": "带全文搜索的版本$1",
        "logentry-suppress-block": "$1{{GENDER:$2|封禁了}}{{GENDER:$4|$3}},持续时间$5 $6",
        "logentry-suppress-reblock": "$1将{{GENDER:$4|$3}}的封禁设置{{GENDER:$2|更改为}}持续时间$5 $6",
        "logentry-import-upload": "$1通过上传{{GENDER:$2|导入}}了$3",
+       "logentry-import-upload-details": "$1通过文件上传{{GENDER:$2|导入了}}$3($4次{{PLURAL:$4|修订}})",
        "logentry-import-interwiki": "$1从其他wiki{{GENDER:$2|导入}}了$3",
+       "logentry-import-interwiki-details": "$1从$5{{GENDER:$2|导入了}}$3($4次{{PLURAL:$4|修订}})",
        "logentry-merge-merge": "$1将$3{{GENDER:$2|合并}}至$4(修订版本至$5)",
        "logentry-move-move": "$1{{GENDER:$2|移动}}页面$3至$4",
        "logentry-move-move-noredirect": "$1{{GENDER:$2|移动}}页面$3至$4,不留重定向",
        "feedback-submit": "提交",
        "feedback-terms": "我理解我的用户代理信息包括有关我确切使用的浏览器和操作系统版本,并将在我的反馈旁公开分享。",
        "feedback-termsofuse": "我同意依照使用条款提供反馈。",
-       "feedback-thanks": "谢谢!的反馈已发布至页面“[$2 $1]”。",
+       "feedback-thanks": "谢谢!的反馈已发布至页面“[$2 $1]”。",
        "feedback-thanks-title": "谢谢您!",
        "feedback-useragent": "用户代理:",
        "searchsuggest-search": "搜索",
index 94b1513..6797eb0 100644 (file)
                        "Macofe",
                        "578985s",
                        "Matma Rex",
-                       "范"
+                       "范",
+                       "Jasonzhuocn",
+                       "Bowleerin"
                ]
        },
        "tog-underline": "底線標示連結:",
-       "tog-hideminor": "隱藏近期變更中的小修訂",
-       "tog-hidepatrolled": "隱藏近期變更中巡查過的編輯",
+       "tog-hideminor": "隱藏最近變更中的小修訂",
+       "tog-hidepatrolled": "隱藏最近變更中巡查過的編輯",
        "tog-newpageshidepatrolled": "隱藏新頁面清單中巡查過的頁面",
+       "tog-hidecategorization": "隱藏頁面分類",
        "tog-extendwatchlist": "展開監視清單顯示包含最近以外的所有變更",
-       "tog-usenewrc": "依近期變更與監視清單的頁面分類顯示變更",
+       "tog-usenewrc": "依最近變更與監視清單的頁面分類顯示變更",
        "tog-numberheadings": "標題自動編號",
        "tog-showtoolbar": "顯示編輯工具列",
        "tog-editondblclick": "開啟滑鼠雙擊編輯頁面",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "tog-watchlisthideanons": "隱藏監視清單中匿名使用者的編輯",
        "tog-watchlisthidepatrolled": "隱藏監視清單中已巡查的編輯",
+       "tog-watchlisthidecategorization": "隱藏頁面分類",
        "tog-ccmeonemails": "我給他人寄出郵件時,也寄出一份副本到我的電子郵件信箱",
        "tog-diffonly": "比對差異時下方不顯示頁面內容",
        "tog-showhiddencats": "顯示隱藏分類",
        "morenotlisted": "此清單尚未讀取完畢。",
        "mypage": "頁面",
        "mytalk": "對話",
-       "anontalk": "此 IP 位址的對話頁面",
+       "anontalk": "對話",
        "navigation": "導覽",
        "and": "&#32;和&#32;",
        "qbfind": "尋找",
        "aboutpage": "Project:關於",
        "copyright": "除非額外說明,否則本站內容均使用 $1 授權條款。",
        "copyrightpage": "{{ns:project}}:版權",
-       "currentevents": "æ\9c\80æ\96°動態",
+       "currentevents": "æ\96°è\81\9e動態",
        "currentevents-url": "Project:Current events",
        "disclaimers": "免責聲明",
        "disclaimerpage": "Project:一般免責聲明",
        "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": "昇冪排序",
        "nstab-main": "頁面",
        "viewsourcetext": "您可以檢視並複製此頁面的原始碼。",
        "viewyourtext": "您可以檢視並複製此頁面中<strong>您編輯</strong>的原始碼。",
        "protectedinterface": "本頁用來提供此 Wiki 軟體介面上的文字,並且已被設為保護以防止惡意修改。\n如欲增加或修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
-       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來作為軟體介面使用。\n更改此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。",
+       "editinginterface": "<strong>警告:</strong>您正在編輯的頁面文字是用來作為軟體介面使用。\n變更此頁面將會影響其他使用者在此 Wiki 上看到的使用者介面。",
        "translateinterface": "如欲修改 Wiki 的翻譯,請至 [//translatewiki.net/ translatewiki.net] 上的 MediaWiki 在地化專案。",
        "cascadeprotected": "此頁面被保護無法編輯,因為此頁面被以下開啟 \"連鎖保護\" 選項的{{PLURAL:$1|一頁|數頁}}保護頁面引用:\n$2",
        "namespaceprotected": "您沒有權限編輯 <strong>$1</strong> 命名空間的頁面。",
        "createaccountreason": "原因:",
        "createacct-reason": "原因",
        "createacct-reason-ph": "您為什麼要建立另一個帳號",
-       "createacct-captcha": "安全驗證",
-       "createacct-imgcaptcha-ph": "輸入您在上方看到的文字",
        "createacct-submit": "建立您的帳號",
        "createacct-another-submit": "建立帳號",
        "createacct-benefit-heading": "{{SITENAME}} 是由像您一樣貢獻的人所建立的。",
        "noemailprefs": "在您的偏好設定中設定電子郵件地址,讓您可以使用這些功能。",
        "emailconfirmlink": "確認您的電子郵件地址",
        "invalidemailaddress": "無法接受格式不正確的電子郵件地址,請輸入正確的電子郵件地址格式或略過填寫該欄位。",
-       "cannotchangeemail": "此 Wiki 不允許更改帳號的電子郵件地址。",
+       "cannotchangeemail": "此 Wiki 禁止變更帳號的電子郵件地址。",
        "emaildisabled": "此網站不能傳送電子郵件。",
        "accountcreated": "已建立帳號",
        "accountcreatedtext": "使用者帳號 [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|對話]]) 已建立。",
        "resetpass-no-info": "您必須直接登入存取這個頁面。",
        "resetpass-submit-loggedin": "變更密碼",
        "resetpass-submit-cancel": "取消",
-       "resetpass-wrong-oldpass": "無效的臨時或現有密碼。\n您可能早已成功地更改了您的密碼,或者已經請求一個新的臨時密碼。",
+       "resetpass-wrong-oldpass": "無效的臨時或現有密碼。\n您可能早已成功地變更了密碼,或者已經請求一個新的臨時密碼。",
        "resetpass-recycled": "請重設您的密碼為一個與目前不同的密碼。",
        "resetpass-temp-emailed": "您使用臨時電子郵件傳送的代碼登入。\n要完成登入,您必須在這裡設定一個新密碼:",
        "resetpass-temp-password": "臨時密碼:",
        "passwordreset-emailtext-ip": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailtext-user": "使用者 $1 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件位址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略此訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
-       "passwordreset-emailsent": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
+       "passwordreset-emailsentemail": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsent-capture": "已寄出重設密碼的電子郵件,並於下方顯示。",
        "passwordreset-emailerror-capture": "下列為重設密碼的電子郵件內容,傳送給{{GENDER:$2|使用者}}失敗:$1",
        "changeemail": "變更或移除電子郵件地址",
-       "changeemail-header": "變更帳號的電子郵箱地址",
+       "changeemail-header": "請填寫此表單來變更您的電子郵件地址,若您想要移除您帳號所連結的所有電子郵件地址,請於新電子郵件地址欄位留空。",
+       "changeemail-passwordrequired": "您須要輸入您的密碼來確認此次變更。",
        "changeemail-no-info": "您必須登入方可直接存取此頁面。",
        "changeemail-oldemail": "目前的電子郵件地址:",
        "changeemail-newemail": "新的電子郵件地址:",
        "missingsummary": "<strong>提醒:</strong>您未填寫編輯摘要。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過摘要直接儲存您的編輯。",
        "selfredirect": "<strong>警告:</strong> 您正建立連結至自己的重新導向。\n您可能指定錯要重新導向的目標頁面或者編輯錯頁面。\n若您再點選 \"{{int:savearticle}}\" 一次,將會繼續建立重新導向。",
        "missingcommenttext": "請在下方輸入評論。",
-       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨/標題。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
+       "missingcommentheader": "<strong>提醒:</strong>您未填寫此評論的主旨。\n若您再點選 \"{{int:savearticle}}\" 一次,將略過主旨/標題直接儲存您的評論。",
        "summary-preview": "摘要預覽:",
        "subject-preview": "主旨預覽:",
        "previewerrortext": "嘗試預覽您的變更時發生錯誤。",
        "nosuchsectiontext": "您嘗試編輯的章節並不存在。\n可能在您檢視頁面時已經移動或刪除。",
        "loginreqtitle": "需要登入",
        "loginreqlink": "登入",
-       "loginreqpagetext": "您必須 $1 才能檢視其頁面。",
+       "loginreqpagetext": "您必須 $1 才能檢視其頁面。",
        "accmailtitle": "密碼已寄出",
        "accmailtext": "[[User talk:$1|$1]] 的隨機密碼已經寄送至 $2,可登入後至 <em>[[Special:ChangePassword|變更密碼]] 頁面更改</em>。",
        "newarticle": "(新)",
        "userpage-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。\n若您要建立/編輯此頁面,請先檢查是否正確。",
        "userpage-userdoesnotexist-view": "使用者帳號 \"$1\" 尚未註冊。",
        "blocked-notice-logextract": "此使用者目前已被封鎖。\n以下為最近的封鎖紀錄以供參考:",
-       "clearyourcache": "<strong>注意:</strong>在您儲存之後您必須清除瀏覽器快取才可看到最新的變。\n* <strong>Firefox / Safari:</strong>按住 <em>Shift</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em> 或 <em>Ctrl-R</em> (Mac 則為 <em>⌘-R</em>) \n* <strong>Google Chrome:</strong>按 <em>Ctrl-Shift-R</em> (Mac 則為 <em>⌘-Shift-R</em>) \n* <strong>Internet Explorer:</strong>按住 <em>Ctrl</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em>\n* <strong>Opera:</strong>進入 <em>工具 → 偏好設定</em> 中清除快取。",
+       "clearyourcache": "<strong>注意:</strong>在您儲存之後您必須清除瀏覽器快取才可看到最新的變。\n* <strong>Firefox / Safari:</strong>按住 <em>Shift</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em> 或 <em>Ctrl-R</em> (Mac 則為 <em>⌘-R</em>) \n* <strong>Google Chrome:</strong>按 <em>Ctrl-Shift-R</em> (Mac 則為 <em>⌘-Shift-R</em>) \n* <strong>Internet Explorer:</strong>按住 <em>Ctrl</em> 時點選 <em>重新整理</em>,或按 <em>Ctrl-F5</em>\n* <strong>Opera:</strong>進入 <em>工具 → 偏好設定</em> 中清除快取。",
        "usercssyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 CSS 。",
        "userjsyoucanpreview": "<strong>提示:</strong>在儲存之前使用 \"{{int:showpreview}}\" 按鈕來測試您的新 JavaScript 。",
        "usercsspreview": "<strong>您目前正預覽您的使用者 CSS,CSS 還尚未儲存!</strong>",
        "permissionserrors": "權限錯誤",
        "permissionserrorstext": "由於下列{{PLURAL:$1|原因}},您沒有權限進行目前的動作:",
        "permissionserrorstext-withaction": "由於下列{{PLURAL:$1|原因}},您沒有權限進行 $2 的動作:",
+       "contentmodelediterror": "您無法編輯此修訂,因此修訂使用的內容模型為 <code>$1</code> 而目前使用的頁面內容模型為 <code>$2</code>。",
        "recreate-moveddeleted-warn": "<strong>警告:您正重新建立先前已刪除的頁面。</strong>\n\n您應考慮是否繼續編輯此頁。\n在此提供刪除與移動日誌方便作為參考:",
        "moveddeleted-notice": "此頁面已刪除。\n下方提供此頁面的刪除和移動日誌以便參考。",
        "moveddeleted-notice-recent": "抱歉,此頁面最近被刪除 (24 小時內)。\n以下提供此頁面的刪除與移動日誌做為參考。",
        "revdelete-hide-comment": "編輯摘要",
        "revdelete-hide-user": "編輯者的使用者名稱/IP 位址",
        "revdelete-hide-restricted": "禁止顯示資料給管理者及其他使用者",
-       "revdelete-radio-same": "(請勿更改)",
+       "revdelete-radio-same": "(請勿變更)",
        "revdelete-radio-set": "隱藏",
        "revdelete-radio-unset": "顯示",
        "revdelete-suppress": "禁止向管理者及其他使用者顯示資料",
        "revdelete-failure": "無法更新修訂的顯示設定:\n$1",
        "logdelete-success": "已成功更新日誌的顯示設定。",
        "logdelete-failure": "無法更新日誌的顯示設定:\n$1",
-       "revdel-restore": "更改顯示設定",
+       "revdel-restore": "變更能見度",
        "pagehist": "頁面歷史",
        "deletedhist": "已刪除歷史",
        "revdelete-hide-current": "隱藏於 $1 $2 的項目錯誤:此為目前的修訂,不可隱藏。",
        "showingresultsinrange": "以下顯示從第 <strong>$2</strong> 筆至第 <strong>$3</strong> 筆中的 {{PLURAL:$1|<strong>$1</strong> 筆結果}}:",
        "search-showingresults": "{{PLURAL:$4|第 <strong>$1</strong> 筆結果,共 <strong>$3</strong> 筆|第 <strong>$1 - $2</strong> 筆結果,共 <strong>$3</strong> 筆}}",
        "search-nonefound": "無符合查詢條件的結果。",
+       "search-nonefound-thiswiki": "在本站沒有符合此查詢條件的結果。",
        "powersearch-legend": "進階搜尋",
        "powersearch-ns": "搜尋以下命名空間:",
        "powersearch-togglelabel": "請選擇:",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
        "prefs-personal": "使用者基本資料",
-       "prefs-rc": "近期變更",
+       "prefs-rc": "最近變更",
        "prefs-watchlist": "監視清單",
        "prefs-editwatchlist": "編輯監視清單",
        "prefs-editwatchlist-label": "編輯在您監視清單上的項目:",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "stub-threshold-sample-link": "樣本",
        "stub-threshold-disabled": "已停用",
-       "recentchangesdays": "近期變更顯示的天數:",
+       "recentchangesdays": "最近更改顯示的天數:",
        "recentchangesdays-max": "最多 $1 {{PLURAL:$1|天}}",
        "recentchangescount": "預設顯示的編輯數:",
-       "prefs-help-recentchangescount": "這包含近期變更、頁面歷史以及日誌。",
+       "prefs-help-recentchangescount": "這包含最近更改、頁面歷史以及日誌。",
        "prefs-help-watchlist-token2": "訂閱您的監視清單所需的密鑰。\n任何人只要知道密鑰就能夠讀取您的監視清單,所以請勿任意與它人共享。\n若有需要 [[Special:ResetTokens|您可重設密鑰]]。",
        "savedprefs": "已儲存您的偏好設定。",
+       "savedrights": "已儲存 {{GENDER:$1|$1}} 的使用者權限。",
        "timezonelegend": "時區:",
        "localtime": "當地時間:",
        "timezoneuseserverdefault": "使用 Wiki 預設值 ($1)",
        "prefs-help-prefershttps": "此偏好設定將於您下次登入時生效。",
        "prefswarning-warning": "您對您的偏好設定所做的變更尚未儲存。\n若您未點選 \"$1\" 離開此頁面,將不會更新您的偏好設定。",
        "prefs-tabs-navigation-hint": "提示:您可使用左、右方向鍵切換頁籤。",
-       "email-address-validity-valid": "電子郵件地址有效",
-       "email-address-validity-invalid": "請輸入一個有效的電子郵件地址",
        "userrights": "使用者權限管理",
        "userrights-lookup-user": "管理使用者群組",
        "userrights-user-editname": "請輸入使用者名稱:",
        "grouppage-bot": "{{ns:project}}:機器人",
        "grouppage-sysop": "{{ns:project}}:管理員",
        "grouppage-bureaucrat": "{{ns:project}}:行政員",
-       "grouppage-suppress": "{{ns:project}}:監督",
+       "grouppage-suppress": "{{ns:project}}:監督",
        "right-read": "閱讀頁面",
        "right-edit": "編輯頁面",
        "right-createpage": "建立頁面 (不含討論頁面)",
        "right-importupload": "由檔案上傳匯入頁面",
        "right-patrol": "標示其他人的編輯爲已巡查",
        "right-autopatrol": "將自己的編輯自動標示為已巡查",
-       "right-patrolmarks": "檢視近期變更的巡查標記",
+       "right-patrolmarks": "檢視最近更改的巡查標記",
        "right-unwatchedpages": "檢視未監視的頁面",
        "right-mergehistory": "合併頁面歷史",
        "right-userrights": "編輯所有使用者的權限",
        "nchanges": "$1 次變更",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}已有 $1",
        "enhancedrc-history": "歷史",
-       "recentchanges": "近期變更",
-       "recentchanges-legend": "近期變更選項",
-       "recentchanges-summary": "追蹤 Wiki 中此頁面的近期變更。",
+       "recentchanges": "最近變更",
+       "recentchanges-legend": "最近變更選項",
+       "recentchanges-summary": "追蹤 Wiki 中此頁面的最近更改。",
        "recentchanges-noresult": "於指定時間內沒有符合條件的變更。",
-       "recentchanges-feed-description": "追蹤 Wiki 中此訂閱來源的近期變更。",
+       "recentchanges-feed-description": "追蹤 Wiki 中此訂閱來源的最近更改。",
        "recentchanges-label-newpage": "該編輯建立了新頁面",
        "recentchanges-label-minor": "該編輯是一個小修訂",
        "recentchanges-label-bot": "該編輯由機器人執行",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (請參考[[Special:NewPages|新頁面]])",
        "recentchanges-legend-plusminus": "(<em>±123</em>)",
        "rcnotefrom": "以下{{PLURAL:$5|為}}自 <strong>$3 $4</strong> 以來的變更 (最多顯示 <strong>$1</strong> 筆)。",
-       "rclistfrom": "顯示自 $3 $2 以來的近期變更",
+       "rclistfrom": "顯示自 $3 $2 以來的最近更改",
        "rcshowhideminor": "$1 小修訂",
        "rcshowhideminor-show": "顯示",
        "rcshowhideminor-hide": "隱藏",
        "rcshowhidemine": "$1 我的編輯",
        "rcshowhidemine-show": "顯示",
        "rcshowhidemine-hide": "隱藏",
-       "rclinks": "顯示近期 $2 天內的 $1 次變更。<br />$3",
+       "rcshowhidecategorization": "$1 頁面分類",
+       "rcshowhidecategorization-show": "顯示",
+       "rcshowhidecategorization-hide": "隱藏",
+       "rclinks": "顯示最近 $2 天內的 $1 次更改。<br />$3",
        "diff": "差異",
        "hist": "歷史",
        "hide": "隱藏",
        "upload-options": "上傳選項",
        "watchthisupload": "監視此檔案",
        "filewasdeleted": "先前已有同樣名稱的檔案上傳,後來被刪除。\n您應在上傳此檔案前檢查 $1。",
+       "filename-thumb-name": "此檔名似乎為縮圖檔名,請不要重新上傳縮圖回相同 wiki。 否則請先修正為更具意義的檔案名稱並且去除縮圖的檔名字首。",
        "filename-bad-prefix": "您上傳的檔案名稱以 <strong>\"$1\"</strong> 開頭,是不具任何描述意義的名稱,通常由數位相機自動產生。\n請替您的檔案使用一個更具描述意義的名稱。",
        "upload-success-subj": "成功上傳",
        "upload-success-msg": "您已成功使用 [$2] 上傳檔案,可於此處取得檔案:[[:{{ns:file}}:$1]]",
        "upload-form-label-infoform-description": "描述",
        "upload-form-label-usage-title": "用法",
        "upload-form-label-usage-filename": "檔案名稱",
+       "foreign-structured-upload-form-label-own-work": "這是我的作品",
        "foreign-structured-upload-form-label-infoform-categories": "分類",
        "foreign-structured-upload-form-label-infoform-date": "日期",
+       "foreign-structured-upload-form-label-own-work-message-local": "我確定我上傳的檔案已遵守下列 {{SITENAME}} 的服務條款與授權條款。",
+       "foreign-structured-upload-form-label-not-own-work-message-local": "若您無法同意遵守 {{SITENAME}} 的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-local": "您也可嘗試[[Special:Upload|預設的上傳頁面]]。",
+       "foreign-structured-upload-form-label-own-work-message-default": "我明白我將上傳此檔案到一個共享的儲存庫,我確認已遵守本站的服務條款與授權政策。",
+       "foreign-structured-upload-form-label-not-own-work-message-default": "若您無法同意遵守共享儲存庫的政策上傳檔案,請關閉此對話框並嘗試其他方法。",
+       "foreign-structured-upload-form-label-not-own-work-local-default": "若此檔案可遵守該站的授權政策上傳檔案,您可能會希望直接嘗試使用 [[Special:Upload|{{SITENAME}} 的上傳頁面]]。",
+       "foreign-structured-upload-form-label-own-work-message-shared": "我保証我擁有此檔案的版權,並且不反悔同意使用 [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0] 授權條款發佈此檔案到維基媒體共享資源,並且我同意 [https://wikimediafoundation.org/wiki/Terms_of_Use 使用條款]。",
+       "foreign-structured-upload-form-label-not-own-work-message-shared": "若您並未擁有此檔案的版權,或者您希望使用其他的授權條款發佈此檔案,請考慮使用[https://commons.wikimedia.org/wiki/Special:UploadWizard 通用上傳精靈]。",
+       "foreign-structured-upload-form-label-not-own-work-local-shared": "若該站的授權政策允許上傳此檔案,您可能會希望直接嘗試使用 [[Special:Upload|{{SITENAME}} 的上傳頁面]]。",
        "backend-fail-stream": "無法傳輸檔案 \"$1\"。",
        "backend-fail-backup": "無法備份檔案 \"$1\"。",
        "backend-fail-notexists": "檔案 $1 不存在。",
        "filerevert-legend": "還原檔案",
        "filerevert-intro": "您現正在還原檔案 <strong>[[Media:$1|$1]]</strong> 至 [$4 於 $2 $3 的版本]。",
        "filerevert-comment": "原因:",
-       "filerevert-defaultcomment": "已還原到於 $1 $2 的版本",
+       "filerevert-defaultcomment": "已還原到於 $1 $2 ($3) 的版本",
        "filerevert-submit": "還原",
        "filerevert-success": "<strong>[[Media:$1|$1]]</strong> 已經還原到 [$4 於 $2 $3 的版本]。",
        "filerevert-badversion": "查無此檔案先前於指定時間的本地版本。",
        "nopagetext": "您所指定的目標頁面並不存在。",
        "pager-newer-n": "較新 $1 筆",
        "pager-older-n": "較舊 $1 筆",
-       "suppress": "ç\9b£ç\9d£",
+       "suppress": "ç¦\81æ­¢",
        "querypage-disabled": "此特殊頁面因考量效能問題已被停用。",
        "apihelp": "API 說明",
        "apihelp-no-such-module": "查無模組 \"$1\"。",
        "emailccsubject": "您寄給 $1 的訊息副本:$2",
        "emailsent": "已寄出電子郵件",
        "emailsenttext": "已寄出您的電子郵件訊息。",
-       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能寄給 $2。",
+       "emailuserfooter": "這封電子郵件是由 $1 透過 {{SITENAME}} 的 \"{{int:emailuser}}\" 功能{{GENDER:$1|寄給}} {{GENDER:$1|$2}}。",
        "usermessage-summary": "留訊息至系統。",
        "usermessage-editor": "系統訊息",
        "watchlist": "監視清單",
        "wlheader-showupdated": "在您最後一次檢視過後修改的頁面會以 <strong>粗體</strong> 顯示。",
        "wlnote": "以下為自 $3 $4 之後的 <strong>$2</strong> 小時內所做的 <strong>$1</strong> 次變更。",
        "wlshowlast": "顯示最近 $1 小時 $2 天",
+       "watchlistall2": "全部",
+       "watchlist-hide": "隱藏",
+       "wlshowtime": "顯示最近:",
+       "wlshowhideminor": "小編輯",
+       "wlshowhidebots": "機器人",
+       "wlshowhideliu": "已註冊使用者",
+       "wlshowhideanons": "匿名使用者",
+       "wlshowhidepatr": "已巡查編輯",
+       "wlshowhidemine": "我的編輯",
        "watchlist-options": "監視清單選項",
        "watching": "正在監視...",
        "unwatching": "正在停止監視...",
        "enotif_anon_editor": "匿名使用者 $1",
        "enotif_body": "$WATCHINGUSERNAME 您好,\n\n$PAGEINTRO $NEWPAGE\n\n編輯摘要:$PAGESUMMARY $PAGEMINOREDIT\n\n編輯者聯絡方式:\n信箱:$PAGEEDITOR_EMAIL\n本站:$PAGEEDITOR_WIKI\n\n在您檢視該頁面之前,接下來的變更系統不會再向您發出通知。您也可以在監視清單中重設您所有監視頁面的通知狀態。\n\n{{SITENAME}} 通知系統\n\n--\n更改您的電子郵件通知設定,請至:\n{{canonicalurl:{{#special:Preferences}}}}\n\n更改您的監視清單設定,請至:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n從監視清單中刪除此頁面,請至:\n$UNWATCHURL\n\n回函並取得進一步協助:\n$HELPPAGE",
        "created": "建立了",
-       "changed": "更改",
+       "changed": "變更",
        "deletepage": "刪除頁面",
        "confirm": "確認",
        "excontent": "內容為:\"$1\"",
-       "excontentauthor": "內容為:\"$1\" (且僅有一位貢獻者 \"[[Special:Contributions/$2|$2]]\")",
+       "excontentauthor": "內容為:\"$1\",且僅有一位貢獻者 \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|對話]])",
        "exbeforeblank": "被清空前的內容為:\"$1\"",
        "delete-confirm": "刪除 \"$1\"",
        "delete-legend": "刪除",
        "sessionfailure-title": "連線階段失敗",
        "sessionfailure": "您的登入連線階段似乎有問題,\n為了預防連線階段受到劫持攻擊,此動作已經被取消。\n請返回上一頁,重新讀取該頁面再試一次。",
        "changecontentmodel": "更改頁面的內容模型",
-       "changecontentmodel-legend": "更改內容模型",
+       "changecontentmodel-legend": "變更內容模型",
        "changecontentmodel-title-label": "頁面標題",
        "changecontentmodel-model-label": "新內容模型",
        "changecontentmodel-reason-label": "原因:",
        "contributions": "{{GENDER:$1|使用者}}貢獻",
        "contributions-title": "$1 的使用者貢獻",
        "mycontris": "貢獻",
+       "anoncontribs": "貢獻",
        "contribsub2": "{{GENDER:$3|$1}} 的貢獻 ($2)",
        "contributions-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
        "nocontribs": "沒有找到符合條件的變更。",
        "move-page-legend": "移動頁面",
        "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。\n若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetext-noredirectfixer": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
-       "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
+       "movepagetalktext": "若勾選此方塊,相關的對話頁面會自動與此頁面一起移動至新的位置,除非新的名稱已有一個存在的對話頁面。\n在此情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
        "movecategorypage-warning": "<strong>警告:</strong>您正要移動分類頁面。請注意此操作只會移動頁面,在舊分類中的頁面將<em>不會</em>移動到新的分類。",
        "movenologintext": "您必須是已註冊的使用者並且 [[Special:UserLogin|登入]] 才可移動頁面。",
        "movenosubpage": "此頁面沒有任何子頁面。",
        "movereason": "原因",
        "revertmove": "還原",
-       "delete_and_move": "刪除並移動",
        "delete_and_move_text": "== 需要刪除 ==\n目標頁面 \"[[:$1]]\" 已存在。\n您是否要刪除該頁面以完成移動?",
        "delete_and_move_confirm": "是的,刪除該頁面",
        "delete_and_move_reason": "已刪除讓來自 [[$1]] 頁面可移動",
        "tooltip-n-mainpage": "前往首頁",
        "tooltip-n-mainpage-description": "前往首頁",
        "tooltip-n-portal": "關於本專案、您可以做什麼、哪裡可以找到您需要的事物",
-       "tooltip-n-currentevents": "æ\96¼æ\9c\80æ\96°å\8b\95æ\85\8b中å°\8bæ\89¾è\83\8cæ\99¯è³\87è¨\8a",
-       "tooltip-n-recentchanges": "列出此 Wiki 中的近期變更清單",
+       "tooltip-n-currentevents": "æ\96¼æ\96°è\81\9eäº\8b件中æ\89¾å\88°ç\9b¸é\97\9cè\83\8cæ\99¯è³\87æ\96\99",
+       "tooltip-n-recentchanges": "列出此Wiki中的最近更改清單",
        "tooltip-n-randompage": "隨機進入一個頁面",
        "tooltip-n-help": "尋求協助的地方",
        "tooltip-t-whatlinkshere": "列出所有連結此頁面的頁面",
-       "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的近期變更",
+       "tooltip-t-recentchangeslinked": "此頁面連結到其他頁面的最近更改",
        "tooltip-feed-rss": "此頁面的 RSS 摘要",
        "tooltip-feed-atom": "此頁面的 Atom 摘要",
        "tooltip-t-contributions": "此使用者的貢獻清單",
        "markaspatrolledtext": "標記此頁面為已巡查",
        "markedaspatrolled": "己標記為已巡查",
        "markedaspatrolledtext": "已標記選擇的修訂 [[:$1]] 為已巡查。",
-       "rcpatroldisabled": "近期變更巡查已停用",
+       "rcpatroldisabled": "最近更改巡查已停用",
        "rcpatroldisabledtext": "最新變更巡查的功能目前已停用。",
        "markedaspatrollederror": "無法標記為已巡查",
        "markedaspatrollederrortext": "您需指定要標記為已巡查的修訂。",
        "svg-long-error": "無效的 SVG 檔案:$1",
        "show-big-image": "原始檔案",
        "show-big-image-preview": "預覽大小:$1。",
+       "show-big-image-preview-differ": "此 $2 檔案的 $3 預覽的大小:$1。",
        "show-big-image-other": "其他{{PLURAL:$2||}}解析度:$1。",
        "show-big-image-size": "$1 × $2 像素",
        "file-info-gif-looped": "循環",
        "specialpages-group-maintenance": "維護報表",
        "specialpages-group-other": "其它特殊頁面",
        "specialpages-group-login": "登入 / 建立帳號",
-       "specialpages-group-changes": "近期變更與日誌",
+       "specialpages-group-changes": "最近變更與日誌",
        "specialpages-group-media": "媒體上傳與報表",
        "specialpages-group-users": "使用者與權限",
        "specialpages-group-highuse": "常用頁面",
        "htmlform-int-toohigh": "您所指定的值高於最大值 $1。",
        "htmlform-required": "此值為必填。",
        "htmlform-submit": "送出",
-       "htmlform-reset": "還原更改",
+       "htmlform-reset": "還原變更",
        "htmlform-selectorother-other": "其他",
        "htmlform-no": "否",
        "htmlform-yes": "是",
        "htmlform-cloner-required": "至少必須填寫一筆資料。",
        "htmlform-title-badnamespace": "[[:$1]] 不在 \"{{ns:$2}}\" 命名空間中。",
        "htmlform-title-not-creatable": "\"$1\" 並非可用來建立頁面的標題",
-       "htmlform-title-not-exists": "[[:$1]] 並不存在。",
+       "htmlform-title-not-exists": "$1 並不存在。",
        "htmlform-user-not-exists": "<strong>$1</strong> 並不存在。",
        "htmlform-user-not-valid": "<strong>$1</strong> 不是有效的使用者名稱。",
        "sqlite-has-fts": "$1 且支援全文搜索",
        "logentry-newusers-byemail": "$1 {{GENDER:$2|已建立}}使用者帳號 $3 並且以電子郵件通知密碼",
        "logentry-newusers-autocreate": "已自動{{GENDER:$2|建立}}使用者帳號 $1",
        "logentry-protect-move_prot": "$1 {{GENDER:$2|已移動}}保護設定從 $4 至 $3",
+       "logentry-protect-unprotect": "$1 {{GENDER:$2|已移除}} $3 的保護",
+       "logentry-protect-protect": "$1 {{GENDER:$2|已保護}} $3 $4",
+       "logentry-protect-protect-cascade": "$1 {{GENDER:$2|已保護}} $3 $4 [連鎖]",
+       "logentry-protect-modify": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4",
+       "logentry-protect-modify-cascade": "$1 {{GENDER:$2|已更改}} $3 的保護層級 $4 [連鎖]",
        "logentry-rights-rights": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格由 $4 成為 $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|已更改}} $3 的群組成員資格",
        "logentry-rights-autopromote": "$1 已自動{{GENDER:$2|提升}}從 $4 成為 $5",
        "pagelang-language": "語言",
        "pagelang-use-default": "使用預設語言",
        "pagelang-select-lang": "選擇語言",
-       "right-pagelang": "更改頁面語言",
-       "action-pagelang": "更改頁面語言",
-       "log-name-pagelang": "更改語言日誌",
+       "right-pagelang": "變更頁面語言",
+       "action-pagelang": "變更頁面語言",
+       "log-name-pagelang": "變更語言日誌",
        "log-description-pagelang": "此頁為頁面語言的變更日誌。",
        "logentry-pagelang-pagelang": "$1 {{GENDER:$2|已更改}}頁面 $3 的語言從 $4 到 $5。",
        "default-skin-not-found": "哎呀!您於 <code dir=\"ltr\">$wgDefaultSkin</code> 設定的 Wiki 預設外觀 <code>$1</code> 無法使用。\n\n您的安裝程序應包含以下{{PLURAL:$4|外觀}}。請參考 [https://www.mediawiki.org/wiki/Manual:Skin_configuration 操作手冊:外觀設定] 以取得如何{{PLURAL:$4|開啟外觀並設為預設值}}的資訊。\n\n$2\n\n; 若您才剛安裝完 MediaWiki:\n: 您大概是使用 git 或直接透過原始碼使用其他方法安裝,這種情況是正常的。請嘗試安裝 [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org 的外觀目錄] 中的部份外觀使用以下方式:\n:* 下載 [https://www.mediawiki.org/wiki/Special:MyLanguage/Download tarball 安裝程式],該程式包含數個外觀與擴充套件。您可以複製並貼上至 <code>skins/</code> 目錄。\n:* 自 [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org] 下載個別外觀 tarball。\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins 使用 Git 下載外觀]。\n: 若您是 MediaWiki 的開發人員,這麼做應該不會影響到您的 git 儲存庫。\n\n; 若您才剛升級 MediaWiki:\n: MediaWiki 1.24 與較新的版本不再自動開啟已安裝的外觀 (請參考 [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery 操作手冊:外觀自動搜尋])。您可以將下列{{PLURAL:$5|行}}貼上至 <code>LocalSettings.php</code> 來開啟{{PLURAL:$5|所有}}目前已經安裝的{{PLURAL:$5|外觀}}:\n\n<pre dir=\"ltr\">$3</pre>\n\n; 若您才剛修改 <code>LocalSettings.php</code>:\n: 請再次確認您輸入的外觀名稱是否有誤。",
index 4e6f12b..ec20601 100644 (file)
@@ -360,6 +360,7 @@ $magicWords = array(
        'numberingroup'           => array( 1, 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'          => array( 1, '__STATICREDIRECT__' ),
        'protectionlevel'         => array( 1, 'PROTECTIONLEVEL' ),
+       'protectionexpiry'        => array( 1, 'PROTECTIONEXPIRY' ),
        'cascadingsources'        => array( 1, 'CASCADINGSOURCES' ),
        'formatdate'              => array( 0, 'formatdate', 'dateformat' ),
        'url_path'                => array( 0, 'PATH' ),
index 38265ae..0da2291 100644 (file)
@@ -20,7 +20,6 @@
  * @author Gjue
  * @author Ha98574
  * @author Hoo
- * @author Hym411
  * @author IRTC1015
  * @author ITurtle
  * @author Idh0854
@@ -128,7 +127,7 @@ $specialPageAliases = array(
        'Mostlinkedcategories'      => array( '많이쓰는분류' ),
        'Mostlinkedtemplates'       => array( '많이쓰는틀' ),
        'Mostrevisions'             => array( '역사긴문서' ),
-       'Movepage'                  => array( 'ì\98®ê¸°ê¸°', '문ì\84\9cì\98®ê¸°ê¸°', 'ì\9d´ë\8f\99', '문ì\84\9cì\9d´ë\8f\99' ),
+       'Movepage'                  => array( 'ì\9d´ë\8f\99', '문ì\84\9cì\9d´ë\8f\99', 'ì\98®ê¸°ê¸°', '문ì\84\9cì\98®ê¸°ê¸°' ),
        'Mycontributions'           => array( '내기여', '내기여목록' ),
        'MyLanguage'                => array( '내언어' ),
        'Mypage'                    => array( '내사용자문서' ),
index 988e0b0..d5460f3 100644 (file)
@@ -179,18 +179,6 @@ $magicWords = array(
        'pagesincategory_files'     => array( '0', 'ਫ਼ਾਈਲਾਂ', 'files' ),
 );
 
-$digitTransformTable = array(
-       '0' => '੦', # &#x0a66;
-       '1' => '੧', # &#x0a67;
-       '2' => '੨', # &#x0a68;
-       '3' => '੩', # &#x0a69;
-       '4' => '੪', # &#x0a6a;
-       '5' => '੫', # &#x0a6b;
-       '6' => '੬', # &#x0a6c;
-       '7' => '੭', # &#x0a6d;
-       '8' => '੮', # &#x0a6e;
-       '9' => '੯', # &#x0a6f;
-);
 $linkTrail = '/^([ਁਂਃਅਆਇਈਉਊਏਐਓਔਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਲ਼ਵਸ਼ਸਹ਼ਾਿੀੁੂੇੈੋੌ੍ਖ਼ਗ਼ਜ਼ੜਫ਼ੰੱੲੳa-z]+)(.*)$/sDu';
 
 $digitGroupingPattern = "##,##,###";
index 22f62fe..43c2faf 100644 (file)
--- a/load.php
+++ b/load.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * This file is the entry point for the resource loader.
+ * This file is the entry point for ResourceLoader.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 use MediaWiki\Logger\LoggerFactory;
 
-// Bail on old versions of PHP, or if composer has not been run yet to install
-// dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
-require_once dirname( __FILE__ ) . '/includes/PHPVersionCheck.php';
-wfEntryPointCheck( 'load.php' );
-
 require __DIR__ . '/includes/WebStart.php';
 
 
index 1f70f45..0c89c05 100644 (file)
@@ -132,7 +132,7 @@ CITE_BIB_FILES         =
 #---------------------------------------------------------------------------
 # Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
-QUIET                  = NO
+QUIET                  = YES
 WARNINGS               = YES
 WARN_IF_UNDOCUMENTED   = YES
 WARN_IF_DOC_ERROR      = YES
@@ -322,8 +322,6 @@ MAN_LINKS              = NO
 #---------------------------------------------------------------------------
 GENERATE_XML           = NO
 XML_OUTPUT             = xml
-XML_SCHEMA             =
-XML_DTD                =
 XML_PROGRAMLISTING     = YES
 #---------------------------------------------------------------------------
 # Configuration options related to the DOCBOOK output
index 8dad5dc..7825ce9 100644 (file)
@@ -22,7 +22,9 @@
 
 // Bail on old versions of PHP, or if composer has not been run yet to install
 // dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
+// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
 require_once dirname( __FILE__ ) . '/../includes/PHPVersionCheck.php';
+// @codingStandardsIgnoreEnd
 wfEntryPointCheck( 'cli' );
 
 /**
index 30bb6ad..8d0b1c4 100644 (file)
@@ -90,9 +90,6 @@ installations.
        runJobs.php
        Immediately complete all jobs in the job queue
 
-       showCacheStats.php
-       Show all statistics stored in the cache
-
        undelete.php
        Undelete all revisions of a page
 
diff --git a/maintenance/archives/patch-msg_resource.sql b/maintenance/archives/patch-msg_resource.sql
deleted file mode 100644 (file)
index 9fa05d2..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
--- Table for storing JSON message blobs for the resource loader
-CREATE TABLE /*_*/msg_resource (
-  -- Resource name
-  mr_resource varbinary(255) NOT NULL,
-  -- Language code
-  mr_lang varbinary(32) NOT NULL,
-  -- JSON blob. This is an incomplete JSON object, i.e. without the wrapping {}
-  mr_blob mediumblob NOT NULL,
-  -- Timestamp of last update
-  mr_timestamp binary(14) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource(mr_resource, mr_lang);
-
--- Table for administering which message is contained in which resource
-CREATE TABLE /*_*/msg_resource_links (
-  mrl_resource varbinary(255) NOT NULL,
-  -- Message key
-  mrl_message varbinary(255) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
index 0ed584c..0562333 100644 (file)
@@ -899,11 +899,9 @@ class TextPassDumper extends BackupDumper {
                        } elseif ( $this->state == "page" ) {
                                $this->thisPage .= $data;
                        }
-               }
-               elseif ( $this->lastName == "model" ) {
+               } elseif ( $this->lastName == "model" ) {
                        $this->thisRevModel .= $data;
-               }
-               elseif ( $this->lastName == "format" ) {
+               } elseif ( $this->lastName == "format" ) {
                        $this->thisRevFormat .= $data;
                }
 
diff --git a/maintenance/benchmarks/bench_Wikimedia_base_convert.php b/maintenance/benchmarks/bench_Wikimedia_base_convert.php
new file mode 100644 (file)
index 0000000..810937a
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Benchmark for Wikimedia\base_convert()
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Benchmark
+ * @author Tyler Romeo
+ */
+
+require_once __DIR__ . '/Benchmarker.php';
+
+/**
+ * Maintenance script that benchmarks Wikimedia\base_convert().
+ *
+ * Code exists in vendor repository brought in via composer.
+ *
+ * @ingroup Benchmark
+ */
+class BenchWikimediaBaseConvert extends Benchmarker {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Benchmark for Wikimedia\\base_convert.";
+               $this->addOption( "inbase", "Input base", false, true );
+               $this->addOption( "outbase", "Output base", false, true );
+               $this->addOption( "length", "Size in digits to generate for input", false, true );
+       }
+
+       public function execute() {
+               $inbase = $this->getOption( "inbase", 36 );
+               $outbase = $this->getOption( "outbase", 16 );
+               $length = $this->getOption( "length", 128 );
+               $number = self::makeRandomNumber( $inbase, $length );
+
+               $this->bench( array(
+                       array(
+                               'function' => 'Wikimedia\base_convert',
+                               'args' => array( $number, $inbase, $outbase, 0, true, 'php' )
+                       ),
+                       array(
+                               'function' => 'Wikimedia\base_convert',
+                               'args' => array( $number, $inbase, $outbase, 0, true, 'bcmath' )
+                       ),
+                       array(
+                               'function' => 'Wikimedia\base_convert',
+                               'args' => array( $number, $inbase, $outbase, 0, true, 'gmp' )
+                       ),
+               ) );
+
+               $this->output( $this->getFormattedResults() );
+       }
+
+       protected static function makeRandomNumber( $base, $length ) {
+               $baseChars = "0123456789abcdefghijklmnopqrstuvwxyz";
+               $res = "";
+               for ( $i = 0; $i < $length; $i++ ) {
+                       $res .= $baseChars[mt_rand( 0, $base - 1 )];
+               }
+
+               return $res;
+       }
+}
+
+$maintClass = 'BenchWikimediaBaseConvert';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/benchmarks/bench_wfBaseConvert.php b/maintenance/benchmarks/bench_wfBaseConvert.php
deleted file mode 100644 (file)
index b4be12b..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-/**
- * Benchmark for wfBaseConvert
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Benchmark
- * @author Tyler Romeo
- */
-
-require_once __DIR__ . '/Benchmarker.php';
-
-/**
- * Maintenance script that benchmarks wfBaseConvert().
- *
- * @ingroup Benchmark
- */
-class BenchWfBaseConvert extends Benchmarker {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Benchmark for wfBaseConvert.";
-               $this->addOption( "inbase", "Input base", false, true );
-               $this->addOption( "outbase", "Output base", false, true );
-               $this->addOption( "length", "Size in digits to generate for input", false, true );
-       }
-
-       public function execute() {
-               $inbase = $this->getOption( "inbase", 36 );
-               $outbase = $this->getOption( "outbase", 16 );
-               $length = $this->getOption( "length", 128 );
-               $number = self::makeRandomNumber( $inbase, $length );
-
-               $this->bench( array(
-                       array(
-                               'function' => 'wfBaseConvert',
-                               'args' => array( $number, $inbase, $outbase, 0, true, 'php' )
-                       ),
-                       array(
-                               'function' => 'wfBaseConvert',
-                               'args' => array( $number, $inbase, $outbase, 0, true, 'bcmath' )
-                       ),
-                       array(
-                               'function' => 'wfBaseConvert',
-                               'args' => array( $number, $inbase, $outbase, 0, true, 'gmp' )
-                       ),
-               ) );
-
-               $this->output( $this->getFormattedResults() );
-       }
-
-       protected static function makeRandomNumber( $base, $length ) {
-               $baseChars = "0123456789abcdefghijklmnopqrstuvwxyz";
-               $res = "";
-               for ( $i = 0; $i < $length; $i++ ) {
-                       $res .= $baseChars[mt_rand( 0, $base - 1 )];
-               }
-
-               return $res;
-       }
-}
-
-$maintClass = 'BenchWfBaseConvert';
-require_once RUN_MAINTENANCE_IF_MAIN;
index 42c1eb7..9eca73c 100644 (file)
@@ -63,7 +63,7 @@ class BenchmarkPurge extends Benchmarker {
        private function benchSquid( $urls, $trials = 1 ) {
                $start = microtime( true );
                for ( $i = 0; $i < $trials; $i++ ) {
-                       SquidUpdate::purge( $urls );
+                       CdnCacheUpdate::purge( $urls );
                }
                $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
index 2e252ad..5aaf01f 100644 (file)
@@ -61,7 +61,7 @@ do {
                exit;
        }
 
-       $args = explode( ' ', $line );
+       $args = explode( ' ', $line, 2 );
        $command = array_shift( $args );
 
        // process command
index 915a2c0..1bd0217 100644 (file)
@@ -2,10 +2,6 @@
 /**
  * Clean up broken, unparseable upload filenames.
  *
- * Usage: php cleanupImages.php [--fix]
- * Options:
- *   --fix  Actually clean up titles; otherwise just checks for them
- *
  * Copyright © 2005-2006 Brion Vibber <brion@pobox.com>
  * https://www.mediawiki.org/
  *
index a4e66ca..68f57a3 100644 (file)
@@ -58,33 +58,6 @@ class CleanupRemovedModules extends Maintenance {
                        wfWaitForSlaves();
                } while ( $numRows > 0 );
                $this->output( "done\n" );
-
-               $this->output( "Cleaning up msg_resource table...\n" );
-               $i = 1;
-
-               $mrRes = $dbw->tableName( 'msg_resource' );
-               do {
-                       $where = $moduleList ? "mr_resource NOT IN ($moduleList)" : '1=1';
-                       $dbw->query( "DELETE FROM $mrRes WHERE $where LIMIT $limit", __METHOD__ );
-                       $numRows = $dbw->affectedRows();
-                       $this->output( "Batch $i: $numRows rows\n" );
-                       $i++;
-                       wfWaitForSlaves();
-               } while ( $numRows > 0 );
-               $this->output( "done\n" );
-
-               $this->output( "Cleaning up msg_resource_links table...\n" );
-               $i = 1;
-               $msgResLinks = $dbw->tableName( 'msg_resource_links' );
-               do {
-                       $where = $moduleList ? "mrl_resource NOT IN ($moduleList)" : '1=1';
-                       $dbw->query( "DELETE FROM $msgResLinks WHERE $where LIMIT $limit", __METHOD__ );
-                       $numRows = $dbw->affectedRows();
-                       $this->output( "Batch $i: $numRows rows\n" );
-                       $i++;
-                       wfWaitForSlaves();
-               } while ( $numRows > 0 );
-               $this->output( "done\n" );
        }
 }
 
index 84e3aee..8368c84 100644 (file)
@@ -173,9 +173,3 @@ class TableCleanup extends Maintenance {
        }
 }
 
-class TableCleanupTest extends TableCleanup {
-       function processRow( $row ) {
-               $this->progress( mt_rand( 0, 1 ) );
-       }
-}
-
index 0df9e7f..1eba303 100644 (file)
@@ -2,10 +2,6 @@
 /**
  * Clean up broken, unparseable titles.
  *
- * Usage: php cleanupTitles.php [--fix]
- * Options:
- *   --fix  Actually clean up titles; otherwise just checks for them
- *
  * Copyright © 2005 Brion Vibber <brion@pobox.com>
  * https://www.mediawiki.org/
  *
diff --git a/maintenance/clearCacheStats.php b/maintenance/clearCacheStats.php
deleted file mode 100644 (file)
index 6a96612..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * Removes all statistics tracking from the 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 Maintenance
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Maintenance script to remove all statistics tracking from the cache.
- *
- * @ingroup Maintenance
- */
-class ClearCacheStats extends Maintenance {
-
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "Remove all statistics tracking from the cache";
-       }
-
-       public function execute() {
-               global $wgLocalDatabases, $wgMemc;
-               foreach ( $wgLocalDatabases as $db ) {
-                       $wgMemc->delete( "$db:stats:request_with_session" );
-                       $wgMemc->delete( "$db:stats:request_without_session" );
-                       $wgMemc->delete( "$db:stats:pcache_hit" );
-                       $wgMemc->delete( "$db:stats:pcache_miss_expired" );
-                       $wgMemc->delete( "$db:stats:pcache_miss_absent" );
-                       $wgMemc->delete( "$db:stats:pcache_miss_stub" );
-                       $wgMemc->delete( "$db:stats:image_cache_hit" );
-                       $wgMemc->delete( "$db:stats:image_cache_miss" );
-                       $wgMemc->delete( "$db:stats:image_cache_update" );
-                       $wgMemc->delete( "$db:stats:diff_cache_hit" );
-                       $wgMemc->delete( "$db:stats:diff_cache_miss" );
-                       $wgMemc->delete( "$db:stats:diff_uncacheable" );
-                       $wgMemc->delete( "$db:stats:job-insert" );
-                       $wgMemc->delete( "$db:stats:job-pop" );
-               }
-       }
-}
-
-$maintClass = "ClearCacheStats";
-require_once RUN_MAINTENANCE_IF_MAIN;
index 3e86d8a..608605c 100644 (file)
@@ -41,12 +41,12 @@ class ConvertExtensionToRegistration extends Maintenance {
         */
        protected $promote = array(
                'name',
+               'namemsg',
                'version',
                'author',
                'url',
                'description',
                'descriptionmsg',
-               'namemsg',
                'license-name',
                'type',
        );
@@ -79,7 +79,12 @@ class ConvertExtensionToRegistration extends Maintenance {
                        $$var = array();
                }
                unset( $var );
-               require $this->getArg( 0 );
+               $arg = $this->getArg( 0 );
+               if ( !is_file( $arg ) ) {
+                       $this->error( "$arg is not a file.", true );
+               }
+               require $arg;
+               unset( $arg );
                // Try not to create any local variables before this line
                $vars = get_defined_vars();
                unset( $vars['this'] );
index 861b364..c1a2022 100644 (file)
@@ -106,6 +106,12 @@ class CreateAndPromote extends Maintenance {
                        }
                }
 
+               if ( !$exists ) {
+                       # Insert the account into the database
+                       $user->addToDatabase();
+                       $user->saveSettings();
+               }
+
                if ( $password ) {
                        # Try to set the password
                        try {
@@ -119,12 +125,6 @@ class CreateAndPromote extends Maintenance {
                        }
                }
 
-               if ( !$exists ) {
-                       # Insert the account into the database
-                       $user->addToDatabase();
-                       $user->saveSettings();
-               }
-
                # Promote user
                array_map( array( $user, 'addGroup' ), $promotions );
 
diff --git a/maintenance/createCommonPasswordCdb.php b/maintenance/createCommonPasswordCdb.php
new file mode 100644 (file)
index 0000000..c678712
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+/**
+ * Create serialized/commonpasswords.cdb
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to 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 __DIR__ . '/Maintenance.php';
+
+/**
+ * Maintenance script to create common password cdb database.
+ *
+ * Meant to take a file like
+ * https://github.com/danielmiessler/SecLists/blob/master/Passwords/rockyou.txt?raw=true
+ * as input.
+ * @see serialized/commonpasswords.cdb and PasswordPolicyChecks::checkPopularPasswordBlacklist
+ * @since 1.27
+ * @ingroup Maintenance
+ */
+class GenerateCommonPassword extends Maintenance {
+       public function __construct() {
+               global $IP;
+               parent::__construct();
+               $this->mDescription = "Generate CDB file of common passwords";
+               $this->addOption( 'limit', "Max number of passwords to write", false, true, 'l' );
+               $this->addArg( 'inputfile', 'List of passwords (one per line) to use or - for stdin', true );
+               $this->addArg(
+                       'output',
+                       "Location to write CDB file to (Try $IP/serialized/commonpasswords.cdb)",
+                       true
+               );
+       }
+
+       public function execute() {
+               $limit = (int)$this->getOption( 'limit', PHP_INT_MAX );
+               $langEn = Language::factory( 'en' );
+
+               $infile = $this->getArg( 0 );
+               if ( $infile === '-' ) {
+                       $infile = 'php://stdin';
+               }
+               $outfile = $this->getArg( 1 );
+
+               if ( !is_readable( $infile ) && $infile !== 'php://stdin' ) {
+                       $this->error( "Cannot open input file $infile for reading", 1 );
+               }
+
+               $file = fopen( $infile, 'r' );
+               if ( $file === false ) {
+                       $this->error( "Cannot read input file $infile", 1 );
+               }
+
+               try {
+                       $db = \Cdb\Writer::open( $outfile );
+
+                       $alreadyWritten = array();
+                       $skipped = 0;
+                       for ( $i = 0; ( $i - $skipped ) < $limit; $i++ ) {
+                               if ( feof( $file ) ) {
+                                       break;
+                               }
+                               $rawLine = fgets( $file );
+
+                               if ( $rawLine === false ) {
+                                       $this->error( "Error reading input file" );
+                                       break;
+                               }
+                               if ( substr( $rawLine, -1 ) !== "\n" && !feof( $file ) ) {
+                                       // We're assuming that this just won't happen.
+                                       $this->error( "fgets did not return whole line at $i??" );
+                               }
+                               $line = $langEn->lc( trim( $rawLine ) );
+                               if ( $line === '' ) {
+                                       $this->error( "Line number " . ( $i + 1 ) . " is blank?" );
+                                       $skipped++;
+                                       continue;
+                               }
+                               if ( isset( $alreadyWritten[$line] ) ) {
+                                       $this->output( "Password '$line' already written (line " . ( $i + 1 ) .")\n" );
+                                       $skipped++;
+                                       continue;
+                               }
+                               $alreadyWritten[$line] = true;
+                               $db->set( $line, $i + 1 - $skipped );
+                       }
+                       // All caps, so cannot conflict with potential password
+                       $db->set( '_TOTALENTRIES', $i - $skipped );
+                       $db->close();
+
+                       $this->output( "Successfully wrote " . ( $i - $skipped ) .
+                               " (out of $i) passwords to $outfile\n"
+                       );
+               } catch ( \Cdb\Exception $e ) {
+                       $this->error( "Error writing cdb file: " . $e->getMessage(), 2 );
+               }
+
+       }
+}
+
+$maintClass = "GenerateCommonPassword";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 0925406..f9c61c7 100644 (file)
@@ -60,8 +60,8 @@ class FindHooks extends Maintenance {
        public function execute() {
                global $IP;
 
-               $documented = $this->getHooksFromDoc( $IP . '/docs/hooks.txt' );
-               $potential = array();
+               $documentedHooks = $this->getHooksFromDoc( $IP . '/docs/hooks.txt' );
+               $potentialHooks = array();
                $bad = array();
 
                // TODO: Don't hardcode the list of directories
@@ -117,21 +117,53 @@ class FindHooks extends Maintenance {
                );
 
                foreach ( $pathinc as $dir ) {
-                       $potential = array_merge( $potential, $this->getHooksFromPath( $dir ) );
+                       $potentialHooks = array_merge( $potentialHooks, $this->getHooksFromPath( $dir ) );
                        $bad = array_merge( $bad, $this->getBadHooksFromPath( $dir ) );
                }
 
+               $documented = array_keys( $documentedHooks );
+               $potential = array_keys( $potentialHooks );
                $potential = array_unique( $potential );
                $bad = array_diff( array_unique( $bad ), self::$ignore );
                $todo = array_diff( $potential, $documented, self::$ignore );
                $deprecated = array_diff( $documented, $potential, self::$ignore );
 
+               // Check parameter count and references
+               $badParameterCount = $badParameterReference = array();
+               foreach ( $potentialHooks as $hook => $args ) {
+                       if ( !isset( $documentedHooks[$hook] ) ) {
+                               // Not documented, but that will also be in $todo
+                               continue;
+                       }
+                       $argsDoc = $documentedHooks[$hook];
+                       if ( $args === 'unknown' || $argsDoc === 'unknown' ) {
+                               // Could not get parameter information
+                               continue;
+                       }
+                       if ( count( $argsDoc ) !== count( $args ) ) {
+                               $badParameterCount[] = $hook . ': Doc: ' . count( $argsDoc ) . ' vs. Code: ' . count( $args );
+                       } else {
+                               // Check if & is equal
+                               foreach ( $argsDoc as $index => $argDoc ) {
+                                       $arg = $args[$index];
+                                       if ( ( $arg[0] === '&' ) !== ( $argDoc[0] === '&' ) ) {
+                                               $badParameterReference[] = $hook . ': References different: Doc: ' . $argDoc .
+                                                       ' vs. Code: ' . $arg;
+                                       }
+                               }
+                       }
+               }
+
                // let's show the results:
                $this->printArray( 'Undocumented', $todo );
                $this->printArray( 'Documented and not found', $deprecated );
                $this->printArray( 'Unclear hook calls', $bad );
+               $this->printArray( 'Different parameter count', $badParameterCount );
+               $this->printArray( 'Different parameter reference', $badParameterReference );
 
-               if ( count( $todo ) == 0 && count( $deprecated ) == 0 && count( $bad ) == 0 ) {
+               if ( count( $todo ) == 0 && count( $deprecated ) == 0 && count( $bad ) == 0
+                       && count( $badParameterCount ) == 0 && count( $badParameterReference ) == 0
+               ) {
                        $this->output( "Looks good!\n" );
                } else {
                        $this->error( 'The script finished with errors.', 1 );
@@ -141,7 +173,7 @@ class FindHooks extends Maintenance {
        /**
         * Get the hook documentation, either locally or from MediaWiki.org
         * @param string $doc
-        * @return array Array of documented hooks
+        * @return array Array: key => hook name; value => array of arguments or string 'unknown'
         */
        private function getHooksFromDoc( $doc ) {
                if ( $this->hasOption( 'online' ) ) {
@@ -154,24 +186,41 @@ class FindHooks extends Maintenance {
        /**
         * Get hooks from a local file (for example docs/hooks.txt)
         * @param string $doc Filename to look in
-        * @return array Array of documented hooks
+        * @return array Array: key => hook name; value => array of arguments or string 'unknown'
         */
        private function getHooksFromLocalDoc( $doc ) {
                $m = array();
                $content = file_get_contents( $doc );
-               preg_match_all( "/\n'(.*?)':/", $content, $m );
+               preg_match_all(
+                       "/\n'(.*?)':.*((?:\n.+)*)/",
+                       $content,
+                       $m,
+                       PREG_SET_ORDER
+               );
 
-               return array_unique( $m[1] );
+               // Extract the documented parameter
+               $hooks = array();
+               foreach ( $m as $match ) {
+                       $args = array();
+                       if ( isset( $match[2] ) ) {
+                               $n = array();
+                               if ( preg_match_all( "/\n(&?\\$\w+):.+/", $match[2], $n ) ) {
+                                       $args = $n[1];
+                               }
+                       }
+                       $hooks[$match[1]] = $args;
+               }
+               return $hooks;
        }
 
        /**
         * Get hooks from www.mediawiki.org using the API
-        * @return array Array of documented hooks
+        * @return array Array: key => hook name; value => string 'unknown'
         */
        private function getHooksFromOnlineDoc() {
                $allhooks = $this->getHooksFromOnlineDocCategory( 'MediaWiki_hooks' );
                $removed = $this->getHooksFromOnlineDocCategory( 'Removed_hooks' );
-               return array_diff( $allhooks, $removed );
+               return array_diff_key( $allhooks, $removed );
        }
 
        /**
@@ -198,7 +247,8 @@ class FindHooks extends Maintenance {
                        $data = FormatJson::decode( $json, true );
                        foreach ( $data['query']['categorymembers'] as $page ) {
                                if ( preg_match( '/Manual\:Hooks\/([a-zA-Z0-9- :]+)/', $page['title'], $m ) ) {
-                                       $retval[] = str_replace( ' ', '_', $m[1] );
+                                       // parameters are unknown, because that needs parsing of wikitext
+                                       $retval[str_replace( ' ', '_', $m[1] )] = 'unknown';
                                }
                        }
                        if ( !isset( $data['continue'] ) ) {
@@ -211,24 +261,54 @@ class FindHooks extends Maintenance {
        /**
         * Get hooks from a PHP file
         * @param string $file Full filename to the PHP file.
-        * @return array Array of hooks found
+        * @return array Array: key => hook name; value => array of arguments or string 'unknown'
         */
        private function getHooksFromFile( $file ) {
                $content = file_get_contents( $file );
                $m = array();
                preg_match_all(
-                       '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\(\s*([\'"])(.*?)\1/',
+                       // All functions which runs hooks
+                       '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\s*\(\s*' .
+                               // First argument is the hook name as string
+                               '([\'"])(.*?)\1' .
+                               // Comma for second argument
+                               '(?:\s*(,))?' .
+                               // Second argument must start with array to be processed
+                               '(?:\s*array\s*\(' .
+                               // Matching inside array - allows one deep of brackets
+                               '((?:[^\(\)]|\([^\(\)]*\))*)' .
+                               // End
+                               '\))?/',
                        $content,
-                       $m
+                       $m,
+                       PREG_SET_ORDER
                );
 
-               return $m[2];
+               // Extract parameter
+               $hooks = array();
+               foreach ( $m as $match ) {
+                       $args = array();
+                       if ( isset( $match[4] ) ) {
+                               $n = array();
+                               if ( preg_match_all( '/((?:[^,\(\)]|\([^\(\)]*\))+)/', $match[4], $n ) ) {
+                                       $args = array_map( 'trim', $n[1] );
+                               }
+                       } elseif ( isset( $match[3] ) ) {
+                               // Found a parameter for Hooks::run,
+                               // but could not extract the hooks argument,
+                               // because there are given by a variable
+                               $args = 'unknown';
+                       }
+                       $hooks[$match[2]] = $args;
+               }
+
+               return $hooks;
        }
 
        /**
         * Get hooks from the source code.
         * @param string $path Directory where the include files can be found
-        * @return array Array of hooks found
+        * @return array Array: key => hook name; value => array of arguments or string 'unknown'
         */
        private function getHooksFromPath( $path ) {
                $hooks = array();
diff --git a/maintenance/findOrphanedFiles.php b/maintenance/findOrphanedFiles.php
new file mode 100644 (file)
index 0000000..41650bd
--- /dev/null
@@ -0,0 +1,156 @@
+<?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
+ * @author Aaron Schulz
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+class FindOrphanedFiles extends Maintenance {
+       function __construct() {
+               parent::__construct();
+
+               $this->mDescription = "Find unregistered files in the 'public' repo zone.";
+               $this->addOption( 'subdir',
+                       'Only scan files in this subdirectory (e.g. "a/a0")', false, true );
+               $this->addOption( 'verbose', "Mention file paths checked" );
+               $this->setBatchSize( 500 );
+       }
+
+       function execute() {
+               $subdir = $this->getOption( 'subdir', '' );
+               $verbose = $this->hasOption( 'verbose' );
+
+               $repo = RepoGroup::singleton()->getLocalRepo();
+               if ( $repo->hasSha1Storage() ) {
+                       $this->error( "Local repo uses SHA-1 file storage names; aborting.", 1 );
+               }
+
+               $directory = $repo->getZonePath( 'public' );
+               if ( $subdir != '' ) {
+                       $directory .= "/$subdir/";
+               }
+
+               if ( $verbose ) {
+                       $this->output( "Scanning files under $directory:\n" );
+               }
+
+               $list = $repo->getBackend()->getFileList( array( 'dir' => $directory ) );
+               if ( $list === null ) {
+                       $this->error( "Could not get file listing.", 1 );
+               }
+
+               $pathBatch = array();
+               foreach ( $list as $path ) {
+                       if ( preg_match( '#^(thumb|deleted)/#', $path ) ) {
+                               continue; // handle ugly nested containers on stock installs
+                       }
+
+                       $pathBatch[] = $path;
+                       if ( count( $pathBatch ) >= $this->mBatchSize ) {
+                               $this->checkFiles( $repo, $pathBatch, $verbose );
+                               $pathBatch = array();
+                       }
+               }
+               $this->checkFiles( $repo, $pathBatch, $verbose );
+       }
+
+       protected function checkFiles( LocalRepo $repo, array $paths, $verbose ) {
+               if ( !count( $paths ) ) {
+                       return;
+               }
+
+               $dbr = $repo->getSlaveDB();
+
+               $curNames = array();
+               $oldNames = array();
+               $imgIN = array();
+               $oiWheres = array();
+               foreach ( $paths as $path ) {
+                       $name = basename( $path );
+                       if ( preg_match( '#^archive/#', $path ) ) {
+                               if ( $verbose ) {
+                                       $this->output( "Checking old file $name\n" );
+                               }
+
+                               $oldNames[] = $name;
+                               list( , $base ) = explode( '!', $name, 2 ); // <TS_MW>!<img_name>
+                               $oiWheres[] = $dbr->makeList(
+                                       array( 'oi_name' => $base, 'oi_archive_name' => $name ),
+                                       LIST_AND
+                               );
+                       } else {
+                               if ( $verbose ) {
+                                       $this->output( "Checking current file $name\n" );
+                               }
+
+                               $curNames[] = $name;
+                               $imgIN[] = $name;
+                       }
+               }
+
+               $res = $dbr->query(
+                       $dbr->unionQueries(
+                               array(
+                                       $dbr->selectSQLText(
+                                               'image',
+                                               array( 'name' => 'img_name', 'old' => 0 ),
+                                               $imgIN ? array( 'img_name' => $imgIN ) : '1=0'
+                                       ),
+                                       $dbr->selectSQLText(
+                                               'oldimage',
+                                               array( 'name' => 'oi_archive_name', 'old' => 1 ),
+                                               $oiWheres ? $dbr->makeList( $oiWheres, LIST_OR ) : '1=0'
+                                       )
+                               ),
+                               true // UNION ALL (performance)
+                       ),
+                       __METHOD__
+               );
+
+               $curNamesFound = array();
+               $oldNamesFound = array();
+               foreach ( $res as $row ) {
+                       if ( $row->old ) {
+                               $oldNamesFound[] = $row->name;
+                       } else {
+                               $curNamesFound[] = $row->name;
+                       }
+               }
+
+               foreach ( array_diff( $curNames, $curNamesFound ) as $name ) {
+                       $file = $repo->newFile( $name );
+                       // Print name and public URL to ease recovery
+                       if ( $file ) {
+                               $this->output( $name . "\n" . $file->getCanonicalUrl() . "\n\n" );
+                       } else {
+                               $this->error( "Cannot get URL for bad file title '$name'" );
+                       }
+               }
+
+               foreach ( array_diff( $oldNames, $oldNamesFound ) as $name ) {
+                       list( , $base ) = explode( '!', $name, 2 ); // <TS_MW>!<img_name>
+                       $file = $repo->newFromArchiveName( Title::makeTitle( NS_FILE, $base ), $name );
+                       // Print name and public URL to ease recovery
+                       $this->output( $name . "\n" . $file->getCanonicalUrl() . "\n\n" );
+               }
+       }
+}
+
+$maintClass = 'FindOrphanedFiles';
+require_once RUN_MAINTENANCE_IF_MAIN;
diff --git a/maintenance/fixDefaultJsonContentPages.php b/maintenance/fixDefaultJsonContentPages.php
new file mode 100644 (file)
index 0000000..1265891
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+/**
+ * Fix instances of pre-existing JSON 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 Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Usage:
+ *  fixDefaultJsonContentPages.php
+ *
+ * It is automatically run by update.php
+ */
+class FixDefaultJsonContentPages extends LoggedUpdateMaintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription =
+                               'Fix instances of JSON pages prior to them being the ContentHandler default';
+               $this->setBatchSize( 100 );
+       }
+
+       protected function getUpdateKey() {
+               return __CLASS__;
+       }
+
+       protected function doDBUpdates() {
+               if ( !$this->getConfig()->get( 'ContentHandlerUseDB' ) ) {
+                       $this->output( "\$wgContentHandlerUseDB is not enabled, nothing to do.\n" );
+                       return true;
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $namespaces = array(
+                       NS_MEDIAWIKI => $dbr->buildLike( $dbr->anyString(), '.json' ),
+                       NS_USER => $dbr->buildLike( $dbr->anyString(), '/', $dbr->anyString(), '.json' ),
+               );
+               foreach ( $namespaces as $ns => $like ) {
+                       $lastPage = 0;
+                       do {
+                               $rows = $dbr->select(
+                                               'page',
+                                               array( 'page_id', 'page_title', 'page_namespace', 'page_content_model' ),
+                                               array(
+                                                               'page_namespace' => $ns,
+                                                               'page_title ' . $like,
+                                                               'page_id > ' . $dbr->addQuotes( $lastPage )
+                                               ),
+                                               __METHOD__,
+                                               array( 'ORDER BY' => 'page_id', 'LIMIT' => $this->mBatchSize )
+                               );
+                               foreach ( $rows as $row ) {
+                                       $this->handleRow( $row );
+                               }
+                       } while ( $rows->numRows() >= $this->mBatchSize );
+               }
+
+               return true;
+       }
+
+       protected function handleRow( stdClass $row ) {
+               $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+               $this->output( "Processing {$title} ({$row->page_id})...\n" );
+               $rev = Revision::newFromTitle( $title );
+               $content = $rev->getContent( Revision::RAW );
+               $dbw = wfGetDB( DB_MASTER );
+               if ( $content instanceof JsonContent ) {
+                       if ( $content->isValid() ) {
+                               // Yay, actually JSON. We need to just change the
+                               // page_content_model because revision will automatically
+                               // use the default, which is *now* JSON.
+                               $this->output( "Setting page_content_model to json..." );
+                               $dbw->update(
+                                       'page',
+                                       array( 'page_content_model' => CONTENT_MODEL_JSON ),
+                                       array( 'page_id' => $row->page_id ),
+                                       __METHOD__
+                               );
+                               $this->output( "done.\n" );
+                               wfWaitForSlaves();
+                       } else {
+                               // Not JSON...force it to wikitext. We need to update the
+                               // revision table so that these revisions are always processed
+                               // as wikitext in the future. page_content_model is already
+                               // set to "wikitext".
+                               $this->output( "Setting rev_content_model to wikitext..." );
+                               // Grab all the ids for batching
+                               $ids = $dbw->selectFieldValues(
+                                       'revision',
+                                       'rev_id',
+                                       array( 'rev_page' => $row->page_id ),
+                                       __METHOD__
+                               );
+                               foreach ( array_chunk( $ids, 50 ) as $chunk ) {
+                                       $dbw->update(
+                                               'revision',
+                                               array( 'rev_content_model' => CONTENT_MODEL_WIKITEXT ),
+                                               array( 'rev_page' => $row->page_id, 'rev_id' => $chunk )
+                                       );
+                                       wfWaitForSlaves();
+                               }
+                               $this->output( "done.\n" );
+                       }
+               } else {
+                       $this->output( "not a JSON page? Skipping\n" );
+               }
+       }
+}
+
+$maintClass = 'FixDefaultJsonContentPages';
+require_once RUN_MAINTENANCE_IF_MAIN;
index bf59495..8cea5a2 100644 (file)
@@ -119,7 +119,8 @@ TEXT;
 
        private function getNsIndex( $namespace ) {
                global $wgContLang;
-               if ( ( $result = $wgContLang->getNsIndex( $namespace ) ) !== false ) {
+               $result = $wgContLang->getNsIndex( $namespace );
+               if ( $result !== false ) {
                        return $result;
                }
                $ns = intval( $namespace );
index 0037ea8..ae3074a 100644 (file)
@@ -23,7 +23,9 @@
 
 // Checking for old versions of PHP is done in Maintenance.php
 // We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
+// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
 require_once dirname( __FILE__ ) . '/Maintenance.php';
+// @codingStandardsIgnoreEnd
 
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
 define( 'MEDIAWIKI_INSTALL', true );
@@ -43,7 +45,7 @@ class CommandLineInstaller extends Maintenance {
                global $IP;
 
                $this->addDescription( "CLI-based MediaWiki installation and configuration.\n" .
-                       "Defaut options are indicated in parenthesis." );
+                       "Default options are indicated in parentheses." );
 
                $this->addArg( 'name', 'The name of the wiki (MediaWiki)', false );
 
index ef264c3..41b56f6 100644 (file)
                "name": "Upstream",
                "groups": [
                        {
-                               "name": "OOJS",
-                               "classes": ["OO", "OO.*"]
+                               "name": "OOjs",
+                               "classes": [
+                                       "OO",
+                                       "OO.EmitterList",
+                                       "OO.EventEmitter",
+                                       "OO.Factory",
+                                       "OO.Registry",
+                                       "OO.SortedEmitterList"
+                               ]
+                       },
+                       {
+                               "name": "OOUI",
+                               "classes": [
+                                       "OO.ui",
+                                       "OO.ui.*"
+                               ]
                        },
                        {
                                "name": "jQuery",
diff --git a/maintenance/makeTestEdits.php b/maintenance/makeTestEdits.php
new file mode 100644 (file)
index 0000000..c6569a0
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Make test edits for a user to populate a test 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
+ * @ingroup Maintenance
+ */
+require_once __DIR__ . '/Maintenance.php';
+
+/**
+ * Make test edits for a user to populate a test wiki
+ *
+ * @ingroup Maintenance
+ */
+class MakeTestEdits extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Make test edits for a user";
+               $this->addOption( 'user', 'User name', true, true );
+               $this->addOption( 'count', 'Number of edits', true, true );
+               $this->addOption( 'namespace', 'Namespace number', false, true );
+               $this->setBatchSize( 100 );
+       }
+
+       public function execute() {
+               $user = User::newFromName( $this->getOption( 'user' ) );
+               if ( !$user->getId() ) {
+                       $this->error( "No such user exists.", 1 );
+               }
+
+               $count = $this->getOption( 'count' );
+               $namespace = (int)$this->getOption( 'namespace', 0 );
+
+               for ( $i = 0; $i < $count; ++$i ) {
+                       $title = Title::makeTitleSafe( $namespace, "Page " . wfRandomString( 2 ) );
+                       $page = WikiPage::factory( $title );
+                       $content = ContentHandler::makeContent( wfRandomString(), $title );
+                       $summary = "Change " . wfRandomString( 6 );
+
+                       $page->doEditContent( $content, $summary, 0, false, $user );
+
+                       $this->output( "Edited $title\n" );
+                       if ( $i && ( $i % $this->mBatchSize ) == 0 ) {
+                               wfWaitForSlaves();
+                       }
+               }
+
+               $this->output( "Done\n" );
+       }
+}
+
+$maintClass = "MakeTestEdits";
+require_once RUN_MAINTENANCE_IF_MAIN;
index 7b7b761..6b8487f 100644 (file)
@@ -35,7 +35,7 @@ if ( $help ) {
        mccShowUsage();
        exit( 0 );
 }
-$mcc = new MWMemcached( array(
+$mcc = new MemcachedClient( array(
        'persistent' => true,
        'debug' => $debug,
 ) );
index 5b09ffd..0e58563 100644 (file)
@@ -1224,27 +1224,6 @@ CREATE TABLE /*_*/l10n_cache (
 );
 CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
 
--- Table for caching JSON message texts for the resource loader
-CREATE TABLE /*_*/msg_resource (
-  -- Resource name
-  mr_resource nvarchar(255) NOT NULL,
-  -- Language code
-  mr_lang nvarchar(32) NOT NULL,
-  -- JSON blob
-  mr_blob varbinary(max) NOT NULL,
-  -- Timestamp of last update
-  mr_timestamp varchar(14) NOT NULL
-);
-CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource (mr_resource, mr_lang);
-
--- Table for administering which message is contained in which resource
-CREATE TABLE /*_*/msg_resource_links (
-  mrl_resource varbinary(255) NOT NULL,
-  -- Message key
-  mrl_message varbinary(255) NOT NULL
-);
-CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
-
 -- Table caching which local files a module depends on that aren't
 -- registered directly, used for fast retrieval of file dependency.
 -- Currently only used for tracking images that CSS depends on
index 0cc7bde..ed63c5c 100644 (file)
@@ -2,13 +2,40 @@
 /**
  * Doxygen filter to show correct member variable types in documentation.
  *
- * Should be filled in doxygen INPUT_FILTER as "php mwdoc-filter.php"
+ * Should be set in Doxygen INPUT_FILTER as "php mwdoc-filter.php"
  *
- * Original source code by Goran Rakic
- * http://blog.goranrakic.com/
- * http://stackoverflow.com/questions/4325224
+ * Based on
+ * <http://virtualtee.blogspot.co.uk/2012/03/tip-for-using-doxygen-for-php-code.html>
  *
- * @file
+ * Improved to resolve various bugs and better MediaWiki PHPDoc conventions:
+ *
+ * - Insert variable name after typehint instead of at end of line so that
+ *   documentation text may follow after "@var Type".
+ * - Insert typehint into source code before $variable instead of inside the comment
+ *   so that Doxygen interprets it.
+ * - Strip the text after @var from the output to avoid Doxygen warnings aboug bogus
+ *   symbols being documented but not declared or defined.
+ *
+ * Copyright (C) 2012 Tamas Imrei <tamas.imrei@gmail.com> http://virtualtee.blogspot.com/
+ * Copyright (C) 2015 Timo Tijhof
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  */
 
 if ( PHP_SAPI != 'cli' ) {
@@ -16,33 +43,58 @@ if ( PHP_SAPI != 'cli' ) {
 }
 
 $source = file_get_contents( $argv[1] );
-$regexp = '#'
-       . '\@var'
-       . '\s+'
-       // Type hint
-       . '([^\s]+)'
-       . '\s+'
-       // Any text or line(s) between type hint and '/' closing the comment
-       // (includes the star of "*/"). Descriptions containing a slash
-       // are not supported. Those will have to to be rewritten to have their
-       // description *before* the @var:
-       // /**
-       //  * Description with / in it.
-       //  * @var array
-       //  */
-       // instead of:
-       // /**
-       //  * @var array Description with / in it.
-       //  */
-       . '([^/]+)'
-       . '/'
-       . '\s+'
-       . '(var|public|protected|private)'
-       . '\s+'
-       // Variable name
-       . '(\$[^\s;=]+)'
-       . '#';
-$replac = '${2}/ ${3} ${1} ${4}';
-$source = preg_replace( $regexp, $replac, $source );
+$tokens = token_get_all( $source );
+
+$buffer = $bufferType = null;
+foreach ( $tokens as $token ) {
+       if ( is_string( $token ) ) {
+               if ( $buffer !== null && $token === ';' ) {
+                       // If we still have a buffer and the statement has ended,
+                       // flush it and move on.
+                       echo $buffer;
+                       $buffer = $bufferType = null;
+               }
+               echo $token;
+               continue;
+       }
+       list( $id, $content ) = $token;
+       switch ( $id ) {
+               case T_DOC_COMMENT:
+                       // Escape slashes so that references to namespaces are not
+                       // wrongly interpreted as a Doxygen "\command".
+                       $content = addcslashes( $content, '\\' );
+                       // Look for instances of "@var Type" not followed by $name.
+                       if ( preg_match( '#@var\s+([^\s]+)\s+([^\$]+)#s', $content ) ) {
+                               $buffer = preg_replace_callback(
+                                       // Strip the "@var Type" part and remember the type
+                                       '#(@var\s+)([^\s]+)#s',
+                                       function ( $matches ) use ( &$bufferType ) {
+                                               $bufferType = $matches[2];
+                                               return '';
+                                       },
+                                       $content
+                               );
+                       } else {
+                               echo $content;
+                       }
+                       break;
 
-echo $source;
+               case T_VARIABLE:
+                       if ( $buffer !== null ) {
+                               echo $buffer;
+                               echo "$bufferType $content";
+                               $buffer = $bufferType = null;
+                       } else {
+                               echo $content;
+                       }
+                       break;
+
+               default:
+                       if ( $buffer !== null ) {
+                               $buffer .= $content;
+                       } else {
+                               echo $content;
+                       }
+                       break;
+       }
+}
index 49eae4a..00a15e5 100644 (file)
@@ -86,8 +86,7 @@ class MWDocGen extends Maintenance {
 
                $this->output = $this->getOption( 'output', "$IP/docs" );
 
-               $this->inputFilter = wfShellWikiCmd(
-                       $IP . '/maintenance/mwdoc-filter.php' );
+               $this->inputFilter = wfShellWikiCmd( $IP . '/maintenance/mwdoc-filter.php' );
                $this->template = $IP . '/maintenance/Doxyfile';
                $this->excludes = array(
                        'vendor',
index 184cba8..28176a5 100644 (file)
@@ -390,7 +390,8 @@ class NamespaceConflictChecker extends Maintenance {
                                                $titleField => $row->$titleField,
                                                $fromField => $row->$fromField
                                        ),
-                                       __METHOD__
+                                       __METHOD__,
+                                       array( 'IGNORE' )
                                );
                                $this->output( "$table $logTitle -> " .
                                        $destTitle->getPrefixedDBkey() . "\n" );
index cd99f7c..dfaaf5c 100644 (file)
@@ -56,20 +56,6 @@ CREATE TABLE &mw_prefix.module_deps (
 );
 CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
 
-CREATE TABLE &mw_prefix.msg_resource_links (
-  mrl_resource VARCHAR2(255) NOT NULL,
-  mrl_message VARCHAR2(255) NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.msg_resource_links_u01 ON &mw_prefix.msg_resource_links (mrl_message, mrl_resource);
-
-CREATE TABLE &mw_prefix.msg_resource (
-  mr_resource VARCHAR2(255) NOT NULL,
-  mr_lang varchar2(32) NOT NULL,
-  mr_blob BLOB NOT NULL,
-  mr_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.msg_resource_u01 ON &mw_prefix.msg_resource (mr_resource, mr_lang);
-
 ALTER TABLE &mw_prefix.oldimage MODIFY oi_name DEFAULT 0;
 ALTER TABLE &mw_prefix.oldimage MODIFY oi_size DEFAULT 0;
 ALTER TABLE &mw_prefix.oldimage MODIFY oi_width DEFAULT 0;
index 12f6518..9a70b87 100644 (file)
@@ -87,7 +87,7 @@ CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_name
 
 -- Create a dummy page to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.page
-  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL, NULL);
+  VALUES (0, 0, ' ', NULL, 0, 0, 0, current_timestamp, NULL, 0, 0, NULL, NULL);
 
 /*$mw$*/
 CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
@@ -659,20 +659,6 @@ CREATE TABLE &mw_prefix.l10n_cache (
 );
 CREATE INDEX &mw_prefix.l10n_cache_u01 ON &mw_prefix.l10n_cache (lc_lang, lc_key);
 
-CREATE TABLE &mw_prefix.msg_resource (
-  mr_resource VARCHAR2(255) NOT NULL,
-  mr_lang varchar2(32) NOT NULL,
-  mr_blob BLOB NOT NULL,
-  mr_timestamp TIMESTAMP(6) WITH TIME ZONE NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.msg_resource_u01 ON &mw_prefix.msg_resource (mr_resource, mr_lang);
-
-CREATE TABLE &mw_prefix.msg_resource_links (
-  mrl_resource VARCHAR2(255) NOT NULL,
-  mrl_message VARCHAR2(255) NOT NULL
-);
-CREATE UNIQUE INDEX &mw_prefix.msg_resource_links_u01 ON &mw_prefix.msg_resource_links (mrl_message, mrl_resource);
-
 CREATE TABLE &mw_prefix.module_deps (
   md_module VARCHAR2(255) NOT NULL,
   md_skin VARCHAR2(32) NOT NULL,
index 850a5a5..a3099f9 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-require_once dirname( __FILE__ ) . '/Maintenance.php';
+require_once __DIR__ . '/Maintenance.php';
 
 /**
  * Maintenance script to populate the fa_sha1 field.
diff --git a/maintenance/postgres/archives/patch-msg_resource.sql b/maintenance/postgres/archives/patch-msg_resource.sql
deleted file mode 100644 (file)
index 68756d1..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-CREATE TABLE msg_resource (
-       mr_resource TEXT NOT NULL,
-       mr_lang         TEXT NOT NULL,
-       mr_blob         TEXT NOT NULL,
-       mr_timestamp    TIMESTAMPTZ NOT NULL
-);
-
-CREATE UNIQUE INDEX mr_resource_lang ON msg_resource (mr_resource, mr_lang);
diff --git a/maintenance/postgres/archives/patch-msg_resource_links.sql b/maintenance/postgres/archives/patch-msg_resource_links.sql
deleted file mode 100644 (file)
index 88109da..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-CREATE TABLE msg_resource_links (
-       mrl_resource TEXT NOT NULL,
-       mrl_message TEXT NOT NULL
-);
-
-CREATE UNIQUE INDEX mrl_message_resource ON msg_resource_links (mrl_message, mrl_resource);
index 6076206..ad7bd9d 100644 (file)
@@ -690,20 +690,6 @@ CREATE UNIQUE INDEX iwl_from ON iwlinks (iwl_from, iwl_prefix, iwl_title);
 CREATE UNIQUE INDEX iwl_prefix_title_from ON iwlinks (iwl_prefix, iwl_title, iwl_from);
 CREATE UNIQUE INDEX iwl_prefix_from_title ON iwlinks (iwl_prefix, iwl_from, iwl_title);
 
-CREATE TABLE msg_resource (
-  mr_resource   TEXT         NOT NULL,
-  mr_lang       TEXT         NOT NULL,
-  mr_blob       TEXT         NOT NULL,
-  mr_timestamp  TIMESTAMPTZ  NOT NULL
-);
-CREATE UNIQUE INDEX mr_resource_lang ON msg_resource (mr_resource, mr_lang);
-
-CREATE TABLE msg_resource_links (
-  mrl_resource  TEXT  NOT NULL,
-  mrl_message   TEXT  NOT NULL
-);
-CREATE UNIQUE INDEX mrl_message_resource ON msg_resource_links (mrl_message, mrl_resource);
-
 CREATE TABLE module_deps (
   md_module  TEXT  NOT NULL,
   md_skin    TEXT  NOT NULL,
index 56e22c4..31500c9 100644 (file)
@@ -135,7 +135,7 @@ class PurgeChangedPages extends Maintenance {
                        }
 
                        // Send batch of purge requests out to squids
-                       $squid = new SquidUpdate( $urls, count( $urls ) );
+                       $squid = new CdnCacheUpdate( $urls, count( $urls ) );
                        $squid->doUpdate();
 
                        if ( $this->hasOption( 'sleep-per-batch' ) ) {
index 2e19630..31ea5d0 100644 (file)
@@ -129,7 +129,7 @@ class PurgeList extends Maintenance {
                                if ( $this->hasOption( 'verbose' ) ) {
                                        $this->output( $url . "\n" );
                                }
-                               $u = new SquidUpdate( array( $url ) );
+                               $u = new CdnCacheUpdate( array( $url ) );
                                $u->doUpdate();
                                usleep( $delay * 1e6 );
                        }
@@ -137,7 +137,7 @@ class PurgeList extends Maintenance {
                        if ( $this->hasOption( 'verbose' ) ) {
                                $this->output( implode( "\n", $urls ) . "\n" );
                        }
-                       $u = new SquidUpdate( $urls );
+                       $u = new CdnCacheUpdate( $urls );
                        $u->doUpdate();
                }
        }
index 06e1449..ed16805 100644 (file)
@@ -242,13 +242,8 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__ );
-
                $updates = $content->getSecondaryDataUpdates( $page->getTitle() );
                DataUpdate::runUpdates( $updates );
-
-               $dbw->commit( __METHOD__ );
        }
 
        /**
diff --git a/maintenance/showCacheStats.php b/maintenance/showCacheStats.php
deleted file mode 100644 (file)
index 3d16af1..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-/**
- * Show statistics from the 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 Maintenance
- */
-
-require_once __DIR__ . '/Maintenance.php';
-
-/**
- * Maintenance script that shows statistics from the cache.
- *
- * @ingroup Maintenance
- */
-class ShowCacheStats extends Maintenance {
-
-       public function __construct() {
-               $this->mDescription = "Show statistics from the cache";
-               parent::__construct();
-       }
-
-       public function getDbType() {
-               return Maintenance::DB_NONE;
-       }
-
-       public function execute() {
-               global $wgMemc;
-
-               // Can't do stats if
-               if ( get_class( $wgMemc ) == 'EmptyBagOStuff' ) {
-                       $this->error( "You are running EmptyBagOStuff, I can not provide any statistics.", true );
-               }
-
-               $this->output( "\nParser cache\n" );
-               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_hit' ) ) );
-               $expired = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_expired' ) ) );
-               $absent = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_absent' ) ) );
-               $stub = intval( $wgMemc->get( wfMemcKey( 'stats', 'pcache_miss_stub' ) ) );
-               $total = $hits + $expired + $absent + $stub;
-               if ( $total ) {
-                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf(
-                               "expired:           %-10d %6.2f%%\n",
-                               $expired,
-                               $expired / $total * 100
-                       ) );
-                       $this->output( sprintf(
-                               "absent:            %-10d %6.2f%%\n",
-                               $absent,
-                               $absent / $total * 100
-                       ) );
-                       $this->output( sprintf( "stub threshold:    %-10d %6.2f%%\n", $stub, $stub / $total * 100 ) );
-                       $this->output( sprintf( "total:             %-10d %6.2f%%\n", $total, 100 ) );
-               } else {
-                       $this->output( "no statistics available\n" );
-               }
-
-               $this->output( "\nImage cache\n" );
-               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_hit' ) ) );
-               $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_miss' ) ) );
-               $updates = intval( $wgMemc->get( wfMemcKey( 'stats', 'image_cache_update' ) ) );
-               $total = $hits + $misses;
-               if ( $total ) {
-                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf(
-                               "misses:            %-10d %6.2f%%\n",
-                               $misses,
-                               $misses / $total * 100
-                       ) );
-                       $this->output( sprintf( "updates:           %-10d\n", $updates ) );
-               } else {
-                       $this->output( "no statistics available\n" );
-               }
-
-               $this->output( "\nDiff cache\n" );
-               $hits = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_hit' ) ) );
-               $misses = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_cache_miss' ) ) );
-               $uncacheable = intval( $wgMemc->get( wfMemcKey( 'stats', 'diff_uncacheable' ) ) );
-               $total = $hits + $misses + $uncacheable;
-               if ( $total ) {
-                       $this->output( sprintf( "hits:              %-10d %6.2f%%\n", $hits, $hits / $total * 100 ) );
-                       $this->output( sprintf(
-                               "misses:            %-10d %6.2f%%\n",
-                               $misses,
-                               $misses / $total * 100
-                       ) );
-                       $this->output( sprintf(
-                               "uncacheable:       %-10d %6.2f%%\n",
-                               $uncacheable,
-                               $uncacheable / $total * 100
-                       ) );
-               } else {
-                       $this->output( "no statistics available\n" );
-               }
-       }
-}
-
-$maintClass = "ShowCacheStats";
-require_once RUN_MAINTENANCE_IF_MAIN;
index 638b99d..756f6c0 100644 (file)
@@ -1496,27 +1496,6 @@ CREATE TABLE /*_*/l10n_cache (
 ) /*$wgDBTableOptions*/;
 CREATE INDEX /*i*/lc_lang_key ON /*_*/l10n_cache (lc_lang, lc_key);
 
--- Table for caching JSON message blobs for the resource loader
-CREATE TABLE /*_*/msg_resource (
-  -- Resource name
-  mr_resource varbinary(255) NOT NULL,
-  -- Language code
-  mr_lang varbinary(32) NOT NULL,
-  -- JSON blob
-  mr_blob mediumblob NOT NULL,
-  -- Timestamp of last update
-  mr_timestamp binary(14) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/mr_resource_lang ON /*_*/msg_resource (mr_resource, mr_lang);
-
--- Table for administering which message is contained in which resource
-CREATE TABLE /*_*/msg_resource_links (
-  mrl_resource varbinary(255) NOT NULL,
-  -- Message key
-  mrl_message varbinary(255) NOT NULL
-) /*$wgDBTableOptions*/;
-CREATE UNIQUE INDEX /*i*/mrl_message_resource ON /*_*/msg_resource_links (mrl_message, mrl_resource);
-
 -- Table caching which local files a module depends on that aren't
 -- registered directly, used for fast retrieval of file dependency.
 -- Currently only used for tracking images that CSS depends on
index d67ef6b..c800664 100644 (file)
@@ -71,11 +71,9 @@ class UpdateSpecialPages extends Maintenance {
                        if ( $specialObj instanceof QueryPage ) {
                                $queryPage = $specialObj;
                        } else {
-                               if ( !class_exists( $class ) ) {
-                                       $file = $specialObj->getFile();
-                                       require_once $file;
-                               }
-                               $queryPage = new $class;
+                               $class = get_class( $specialObj );
+                               $this->error( "$class is not an instance of QueryPage.\n", 1 );
+                               die;
                        }
 
                        if ( !$this->hasOption( 'only' ) || $this->getOption( 'only' ) == $queryPage->getName() ) {
index fb637f7..8b2d6e5 100644 (file)
@@ -96,9 +96,9 @@
                $( '#config_wgSitename' ).on( 'keyup change', syncText ).each( syncText );
 
                // Show/Hide memcached servers when needed
-               $( 'input[name$="config_wgMainCacheType"]' ).change( function () {
+               $( 'input[name$="config__MainCacheType"]' ).change( function () {
                        var $memc = $( '#config-memcachewrapper' );
-                       if ( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
+                       if ( $( 'input[name$="config__MainCacheType"]:checked' ).val() === 'memcached' ) {
                                $memc.show( 'slow' );
                        } else {
                                $memc.hide( 'slow' );
index be811dc..31b201c 100644 (file)
@@ -22,7 +22,9 @@
 
 // Bail on old versions of PHP, or if composer has not been run yet to install
 // dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
+// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
 require_once dirname( __FILE__ ) . '/../includes/PHPVersionCheck.php';
+// @codingStandardsIgnoreEnd
 wfEntryPointCheck( 'mw-config/index.php' );
 
 define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
index 3ae7b78..08646d6 100644 (file)
@@ -12,8 +12,8 @@
     "grunt-contrib-copy": "0.8.1",
     "grunt-contrib-jshint": "0.11.3",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-jscs": "2.1.0",
-    "grunt-jsonlint": "1.0.4",
+    "grunt-jscs": "2.5.0",
+    "grunt-jsonlint": "1.0.5",
     "grunt-karma": "0.12.1",
     "karma": "0.13.10",
     "karma-chrome-launcher": "0.2.0",
index f44ee5a..609ea95 100644 (file)
@@ -436,7 +436,9 @@ if ( isset( $_REQUEST['filter'] ) ) {
        }
        $points[] = $s;
 
-       usort( $points, 'compare_point' );
+       // @codingStandardsIgnoreStart
+       @usort( $points, 'compare_point' );
+       // @codingStandardsIgnoreEnd
 
        foreach ( $points as $point ) {
                if ( strlen( $filter ) && !strstr( $point->name(), $filter ) ) {
index 59ce155..c66dcb2 100644 (file)
@@ -826,6 +826,7 @@ return array(
                'scripts' => array(
                        'resources/lib/phpjs-sha1/sha1.js',
                        'resources/src/mediawiki/mediawiki.js',
+                       'resources/src/mediawiki/mediawiki.requestIdleCallback.js',
                        'resources/src/mediawiki/mediawiki.errorLogger.js',
                ),
                'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
@@ -905,12 +906,25 @@ return array(
                        'json',
                ),
        ),
+       'mediawiki.api.user' => array(
+               'scripts' => 'resources/src/mediawiki/api/user.js',
+               'dependencies' => array(
+                       'mediawiki.api',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.api.watch' => array(
                'scripts' => 'resources/src/mediawiki/api/watch.js',
                'dependencies' => array(
                        'mediawiki.api',
                ),
        ),
+       'mediawiki.api.messages' => array(
+               'scripts' => 'resources/src/mediawiki/api/messages.js',
+               'dependencies' => array(
+                       'mediawiki.api',
+               ),
+       ),
        'mediawiki.content.json' => array(
                'position' => 'top',
                'styles' => 'resources/src/mediawiki/mediawiki.content.json.css',
@@ -1058,6 +1072,7 @@ return array(
                'dependencies' => array(
                        'oojs',
                        'mediawiki.api',
+                       'mediawiki.ForeignApi',
                ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
@@ -1171,6 +1186,7 @@ return array(
                ),
                'dependencies' => array(
                        'oojs-ui',
+                       'mediawiki.user',
                        'mediawiki.Upload',
                        'mediawiki.jqueryMsg',
                ),
@@ -1232,19 +1248,19 @@ return array(
                        'filename-bad-prefix',
                        'filename-thumb-name',
                        'badfilename',
-                       'api-error-duplicate-archive',
                        'api-error-blacklisted', // HACK
                ),
        ),
        'mediawiki.ForeignStructuredUpload.BookletLayout' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js',
-               'styles' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css',
+               'styles' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.less',
                'dependencies' => array(
                        'mediawiki.ForeignStructuredUpload',
                        'mediawiki.Upload.BookletLayout',
                        'mediawiki.widgets.CategorySelector',
                        'mediawiki.widgets.DateInputWidget',
                        'mediawiki.jqueryMsg',
+                       'moment',
                ),
                'messages' => array(
                        'foreign-structured-upload-form-label-own-work',
@@ -1259,10 +1275,34 @@ return array(
                        'foreign-structured-upload-form-label-own-work-message-local',
                        'foreign-structured-upload-form-label-not-own-work-message-local',
                        'foreign-structured-upload-form-label-not-own-work-local-local',
+                       'foreign-structured-upload-form-2-label-intro',
+                       'foreign-structured-upload-form-2-label-ownwork',
+                       'foreign-structured-upload-form-2-label-noderiv',
+                       'foreign-structured-upload-form-2-label-useful',
+                       'foreign-structured-upload-form-2-label-ccbysa',
+                       'foreign-structured-upload-form-2-label-alternative',
+                       'foreign-structured-upload-form-2-label-termsofuse',
+                       'foreign-structured-upload-form-3-label-question-website',
+                       'foreign-structured-upload-form-3-label-question-ownwork',
+                       'foreign-structured-upload-form-3-label-question-noderiv',
+                       'foreign-structured-upload-form-3-label-yes',
+                       'foreign-structured-upload-form-3-label-no',
+                       'foreign-structured-upload-form-3-label-alternative',
+                       'foreign-structured-upload-form-4-label-good',
+                       'foreign-structured-upload-form-4-label-bad',
+               ),
+               'templates' => array(
+                       'guide.html' => 'resources/src/mediawiki/bookletlayout/option4/guide.html',
                ),
        ),
        'mediawiki.toc' => array(
                'scripts' => 'resources/src/mediawiki/mediawiki.toc.js',
+               'styles' => array(
+                       'resources/src/mediawiki/mediawiki.toc.css'
+                               => array( 'media' => 'screen' ),
+                       'resources/src/mediawiki/mediawiki.toc.print.css'
+                               => array( 'media' => 'print' ),
+               ),
                'dependencies' => 'mediawiki.cookie',
                'messages' => array( 'showtoc', 'hidetoc' ),
                'targets' => array( 'desktop', 'mobile' ),
@@ -1281,6 +1321,7 @@ return array(
                'dependencies' => array(
                        'mediawiki.cookie',
                        'mediawiki.api',
+                       'mediawiki.api.user',
                        'user.options',
                        'user.tokens',
                ),
@@ -1318,6 +1359,10 @@ return array(
                'scripts' => 'resources/src/mediawiki/mediawiki.experiments.js',
                'targets' => array( 'desktop', 'mobile' ),
        ),
+       'mediawiki.raggett' => array(
+               'styles' => 'resources/src/mediawiki/mediawiki.raggett.css',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
 
        /* MediaWiki Action */
 
@@ -1364,7 +1409,6 @@ return array(
                        'editingsection',
                        'pagetitle',
                        'otherlanguages',
-                       'tooltip-p-lang',
                        'summary-preview',
                        'subject-preview',
                        'parentheses',
@@ -1645,15 +1689,6 @@ return array(
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.block.css',
                'dependencies' => 'mediawiki.util',
        ),
-       'mediawiki.special.changeemail' => array(
-               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changeemail.js',
-               'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeemail.css',
-               'dependencies' => 'mediawiki.util',
-               'messages' => array(
-                       'email-address-validity-valid',
-                       'email-address-validity-invalid',
-               ),
-       ),
        'mediawiki.special.changeslist' => array(
                'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
@@ -1673,6 +1708,10 @@ return array(
                'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
        ),
+       'mediawiki.special.changeslist.visitedstatus' => array(
+               'position' => 'top',
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.visitedstatus.js',
+       ),
        'mediawiki.special.edittags' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.edittags.js',
                'dependencies' => array(
@@ -1710,7 +1749,6 @@ return array(
        ),
        'mediawiki.special.preferences' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.preferences.js',
-               'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.css',
                'position' => 'top',
                'messages' => array(
                        'prefs-tabs-navigation-hint',
@@ -1724,6 +1762,10 @@ return array(
                        'mediawiki.notification',
                ),
        ),
+       'mediawiki.special.preferences.styles' => array(
+               'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.styles.css',
+               'position' => 'top',
+       ),
        'mediawiki.special.recentchanges' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
                'dependencies' => 'mediawiki.special',
@@ -1821,6 +1863,9 @@ return array(
                        'mediawiki.util',
                ),
        ),
+       'mediawiki.special.watchlist' => array(
+               'scripts' => 'resources/src/mediawiki.special/mediawiki.special.watchlist.js',
+       ),
        'mediawiki.special.javaScriptTest' => array(
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.javaScriptTest.js',
                'messages' => array_merge( Skin::getSkinNameMessages(), array(
@@ -2035,6 +2080,9 @@ return array(
                        'mediawiki.ForeignApi',
                        'mediawiki.Title',
                ),
+               'messages' => array(
+                       'red-link-title',
+               ),
                'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.widgets.UserInputWidget' => array(
index caf6dab..d3b74f2 100644 (file)
@@ -36,6 +36,7 @@ return call_user_func( function () {
        $modules['oojs-ui'] = array(
                'scripts' => array(
                        'resources/lib/oojs-ui/oojs-ui.js',
+                       'resources/src/oojs-ui-local.js',
                ),
                'skinScripts' => array_combine(
                        array_keys( $themes ),
@@ -51,6 +52,7 @@ return call_user_func( function () {
                        'oojs-ui.styles.icons',
                        'oojs-ui.styles.indicators',
                        'oojs-ui.styles.textures',
+                       'mediawiki.language',
                ),
                'messages' => array(
                        'ooui-dialog-message-accept',
index 019694a..d159169 100644 (file)
@@ -1,65 +1,65 @@
-== GNU GENERAL PUBLIC LICENSE ==
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
 
-Version 2, June 1991
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
 
-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
+                            Preamble
 
-=== Preamble ===
-
-The licenses for most software are designed to take away your
+  The licenses for most software are designed to take away your
 freedom to share and change it.  By contrast, the GNU General Public
 License is intended to guarantee your freedom to share and change free
 software--to make sure the software is free for all its users.  This
 General Public License applies to most of the Free Software
 Foundation's software and to any other program whose authors commit to
 using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
+the GNU Lesser General Public License instead.)  You can apply it to
 your programs, too.
 
-When we speak of free software, we are referring to freedom, not
+  When we speak of free software, we are referring to freedom, not
 price.  Our General Public Licenses are designed to make sure that you
 have the freedom to distribute copies of free software (and charge for
 this service if you wish), that you receive source code or can get it
 if you want it, that you can change the software or use pieces of it
 in new free programs; and that you know you can do these things.
 
-To protect your rights, we need to make restrictions that forbid
+  To protect your rights, we need to make restrictions that forbid
 anyone to deny you these rights or to ask you to surrender the rights.
 These restrictions translate to certain responsibilities for you if you
 distribute copies of the software, or if you modify it.
 
-For example, if you distribute copies of such a program, whether
+  For example, if you distribute copies of such a program, whether
 gratis or for a fee, you must give the recipients all the rights that
 you have.  You must make sure that they, too, receive or can get the
 source code.  And you must show them these terms so they know their
 rights.
 
-We protect your rights with two steps: (1) copyright the software, and
+  We protect your rights with two steps: (1) copyright the software, and
 (2) offer you this license which gives you legal permission to copy,
 distribute and/or modify the software.
 
-Also, for each author's protection and ours, we want to make certain
+  Also, for each author's protection and ours, we want to make certain
 that everyone understands that there is no warranty for this free
 software.  If the software is modified by someone else and passed on, we
 want its recipients to know that what they have is not the original, so
 that any problems introduced by others will not reflect on the original
 authors' reputations.
 
-Finally, any free program is threatened constantly by software
+  Finally, any free program is threatened constantly by software
 patents.  We wish to avoid the danger that redistributors of a free
 program will individually obtain patent licenses, in effect making the
 program proprietary.  To prevent this, we have made it clear that any
 patent must be licensed for everyone's free use or not licensed at all.
 
-The precise terms and conditions for copying, distribution and
+  The precise terms and conditions for copying, distribution and
 modification follow.
 
-== TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ==
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
-'''0.''' This License applies to any program or other work which contains
+  0. This License applies to any program or other work which contains
 a notice placed by the copyright holder saying it may be distributed
 under the terms of this General Public License.  The "Program", below,
 refers to any such program or work, and a "work based on the Program"
@@ -76,7 +76,7 @@ is covered only if its contents constitute a work based on the
 Program (independent of having been made by running the Program).
 Whether that is true depends on what the Program does.
 
-'''1.''' You may copy and distribute verbatim copies of the Program's
+  1. You may copy and distribute verbatim copies of the Program's
 source code as you receive it, in any medium, provided that you
 conspicuously and appropriately publish on each copy an appropriate
 copyright notice and disclaimer of warranty; keep intact all the
@@ -87,29 +87,29 @@ along with the Program.
 You may charge a fee for the physical act of transferring a copy, and
 you may at your option offer warranty protection in exchange for a fee.
 
-'''2.''' You may modify your copy or copies of the Program or any portion
+  2. You may modify your copy or copies of the Program or any portion
 of it, thus forming a work based on the Program, and copy and
 distribute such modifications or work under the terms of Section 1
 above, provided that you also meet all of these conditions:
 
-       '''a)''' You must cause the modified files to carry prominent notices
-       stating that you changed the files and the date of any change.
-
-       '''b)''' You must cause any work that you distribute or publish, that in
-       whole or in part contains or is derived from the Program or any
-       part thereof, to be licensed as a whole at no charge to all third
-       parties under the terms of this License.
-
-       '''c)''' If the modified program normally reads commands interactively
-       when run, you must cause it, when started running for such
-       interactive use in the most ordinary way, to print or display an
-       announcement including an appropriate copyright notice and a
-       notice that there is no warranty (or else, saying that you provide
-       a warranty) and that users may redistribute the program under
-       these conditions, and telling the user how to view a copy of this
-       License.  (Exception: if the Program itself is interactive but
-       does not normally print such an announcement, your work based on
-       the Program is not required to print an announcement.)
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
 
 These requirements apply to the modified work as a whole.  If
 identifiable sections of that work are not derived from the Program,
@@ -131,26 +131,26 @@ with the Program (or with a work based on the Program) on a volume of
 a storage or distribution medium does not bring the other work under
 the scope of this License.
 
-'''3.''' You may copy and distribute the Program (or a work based on it,
+  3. You may copy and distribute the Program (or a work based on it,
 under Section 2) in object code or executable form under the terms of
 Sections 1 and 2 above provided that you also do one of the following:
 
-       '''a)''' Accompany it with the complete corresponding machine-readable
-       source code, which must be distributed under the terms of Sections
-       1 and 2 above on a medium customarily used for software interchange; or,
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
 
-       '''b)''' Accompany it with a written offer, valid for at least three
-       years, to give any third party, for a charge no more than your
-       cost of physically performing source distribution, a complete
-       machine-readable copy of the corresponding source code, to be
-       distributed under the terms of Sections 1 and 2 above on a medium
-       customarily used for software interchange; or,
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
 
-       '''c)''' Accompany it with the information you received as to the offer
-       to distribute corresponding source code.  (This alternative is
-       allowed only for noncommercial distribution and only if you
-       received the program in object code or executable form with such
-       an offer, in accord with Subsection b above.)
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
 
 The source code for a work means the preferred form of the work for
 making modifications to it.  For an executable work, complete source
@@ -169,7 +169,7 @@ access to copy the source code from the same place counts as
 distribution of the source code, even though third parties are not
 compelled to copy the source along with the object code.
 
-'''4.''' You may not copy, modify, sublicense, or distribute the Program
+  4. You may not copy, modify, sublicense, or distribute the Program
 except as expressly provided under this License.  Any attempt
 otherwise to copy, modify, sublicense or distribute the Program is
 void, and will automatically terminate your rights under this License.
@@ -177,7 +177,7 @@ However, parties who have received copies, or rights, from you under
 this License will not have their licenses terminated so long as such
 parties remain in full compliance.
 
-'''5.''' You are not required to accept this License, since you have not
+  5. You are not required to accept this License, since you have not
 signed it.  However, nothing else grants you permission to modify or
 distribute the Program or its derivative works.  These actions are
 prohibited by law if you do not accept this License.  Therefore, by
@@ -186,7 +186,7 @@ Program), you indicate your acceptance of this License to do so, and
 all its terms and conditions for copying, distributing or modifying
 the Program or works based on it.
 
-'''6.''' Each time you redistribute the Program (or any work based on the
+  6. Each time you redistribute the Program (or any work based on the
 Program), the recipient automatically receives a license from the
 original licensor to copy, distribute or modify the Program subject to
 these terms and conditions.  You may not impose any further
@@ -194,7 +194,7 @@ restrictions on the recipients' exercise of the rights granted herein.
 You are not responsible for enforcing compliance by third parties to
 this License.
 
-'''7.''' If, as a consequence of a court judgment or allegation of patent
+  7. If, as a consequence of a court judgment or allegation of patent
 infringement or for any other reason (not limited to patent issues),
 conditions are imposed on you (whether by court order, agreement or
 otherwise) that contradict the conditions of this License, they do not
@@ -226,7 +226,7 @@ impose that choice.
 This section is intended to make thoroughly clear what is believed to
 be a consequence of the rest of this License.
 
-'''8.''' If the distribution and/or use of the Program is restricted in
+  8. If the distribution and/or use of the Program is restricted in
 certain countries either by patents or by copyrighted interfaces, the
 original copyright holder who places the Program under this License
 may add an explicit geographical distribution limitation excluding
@@ -234,7 +234,7 @@ those countries, so that distribution is permitted only in or among
 countries not thus excluded.  In such case, this License incorporates
 the limitation as if written in the body of this License.
 
-'''9.''' The Free Software Foundation may publish revised and/or new versions
+  9. The Free Software Foundation may publish revised and/or new versions
 of the General Public License from time to time.  Such new versions will
 be similar in spirit to the present version, but may differ in detail to
 address new problems or concerns.
@@ -247,7 +247,7 @@ Software Foundation.  If the Program does not specify a version number of
 this License, you may choose any version ever published by the Free Software
 Foundation.
 
-'''10.''' If you wish to incorporate parts of the Program into other free
+  10. If you wish to incorporate parts of the Program into other free
 programs whose distribution conditions are different, write to the author
 to ask for permission.  For software which is copyrighted by the Free
 Software Foundation, write to the Free Software Foundation; we sometimes
@@ -255,9 +255,9 @@ make exceptions for this.  Our decision will be guided by the two goals
 of preserving the free status of all derivatives of our free software and
 of promoting the sharing and reuse of software generally.
 
-=== NO WARRANTY ===
+                            NO WARRANTY
 
-'''11.''' BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
 OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
 PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
@@ -267,7 +267,7 @@ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
 PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
 REPAIR OR CORRECTION.
 
-'''12.''' IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
 REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
 INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
@@ -277,47 +277,45 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGES.
 
-       '''END OF TERMS AND CONDITIONS'''
+                     END OF TERMS AND CONDITIONS
 
-== How to Apply These Terms to Your New Programs ==
+            How to Apply These Terms to Your New Programs
 
-If you develop a new program, and you want it to be of the greatest
+  If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
 free software which everyone can redistribute and change under these terms.
 
-To do so, attach the following notices to the program.  It is safest
+  To do so, attach the following notices to the program.  It is safest
 to attach them to the start of each source file to most effectively
 convey the exclusion of warranty; and each file should have at least
 the "copyright" line and a pointer to where the full notice is found.
 
-       <one line to give the program's name and a brief idea of what it does.>
-
-       Copyright (C) <year>  <name of author>
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
 
-       This program is free software; you can redistribute it and/or modify
-       it under the terms of the GNU General Public 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.
-
-       You should have received a copy of the GNU General Public License
-       along with this program; if not, write to the Free Software
-       Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
 
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 Also add information on how to contact you by electronic and paper mail.
 
 If the program is interactive, make it output a short notice like this
 when it starts in an interactive mode:
 
-       Gnomovision version 69, Copyright (C) year name of author
-       Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-       This is free software, and you are welcome to redistribute it
-       under certain conditions; type `show c' for details.
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
 
 The hypothetical commands `show w' and `show c' should show the appropriate
 parts of the General Public License.  Of course, the commands you use may
@@ -328,15 +326,14 @@ You should also get your employer (if you work as a programmer) or your
 school, if any, to sign a "copyright disclaimer" for the program, if
 necessary.  Here is a sample; alter the names:
 
-       Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-       `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-       <signature of Ty Coon>, 1 April 1989
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
 
-       Ty Coon, President of Vice
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
 
 This General Public License does not permit incorporating your program into
 proprietary programs.  If your program is a subroutine library, you may
 consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
+library.  If this is what you want to do, use the GNU Lesser General
 Public License instead of this License.
index 0dded29..d1c7f84 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "jquery.i18n",
-  "version": "1.0.3",
+  "version": "1.0.4",
   "description": "jQuery based internationalization library",
   "homepage": "https://github.com/wikimedia/jquery.i18n",
   "keywords": [
@@ -24,7 +24,7 @@
     "qunit": "0.7.6",
     "grunt": "0.4.5",
     "grunt-cli": "0.1.13",
-    "grunt-contrib-jshint": "0.11.2",
+    "grunt-contrib-jshint": "0.11.3",
     "grunt-contrib-connect": "0.10.1",
     "grunt-contrib-qunit": "0.7.0",
     "grunt-contrib-watch": "0.6.1",
index 3ce0a99..e596fbc 100644 (file)
        };
 
        $.extend( $.i18n.languages, {
-               default: language
+               'default': language
        } );
 }( jQuery ) );
index 02d57e0..c46ea01 100644 (file)
@@ -25,7 +25,7 @@
        "ooui-dialog-process-retry": "আবার চেষ্টা করুন",
        "ooui-dialog-process-continue": "অগ্রসর হোন",
        "ooui-selectfile-button-select": "একটি ফাইল নির্বাচন করুন",
-       "ooui-selectfile-not-supported": "à¦\9aিতà§\8dর à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦¸à¦®à¦°à§\8dথন à¦\95রà¦\9bà§\87 à¦¨à¦¾à¥¤",
-       "ooui-selectfile-placeholder": " কোন চিত্র নির্বাচিত হয়নি।",
+       "ooui-selectfile-not-supported": "à¦\9aিতà§\8dর à¦¨à¦¿à¦°à§\8dবাà¦\9aন à¦¸à¦®à¦°à§\8dথিত à¦¨à¦¯à¦¼",
+       "ooui-selectfile-placeholder": "কোন চিত্র নির্বাচিত হয়নি",
        "ooui-selectfile-dragdrop-placeholder": "এখানে ফাইল ছাড়ুন"
 }
index d6f61ae..5674a78 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "DzWiki",
-                       "Semso98"
+                       "Semso98",
+                       "Srdjan m"
                ]
        },
        "ooui-outline-control-move-down": "Premjesti stavku dolje",
        "ooui-toolgroup-expand": "Više",
        "ooui-toolgroup-collapse": "Manje",
        "ooui-dialog-message-accept": "U redu",
-       "ooui-dialog-message-reject": "Otkaži",
+       "ooui-dialog-message-reject": "Odustani",
        "ooui-dialog-process-error": "Nešto je pošlo naopako",
        "ooui-dialog-process-dismiss": "Odbaci",
-       "ooui-dialog-process-retry": "Pokušajte ponovo",
-       "ooui-dialog-process-continue": "Nastavi"
+       "ooui-dialog-process-retry": "Pokušaj ponovo",
+       "ooui-dialog-process-continue": "Nastavi",
+       "ooui-selectfile-button-select": "Izaberi datoteku",
+       "ooui-selectfile-not-supported": "Izbor datoteke nije podržan",
+       "ooui-selectfile-placeholder": "Nijedna datoteka nije izabrana",
+       "ooui-selectfile-dragdrop-placeholder": "Prevuci datoteku ovdje"
 }
index 3077b60..96d782e 100644 (file)
@@ -31,5 +31,5 @@
        "ooui-selectfile-button-select": "Seleccioneu un fitxer",
        "ooui-selectfile-not-supported": "El tipus de fitxer no és compatible",
        "ooui-selectfile-placeholder": "No s'ha seleccionat cap fitxer",
-       "ooui-selectfile-dragdrop-placeholder": "Deixeu-hi anar el fitxer (o feu clic a navega)"
+       "ooui-selectfile-dragdrop-placeholder": "Deseu els arxius aquí"
 }
index 0d86aa6..734b738 100644 (file)
@@ -11,7 +11,8 @@
                        "Polda18",
                        "Tchoř",
                        "ශ්වෙත",
-                       "Vojtěch Dostál"
+                       "Vojtěch Dostál",
+                       "Matěj Suchánek"
                ]
        },
        "ooui-outline-control-move-down": "Přesunout položku dolů",
@@ -26,6 +27,8 @@
        "ooui-dialog-process-dismiss": "Zavřít",
        "ooui-dialog-process-retry": "Zkusit znovu",
        "ooui-dialog-process-continue": "Pokračovat",
+       "ooui-selectfile-button-select": "Vybrat soubor",
        "ooui-selectfile-not-supported": "Výběr souboru není podporován",
-       "ooui-selectfile-placeholder": "Nebyl vybrán žádný soubor"
+       "ooui-selectfile-placeholder": "Nebyl vybrán žádný soubor",
+       "ooui-selectfile-dragdrop-placeholder": "Umístěte soubor sem"
 }
index bdf015f..0b9e149 100644 (file)
@@ -29,7 +29,8 @@
        "ooui-dialog-process-dismiss": "Hylkää",
        "ooui-dialog-process-retry": "Yritä uudelleen",
        "ooui-dialog-process-continue": "Jatka",
+       "ooui-selectfile-button-select": "Valitse tiedosto",
        "ooui-selectfile-not-supported": "Tiedoston valitsemista ei tueta",
        "ooui-selectfile-placeholder": "Tiedostoa ei ole valittu",
-       "ooui-selectfile-dragdrop-placeholder": "Pudota tiedosto (tai selaa tiedostoja napsauttamalla)"
+       "ooui-selectfile-dragdrop-placeholder": "Pudota tiedosto tähän"
 }
index 9118898..36cc8eb 100644 (file)
@@ -17,5 +17,7 @@
        "ooui-dialog-message-reject": "Odustani",
        "ooui-dialog-process-error": "Nešto je pošlo po zlu",
        "ooui-dialog-process-dismiss": "Zatvori",
-       "ooui-dialog-process-retry": "Pokušajte ponovo"
+       "ooui-dialog-process-retry": "Pokušajte ponovo",
+       "ooui-selectfile-button-select": "Odaberi datoteku",
+       "ooui-selectfile-placeholder": "Datoteka nije označena"
 }
index acd9d3b..cf26cc1 100644 (file)
@@ -22,6 +22,8 @@
        "ooui-dialog-process-dismiss": "Elrejt",
        "ooui-dialog-process-retry": "Próbáld újra",
        "ooui-dialog-process-continue": "Folytatás",
+       "ooui-selectfile-button-select": "Fájl kiválasztása",
        "ooui-selectfile-not-supported": "A fájl kiválasztása nincs támogatva",
-       "ooui-selectfile-placeholder": "Nincs fájl kiválasztva"
+       "ooui-selectfile-placeholder": "Nincs fájl kiválasztva",
+       "ooui-selectfile-dragdrop-placeholder": "Dobd ide a fájlt"
 }
index c2b45a8..2cd688e 100644 (file)
@@ -19,6 +19,8 @@
        "ooui-dialog-process-dismiss": "Փակել",
        "ooui-dialog-process-retry": "Կրկին փորձել",
        "ooui-dialog-process-continue": "Շարունակել",
+       "ooui-selectfile-button-select": "Ընտրել նիշք",
        "ooui-selectfile-not-supported": "Ֆայլի ընտրությունը չի պաշտպանվում",
-       "ooui-selectfile-placeholder": "Ֆայլն ընտրված չէ"
+       "ooui-selectfile-placeholder": "Ֆայլն ընտրված չէ",
+       "ooui-selectfile-dragdrop-placeholder": "Ֆայլը գցել այստե"
 }
index 677b1c3..1024d2a 100644 (file)
@@ -4,14 +4,15 @@
                        "Gleki",
                        "NoiX180",
                        "Pras",
-                       "Jadinegara"
+                       "Jadinegara",
+                       "Meursault2004"
                ]
        },
        "ooui-outline-control-move-down": "Pindhahaken butir mangandhap",
-       "ooui-outline-control-move-up": "Pindhah kara mêndhuwur",
+       "ooui-outline-control-move-up": "Pindhah kara menyang dhuwur",
        "ooui-outline-control-remove": "Busak kara",
-       "ooui-toolbar-more": "Mênèh",
-       "ooui-toolgroup-expand": "Mênèh",
+       "ooui-toolbar-more": "Manèh",
+       "ooui-toolgroup-expand": "Manèh",
        "ooui-toolgroup-collapse": "Suda",
        "ooui-dialog-message-accept": "Oké",
        "ooui-dialog-message-reject": "Batal",
@@ -19,6 +20,6 @@
        "ooui-dialog-process-dismiss": "Tutup",
        "ooui-dialog-process-retry": "Jajal manèh",
        "ooui-dialog-process-continue": "Tutug",
-       "ooui-selectfile-not-supported": "Pilihan bêrkas ora disokong",
-       "ooui-selectfile-placeholder": "Ora ana bêrkas sing kapilih"
+       "ooui-selectfile-not-supported": "Pilihan berkas ora disokong",
+       "ooui-selectfile-placeholder": "Ora ana berkas sing kapilih"
 }
index 39bc670..fad4c1c 100644 (file)
@@ -23,6 +23,7 @@
        "ooui-dialog-process-retry": "Nach eng Kéier probéieren",
        "ooui-dialog-process-continue": "Virufueren",
        "ooui-selectfile-button-select": "E Fichier eraussichen",
+       "ooui-selectfile-not-supported": "D'Eraussiche vu Fichiere gëtt net ënnerstëtzt.",
        "ooui-selectfile-placeholder": "Et ass kee Fichier erausgesicht",
        "ooui-selectfile-dragdrop-placeholder": "Fichier hei ofleeën"
 }
diff --git a/resources/lib/oojs-ui/i18n/lki.json b/resources/lib/oojs-ui/i18n/lki.json
new file mode 100644 (file)
index 0000000..ec17c9b
--- /dev/null
@@ -0,0 +1,23 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Hosseinblue"
+               ]
+       },
+       "ooui-outline-control-move-down": "جاوواز کردن ئإ هووار",
+       "ooui-outline-control-move-up": "جاوواز کردن ئإ بِلِنگ",
+       "ooui-outline-control-remove": "حذف مورد",
+       "ooui-toolbar-more": "ویشتر/فرۀتر",
+       "ooui-toolgroup-expand": "ویشتر/فرۀتر",
+       "ooui-toolgroup-collapse": "کۀمتر",
+       "ooui-dialog-message-accept": "خوو/ باشد",
+       "ooui-dialog-message-reject": "ئآهووسانن-لغو",
+       "ooui-dialog-process-error": "مشکلی هۀس",
+       "ooui-dialog-process-dismiss": "رد کردن",
+       "ooui-dialog-process-retry": "دووآرۀ تلاش کۀ",
+       "ooui-dialog-process-continue": "ادامه-دؤم گرتن",
+       "ooui-selectfile-button-select": "فایلئ انتخاب کۀ",
+       "ooui-selectfile-not-supported": "انتخاب پرونده پشتیبانی نمی‌شود",
+       "ooui-selectfile-placeholder": "هیچ پرونده‌ای انتخاب نشده است",
+       "ooui-selectfile-dragdrop-placeholder": "فایل را اینجا رها کنید"
+}
index fbd22d0..86c6d64 100644 (file)
@@ -9,7 +9,7 @@
        },
        "ooui-outline-control-move-down": "Perkelti elementą žemyn",
        "ooui-outline-control-move-up": "Perkelti elementą aukštyn",
-       "ooui-outline-control-remove": "Šalinti elementus",
+       "ooui-outline-control-remove": "Šalinti įrašą",
        "ooui-toolbar-more": "Daugiau",
        "ooui-toolgroup-expand": "Daugiau",
        "ooui-toolgroup-collapse": "Mažiau",
index 515eada..d222d1c 100644 (file)
@@ -32,6 +32,8 @@
        "ooui-dialog-process-dismiss": "Sluiten",
        "ooui-dialog-process-retry": "Opnieuw proberen",
        "ooui-dialog-process-continue": "Doorgaan",
+       "ooui-selectfile-button-select": "Selecteer een bestand",
        "ooui-selectfile-not-supported": "Selectie van een bestand wordt niet ondersteund",
-       "ooui-selectfile-placeholder": "Er is geen bestand geselecteerd"
+       "ooui-selectfile-placeholder": "Er is geen bestand geselecteerd",
+       "ooui-selectfile-dragdrop-placeholder": "Sleep hier een bestand heen"
 }
index 9ceb96f..5584715 100644 (file)
@@ -20,8 +20,8 @@
                        "The Polish"
                ]
        },
-       "ooui-outline-control-move-down": "Przenieś niżej",
-       "ooui-outline-control-move-up": "Przenieś wyżej",
+       "ooui-outline-control-move-down": "Przesuń w dół",
+       "ooui-outline-control-move-up": "Przesuń w górę",
        "ooui-outline-control-remove": "Usuń element",
        "ooui-toolbar-more": "Więcej",
        "ooui-toolgroup-expand": "Więcej",
@@ -35,5 +35,5 @@
        "ooui-selectfile-button-select": "Wybierz plik",
        "ooui-selectfile-not-supported": "Wybór pliku nie jest obsługiwany",
        "ooui-selectfile-placeholder": "Nie wybrano pliku",
-       "ooui-selectfile-dragdrop-placeholder": "Umieść plik tutaj"
+       "ooui-selectfile-dragdrop-placeholder": "Upuść plik tutaj"
 }
index bcc31e0..fc29962 100644 (file)
@@ -26,6 +26,8 @@
        "ooui-dialog-process-dismiss": "Dispensar",
        "ooui-dialog-process-retry": "Tentar novamente",
        "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Selecionar um arquivo",
        "ooui-selectfile-not-supported": "O selecionamento de arquivos não é suportado",
-       "ooui-selectfile-placeholder": "Nenhum arquivo selecionado"
+       "ooui-selectfile-placeholder": "Nenhum arquivo selecionado",
+       "ooui-selectfile-dragdrop-placeholder": "Arraste o arquivo para cá"
 }
index 8d9071a..d3d265c 100644 (file)
@@ -26,6 +26,7 @@
        "ooui-dialog-process-dismiss": "Ignorar",
        "ooui-dialog-process-retry": "Tentar novamente",
        "ooui-dialog-process-continue": "Continuar",
+       "ooui-selectfile-button-select": "Selecionar ficheiro",
        "ooui-selectfile-not-supported": "A seleção de ficheiros não é suportada",
        "ooui-selectfile-placeholder": "Nenhum ficheiro selecionado",
        "ooui-selectfile-dragdrop-placeholder": "Soltar ficheiro aqui"
diff --git a/resources/lib/oojs-ui/i18n/sd.json b/resources/lib/oojs-ui/i18n/sd.json
new file mode 100644 (file)
index 0000000..12c77e0
--- /dev/null
@@ -0,0 +1,22 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Mehtab ahmed"
+               ]
+       },
+       "ooui-outline-control-move-down": "شيءِ کي هيٺ چوريو",
+       "ooui-outline-control-move-up": "شيءِ کي مٿي چوريو",
+       "ooui-outline-control-remove": "شيءِ هٽايو",
+       "ooui-toolbar-more": "وڌيڪ",
+       "ooui-toolgroup-expand": "وڌيڪ",
+       "ooui-toolgroup-collapse": "گھٽ تر",
+       "ooui-dialog-message-accept": "ٺيڪ",
+       "ooui-dialog-message-reject": "رد",
+       "ooui-dialog-process-error": "ڪا غلطي ٿي",
+       "ooui-dialog-process-dismiss": "برخاست ڪريو",
+       "ooui-dialog-process-retry": "ٻيهر ڪوشش ڪريو",
+       "ooui-dialog-process-continue": "جاري رکو",
+       "ooui-selectfile-button-select": "ڪو فائيل چونڊِو",
+       "ooui-selectfile-placeholder": "ڪوبه فائيل چونڊيو نه ويو آهي",
+       "ooui-selectfile-dragdrop-placeholder": "فائيل کي هتي ڪيرايو"
+}
index 61e3d01..6481624 100644 (file)
@@ -2,8 +2,9 @@
        "@metadata": {
                "authors": [
                        "Malafaya",
-                       "十弌"
+                       "十弌",
+                       "飞舞回堂前"
                ]
        },
-       "ooui-toolbar-more": "多"
+       "ooui-toolbar-more": "多"
 }
index 5012934..5e1caa8 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.14.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:26Z
+ * Date: 2015-12-08T21:43:53Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        width: 1.875em;
        height: 1.875em;
 }
-.oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button > .oo-ui-iconElement-icon {
-       /* Don't animate opacities for now, causes wiggling in Chrome (bug 63020) */
-       /*.oo-ui-transition(opacity @medium-ease);*/
-}
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:hover,
 .oo-ui-buttonElement-frameless > .oo-ui-buttonElement-button:focus {
        outline: none;
        color: #cccccc;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       margin: 0.1em 0;
        padding: 0.2em 0.8em;
        border-radius: 0.3em;
        text-shadow: 0 1px 1px rgba(255, 255, 255, 0.5);
        border: 1px #c9c9c9 solid;
        -webkit-transition: border-color 100ms ease;
           -moz-transition: border-color 100ms ease;
-           -ms-transition: border-color 100ms ease;
-            -o-transition: border-color 100ms ease;
                transition: border-color 100ms ease;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        margin-right: 0.3em;
 }
 .oo-ui-buttonElement-framed.oo-ui-indicatorElement > .oo-ui-buttonElement-button > .oo-ui-indicatorElement-indicator {
-       /* -0.5 - 0.475 */
        margin-left: -0.005em;
        margin-right: -0.005em;
 }
 }
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
 }
 .oo-ui-draggableElement-dragging {
        cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
        position: absolute;
        -webkit-transition: all 200ms ease;
           -moz-transition: all 200ms ease;
-           -ms-transition: all 200ms ease;
-            -o-transition: all 200ms ease;
                transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
 .oo-ui-horizontalLayout > .oo-ui-layout {
        display: inline-block;
 }
+.oo-ui-horizontalLayout > .oo-ui-layout,
 .oo-ui-horizontalLayout > .oo-ui-widget {
        margin-right: 0.5em;
 }
+.oo-ui-horizontalLayout > .oo-ui-layout:last-child,
 .oo-ui-horizontalLayout > .oo-ui-widget:last-child {
        margin-right: 0;
 }
+.oo-ui-horizontalLayout > .oo-ui-layout {
+       margin-bottom: 0;
+}
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-popupTool .oo-ui-popupWidget-anchor {
        z-index: 4;
        border: 1px solid transparent;
        -webkit-transition: border-color 250ms ease;
           -moz-transition: border-color 250ms ease;
-           -ms-transition: border-color 250ms ease;
-            -o-transition: border-color 250ms ease;
                transition: border-color 250ms ease;
 }
 .oo-ui-toolGroup-empty {
        background-image: -webkit-linear-gradient(transparent, transparent), /* @embed */ url("themes/apex/images/icons/check.svg");
        background-image:         linear-gradient(transparent, transparent), /* @embed */ url("themes/apex/images/icons/check.svg");
        background-image:      -o-linear-gradient(transparent, transparent), url("themes/apex/images/icons/check.png");
+       background-size: contain;
+       background-position: center center;
+       background-repeat: no-repeat;
 }
 .oo-ui-menuToolGroup .oo-ui-tool.oo-ui-widget-enabled:hover {
        background-color: #e1f3ff;
 .oo-ui-toolbar-actions > .oo-ui-buttonElement-frameless:last-child.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin: 0 1em;
        line-height: 3.40625em;
-       /* 43/12.8 */
 }
 .oo-ui-toolbar-shadow {
        background-image: /* @embed */ url(themes/apex/images/toolbar-shadow.png);
        opacity: 0.5;
        -webkit-transition: opacity 500ms ease;
           -moz-transition: opacity 500ms ease;
-           -ms-transition: opacity 500ms ease;
-            -o-transition: opacity 500ms ease;
                transition: opacity 500ms ease;
 }
 .oo-ui-optionWidget {
        -webkit-transform: translateZ(0px);
           -moz-transform: translateZ(0px);
            -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
                transform: translateZ(0px);
        height: 2em;
        width: 4em;
        border: 1px #c9c9c9 solid;
        -webkit-transition: left 250ms ease, margin-left 250ms ease;
           -moz-transition: left 250ms ease, margin-left 250ms ease;
-           -ms-transition: left 250ms ease, margin-left 250ms ease;
-            -o-transition: left 250ms ease, margin-left 250ms ease;
                transition: left 250ms ease, margin-left 250ms ease;
        background: #eeeeee;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#ffffff', endColorstr='#dddddd');
        box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
        -webkit-transition: opacity 250ms ease;
           -moz-transition: opacity 250ms ease;
-           -ms-transition: opacity 250ms ease;
-            -o-transition: opacity 250ms ease;
                transition: opacity 250ms ease;
        background: #cde7f4;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#b0d9ee', endColorstr='#eaf4fa');
 }
 .oo-ui-progressBarWidget {
        max-width: 50em;
+       background-color: #ffffff;
        border: 1px solid #cccccc;
        border-radius: 0.25em;
        overflow: hidden;
        border-right: 1px solid #cccccc;
        -webkit-transition: width 250ms ease, margin-left 250ms ease;
           -moz-transition: width 250ms ease, margin-left 250ms ease;
-           -ms-transition: width 250ms ease, margin-left 250ms ease;
-            -o-transition: width 250ms ease, margin-left 250ms ease;
                transition: width 250ms ease, margin-left 250ms ease;
        background: #cde7f4;
        filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#eaf4fa', endColorstr='#b0d9ee');
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
        -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
                animation: oo-ui-progressBarWidget-slide 2s infinite linear;
        width: 40%;
        margin-left: -10%;
        overflow: hidden;
 }
 .oo-ui-popupWidget-popup {
+       background-color: #ffffff;
        border: 1px solid #cccccc;
        border-radius: 0.25em;
-       background-color: #ffffff;
        box-shadow: 0 0.15em 0.5em 0 rgba(0, 0, 0, 0.2);
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
        -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
           -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-           -ms-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-            -o-transition: width 100ms ease, height 100ms ease, left 100ms ease;
                transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
                box-sizing: border-box;
 }
 .oo-ui-dropdownInputWidget select {
-       background: #ffffff;
+       background-color: #ffffff;
        height: 2.5em;
        padding: 0.5em;
        font-size: inherit;
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget textarea {
+       overflow: auto;
+}
 .oo-ui-textInputWidget input[type="search"] {
        -webkit-appearance: none;
 }
        border-radius: 0.25em;
        -webkit-transition: border-color 250ms ease, box-shadow 250ms ease;
           -moz-transition: border-color 250ms ease, box-shadow 250ms ease;
-           -ms-transition: border-color 250ms ease, box-shadow 250ms ease;
-            -o-transition: border-color 250ms ease, box-shadow 250ms ease;
                transition: border-color 250ms ease, box-shadow 250ms ease;
 }
 .oo-ui-textInputWidget input.oo-ui-pendingElement-pending,
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
        background-color: transparent;
 }
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea:focus {
        outline: none;
 }
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        width: 1.875em;
+       max-height: 2.375em;
        margin-left: 0.3em;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement input,
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
+       max-height: 2.375em;
        margin-right: 0.775em;
 }
 .oo-ui-textInputWidget > .oo-ui-labelElement-label {
 }
 .oo-ui-menuSelectWidget {
        position: absolute;
-       background: #ffffff;
+       background-color: #ffffff;
        margin-top: -1px;
        border: 1px solid #cccccc;
        border-radius: 0 0 0.25em 0.25em;
        position: relative;
        width: 100%;
        max-width: 50em;
+       background-color: #ffffff;
        margin-right: 0.5em;
 }
 .oo-ui-dropdownWidget-handle {
        opacity: 0;
        z-index: 1;
        cursor: pointer;
-       /* Push the button part of the native control out of view, as it changes the cursor */
        padding-top: 100px;
 }
 .oo-ui-selectFileWidget-selectButton.oo-ui-widget-disabled > .oo-ui-buttonElement-button > input[type="file"] {
        margin-right: 0;
 }
 .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
-       margin: 0 0 0 0.5em;
+       margin-left: 0.5em;
 }
 .oo-ui-selectFileWidget-info {
        height: 2.4em;
+       background-color: #ffffff;
        border: 1px solid rgba(0, 0, 0, 0.1);
        border-radius: 0.25em;
 }
 }
 .oo-ui-selectFileWidget-dropTarget {
        line-height: 3.5em;
+       background-color: #ffffff;
        border: 1px dashed #aaaaaa;
        padding: 0.5em 1em;
        margin-bottom: 0.5em;
-       background: #ffffff;
        text-align: center;
        vertical-align: middle;
 }
        display: inline-block;
        position: relative;
 }
+.oo-ui-capsuleMultiSelectWidget-content {
+       position: relative;
+}
+.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-content > input {
+       display: none;
+}
 .oo-ui-capsuleMultiSelectWidget-group {
        display: inline;
 }
        cursor: text;
        min-height: 2.4em;
        margin-right: 0.5em;
-       padding: 0.25em 0;
+       padding: 0.15em 0.25em;
        border: 1px solid rgba(0, 0, 0, 0.1);
        border-radius: 0.25em;
        -webkit-box-sizing: border-box;
 .oo-ui-capsuleMultiSelectWidget-handle:last-child {
        margin-right: 0;
 }
-.oo-ui-capsuleMultiSelectWidget-handle .oo-ui-capsuleMultiSelectWidget-group {
-       margin: 0 0.2em;
-}
 .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator,
 .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon {
        position: absolute;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > input {
+.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-capsuleMultiSelectWidget-content > input {
        border: none;
-       min-width: 1em;
-       max-width: 100%;
        line-height: 1.675em;
        margin: 0;
+       margin-left: 0.2em;
        padding: 0;
        font-size: inherit;
        font-family: inherit;
        color: black;
        vertical-align: middle;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > input:focus {
+.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-capsuleMultiSelectWidget-content > input:focus {
        outline: none;
 }
 .oo-ui-capsuleMultiSelectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiSelectWidget-handle {
-       padding-right: 0.9375em;
+       padding-right: 2.4875em;
 }
 .oo-ui-capsuleMultiSelectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator {
        right: 0;
        margin: 0.775em;
 }
 .oo-ui-capsuleMultiSelectWidget.oo-ui-iconElement .oo-ui-capsuleMultiSelectWidget-handle {
-       padding-left: 1.875em;
+       padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiSelectWidget.oo-ui-iconElement .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon {
        left: 0;
                box-sizing: border-box;
        vertical-align: middle;
        padding: 0 0.4em;
-       margin: 0 0.1em;
+       margin: 0.1em;
        height: 1.7em;
        line-height: 1.7em;
        background: #eeeeee;
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
-.oo-ui-comboBoxWidget {
+.oo-ui-comboBoxInputWidget {
        display: inline-block;
        position: relative;
        width: 100%;
        max-width: 50em;
        margin-right: 0.5em;
 }
-.oo-ui-comboBoxWidget > .oo-ui-menuSelectWidget {
+.oo-ui-comboBoxInputWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-comboBoxWidget > .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+.oo-ui-comboBoxInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
        cursor: pointer;
 }
-.oo-ui-comboBoxWidget:last-child {
-       margin-right: 0;
+.oo-ui-comboBoxInputWidget-php input::-webkit-calendar-picker-indicator {
+       opacity: 0 !important;
+       position: absolute;
+       right: 0;
+       top: 0;
+       height: 2.5em;
+       width: 2.5em;
+       padding: 0;
 }
-.oo-ui-comboBoxWidget-handle {
-       border: 1px solid rgba(0, 0, 0, 0.1);
-       border-radius: 0.25em;
+.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
+       pointer-events: none;
 }
-.oo-ui-comboBoxWidget-handle:hover {
-       border-color: rgba(0, 0, 0, 0.2);
+.oo-ui-comboBoxInputWidget:last-child {
+       margin-right: 0;
 }
-.oo-ui-comboBoxWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
-.oo-ui-comboBoxWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
+.oo-ui-comboBoxInputWidget.oo-ui-widget-disabled .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator,
+.oo-ui-comboBoxInputWidget-empty .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        cursor: default;
        opacity: 0.2;
 }
-.oo-ui-comboBoxWidget > .oo-ui-selectWidget {
+.oo-ui-comboBoxInputWidget > .oo-ui-selectWidget {
        margin-top: -3px;
 }
 .oo-ui-searchWidget-query {
 .oo-ui-numberInputWidget-field > .oo-ui-buttonWidget > .oo-ui-buttonElement-button {
        box-sizing: border-box;
 }
-.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget,
-.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget > .oo-ui-buttonElement-button {
-       margin: 0;
+.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget {
        width: 2.5em;
 }
 .oo-ui-numberInputWidget-minusButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
 .oo-ui-messageDialog-message {
        display: block;
        text-align: center;
+}
+.oo-ui-messageDialog-title.oo-ui-labelElement,
+.oo-ui-messageDialog-message.oo-ui-labelElement {
        padding-top: 0.5em;
 }
 .oo-ui-messageDialog-title {
 .oo-ui-processDialog-actions-other .oo-ui-actionWidget.oo-ui-buttonElement-framed .oo-ui-buttonElement-button {
        padding: 0 1em;
        vertical-align: middle;
-       /* Adjust for border so text aligns with title */
        margin: -1px;
 }
 .oo-ui-processDialog-actions-safe .oo-ui-actionWidget.oo-ui-buttonElement-frameless,
        opacity: 0;
        -webkit-transition: opacity 250ms ease;
           -moz-transition: opacity 250ms ease;
-           -ms-transition: opacity 250ms ease;
-            -o-transition: opacity 250ms ease;
                transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
        -webkit-transform: scale(0.5);
           -moz-transform: scale(0.5);
            -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
                transform: scale(0.5);
        -webkit-transition: all 250ms ease;
           -moz-transition: all 250ms ease;
-           -ms-transition: all 250ms ease;
-            -o-transition: all 250ms ease;
                transition: all 250ms ease;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-       /* Fade window overlay */
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-       /* Fade frame */
        opacity: 1;
        -webkit-transform: scale(1);
           -moz-transform: scale(1);
            -ms-transform: scale(1);
-            -o-transform: scale(1);
                transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
index dab3c78..7db559c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.14.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:18Z
+ * Date: 2015-12-08T21:43:47Z
  */
 /**
  * @class
index a19ebea..a3ebbae 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.14.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:26Z
+ * Date: 2015-12-08T21:43:53Z
  */
 @-webkit-keyframes oo-ui-progressBarWidget-slide {
        from {
        padding-left: 2.4em;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button {
-       margin: 0.1em 0;
        padding: 0.5em 1em;
        min-height: 1.2em;
        min-width: 1em;
        position: relative;
        -webkit-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
           -moz-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
-           -ms-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
-            -o-transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
                transition: background 100ms ease, color 100ms ease, border-color 100ms ease, box-shadow 100ms ease;
 }
 .oo-ui-buttonElement-framed > .oo-ui-buttonElement-button:hover,
 }
 .oo-ui-draggableElement {
        cursor: -webkit-grab -moz-grab, url(images/grab.cur), move;
-       /*
-        * HACK: In order to style horizontally, we must override
-        * OO.ui.OptionWidget's display rule that is currently set
-        * to be 'block'
-        */
 }
 .oo-ui-draggableElement-dragging {
        cursor: -webkit-grabbing -moz-grabbing, url(images/grabbing.cur), move;
        border-right: 1px solid #dddddd;
 }
 .oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
-       box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+       box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-indexLayout > .oo-ui-menuLayout-menu {
        height: 3em;
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-right > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
        width: 60%;
 }
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
+       margin-bottom: 1.25em;
+}
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding: 0.5em;
+       padding: 0.25em;
        padding-left: 1em;
 }
-.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
-       padding: 0.5em 0;
-}
 .oo-ui-fieldLayout.oo-ui-fieldLayout-align-top.oo-ui-labelElement > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
-       padding: 0.5em 0;
+       padding-top: 0.25em;
+       padding-bottom: 0.5em;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget {
        margin-right: 0;
-       margin-top: 0.25em;
 }
 .oo-ui-fieldLayout > .oo-ui-popupButtonWidget:last-child {
        margin-right: 0;
        position: absolute;
        -webkit-transition: all 200ms ease;
           -moz-transition: all 200ms ease;
-           -ms-transition: all 200ms ease;
-            -o-transition: all 200ms ease;
                transition: all 200ms ease;
 }
 .oo-ui-menuLayout-menu {
 .oo-ui-panelLayout-framed {
        border: 1px solid #aaaaaa;
        border-radius: 0.2em;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+       box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
        margin: 1em 0;
 .oo-ui-horizontalLayout > .oo-ui-widget:last-child {
        margin-right: 0;
 }
-.oo-ui-horizontalLayout .oo-ui-fieldLayout {
+.oo-ui-horizontalLayout > .oo-ui-layout {
        margin-bottom: 0;
 }
 .oo-ui-popupTool .oo-ui-popupWidget-popup,
 .oo-ui-toolbar-actions > .oo-ui-buttonElement.oo-ui-labelElement > .oo-ui-buttonElement-button > .oo-ui-labelElement-label {
        margin: 0 1em;
        line-height: 3.125em;
-       /* 40/12.8 */
 }
 .oo-ui-optionWidget {
        position: relative;
        -webkit-transform: translateZ(0px);
           -moz-transform: translateZ(0px);
            -ms-transform: translateZ(0px);
-            -o-transform: translateZ(0px);
                transform: translateZ(0px);
        height: 2em;
        width: 3.5em;
+       border: 1px solid #777777;
        border-radius: 1em;
-       border: 1px #555555 solid;
-       background: #ffffff;
-       -webkit-transition: background-color 100ms ease;
-          -moz-transition: background-color 100ms ease;
-           -ms-transition: background-color 100ms ease;
-            -o-transition: background-color 100ms ease;
-               transition: background-color 100ms ease;
+       background-color: #ffffff;
        margin-right: 0.5em;
+       -webkit-transition: background-color 100ms ease, border-color 100ms ease;
+          -moz-transition: background-color 100ms ease, border-color 100ms ease;
+               transition: background-color 100ms ease, border-color 100ms ease;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        cursor: default;
 .oo-ui-toggleSwitchWidget:last-child {
        margin-right: 0;
 }
-.oo-ui-toggleSwitchWidget-grip {
-       top: 0.5em;
-       left: 0.5em;
-       width: 1em;
-       height: 1em;
-       margin-top: -1px;
+.oo-ui-toggleSwitchWidget:before {
+       content: "";
+       display: block;
+       position: absolute;
+       top: 0;
+       left: 0;
+       bottom: 0;
+       right: 0;
+       border: 1px solid transparent;
        border-radius: 1em;
-       background: #555555;
+       z-index: 1;
+}
+.oo-ui-toggleSwitchWidget-grip {
+       top: 0.35em;
+       width: 1.2em;
+       height: 1.2em;
+       border-radius: 1.2em;
+       background-color: #555555;
        -webkit-transition: left 100ms ease, margin-left 100ms ease;
           -moz-transition: left 100ms ease, margin-left 100ms ease;
-           -ms-transition: left 100ms ease, margin-left 100ms ease;
-            -o-transition: left 100ms ease, margin-left 100ms ease;
                transition: left 100ms ease, margin-left 100ms ease;
 }
 .oo-ui-toggleSwitchWidget-glow {
        display: none;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
-       left: 2em;
+       left: 1.9em;
        margin-left: -2px;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
-       left: 0.5em;
+       left: 0.4em;
        margin-left: 0;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on {
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
        background: #ffffff;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
-       outline: none;
-       border-color: #347bff;
-}
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on {
-       border-color: #ffffff;
-       box-shadow: 0 0 0 1px #347bff;
+       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover {
        border-color: #2962cc;
-       box-shadow: 0 0 0 1px #2962cc;
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover.oo-ui-toggleWidget-on {
        background: #2962cc;
        border-color: #2962cc;
 }
-.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus {
+       border-color: #347bff;
+       outline: none;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on {
+       border-color: #347bff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:focus.oo-ui-toggleWidget-on:before {
+       border-color: #ffffff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover {
+       background-color: #347bff;
+       border-color: #347bff;
+}
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active .oo-ui-toggleSwitchWidget-grip,
+.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:active:hover .oo-ui-toggleSwitchWidget-grip {
        background: #ffffff;
+       box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1);
 }
 .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
        background: #dddddd;
 }
 .oo-ui-progressBarWidget {
        max-width: 50em;
+       background-color: #ffffff;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
        overflow: hidden;
        background: #dddddd;
        -webkit-transition: width 200ms, margin-left 200ms;
           -moz-transition: width 200ms, margin-left 200ms;
-           -ms-transition: width 200ms, margin-left 200ms;
-            -o-transition: width 200ms, margin-left 200ms;
                transition: width 200ms, margin-left 200ms;
 }
 .oo-ui-progressBarWidget-indeterminate .oo-ui-progressBarWidget-bar {
        -webkit-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
           -moz-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-           -ms-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
-            -o-animation: oo-ui-progressBarWidget-slide 2s infinite linear;
                animation: oo-ui-progressBarWidget-slide 2s infinite linear;
        width: 40%;
        margin-left: -10%;
        overflow: hidden;
 }
 .oo-ui-popupWidget-popup {
+       background-color: #ffffff;
        border: 1px solid #aaaaaa;
        border-radius: 0.2em;
-       background-color: #ffffff;
        box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
 .oo-ui-popupWidget-anchored .oo-ui-popupWidget-popup {
 .oo-ui-popupWidget-transitioning .oo-ui-popupWidget-popup {
        -webkit-transition: width 100ms ease, height 100ms ease, left 100ms ease;
           -moz-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-           -ms-transition: width 100ms ease, height 100ms ease, left 100ms ease;
-            -o-transition: width 100ms ease, height 100ms ease, left 100ms ease;
                transition: width 100ms ease, height 100ms ease, left 100ms ease;
 }
 .oo-ui-popupWidget-head {
 .oo-ui-checkboxInputWidget input[type="checkbox"] + span {
        -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
           -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
-           -ms-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
-            -o-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
                transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
 .oo-ui-checkboxInputWidget input[type="checkbox"]:hover + span {
        border-bottom-width: 3px;
 }
-.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled {
        cursor: default;
+}
+.oo-ui-checkboxInputWidget input[type="checkbox"]:disabled + span {
        background-color: #eeeeee;
        border-color: #eeeeee;
 }
                box-sizing: border-box;
 }
 .oo-ui-dropdownInputWidget select {
-       background: #ffffff;
+       background-color: #ffffff;
        height: 2.275em;
        font-size: inherit;
        font-family: inherit;
 .oo-ui-radioInputWidget input[type="radio"] + span {
        -webkit-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
           -moz-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
-           -ms-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
-            -o-transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
                transition: background-size 200ms cubic-bezier(0.175, 0.885, 0.32, 1.275);
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
 .oo-ui-radioInputWidget input[type="radio"]:hover + span {
        border-bottom-width: 3px;
 }
-.oo-ui-radioInputWidget input[type="radio"]:disabled + span {
+.oo-ui-radioInputWidget input[type="radio"]:disabled {
        cursor: default;
+}
+.oo-ui-radioInputWidget input[type="radio"]:disabled + span {
        background-color: #eeeeee;
        border-color: #eeeeee;
 }
           -moz-box-sizing: border-box;
                box-sizing: border-box;
 }
+.oo-ui-textInputWidget textarea {
+       overflow: auto;
+}
 .oo-ui-textInputWidget input[type="search"] {
        -webkit-appearance: none;
 }
        border-radius: 0.1em;
        -webkit-transition: box-shadow 100ms ease;
           -moz-transition: box-shadow 100ms ease;
-           -ms-transition: box-shadow 100ms ease;
-            -o-transition: box-shadow 100ms ease;
                transition: box-shadow 100ms ease;
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
 .oo-ui-textInputWidget textarea.oo-ui-pendingElement-pending {
        background-color: transparent;
 }
-.oo-ui-textInputWidget-icon {
-       width: 2em;
-}
 .oo-ui-textInputWidget.oo-ui-widget-enabled input,
 .oo-ui-textInputWidget.oo-ui-widget-enabled textarea {
        -webkit-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
           -moz-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-           -ms-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
-            -o-transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
                transition: border 200ms cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 200ms cubic-bezier(0.39, 0.575, 0.565, 1);
 }
 .oo-ui-textInputWidget.oo-ui-widget-enabled input:focus,
 .oo-ui-textInputWidget.oo-ui-iconElement .oo-ui-iconElement-icon {
        left: 0;
        width: 1.875em;
+       max-height: 2.375em;
        margin-left: 0.5em;
        height: 100%;
        background-position: right center;
 }
 .oo-ui-textInputWidget.oo-ui-indicatorElement .oo-ui-indicatorElement-indicator {
        width: 0.9375em;
+       max-height: 2.375em;
        margin: 0 0.775em;
        height: 100%;
 }
        margin-right: 2.0875em;
 }
 .oo-ui-textInputWidget-labelPosition-before.oo-ui-iconElement > .oo-ui-labelElement-label {
-       margin-right: 2.475em;
+       margin-left: 2.475em;
 }
 .oo-ui-menuSelectWidget {
        position: absolute;
-       background: #ffffff;
+       background-color: #ffffff;
        margin-top: -1px;
        border: 1px solid #aaaaaa;
        border-radius: 0 0 0.2em 0.2em;
        position: relative;
        width: 100%;
        max-width: 50em;
-       background: #ffffff;
+       background-color: #ffffff;
        margin-right: 0.5em;
 }
 .oo-ui-dropdownWidget-handle {
 .oo-ui-dropdownWidget-handle {
        padding: 0.5em 0;
        height: 2.275em;
+       line-height: 1.275;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
 }
        opacity: 0;
        z-index: 1;
        cursor: pointer;
-       /* Push the button part of the native control out of view, as it changes the cursor */
        padding-top: 100px;
 }
 .oo-ui-selectFileWidget-selectButton.oo-ui-widget-disabled > .oo-ui-buttonElement-button > input[type="file"] {
        margin-right: 0;
 }
 .oo-ui-selectFileWidget-selectButton > .oo-ui-buttonElement-button {
-       margin: 0 0 0 0.5em;
+       margin-left: 0.5em;
 }
 .oo-ui-selectFileWidget-info {
        height: 2.4em;
+       background-color: #ffffff;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
 }
 }
 .oo-ui-selectFileWidget-dropTarget {
        line-height: 3.5em;
+       background-color: #ffffff;
        border: 1px dashed #cccccc;
        padding: 0.5em 1em;
        margin-bottom: 0.5em;
-       background: #ffffff;
        text-align: center;
        vertical-align: middle;
 }
        border-bottom: none;
        border-top-left-radius: 2px;
        border-top-right-radius: 2px;
-       color: #666666;
+       color: #555555;
        font-weight: bold;
 }
 .oo-ui-tabOptionWidget.oo-ui-widget-enabled:hover {
        display: inline-block;
        position: relative;
 }
+.oo-ui-capsuleMultiSelectWidget-content {
+       position: relative;
+}
+.oo-ui-capsuleMultiSelectWidget.oo-ui-widget-disabled .oo-ui-capsuleMultiSelectWidget-content > input {
+       display: none;
+}
 .oo-ui-capsuleMultiSelectWidget-group {
        display: inline;
 }
        cursor: text;
        min-height: 2.4em;
        margin-right: 0.5em;
-       padding: 0.25em 0;
+       padding: 0.15em 0.25em;
        border: 1px solid #cccccc;
        border-radius: 0.1em;
        -webkit-box-sizing: border-box;
 .oo-ui-capsuleMultiSelectWidget-handle:last-child {
        margin-right: 0;
 }
-.oo-ui-capsuleMultiSelectWidget-handle .oo-ui-capsuleMultiSelectWidget-group {
-       margin: 0 0.2em;
-}
 .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator,
 .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon {
        position: absolute;
        background-position: center center;
        background-repeat: no-repeat;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > input {
+.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-capsuleMultiSelectWidget-content > input {
        border: none;
-       min-width: 1em;
-       max-width: 100%;
        line-height: 1.675em;
        margin: 0;
+       margin-left: 0.2em;
        padding: 0;
        font-size: inherit;
        font-family: inherit;
        color: black;
        vertical-align: middle;
 }
-.oo-ui-capsuleMultiSelectWidget-handle > input:focus {
+.oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-capsuleMultiSelectWidget-content > input:focus {
        outline: none;
 }
 .oo-ui-capsuleMultiSelectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiSelectWidget-handle {
-       padding-right: 0.9375em;
+       padding-right: 2.4875em;
 }
 .oo-ui-capsuleMultiSelectWidget.oo-ui-indicatorElement .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-indicatorElement-indicator {
        right: 0;
        margin: 0.775em;
 }
 .oo-ui-capsuleMultiSelectWidget.oo-ui-iconElement .oo-ui-capsuleMultiSelectWidget-handle {
-       padding-left: 1.875em;
+       padding-left: 2.475em;
 }
 .oo-ui-capsuleMultiSelectWidget.oo-ui-iconElement .oo-ui-capsuleMultiSelectWidget-handle > .oo-ui-iconElement-icon {
        left: 0;
                box-sizing: border-box;
        vertical-align: middle;
        padding: 0 0.4em;
-       margin: 0 0.1em;
+       margin: 0.1em;
        height: 1.7em;
        line-height: 1.7em;
        background-color: #eeeeee;
 .oo-ui-capsuleItemWidget.oo-ui-widget-disabled > .oo-ui-indicatorElement-indicator {
        opacity: 0.2;
 }
-.oo-ui-comboBoxWidget {
+.oo-ui-comboBoxInputWidget {
        display: inline-block;
        position: relative;
        width: 100%;
        max-width: 50em;
        margin-right: 0.5em;
 }
-.oo-ui-comboBoxWidget > .oo-ui-menuSelectWidget {
+.oo-ui-comboBoxInputWidget > .oo-ui-menuSelectWidget {
        z-index: 1;
        width: 100%;
 }
-.oo-ui-comboBoxWidget > .oo-ui-textInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
+.oo-ui-comboBoxInputWidget.oo-ui-widget-enabled > .oo-ui-indicatorElement-indicator {
        cursor: pointer;
 }
-.oo-ui-comboBoxWidget:last-child {
+.oo-ui-comboBoxInputWidget-php input::-webkit-calendar-picker-indicator {
+       opacity: 0 !important;
+       position: absolute;
+       right: 0;
+       top: 0;
+       height: 2.5em;
+       width: 2.5em;
+       padding: 0;
+}
+.oo-ui-comboBoxInputWidget-php > .oo-ui-indicatorElement-indicator {
+       pointer-events: none;
+}
+.oo-ui-comboBoxInputWidget:last-child {
        margin-right: 0;
 }
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget input,
-.oo-ui-comboBoxWidget .oo-ui-textInputWidget textarea {
+.oo-ui-comboBoxInputWidget input,
+.oo-ui-comboBoxInputWidget textarea {
        height: 2.35em;
 }
 .oo-ui-searchWidget-query {
 .oo-ui-numberInputWidget-field > .oo-ui-buttonWidget > .oo-ui-buttonElement-button {
        box-sizing: border-box;
 }
-.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget,
-.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget > .oo-ui-buttonElement-button {
-       margin: 0;
+.oo-ui-numberInputWidget-field > .oo-ui-buttonWidget {
        width: 2.5em;
 }
 .oo-ui-numberInputWidget-minusButton.oo-ui-buttonElement-framed.oo-ui-widget-enabled > .oo-ui-buttonElement-button {
 .oo-ui-messageDialog-message {
        display: block;
        text-align: center;
+}
+.oo-ui-messageDialog-title.oo-ui-labelElement,
+.oo-ui-messageDialog-message.oo-ui-labelElement {
        padding-top: 0.5em;
 }
 .oo-ui-messageDialog-title {
 .oo-ui-messageDialog-message {
        font-size: 0.9em;
        line-height: 1.25em;
-       color: #666666;
+       color: #555555;
 }
 .oo-ui-messageDialog-message-verbose {
        font-size: 1.1em;
        opacity: 0;
        -webkit-transition: opacity 250ms ease;
           -moz-transition: opacity 250ms ease;
-           -ms-transition: opacity 250ms ease;
-            -o-transition: opacity 250ms ease;
                transition: opacity 250ms ease;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog > .oo-ui-window-frame {
        -webkit-transform: scale(0.5);
           -moz-transform: scale(0.5);
            -ms-transform: scale(0.5);
-            -o-transform: scale(0.5);
                transform: scale(0.5);
        -webkit-transition: all 250ms ease;
           -moz-transition: all 250ms ease;
-           -ms-transition: all 250ms ease;
-            -o-transition: all 250ms ease;
                transition: all 250ms ease;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
-       /* Fade window overlay */
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
-       /* Fade frame */
        opacity: 1;
        -webkit-transform: scale(1);
           -moz-transform: scale(1);
            -ms-transform: scale(1);
-            -o-transform: scale(1);
                transform: scale(1);
 }
 .oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
        border: 1px solid #aaaaaa;
        border-radius: 0.2em;
-       box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+       box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
 }
index e6344f2..677ab5b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.14.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:18Z
+ * Date: 2015-12-08T21:43:47Z
  */
 /**
  * @class
index aeff69e..c77bfd7 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.12.12
+ * OOjs UI v0.14.1
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2015 OOjs UI Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-10-13T20:38:18Z
+ * Date: 2015-12-08T21:43:47Z
  */
 ( function ( OO ) {
 
@@ -350,7 +350,6 @@ OO.ui.infuse = function ( idOrNode ) {
         * Alternative implementations of OO.ui.msg may use any substitution system they like, as long as
         * they support unnamed, ordered message parameters.
         *
-        * @abstract
         * @param {string} key Message key
         * @param {Mixed...} [params] Message parameters
         * @return {string} Translated message with parameters substituted
@@ -370,67 +369,150 @@ OO.ui.infuse = function ( idOrNode ) {
                }
                return message;
        };
+} )();
 
-       /**
-        * Package a message and arguments for deferred resolution.
-        *
-        * Use this when you are statically specifying a message and the message may not yet be present.
-        *
-        * @param {string} key Message key
-        * @param {Mixed...} [params] Message parameters
-        * @return {Function} Function that returns the resolved message when executed
-        */
-       OO.ui.deferMsg = function () {
-               var args = arguments;
-               return function () {
-                       return OO.ui.msg.apply( OO.ui, args );
-               };
+/**
+ * Package a message and arguments for deferred resolution.
+ *
+ * Use this when you are statically specifying a message and the message may not yet be present.
+ *
+ * @param {string} key Message key
+ * @param {Mixed...} [params] Message parameters
+ * @return {Function} Function that returns the resolved message when executed
+ */
+OO.ui.deferMsg = function () {
+       var args = arguments;
+       return function () {
+               return OO.ui.msg.apply( OO.ui, args );
        };
+};
 
-       /**
       * Resolve a message.
       *
       * If the message is a function it will be executed, otherwise it will pass through directly.
       *
       * @param {Function|string} msg Deferred message, or message text
       * @return {string} Resolved message
       */
-       OO.ui.resolveMsg = function ( msg ) {
-               if ( $.isFunction( msg ) ) {
-                       return msg();
-               }
-               return msg;
-       };
+/**
+ * Resolve a message.
+ *
+ * If the message is a function it will be executed, otherwise it will pass through directly.
+ *
+ * @param {Function|string} msg Deferred message, or message text
+ * @return {string} Resolved message
+ */
+OO.ui.resolveMsg = function ( msg ) {
+       if ( $.isFunction( msg ) ) {
+               return msg();
+       }
+       return msg;
+};
 
-       /**
       * @param {string} url
       * @return {boolean}
       */
-       OO.ui.isSafeUrl = function ( url ) {
-               var protocol,
-                       // Keep in sync with php/Tag.php
-                       whitelist = [
-                               'bitcoin:', 'ftp:', 'ftps:', 'geo:', 'git:', 'gopher:', 'http:', 'https:', 'irc:', 'ircs:',
-                               'magnet:', 'mailto:', 'mms:', 'news:', 'nntp:', 'redis:', 'sftp:', 'sip:', 'sips:', 'sms:', 'ssh:',
-                               'svn:', 'tel:', 'telnet:', 'urn:', 'worldwind:', 'xmpp:'
-                       ];
-
-               if ( url.indexOf( ':' ) === -1 ) {
-                       // No protocol, safe
-                       return true;
-               }
+/**
+ * @param {string} url
+ * @return {boolean}
+ */
+OO.ui.isSafeUrl = function ( url ) {
+       var protocol,
+               // Keep in sync with php/Tag.php
+               whitelist = [
+                       'bitcoin:', 'ftp:', 'ftps:', 'geo:', 'git:', 'gopher:', 'http:', 'https:', 'irc:', 'ircs:',
+                       'magnet:', 'mailto:', 'mms:', 'news:', 'nntp:', 'redis:', 'sftp:', 'sip:', 'sips:', 'sms:', 'ssh:',
+                       'svn:', 'tel:', 'telnet:', 'urn:', 'worldwind:', 'xmpp:'
+               ];
+
+       if ( url.indexOf( ':' ) === -1 ) {
+               // No protocol, safe
+               return true;
+       }
 
-               protocol = url.split( ':', 1 )[ 0 ] + ':';
-               if ( !protocol.match( /^([A-za-z0-9\+\.\-])+:/ ) ) {
-                       // Not a valid protocol, safe
-                       return true;
-               }
+       protocol = url.split( ':', 1 )[ 0 ] + ':';
+       if ( !protocol.match( /^([A-za-z0-9\+\.\-])+:/ ) ) {
+               // Not a valid protocol, safe
+               return true;
+       }
 
-               // Safe if in the whitelist
-               return whitelist.indexOf( protocol ) !== -1;
-       };
+       // Safe if in the whitelist
+       return whitelist.indexOf( protocol ) !== -1;
+};
 
-} )();
+/**
+ * Lazy-initialize and return a global OO.ui.WindowManager instance, used by OO.ui.alert and
+ * OO.ui.confirm.
+ *
+ * @private
+ * @return {OO.ui.WindowManager}
+ */
+OO.ui.getWindowManager = function () {
+       if ( !OO.ui.windowManager ) {
+               OO.ui.windowManager = new OO.ui.WindowManager();
+               $( 'body' ).append( OO.ui.windowManager.$element );
+               OO.ui.windowManager.addWindows( {
+                       messageDialog: new OO.ui.MessageDialog()
+               } );
+       }
+       return OO.ui.windowManager;
+};
+
+/**
+ * Display a quick modal alert dialog, using a OO.ui.MessageDialog. While the dialog is open, the
+ * rest of the page will be dimmed out and the user won't be able to interact with it. The dialog
+ * has only one action button, labelled "OK", clicking it will simply close the dialog.
+ *
+ * A window manager is created automatically when this function is called for the first time.
+ *
+ *     @example
+ *     OO.ui.alert( 'Something happened!' ).done( function () {
+ *         console.log( 'User closed the dialog.' );
+ *     } );
+ *
+ * @param {jQuery|string} text Message text to display
+ * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
+ * @return {jQuery.Promise} Promise resolved when the user closes the dialog
+ */
+OO.ui.alert = function ( text, options ) {
+       return OO.ui.getWindowManager().openWindow( 'messageDialog', $.extend( {
+               message: text,
+               verbose: true,
+               actions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]
+       }, options ) ).then( function ( opened ) {
+               return opened.then( function ( closing ) {
+                       return closing.then( function () {
+                               return $.Deferred().resolve();
+                       } );
+               } );
+       } );
+};
+
+/**
+ * Display a quick modal confirmation dialog, using a OO.ui.MessageDialog. While the dialog is open,
+ * the rest of the page will be dimmed out and the user won't be able to interact with it. The
+ * dialog has two action buttons, one to confirm an operation (labelled "OK") and one to cancel it
+ * (labelled "Cancel").
+ *
+ * A window manager is created automatically when this function is called for the first time.
+ *
+ *     @example
+ *     OO.ui.confirm( 'Are you sure?' ).done( function ( confirmed ) {
+ *         if ( confirmed ) {
+ *             console.log( 'User clicked "OK"!' );
+ *         } else {
+ *             console.log( 'User clicked "Cancel" or closed the dialog.' );
+ *         }
+ *     } );
+ *
+ * @param {jQuery|string} text Message text to display
+ * @param {Object} [options] Additional options, see OO.ui.MessageDialog#getSetupProcess
+ * @return {jQuery.Promise} Promise resolved when the user closes the dialog. If the user chose to
+ *  confirm, the promise will resolve to boolean `true`; otherwise, it will resolve to boolean
+ *  `false`.
+ */
+OO.ui.confirm = function ( text, options ) {
+       return OO.ui.getWindowManager().openWindow( 'messageDialog', $.extend( {
+               message: text,
+               verbose: true
+       }, options ) ).then( function ( opened ) {
+               return opened.then( function ( closing ) {
+                       return closing.then( function ( data ) {
+                               return $.Deferred().resolve( !!( data && data.action === 'accept' ) );
+                       } );
+               } );
+       } );
+};
 
 /*!
  * Mixin namespace.
@@ -1289,17 +1371,25 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
                        }
                }
        } );
-       // jscs:disable requireCapitalizedConstructors
-       obj = new cls( data ); // rebuild widget
+       // allow widgets to reuse parts of the DOM
+       data = cls.static.reusePreInfuseDOM( $elem[ 0 ], data );
        // pick up dynamic state, like focus, value of form inputs, scroll position, etc.
-       state = obj.gatherPreInfuseState( $elem );
+       state = cls.static.gatherPreInfuseState( $elem[ 0 ], data );
+       // rebuild widget
+       // jscs:disable requireCapitalizedConstructors
+       obj = new cls( data );
+       // jscs:enable requireCapitalizedConstructors
        // now replace old DOM with this new DOM.
        if ( top ) {
-               $elem.replaceWith( obj.$element );
-               // This element is now gone from the DOM, but if anyone is holding a reference to it,
-               // let's allow them to OO.ui.infuse() it and do what they expect (T105828).
-               // Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.
-               $elem[ 0 ].oouiInfused = obj;
+               // An efficient constructor might be able to reuse the entire DOM tree of the original element,
+               // so only mutate the DOM if we need to.
+               if ( $elem[ 0 ] !== obj.$element[ 0 ] ) {
+                       $elem.replaceWith( obj.$element );
+                       // This element is now gone from the DOM, but if anyone is holding a reference to it,
+                       // let's allow them to OO.ui.infuse() it and do what they expect (T105828).
+                       // Do not use jQuery.data(), as using it on detached nodes leaks memory in 1.x line by design.
+                       $elem[ 0 ].oouiInfused = obj;
+               }
                top.resolve();
        }
        obj.$element.data( 'ooui-infused', obj );
@@ -1310,6 +1400,40 @@ OO.ui.Element.static.unsafeInfuse = function ( idOrNode, domPromise ) {
        return obj;
 };
 
+/**
+ * Pick out parts of `node`'s DOM to be reused when infusing a widget.
+ *
+ * This method **must not** make any changes to the DOM, only find interesting pieces and add them
+ * to `config` (which should then be returned). Actual DOM juggling should then be done by the
+ * constructor, which will be given the enhanced config.
+ *
+ * @protected
+ * @param {HTMLElement} node
+ * @param {Object} config
+ * @return {Object}
+ */
+OO.ui.Element.static.reusePreInfuseDOM = function ( node, config ) {
+       return config;
+};
+
+/**
+ * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
+ * (and its children) that represent an Element of the same class and the given configuration,
+ * generated by the PHP implementation.
+ *
+ * This method is called just before `node` is detached from the DOM. The return value of this
+ * function will be passed to #restorePreInfuseState after the newly created widget's #$element
+ * is inserted into DOM to replace `node`.
+ *
+ * @protected
+ * @param {HTMLElement} node
+ * @param {Object} config
+ * @return {Object}
+ */
+OO.ui.Element.static.gatherPreInfuseState = function () {
+       return {};
+};
+
 /**
  * Get a jQuery function within a specific document.
  *
@@ -1888,23 +2012,6 @@ OO.ui.Element.prototype.scrollElementIntoView = function ( config ) {
        return OO.ui.Element.static.scrollIntoView( this.$element[ 0 ], config );
 };
 
-/**
- * Gather the dynamic state (focus, value of form inputs, scroll position, etc.) of a HTML DOM node
- * (and its children) that represent an Element of the same type and configuration as the current
- * one, generated by the PHP implementation.
- *
- * This method is called just before `node` is detached from the DOM. The return value of this
- * function will be passed to #restorePreInfuseState after this widget's #$element is inserted into
- * DOM to replace `node`.
- *
- * @protected
- * @param {HTMLElement} node
- * @return {Object}
- */
-OO.ui.Element.prototype.gatherPreInfuseState = function () {
-       return {};
-};
-
 /**
  * Restore the pre-infusion dynamic state for this widget.
  *
@@ -2382,7 +2489,6 @@ OO.ui.Window.prototype.getDir = function () {
  * To add window content that persists between openings, you may wish to use the #initialize method
  * instead.
  *
- * @abstract
  * @param {Object} [data] Window opening data
  * @return {OO.ui.Process} Setup process
  */
@@ -2401,7 +2507,6 @@ OO.ui.Window.prototype.getSetupProcess = function () {
  * provides using the {@link OO.ui.Process#first first} and {@link OO.ui.Process#next next}
  * methods of OO.ui.Process.
  *
- * @abstract
  * @param {Object} [data] Window opening data
  * @return {OO.ui.Process} Ready process
  */
@@ -2420,7 +2525,6 @@ OO.ui.Window.prototype.getReadyProcess = function () {
  * using the {@link OO.ui.Process#first first} and {@link OO.ui.Process#next next} methods
  * of OO.ui.Process.
  *
- * @abstract
  * @param {Object} [data] Window closing data
  * @return {OO.ui.Process} Hold process
  */
@@ -2439,7 +2543,6 @@ OO.ui.Window.prototype.getHoldProcess = function () {
  * using the {@link OO.ui.Process#first first} and {@link OO.ui.Process#next next} methods
  * of OO.ui.Process.
  *
- * @abstract
  * @param {Object} [data] Window closing data
  * @return {OO.ui.Process} Teardown process
  */
@@ -2644,22 +2747,18 @@ OO.ui.Window.prototype.close = function ( data ) {
  * @return {jQuery.Promise} Promise resolved when window is setup
  */
 OO.ui.Window.prototype.setup = function ( data ) {
-       var win = this,
-               deferred = $.Deferred();
+       var win = this;
 
        this.toggle( true );
 
        this.focusTrapHandler = OO.ui.bind( this.onFocusTrapFocused, this );
        this.$focusTraps.on( 'focus', this.focusTrapHandler );
 
-       this.getSetupProcess( data ).execute().done( function () {
+       return this.getSetupProcess( data ).execute().then( function () {
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.addClass( 'oo-ui-window-active oo-ui-window-setup' ).width();
                win.$content.addClass( 'oo-ui-window-content-setup' ).width();
-               deferred.resolve();
        } );
-
-       return deferred.promise();
 };
 
 /**
@@ -2672,18 +2771,14 @@ OO.ui.Window.prototype.setup = function ( data ) {
  * @return {jQuery.Promise} Promise resolved when window is ready
  */
 OO.ui.Window.prototype.ready = function ( data ) {
-       var win = this,
-               deferred = $.Deferred();
+       var win = this;
 
        this.$content.focus();
-       this.getReadyProcess( data ).execute().done( function () {
+       return this.getReadyProcess( data ).execute().then( function () {
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.addClass( 'oo-ui-window-ready' ).width();
                win.$content.addClass( 'oo-ui-window-content-ready' ).width();
-               deferred.resolve();
        } );
-
-       return deferred.promise();
 };
 
 /**
@@ -2696,10 +2791,9 @@ OO.ui.Window.prototype.ready = function ( data ) {
  * @return {jQuery.Promise} Promise resolved when window is held
  */
 OO.ui.Window.prototype.hold = function ( data ) {
-       var win = this,
-               deferred = $.Deferred();
+       var win = this;
 
-       this.getHoldProcess( data ).execute().done( function () {
+       return this.getHoldProcess( data ).execute().then( function () {
                // Get the focused element within the window's content
                var $focus = win.$content.find( OO.ui.Element.static.getDocument( win.$content ).activeElement );
 
@@ -2711,10 +2805,7 @@ OO.ui.Window.prototype.hold = function ( data ) {
                // Force redraw by asking the browser to measure the elements' widths
                win.$element.removeClass( 'oo-ui-window-ready' ).width();
                win.$content.removeClass( 'oo-ui-window-content-ready' ).width();
-               deferred.resolve();
        } );
-
-       return deferred.promise();
 };
 
 /**
@@ -2729,14 +2820,13 @@ OO.ui.Window.prototype.hold = function ( data ) {
 OO.ui.Window.prototype.teardown = function ( data ) {
        var win = this;
 
-       return this.getTeardownProcess( data ).execute()
-               .done( function () {
-                       // Force redraw by asking the browser to measure the elements' widths
-                       win.$element.removeClass( 'oo-ui-window-active oo-ui-window-setup' ).width();
-                       win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
-                       win.$focusTraps.off( 'focus', win.focusTrapHandler );
-                       win.toggle( false );
-               } );
+       return this.getTeardownProcess( data ).execute().then( function () {
+               // Force redraw by asking the browser to measure the elements' widths
+               win.$element.removeClass( 'oo-ui-window-active oo-ui-window-setup' ).width();
+               win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
+               win.$focusTraps.off( 'focus', win.focusTrapHandler );
+               win.toggle( false );
+       } );
 };
 
 /**
@@ -2933,7 +3023,6 @@ OO.ui.Dialog.prototype.getActions = function () {
  * accept steps to the process the parent method provides using the {@link OO.ui.Process#first 'first'}
  * and {@link OO.ui.Process#next 'next'} methods of OO.ui.Process.
  *
- * @abstract
  * @param {string} [action] Symbolic name of action
  * @return {OO.ui.Process} Action process
  */
@@ -3454,8 +3543,18 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
                                                        manager.opening = null;
                                                        manager.opened = $.Deferred();
                                                        opening.resolve( manager.opened.promise(), data );
+                                               }, function () {
+                                                       manager.opening = null;
+                                                       manager.opened = $.Deferred();
+                                                       opening.reject();
+                                                       manager.closeWindow( win );
                                                } );
                                        }, manager.getReadyDelay() );
+                               }, function () {
+                                       manager.opening = null;
+                                       manager.opened = $.Deferred();
+                                       opening.reject();
+                                       manager.closeWindow( win );
                                } );
                        }, manager.getSetupDelay() );
                } );
@@ -3506,7 +3605,7 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) {
                // If the window is currently opening, close it when it's done
                this.preparingToClose = $.when( this.opening );
                // Ensure handlers get called after preparingToClose is set
-               this.preparingToClose.done( function () {
+               this.preparingToClose.always( function () {
                        manager.closing = closing;
                        manager.preparingToClose = null;
                        manager.emit( 'closing', win, closing, data );
@@ -4055,10 +4154,10 @@ OO.inheritClass( OO.ui.ToolFactory, OO.Factory );
 /**
  * Get tools from the factory
  *
- * @param {Array} include Included tools
- * @param {Array} exclude Excluded tools
- * @param {Array} promote Promoted tools
- * @param {Array} demote Demoted tools
+ * @param {Array|string} [include] Included tools, see #extract for format
+ * @param {Array|string} [exclude] Excluded tools, see #extract for format
+ * @param {Array|string} [promote] Promoted tools, see #extract for format
+ * @param {Array|string} [demote] Demoted tools, see #extract for format
  * @return {string[]} List of tools
  */
 OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, demote ) {
@@ -4086,17 +4185,24 @@ OO.ui.ToolFactory.prototype.getTools = function ( include, exclude, promote, dem
 /**
  * Get a flat list of names from a list of names or groups.
  *
- * Tools can be specified in the following ways:
+ * Normally, `collection` is an array of tool specifications. Tools can be specified in the
+ * following ways:
+ *
+ * - To include an individual tool, use the symbolic name: `{ name: 'tool-name' }` or `'tool-name'`.
+ * - To include all tools in a group, use the group name: `{ group: 'group-name' }`. (To assign the
+ *   tool to a group, use OO.ui.Tool.static.group.)
  *
- * - A specific tool: `{ name: 'tool-name' }` or `'tool-name'`
- * - All tools in a group: `{ group: 'group-name' }`
- * - All tools: `'*'`
+ * Alternatively, to include all tools that are not yet assigned to any other toolgroup, use the
+ * catch-all selector `'*'`.
+ *
+ * If `used` is passed, tool names that appear as properties in this object will be considered
+ * already assigned, and will not be returned even if specified otherwise. The tool names extracted
+ * by this function call will be added as new properties in the object.
  *
  * @private
- * @param {Array|string} collection List of tools
- * @param {Object} [used] Object with names that should be skipped as properties; extracted
- *  names will be added as properties
- * @return {string[]} List of extracted names
+ * @param {Array|string} collection List of tools, see above
+ * @param {Object} [used] Object containing information about used tools, see above
+ * @return {string[]} List of extracted tool names
  */
 OO.ui.ToolFactory.prototype.extract = function ( collection, used ) {
        var i, len, item, name, tool,
@@ -4262,6 +4368,132 @@ OO.ui.Theme.prototype.updateElementClasses = function ( element ) {
                .addClass( classes.on.join( ' ' ) );
 };
 
+/**
+ * RequestManager is a mixin that manages the lifecycle of a promise-backed request for a widget, such as
+ * the {@link OO.ui.mixin.LookupElement}.
+ *
+ * @class
+ * @abstract
+ *
+ * @constructor
+ */
+OO.ui.mixin.RequestManager = function OoUiMixinRequestManager() {
+       this.requestCache = {};
+       this.requestQuery = null;
+       this.requestRequest = null;
+};
+
+/* Setup */
+
+OO.initClass( OO.ui.mixin.RequestManager );
+
+/**
+ * Get request results for the current query.
+ *
+ * @return {jQuery.Promise} Promise object which will be passed response data as the first argument of
+ *   the done event. If the request was aborted to make way for a subsequent request, this promise
+ *   may not be rejected, depending on what jQuery feels like doing.
+ */
+OO.ui.mixin.RequestManager.prototype.getRequestData = function () {
+       var widget = this,
+               value = this.getRequestQuery(),
+               deferred = $.Deferred(),
+               ourRequest;
+
+       this.abortRequest();
+       if ( Object.prototype.hasOwnProperty.call( this.requestCache, value ) ) {
+               deferred.resolve( this.requestCache[ value ] );
+       } else {
+               if ( this.pushPending ) {
+                       this.pushPending();
+               }
+               this.requestQuery = value;
+               ourRequest = this.requestRequest = this.getRequest();
+               ourRequest
+                       .always( function () {
+                               // We need to pop pending even if this is an old request, otherwise
+                               // the widget will remain pending forever.
+                               // TODO: this assumes that an aborted request will fail or succeed soon after
+                               // being aborted, or at least eventually. It would be nice if we could popPending()
+                               // at abort time, but only if we knew that we hadn't already called popPending()
+                               // for that request.
+                               if ( widget.popPending ) {
+                                       widget.popPending();
+                               }
+                       } )
+                       .done( function ( response ) {
+                               // If this is an old request (and aborting it somehow caused it to still succeed),
+                               // ignore its success completely
+                               if ( ourRequest === widget.requestRequest ) {
+                                       widget.requestQuery = null;
+                                       widget.requestRequest = null;
+                                       widget.requestCache[ value ] = widget.getRequestCacheDataFromResponse( response );
+                                       deferred.resolve( widget.requestCache[ value ] );
+                               }
+                       } )
+                       .fail( function () {
+                               // If this is an old request (or a request failing because it's being aborted),
+                               // ignore its failure completely
+                               if ( ourRequest === widget.requestRequest ) {
+                                       widget.requestQuery = null;
+                                       widget.requestRequest = null;
+                                       deferred.reject();
+                               }
+                       } );
+       }
+       return deferred.promise();
+};
+
+/**
+ * Abort the currently pending request, if any.
+ *
+ * @private
+ */
+OO.ui.mixin.RequestManager.prototype.abortRequest = function () {
+       var oldRequest = this.requestRequest;
+       if ( oldRequest ) {
+               // First unset this.requestRequest to the fail handler will notice
+               // that the request is no longer current
+               this.requestRequest = null;
+               this.requestQuery = null;
+               oldRequest.abort();
+       }
+};
+
+/**
+ * Get the query to be made.
+ *
+ * @protected
+ * @method
+ * @abstract
+ * @return {string} query to be used
+ */
+OO.ui.mixin.RequestManager.prototype.getRequestQuery = null;
+
+/**
+ * Get a new request object of the current query value.
+ *
+ * @protected
+ * @method
+ * @abstract
+ * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method
+ */
+OO.ui.mixin.RequestManager.prototype.getRequest = null;
+
+/**
+ * Pre-process data returned by the request from #getRequest.
+ *
+ * The return value of this function will be cached, and any further queries for the given value
+ * will use the cache rather than doing API requests.
+ *
+ * @protected
+ * @method
+ * @abstract
+ * @param {Mixed} response Response from server
+ * @return {Mixed} Cached result data
+ */
+OO.ui.mixin.RequestManager.prototype.getRequestCacheDataFromResponse = null;
+
 /**
  * The TabIndexedElement class is an attribute mixin used to add additional functionality to an
  * element created by another class. The mixin provides a ‘tabIndex’ property, which specifies the
@@ -5883,10 +6115,15 @@ OO.ui.mixin.LabelElement.prototype.setLabelContent = function ( label ) {
  * @cfg {jQuery} [$container=this.$element] The container element. The lookup menu is rendered beneath the specified element.
  * @cfg {boolean} [allowSuggestionsWhenEmpty=false] Request and display a lookup menu when the text input is empty.
  *  By default, the lookup menu is not generated and displayed until the user begins to type.
+ * @cfg {boolean} [highlightFirst=true] Whether the first lookup result should be highlighted (so, that the user can
+ *  take it over into the input with simply pressing return) automatically or not.
  */
 OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
        // Configuration initialization
-       config = config || {};
+       config = $.extend( { highlightFirst: true }, config );
+
+       // Mixin constructors
+       OO.ui.mixin.RequestManager.call( this, config );
 
        // Properties
        this.$overlay = config.$overlay || this.$element;
@@ -5898,11 +6135,9 @@ OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
 
        this.allowSuggestionsWhenEmpty = config.allowSuggestionsWhenEmpty || false;
 
-       this.lookupCache = {};
-       this.lookupQuery = null;
-       this.lookupRequest = null;
        this.lookupsDisabled = false;
        this.lookupInputFocused = false;
+       this.lookupHighlightFirstItem = config.highlightFirst;
 
        // Events
        this.$input.on( {
@@ -5922,6 +6157,10 @@ OO.ui.mixin.LookupElement = function OoUiMixinLookupElement( config ) {
        this.$overlay.append( this.lookupMenu.$element );
 };
 
+/* Setup */
+
+OO.mixinClass( OO.ui.mixin.LookupElement, OO.ui.mixin.RequestManager );
+
 /* Methods */
 
 /**
@@ -6090,13 +6329,13 @@ OO.ui.mixin.LookupElement.prototype.populateLookupMenu = function () {
 };
 
 /**
- * Highlight the first selectable item in the menu.
+ * Highlight the first selectable item in the menu, if configured.
  *
  * @private
  * @chainable
  */
 OO.ui.mixin.LookupElement.prototype.initializeLookupMenuSelection = function () {
-       if ( !this.lookupMenu.getSelectedItem() ) {
+       if ( this.lookupHighlightFirstItem && !this.lookupMenu.getSelectedItem() ) {
                this.lookupMenu.highlightItem( this.lookupMenu.getFirstSelectableItem() );
        }
 };
@@ -6110,49 +6349,9 @@ OO.ui.mixin.LookupElement.prototype.initializeLookupMenuSelection = function ()
  *   will not be rejected: it will remain pending forever.
  */
 OO.ui.mixin.LookupElement.prototype.getLookupMenuItems = function () {
-       var widget = this,
-               value = this.getValue(),
-               deferred = $.Deferred(),
-               ourRequest;
-
-       this.abortLookupRequest();
-       if ( Object.prototype.hasOwnProperty.call( this.lookupCache, value ) ) {
-               deferred.resolve( this.getLookupMenuOptionsFromData( this.lookupCache[ value ] ) );
-       } else {
-               this.pushPending();
-               this.lookupQuery = value;
-               ourRequest = this.lookupRequest = this.getLookupRequest();
-               ourRequest
-                       .always( function () {
-                               // We need to pop pending even if this is an old request, otherwise
-                               // the widget will remain pending forever.
-                               // TODO: this assumes that an aborted request will fail or succeed soon after
-                               // being aborted, or at least eventually. It would be nice if we could popPending()
-                               // at abort time, but only if we knew that we hadn't already called popPending()
-                               // for that request.
-                               widget.popPending();
-                       } )
-                       .done( function ( response ) {
-                               // If this is an old request (and aborting it somehow caused it to still succeed),
-                               // ignore its success completely
-                               if ( ourRequest === widget.lookupRequest ) {
-                                       widget.lookupQuery = null;
-                                       widget.lookupRequest = null;
-                                       widget.lookupCache[ value ] = widget.getLookupCacheDataFromResponse( response );
-                                       deferred.resolve( widget.getLookupMenuOptionsFromData( widget.lookupCache[ value ] ) );
-                               }
-                       } )
-                       .fail( function () {
-                               // If this is an old request (or a request failing because it's being aborted),
-                               // ignore its failure completely
-                               if ( ourRequest === widget.lookupRequest ) {
-                                       widget.lookupQuery = null;
-                                       widget.lookupRequest = null;
-                                       deferred.reject();
-                               }
-                       } );
-       }
-       return deferred.promise();
+       return this.getRequestData().then( function ( data ) {
+               return this.getLookupMenuOptionsFromData( data );
+       }.bind( this ) );
 };
 
 /**
@@ -6161,27 +6360,18 @@ OO.ui.mixin.LookupElement.prototype.getLookupMenuItems = function () {
  * @private
  */
 OO.ui.mixin.LookupElement.prototype.abortLookupRequest = function () {
-       var oldRequest = this.lookupRequest;
-       if ( oldRequest ) {
-               // First unset this.lookupRequest to the fail handler will notice
-               // that the request is no longer current
-               this.lookupRequest = null;
-               this.lookupQuery = null;
-               oldRequest.abort();
-       }
+       this.abortRequest();
 };
 
 /**
  * Get a new request object of the current lookup query value.
  *
  * @protected
+ * @method
  * @abstract
  * @return {jQuery.Promise} jQuery AJAX object, or promise object with an .abort() method
  */
-OO.ui.mixin.LookupElement.prototype.getLookupRequest = function () {
-       // Stub, implemented in subclass
-       return null;
-};
+OO.ui.mixin.LookupElement.prototype.getLookupRequest = null;
 
 /**
  * Pre-process data returned by the request from #getLookupRequest.
@@ -6190,28 +6380,24 @@ OO.ui.mixin.LookupElement.prototype.getLookupRequest = function () {
  * will use the cache rather than doing API requests.
  *
  * @protected
+ * @method
  * @abstract
  * @param {Mixed} response Response from server
  * @return {Mixed} Cached result data
  */
-OO.ui.mixin.LookupElement.prototype.getLookupCacheDataFromResponse = function () {
-       // Stub, implemented in subclass
-       return [];
-};
+OO.ui.mixin.LookupElement.prototype.getLookupCacheDataFromResponse = null;
 
 /**
  * Get a list of menu option widgets from the (possibly cached) data returned by
  * #getLookupCacheDataFromResponse.
  *
  * @protected
+ * @method
  * @abstract
  * @param {Mixed} data Cached result data, usually an array
  * @return {OO.ui.MenuOptionWidget[]} Menu items
  */
-OO.ui.mixin.LookupElement.prototype.getLookupMenuOptionsFromData = function () {
-       // Stub, implemented in subclass
-       return [];
-};
+OO.ui.mixin.LookupElement.prototype.getLookupMenuOptionsFromData = null;
 
 /**
  * Set the read-only state of the widget.
@@ -6235,9 +6421,30 @@ OO.ui.mixin.LookupElement.prototype.setReadOnly = function ( readOnly ) {
 };
 
 /**
- * PopupElement is mixed into other classes to generate a {@link OO.ui.PopupWidget popup widget}.
- * A popup is a container for content. It is overlaid and positioned absolutely. By default, each
- * popup has an anchor, which is an arrow-like protrusion that points toward the popup’s origin.
+ * @inheritdoc OO.ui.mixin.RequestManager
+ */
+OO.ui.mixin.LookupElement.prototype.getRequestQuery = function () {
+       return this.getValue();
+};
+
+/**
+ * @inheritdoc OO.ui.mixin.RequestManager
+ */
+OO.ui.mixin.LookupElement.prototype.getRequest = function () {
+       return this.getLookupRequest();
+};
+
+/**
+ * @inheritdoc OO.ui.mixin.RequestManager
+ */
+OO.ui.mixin.LookupElement.prototype.getRequestCacheDataFromResponse = function ( response ) {
+       return this.getLookupCacheDataFromResponse( response );
+};
+
+/**
+ * PopupElement is mixed into other classes to generate a {@link OO.ui.PopupWidget popup widget}.
+ * A popup is a container for content. It is overlaid and positioned absolutely. By default, each
+ * popup has an anchor, which is an arrow-like protrusion that points toward the popup’s origin.
  * See {@link OO.ui.PopupWidget PopupWidget} for an example.
  *
  * @abstract
@@ -6565,7 +6772,8 @@ OO.ui.mixin.TitledElement.prototype.setTitledElement = function ( $titled ) {
  * @chainable
  */
 OO.ui.mixin.TitledElement.prototype.setTitle = function ( title ) {
-       title = typeof title === 'string' ? OO.ui.resolveMsg( title ) : null;
+       title = typeof title === 'function' ? OO.ui.resolveMsg( title ) : title;
+       title = ( typeof title === 'string' && title.length ) ? title : null;
 
        if ( this.title !== title ) {
                if ( this.$titled ) {
@@ -7106,6 +7314,11 @@ OO.ui.mixin.AccessKeyedElement.prototype.getAccessKey = function () {
  * out when the tool is selected. Tools must also be registered with a {@link OO.ui.ToolFactory tool factory},
  * which creates the tools on demand.
  *
+ * Every Tool subclass must implement two methods:
+ *
+ * - {@link #onUpdateState}
+ * - {@link #onSelect}
+ *
  * Tools are added to toolgroups ({@link OO.ui.ListToolGroup ListToolGroup},
  * {@link OO.ui.BarToolGroup BarToolGroup}, or {@link OO.ui.MenuToolGroup MenuToolGroup}), which determine how
  * the tool is displayed in the toolbar. See {@link OO.ui.Toolbar toolbars} for an example.
@@ -7294,32 +7507,31 @@ OO.ui.Tool.static.isCompatibleWith = function () {
 /* Methods */
 
 /**
- * Handle the toolbar state being updated.
+ * Handle the toolbar state being updated. This method is called when the
+ * {@link OO.ui.Toolbar#event-updateState 'updateState' event} is emitted on the
+ * {@link OO.ui.Toolbar Toolbar} that uses this tool, and should set the state of this tool
+ * depending on application state (usually by calling #setDisabled to enable or disable the tool,
+ * or #setActive to mark is as currently in-use or not).
  *
  * This is an abstract method that must be overridden in a concrete subclass.
  *
+ * @method
  * @protected
  * @abstract
  */
-OO.ui.Tool.prototype.onUpdateState = function () {
-       throw new Error(
-               'OO.ui.Tool.onUpdateState not implemented in this subclass:' + this.constructor
-       );
-};
+OO.ui.Tool.prototype.onUpdateState = null;
 
 /**
- * Handle the tool being selected.
+ * Handle the tool being selected. This method is called when the user triggers this tool,
+ * usually by clicking on its label/icon.
  *
  * This is an abstract method that must be overridden in a concrete subclass.
  *
+ * @method
  * @protected
  * @abstract
  */
-OO.ui.Tool.prototype.onSelect = function () {
-       throw new Error(
-               'OO.ui.Tool.onSelect not implemented in this subclass:' + this.constructor
-       );
-};
+OO.ui.Tool.prototype.onSelect = null;
 
 /**
  * Check if the tool is active.
@@ -7423,13 +7635,20 @@ OO.ui.Tool.prototype.destroy = function () {
  *
  * Individual tools are customized and then registered with a {@link OO.ui.ToolFactory tool factory}, which creates
  * the tools on demand. Each tool has a symbolic name (used when registering the tool), a title (e.g., ‘Insert
- * picture’), and an icon.
+ * image’), and an icon.
  *
  * Individual tools are organized in {@link OO.ui.ToolGroup toolgroups}, which can be {@link OO.ui.MenuToolGroup menus}
  * of tools, {@link OO.ui.ListToolGroup lists} of tools, or a single {@link OO.ui.BarToolGroup bar} of tools.
  * The arrangement and order of the toolgroups is customized when the toolbar is set up. Tools can be presented in
  * any order, but each can only appear once in the toolbar.
  *
+ * The toolbar can be synchronized with the state of the external "application", like a text
+ * editor's editing area, marking tools as active/inactive (e.g. a 'bold' tool would be shown as
+ * active when the text cursor was inside bolded text) or enabled/disabled (e.g. a table caption
+ * tool would be disabled while the user is not editing a table). A state change is signalled by
+ * emitting the {@link #event-updateState 'updateState' event}, which calls Tools'
+ * {@link OO.ui.Tool#onUpdateState onUpdateState method}.
+ *
  * The following is an example of a basic toolbar.
  *
  *     @example
@@ -7445,23 +7664,24 @@ OO.ui.Tool.prototype.destroy = function () {
  *     // Define the tools that we're going to place in our toolbar
  *
  *     // Create a class inheriting from OO.ui.Tool
- *     function PictureTool() {
- *         PictureTool.parent.apply( this, arguments );
+ *     function SearchTool() {
+ *         SearchTool.parent.apply( this, arguments );
  *     }
- *     OO.inheritClass( PictureTool, OO.ui.Tool );
+ *     OO.inheritClass( SearchTool, OO.ui.Tool );
  *     // Each tool must have a 'name' (used as an internal identifier, see later) and at least one
  *     // of 'icon' and 'title' (displayed icon and text).
- *     PictureTool.static.name = 'picture';
- *     PictureTool.static.icon = 'picture';
- *     PictureTool.static.title = 'Insert picture';
+ *     SearchTool.static.name = 'search';
+ *     SearchTool.static.icon = 'search';
+ *     SearchTool.static.title = 'Search...';
  *     // Defines the action that will happen when this tool is selected (clicked).
- *     PictureTool.prototype.onSelect = function () {
- *         $area.text( 'Picture tool clicked!' );
+ *     SearchTool.prototype.onSelect = function () {
+ *         $area.text( 'Search tool clicked!' );
  *         // Never display this tool as "active" (selected).
  *         this.setActive( false );
  *     };
+ *     SearchTool.prototype.onUpdateState = function () {};
  *     // Make this tool available in our toolFactory and thus our toolbar
- *     toolFactory.register( PictureTool );
+ *     toolFactory.register( SearchTool );
  *
  *     // Register two more tools, nothing interesting here
  *     function SettingsTool() {
@@ -7475,6 +7695,7 @@ OO.ui.Tool.prototype.destroy = function () {
  *         $area.text( 'Settings tool clicked!' );
  *         this.setActive( false );
  *     };
+ *     SettingsTool.prototype.onUpdateState = function () {};
  *     toolFactory.register( SettingsTool );
  *
  *     // Register two more tools, nothing interesting here
@@ -7489,6 +7710,7 @@ OO.ui.Tool.prototype.destroy = function () {
  *         $area.text( 'More stuff tool clicked!' );
  *         this.setActive( false );
  *     };
+ *     StuffTool.prototype.onUpdateState = function () {};
  *     toolFactory.register( StuffTool );
  *
  *     // This is a PopupTool. Rather than having a custom 'onSelect' action, it will display a
@@ -7513,7 +7735,7 @@ OO.ui.Tool.prototype.destroy = function () {
  *         {
  *             // 'bar' tool groups display tools' icons only, side-by-side.
  *             type: 'bar',
- *             include: [ 'picture', 'help' ]
+ *             include: [ 'search', 'help' ]
  *         },
  *         {
  *             // 'list' tool groups display both the titles and icons, in a dropdown list.
@@ -7545,9 +7767,10 @@ OO.ui.Tool.prototype.destroy = function () {
  *     // Here is where the toolbar is actually built. This must be done after inserting it into the
  *     // document.
  *     toolbar.initialize();
+ *     toolbar.emit( 'updateState' );
  *
  * The following example extends the previous one to illustrate 'menu' toolgroups and the usage of
- * 'updateState' event.
+ * {@link #event-updateState 'updateState' event}.
  *
  *     @example
  *     // Create the toolbar
@@ -7561,28 +7784,24 @@ OO.ui.Tool.prototype.destroy = function () {
  *     // Define the tools that we're going to place in our toolbar
  *
  *     // Create a class inheriting from OO.ui.Tool
- *     function PictureTool() {
- *         PictureTool.parent.apply( this, arguments );
+ *     function SearchTool() {
+ *         SearchTool.parent.apply( this, arguments );
  *     }
- *     OO.inheritClass( PictureTool, OO.ui.Tool );
+ *     OO.inheritClass( SearchTool, OO.ui.Tool );
  *     // Each tool must have a 'name' (used as an internal identifier, see later) and at least one
  *     // of 'icon' and 'title' (displayed icon and text).
- *     PictureTool.static.name = 'picture';
- *     PictureTool.static.icon = 'picture';
- *     PictureTool.static.title = 'Insert picture';
+ *     SearchTool.static.name = 'search';
+ *     SearchTool.static.icon = 'search';
+ *     SearchTool.static.title = 'Search...';
  *     // Defines the action that will happen when this tool is selected (clicked).
- *     PictureTool.prototype.onSelect = function () {
- *         $area.text( 'Picture tool clicked!' );
+ *     SearchTool.prototype.onSelect = function () {
+ *         $area.text( 'Search tool clicked!' );
  *         // Never display this tool as "active" (selected).
  *         this.setActive( false );
  *     };
- *     // The toolbar can be synchronized with the state of some external stuff, like a text
- *     // editor's editing area, highlighting the tools (e.g. a 'bold' tool would be shown as active
- *     // when the text cursor was inside bolded text). Here we simply disable this feature.
- *     PictureTool.prototype.onUpdateState = function () {
- *     };
+ *     SearchTool.prototype.onUpdateState = function () {};
  *     // Make this tool available in our toolFactory and thus our toolbar
- *     toolFactory.register( PictureTool );
+ *     toolFactory.register( SearchTool );
  *
  *     // Register two more tools, nothing interesting here
  *     function SettingsTool() {
@@ -7601,8 +7820,7 @@ OO.ui.Tool.prototype.destroy = function () {
  *         // To update the menu label
  *         this.toolbar.emit( 'updateState' );
  *     };
- *     SettingsTool.prototype.onUpdateState = function () {
- *     };
+ *     SettingsTool.prototype.onUpdateState = function () {};
  *     toolFactory.register( SettingsTool );
  *
  *     // Register two more tools, nothing interesting here
@@ -7622,8 +7840,7 @@ OO.ui.Tool.prototype.destroy = function () {
  *         // To update the menu label
  *         this.toolbar.emit( 'updateState' );
  *     };
- *     StuffTool.prototype.onUpdateState = function () {
- *     };
+ *     StuffTool.prototype.onUpdateState = function () {};
  *     toolFactory.register( StuffTool );
  *
  *     // This is a PopupTool. Rather than having a custom 'onSelect' action, it will display a
@@ -7648,7 +7865,7 @@ OO.ui.Tool.prototype.destroy = function () {
  *         {
  *             // 'bar' tool groups display tools' icons only, side-by-side.
  *             type: 'bar',
- *             include: [ 'picture', 'help' ]
+ *             include: [ 'search', 'help' ]
  *         },
  *         {
  *             // 'menu' tool groups display both the titles and icons, in a dropdown menu.
@@ -7746,6 +7963,18 @@ OO.inheritClass( OO.ui.Toolbar, OO.ui.Element );
 OO.mixinClass( OO.ui.Toolbar, OO.EventEmitter );
 OO.mixinClass( OO.ui.Toolbar, OO.ui.mixin.GroupElement );
 
+/* Events */
+
+/**
+ * @event updateState
+ *
+ * An 'updateState' event must be emitted on the Toolbar (by calling `toolbar.emit( 'updateState' )`)
+ * every time the state of the application using the toolbar changes, and an update to the state of
+ * tools is required.
+ *
+ * @param {Mixed...} data Application-defined parameters
+ */
+
 /* Methods */
 
 /**
@@ -7925,19 +8154,9 @@ OO.ui.Toolbar.prototype.getToolAccelerator = function () {
  * to which a tool belongs determines how the tool is arranged and displayed in the toolbar. Toolgroups
  * themselves are created on demand with a {@link OO.ui.ToolGroupFactory toolgroup factory}.
  *
- * Toolgroups can contain individual tools, groups of tools, or all available tools:
- *
- * To include an individual tool (or array of individual tools), specify tools by symbolic name:
- *
- *      include: [ 'tool-name' ] or [ { name: 'tool-name' }]
- *
- * To include a group of tools, specify the group name. (The tool's static ‘group’ config is used to assign the tool to a group.)
- *
- *      include: [ { group: 'group-name' } ]
- *
- *  To include all tools that are not yet assigned to a toolgroup, use the catch-all selector, an asterisk (*):
- *
- *      include: '*'
+ * Toolgroups can contain individual tools, groups of tools, or all available tools, as specified
+ * using the `include` config option. See OO.ui.ToolFactory#extract on documentation of the format.
+ * The options `exclude`, `promote`, and `demote` support the same formats.
  *
  * See {@link OO.ui.Toolbar toolbars} for a full example. For more information about toolbars in general,
  * please see the [OOjs UI documentation on MediaWiki][1].
@@ -7952,10 +8171,10 @@ OO.ui.Toolbar.prototype.getToolAccelerator = function () {
  * @constructor
  * @param {OO.ui.Toolbar} toolbar
  * @param {Object} [config] Configuration options
- * @cfg {Array|string} [include=[]] List of tools to include in the toolgroup.
- * @cfg {Array|string} [exclude=[]] List of tools to exclude from the toolgroup.
- * @cfg {Array|string} [promote=[]] List of tools to promote to the beginning of the toolgroup.
- * @cfg {Array|string} [demote=[]] List of tools to demote to the end of the toolgroup.
+ * @cfg {Array|string} [include] List of tools to include in the toolgroup, see above.
+ * @cfg {Array|string} [exclude] List of tools to exclude from the toolgroup, see above.
+ * @cfg {Array|string} [promote] List of tools to promote to the beginning of the toolgroup, see above.
+ * @cfg {Array|string} [demote] List of tools to demote to the end of the toolgroup, see above.
  *  This setting is particularly useful when tools have been added to the toolgroup
  *  en masse (e.g., via the catch-all selector).
  */
@@ -8375,6 +8594,7 @@ OO.ui.MessageDialog.static.title = null;
  */
 OO.ui.MessageDialog.static.message = null;
 
+// Note that OO.ui.alert() and OO.ui.confirm() rely on these.
 OO.ui.MessageDialog.static.actions = [
        { action: 'accept', label: OO.ui.deferMsg( 'ooui-dialog-message-accept' ), flags: 'primary' },
        { action: 'reject', label: OO.ui.deferMsg( 'ooui-dialog-message-reject' ), flags: 'safe' }
@@ -9020,7 +9240,7 @@ OO.ui.ProcessDialog.prototype.getTeardownProcess = function ( data ) {
  * @throws {Error} An error is thrown if no widget is specified
  */
 OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
-       var hasInputWidget, div, i;
+       var hasInputWidget, div;
 
        // Allow passing positional parameters inside the config object
        if ( OO.isPlainObject( fieldWidget ) && config === undefined ) {
@@ -9047,8 +9267,8 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
 
        // Properties
        this.fieldWidget = fieldWidget;
-       this.errors = config.errors || [];
-       this.notices = config.notices || [];
+       this.errors = [];
+       this.notices = [];
        this.$field = $( '<div>' );
        this.$messages = $( '<ul>' );
        this.$body = $( '<' + ( hasInputWidget ? 'label' : 'div' ) + '>' );
@@ -9084,9 +9304,6 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
        this.$element
                .addClass( 'oo-ui-fieldLayout' )
                .append( this.$help, this.$body );
-       if ( this.errors.length || this.notices.length ) {
-               this.$element.append( this.$messages );
-       }
        this.$body.addClass( 'oo-ui-fieldLayout-body' );
        this.$messages.addClass( 'oo-ui-fieldLayout-messages' );
        this.$field
@@ -9094,13 +9311,8 @@ OO.ui.FieldLayout = function OoUiFieldLayout( fieldWidget, config ) {
                .toggleClass( 'oo-ui-fieldLayout-disable', this.fieldWidget.isDisabled() )
                .append( this.fieldWidget.$element );
 
-       for ( i = 0; i < this.notices.length; i++ ) {
-               this.$messages.append( this.makeMessage( 'notice', this.notices[ i ] ) );
-       }
-       for ( i = 0; i < this.errors.length; i++ ) {
-               this.$messages.append( this.makeMessage( 'error', this.errors[ i ] ) );
-       }
-
+       this.setErrors( config.errors || [] );
+       this.setNotices( config.notices || [] );
        this.setAlignment( config.align );
 };
 
@@ -9143,6 +9355,7 @@ OO.ui.FieldLayout.prototype.getField = function () {
 };
 
 /**
+ * @protected
  * @param {string} kind 'error' or 'notice'
  * @param {string|OO.ui.HtmlSnippet} text
  * @return {jQuery}
@@ -9198,6 +9411,56 @@ OO.ui.FieldLayout.prototype.setAlignment = function ( value ) {
        return this;
 };
 
+/**
+ * Set the list of error messages.
+ *
+ * @param {Array} errors Error messages about the widget, which will be displayed below the widget.
+ *  The array may contain strings or OO.ui.HtmlSnippet instances.
+ * @chainable
+ */
+OO.ui.FieldLayout.prototype.setErrors = function ( errors ) {
+       this.errors = errors.slice();
+       this.updateMessages();
+       return this;
+};
+
+/**
+ * Set the list of notice messages.
+ *
+ * @param {Array} notices Notices about the widget, which will be displayed below the widget.
+ *  The array may contain strings or OO.ui.HtmlSnippet instances.
+ * @chainable
+ */
+OO.ui.FieldLayout.prototype.setNotices = function ( notices ) {
+       this.notices = notices.slice();
+       this.updateMessages();
+       return this;
+};
+
+/**
+ * Update the rendering of error and notice messages.
+ *
+ * @private
+ */
+OO.ui.FieldLayout.prototype.updateMessages = function () {
+       var i;
+       this.$messages.empty();
+
+       if ( this.errors.length || this.notices.length ) {
+               this.$body.after( this.$messages );
+       } else {
+               this.$messages.remove();
+               return;
+       }
+
+       for ( i = 0; i < this.notices.length; i++ ) {
+               this.$messages.append( this.makeMessage( 'notice', this.notices[ i ] ) );
+       }
+       for ( i = 0; i < this.errors.length; i++ ) {
+               this.$messages.append( this.makeMessage( 'error', this.errors[ i ] ) );
+       }
+};
+
 /**
  * ActionFieldLayouts are used with OO.ui.FieldsetLayout. The layout consists of a field-widget, a button,
  * and an optional label and/or help text. The field-widget (e.g., a {@link OO.ui.TextInputWidget TextInputWidget}),
@@ -9730,6 +9993,8 @@ OO.ui.BookletLayout = function OoUiBookletLayout( config ) {
        this.stackLayout.connect( this, { set: 'onStackLayoutSet' } );
        if ( this.outlined ) {
                this.outlineSelectWidget.connect( this, { select: 'onOutlineSelectWidgetSelect' } );
+               this.scrolling = false;
+               this.stackLayout.connect( this, { visibleItemChange: 'onStackLayoutVisibleItemChange' } );
        }
        if ( this.autoFocus ) {
                // Event 'focus' does not bubble, but 'focusin' does
@@ -9801,6 +10066,22 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
        }
 };
 
+/**
+ * Handle visibleItemChange events from the stackLayout
+ *
+ * The next visible page is set as the current page by selecting it
+ * in the outline
+ *
+ * @param {OO.ui.PageLayout} page The next visible page in the layout
+ */
+OO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page ) {
+       // Set a flag to so that the resulting call to #onStackLayoutSet doesn't
+       // try and scroll the item into view again.
+       this.scrolling = true;
+       this.outlineSelectWidget.selectItemByData( page.getName() );
+       this.scrolling = false;
+};
+
 /**
  * Handle stack layout set events.
  *
@@ -9809,7 +10090,7 @@ OO.ui.BookletLayout.prototype.onStackLayoutFocus = function ( e ) {
  */
 OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
        var layout = this;
-       if ( page ) {
+       if ( !this.scrolling && page ) {
                page.scrollElementIntoView( { complete: function () {
                        if ( layout.autoFocus ) {
                                layout.focus();
@@ -11020,6 +11301,7 @@ OO.ui.StackLayout = function OoUiStackLayout( config ) {
        this.$element.addClass( 'oo-ui-stackLayout' );
        if ( this.continuous ) {
                this.$element.addClass( 'oo-ui-stackLayout-continuous' );
+               this.$element.on( 'scroll', OO.ui.debounce( this.onScroll.bind( this ), 250 ) );
        }
        if ( Array.isArray( config.items ) ) {
                this.addItems( config.items );
@@ -11041,8 +11323,66 @@ OO.mixinClass( OO.ui.StackLayout, OO.ui.mixin.GroupElement );
  * @param {OO.ui.Layout|null} item Current panel or `null` if no panel is shown
  */
 
+/**
+ * When used in continuous mode, this event is emitted when the user scrolls down
+ * far enough such that currentItem is no longer visible.
+ *
+ * @event visibleItemChange
+ * @param {OO.ui.PanelLayout} panel The next visible item in the layout
+ */
+
 /* Methods */
 
+/**
+ * Handle scroll events from the layout element
+ *
+ * @param {jQuery.Event} e
+ * @fires visibleItemChange
+ */
+OO.ui.StackLayout.prototype.onScroll = function () {
+       var currentRect,
+               len = this.items.length,
+               currentIndex = this.items.indexOf( this.currentItem ),
+               newIndex = currentIndex,
+               containerRect = this.$element[ 0 ].getBoundingClientRect();
+
+       if ( !containerRect || ( !containerRect.top && !containerRect.bottom ) ) {
+               // Can't get bounding rect, possibly not attached.
+               return;
+       }
+
+       function getRect( item ) {
+               return item.$element[ 0 ].getBoundingClientRect();
+       }
+
+       function isVisible( item ) {
+               var rect = getRect( item );
+               return rect.bottom > containerRect.top && rect.top < containerRect.bottom;
+       }
+
+       currentRect = getRect( this.currentItem );
+
+       if ( currentRect.bottom < containerRect.top ) {
+               // Scrolled down past current item
+               while ( ++newIndex < len ) {
+                       if ( isVisible( this.items[ newIndex ] ) ) {
+                               break;
+                       }
+               }
+       } else if ( currentRect.top > containerRect.bottom ) {
+               // Scrolled up past current item
+               while ( --newIndex >= 0 ) {
+                       if ( isVisible( this.items[ newIndex ] ) ) {
+                               break;
+                       }
+               }
+       }
+
+       if ( newIndex !== currentIndex ) {
+               this.emit( 'visibleItemChange', this.items[ newIndex ] );
+       }
+};
+
 /**
  * Get the current panel.
  *
@@ -11253,23 +11593,24 @@ OO.mixinClass( OO.ui.HorizontalLayout, OO.ui.mixin.GroupElement );
  *     // Define the tools that we're going to place in our toolbar
  *
  *     // Create a class inheriting from OO.ui.Tool
- *     function PictureTool() {
- *         PictureTool.parent.apply( this, arguments );
+ *     function SearchTool() {
+ *         SearchTool.parent.apply( this, arguments );
  *     }
- *     OO.inheritClass( PictureTool, OO.ui.Tool );
+ *     OO.inheritClass( SearchTool, OO.ui.Tool );
  *     // Each tool must have a 'name' (used as an internal identifier, see later) and at least one
  *     // of 'icon' and 'title' (displayed icon and text).
- *     PictureTool.static.name = 'picture';
- *     PictureTool.static.icon = 'picture';
- *     PictureTool.static.title = 'Insert picture';
+ *     SearchTool.static.name = 'search';
+ *     SearchTool.static.icon = 'search';
+ *     SearchTool.static.title = 'Search...';
  *     // Defines the action that will happen when this tool is selected (clicked).
- *     PictureTool.prototype.onSelect = function () {
- *         $area.text( 'Picture tool clicked!' );
+ *     SearchTool.prototype.onSelect = function () {
+ *         $area.text( 'Search tool clicked!' );
  *         // Never display this tool as "active" (selected).
  *         this.setActive( false );
  *     };
+ *     SearchTool.prototype.onUpdateState = function () {};
  *     // Make this tool available in our toolFactory and thus our toolbar
- *     toolFactory.register( PictureTool );
+ *     toolFactory.register( SearchTool );
  *
  *     // This is a PopupTool. Rather than having a custom 'onSelect' action, it will display a
  *     // little popup window (a PopupWidget).
@@ -11293,7 +11634,7 @@ OO.mixinClass( OO.ui.HorizontalLayout, OO.ui.mixin.GroupElement );
  *         {
  *             // 'bar' tool groups display tools by icon only
  *             type: 'bar',
- *             include: [ 'picture', 'help' ]
+ *             include: [ 'search', 'help' ]
  *         }
  *     ] );
  *
@@ -11595,6 +11936,7 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
  *     SettingsTool.prototype.onSelect = function () {
  *         this.setActive( false );
  *     };
+ *     SettingsTool.prototype.onUpdateState = function () {};
  *     toolFactory.register( SettingsTool );
  *     // Register two more tools, nothing interesting here
  *     function StuffTool() {
@@ -11602,11 +11944,12 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
  *     }
  *     OO.inheritClass( StuffTool, OO.ui.Tool );
  *     StuffTool.static.name = 'stuff';
- *     StuffTool.static.icon = 'ellipsis';
+ *     StuffTool.static.icon = 'search';
  *     StuffTool.static.title = 'Change the world';
  *     StuffTool.prototype.onSelect = function () {
  *         this.setActive( false );
  *     };
+ *     StuffTool.prototype.onUpdateState = function () {};
  *     toolFactory.register( StuffTool );
  *     toolbar.setup( [
  *         {
@@ -11614,7 +11957,7 @@ OO.ui.PopupToolGroup.prototype.setActive = function ( value ) {
  *             type: 'list',
  *             label: 'ListToolGroup',
  *             indicator: 'down',
- *             icon: 'picture',
+ *             icon: 'ellipsis',
  *             title: 'This is the title, displayed when user moves the mouse over the list toolgroup',
  *             header: 'This is the header',
  *             include: [ 'settings', 'stuff' ],
@@ -11780,8 +12123,7 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
  * the menu label is empty. The menu can be configured with an indicator, icon, title, and/or header.
  *
  * MenuToolGroups are created by a {@link OO.ui.ToolGroupFactory tool group factory} when the toolbar
- * is set up. Note that all tools must define an {@link OO.ui.Tool#onUpdateState onUpdateState} method if
- * a MenuToolGroup is used.
+ * is set up.
  *
  *     @example
  *     // Example of a MenuToolGroup
@@ -11810,8 +12152,7 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
  *         // To update the menu label
  *         this.toolbar.emit( 'updateState' );
  *     };
- *     SettingsTool.prototype.onUpdateState = function () {
- *     };
+ *     SettingsTool.prototype.onUpdateState = function () {};
  *     toolFactory.register( SettingsTool );
  *
  *     function StuffTool() {
@@ -11830,8 +12171,7 @@ OO.ui.ListToolGroup.prototype.updateCollapsibleState = function () {
  *         // To update the menu label
  *         this.toolbar.emit( 'updateState' );
  *     };
- *     StuffTool.prototype.onUpdateState = function () {
- *     };
+ *     StuffTool.prototype.onUpdateState = function () {};
  *     toolFactory.register( StuffTool );
  *
  *     // Finally define which tools and in what order appear in the toolbar. Each tool may only be
@@ -13078,7 +13418,7 @@ OO.ui.ToggleButtonWidget.prototype.setButtonElement = function ( $button ) {
 };
 
 /**
- * CapsuleMultiSelectWidgets are something like a {@link OO.ui.ComboBoxWidget combo box widget}
+ * CapsuleMultiSelectWidgets are something like a {@link OO.ui.ComboBoxInputWidget combo box widget}
  * that allows for selecting multiple values.
  *
  * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
@@ -13168,6 +13508,7 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
        OO.ui.mixin.IconElement.call( this, config );
 
        // Properties
+       this.$content = $( '<div>' );
        this.allowArbitrary = !!config.allowArbitrary;
        this.$overlay = config.$overlay || this.$element;
        this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
@@ -13199,7 +13540,8 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
                this.$input.on( {
                        focus: this.onInputFocus.bind( this ),
                        blur: this.onInputBlur.bind( this ),
-                       'propertychange change click mouseup keydown keyup input cut paste select': this.onInputChange.bind( this ),
+                       'propertychange change click mouseup keydown keyup input cut paste select focus':
+                               OO.ui.debounce( this.updateInputSize.bind( this ) ),
                        keydown: this.onKeyDown.bind( this ),
                        keypress: this.onKeyPress.bind( this )
                } );
@@ -13210,7 +13552,7 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
                remove: 'onMenuItemsChange'
        } );
        this.$handle.on( {
-               click: this.onClick.bind( this )
+               mousedown: this.onMouseDown.bind( this )
        } );
 
        // Initialization
@@ -13220,21 +13562,23 @@ OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget( config )
                        role: 'combobox',
                        'aria-autocomplete': 'list'
                } );
-               this.$input.width( '1em' );
+               this.updateInputSize();
        }
        if ( config.data ) {
                this.setItemsFromData( config.data );
        }
+       this.$content.addClass( 'oo-ui-capsuleMultiSelectWidget-content' )
+               .append( this.$group );
        this.$group.addClass( 'oo-ui-capsuleMultiSelectWidget-group' );
        this.$handle.addClass( 'oo-ui-capsuleMultiSelectWidget-handle' )
-               .append( this.$indicator, this.$icon, this.$group );
+               .append( this.$indicator, this.$icon, this.$content );
        this.$element.addClass( 'oo-ui-capsuleMultiSelectWidget' )
                .append( this.$handle );
        if ( this.popup ) {
-               this.$handle.append( $tabFocus );
+               this.$content.append( $tabFocus );
                this.$overlay.append( this.popup.$element );
        } else {
-               this.$handle.append( this.$input );
+               this.$content.append( this.$input );
                this.$overlay.append( this.menu.$element );
        }
        this.onMenuItemsChange();
@@ -13399,6 +13743,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.addItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
+               this.menu.position();
        }
 
        return this;
@@ -13423,6 +13768,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.removeItems = function ( items ) {
        }
        if ( !same ) {
                this.emit( 'change', this.getItemsData() );
+               this.menu.position();
        }
 
        return this;
@@ -13435,6 +13781,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.clearItems = function () {
        if ( this.items.length ) {
                OO.ui.mixin.GroupElement.prototype.clearItems.call( this );
                this.emit( 'change', this.getItemsData() );
+               this.menu.position();
        }
        return this;
 };
@@ -13510,15 +13857,17 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onPopupFocusOut = function () {
 };
 
 /**
- * Handle mouse click events.
+ * Handle mouse down events.
  *
  * @private
- * @param {jQuery.Event} e Mouse click event
+ * @param {jQuery.Event} e Mouse down event
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onClick = function ( e ) {
+OO.ui.CapsuleMultiSelectWidget.prototype.onMouseDown = function ( e ) {
        if ( e.which === 1 ) {
                this.focus();
                return false;
+       } else {
+               this.updateInputSize();
        }
 };
 
@@ -13552,7 +13901,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onKeyPress = function ( e ) {
                        }
 
                        // Make sure the input gets resized.
-                       setTimeout( this.onInputChange.bind( this ), 0 );
+                       setTimeout( this.updateInputSize.bind( this ), 0 );
                }
        }
 };
@@ -13576,14 +13925,42 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onKeyDown = function ( e ) {
 };
 
 /**
- * Handle input change events.
+ * Update the dimensions of the text input field to encompass all available area.
  *
  * @private
  * @param {jQuery.Event} e Event of some sort
  */
-OO.ui.CapsuleMultiSelectWidget.prototype.onInputChange = function () {
+OO.ui.CapsuleMultiSelectWidget.prototype.updateInputSize = function () {
+       var $lastItem, direction, contentWidth, currentWidth, bestWidth;
        if ( !this.isDisabled() ) {
-               this.$input.width( this.$input.val().length + 'em' );
+               this.$input.css( 'width', '1em' );
+               $lastItem = this.$group.children().last();
+               direction = OO.ui.Element.static.getDir( this.$handle );
+               contentWidth = this.$input[ 0 ].scrollWidth;
+               currentWidth = this.$input.width();
+
+               if ( contentWidth < currentWidth ) {
+                       // All is fine, don't perform expensive calculations
+                       return;
+               }
+
+               if ( !$lastItem.length ) {
+                       bestWidth = this.$content.innerWidth();
+               } else {
+                       bestWidth = direction === 'ltr' ?
+                               this.$content.innerWidth() - $lastItem.position().left - $lastItem.outerWidth() :
+                               $lastItem.position().left;
+               }
+               // Some safety margin for sanity, because I *really* don't feel like finding out where the few
+               // pixels this is off by are coming from.
+               bestWidth -= 10;
+               if ( contentWidth > bestWidth ) {
+                       // This will result in the input getting shifted to the next line
+                       bestWidth = this.$content.innerWidth() - 10;
+               }
+               this.$input.width( Math.floor( bestWidth ) );
+
+               this.menu.position();
        }
 };
 
@@ -13617,7 +13994,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.onMenuItemsChange = function () {
 OO.ui.CapsuleMultiSelectWidget.prototype.clearInput = function () {
        if ( this.$input ) {
                this.$input.val( '' );
-               this.$input.width( '1em' );
+               this.updateInputSize();
        }
        if ( this.popup ) {
                this.popup.toggle( false );
@@ -13670,6 +14047,7 @@ OO.ui.CapsuleMultiSelectWidget.prototype.focus = function () {
                                .first()
                                .focus();
                } else {
+                       this.updateInputSize();
                        this.menu.toggle( true );
                        this.$input.focus();
                }
@@ -14002,7 +14380,7 @@ OO.ui.SelectFileWidget = function OoUiSelectFileWidget( config ) {
 
        this.selectButton = new OO.ui.ButtonWidget( {
                classes: [ 'oo-ui-selectFileWidget-selectButton' ],
-               label: 'Select a file',
+               label: OO.ui.msg( 'ooui-selectfile-button-select' ),
                disabled: this.disabled || !this.isSupported
        } );
 
@@ -14150,10 +14528,6 @@ OO.ui.SelectFileWidget.prototype.updateUI = function () {
                        this.setLabel( this.placeholder );
                }
        }
-
-       if ( this.$input ) {
-               this.$input.attr( 'title', this.getLabel() );
-       }
 };
 
 /**
@@ -14174,8 +14548,7 @@ OO.ui.SelectFileWidget.prototype.addInput = function () {
        this.$input = $( '<input type="file">' );
        this.$input.on( 'change', this.onFileSelectedHandler );
        this.$input.attr( {
-               tabindex: -1,
-               title: this.getLabel()
+               tabindex: -1
        } );
        if ( this.accept ) {
                this.$input.attr( 'accept', this.accept.join( ', ' ) );
@@ -14491,7 +14864,7 @@ OO.ui.IndicatorWidget.static.tagName = 'span';
  * @param {Object} [config] Configuration options
  * @cfg {string} [name=''] The value of the input’s HTML `name` attribute.
  * @cfg {string} [value=''] The value of the input.
- * @cfg {string} [accessKey=''] The access key of the input.
+ * @cfg {string} [dir] The directionality of the input (ltr/rtl).
  * @cfg {Function} [inputFilter] The name of an input filter function. Input filters modify the value of an input
  *  before it is accepted.
  */
@@ -14526,6 +14899,9 @@ OO.ui.InputWidget = function OoUiInputWidget( config ) {
                .append( this.$input );
        this.setValue( config.value );
        this.setAccessKey( config.accessKey );
+       if ( config.dir ) {
+               this.setDir( config.dir );
+       }
 };
 
 /* Setup */
@@ -14540,6 +14916,29 @@ OO.mixinClass( OO.ui.InputWidget, OO.ui.mixin.AccessKeyedElement );
 
 OO.ui.InputWidget.static.supportsSimpleLabel = true;
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.InputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+       config = OO.ui.InputWidget.parent.static.reusePreInfuseDOM( node, config );
+       // Reusing $input lets browsers preserve inputted values across page reloads (T114134)
+       config.$input = $( node ).find( '.oo-ui-inputWidget-input' );
+       return config;
+};
+
+/**
+ * @inheritdoc
+ */
+OO.ui.InputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.InputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.value = config.$input.val();
+       // Might be better in TabIndexedElement, but it's awkward to do there because mixins are awkward
+       state.focus = config.$input.is( ':focus' );
+       return state;
+};
+
 /* Events */
 
 /**
@@ -14562,8 +14961,9 @@ OO.ui.InputWidget.static.supportsSimpleLabel = true;
  * @param {Object} config Configuration options
  * @return {jQuery} Input element
  */
-OO.ui.InputWidget.prototype.getInputElement = function () {
-       return $( '<input>' );
+OO.ui.InputWidget.prototype.getInputElement = function ( config ) {
+       // See #reusePreInfuseDOM about config.$input
+       return config.$input || $( '<input>' );
 };
 
 /**
@@ -14598,13 +14998,26 @@ OO.ui.InputWidget.prototype.getValue = function () {
 };
 
 /**
- * Set the direction of the input, either RTL (right-to-left) or LTR (left-to-right).
+ * Set the directionality of the input, either RTL (right-to-left) or LTR (left-to-right).
  *
- * @param {boolean} isRTL
- * Direction is right-to-left
+ * @deprecated since v0.13.1, use #setDir directly
+ * @param {boolean} isRTL Directionality is right-to-left
+ * @chainable
  */
 OO.ui.InputWidget.prototype.setRTL = function ( isRTL ) {
-       this.$input.prop( 'dir', isRTL ? 'rtl' : 'ltr' );
+       this.setDir( isRTL ? 'rtl' : 'ltr' );
+       return this;
+};
+
+/**
+ * Set the directionality of the input.
+ *
+ * @param {string} dir Text directionality: 'ltr', 'rtl' or 'auto'
+ * @chainable
+ */
+OO.ui.InputWidget.prototype.setDir = function ( dir ) {
+       this.$input.prop( 'dir', dir );
+       return this;
 };
 
 /**
@@ -14718,19 +15131,6 @@ OO.ui.InputWidget.prototype.blur = function () {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.InputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.InputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = state.$input || $( node ).find( '.oo-ui-inputWidget-input' );
-       state.value = $input.val();
-       // Might be better in TabIndexedElement, but it's awkward to do there because mixins are awkward
-       state.focus = $input.is( ':focus' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -14826,9 +15226,12 @@ OO.ui.ButtonInputWidget.static.supportsSimpleLabel = false;
  * @protected
  */
 OO.ui.ButtonInputWidget.prototype.getInputElement = function ( config ) {
-       var type = [ 'button', 'submit', 'reset' ].indexOf( config.type ) !== -1 ?
-               config.type :
-               'button';
+       var type;
+       // See InputWidget#reusePreInfuseDOM about config.$input
+       if ( config.$input ) {
+               return config.$input.empty();
+       }
+       type = [ 'button', 'submit', 'reset' ].indexOf( config.type ) !== -1 ? config.type : 'button';
        return $( '<' + ( config.useInputTag ? 'input' : 'button' ) + ' type="' + type + '">' );
 };
 
@@ -14936,6 +15339,17 @@ OO.ui.CheckboxInputWidget = function OoUiCheckboxInputWidget( config ) {
 
 OO.inheritClass( OO.ui.CheckboxInputWidget, OO.ui.InputWidget );
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.CheckboxInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.CheckboxInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.checked = config.$input.prop( 'checked' );
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -14990,18 +15404,6 @@ OO.ui.CheckboxInputWidget.prototype.isSelected = function () {
        return this.selected;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.CheckboxInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.CheckboxInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       state.checked = $input.prop( 'checked' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -15080,7 +15482,11 @@ OO.mixinClass( OO.ui.DropdownInputWidget, OO.ui.mixin.TitledElement );
  * @inheritdoc
  * @protected
  */
-OO.ui.DropdownInputWidget.prototype.getInputElement = function () {
+OO.ui.DropdownInputWidget.prototype.getInputElement = function ( config ) {
+       // See InputWidget#reusePreInfuseDOM about config.$input
+       if ( config.$input ) {
+               return config.$input.addClass( 'oo-ui-element-hidden' );
+       }
        return $( '<input type="hidden">' );
 };
 
@@ -15225,6 +15631,17 @@ OO.ui.RadioInputWidget = function OoUiRadioInputWidget( config ) {
 
 OO.inheritClass( OO.ui.RadioInputWidget, OO.ui.InputWidget );
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.RadioInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.checked = config.$input.prop( 'checked' );
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -15263,18 +15680,6 @@ OO.ui.RadioInputWidget.prototype.isSelected = function () {
        return this.$input.prop( 'checked' );
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.RadioInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.RadioInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       state.checked = $input.prop( 'checked' );
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -15341,6 +15746,17 @@ OO.inheritClass( OO.ui.RadioSelectInputWidget, OO.ui.InputWidget );
 
 OO.ui.RadioSelectInputWidget.static.supportsSimpleLabel = false;
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.RadioSelectInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.RadioSelectInputWidget.parent.static.gatherPreInfuseState( node, config );
+       state.value = $( node ).find( '.oo-ui-radioInputWidget .oo-ui-inputWidget-input:checked' ).val();
+       return state;
+};
+
 /* Methods */
 
 /**
@@ -15416,15 +15832,6 @@ OO.ui.RadioSelectInputWidget.prototype.setOptions = function ( options ) {
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.RadioSelectInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var state = OO.ui.RadioSelectInputWidget.parent.prototype.gatherPreInfuseState.call( this, node );
-       state.value = $( node ).find( '.oo-ui-radioInputWidget .oo-ui-inputWidget-input:checked' ).val();
-       return state;
-};
-
 /**
  * TextInputWidgets, like HTML text inputs, can be configured with options that customize the
  * size of the field as well as its presentation. In addition, these widgets can be configured
@@ -15517,6 +15924,8 @@ OO.ui.TextInputWidget = function OoUiTextInputWidget( config ) {
        this.minRows = config.rows !== undefined ? config.rows : '';
        this.maxRows = config.maxRows || Math.max( 2 * ( this.minRows || 0 ), 10 );
        this.validate = null;
+       this.styleHeight = null;
+       this.scrollWidth = null;
 
        // Clone for resizing
        if ( this.autosize ) {
@@ -15603,6 +16012,19 @@ OO.ui.TextInputWidget.static.validationPatterns = {
        integer: /^\d+$/
 };
 
+/* Static Methods */
+
+/**
+ * @inheritdoc
+ */
+OO.ui.TextInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+       var state = OO.ui.TextInputWidget.parent.static.gatherPreInfuseState( node, config );
+       if ( config.multiline ) {
+               state.scrollTop = config.$input.scrollTop();
+       }
+       return state;
+};
+
 /* Events */
 
 /**
@@ -15613,6 +16035,12 @@ OO.ui.TextInputWidget.static.validationPatterns = {
  * @event enter
  */
 
+/**
+ * A `resize` event is emitted when autosize is set and the widget resizes
+ *
+ * @event resize
+ */
+
 /* Methods */
 
 /**
@@ -15802,48 +16230,70 @@ OO.ui.TextInputWidget.prototype.installParentChangeDetector = function () {
  * This only affects #multiline inputs that are {@link #autosize autosized}.
  *
  * @chainable
+ * @fires resize
  */
 OO.ui.TextInputWidget.prototype.adjustSize = function () {
-       var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError, idealHeight;
+       var scrollHeight, innerHeight, outerHeight, maxInnerHeight, measurementError,
+               idealHeight, newHeight, scrollWidth, property;
 
-       if ( this.multiline && this.autosize && this.$input.val() !== this.valCache ) {
-               this.$clone
-                       .val( this.$input.val() )
-                       .attr( 'rows', this.minRows )
-                       // Set inline height property to 0 to measure scroll height
-                       .css( 'height', 0 );
+       if ( this.multiline && this.$input.val() !== this.valCache ) {
+               if ( this.autosize ) {
+                       this.$clone
+                               .val( this.$input.val() )
+                               .attr( 'rows', this.minRows )
+                               // Set inline height property to 0 to measure scroll height
+                               .css( 'height', 0 );
 
-               this.$clone.removeClass( 'oo-ui-element-hidden' );
+                       this.$clone.removeClass( 'oo-ui-element-hidden' );
 
-               this.valCache = this.$input.val();
+                       this.valCache = this.$input.val();
 
-               scrollHeight = this.$clone[ 0 ].scrollHeight;
+                       scrollHeight = this.$clone[ 0 ].scrollHeight;
 
-               // Remove inline height property to measure natural heights
-               this.$clone.css( 'height', '' );
-               innerHeight = this.$clone.innerHeight();
-               outerHeight = this.$clone.outerHeight();
+                       // Remove inline height property to measure natural heights
+                       this.$clone.css( 'height', '' );
+                       innerHeight = this.$clone.innerHeight();
+                       outerHeight = this.$clone.outerHeight();
 
-               // Measure max rows height
-               this.$clone
-                       .attr( 'rows', this.maxRows )
-                       .css( 'height', 'auto' )
-                       .val( '' );
-               maxInnerHeight = this.$clone.innerHeight();
+                       // Measure max rows height
+                       this.$clone
+                               .attr( 'rows', this.maxRows )
+                               .css( 'height', 'auto' )
+                               .val( '' );
+                       maxInnerHeight = this.$clone.innerHeight();
 
-               // Difference between reported innerHeight and scrollHeight with no scrollbars present
-               // Equals 1 on Blink-based browsers and 0 everywhere else
-               measurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;
-               idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
+                       // Difference between reported innerHeight and scrollHeight with no scrollbars present
+                       // Equals 1 on Blink-based browsers and 0 everywhere else
+                       measurementError = maxInnerHeight - this.$clone[ 0 ].scrollHeight;
+                       idealHeight = Math.min( maxInnerHeight, scrollHeight + measurementError );
 
-               this.$clone.addClass( 'oo-ui-element-hidden' );
+                       this.$clone.addClass( 'oo-ui-element-hidden' );
 
-               // Only apply inline height when expansion beyond natural height is needed
-               if ( idealHeight > innerHeight ) {
+                       // Only apply inline height when expansion beyond natural height is needed
                        // Use the difference between the inner and outer height as a buffer
-                       this.$input.css( 'height', idealHeight + ( outerHeight - innerHeight ) );
-               } else {
-                       this.$input.css( 'height', '' );
+                       newHeight = idealHeight > innerHeight ? idealHeight + ( outerHeight - innerHeight ) : '';
+                       if ( newHeight !== this.styleHeight ) {
+                               this.$input.css( 'height', newHeight );
+                               this.styleHeight = newHeight;
+                               this.emit( 'resize' );
+                       }
+               }
+               scrollWidth = this.$input[ 0 ].offsetWidth - this.$input[ 0 ].clientWidth;
+               if ( scrollWidth !== this.scrollWidth ) {
+                       property = this.$element.css( 'direction' ) === 'rtl' ? 'left' : 'right';
+                       // Reset
+                       this.$label.css( { right: '', left: '' } );
+                       this.$indicator.css( { right: '', left: '' } );
+
+                       if ( scrollWidth ) {
+                               this.$indicator.css( property, scrollWidth );
+                               if ( this.labelPosition === 'after' ) {
+                                       this.$label.css( property, scrollWidth );
+                               }
+                       }
+
+                       this.scrollWidth = scrollWidth;
+                       this.positionLabel();
                }
        }
        return this;
@@ -15892,30 +16342,132 @@ OO.ui.TextInputWidget.prototype.isAutosizing = function () {
 };
 
 /**
- * Select the entire text of the input.
+ * Focus the input and select a specified range within the text.
  *
+ * @param {number} from Select from offset
+ * @param {number} [to] Select to offset, defaults to from
  * @chainable
  */
-OO.ui.TextInputWidget.prototype.select = function () {
-       this.$input.select();
+OO.ui.TextInputWidget.prototype.selectRange = function ( from, to ) {
+       var textRange, isBackwards, start, end,
+               input = this.$input[ 0 ];
+
+       to = to || from;
+
+       isBackwards = to < from;
+       start = isBackwards ? to : from;
+       end = isBackwards ? from : to;
+
+       this.focus();
+
+       if ( input.setSelectionRange ) {
+               input.setSelectionRange( start, end, isBackwards ? 'backward' : 'forward' );
+       } else if ( input.createTextRange ) {
+               // IE 8 and below
+               textRange = input.createTextRange();
+               textRange.collapse( true );
+               textRange.moveStart( 'character', start );
+               textRange.moveEnd( 'character', end - start );
+               textRange.select();
+       }
        return this;
 };
 
+/**
+ * Get an object describing the current selection range in a directional manner
+ *
+ * @return {Object} Object containing 'from' and 'to' offsets
+ */
+OO.ui.TextInputWidget.prototype.getRange = function () {
+       var input = this.$input[ 0 ],
+               start = input.selectionStart,
+               end = input.selectionEnd,
+               isBackwards = input.selectionDirection === 'backward';
+
+       return {
+               from: isBackwards ? end : start,
+               to: isBackwards ? start : end
+       };
+};
+
+/**
+ * Get the length of the text input value.
+ *
+ * This could differ from the length of #getValue if the
+ * value gets filtered
+ *
+ * @return {number} Input length
+ */
+OO.ui.TextInputWidget.prototype.getInputLength = function () {
+       return this.$input[ 0 ].value.length;
+};
+
+/**
+ * Focus the input and select the entire text.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.select = function () {
+       return this.selectRange( 0, this.getInputLength() );
+};
+
+/**
+ * Focus the input and move the cursor to the start.
+ *
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.moveCursorToStart = function () {
+       return this.selectRange( 0 );
+};
+
 /**
  * Focus the input and move the cursor to the end.
+ *
+ * @chainable
  */
 OO.ui.TextInputWidget.prototype.moveCursorToEnd = function () {
-       var textRange,
-               element = this.$input[ 0 ];
-       this.focus();
-       if ( element.selectionStart !== undefined ) {
-               element.selectionStart = element.selectionEnd = element.value.length;
-       } else if ( element.createTextRange ) {
-               // IE 8 and below
-               textRange = element.createTextRange();
-               textRange.collapse( false );
-               textRange.select();
-       }
+       return this.selectRange( this.getInputLength() );
+};
+
+/**
+ * Insert new content into the input.
+ *
+ * @param {string} content Content to be inserted
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.insertContent = function ( content ) {
+       var start, end,
+               range = this.getRange(),
+               value = this.getValue();
+
+       start = Math.min( range.from, range.to );
+       end = Math.max( range.from, range.to );
+
+       this.setValue( value.slice( 0, start ) + content + value.slice( end ) );
+       this.selectRange( start + content.length );
+       return this;
+};
+
+/**
+ * Insert new content either side of a selection.
+ *
+ * @param {string} pre Content to be inserted before the selection
+ * @param {string} post Content to be inserted after the selection
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.encapsulateContent = function ( pre, post ) {
+       var start, end,
+               range = this.getRange(),
+               offset = pre.length;
+
+       start = Math.min( range.from, range.to );
+       end = Math.max( range.from, range.to );
+
+       this.selectRange( start ).insertContent( pre );
+       this.selectRange( offset + end ).insertContent( post );
+
+       this.selectRange( offset + start, offset + end );
+       return this;
 };
 
 /**
@@ -16043,14 +16595,6 @@ OO.ui.TextInputWidget.prototype.setLabelPosition = function ( labelPosition ) {
        return this;
 };
 
-/**
- * Deprecated alias of #setLabelPosition
- *
- * @deprecated Use setLabelPosition instead.
- */
-OO.ui.TextInputWidget.prototype.setPosition =
-       OO.ui.TextInputWidget.prototype.setLabelPosition;
-
 /**
  * Update the position of the inline label.
  *
@@ -16066,6 +16610,9 @@ OO.ui.TextInputWidget.prototype.updatePosition = function () {
                .toggleClass( 'oo-ui-textInputWidget-labelPosition-after', !!this.label && after )
                .toggleClass( 'oo-ui-textInputWidget-labelPosition-before', !!this.label && !after );
 
+       this.valCache = null;
+       this.scrollWidth = null;
+       this.adjustSize();
        this.positionLabel();
 
        return this;
@@ -16112,25 +16659,11 @@ OO.ui.TextInputWidget.prototype.positionLabel = function () {
        rtl = this.$element.css( 'direction' ) === 'rtl';
        property = after === rtl ? 'padding-left' : 'padding-right';
 
-       this.$input.css( property, this.$label.outerWidth( true ) );
+       this.$input.css( property, this.$label.outerWidth( true ) + ( after ? this.scrollWidth : 0 ) );
 
        return this;
 };
 
-/**
- * @inheritdoc
- */
-OO.ui.TextInputWidget.prototype.gatherPreInfuseState = function ( node ) {
-       var
-               state = OO.ui.TextInputWidget.parent.prototype.gatherPreInfuseState.call( this, node ),
-               $input = $( node ).find( '.oo-ui-inputWidget-input' );
-       state.$input = $input; // shortcut for performance, used in InputWidget
-       if ( this.multiline ) {
-               state.scrollTop = $input.scrollTop();
-       }
-       return state;
-};
-
 /**
  * @inheritdoc
  */
@@ -16142,7 +16675,7 @@ OO.ui.TextInputWidget.prototype.restorePreInfuseState = function ( state ) {
 };
 
 /**
- * ComboBoxWidgets combine a {@link OO.ui.TextInputWidget text input} (where a value
+ * ComboBoxInputWidgets combine a {@link OO.ui.TextInputWidget text input} (where a value
  * can be entered manually) and a {@link OO.ui.MenuSelectWidget menu of options} (from which
  * a value can be chosen instead). Users can choose options from the combo box in one of two ways:
  *
@@ -16151,13 +16684,15 @@ OO.ui.TextInputWidget.prototype.restorePreInfuseState = function ( state ) {
  * - by choosing a value from the menu. The value of the chosen option will then appear in the text
  *   input field.
  *
+ * This widget can be used inside a HTML form, such as a OO.ui.FormLayout.
+ *
  * For more information about menus and options, please see the [OOjs UI documentation on MediaWiki][1].
  *
  *     @example
- *     // Example: A ComboBoxWidget.
- *     var comboBox = new OO.ui.ComboBoxWidget( {
- *         label: 'ComboBoxWidget',
- *         input: { value: 'Option One' },
+ *     // Example: A ComboBoxInputWidget.
+ *     var comboBox = new OO.ui.ComboBoxInputWidget( {
+ *         label: 'ComboBoxInputWidget',
+ *         value: 'Option 1',
  *         menu: {
  *             items: [
  *                 new OO.ui.MenuOptionWidget( {
@@ -16188,60 +16723,47 @@ OO.ui.TextInputWidget.prototype.restorePreInfuseState = function ( state ) {
  * [1]: https://www.mediawiki.org/wiki/OOjs_UI/Widgets/Selects_and_Options#Menu_selects_and_options
  *
  * @class
- * @extends OO.ui.Widget
- * @mixins OO.ui.mixin.TabIndexedElement
+ * @extends OO.ui.TextInputWidget
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {Object[]} [options=[]] Array of menu options in the format `{ data: …, label: … }`
  * @cfg {Object} [menu] Configuration options to pass to the {@link OO.ui.FloatingMenuSelectWidget menu select widget}.
- * @cfg {Object} [input] Configuration options to pass to the {@link OO.ui.TextInputWidget text input widget}.
  * @cfg {jQuery} [$overlay] Render the menu into a separate layer. This configuration is useful in cases where
  *  the expanded menu is larger than its containing `<div>`. The specified overlay layer is usually on top of the
  *  containing `<div>` and has a larger area. By default, the menu uses relative positioning.
  */
-OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
+OO.ui.ComboBoxInputWidget = function OoUiComboBoxInputWidget( config ) {
        // Configuration initialization
-       config = config || {};
+       config = $.extend( {
+               indicator: 'down'
+       }, config );
+       // For backwards-compatibility with ComboBoxWidget config
+       $.extend( config, config.input );
 
        // Parent constructor
-       OO.ui.ComboBoxWidget.parent.call( this, config );
-
-       // Properties (must be set before TabIndexedElement constructor call)
-       this.$indicator = this.$( '<span>' );
-
-       // Mixin constructors
-       OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: this.$indicator } ) );
+       OO.ui.ComboBoxInputWidget.parent.call( this, config );
 
        // Properties
        this.$overlay = config.$overlay || this.$element;
-       this.input = new OO.ui.TextInputWidget( $.extend(
-               {
-                       indicator: 'down',
-                       $indicator: this.$indicator,
-                       disabled: this.isDisabled()
-               },
-               config.input
-       ) );
-       this.input.$input.eq( 0 ).attr( {
-               role: 'combobox',
-               'aria-autocomplete': 'list'
-       } );
        this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
                {
                        widget: this,
-                       input: this.input,
-                       $container: this.input.$element,
+                       input: this,
+                       $container: this.$element,
                        disabled: this.isDisabled()
                },
                config.menu
        ) );
+       // For backwards-compatibility with ComboBoxWidget
+       this.input = this;
 
        // Events
        this.$indicator.on( {
-               click: this.onClick.bind( this ),
-               keypress: this.onKeyPress.bind( this )
+               click: this.onIndicatorClick.bind( this ),
+               keypress: this.onIndicatorKeyPress.bind( this )
        } );
-       this.input.connect( this, {
+       this.connect( this, {
                change: 'onInputChange',
                enter: 'onInputEnter'
        } );
@@ -16252,15 +16774,23 @@ OO.ui.ComboBoxWidget = function OoUiComboBoxWidget( config ) {
        } );
 
        // Initialization
-       this.$element.addClass( 'oo-ui-comboBoxWidget' ).append( this.input.$element );
+       this.$input.attr( {
+               role: 'combobox',
+               'aria-autocomplete': 'list'
+       } );
+       // Do not override options set via config.menu.items
+       if ( config.options !== undefined ) {
+               this.setOptions( config.options );
+       }
+       // Extra class for backwards-compatibility with ComboBoxWidget
+       this.$element.addClass( 'oo-ui-comboBoxInputWidget oo-ui-comboBoxWidget' );
        this.$overlay.append( this.menu.$element );
        this.onMenuItemsChange();
 };
 
 /* Setup */
 
-OO.inheritClass( OO.ui.ComboBoxWidget, OO.ui.Widget );
-OO.mixinClass( OO.ui.ComboBoxWidget, OO.ui.mixin.TabIndexedElement );
+OO.inheritClass( OO.ui.ComboBoxInputWidget, OO.ui.TextInputWidget );
 
 /* Methods */
 
@@ -16268,7 +16798,7 @@ OO.mixinClass( OO.ui.ComboBoxWidget, OO.ui.mixin.TabIndexedElement );
  * Get the combobox's menu.
  * @return {OO.ui.FloatingMenuSelectWidget} Menu widget
  */
-OO.ui.ComboBoxWidget.prototype.getMenu = function () {
+OO.ui.ComboBoxInputWidget.prototype.getMenu = function () {
        return this.menu;
 };
 
@@ -16276,8 +16806,8 @@ OO.ui.ComboBoxWidget.prototype.getMenu = function () {
  * Get the combobox's text input widget.
  * @return {OO.ui.TextInputWidget} Text input widget
  */
-OO.ui.ComboBoxWidget.prototype.getInput = function () {
-       return this.input;
+OO.ui.ComboBoxInputWidget.prototype.getInput = function () {
+       return this;
 };
 
 /**
@@ -16286,7 +16816,7 @@ OO.ui.ComboBoxWidget.prototype.getInput = function () {
  * @private
  * @param {string} value New value
  */
-OO.ui.ComboBoxWidget.prototype.onInputChange = function ( value ) {
+OO.ui.ComboBoxInputWidget.prototype.onInputChange = function ( value ) {
        var match = this.menu.getItemFromData( value );
 
        this.menu.selectItem( match );
@@ -16305,10 +16835,10 @@ OO.ui.ComboBoxWidget.prototype.onInputChange = function ( value ) {
  * @private
  * @param {jQuery.Event} e Mouse click event
  */
-OO.ui.ComboBoxWidget.prototype.onClick = function ( e ) {
+OO.ui.ComboBoxInputWidget.prototype.onIndicatorClick = function ( e ) {
        if ( !this.isDisabled() && e.which === 1 ) {
                this.menu.toggle();
-               this.input.$input[ 0 ].focus();
+               this.$input[ 0 ].focus();
        }
        return false;
 };
@@ -16319,10 +16849,10 @@ OO.ui.ComboBoxWidget.prototype.onClick = function ( e ) {
  * @private
  * @param {jQuery.Event} e Key press event
  */
-OO.ui.ComboBoxWidget.prototype.onKeyPress = function ( e ) {
+OO.ui.ComboBoxInputWidget.prototype.onIndicatorKeyPress = function ( e ) {
        if ( !this.isDisabled() && ( e.which === OO.ui.Keys.SPACE || e.which === OO.ui.Keys.ENTER ) ) {
                this.menu.toggle();
-               this.input.$input[ 0 ].focus();
+               this.$input[ 0 ].focus();
                return false;
        }
 };
@@ -16332,7 +16862,7 @@ OO.ui.ComboBoxWidget.prototype.onKeyPress = function ( e ) {
  *
  * @private
  */
-OO.ui.ComboBoxWidget.prototype.onInputEnter = function () {
+OO.ui.ComboBoxInputWidget.prototype.onInputEnter = function () {
        if ( !this.isDisabled() ) {
                this.menu.toggle( false );
        }
@@ -16344,8 +16874,8 @@ OO.ui.ComboBoxWidget.prototype.onInputEnter = function () {
  * @private
  * @param {OO.ui.OptionWidget} item Chosen item
  */
-OO.ui.ComboBoxWidget.prototype.onMenuChoose = function ( item ) {
-       this.input.setValue( item.getData() );
+OO.ui.ComboBoxInputWidget.prototype.onMenuChoose = function ( item ) {
+       this.setValue( item.getData() );
 };
 
 /**
@@ -16353,25 +16883,22 @@ OO.ui.ComboBoxWidget.prototype.onMenuChoose = function ( item ) {
  *
  * @private
  */
-OO.ui.ComboBoxWidget.prototype.onMenuItemsChange = function () {
-       var match = this.menu.getItemFromData( this.input.getValue() );
+OO.ui.ComboBoxInputWidget.prototype.onMenuItemsChange = function () {
+       var match = this.menu.getItemFromData( this.getValue() );
        this.menu.selectItem( match );
        if ( this.menu.getHighlightedItem() ) {
                this.menu.highlightItem( match );
        }
-       this.$element.toggleClass( 'oo-ui-comboBoxWidget-empty', this.menu.isEmpty() );
+       this.$element.toggleClass( 'oo-ui-comboBoxInputWidget-empty', this.menu.isEmpty() );
 };
 
 /**
  * @inheritdoc
  */
-OO.ui.ComboBoxWidget.prototype.setDisabled = function ( disabled ) {
+OO.ui.ComboBoxInputWidget.prototype.setDisabled = function ( disabled ) {
        // Parent method
-       OO.ui.ComboBoxWidget.parent.prototype.setDisabled.call( this, disabled );
+       OO.ui.ComboBoxInputWidget.parent.prototype.setDisabled.call( this, disabled );
 
-       if ( this.input ) {
-               this.input.setDisabled( this.isDisabled() );
-       }
        if ( this.menu ) {
                this.menu.setDisabled( this.isDisabled() );
        }
@@ -16379,6 +16906,31 @@ OO.ui.ComboBoxWidget.prototype.setDisabled = function ( disabled ) {
        return this;
 };
 
+/**
+ * Set the options available for this input.
+ *
+ * @param {Object[]} options Array of menu options in the format `{ data: …, label: … }`
+ * @chainable
+ */
+OO.ui.ComboBoxInputWidget.prototype.setOptions = function ( options ) {
+       this.getMenu()
+               .clearItems()
+               .addItems( options.map( function ( opt ) {
+                       return new OO.ui.MenuOptionWidget( {
+                               data: opt.data,
+                               label: opt.label !== undefined ? opt.label : opt.data
+                       } );
+               } ) );
+
+       return this;
+};
+
+/**
+ * @class
+ * @deprecated Use OO.ui.ComboBoxInputWidget instead.
+ */
+OO.ui.ComboBoxWidget = OO.ui.ComboBoxInputWidget;
+
 /**
  * LabelWidgets help identify the function of interface elements. Each LabelWidget can
  * be configured with a `label` option that is set to a string, a label node, or a function:
@@ -18707,7 +19259,7 @@ OO.mixinClass( OO.ui.RadioSelectWidget, OO.ui.mixin.TabIndexedElement );
 /**
  * MenuSelectWidget is a {@link OO.ui.SelectWidget select widget} that contains options and
  * is used together with OO.ui.MenuOptionWidget. It is designed be used as part of another widget.
- * See {@link OO.ui.DropdownWidget DropdownWidget}, {@link OO.ui.ComboBoxWidget ComboBoxWidget},
+ * See {@link OO.ui.DropdownWidget DropdownWidget}, {@link OO.ui.ComboBoxInputWidget ComboBoxInputWidget},
  * and {@link OO.ui.mixin.LookupElement LookupElement} for examples of widgets that contain menus.
  * MenuSelectWidgets themselves are not instantiated directly, rather subclassed
  * and customized to be opened, closed, and displayed as needed.
@@ -18732,7 +19284,7 @@ OO.mixinClass( OO.ui.RadioSelectWidget, OO.ui.mixin.TabIndexedElement );
  * @constructor
  * @param {Object} [config] Configuration options
  * @cfg {OO.ui.TextInputWidget} [input] Text input used to implement option highlighting for menu items that match
- *  the text the user types. This config is used by {@link OO.ui.ComboBoxWidget ComboBoxWidget}
+ *  the text the user types. This config is used by {@link OO.ui.ComboBoxInputWidget ComboBoxInputWidget}
  *  and {@link OO.ui.mixin.LookupElement LookupElement}
  * @cfg {jQuery} [$input] Text input used to implement option highlighting for menu items that match
  *  the text the user types. This config is used by {@link OO.ui.CapsuleMultiSelectWidget CapsuleMultiSelectWidget}
@@ -19021,7 +19573,7 @@ OO.ui.MenuSelectWidget.prototype.toggle = function ( visible ) {
  * The menu's position is automatically calculated and maintained when the menu
  * is toggled or the window is resized.
  *
- * See OO.ui.ComboBoxWidget for an example of a widget that uses this class.
+ * See OO.ui.ComboBoxInputWidget for an example of a widget that uses this class.
  *
  * @class
  * @extends OO.ui.MenuSelectWidget
@@ -19612,104 +20164,4 @@ OO.ui.ToggleSwitchWidget.prototype.onKeyPress = function ( e ) {
        }
 };
 
-/*!
- * Deprecated aliases for classes in the `OO.ui.mixin` namespace.
- */
-
-/**
- * @inheritdoc OO.ui.mixin.ButtonElement
- * @deprecated Use {@link OO.ui.mixin.ButtonElement} instead.
- */
-OO.ui.ButtonElement = OO.ui.mixin.ButtonElement;
-
-/**
- * @inheritdoc OO.ui.mixin.ClippableElement
- * @deprecated Use {@link OO.ui.mixin.ClippableElement} instead.
- */
-OO.ui.ClippableElement = OO.ui.mixin.ClippableElement;
-
-/**
- * @inheritdoc OO.ui.mixin.DraggableElement
- * @deprecated Use {@link OO.ui.mixin.DraggableElement} instead.
- */
-OO.ui.DraggableElement = OO.ui.mixin.DraggableElement;
-
-/**
- * @inheritdoc OO.ui.mixin.DraggableGroupElement
- * @deprecated Use {@link OO.ui.mixin.DraggableGroupElement} instead.
- */
-OO.ui.DraggableGroupElement = OO.ui.mixin.DraggableGroupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.FlaggedElement
- * @deprecated Use {@link OO.ui.mixin.FlaggedElement} instead.
- */
-OO.ui.FlaggedElement = OO.ui.mixin.FlaggedElement;
-
-/**
- * @inheritdoc OO.ui.mixin.GroupElement
- * @deprecated Use {@link OO.ui.mixin.GroupElement} instead.
- */
-OO.ui.GroupElement = OO.ui.mixin.GroupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.GroupWidget
- * @deprecated Use {@link OO.ui.mixin.GroupWidget} instead.
- */
-OO.ui.GroupWidget = OO.ui.mixin.GroupWidget;
-
-/**
- * @inheritdoc OO.ui.mixin.IconElement
- * @deprecated Use {@link OO.ui.mixin.IconElement} instead.
- */
-OO.ui.IconElement = OO.ui.mixin.IconElement;
-
-/**
- * @inheritdoc OO.ui.mixin.IndicatorElement
- * @deprecated Use {@link OO.ui.mixin.IndicatorElement} instead.
- */
-OO.ui.IndicatorElement = OO.ui.mixin.IndicatorElement;
-
-/**
- * @inheritdoc OO.ui.mixin.ItemWidget
- * @deprecated Use {@link OO.ui.mixin.ItemWidget} instead.
- */
-OO.ui.ItemWidget = OO.ui.mixin.ItemWidget;
-
-/**
- * @inheritdoc OO.ui.mixin.LabelElement
- * @deprecated Use {@link OO.ui.mixin.LabelElement} instead.
- */
-OO.ui.LabelElement = OO.ui.mixin.LabelElement;
-
-/**
- * @inheritdoc OO.ui.mixin.LookupElement
- * @deprecated Use {@link OO.ui.mixin.LookupElement} instead.
- */
-OO.ui.LookupElement = OO.ui.mixin.LookupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.PendingElement
- * @deprecated Use {@link OO.ui.mixin.PendingElement} instead.
- */
-OO.ui.PendingElement = OO.ui.mixin.PendingElement;
-
-/**
- * @inheritdoc OO.ui.mixin.PopupElement
- * @deprecated Use {@link OO.ui.mixin.PopupElement} instead.
- */
-OO.ui.PopupElement = OO.ui.mixin.PopupElement;
-
-/**
- * @inheritdoc OO.ui.mixin.TabIndexedElement
- * @deprecated Use {@link OO.ui.mixin.TabIndexedElement} instead.
- */
-OO.ui.TabIndexedElement = OO.ui.mixin.TabIndexedElement;
-
-/**
- * @inheritdoc OO.ui.mixin.TitledElement
- * @deprecated Use {@link OO.ui.mixin.TitledElement} instead.
- */
-OO.ui.TitledElement = OO.ui.mixin.TitledElement;
-
 }( OO ) );
index f7b3862..a6abce5 100644 (file)
@@ -13,7 +13,7 @@
                        "ltr": "images/icons/find-ltr.svg",
                        "rtl": "images/icons/find-rtl.svg"
                } },
-               "insert": { "file": "images/icons/insert.svg" },
+               "insert": { "file": "images/icons/add.svg" },
                "layout": { "file": {
                        "ltr": "images/icons/layout-ltr.svg",
                        "rtl": "images/icons/layout-rtl.svg"
diff --git a/resources/lib/oojs-ui/themes/apex/icons-interactions.json b/resources/lib/oojs-ui/themes/apex/icons-interactions.json
new file mode 100644 (file)
index 0000000..02dfffa
--- /dev/null
@@ -0,0 +1,58 @@
+{
+       "prefix": "oo-ui-icon",
+       "intro": "@import '../../../../src/styles/common';",
+       "variants": {
+               "invert": {
+                       "color": "#FFFFFF",
+                       "global": true
+               }
+       },
+       "images": {
+               "beta": { "file": "images/icons/beta.svg" },
+               "betaLaunch": { "file": "images/icons/betaLaunch.svg" },
+               "bookmark": { "file": {
+                       "ltr": "images/icons/bookmark-ltr.svg",
+                       "rtl": "images/icons/bookmark-rtl.svg"
+               } },
+               "browser": { "file": {
+                       "ltr": "images/icons/browser-ltr.svg",
+                       "rtl": "images/icons/browser-rtl.svg"
+               } },
+               "clear": { "file": "images/icons/clear.svg" },
+               "clock": { "file": "images/icons/clock.svg" },
+               "funnel": { "file": {
+                       "ltr": "images/icons/funnel-ltr.svg",
+                       "rtl": "images/icons/funnel-rtl.svg"
+               } },
+               "heart": { "file": "images/icons/heart.svg" },
+               "key": { "file": {
+                       "ltr": "images/icons/key-ltr.svg",
+                       "rtl": "images/icons/key-rtl.svg"
+               } },
+               "keyboard": { "file": {
+                       "ltr": "images/icons/keyboard-ltr.svg",
+                       "rtl": "images/icons/keyboard-rtl.svg"
+               } },
+               "logOut": { "file": {
+                       "ltr": "images/icons/logOut-ltr.svg",
+                       "rtl": "images/icons/logOut-rtl.svg"
+               } },
+               "newWindow": { "file": {
+                       "ltr": "images/icons/newWindow-ltr.svg",
+                       "rtl": "images/icons/newWindow-rtl.svg"
+               } },
+               "printer": { "file": {
+                       "ltr": "images/icons/printer-ltr.svg",
+                       "rtl": "images/icons/printer-rtl.svg"
+               } },
+               "ribbonPrize": { "file": "images/icons/ribbonPrize.svg" },
+               "sun": { "file": {
+                       "ltr": "images/icons/sun-ltr.svg",
+                       "rtl": "images/icons/sun-rtl.svg"
+               } },
+               "watchlist": { "file": {
+                       "ltr": "images/icons/watchlist-ltr.svg",
+                       "rtl": "images/icons/watchlist-rtl.svg"
+               } }
+       }
+}
diff --git a/resources/lib/oojs-ui/themes/apex/icons-media.json b/resources/lib/oojs-ui/themes/apex/icons-media.json
new file mode 100644 (file)
index 0000000..e1ad562
--- /dev/null
@@ -0,0 +1,15 @@
+{
+       "prefix": "oo-ui-icon",
+       "intro": "@import '../../../../src/styles/common';",
+       "images": {
+               "image": { "file": "images/icons/image.svg" },
+               "imageGallery": { "file": {
+                       "ltr": "images/icons/imageGallery-ltr.svg",
+                       "rtl": "images/icons/imageGallery-rtl.svg"
+               } },
+               "photoGallery": { "file": {
+                       "ltr": "images/icons/imageGallery-ltr.svg",
+                       "rtl": "images/icons/imageGallery-rtl.svg"
+               } }
+       }
+}
index 92791d6..091d5d7 100644 (file)
@@ -29,7 +29,7 @@
                        "rtl": "images/icons/move-rtl.svg"
                } },
                "notice": { "file": "images/icons/notice.svg" },
-               "picture": { "file": "images/icons/picture.svg" },
+               "picture": { "file": "images/icons/image.svg" },
                "previous": { "file": {
                        "ltr": "images/icons/move-rtl.svg",
                        "rtl": "images/icons/move-ltr.svg"
@@ -38,7 +38,7 @@
                        "ltr": "images/icons/arched-arrow-ltr.svg",
                        "rtl": "images/icons/arched-arrow-rtl.svg"
                } },
-               "remove": { "file": "images/icons/remove.svg" },
+               "remove": { "file": "images/icons/trash.svg" },
                "search": { "file": "images/icons/search.svg" },
                "settings": { "file": "images/icons/settings.svg" },
                "tag": { "file": "images/icons/tag.svg" },
index 730d102..c0d04e9 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/add.png and b/resources/lib/oojs-ui/themes/apex/images/icons/add.png differ
index 85e39fe..62e5496 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="add">
-        <path id="plus" d="M13 8h-2v3H8v2h3v3h2v-3h3v-2h-3z"/>
+        <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png
new file mode 100644 (file)
index 0000000..7d23df2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/beta-invert.svg
new file mode 100644 (file)
index 0000000..4d8c673
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta.png b/resources/lib/oojs-ui/themes/apex/images/icons/beta.png
new file mode 100644 (file)
index 0000000..ef3e20a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/beta.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/beta.svg b/resources/lib/oojs-ui/themes/apex/images/icons/beta.svg
new file mode 100644 (file)
index 0000000..51a5c78
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png
new file mode 100644 (file)
index 0000000..d620367
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch-invert.svg
new file mode 100644 (file)
index 0000000..5058629
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png
new file mode 100644 (file)
index 0000000..f1e48ac
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg b/resources/lib/oojs-ui/themes/apex/images/icons/betaLaunch.svg
new file mode 100644 (file)
index 0000000..c3f99d6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png
new file mode 100644 (file)
index 0000000..008246c
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr-invert.svg
new file mode 100644 (file)
index 0000000..bf39564
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M15 5H8c-1.1 0-2 .9-2 2v3h3v11l4-3 4 3V7c0-1.1-.9-2-2-2zM9 9H7V7c0-.6.4-1 1-1h1v3z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr.png
new file mode 100644 (file)
index 0000000..371dfc6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-ltr.svg
new file mode 100644 (file)
index 0000000..ba3ff91
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15 5H8c-1.1 0-2 .9-2 2v3h3v11l4-3 4 3V7c0-1.1-.9-2-2-2zM9 9H7V7c0-.6.4-1 1-1h1v3z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png
new file mode 100644 (file)
index 0000000..deff3f6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl-invert.svg
new file mode 100644 (file)
index 0000000..f665223
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M8 5h7c1.1 0 2 .9 2 2v3h-3v11l-4-3-4 3V7c0-1.1.9-2 2-2zm6 4h2V7c0-.6-.4-1-1-1h-1v3z" id="path88"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl.png
new file mode 100644 (file)
index 0000000..4a50c17
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/bookmark-rtl.svg
new file mode 100644 (file)
index 0000000..ba0be74
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M8 5h7c1.1 0 2 .9 2 2v3h-3v11l-4-3-4 3V7c0-1.1.9-2 2-2zm6 4h2V7c0-.6-.4-1-1-1h-1v3z" id="path88"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png
new file mode 100644 (file)
index 0000000..4632447
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr-invert.svg
new file mode 100644 (file)
index 0000000..762e641
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M3 6v11c0 1.7 1.3 3 3 3h15V6H3zm2.5 1C6.3 7 7 7.7 7 8.5S6.3 10 5.5 10 4 9.3 4 8.5 4.7 7 5.5 7zM20 19H6c-1.1 0-2-.9-2-2v-6h16v8z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr.png
new file mode 100644 (file)
index 0000000..80f1a47
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/browser-ltr.svg
new file mode 100644 (file)
index 0000000..e7be7e5
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M3 6v11c0 1.7 1.3 3 3 3h15V6H3zm2.5 1C6.3 7 7 7.7 7 8.5S6.3 10 5.5 10 4 9.3 4 8.5 4.7 7 5.5 7zM20 19H6c-1.1 0-2-.9-2-2v-6h16v8z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png
new file mode 100644 (file)
index 0000000..5a3df4b
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl-invert.svg
new file mode 100644 (file)
index 0000000..b6d0f5c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M21 6v11c0 1.7-1.3 3-3 3H3V6h18zm-2.5 1c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5S20 9.3 20 8.5 19.3 7 18.5 7zM4 19h14c1.1 0 2-.9 2-2v-6H4v8z" id="path98"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl.png
new file mode 100644 (file)
index 0000000..ea215df
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/browser-rtl.svg
new file mode 100644 (file)
index 0000000..080e237
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M21 6v11c0 1.7-1.3 3-3 3H3V6h18zm-2.5 1c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5S20 9.3 20 8.5 19.3 7 18.5 7zM4 19h14c1.1 0 2-.9 2-2v-6H4v8z" id="path98"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png
new file mode 100644 (file)
index 0000000..d8b538e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clear-invert.svg
new file mode 100644 (file)
index 0000000..0738205
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="clear">
+        <path id="circle-with-cross" d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 11l-1 1-3-3-3 3-1-1 3-3-3-3 1-1 3 3 3-3 1 1-3 3 3 3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear.png b/resources/lib/oojs-ui/themes/apex/images/icons/clear.png
new file mode 100644 (file)
index 0000000..b18e2e6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/clear.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clear.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clear.svg
new file mode 100644 (file)
index 0000000..8689e77
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="clear">
+        <path id="circle-with-cross" d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 11l-1 1-3-3-3 3-1-1 3-3-3-3 1-1 3 3 3-3 1 1-3 3 3 3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png
new file mode 100644 (file)
index 0000000..2580eaf
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clock-invert.svg
new file mode 100644 (file)
index 0000000..3f1a467
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="clock">
+        <path id="circle" d="m 12,5 c -3.865993,0 -7,3.1340068 -7,7 0,3.865993 3.134007,7 7,7 3.865993,0 7,-3.134007 7,-7 0,-3.8659932 -3.134007,-7 -7,-7 z m 0,1.25 c 3.174708,0 5.75,2.5752917 5.75,5.75 0,3.174708 -2.575292,5.75 -5.75,5.75 C 8.825292,17.75 6.25,15.174708 6.25,12 6.25,8.8252917 8.825292,6.25 12,6.25 z" />
+        <path id="hands" d="m 15.605461,14.078994 c 0,0 -1.674293,-1.358389 -2.811549,-2.149554 0.505447,-1.682718 1.194821,-4.6044835 1.194821,-4.6044835 0,0 -3.053744,3.7648795 -3.423703,4.7027645 -0.32503,0.819947 1.024233,1.55074 1.646915,1.177972 1.333819,0.386808 3.393516,0.873301 3.393516,0.873301 z" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clock.png b/resources/lib/oojs-ui/themes/apex/images/icons/clock.png
new file mode 100644 (file)
index 0000000..bc875bd
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/clock.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/clock.svg b/resources/lib/oojs-ui/themes/apex/images/icons/clock.svg
new file mode 100644 (file)
index 0000000..04d9492
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="clock">
+        <path id="circle" d="m 12,5 c -3.865993,0 -7,3.1340068 -7,7 0,3.865993 3.134007,7 7,7 3.865993,0 7,-3.134007 7,-7 0,-3.8659932 -3.134007,-7 -7,-7 z m 0,1.25 c 3.174708,0 5.75,2.5752917 5.75,5.75 0,3.174708 -2.575292,5.75 -5.75,5.75 C 8.825292,17.75 6.25,15.174708 6.25,12 6.25,8.8252917 8.825292,6.25 12,6.25 z" />
+        <path id="hands" d="m 15.605461,14.078994 c 0,0 -1.674293,-1.358389 -2.811549,-2.149554 0.505447,-1.682718 1.194821,-4.6044835 1.194821,-4.6044835 0,0 -3.053744,3.7648795 -3.423703,4.7027645 -0.32503,0.819947 1.024233,1.55074 1.646915,1.177972 1.333819,0.386808 3.393516,0.873301 3.393516,0.873301 z" />
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png
new file mode 100644 (file)
index 0000000..056e781
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr-invert.svg
new file mode 100644 (file)
index 0000000..3ea25f4
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g>
+        <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr.png
new file mode 100644 (file)
index 0000000..df174d6
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-ltr.svg
new file mode 100644 (file)
index 0000000..8d5bf44
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g>
+        <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png
new file mode 100644 (file)
index 0000000..7d4f60a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl-invert.svg
new file mode 100644 (file)
index 0000000..1fa603f
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="g256">
+        <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z" id="path258"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl.png
new file mode 100644 (file)
index 0000000..1204eb1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/funnel-rtl.svg
new file mode 100644 (file)
index 0000000..ec54b1b
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="g256">
+        <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z" id="path258"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png
new file mode 100644 (file)
index 0000000..b631396
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/heart-invert.svg
new file mode 100644 (file)
index 0000000..fc78226
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M15 7c-2 0-3 2-3 2s-1-2-3-2c-2.5 0-4 2-4 4 0 4 5 5 7 8 2-3 7-4 7-8 0-2-1.5-4-4-4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/heart.png b/resources/lib/oojs-ui/themes/apex/images/icons/heart.png
new file mode 100644 (file)
index 0000000..0bd2124
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/heart.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/heart.svg b/resources/lib/oojs-ui/themes/apex/images/icons/heart.svg
new file mode 100644 (file)
index 0000000..6433201
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M15 7c-2 0-3 2-3 2s-1-2-3-2c-2.5 0-4 2-4 4 0 4 5 5 7 8 2-3 7-4 7-8 0-2-1.5-4-4-4z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/image.png b/resources/lib/oojs-ui/themes/apex/images/icons/image.png
new file mode 100644 (file)
index 0000000..d680396
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/image.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/image.svg b/resources/lib/oojs-ui/themes/apex/images/icons/image.svg
new file mode 100644 (file)
index 0000000..281ede8
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="image">
+        <path id="frame" d="M4 5v13h16v-13zm15 12h-14v-11h14z"/>
+        <path id="mountains" d="M9.5 10l2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12v-2.5z"/>
+        <path id="sky" d="M9.516 7.844l3.046 3.172 2.938-2.016 2.5 2v-4h-12v5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-ltr.png
new file mode 100644 (file)
index 0000000..62c5e10
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-ltr.svg
new file mode 100644 (file)
index 0000000..c0ccea6
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="imageGallery">
+       <path d="M7 8v11h14V8zm13 10H8V9h12zM9 14.945l2.917-2.723 1.94 1.8-1.094.85.73 1.024L16.917 13 19 14.556V17H9zm0-1.167l2.93-3.232 2.538 2.467 2.45-1.568L19 13v-3H9zM19 6v1H6v10H5V6zM3 4h14v1H4v10H3z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-rtl.png
new file mode 100644 (file)
index 0000000..9e688ed
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/imageGallery-rtl.svg
new file mode 100644 (file)
index 0000000..a664aaf
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="imageGallery">
+       <path d="M17 8v11H3V8zM4 18h12V9H4zm11-3.055l-2.917-2.723-1.94 1.8 1.094.85-.73 1.024L7.083 13 5 14.556V17h10zm0-1.167l-2.93-3.232-2.538 2.467-2.45-1.568L5 13v-3h10zM5 6v1h13v10h1V6zm16-2H7v1h13v10h1z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/insert.png b/resources/lib/oojs-ui/themes/apex/images/icons/insert.png
deleted file mode 100644 (file)
index 97927a8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/insert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/insert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/insert.svg
deleted file mode 100644 (file)
index d1e9ba3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="insert">
-        <path d="M13 5h-2v6H5v2h6v6h2v-6h6v-2h-6z" id="plus"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png
new file mode 100644 (file)
index 0000000..1e9d92d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr-invert.svg
new file mode 100644 (file)
index 0000000..131bbdb
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M14.5 4C11.5 4 9 6.5 9 9.5c0 1 .3 1.9.7 2.8L4 18v2h4v-2h2v-2h2l1.2-1.2c.4.1.9.2 1.3.2 3 0 5.5-2.5 5.5-5.5S17.5 4 14.5 4zM16 9c-.8 0-1.5-.7-1.5-1.5S15.2 6 16 6s1.5.7 1.5 1.5S16.8 9 16 9z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr.png
new file mode 100644 (file)
index 0000000..ba9ce73
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/key-ltr.svg
new file mode 100644 (file)
index 0000000..fc0d3c3
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M14.5 4C11.5 4 9 6.5 9 9.5c0 1 .3 1.9.7 2.8L4 18v2h4v-2h2v-2h2l1.2-1.2c.4.1.9.2 1.3.2 3 0 5.5-2.5 5.5-5.5S17.5 4 14.5 4zM16 9c-.8 0-1.5-.7-1.5-1.5S15.2 6 16 6s1.5.7 1.5 1.5S16.8 9 16 9z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png
new file mode 100644 (file)
index 0000000..9d46092
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl-invert.svg
new file mode 100644 (file)
index 0000000..fbd3329
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M9.5 4c3 0 5.5 2.5 5.5 5.5 0 1-.3 1.9-.7 2.8L20 18v2h-4v-2h-2v-2h-2l-1.2-1.2c-.4.1-.9.2-1.3.2-3 0-5.5-2.5-5.5-5.5S6.5 4 9.5 4zM8 9c.8 0 1.5-.7 1.5-1.5S8.8 6 8 6s-1.5.7-1.5 1.5S7.2 9 8 9z" id="path336"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl.png
new file mode 100644 (file)
index 0000000..65ed300
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/key-rtl.svg
new file mode 100644 (file)
index 0000000..8975b66
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M9.5 4c3 0 5.5 2.5 5.5 5.5 0 1-.3 1.9-.7 2.8L20 18v2h-4v-2h-2v-2h-2l-1.2-1.2c-.4.1-.9.2-1.3.2-3 0-5.5-2.5-5.5-5.5S6.5 4 9.5 4zM8 9c.8 0 1.5-.7 1.5-1.5S8.8 6 8 6s-1.5.7-1.5 1.5S7.2 9 8 9z" id="path336"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png
new file mode 100644 (file)
index 0000000..1dcd4c3
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr-invert.svg
new file mode 100644 (file)
index 0000000..84479e8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g>
+        <path d="M3 7v9c0 1.7 1.3 3 3 3h15V7H3zm8 2h2v2h-2V9zm0 3h2v2h-2v-2zM8 9h2v2H8V9zm0 3h2v2H8v-2zm-1 5H6c-.6 0-1-.4-1-1v-1h2v2zm0-3H5v-2h2v2zm0-3H5V9h2v2zm9 6H8v-2h8v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2zm3 6h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr.png
new file mode 100644 (file)
index 0000000..7af2472
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-ltr.svg
new file mode 100644 (file)
index 0000000..2bb795e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g>
+        <path d="M3 7v9c0 1.7 1.3 3 3 3h15V7H3zm8 2h2v2h-2V9zm0 3h2v2h-2v-2zM8 9h2v2H8V9zm0 3h2v2H8v-2zm-1 5H6c-.6 0-1-.4-1-1v-1h2v2zm0-3H5v-2h2v2zm0-3H5V9h2v2zm9 6H8v-2h8v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2zm3 6h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png
new file mode 100644 (file)
index 0000000..61c95be
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl-invert.svg
new file mode 100644 (file)
index 0000000..2700729
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="g346">
+        <path d="M21 7v9c0 1.7-1.3 3-3 3H3V7h18zm-8 2h-2v2h2V9zm0 3h-2v2h2v-2zm3-3h-2v2h2V9zm0 3h-2v2h2v-2zm1 5h1c.6 0 1-.4 1-1v-1h-2v2zm0-3h2v-2h-2v2zm0-3h2V9h-2v2zm-9 6h8v-2H8v2zm0-3h2v-2H8v2zm0-3h2V9H8v2zm-3 6h2v-2H5v2zm0-3h2v-2H5v2zm0-3h2V9H5v2z" id="path348"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl.png
new file mode 100644 (file)
index 0000000..b6e9b6e
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/keyboard-rtl.svg
new file mode 100644 (file)
index 0000000..b7b47cc
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="g346">
+        <path d="M21 7v9c0 1.7-1.3 3-3 3H3V7h18zm-8 2h-2v2h2V9zm0 3h-2v2h2v-2zm3-3h-2v2h2V9zm0 3h-2v2h2v-2zm1 5h1c.6 0 1-.4 1-1v-1h-2v2zm0-3h2v-2h-2v2zm0-3h2V9h-2v2zm-9 6h8v-2H8v2zm0-3h2v-2H8v2zm0-3h2V9H8v2zm-3 6h2v-2H5v2zm0-3h2v-2H5v2zm0-3h2V9H5v2z" id="path348"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png
new file mode 100644 (file)
index 0000000..52467f2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr-invert.svg
new file mode 100644 (file)
index 0000000..dcbf49e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g>
+        <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr.png
new file mode 100644 (file)
index 0000000..a08b629
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-ltr.svg
new file mode 100644 (file)
index 0000000..61c369f
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g>
+        <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png
new file mode 100644 (file)
index 0000000..734b5f2
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl-invert.svg
new file mode 100644 (file)
index 0000000..e953bab
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="g402">
+        <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z" id="path404"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl.png
new file mode 100644 (file)
index 0000000..135df45
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/logOut-rtl.svg
new file mode 100644 (file)
index 0000000..5cb4687
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="g402">
+        <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z" id="path404"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png
new file mode 100644 (file)
index 0000000..c1a9fab
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr-invert.svg
new file mode 100644 (file)
index 0000000..9febfff
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="g4">
+        <path d="M12 5l2.5 2.5L11 11c-1.2 1.2-1.2 2.8 0 4l5.5-5.5L19 12V5h-7zm5 12H8c-.6 0-1-.4-1-1V7h3L8 5H5v11c0 1.7 1.3 3 3 3h11v-3l-2-2v3z" id="path6"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr.png
new file mode 100644 (file)
index 0000000..ed7b930
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-ltr.svg
new file mode 100644 (file)
index 0000000..02e24f6
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="g4">
+        <path d="M12 5l2.5 2.5L11 11c-1.2 1.2-1.2 2.8 0 4l5.5-5.5L19 12V5h-7zm5 12H8c-.6 0-1-.4-1-1V7h3L8 5H5v11c0 1.7 1.3 3 3 3h11v-3l-2-2v3z" id="path6"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png
new file mode 100644 (file)
index 0000000..8dd0188
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl-invert.svg
new file mode 100644 (file)
index 0000000..e72ecf5
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="g462">
+        <path d="M12 5L9.5 7.5 13 11c1.2 1.2 1.2 2.8 0 4L7.5 9.5 5 12V5h7zM7 17h9c.6 0 1-.4 1-1V7h-3l2-2h3v11c0 1.7-1.3 3-3 3H5v-3l2-2v3z" id="path464"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl.png
new file mode 100644 (file)
index 0000000..46567c7
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/newWindow-rtl.svg
new file mode 100644 (file)
index 0000000..16ad8b4
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="g462">
+        <path d="M12 5L9.5 7.5 13 11c1.2 1.2 1.2 2.8 0 4L7.5 9.5 5 12V5h7zM7 17h9c.6 0 1-.4 1-1V7h-3l2-2h3v11c0 1.7-1.3 3-3 3H5v-3l2-2v3z" id="path464"/>
+    </g>
+</svg>
index 8b15525..875958b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/noWikiText-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/noWikiText-ltr.png differ
index e0e4fc0..22c04ca 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g>
-        <path d="M16 14l2 2V5h-4v2h2zm0 2L9 9 7 7 6 6 5 5 2 2 1 3l2 2H2v14h4v-2H4V7h1l2 2v10h4v-2H9v-6l6 6h-1v2h3l4 4 1-1-4-4zm-5-9V5H7l2 2zm8-2v2h2v10h-2l2 2h2V5z"/>
+    <g id="noWikiText-rtl">
+        <path d="M15 13l2 2V5h-3v2h1zM3 3L2 4l1 1v14h3v-2H5V7l2 2v10h3v-2H9v-6l6 6h-1v2h3l3 3 1-1-3-3zm7 4V5H7l2 2zm8-2v2h1v10l2 2V5z"/>
     </g>
 </svg>
index f7bab38..6ebb399 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/noWikiText-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/noWikiText-rtl.png differ
index a7be5ab..d717265 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="g484">
-        <path d="M8 14l-2 2V5h4v2H8zm0 2l7-7 2-2 1-1 1-1 3-3 1 1-2 2h1v14h-4v-2h2V7h-1l-2 2v10h-4v-2h2v-6l-6 6h1v2H7l-4 4-1-1 4-4zm5-9V5h4l-2 2zM5 5v2H3v10h2l-2 2H1V5z" id="path486"/>
+    <g id="noWikiText-rtl">
+        <path d="M9 13l-2 2V5h3v2H9zM21 3l1 1-1 1v14h-3v-2h1V7l-2 2v10h-3v-2h1v-6l-6 6h1v2H7l-3 3-1-1 3-3zm-7 4V5h3l-2 2zM6 5v2H5v10l-2 2V5z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/picture.png b/resources/lib/oojs-ui/themes/apex/images/icons/picture.png
deleted file mode 100644 (file)
index d680396..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/picture.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/picture.svg b/resources/lib/oojs-ui/themes/apex/images/icons/picture.svg
deleted file mode 100644 (file)
index 246e130..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="picture">
-        <path id="frame" d="M4 5v13h16v-13zm15 12h-14v-11h14z"/>
-        <path id="mountains" d="M9.5 10l2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12v-2.5z"/>
-        <path id="sky" d="M9.516 7.844l3.046 3.172 2.938-2.016 2.5 2v-4h-12v5z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png
new file mode 100644 (file)
index 0000000..786beb1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr-invert.svg
new file mode 100644 (file)
index 0000000..08c2c36
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr.png
new file mode 100644 (file)
index 0000000..051ab1d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/printer-ltr.svg
new file mode 100644 (file)
index 0000000..7081606
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png
new file mode 100644 (file)
index 0000000..bd37410
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl-invert.svg
new file mode 100644 (file)
index 0000000..19d6b2e
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z" id="path532"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl.png
new file mode 100644 (file)
index 0000000..18e247d
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/printer-rtl.svg
new file mode 100644 (file)
index 0000000..79fd4e1
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z" id="path532"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/remove.png b/resources/lib/oojs-ui/themes/apex/images/icons/remove.png
deleted file mode 100644 (file)
index 9dc34b8..0000000
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/remove.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/remove.svg b/resources/lib/oojs-ui/themes/apex/images/icons/remove.svg
deleted file mode 100644 (file)
index ef5f97b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="remove">
-        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png
new file mode 100644 (file)
index 0000000..329da36
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize-invert.svg
new file mode 100644 (file)
index 0000000..d1d5e10
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="Layer_1">
+        <g>
+            <circle cx="11.5" cy="8.5" r="2.5"/>
+            <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
+        </g>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png
new file mode 100644 (file)
index 0000000..304a4fa
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg b/resources/lib/oojs-ui/themes/apex/images/icons/ribbonPrize.svg
new file mode 100644 (file)
index 0000000..d15f387
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="Layer_1">
+        <g>
+            <circle cx="11.5" cy="8.5" r="2.5"/>
+            <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
+        </g>
+    </g>
+</svg>
index d6e3e8e..de70cd6 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/search.png and b/resources/lib/oojs-ui/themes/apex/images/icons/search.png differ
index 137150b..c2a4b27 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="search">
-        <path id="search" d="M16.02 15.96l-2.373-2.375-.17-.1c.404-.565.644-1.26.644-2.008C14.12 9.557 12.567 8 10.648 8 8.727 8 7.17 9.557 7.17 11.478c0 1.92 1.556 3.477 3.477 3.477.75 0 1.442-.24 2.01-.643l.098.17 2.375 2.373c.19.19.542.143.79-.104s.292-.6.103-.79zm-5.376-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.996-2.213 2.217-2.213 1.222 0 2.213.992 2.213 2.213 0 1.222-.993 2.213-2.214 2.213z"/>
+        <path id="magnifying-glass" d="M18.87 18.375l-3.987-3.99-.286-.17c.68-.948 1.082-2.116 1.082-3.372C15.67 7.616 13.06 5 9.84 5 6.616 5 4 7.616 4 10.844c0 3.226 2.614 5.842 5.842 5.842 1.26 0 2.423-.403 3.377-1.08l.16.286 3.99 3.987c.32.31.91.24 1.33-.18.41-.42.49-1.01.17-1.33zM9.837 14.56c-2.05 0-3.718-1.663-3.718-3.717 0-2.05 1.67-3.72 3.72-3.72s3.72 1.668 3.72 3.72c0 2.053-1.67 3.718-3.72 3.718z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png
new file mode 100644 (file)
index 0000000..9c2fe07
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr-invert.svg
new file mode 100644 (file)
index 0000000..7f7ef3a
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M18.1 5.1c0 .3-.1.6-.3.9l-1.4 1.4-.9-.8 2.2-2.2c.3.1.4.4.4.7zm-.5 5.3h3.2c0 .3-.1.6-.4.9s-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4s.4.5.4.8v2h-1.3zm6.4 11.7c-.3 0-.6-.1-.8-.3l-1.4-1.4.8-.8 2.2 2.2c-.2.2-.5.3-.8.3zM6.2 4.9c.3 0 .6.1.8.3l1.4 1.4-.8.9-2.2-2.3c.2-.2.5-.3.8-.3zm5.2 11.7h1.2v3.2c-.3 0-.6-.1-.9-.4s-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9s.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8s.1-.6.3-.8z"/>
+    <circle cx="12" cy="11" r="4"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr.png
new file mode 100644 (file)
index 0000000..459f4c9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/sun-ltr.svg
new file mode 100644 (file)
index 0000000..4bde183
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M18.1 5.1c0 .3-.1.6-.3.9l-1.4 1.4-.9-.8 2.2-2.2c.3.1.4.4.4.7zm-.5 5.3h3.2c0 .3-.1.6-.4.9s-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4s.4.5.4.8v2h-1.3zm6.4 11.7c-.3 0-.6-.1-.8-.3l-1.4-1.4.8-.8 2.2 2.2c-.2.2-.5.3-.8.3zM6.2 4.9c.3 0 .6.1.8.3l1.4 1.4-.8.9-2.2-2.3c.2-.2.5-.3.8-.3zm5.2 11.7h1.2v3.2c-.3 0-.6-.1-.9-.4s-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9s.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8s.1-.6.3-.8z"/>
+    <circle cx="12" cy="11" r="4"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png
new file mode 100644 (file)
index 0000000..3481d18
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl-invert.svg
new file mode 100644 (file)
index 0000000..f90bc0c
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <path d="M5.9 5.1c0 .3.1.6.3.9l1.4 1.4.9-.8-2.2-2.2c-.3.1-.4.4-.4.7zm.5 5.3H3.2c0 .3.1.6.4.9.3.3.5.4.8.4h2v-1.3zm6.2-5V2.2c-.3 0-.6.1-.9.4-.3.3-.4.5-.4.8v2h1.3zM6.2 17.1c.3 0 .6-.1.8-.3l1.4-1.4-.8-.8-2.2 2.2c.2.2.5.3.8.3zM17.8 4.9c-.3 0-.6.1-.8.3l-1.4 1.4.8.9 2.2-2.3c-.2-.2-.5-.3-.8-.3zm-5.2 11.7h-1.2v3.2c.3 0 .6-.1.9-.4.3-.3.4-.5.4-.8l-.1-2zm7-6.2h-2v1.2h3.2c0-.3-.1-.6-.4-.9-.3-.3-.5-.3-.8-.3zM17.8 16l-1.4-1.4-.8.8 2.2 2.2c.2-.2.3-.5.3-.8 0-.3-.1-.6-.3-.8z" id="path678"/>
+    <circle cx="12" cy="11" r="4" id="circle680" transform="matrix(-1 0 0 1 24 0)"/>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl.png
new file mode 100644 (file)
index 0000000..8a0fc83
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/sun-rtl.svg
new file mode 100644 (file)
index 0000000..2570610
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <path d="M5.9 5.1c0 .3.1.6.3.9l1.4 1.4.9-.8-2.2-2.2c-.3.1-.4.4-.4.7zm.5 5.3H3.2c0 .3.1.6.4.9.3.3.5.4.8.4h2v-1.3zm6.2-5V2.2c-.3 0-.6.1-.9.4-.3.3-.4.5-.4.8v2h1.3zM6.2 17.1c.3 0 .6-.1.8-.3l1.4-1.4-.8-.8-2.2 2.2c.2.2.5.3.8.3zM17.8 4.9c-.3 0-.6.1-.8.3l-1.4 1.4.8.9 2.2-2.3c-.2-.2-.5-.3-.8-.3zm-5.2 11.7h-1.2v3.2c.3 0 .6-.1.9-.4.3-.3.4-.5.4-.8l-.1-2zm7-6.2h-2v1.2h3.2c0-.3-.1-.6-.4-.9-.3-.3-.5-.3-.8-.3zM17.8 16l-1.4-1.4-.8.8 2.2 2.2c.2-.2.3-.5.3-.8 0-.3-.1-.6-.3-.8z" id="path678"/>
+    <circle cx="12" cy="11" r="4" id="circle680" transform="matrix(-1 0 0 1 24 0)"/>
+</svg>
index dfee886..9dc34b8 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/trash.png and b/resources/lib/oojs-ui/themes/apex/images/icons/trash.png differ
index 76502dc..bb8167a 100644 (file)
@@ -1,4 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
+    <g id="trash-can">
+        <path d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
+    </g>
 </svg>
index 594836e..89448ed 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png and b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-ltr.png differ
index 071bd32..47fa0c1 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g>
-        <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
+    <g id="trash-can-undo">
+        <path d="M4.5 3.5l-1 1L6 7v2h1v7.97L8 18h6.97l.03-.03 1-.97 2.5 2.5 1-1L16 15l-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1zM9 5v1l1 1h6v1h-5l1 1h3v3l1 1V9h1V6h-3V5zM8 9l1 1v6h1v-5l1 1v4h1v-3l1 1v2h1v-1l1 1v1H8zm5 1l1 1v-1z"/>
     </g>
 </svg>
index 182e56d..51abef3 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png and b/resources/lib/oojs-ui/themes/apex/images/icons/trashUndo-rtl.png differ
index 69c17b4..b247bfb 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="g714">
-        <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z" id="path716"/>
+    <g id="trash-can-undo">
+        <path d="M18.5 3.5l1 1L17 7v2h-1v7.97L15 18H8.03L8 17.97 7 17l-2.5 2.5-1-1L7 15l1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1zM14 5v1l-1 1H7v1h5l-1 1H8v3l-1 1V9H6V6h3V5zm1 4l-1 1v6h-1v-5l-1 1v4h-1v-3l-1 1v2H9v-1l-1 1v1h7zm-5 1l-1 1v-1z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png
new file mode 100644 (file)
index 0000000..19b4561
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr-invert.svg
new file mode 100644 (file)
index 0000000..5e4a2f3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g>
+        <path d="M13 14h5v1h-5v-1zm0 3h5v-1h-5v1zm0 1h5v1h-5v-1zm-1-5v3l-5 3 1-6-4-3 6-1 2-5s1.9 5 2 5l6 1-4 3h-4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr.png b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr.png
new file mode 100644 (file)
index 0000000..4b94c1a
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr.svg b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-ltr.svg
new file mode 100644 (file)
index 0000000..79c7d5c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g>
+        <path d="M13 14h5v1h-5v-1zm0 3h5v-1h-5v1zm0 1h5v1h-5v-1zm-1-5v3l-5 3 1-6-4-3 6-1 2-5s1.9 5 2 5l6 1-4 3h-4z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png
new file mode 100644 (file)
index 0000000..48bf383
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl-invert.svg
new file mode 100644 (file)
index 0000000..073ef3d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="g780">
+        <path d="M11 14H6v1h5v-1zm0 3H6v-1h5v1zm0 1H6v1h5v-1zm1-5v3l5 3-1-6 4-3-6-1-2-5s-1.9 5-2 5l-6 1 4 3h4z" id="path782"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl.png b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl.png
new file mode 100644 (file)
index 0000000..f9cc5ea
Binary files /dev/null and b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl.svg b/resources/lib/oojs-ui/themes/apex/images/icons/watchlist-rtl.svg
new file mode 100644 (file)
index 0000000..8bfe43e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="g780">
+        <path d="M11 14H6v1h5v-1zm0 3H6v-1h5v1zm0 1H6v1h5v-1zm1-5v3l5 3-1-6 4-3-6-1-2-5s-1.9 5-2 5l-6 1 4 3h4z" id="path782"/>
+    </g>
+</svg>
index 4b15161..850f157 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/apex/images/icons/wikiText.png and b/resources/lib/oojs-ui/themes/apex/images/icons/wikiText.png differ
index ded0fe1..4512cf5 100644 (file)
@@ -1,15 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g>
-        <path d="M23 5h-4v2h2v10h-2v2h4z"/>
-    </g>
-    <g>
-        <path d="M18 5h-4v2h2v10h-2v2h4z"/>
-    </g>
-    <g>
-        <path d="M2 5h4v2H4v10h2v2H2z"/>
-    </g>
-    <g>
-        <path d="M7 5h4v2H9v10h2v2H7z"/>
+    <g id="wikiText">
+        <path id="opening-bracket-inner" d="M7 19h3v-2H9V7h1V5H7z"/>
+        <path id="closing-bracket-inner" d="M17 19h-3v-2h1V7h-1V5h3z"/>
+        <path id="closing-bracket-outer" d="M21 19h-3v-2h1V7h-1V5h3z"/>
+        <path id="opening-bracket-outer" d="M3 19h3v-2H5V7h1V5H3z"/>
     </g>
 </svg>
index 9b3c199..11b232c 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
+        <path id="magnifying-glass" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
     </g>
 </svg>
index 3201301..0679fa2 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
+        <path id="magnifying-glass" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index ef368c2..d981728 100644 (file)
@@ -19,7 +19,7 @@
                        "ltr": "images/icons/find-ltr.svg",
                        "rtl": "images/icons/find-rtl.svg"
                } },
-               "insert": { "file": "images/icons/insert.svg" },
+               "insert": { "file": "images/icons/add.svg" },
                "layout": { "file": {
                        "ltr": "images/icons/layout-ltr.svg",
                        "rtl": "images/icons/layout-rtl.svg"
index 1c6da5a..c7684ec 100644 (file)
                        "ltr": "images/icons/imageLock-ltr.svg",
                        "rtl": "images/icons/imageLock-rtl.svg"
                } },
+               "imageGallery": { "file": {
+                       "ltr": "images/icons/imageGallery-ltr.svg",
+                       "rtl": "images/icons/imageGallery-rtl.svg"
+               } },
                "photoGallery": { "file": {
-                       "ltr": "images/icons/photoGallery-ltr.svg",
-                       "rtl": "images/icons/photoGallery-rtl.svg"
+                       "ltr": "images/icons/imageGallery-ltr.svg",
+                       "rtl": "images/icons/imageGallery-rtl.svg"
                } },
                "play": { "file": {
                        "ltr": "images/icons/play-ltr.svg",
index a79b329..fc058cd 100644 (file)
@@ -24,7 +24,7 @@
                "add": { "file": "images/icons/add.svg", "variants": [ "constructive" ] },
                "advanced": { "file": "images/icons/advanced.svg" },
                "alert": { "file": "images/icons/alert.svg", "variants": [ "warning" ] },
-               "cancel": { "file": "images/icons/cancel.svg" },
+               "cancel": { "file": "images/icons/cancel.svg", "variants": [ "destructive" ] },
                "check": { "file": "images/icons/check.svg", "variants": [ "constructive", "progressive", "destructive" ] },
                "circle": { "file": "images/icons/circle.svg", "variants": [ "constructive" ] },
                "close": { "file": {
                        "rtl": "images/icons/move-rtl.svg"
                } },
                "notice": { "file": "images/icons/notice.svg" },
-               "picture": { "file": "images/icons/picture.svg" },
+               "picture": { "file": {
+                       "ltr": "images/icons/image-rtl.svg",
+                       "rtl": "images/icons/image-ltr.svg"
+               } },
                "previous": { "file": {
                        "ltr": "images/icons/move-rtl.svg",
                        "rtl": "images/icons/move-ltr.svg"
@@ -60,7 +63,7 @@
                        "ltr": "images/icons/arched-arrow-ltr.svg",
                        "rtl": "images/icons/arched-arrow-rtl.svg"
                } },
-               "remove": { "file": "images/icons/remove.svg", "variants": [ "destructive" ] },
+               "remove": { "file": "images/icons/trash.svg", "variants": [ "destructive" ] },
                "search": { "file": {
                        "ltr": "images/icons/search-ltr.svg",
                        "rtl": "images/icons/search-rtl.svg"
index c65a5c1..e81206c 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-constructive.png differ
index ef2ac5c..dab0bea 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #00AF89 }</style>
     <g id="add">
-        <path id="plus" d="M13 8h-2v3H8v2h3v3h2v-3h3v-2h-3z"/>
+        <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
 </svg>
index d6144e3..34a293f 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add-invert.png differ
index 2ad5f60..35322d0 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="add">
-        <path id="plus" d="M13 8h-2v3H8v2h3v3h2v-3h3v-2h-3z"/>
+        <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
 </svg>
index 730d102..c0d04e9 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/add.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/add.png differ
index 85e39fe..62e5496 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="add">
-        <path id="plus" d="M13 8h-2v3H8v2h3v3h2v-3h3v-2h-3z"/>
+        <path id="plus" d="M13 6h-2v5H6v2h5v5h2v-5h5v-2h-5z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.png
new file mode 100644 (file)
index 0000000..08385b5
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/cancel-destructive.svg
new file mode 100644 (file)
index 0000000..3496acf
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
+    <g id="cancel">
+        <path id="circle-with-strike" d="M12 5.022c-3.855 0-6.98 3.124-6.98 6.978 0 3.853 3.124 6.978 6.977 6.978s6.978-3.125 6.978-6.978c0-3.854-3.125-6.978-6.98-6.978zM6.885 12c0-1.092.572-3.25.93-2.93l7.113 7.114c.487.525-1.838.93-2.93.93-2.826 0-5.114-2.29-5.114-5.114zm9.298 2.93L9.07 7.815c-.445-.483 1.837-.93 2.93-.93 2.826 0 5.114 2.288 5.114 5.113 0 1.092-.364 3.542-.93 2.93z"/>
+    </g>
+</svg>
index 08bf391..fc724c8 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr-invert.png differ
index 81558e0..9b39350 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g>
-        <path d="M20 18l-4-4-2 2-4-4-2 1-4 5h16zm2-13v15H2V5h20z"/>
+    <g id="image">
+        <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-11v13H4V6z"/>
     </g>
 </svg>
index 58bf564..23c2331 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/image-ltr.png differ
index 72ebf10..dfcbd8b 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g>
-        <path d="M20 18l-4-4-2 2-4-4-2 1-4 5h16zm2-13v15H2V5h20z"/>
+    <g id="image">
+        <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-11v13H4V6z"/>
     </g>
 </svg>
index b5b7fb5..9845260 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl-invert.png differ
index c00d0c4..f962cbf 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="g278">
-        <path d="M4 18l4-4 2 2 4-4 2 1 4 5H4zM2 5v15h20V5H2z" id="path280"/>
+    <g id="image">
+        <path id="mountains" d="M6 17l3-3 2 1 3-3 4 5zM4 6v13h16V6z"/>
     </g>
 </svg>
index 73ee31a..1260378 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/image-rtl.png differ
index ca53d9b..2251c0e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="g278">
-        <path d="M4 18l4-4 2 2 4-4 2 1 4 5H4zM2 5v15h20V5H2z" id="path280"/>
+    <g id="image">
+        <path id="mountains" d="M6 17l3-3 2 1 3-3 4 5zM4 6v13h16V6z"/>
     </g>
 </svg>
index e56944a..32b7d1a 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr-invert.png differ
index da2ddaa..cfcf60d 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M17 12V8h-4V5H0v15h20v-8h-3zM2 18l4-5 2-1 4 4 2-2 4 4H2z"/>
-    <g>
-        <path d="M24 5h-4V1h-2v4h-4v2h4v4h2V7h4z"/>
+    <g id="imageAdd">
+        <path id="mountains" d="M16 17l-3-3-2 1-3-3-4 5zm-1-8v4h3v6H2V6h9v3z"/>
+        <path id="add" d="M22 6h-4V2h-2v4h-4v2h4v4h2V8h4z"/>
     </g>
 </svg>
index 7ed8b7e..a071e4e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-ltr.png differ
index b775ddf..1b60cf0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M17 12V8h-4V5H0v15h20v-8h-3zM2 18l4-5 2-1 4 4 2-2 4 4H2z"/>
-    <g>
-        <path d="M24 5h-4V1h-2v4h-4v2h4v4h2V7h4z"/>
+    <g id="imageAdd">
+        <path id="mountains" d="M16 17l-3-3-2 1-3-3-4 5zm-1-8v4h3v6H2V6h9v3z"/>
+        <path id="add" d="M22 6h-4V2h-2v4h-4v2h4v4h2V8h4z"/>
     </g>
 </svg>
index eba653f..bfc5625 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl-invert.png differ
index 7b7beaa..8b20a50 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M7 12V8h4V5h13v15H4v-8h3zm15 6l-4-5-2-1-4 4-2-2-4 4h16z" id="path290"/>
-    <g id="g292">
-        <path d="M0 5h4V1h2v4h4v2H6v4H4V7H0z" id="path294"/>
+    <g id="imageAdd">
+        <path id="mountains" d="M8 17l3-3 2 1 3-3 4 5zm1-8v4H6v6h16V6h-9v3z"/>
+        <path id="add" d="M2 6h4V2h2v4h4v2H8v4H6V8H2z"/>
     </g>
 </svg>
index 74b6ef3..ad22a4e 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageAdd-rtl.png differ
index a7128be..b86d499 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M7 12V8h4V5h13v15H4v-8h3zm15 6l-4-5-2-1-4 4-2-2-4 4h16z" id="path290"/>
-    <g id="g292">
-        <path d="M0 5h4V1h2v4h4v2H6v4H4V7H0z" id="path294"/>
+    <g id="imageAdd">
+        <path id="mountains" d="M8 17l3-3 2 1 3-3 4 5zm1-8v4H6v6h16V6h-9v3z"/>
+        <path id="add" d="M2 6h4V2h2v4h4v2H8v4H6V8H2z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.png
new file mode 100644 (file)
index 0000000..6bb8581
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr-invert.svg
new file mode 100644 (file)
index 0000000..c507c20
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="imageGallery">
+       <path d="M2 4v14h2V6h15V4H2zm3 3v13h16V7H5zm6 6l3 3 2-1 3 3H7l4-5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr.png
new file mode 100644 (file)
index 0000000..db12fcd
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-ltr.svg
new file mode 100644 (file)
index 0000000..95e28d4
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="imageGallery">
+       <path d="M2 4v14h2V6h15V4H2zm3 3v13h16V7H5zm6 6l3 3 2-1 3 3H7l4-5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.png
new file mode 100644 (file)
index 0000000..964d8b1
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl-invert.svg
new file mode 100644 (file)
index 0000000..caa4098
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+    <g id="imageGallery">
+       <path d="M21 4v14h-2V6H4V4h17zm-3 3v13H2V7h16zm-6 6l-3 3-2-1-3 3h12l-4-5z"/>
+    </g>
+</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl.png
new file mode 100644 (file)
index 0000000..ca56cc3
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageGallery-rtl.svg
new file mode 100644 (file)
index 0000000..be12662
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+    <g id="imageGallery">
+       <path d="M21 4v14h-2V6H4V4h17zm-3 3v13H2V7h16zm-6 6l-3 3-2-1-3 3h12l-4-5z"/>
+    </g>
+</svg>
index 50e7889..20cda89 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr-invert.png differ
index 10d770a..b14b67d 100644 (file)
@@ -1,4 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M19.5 4h-3V3s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-8 7V5H2v15h20v-9zm-9 7l4-5 2-1 4 4 2-2 4 4z" id="path304"/>
+    <g id="imageAdd">
+        <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-5v7H4V6h8v6z"/>
+        <path id="lock" d="M18.5 5h-3V4s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM20 5V4s0-3-3-3-3 3-3 3v1h-1v6h8V5z"/>
+    </g>
 </svg>
index c636a8d..973e363 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-ltr.png differ
index b41ff43..50a928a 100644 (file)
@@ -1,4 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M19.5 4h-3V3s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM21 4V3s0-3-3-3-3 3-3 3v1h-1v6h8V4zm-8 7V5H2v15h20v-9zm-9 7l4-5 2-1 4 4 2-2 4 4z" id="path304"/>
+    <g id="imageAdd">
+        <path id="mountains" d="M18 17l-3-3-2 1-3-3-4 5zm2-5v7H4V6h8v6z"/>
+        <path id="lock" d="M18.5 5h-3V4s0-1.5 1.5-1.5c1.5.06 1.5 1.5 1.5 1.5zM20 5V4s0-3-3-3-3 3-3 3v1h-1v6h8V5z"/>
+    </g>
 </svg>
index 1b1029b..2058be0 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl-invert.png differ
index c821cd1..275dfc2 100644 (file)
@@ -1,4 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <path d="M4.5 4h3V3s0-1.5-1.5-1.5C4.5 1.56 4.5 3 4.5 3zM3 4V3s0-3 3-3 3 3 3 3v1h1v6H2V4zm8 7V5h11v15H2v-9zm9 7l-4-5-2-1-4 4-2-2-4 4z" id="path304"/>
+    <g id="imageAdd">
+        <path id="mountains" d="M7 17l3-3 2 1 3-3 4 5zm-2-5v7h16V6h-8v6z"/>
+        <path id="lock" d="M6.5 5h3V4s0-1.5-1.5-1.5C6.5 2.56 6.5 4 6.5 4zM5 5V4s0-3 3-3 3 3 3 3v1h1v6H4V5z"/>
+    </g>
 </svg>
index 59439aa..d160db5 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/imageLock-rtl.png differ
index 29004d4..e8ac3ed 100644 (file)
@@ -1,4 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <path d="M4.5 4h3V3s0-1.5-1.5-1.5C4.5 1.56 4.5 3 4.5 3zM3 4V3s0-3 3-3 3 3 3 3v1h1v6H2V4zm8 7V5h11v15H2v-9zm9 7l-4-5-2-1-4 4-2-2-4 4z" id="path304"/>
+    <g id="imageAdd">
+        <path id="mountains" d="M7 17l3-3 2 1 3-3 4 5zm-2-5v7h16V6h-8v6z"/>
+        <path id="lock" d="M6.5 5h3V4s0-1.5-1.5-1.5C6.5 2.56 6.5 4 6.5 4zM5 5V4s0-3 3-3 3 3 3 3v1h1v6H4V5z"/>
+    </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert-invert.png
deleted file mode 100644 (file)
index dd08bc2..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert-invert.svg
deleted file mode 100644 (file)
index 54b8ffd..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="insert">
-        <path d="M13 5h-2v6H5v2h6v6h2v-6h6v-2h-6z" id="plus"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.png
deleted file mode 100644 (file)
index 97927a8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/insert.svg
deleted file mode 100644 (file)
index d1e9ba3..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="insert">
-        <path d="M13 5h-2v6H5v2h6v6h2v-6h6v-2h-6z" id="plus"/>
-    </g>
-</svg>
index 72bbf34..0400c19 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu-invert.png differ
index 3bda245..1081b4c 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
     <g id="menu">
-        <path id="lines" d="M6 15.5h12c.6 0 1 .4 1 1v1c0 .6-.4 1-1 1H6c-.6 0-1-.4-1-1v-1c0-.6.4-1 1-1zm-1-4v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1zm0-5v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1z"/>
+        <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1H6c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1H6c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1H6c-.553 0-1 .447-1 1z"/>
     </g>
 </svg>
index 45daeab..0a78119 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/menu.png differ
index b84ab86..ce25178 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
     <g id="menu">
-        <path id="lines" d="M6 15.5h12c.6 0 1 .4 1 1v1c0 .6-.4 1-1 1H6c-.6 0-1-.4-1-1v-1c0-.6.4-1 1-1zm-1-4v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1zm0-5v1c0 .6.4 1 1 1h12c.6 0 1-.4 1-1v-1c0-.6-.4-1-1-1H6c-.6 0-1 .4-1 1z"/>
+        <path id="lines" d="M6 15h12c.553 0 1 .447 1 1v1c0 .553-.447 1-1 1H6c-.553 0-1-.447-1-1v-1c0-.553.447-1 1-1zm-1-4v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1v-1c0-.553-.447-1-1-1H6c-.553 0-1 .447-1 1zm0-5v1c0 .553.447 1 1 1h12c.553 0 1-.447 1-1V6c0-.553-.447-1-1-1H6c-.553 0-1 .447-1 1z"/>
     </g>
 </svg>
index dcd35ce..39e00b1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr-invert.png differ
index 770932b..e82e168 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g>
-        <path d="M16 14l2 2V5h-4v2h2zm0 2L9 9 7 7 6 6 5 5 2 2 1 3l2 2H2v14h4v-2H4V7h1l2 2v10h4v-2H9v-6l6 6h-1v2h3l4 4 1-1-4-4zm-5-9V5H7l2 2zm8-2v2h2v10h-2l2 2h2V5z"/>
+    <g id="noWikiText-rtl">
+        <path d="M15 13l2 2V5h-3v2h1zM3 3L2 4l1 1v14h3v-2H5V7l2 2v10h3v-2H9v-6l6 6h-1v2h3l3 3 1-1-3-3zm7 4V5H7l2 2zm8-2v2h1v10l2 2V5z"/>
     </g>
 </svg>
index 8b15525..875958b 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-ltr.png differ
index e0e4fc0..22c04ca 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g>
-        <path d="M16 14l2 2V5h-4v2h2zm0 2L9 9 7 7 6 6 5 5 2 2 1 3l2 2H2v14h4v-2H4V7h1l2 2v10h4v-2H9v-6l6 6h-1v2h3l4 4 1-1-4-4zm-5-9V5H7l2 2zm8-2v2h2v10h-2l2 2h2V5z"/>
+    <g id="noWikiText-rtl">
+        <path d="M15 13l2 2V5h-3v2h1zM3 3L2 4l1 1v14h3v-2H5V7l2 2v10h3v-2H9v-6l6 6h-1v2h3l3 3 1-1-3-3zm7 4V5H7l2 2zm8-2v2h1v10l2 2V5z"/>
     </g>
 </svg>
index eda918c..6cd62a1 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl-invert.png differ
index 2ecb331..5011541 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="g484">
-        <path d="M8 14l-2 2V5h4v2H8zm0 2l7-7 2-2 1-1 1-1 3-3 1 1-2 2h1v14h-4v-2h2V7h-1l-2 2v10h-4v-2h2v-6l-6 6h1v2H7l-4 4-1-1 4-4zm5-9V5h4l-2 2zM5 5v2H3v10h2l-2 2H1V5z" id="path486"/>
+    <g id="noWikiText-rtl">
+        <path d="M9 13l-2 2V5h3v2H9zM21 3l1 1-1 1v14h-3v-2h1V7l-2 2v10h-3v-2h1v-6l-6 6h1v2H7l-3 3-1-1 3-3zm-7 4V5h3l-2 2zM6 5v2H5v10l-2 2V5z"/>
     </g>
 </svg>
index f7bab38..6ebb399 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/noWikiText-rtl.png differ
index a7be5ab..d717265 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="g484">
-        <path d="M8 14l-2 2V5h4v2H8zm0 2l7-7 2-2 1-1 1-1 3-3 1 1-2 2h1v14h-4v-2h2V7h-1l-2 2v10h-4v-2h2v-6l-6 6h1v2H7l-4 4-1-1 4-4zm5-9V5h4l-2 2zM5 5v2H3v10h2l-2 2H1V5z" id="path486"/>
+    <g id="noWikiText-rtl">
+        <path d="M9 13l-2 2V5h3v2H9zM21 3l1 1-1 1v14h-3v-2h1V7l-2 2v10h-3v-2h1v-6l-6 6h1v2H7l-3 3-1-1 3-3zm-7 4V5h3l-2 2zM6 5v2H5v10l-2 2V5z"/>
     </g>
 </svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr-invert.png
deleted file mode 100644 (file)
index 2c23c3c..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr-invert.svg
deleted file mode 100644 (file)
index 8647752..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g>
-        <path d="M2 3h18v2H4v12H2V3zm13 13l-4-4-4 5h13l-3-3-2 2zM5 6h17v13H5V6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr.png
deleted file mode 100644 (file)
index 38a90e2..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-ltr.svg
deleted file mode 100644 (file)
index 17eee17..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g>
-        <path d="M2 3h18v2H4v12H2V3zm13 13l-4-4-4 5h13l-3-3-2 2zM5 6h17v13H5V6z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl-invert.png
deleted file mode 100644 (file)
index ea51cad..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl-invert.svg
deleted file mode 100644 (file)
index 283bd5d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="g508">
-        <path d="M22 3H4v2h16v12h2V3zM9 16l4-4 4 5H4l3-3 2 2zM19 6H2v13h17V6z" id="path510"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl.png
deleted file mode 100644 (file)
index bcb805d..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/photoGallery-rtl.svg
deleted file mode 100644 (file)
index 24a4e12..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="g508">
-        <path d="M22 3H4v2h16v12h2V3zM9 16l4-4 4 5H4l3-3 2 2zM19 6H2v13h17V6z" id="path510"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png
deleted file mode 100644 (file)
index f63756b..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture-invert.svg
deleted file mode 100644 (file)
index a969967..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="picture">
-        <path id="frame" d="M4 5v13h16v-13zm15 12h-14v-11h14z"/>
-        <path id="mountains" d="M9.5 10l2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12v-2.5z"/>
-        <path id="sky" d="M9.516 7.844l3.046 3.172 2.938-2.016 2.5 2v-4h-12v5z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png
deleted file mode 100644 (file)
index d680396..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/picture.svg
deleted file mode 100644 (file)
index 246e130..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="picture">
-        <path id="frame" d="M4 5v13h16v-13zm15 12h-14v-11h14z"/>
-        <path id="mountains" d="M9.5 10l2.328 2.312-1.312 1.094.875 1.032 4.109-3.438 2.5 2v3h-12v-2.5z"/>
-        <path id="sky" d="M9.516 7.844l3.046 3.172 2.938-2.016 2.5 2v-4h-12v5z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.png
deleted file mode 100644 (file)
index 84e6498..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-destructive.svg
deleted file mode 100644 (file)
index c242b8a..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
-    <g id="remove">
-        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.png
deleted file mode 100644 (file)
index 3343de8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove-invert.svg
deleted file mode 100644 (file)
index 0e2c8ba..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g id="remove">
-        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.png
deleted file mode 100644 (file)
index 9dc34b8..0000000
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.png and /dev/null differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/remove.svg
deleted file mode 100644 (file)
index ef5f97b..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g id="remove">
-        <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
-    </g>
-</svg>
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.png b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.png
new file mode 100644 (file)
index 0000000..ca4a7b9
Binary files /dev/null and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.png differ
diff --git a/resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.svg b/resources/lib/oojs-ui/themes/mediawiki/images/icons/trash-destructive.svg
new file mode 100644 (file)
index 0000000..7ef05a6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
+    <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
+</svg>
index bdf5238..5e53c45 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText-invert.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText-invert.png differ
index e050baa..ec12d0e 100644 (file)
@@ -1,15 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
-    <g>
-        <path d="M23 5h-4v2h2v10h-2v2h4z"/>
-    </g>
-    <g>
-        <path d="M18 5h-4v2h2v10h-2v2h4z"/>
-    </g>
-    <g>
-        <path d="M2 5h4v2H4v10h2v2H2z"/>
-    </g>
-    <g>
-        <path d="M7 5h4v2H9v10h2v2H7z"/>
+    <g id="wikiText">
+        <path id="opening-bracket-inner" d="M7 19h3v-2H9V7h1V5H7z"/>
+        <path id="closing-bracket-inner" d="M17 19h-3v-2h1V7h-1V5h3z"/>
+        <path id="closing-bracket-outer" d="M21 19h-3v-2h1V7h-1V5h3z"/>
+        <path id="opening-bracket-outer" d="M3 19h3v-2H5V7h1V5H3z"/>
     </g>
 </svg>
index 4b15161..850f157 100644 (file)
Binary files a/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText.png and b/resources/lib/oojs-ui/themes/mediawiki/images/icons/wikiText.png differ
index ded0fe1..4512cf5 100644 (file)
@@ -1,15 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
-    <g>
-        <path d="M23 5h-4v2h2v10h-2v2h4z"/>
-    </g>
-    <g>
-        <path d="M18 5h-4v2h2v10h-2v2h4z"/>
-    </g>
-    <g>
-        <path d="M2 5h4v2H4v10h2v2H2z"/>
-    </g>
-    <g>
-        <path d="M7 5h4v2H9v10h2v2H7z"/>
+    <g id="wikiText">
+        <path id="opening-bracket-inner" d="M7 19h3v-2H9V7h1V5H7z"/>
+        <path id="closing-bracket-inner" d="M17 19h-3v-2h1V7h-1V5h3z"/>
+        <path id="closing-bracket-outer" d="M21 19h-3v-2h1V7h-1V5h3z"/>
+        <path id="opening-bracket-outer" d="M3 19h3v-2H5V7h1V5H3z"/>
     </g>
 </svg>
index cf4de68..0b7af8e 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
+        <path id="magnifying-glass" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
     </g>
 </svg>
index 9b3c199..11b232c 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
+        <path id="magnifying-glass" d="M10.37 9.474L7.994 7.1l-.17-.1c.404-.566.644-1.26.644-2.01-.002-1.92-1.56-3.476-3.478-3.476-1.92 0-3.478 1.557-3.478 3.478 0 1.92 1.557 3.477 3.478 3.477.75 0 1.442-.24 2.01-.647l.098.17 2.375 2.373c.19.188.543.142.79-.105s.293-.6.104-.79zm-5.38-2.27c-1.22 0-2.213-.99-2.213-2.213 0-1.22.99-2.21 2.212-2.21 1.22 0 2.21.99 2.21 2.214s-.99 2.213-2.21 2.213z"/>
     </g>
 </svg>
index 41fe9bd..9b6ac9a 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12"><style>* { fill: #FFFFFF }</style>
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
+        <path id="magnifying-glass" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index 3201301..0679fa2 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12">
     <g id="search">
-        <path id="path3051" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
+        <path id="magnifying-glass" d="M1.63 9.474L4.006 7.1l.17-.1c-.404-.566-.644-1.26-.644-2.01.002-1.92 1.56-3.476 3.478-3.476 1.92 0 3.478 1.557 3.478 3.478 0 1.92-1.557 3.477-3.478 3.477-.75 0-1.442-.24-2.01-.647l-.098.17-2.375 2.373c-.19.188-.543.142-.79-.105s-.293-.6-.104-.79zm5.378-2.27c1.22 0 2.213-.99 2.213-2.213 0-1.22-.99-2.21-2.21-2.21S4.8 3.77 4.8 4.995 5.79 7.207 7.01 7.207z"/>
     </g>
 </svg>
index 9395ecf..3857f99 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs v1.1.9 optimised for jQuery
+ * OOjs v1.1.10 optimised for jQuery
  * https://www.mediawiki.org/wiki/OOjs
  *
  * Copyright 2011-2015 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2015-08-25T21:35:29Z
+ * Date: 2015-11-11T16:49:11Z
  */
 ( function ( global ) {
 
@@ -90,17 +90,19 @@ oo.initClass = function ( fn ) {
  * @throws {Error} If target already inherits from origin
  */
 oo.inheritClass = function ( targetFn, originFn ) {
+       var targetConstructor;
+
        if ( targetFn.prototype instanceof originFn ) {
                throw new Error( 'Target already inherits from origin' );
        }
 
-       var targetConstructor = targetFn.prototype.constructor;
+       targetConstructor = targetFn.prototype.constructor;
 
        // Using ['super'] instead of .super because 'super' is not supported
        // by IE 8 and below (bug 63303).
        // Provide .parent as alias for code supporting older browsers which
        // allows people to comply with their style guide.
-       targetFn['super'] = targetFn.parent = originFn;
+       targetFn[ 'super' ] = targetFn.parent = originFn;
 
        targetFn.prototype = createObject( originFn.prototype, {
                // Restore constructor property of targetFn
@@ -154,7 +156,7 @@ oo.mixinClass = function ( targetFn, originFn ) {
        // Copy prototype properties
        for ( key in originFn.prototype ) {
                if ( key !== 'constructor' && hasOwn.call( originFn.prototype, key ) ) {
-                       targetFn.prototype[key] = originFn.prototype[key];
+                       targetFn.prototype[ key ] = originFn.prototype[ key ];
                }
        }
 
@@ -163,7 +165,7 @@ oo.mixinClass = function ( targetFn, originFn ) {
        if ( originFn.static ) {
                for ( key in originFn.static ) {
                        if ( hasOwn.call( originFn.static, key ) ) {
-                               targetFn.static[key] = originFn.static[key];
+                               targetFn.static[ key ] = originFn.static[ key ];
                        }
                }
        } else {
@@ -183,8 +185,8 @@ oo.mixinClass = function ( targetFn, originFn ) {
  * that case.
  *
  * @param {Object} obj
- * @param {Mixed...} [keys]
- * @return obj[arguments[1]][arguments[2]].... or undefined
+ * @param {...Mixed} [keys]
+ * @return {Object|undefined} obj[arguments[1]][arguments[2]].... or undefined
  */
 oo.getProp = function ( obj ) {
        var i,
@@ -194,7 +196,7 @@ oo.getProp = function ( obj ) {
                        // Trying to access a property of undefined or null causes an error
                        return undefined;
                }
-               retval = retval[arguments[i]];
+               retval = retval[ arguments[ i ] ];
        }
        return retval;
 };
@@ -210,7 +212,7 @@ oo.getProp = function ( obj ) {
  * is not an object, this function will silently abort.
  *
  * @param {Object} obj
- * @param {Mixed...} [keys]
+ * @param {...Mixed} [keys]
  * @param {Mixed} [value]
  */
 oo.setProp = function ( obj ) {
@@ -220,15 +222,15 @@ oo.setProp = function ( obj ) {
                return;
        }
        for ( i = 1; i < arguments.length - 2; i++ ) {
-               if ( prop[arguments[i]] === undefined ) {
-                       prop[arguments[i]] = {};
+               if ( prop[ arguments[ i ] ] === undefined ) {
+                       prop[ arguments[ i ] ] = {};
                }
-               if ( Object( prop[arguments[i]] ) !== prop[arguments[i]] ) {
+               if ( Object( prop[ arguments[ i ] ] ) !== prop[ arguments[ i ] ] ) {
                        return;
                }
-               prop = prop[arguments[i]];
+               prop = prop[ arguments[ i ] ];
        }
-       prop[arguments[arguments.length - 2]] = arguments[arguments.length - 1];
+       prop[ arguments[ arguments.length - 2 ] ] = arguments[ arguments.length - 1 ];
 };
 
 /**
@@ -260,7 +262,7 @@ oo.cloneObject = function ( origin ) {
 
        for ( key in origin ) {
                if ( hasOwn.call( origin, key ) ) {
-                       r[key] = origin[key];
+                       r[ key ] = origin[ key ];
                }
        }
 
@@ -270,7 +272,7 @@ oo.cloneObject = function ( origin ) {
 /**
  * Get an array of all property values in an object.
  *
- * @param {Object} Object to get values from
+ * @param {Object} obj Object to get values from
  * @return {Array} List of object values
  */
 oo.getObjectValues = function ( obj ) {
@@ -283,13 +285,49 @@ oo.getObjectValues = function ( obj ) {
        values = [];
        for ( key in obj ) {
                if ( hasOwn.call( obj, key ) ) {
-                       values[values.length] = obj[key];
+                       values[ values.length ] = obj[ key ];
                }
        }
 
        return values;
 };
 
+/**
+ * Use binary search to locate an element in a sorted array.
+ *
+ * searchFunc is given an element from the array. `searchFunc(elem)` must return a number
+ * above 0 if the element we're searching for is to the right of (has a higher index than) elem,
+ * below 0 if it is to the left of elem, or zero if it's equal to elem.
+ *
+ * To search for a specific value with a comparator function (a `function cmp(a,b)` that returns
+ * above 0 if `a > b`, below 0 if `a < b`, and 0 if `a == b`), you can use
+ * `searchFunc = cmp.bind( null, value )`.
+ *
+ * @param {Array} arr Array to search in
+ * @param {Function} searchFunc Search function
+ * @param {boolean} [forInsertion] If not found, return index where val could be inserted
+ * @return {number|null} Index where val was found, or null if not found
+ */
+oo.binarySearch = function ( arr, searchFunc, forInsertion ) {
+       var mid, cmpResult,
+               left = 0,
+               right = arr.length;
+       while ( left < right ) {
+               // Equivalent to Math.floor( ( left + right ) / 2 ) but much faster
+               /*jshint bitwise:false */
+               mid = ( left + right ) >> 1;
+               cmpResult = searchFunc( arr[ mid ] );
+               if ( cmpResult < 0 ) {
+                       right = mid;
+               } else if ( cmpResult > 0 ) {
+                       left = mid + 1;
+               } else {
+                       return mid;
+               }
+       }
+       return forInsertion ? right : null;
+};
+
 /**
  * Recursively compare properties between two objects.
  *
@@ -320,7 +358,7 @@ oo.compare = function ( a, b, asymmetrical ) {
        }
 
        for ( k in a ) {
-               if ( !hasOwn.call( a, k ) || a[k] === undefined || a[k] === b[k] ) {
+               if ( !hasOwn.call( a, k ) || a[ k ] === undefined || a[ k ] === b[ k ] ) {
                        // Support es3-shim: Without the hasOwn filter, comparing [] to {} will be false in ES3
                        // because the shimmed "forEach" is enumerable and shows up in Array but not Object.
                        // Also ignore undefined values, because there is no conceptual difference between
@@ -328,8 +366,8 @@ oo.compare = function ( a, b, asymmetrical ) {
                        continue;
                }
 
-               aValue = a[k];
-               bValue = b[k];
+               aValue = a[ k ];
+               bValue = b[ k ];
                aType = typeof aValue;
                bType = typeof bValue;
                if ( aType !== bType ||
@@ -387,7 +425,7 @@ oo.copy = function ( source, leafCallback, nodeCallback ) {
 
        // source is an array or a plain object
        for ( key in source ) {
-               destination[key] = oo.copy( source[key], leafCallback, nodeCallback );
+               destination[ key ] = oo.copy( source[ key ], leafCallback, nodeCallback );
        }
 
        // This is an internal node, so we don't apply the leafCallback.
@@ -438,7 +476,7 @@ oo.getHash.keySortReplacer = function ( key, val ) {
                i = 0;
                len = keys.length;
                for ( ; i < len; i += 1 ) {
-                       normalized[keys[i]] = val[keys[i]];
+                       normalized[ keys[ i ] ] = val[ keys[ i ] ];
                }
                return normalized;
 
@@ -472,7 +510,7 @@ oo.unique = function ( arr ) {
  * By building an object (with the values for keys) in parallel with
  * the array, a new item's existence in the union can be computed faster.
  *
- * @param {Array...} arrays Arrays to union
+ * @param {...Array} arrays Arrays to union
  * @return {Array} Union of the arrays
  */
 oo.simpleArrayUnion = function () {
@@ -481,11 +519,11 @@ oo.simpleArrayUnion = function () {
                result = [];
 
        for ( i = 0, ilen = arguments.length; i < ilen; i++ ) {
-               arr = arguments[i];
+               arr = arguments[ i ];
                for ( j = 0, jlen = arr.length; j < jlen; j++ ) {
-                       if ( !obj[ arr[j] ] ) {
-                               obj[ arr[j] ] = true;
-                               result.push( arr[j] );
+                       if ( !obj[ arr[ j ] ] ) {
+                               obj[ arr[ j ] ] = true;
+                               result.push( arr[ j ] );
                        }
                }
        }
@@ -515,13 +553,13 @@ function simpleArrayCombine( a, b, includeB ) {
                result = [];
 
        for ( i = 0, ilen = b.length; i < ilen; i++ ) {
-               bObj[ b[i] ] = true;
+               bObj[ b[ i ] ] = true;
        }
 
        for ( i = 0, ilen = a.length; i < ilen; i++ ) {
-               isInB = !!bObj[ a[i] ];
+               isInB = !!bObj[ a[ i ] ];
                if ( isInB === includeB ) {
-                       result.push( a[i] );
+                       result.push( a[ i ] );
                }
        }
 
@@ -601,7 +639,7 @@ oo.isPlainObject = $.isPlainObject;
                        if ( context === undefined || context === null ) {
                                throw new Error( 'Method name "' + method + '" has no context.' );
                        }
-                       if ( typeof context[method] !== 'function' ) {
+                       if ( typeof context[ method ] !== 'function' ) {
                                // Technically the property could be replaced by a function before
                                // call time. But this probably signals a typo.
                                throw new Error( 'Property "' + method + '" is not a function' );
@@ -632,10 +670,10 @@ oo.isPlainObject = $.isPlainObject;
                validateMethod( method, context );
 
                if ( hasOwn.call( this.bindings, event ) ) {
-                       bindings = this.bindings[event];
+                       bindings = this.bindings[ event ];
                } else {
                        // Auto-initialize bindings list
-                       bindings = this.bindings[event] = [];
+                       bindings = this.bindings[ event ] = [];
                }
                // Add binding
                bindings.push( {
@@ -677,13 +715,13 @@ oo.isPlainObject = $.isPlainObject;
 
                if ( arguments.length === 1 ) {
                        // Remove all bindings for event
-                       delete this.bindings[event];
+                       delete this.bindings[ event ];
                        return this;
                }
 
                validateMethod( method, context );
 
-               if ( !hasOwn.call( this.bindings, event ) || !this.bindings[event].length ) {
+               if ( !hasOwn.call( this.bindings, event ) || !this.bindings[ event ].length ) {
                        // No matching bindings
                        return this;
                }
@@ -694,17 +732,17 @@ oo.isPlainObject = $.isPlainObject;
                }
 
                // Remove matching handlers
-               bindings = this.bindings[event];
+               bindings = this.bindings[ event ];
                i = bindings.length;
                while ( i-- ) {
-                       if ( bindings[i].method === method && bindings[i].context === context ) {
+                       if ( bindings[ i ].method === method && bindings[ i ].context === context ) {
                                bindings.splice( i, 1 );
                        }
                }
 
                // Cleanup if now empty
                if ( bindings.length === 0 ) {
-                       delete this.bindings[event];
+                       delete this.bindings[ event ];
                }
                return this;
        };
@@ -713,7 +751,7 @@ oo.isPlainObject = $.isPlainObject;
         * Emit an event.
         *
         * @param {string} event Type of event
-        * @param {Mixed} args First in a list of variadic arguments passed to event handler (optional)
+        * @param {...Mixed} args First in a list of variadic arguments passed to event handler (optional)
         * @return {boolean} Whether the event was handled by at least one listener
         */
        oo.EventEmitter.prototype.emit = function ( event ) {
@@ -722,12 +760,12 @@ oo.isPlainObject = $.isPlainObject;
 
                if ( hasOwn.call( this.bindings, event ) ) {
                        // Slicing ensures that we don't get tripped up by event handlers that add/remove bindings
-                       bindings = this.bindings[event].slice();
+                       bindings = this.bindings[ event ].slice();
                        for ( i = 1, len = arguments.length; i < len; i++ ) {
-                               args.push( arguments[i] );
+                               args.push( arguments[ i ] );
                        }
                        for ( i = 0, len = bindings.length; i < len; i++ ) {
-                               binding = bindings[i];
+                               binding = bindings[ i ];
                                if ( typeof binding.method === 'string' ) {
                                        // Lookup method by name (late binding)
                                        method = binding.context[ binding.method ];
@@ -758,11 +796,11 @@ oo.isPlainObject = $.isPlainObject;
                var method, args, event;
 
                for ( event in methods ) {
-                       method = methods[event];
+                       method = methods[ event ];
                        // Allow providing additional args
                        if ( Array.isArray( method ) ) {
                                args = method.slice( 1 );
-                               method = method[0];
+                               method = method[ 0 ];
                        } else {
                                args = [];
                        }
@@ -782,23 +820,27 @@ oo.isPlainObject = $.isPlainObject;
         * @chainable
         */
        oo.EventEmitter.prototype.disconnect = function ( context, methods ) {
-               var i, event, bindings;
+               var i, event, method, bindings;
 
                if ( methods ) {
                        // Remove specific connections to the context
                        for ( event in methods ) {
-                               this.off( event, methods[event], context );
+                               method = methods[ event ];
+                               if ( Array.isArray( method ) ) {
+                                       method = method[ 0 ];
+                               }
+                               this.off( event, method, context );
                        }
                } else {
                        // Remove all connections to the context
                        for ( event in this.bindings ) {
-                               bindings = this.bindings[event];
+                               bindings = this.bindings[ event ];
                                i = bindings.length;
                                while ( i-- ) {
                                        // bindings[i] may have been removed by the previous step's
                                        // this.off so check it still exists
-                                       if ( bindings[i] && bindings[i].context === context ) {
-                                               this.off( event, bindings[i].method, context );
+                                       if ( bindings[ i ] && bindings[ i ].context === context ) {
+                                               this.off( event, bindings[ i ].method, context );
                                        }
                                }
                        }
@@ -809,6 +851,480 @@ oo.isPlainObject = $.isPlainObject;
 
 }() );
 
+( function () {
+
+       /**
+        * Contain and manage a list of OO.EventEmitter items.
+        *
+        * Aggregates and manages their events collectively.
+        *
+        * This mixin must be used in a class that also mixes in OO.EventEmitter.
+        *
+        * @abstract
+        * @class OO.EmitterList
+        * @constructor
+        */
+       oo.EmitterList = function OoEmitterList() {
+               this.items = [];
+               this.aggregateItemEvents = {};
+       };
+
+       /* Events */
+
+       /**
+        * Item has been added
+        *
+        * @event add
+        * @param {OO.EventEmitter} item Added item
+        * @param {number} index Index items were added at
+        */
+
+       /**
+        * Item has been moved to a new index
+        *
+        * @event move
+        * @param {OO.EventEmitter} item Moved item
+        * @param {number} index Index item was moved to
+        * @param {number} oldIndex The original index the item was in
+        */
+
+       /**
+        * Item has been removed
+        *
+        * @event remove
+        * @param {OO.EventEmitter} item Removed item
+        * @param {number} index Index the item was removed from
+        */
+
+       /**
+        * @event clear The list has been cleared of items
+        */
+
+       /* Methods */
+
+       /**
+        * Normalize requested index to fit into the bounds of the given array.
+        *
+        * @private
+        * @static
+        * @param {Array} arr Given array
+        * @param {number|undefined} index Requested index
+        * @return {number} Normalized index
+        */
+       function normalizeArrayIndex( arr, index ) {
+               return ( index === undefined || index < 0 || index >= arr.length ) ?
+                       arr.length :
+                       index;
+       }
+
+       /**
+        * Get all items.
+        *
+        * @return {OO.EventEmitter[]} Items in the list
+        */
+       oo.EmitterList.prototype.getItems = function () {
+               return this.items.slice( 0 );
+       };
+
+       /**
+        * Get the index of a specific item.
+        *
+        * @param {OO.EventEmitter} item Requested item
+        * @return {number} Index of the item
+        */
+       oo.EmitterList.prototype.getItemIndex = function ( item ) {
+               return this.items.indexOf( item );
+       };
+
+       /**
+        * Get number of items.
+        *
+        * @return {number} Number of items in the list
+        */
+       oo.EmitterList.prototype.getItemCount = function () {
+               return this.items.length;
+       };
+
+       /**
+        * Check if a list contains no items.
+        *
+        * @return {boolean} Group is empty
+        */
+       oo.EmitterList.prototype.isEmpty = function () {
+               return !this.items.length;
+       };
+
+       /**
+        * Aggregate the events emitted by the group.
+        *
+        * When events are aggregated, the group will listen to all contained items for the event,
+        * and then emit the event under a new name. The new event will contain an additional leading
+        * parameter containing the item that emitted the original event. Other arguments emitted from
+        * the original event are passed through.
+        *
+        * @param {Object.<string,string|null>} events An object keyed by the name of the event that should be
+        *  aggregated  (e.g., ‘click’) and the value of the new name to use (e.g., ‘groupClick’).
+        *  A `null` value will remove aggregated events.
+
+        * @throws {Error} If aggregation already exists
+        */
+       oo.EmitterList.prototype.aggregate = function ( events ) {
+               var i, item, add, remove, itemEvent, groupEvent;
+
+               for ( itemEvent in events ) {
+                       groupEvent = events[ itemEvent ];
+
+                       // Remove existing aggregated event
+                       if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
+                               // Don't allow duplicate aggregations
+                               if ( groupEvent ) {
+                                       throw new Error( 'Duplicate item event aggregation for ' + itemEvent );
+                               }
+                               // Remove event aggregation from existing items
+                               for ( i = 0; i < this.items.length; i++ ) {
+                                       item = this.items[ i ];
+                                       if ( item.connect && item.disconnect ) {
+                                               remove = {};
+                                               remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
+                                               item.disconnect( this, remove );
+                                       }
+                               }
+                               // Prevent future items from aggregating event
+                               delete this.aggregateItemEvents[ itemEvent ];
+                       }
+
+                       // Add new aggregate event
+                       if ( groupEvent ) {
+                               // Make future items aggregate event
+                               this.aggregateItemEvents[ itemEvent ] = groupEvent;
+                               // Add event aggregation to existing items
+                               for ( i = 0; i < this.items.length; i++ ) {
+                                       item = this.items[ i ];
+                                       if ( item.connect && item.disconnect ) {
+                                               add = {};
+                                               add[ itemEvent ] = [ 'emit', groupEvent, item ];
+                                               item.connect( this, add );
+                                       }
+                               }
+                       }
+               }
+       };
+
+       /**
+        * Add items to the list.
+        *
+        * @param {OO.EventEmitter|OO.EventEmitter[]} items Item to add or
+        *  an array of items to add
+        * @param {number} [index] Index to add items at. If no index is
+        *  given, or if the index that is given is invalid, the item
+        *  will be added at the end of the list.
+        * @chainable
+        * @fires add
+        * @fires move
+        */
+       oo.EmitterList.prototype.addItems = function ( items, index ) {
+               var i, oldIndex;
+
+               if ( !Array.isArray( items ) ) {
+                       items = [ items ];
+               }
+
+               if ( items.length === 0 ) {
+                       return this;
+               }
+
+               index = normalizeArrayIndex( this.items, index );
+               for ( i = 0; i < items.length; i++ ) {
+                       oldIndex = this.items.indexOf( items[ i ] );
+                       if ( oldIndex !== -1 ) {
+                               // Move item to new index
+                               index = this.moveItem( items[ i ], index );
+                               this.emit( 'move', items[ i ], index, oldIndex );
+                       } else {
+                               // insert item at index
+                               index = this.insertItem( items[ i ], index );
+                               this.emit( 'add', items[ i ], index );
+                       }
+                       index++;
+               }
+
+               return this;
+       };
+
+       /**
+        * Move an item from its current position to a new index.
+        *
+        * The item is expected to exist in the list. If it doesn't,
+        * the method will throw an exception.
+        *
+        * @private
+        * @param {OO.EventEmitter} item Items to add
+        * @param {number} newIndex Index to move the item to
+        * @return {number} The index the item was moved to
+        * @throws {Error} If item is not in the list
+        */
+       oo.EmitterList.prototype.moveItem = function ( item, newIndex ) {
+               var existingIndex = this.items.indexOf( item );
+
+               if ( existingIndex === -1 ) {
+                       throw new Error( 'Item cannot be moved, because it is not in the list.' );
+               }
+
+               newIndex = normalizeArrayIndex( this.items, newIndex );
+
+               // Remove the item from the current index
+               this.items.splice( existingIndex, 1 );
+
+               // Adjust new index after removal
+               newIndex--;
+
+               // Move the item to the new index
+               this.items.splice( newIndex, 0, item );
+
+               return newIndex;
+       };
+
+       /**
+        * Utility method to insert an item into the list, and
+        * connect it to aggregate events.
+        *
+        * Don't call this directly unless you know what you're doing.
+        * Use #addItems instead.
+        *
+        * @private
+        * @param {OO.EventEmitter} item Items to add
+        * @param {number} index Index to add items at
+        * @return {number} The index the item was added at
+        */
+       oo.EmitterList.prototype.insertItem = function ( item, index ) {
+               var events, event;
+
+               // Add the item to event aggregation
+               if ( item.connect && item.disconnect ) {
+                       events = {};
+                       for ( event in this.aggregateItemEvents ) {
+                               events[ event ] = [ 'emit', this.aggregateItemEvents[ event ], item ];
+                       }
+                       item.connect( this, events );
+               }
+
+               index = normalizeArrayIndex( this.items, index );
+
+               // Insert into items array
+               this.items.splice( index, 0, item );
+               return index;
+       };
+
+       /**
+        * Remove items.
+        *
+        * @param {OO.EventEmitter[]} items Items to remove
+        * @chainable
+        * @fires remove
+        */
+       oo.EmitterList.prototype.removeItems = function ( items ) {
+               var i, item, index;
+
+               if ( !Array.isArray( items ) ) {
+                       items = [ items ];
+               }
+
+               if ( items.length === 0 ) {
+                       return this;
+               }
+
+               // Remove specific items
+               for ( i = 0; i < items.length; i++ ) {
+                       item = items[ i ];
+                       index = this.items.indexOf( item );
+                       if ( index !== -1 ) {
+                               if ( item.connect && item.disconnect ) {
+                                       // Disconnect all listeners from the item
+                                       item.disconnect( this );
+                               }
+                               this.items.splice( index, 1 );
+                               this.emit( 'remove', item, index );
+                       }
+               }
+
+               return this;
+       };
+
+       /**
+        * Clear all items
+        *
+        * @chainable
+        * @fires clear
+        */
+       oo.EmitterList.prototype.clearItems = function () {
+               var i, item,
+                       cleared = this.items.splice( 0, this.items.length );
+
+               // Disconnect all items
+               for ( i = 0; i < cleared.length; i++ ) {
+                       item = cleared[ i ];
+                       if ( item.connect && item.disconnect ) {
+                               item.disconnect( this );
+                       }
+               }
+
+               this.emit( 'clear' );
+
+               return this;
+       };
+
+}() );
+
+/**
+ * Manage a sorted list of OO.EmitterList objects.
+ *
+ * The sort order is based on a callback that compares two items. The return value of
+ * callback( a, b ) must be less than zero if a < b, greater than zero if a > b, and zero
+ * if a is equal to b. The callback should only return zero if the two objects are
+ * considered equal.
+ *
+ * When an item changes in a way that could affect their sorting behavior, it must
+ * emit the itemSortChange event. This will cause it to be re-sorted automatically.
+ *
+ * This mixin must be used in a class that also mixes in OO.EventEmitter.
+ *
+ * @abstract
+ * @class OO.SortedEmitterList
+ * @mixins OO.EmitterList
+ * @constructor
+ * @param {Function} sortingCallback Callback that compares two items.
+ */
+oo.SortedEmitterList = function OoSortedEmitterList( sortingCallback ) {
+       // Mixin constructors
+       oo.EmitterList.call( this );
+
+       this.sortingCallback = sortingCallback;
+
+       // Listen to sortChange event and make sure
+       // we re-sort the changed item when that happens
+       this.aggregate( {
+               sortChange: 'itemSortChange'
+       } );
+
+       this.connect( this, {
+               itemSortChange: 'onItemSortChange'
+       } );
+};
+
+oo.mixinClass( oo.SortedEmitterList, oo.EmitterList );
+
+/* Events */
+
+/**
+ * An item has changed properties that affect its sort positioning
+ * inside the list.
+ *
+ * @private
+ * @event itemSortChange
+ */
+
+/* Methods */
+
+/**
+ * Handle a case where an item changed a property that relates
+ * to its sorted order
+ *
+ * @param {OO.EventEmitter} item Item in the list
+ */
+oo.SortedEmitterList.prototype.onItemSortChange = function ( item ) {
+       // Remove the item
+       this.removeItems( item );
+       // Re-add the item so it is in the correct place
+       this.addItems( item );
+};
+
+/**
+ * Change the sorting callback for this sorted list.
+ *
+ * The callback receives two items. The return value of callback(a, b) must be less than zero
+ * if a < b, greater than zero if a > b, and zero if a is equal to b.
+ *
+ * @param {Function} sortingCallback Sorting callback
+ */
+oo.SortedEmitterList.prototype.setSortingCallback = function ( sortingCallback ) {
+       var items = this.getItems();
+
+       this.sortingCallback = sortingCallback;
+
+       // Empty the list
+       this.clearItems();
+       // Re-add the items in the new order
+       this.addItems( items );
+};
+
+/**
+ * Add items to the sorted list.
+ *
+ * @chainable
+ * @param {OO.EventEmitter|OO.EventEmitter[]} items Item to add or
+ *  an array of items to add
+ */
+oo.SortedEmitterList.prototype.addItems = function ( items ) {
+       var index, i, insertionIndex;
+
+       if ( !Array.isArray( items ) ) {
+               items = [ items ];
+       }
+
+       if ( items.length === 0 ) {
+               return this;
+       }
+
+       for ( i = 0; i < items.length; i++ ) {
+               // Find insertion index
+               insertionIndex = this.findInsertionIndex( items[ i ] );
+
+               // Check if the item exists using the sorting callback
+               // and remove it first if it exists
+               if (
+                       // First make sure the insertion index is not at the end
+                       // of the list (which means it does not point to any actual
+                       // items)
+                       insertionIndex <= this.items.length &&
+                       // Make sure there actually is an item in this index
+                       this.items[ insertionIndex ] &&
+                       // The callback returns 0 if the items are equal
+                       this.sortingCallback( this.items[ insertionIndex ], items[ i ] ) === 0
+               ) {
+                       // Remove the existing item
+                       this.removeItems( this.items[ insertionIndex ] );
+               }
+
+               // Insert item at the insertion index
+               index = this.insertItem( items[ i ], insertionIndex );
+               this.emit( 'add', items[ i ], insertionIndex );
+       }
+
+       return this;
+};
+
+/**
+ * Find the index a given item should be inserted at. If the item is already
+ * in the list, this will return the index where the item currently is.
+ *
+ * @param {OO.EventEmitter} item Items to insert
+ * @return {number} The index the item should be inserted at
+ */
+oo.SortedEmitterList.prototype.findInsertionIndex = function ( item ) {
+       var list = this;
+
+       return oo.binarySearch(
+               this.items,
+               // Fake a this.sortingCallback.bind( null, item ) call here
+               // otherwise this doesn't pass tests in phantomJS
+               function ( otherItem ) {
+                       return list.sortingCallback( item, otherItem );
+               },
+               true
+       );
+
+};
+
 /*global hasOwn */
 
 /**
@@ -858,11 +1374,11 @@ oo.mixinClass( oo.Registry, oo.EventEmitter );
 oo.Registry.prototype.register = function ( name, data ) {
        var i, len;
        if ( typeof name === 'string' ) {
-               this.registry[name] = data;
+               this.registry[ name ] = data;
                this.emit( 'register', name, data );
        } else if ( Array.isArray( name ) ) {
                for ( i = 0, len = name.length; i < len; i++ ) {
-                       this.register( name[i], data );
+                       this.register( name[ i ], data );
                }
        } else {
                throw new Error( 'Name must be a string or array, cannot be a ' + typeof name );
@@ -881,12 +1397,12 @@ oo.Registry.prototype.unregister = function ( name ) {
        if ( typeof name === 'string' ) {
                data = this.lookup( name );
                if ( data !== undefined ) {
-                       delete this.registry[name];
+                       delete this.registry[ name ];
                        this.emit( 'unregister', name, data );
                }
        } else if ( Array.isArray( name ) ) {
                for ( i = 0, len = name.length; i < len; i++ ) {
-                       this.unregister( name[i] );
+                       this.unregister( name[ i ] );
                }
        } else {
                throw new Error( 'Name must be a string or array, cannot be a ' + typeof name );
@@ -901,7 +1417,7 @@ oo.Registry.prototype.unregister = function ( name ) {
  */
 oo.Registry.prototype.lookup = function ( name ) {
        if ( hasOwn.call( this.registry, name ) ) {
-               return this.registry[name];
+               return this.registry[ name ];
        }
 };
 
@@ -984,7 +1500,7 @@ oo.Factory.prototype.unregister = function ( constructor ) {
  * constructor directly, so leaving one out will pass an undefined to the constructor.
  *
  * @param {string} name Object name
- * @param {Mixed...} [args] Arguments to pass to the constructor
+ * @param {...Mixed} [args] Arguments to pass to the constructor
  * @return {Object} The new object
  * @throws {Error} Unknown object name
  */
@@ -999,7 +1515,7 @@ oo.Factory.prototype.create = function ( name ) {
 
        // Convert arguments to array and shift the first argument (name) off
        for ( i = 1; i < arguments.length; i++ ) {
-               args.push( arguments[i] );
+               args.push( arguments[ i ] );
        }
 
        // We can't use the "new" operator with .apply directly because apply needs a
index 92f8eb9..afa7201 100644 (file)
@@ -33,12 +33,12 @@ function getAccessKeyPrefix( ua ) {
        var profile = $.client.profile( ua ),
                accessKeyPrefix = 'alt-';
 
-       // Opera on any platform
-       if ( profile.name === 'opera' ) {
+       // Classic Opera on any platform
+       if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
                accessKeyPrefix = 'shift-esc-';
 
-       // Chrome on any platform
-       } else if ( profile.name === 'chrome' ) {
+       // Chrome and modern Opera on any platform
+       } else if ( profile.name === 'chrome' || profile.name === 'opera' ) {
                accessKeyPrefix = (
                        profile.platform === 'mac'
                                // Chrome on Mac
index 9c18a91..c472ac7 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * HTML5 placeholder emulation for jQuery plugin
  *
  * This will automatically use the HTML5 placeholder attribute if supported, or emulate this behavior if not.
@@ -13,6 +13,7 @@
  * @version 2.1.0
  * @license MIT
  */
+
 ( function ( $ ) {
 
        var isInputSupported = 'placeholder' in document.createElement( 'input' ),
index df6fff3..719eacb 100644 (file)
@@ -19,6 +19,7 @@
  * @class jQuery.plugin.suggestions
  */
 
+ // jscs:disable checkParamNames
 /**
  * @method suggestions
  * @chainable
@@ -93,6 +94,7 @@
  * @param {boolean} [options.highlightInput=false] Whether to highlight matched portions of the
  *  input or not.
  */
+ // jscs:enable checkParamNames
 
 ( function ( $ ) {
 
index c39dc55..2318b33 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*!
  * TableSorter for MediaWiki
  *
  * Written 2011 Leo Koppelkamm
  * and mw.language.months.
  *
  * Uses 'tableSorterCollation' in mw.config (if available)
- */
-/**
  *
- * @description Create a sortable table with multi-column sorting capabilities
+ * Create a sortable table with multi-column sorting capabilities
  *
- * @example $( 'table' ).tablesorter();
- * @desc Create a simple tablesorter interface.
+ *      // Create a simple tablesorter interface
+ *      $( 'table' ).tablesorter();
  *
- * @example $( 'table' ).tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] } );
- * @desc Create a tablesorter interface initially sorting on the first and second column.
+ *      // Create a tablesorter interface, initially sorting on the first and second column
+ *      $( 'table' ).tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] } );
  *
- * @option String cssHeader ( optional ) A string of the class name to be appended
- *         to sortable tr elements in the thead of the table. Default value:
- *         "header"
+ * @param {string} [cssHeader="header"] A string of the class name to be appended to sortable
+ *         tr elements in the thead of the table.
  *
- * @option String cssAsc ( optional ) A string of the class name to be appended to
- *         sortable tr elements in the thead on a ascending sort. Default value:
- *         "headerSortUp"
+ * @param {string} [cssAsc="headerSortUp"] A string of the class name to be appended to
+ *         sortable tr elements in the thead on a ascending sort.
  *
- * @option String cssDesc ( optional ) A string of the class name to be appended
- *         to sortable tr elements in the thead on a descending sort. Default
- *         value: "headerSortDown"
+ * @param {string} [cssDesc="headerSortDown"] A string of the class name to be appended to
+ *         sortable tr elements in the thead on a descending sort.
  *
- * @option String sortMultisortKey ( optional ) A string of the multi-column sort
- *         key. Default value: "shiftKey"
+ * @param {string} [sortMultisortKey="shiftKey"] A string of the multi-column sort key.
  *
- * @option Boolean cancelSelection ( optional ) Boolean flag indicating if
- *         tablesorter should cancel selection of the table headers text.
- *         Default value: true
+ * @param {boolean} [cancelSelection=true] Boolean flag indicating iftablesorter should cancel
+ *         selection of the table headers text.
  *
- * @option Array sortList ( optional ) An array containing objects specifying sorting.
- *         By passing more than one object, multi-sorting will be applied. Object structure:
+ * @param {Array} [sortList] An array containing objects specifying sorting. By passing more
+ *         than one object, multi-sorting will be applied. Object structure:
  *         { <Integer column index>: <String 'asc' or 'desc'> }
- *         Default value: []
  *
  * @event sortEnd.tablesorter: Triggered as soon as any sorting has been applied.
  *
- * @type jQuery
- *
- * @name tablesorter
- *
- * @cat Plugins/Tablesorter
- *
  * @author Christian Bach/christian.bach@polyester.se
  */
-
 ( function ( $, mw ) {
        var ts,
                parsers = [];
index b901642..5e93ba6 100644 (file)
@@ -96,7 +96,7 @@
                         * Inserts text at the beginning and end of a text selection, optionally
                         * inserting text at the caret when selection is empty.
                         *
-                        * @fixme document the options parameters
+                        * FIXME document the options parameters
                         */
                        encapsulateSelection: function ( options ) {
                                return this.each( function () {
                         *
                         * Will focus the textarea in some browsers (IE/Opera)
                         *
-                        * @fixme document the options parameters
+                        * FIXME document the options parameters
                         */
                        getCaretPosition: function ( options ) {
                                function getCaret( e ) {
                                return getCaret( this.get( 0 ) );
                        },
                        /**
-                        * @fixme document the options parameters
+                        * FIXME document the options parameters
                         */
                        setSelection: function ( options ) {
                                return this.each( function () {
                         * @param {boolean} options Whether to force a scroll even if the caret position
                         *  is already visible. Defaults to false
                         *
-                        * @fixme document the options parameters (function body suggests options.force is a boolean, not options itself)
+                        * FIXME document the options parameters (function body suggests options.force is a boolean, not options itself)
                         */
                        scrollToCaretPosition: function ( options ) {
                                function getLineLength( e ) {
index 6d0175e..6de537a 100644 (file)
@@ -8,7 +8,7 @@
         * @param {jQuery.Event} e
         */
        function doLivePreview( e ) {
-               var isDiff, api, request, postData, copySelectors, section,
+               var isDiff, api, parseRequest, diffRequest, postData, copySelectors, section,
                        $wikiPreview, $wikiDiff, $editform, $textbox, $summary, $copyElements, $spinner, $errorBox;
 
                isDiff = ( e.target.name === 'wpDiff' );
                api = new mw.Api();
                postData = {
                        action: 'parse',
-                       uselang: mw.config.get( 'wgUserLanguage' ),
                        title: mw.config.get( 'wgPageName' ),
-                       text: $textbox.textSelection( 'getContents' ),
                        summary: $summary.textSelection( 'getContents' ),
-                       sectionpreview: section !== ''
+                       prop: ''
                };
 
-               if ( section === 'new' ) {
-                       postData.section = 'new';
-                       postData.sectiontitle = postData.summary;
-               }
-
                if ( isDiff ) {
                        $wikiPreview.hide();
 
-                       // First PST the input, then diff it
-                       postData.onlypst = true;
-                       request = api.post( postData );
-                       request.done( function ( response ) {
-                               api.post( {
-                                       action: 'query',
-                                       indexpageids: true,
-                                       prop: 'revisions',
-                                       titles: mw.config.get( 'wgPageName' ),
-                                       rvdifftotext: response.parse.text[ '*' ],
-                                       rvprop: [],
-                                       rvsection: section === '' ? undefined : section
-                               } ).done( function ( response ) {
-                                       try {
-                                               var diffHtml = response.query.pages[ response.query.pageids[ 0 ] ]
-                                                       .revisions[ 0 ].diff[ '*' ];
-                                               $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
-                                       } catch ( e ) {
-                                               // "result.blah is undefined" error, ignore
-                                               mw.log.warn( e );
-                                       }
-                                       $wikiDiff.show();
-                               } );
+                       if ( postData.summary ) {
+                               parseRequest = api.post( postData );
+                       }
+
+                       diffRequest = api.post( {
+                               action: 'query',
+                               indexpageids: true,
+                               prop: 'revisions',
+                               titles: mw.config.get( 'wgPageName' ),
+                               rvdifftotext: $textbox.textSelection( 'getContents' ),
+                               rvdifftotextpst: true,
+                               rvprop: '',
+                               rvsection: section === '' ? undefined : section
+                       } );
+
+                       // Wait for the summary before showing the diff so the page doesn't jump twice
+                       $.when( diffRequest, parseRequest ).done( function ( response ) {
+                               var diffHtml,
+                                       query = response[ 0 ].query;
+                               try {
+                                       diffHtml = query.pages[ query.pageids[ 0 ] ]
+                                               .revisions[ 0 ].diff[ '*' ];
+                                       $wikiDiff.find( 'table.diff tbody' ).html( diffHtml );
+                                       mw.hook( 'wikipage.diff' ).fire( $wikiDiff.find( 'table.diff' ) );
+                               } catch ( e ) {
+                                       // "result.blah is undefined" error, ignore
+                                       mw.log.warn( e );
+                               }
+                               $wikiDiff.show();
                        } );
                } else {
                        $wikiDiff.hide();
+
                        $.extend( postData, {
+                               prop: 'text|displaytitle|modules|jsconfigvars|categorieshtml|templates|langlinks|limitreporthtml',
+                               text: $textbox.textSelection( 'getContents' ),
                                pst: true,
                                preview: true,
-                               prop: 'text|displaytitle|modules|jsconfigvars|categorieshtml|templates|langlinks|limitreporthtml',
-                               disableeditsection: true
+                               sectionpreview: section !== '',
+                               disableeditsection: true,
+                               uselang: mw.config.get( 'wgUserLanguage' )
                        } );
-                       request = api.post( postData );
-                       request.done( function ( response ) {
+                       if ( section === 'new' ) {
+                               postData.section = 'new';
+                               postData.sectiontitle = postData.summary;
+                       }
+
+                       parseRequest = api.post( postData );
+                       parseRequest.done( function ( response ) {
                                var li, newList, $displaytitle, $content, $parent, $list;
                                if ( response.parse.jsconfigvars ) {
                                        mw.config.set( response.parse.jsconfigvars );
                                        $wikiPreview.append( $content );
 
                                        $wikiPreview.show();
-
                                }
                        } );
                }
-               request.done( function ( response ) {
-                       var isSubject = ( section === 'new' ),
+               $.when( parseRequest, diffRequest ).done( function ( parseResp ) {
+                       var parse = parseResp && parseResp[ 0 ].parse,
+                               isSubject = ( section === 'new' ),
                                summaryMsg = isSubject ? 'subject-preview' : 'summary-preview',
                                $summaryPreview = $editform.find( '.mw-summary-preview' ).empty();
-                       if ( response.parse.parsedsummary && response.parse.parsedsummary[ '*' ] !== '' ) {
+                       if ( parse && parse.parsedsummary && parse.parsedsummary[ '*' ] !== '' ) {
                                $summaryPreview.append(
                                        mw.message( summaryMsg ).parse(),
                                        ' ',
                                        $( '<span>' ).addClass( 'comment' ).html(
                                                // There is no equivalent to rawParams
                                                mw.message( 'parentheses' ).escaped()
-                                                       .replace( '$1', response.parse.parsedsummary[ '*' ] )
+                                                       .replace( '$1', parse.parsedsummary[ '*' ] )
                                        )
                                );
                        }
                        mw.hook( 'wikipage.editform' ).fire( $editform );
-               } );
-               request.always( function () {
+               } ).always( function () {
                        $spinner.hide();
                        $copyElements.animate( {
                                opacity: 1
                        }, 'fast' );
-               } );
-               request.fail( function ( code, result ) {
-                       var errorMsg = 'API error: ' +  code;
+               } ).fail( function ( code, result ) {
+                       // This just shows the error for whatever request failed first
+                       var errorMsg = 'API error: ' + code;
                        if ( code === 'http' ) {
                                errorMsg = 'HTTP error: ';
                                if ( result.exception ) {
                                        'class': 'portal',
                                        id: 'p-lang',
                                        role: 'navigation',
-                                       title: mw.msg( 'tooltip-p-lang' ),
                                        'aria-labelledby': 'p-lang-label'
                                } )
                                .append( $( '<h3>' ).attr( 'id', 'p-lang-label' ).text( mw.msg( 'otherlanguages' ) ) )
index a92f1c1..03a9f76 100644 (file)
@@ -26,8 +26,6 @@
        padding-left: 42px;
        background: transparent url(images/nextredirect-ltr.png) bottom left no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/nextredirect-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/nextredirect-ltr.svg);
 }
 
@@ -36,8 +34,6 @@
        padding-left: 47px;
        background: transparent url(images/redirect-ltr.png) bottom left no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/redirect-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/redirect-ltr.svg);
 }
 
@@ -49,8 +45,6 @@
        padding-right: 42px;
        background: transparent url(images/nextredirect-rtl.png) bottom right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/nextredirect-rtl.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/nextredirect-rtl.svg);
 }
 
@@ -59,7 +53,5 @@
        padding-right: 47px;
        background: transparent url(images/redirect-rtl.png) bottom right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/redirect-rtl.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/redirect-rtl.svg);
 }
index 77fa753..453d928 100644 (file)
@@ -18,8 +18,6 @@ div.top,
 div#column-one,
 .mw-editsection,
 .mw-editsection-like,
-.toctoggle,
-#toc.tochidden,
 div#f-poweredbyico,
 div#f-copyrightico,
 li#about,
@@ -126,6 +124,20 @@ pre, .mw-code {
        *display: inline;
 }
 
+/* Separate columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber,
+.toctext {
+       display: table-cell;
+}
+
+/* Space between the columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber:after {
+       content: "";
+       padding-right: 0.5em;
+}
+
 #footer {
        background: white;
        color: black;
@@ -139,11 +151,6 @@ img {
        vertical-align: middle;
 }
 
-/* math */
-span.texhtml {
-       font-family: serif;
-}
-
 /**
  * Links
  */
index 66161ed..5d637da 100644 (file)
@@ -122,8 +122,6 @@ div.magnify a {
        /* Use same SVG support hack as mediawiki.legacy's shared.css */
        background: url(images/magnify-clip-ltr.png) center center no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
        /* Don't annoy people who copy-paste everything too much */
        -moz-user-select: none;
@@ -212,11 +210,6 @@ table.toc td {
        margin: 0 0 0 2em;
 }
 
-#toc .toctoggle,
-.toc .toctoggle {
-       font-size: 94%;
-}
-
 .error {
        color: red;
        font-size: larger;
index 59f5592..daebac1 100644 (file)
@@ -121,20 +121,6 @@ span.comment {
        font-style: italic;
 }
 
-/* Math */
-.texvc {
-       direction: ltr;
-       unicode-bidi: embed;
-}
-
-img.tex {
-       vertical-align: middle;
-}
-
-span.texhtml {
-       font-family: serif;
-}
-
 /**
  * Add a bit of margin space between the preview and the toolbar.
  * This replaces the ugly <p><br /></p> we used to insert into the page source
@@ -205,6 +191,10 @@ input#wpSummary {
        margin-bottom: 1em;
 }
 
+.mw-input-with-label {
+       white-space: nowrap;
+}
+
 /**
  * Image captions.
  *
@@ -882,8 +872,6 @@ table.floatleft {
 }
 
 .mw-editsection,
-.toctoggle,
-.tochidden,
 #jump-to-nav {
        -moz-user-select: none;
        -webkit-user-select: none;
index 7d1f6d7..38271a0 100644 (file)
                loadedScripts[ url ] = true;
                var s = document.createElement( 'script' );
                s.setAttribute( 'src', url );
-               s.setAttribute( 'type', 'text/javascript' );
                document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
                return s;
        }
index 79549c3..06c18e6 100644 (file)
@@ -1,4 +1,4 @@
-// Common LESS mixin library for MediaWiki
+// Common Less mixin library for MediaWiki
 //
 // By default the folder containing this file is included in $wgResourceLoaderLESSImportPaths,
 // which makes this file importable by all less files via '@import "mediawiki.mixins";'.
@@ -12,9 +12,8 @@
        background-image: e('/* @embed */') url(@url);
 }
 
+// Deprecated in MW 1.27
 .background-size(@width, @height) {
-       // Vendor prefix for certain older opera browsers e.g. nintendo ds
-       -o-background-size: @width @height;
        // Vendor prefix is added to support Android 2
        -webkit-background-size: @width @height;
        background-size: @width @height;
@@ -39,7 +38,6 @@
 // is not worth the harm done to modern ones.
 .background-image-svg(@svg, @fallback) {
        background-image: url(@fallback);
-       background-image: -webkit-linear-gradient(transparent, transparent), e('/* @embed */') url(@svg);
        background-image: linear-gradient(transparent, transparent), e('/* @embed */') url(@svg);
        // Do not serve SVG to Opera 12, bad rendering with border-radius or background-size (T87504)
        background-image: -o-linear-gradient(transparent, transparent), url(@fallback);
@@ -80,9 +78,9 @@
 }
 
 .column-width(@value) {
-       -webkit-column-width: @value;// Chrome Any, Safari 3+, Opera 11.1+
-       -moz-column-width: @value;// Firefox 1.5+
-       column-width: @value;// IE 10+
+       -webkit-column-width: @value; // Chrome Any, Safari 3+, Opera 11.1+
+       -moz-column-width: @value; // Firefox 1.5+
+       column-width: @value; // IE 10+
 }
 
 .column-break-inside-avoid() {
        page-break-inside: avoid; // Firefox 1.5+
        break-inside: avoid-column; // IE 10+
 }
+
+.flex-display(@display: flex) {
+       display: ~"-webkit-@{display}"; // iOS 6-, Safari 3.1-6
+       display: ~"-moz-@{display}"; // Firefox 21-
+       display: ~"-ms-@{display}box"; // IE 10
+       display: @display;
+}
+
+.flex(@grow: 1, @shrink: 1, @width: auto, @order: 1) {
+       // For 2009/2012 spec alignment consistency with current default
+       -webkit-box-pack: justify; // iOS 6-, Safari 3.1-6
+       -moz-box-pack: justify; // Firefox 21-
+       -ms-flex-pack: justify; // IE10 (2012 spec)
+       justify-content: space-between; // Current default
+
+       // 2009 spec only supports 'flexible' as opposed to grow (flexPositive)
+       // and shrink (flexNegative); default to grow value
+       -webkit-box-flex: @grow; // iOS 6-, Safari 3.1-6
+       -moz-box-flex: @grow; // Firefox 21-
+       width: @width; // Fallback for flex-basis
+
+       -ms-flex: @grow @shrink @width; // IE10
+       flex: @grow @shrink @width;
+
+       -webkit-box-ordinal-group: @order; // iOS 6-, Safari 3.1-6
+       -moz-box-ordinal-group: @order; // Firefox 21-
+       -ms-flex-order: @order; // IE10
+       order: @order;
+}
index ad01865..862454d 100644 (file)
@@ -8,9 +8,10 @@
         *
         * @constructor
         * @param {mw.Title} title Wikitext page in a talk namespace, to post to
+        * @param {mw.Api} api mw.Api object to use
         */
-       function WikitextMessagePoster( title ) {
-               this.api = new mw.Api();
+       function WikitextMessagePoster( title, api ) {
+               this.api = api;
                this.title = title;
        }
 
index 4d0231f..b6dc2b4 100644 (file)
@@ -8,7 +8,6 @@
         * @singleton
         */
        function MwMessagePosterFactory() {
-               this.api = new mw.Api();
                this.contentModelToClass = {};
        }
 
@@ -50,6 +49,7 @@
         * API and ResourceLoader requests in the background.
         *
         * @param {mw.Title} title Title that will be posted to
+        * @param {string} [apiUrl] api.php URL if the title is on another wiki
         * @return {jQuery.Promise} Promise resolving to a mw.messagePoster.MessagePoster.
         *   For failure, rejected with up to three arguments:
         *
         *   - error Error explanation
         *   - details Further error details
         */
-       MwMessagePosterFactory.prototype.create = function ( title ) {
-               var pageId, page, contentModel, moduleName,
+       MwMessagePosterFactory.prototype.create = function ( title, apiUrl ) {
+               var pageId, page, contentModel, moduleName, api,
                        factory = this;
 
-               return this.api.get( {
+               if ( apiUrl ) {
+                       api = new mw.ForeignApi( apiUrl );
+               } else {
+                       api = mw.Api();
+               }
+
+               return api.get( {
                        action: 'query',
                        prop: 'info',
                        indexpageids: true,
@@ -76,7 +82,8 @@
                                return mw.loader.using( moduleName ).then( function () {
                                        return factory.createForContentModel(
                                                contentModel,
-                                               title
+                                               title,
+                                               api
                                        );
                                }, function () {
                                        return $.Deferred().reject( 'failed-to-load-module', 'Failed to load the \'' + moduleName + '\' module' );
         *
         * @param {string} contentModel Content model of title
         * @param {mw.Title} title Title being posted to
+        * @param {mw.Api} api mw.Api instance that the instance should use
         * @return {mw.messagePoster.MessagePoster}
         *
         */
-       MwMessagePosterFactory.prototype.createForContentModel = function ( contentModel, title ) {
-               return new this.contentModelToClass[ contentModel ]( title );
+       MwMessagePosterFactory.prototype.createForContentModel = function ( contentModel, title, api ) {
+               return new this.contentModelToClass[ contentModel ]( title, api );
        };
 
        mw.messagePoster = {
index 454fe58..c88d00d 100644 (file)
@@ -82,9 +82,25 @@ table.toc td {
        margin: 0 0 0 2em;
 }
 
-#toc .toctoggle,
-.toc .toctoggle {
-       font-size: 94%;
+/* Separate columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber,
+.toctext {
+       display: table-cell;
+       /*
+       Text decorations are not propagated to the contents of inline blocks and inline tables,
+       according to <http://www.w3.org/TR/css-text-decor-3/#line-decoration>, and 'display: table-cell'
+       generates an inline table when used without any parent table-rows and tables.
+       */
+       text-decoration: inherit;
+}
+
+/* Space between the columns for tocnumber and toctext */
+/* Ignored by IE7 and lower */
+.tocnumber:after {
+       content: "";
+       display: inline-block;
+       width: 0.5em;
 }
 
 /* Warning */
@@ -162,8 +178,6 @@ div.magnify a {
        /* Use same SVG support hack as mediawiki.legacy's shared.css */
        background-image: url(images/magnify-clip-ltr.png);
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
        /* Don't annoy people who copy-paste everything too much */
        -moz-user-select: none;
@@ -195,8 +209,6 @@ img.thumbborder {
        /* Use same SVG support hack as mediawiki.legacy's shared.css */
        background-image: url(images/magnify-clip-ltr.png);
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-ltr.svg);
 }
 
@@ -217,8 +229,6 @@ img.thumbborder {
        /* Use same SVG support hack as mediawiki.legacy's shared.css */
        background-image: url(images/magnify-clip-rtl.png);
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/magnify-clip-rtl.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/magnify-clip-rtl.svg);
 }
 
index d23540d..8890cbb 100644 (file)
@@ -23,8 +23,6 @@
 .link-mailto {
        background: url(images/mail.png) center right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/mail.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/mail.svg);
        padding-right: 15px;
 }
@@ -33,8 +31,6 @@
 .link-ftp {
        background: url(images/ftp-ltr.png) center right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/ftp-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/ftp-ltr.svg);
        padding-right: 15px;
 }
@@ -44,8 +40,6 @@
 .link-irc {
        background: url(images/chat-ltr.png) center right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/chat-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/chat-ltr.svg);
        padding-right: 15px;
 }
@@ -59,8 +53,6 @@
 .link-audio {
        background: url(images/audio-ltr.png) center right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/audio-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/audio-ltr.svg);
        padding-right: 15px;
 }
@@ -72,8 +64,6 @@
 .link-video {
        background: url(images/video.png) center right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/video.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/video.svg);
        padding-right: 15px;
 }
@@ -84,8 +74,6 @@
 .link-document {
        background: url(images/document-ltr.png) center right no-repeat;
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/document-ltr.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/document-ltr.svg);
        padding-right: 15px;
 }
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeemail.css b/resources/src/mediawiki.special/mediawiki.special.changeemail.css
deleted file mode 100644 (file)
index 92983df..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#mw-emailaddress-validity {
-       padding: 2px 1em;
-}
-#mw-emailaddress-validity {
-       border-bottom-right-radius: 0.8em;
-       border-top-right-radius: 0.8em;
-}
-
-/* Colors also used in mediawiki.special.preferences.css */
-#mw-emailaddress-validity.valid {
-       border: 1px solid #80FF80;
-       background-color: #C0FFC0;
-       color: black;
-}
-#mw-emailaddress-validity.invalid {
-       border: 1px solid #FF8080;
-       background-color: #FFC0C0;
-       color: black;
-}
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeemail.js b/resources/src/mediawiki.special/mediawiki.special.changeemail.js
deleted file mode 100644 (file)
index 06851b9..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*!
- * JavaScript for Special:ChangeEmail
- */
-( function ( mw, $ ) {
-       /**
-        * Given an email validity status (true, false, null) update the label CSS class
-        *
-        * @ignore
-        */
-       function updateMailValidityLabel( mail ) {
-               var isValid = mw.util.validateEmail( mail ),
-                       $label = $( '#mw-emailaddress-validity' );
-
-               // Set up the validity notice if it doesn't already exist
-               if ( $label.length === 0 ) {
-                       $label = $( '<label for="wpNewEmail" id="mw-emailaddress-validity"></label>' )
-                               .insertAfter( '#wpNewEmail' );
-               }
-
-               // We allow empty address
-               if ( isValid === null ) {
-                       $label.text( '' ).removeClass( 'valid invalid' );
-
-               // Valid
-               } else if ( isValid ) {
-                       $label.text( mw.msg( 'email-address-validity-valid' ) ).addClass( 'valid' ).removeClass( 'invalid' );
-
-               // Not valid
-               } else {
-                       $label.text( mw.msg( 'email-address-validity-invalid' ) ).addClass( 'invalid' ).removeClass( 'valid' );
-               }
-       }
-
-       $( function () {
-               $( '#wpNewEmail' )
-                       // Lame tip to let user know if its email is valid. See bug 22449.
-                       // Only bind once for 'blur' so that the user can fill it in without errors;
-                       // after that, look at every keypress for immediate feedback.
-                       .one( 'blur', function () {
-                               var $this = $( this );
-                               updateMailValidityLabel( $this.val() );
-                               $this.keyup( function () {
-                                       updateMailValidityLabel( $this.val() );
-                               } );
-                       } )
-                       // Supress built-in validation notice and just call updateMailValidityLabel(),
-                       // to avoid double notice. See bug 40909.
-                       .on( 'invalid', function ( e ) {
-                               e.preventDefault();
-                               updateMailValidityLabel( $( this ).val() );
-                       } );
-       } );
-}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.special/mediawiki.special.changeslist.visitedstatus.js b/resources/src/mediawiki.special/mediawiki.special.changeslist.visitedstatus.js
new file mode 100644 (file)
index 0000000..954e074
--- /dev/null
@@ -0,0 +1,12 @@
+/*!
+ * JavaScript for Special:Watchlist
+ */
+( function ( mw, $ ) {
+       $( function () {
+               $( '.mw-changeslist-line-watched .mw-title a' ).on( 'click', function () {
+                       $( this )
+                               .closest( '.mw-changeslist-line-watched' )
+                               .removeClass( 'mw-changeslist-line-watched' );
+               } );
+       } );
+}( mediaWiki, jQuery ) );
index 2b028ae..15f4e4d 100644 (file)
        font-style: italic;
 }
 
-/* Special:Allpages */
-.mw-allpages-nav {
-       text-align: right;
-       margin-bottom: 1em;
-}
-table.mw-allpages-table-form {
-       width: 100%;
-}
-table.mw-allpages-table-form tr {
-       vertical-align: top;
-}
-
-/* Special:Prefixindex */
-.mw-prefixindex-nav {
-       text-align: right;
-}
-table#mw-prefixindex-nav-table {
-       width: 100%;
-}
-td#mw-prefixindex-nav-form {
-       margin-bottom: 1em;
-       vertical-align: top;
-}
-
 /* Special:Block */
 p.mw-ipb-conveniencelinks {
        font-size: 90%;
diff --git a/resources/src/mediawiki.special/mediawiki.special.preferences.css b/resources/src/mediawiki.special/mediawiki.special.preferences.css
deleted file mode 100644 (file)
index 9e5efd3..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Reuses colors from mediawiki.special.changeemail.css */
-.mw-email-not-authenticated .mw-input,
-.mw-email-none .mw-input{
-       border: 1px solid #FF8080;
-       background-color: #FFC0C0;
-       color: black;
-}
-/* Authenticated email field has its own class too. Unstyled by default */
-/*
-.mw-email-authenticated .mw-input { }
-*/
-
-/*
- * Hide, but keep accessible for screen-readers.
- * Like .mw-jump, #jump-to-nav from shared.css
- */
-.mw-navigation-hint {
-       overflow: hidden;
-       height: 0;
-       zoom: 1;
-}
-
-/* When JS is enabled, .mw-preferences-messageboxes are replaced with mw.notifications */
-.mw-preferences-messagebox {
-       display: none;
-}
-
-.prefsection td.mw-label {
-       width: 20%;
-}
-
-.prefsection table {
-       width: 100%;
-}
-
-.prefsection table.mw-htmlform-matrix {
-       width: auto;
-}
index 0fda3dc..bebda10 100644 (file)
@@ -3,36 +3,32 @@
  */
 ( function ( mw, $ ) {
        $( function () {
-               var $preftoc, $preferences, $fieldsets, $legends,
+               var $preftoc, $preferences, $fieldsets,
                        hash, labelFunc,
                        $tzSelect, $tzTextbox, $localtimeHolder, servertime,
-                       $checkBoxes, allowCloseWindow,
-                       notif;
+                       allowCloseWindow, notif;
 
                labelFunc = function () {
                        return this.id.replace( /^mw-prefsection/g, 'preftab' );
                };
 
                $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-               $preftoc = $( '<ul>' )
-                       .attr( {
-                               id: 'preftoc',
-                               role: 'tablist'
-                       } );
-               $preferences = $( '#preferences' )
-                       .addClass( 'jsprefs' )
-                       .before( $preftoc );
+               $preftoc = $( '#preftoc' );
+               $preferences = $( '#preferences' );
+
                $fieldsets = $preferences.children( 'fieldset' )
-                       .hide()
                        .attr( {
                                role: 'tabpanel',
-                               'aria-hidden': 'true',
                                'aria-labelledby': labelFunc
-                       } )
-                       .addClass( 'prefsection' );
-               $legends = $fieldsets
-                       .children( 'legend' )
-                       .addClass( 'mainLegend' );
+                       } );
+               $fieldsets.not( '#mw-prefsection-personal' )
+                               .hide()
+                               .attr( 'aria-hidden', 'true' );
+
+               // T115692: The following is kept for backwards compatibility with older skins
+               $preferences.addClass( 'jsprefs' );
+               $fieldsets.addClass( 'prefsection' );
+               $fieldsets.children( 'legend' ).addClass( 'mainLegend' );
 
                // Make sure the accessibility tip is selectable so that screen reader users take notice,
                // but hide it per default to reduce interface clutter. Also make sure it becomes visible
                        }
                }
 
-               // Populate the prefToc
-               $legends.each( function ( i, legend ) {
-                       var $legend = $( legend ),
-                               ident, $li, $a;
-                       if ( i === 0 ) {
-                               $legend.parent().show();
-                       }
-                       ident = $legend.parent().attr( 'id' );
-
-                       $li = $( '<li>' )
-                               .attr( 'role', 'presentation' )
-                               .addClass( i === 0 ? 'selected' : '' );
-                       $a = $( '<a>' )
-                               .attr( {
-                                       id: ident.replace( 'mw-prefsection', 'preftab' ),
-                                       href: '#' + ident,
-                                       role: 'tab',
-                                       tabIndex: i === 0 ? 0 : -1,
-                                       'aria-selected': i === 0 ? 'true' : 'false',
-                                       'aria-controls': ident
-                               } )
-                               .text( $legend.text() );
-                       $li.append( $a );
-                       $preftoc.append( $li );
-               } );
-
-               // Disable the button to save preferences unless preferences have changed
-               $( '#prefcontrol' ).prop( 'disabled', true );
-               $( '.prefsection' ).one( 'change keydown mousedown', function () {
-                       $( '#prefcontrol' ).prop( 'disabled', false );
-               } );
-
                // Enable keyboard users to use left and right keys to switch tabs
                $preftoc.on( 'keydown', function ( event ) {
                        var keyLeft = 37,
                        } );
                }
 
-               // To disable all 'namespace' checkboxes in Search preferences
-               // when 'Search in all namespaces' checkbox is ticked.
-               $checkBoxes = $( '#mw-htmlform-advancedsearchoptions input[id^=mw-input-wpsearchnamespaces]' );
-               if ( $( '#mw-input-wpsearcheverything' ).prop( 'checked' ) ) {
-                       $checkBoxes.prop( 'disabled', true );
-               }
-               $( '#mw-input-wpsearcheverything' ).change( function () {
-                       $checkBoxes.prop( 'disabled', $( this ).prop( 'checked' ) );
-               } );
-
                // Set up a message to notify users if they try to leave the page without
                // saving.
                $( '#mw-prefs-form' ).data( 'origdata', $( '#mw-prefs-form' ).serialize() );
diff --git a/resources/src/mediawiki.special/mediawiki.special.preferences.styles.css b/resources/src/mediawiki.special/mediawiki.special.preferences.styles.css
new file mode 100644 (file)
index 0000000..4a797a6
--- /dev/null
@@ -0,0 +1,53 @@
+/* Reuses colors from mediawiki.legacy/shared.css */
+.mw-email-not-authenticated .mw-input,
+.mw-email-none .mw-input{
+       border: 1px solid #fde29b;
+       background-color: #fdf1d1;
+       color: #000000;
+}
+/* Authenticated email field has its own class too. Unstyled by default */
+/*
+.mw-email-authenticated .mw-input { }
+*/
+/* This breaks due to nolabel styling */
+#preferences > fieldset td.mw-label {
+       width: 20%;
+}
+
+#preferences > fieldset table {
+       width: 100%;
+}
+#preferences > fieldset table.mw-htmlform-matrix {
+       width: auto;
+}
+
+/* The CSS below is also for JS enabled version, because we want to prevent FOUC */
+
+/*
+ * Hide, but keep accessible for screen-readers.
+ * Like .mw-jump, #jump-to-nav from shared.css
+ */
+.client-js .mw-navigation-hint {
+       overflow: hidden;
+       height: 0;
+       zoom: 1;
+}
+
+/* When JS is enabled, .mw-preferences-messageboxes are replaced with mw.notifications */
+.client-js .mw-preferences-messagebox {
+       display: none;
+}
+
+.client-nojs #preftoc {
+       display: none;
+}
+
+.client-js #preferences > fieldset {
+       display: none;
+}
+
+/* Only the 1st tab is shown by default in JS mode */
+.client-js #preferences #mw-prefsection-personal {
+       display: block;
+}
+
old mode 100644 (file)
new mode 100755 (executable)
index b869314..1ce9569
        display: inline !ie;
 }
 .searchresults {
+       margin: 1em 0 1em .4em;
 }
-.searchresults p {
-       margin-left: 0.4em;
-       margin-top: 1em;
-       margin-bottom: 1.2em;
+/* needs extra specificity to override `.mw-body p` selector */
+.mw-body p.mw-search-nonefound {
+       margin: 0;
+}
+.mw-search-interwiki-header {
+       font-weight: bold;
+}
+.mw-search-nonefound + .mw-search-interwiki-header {
+       margin-top: 0;
 }
 div.searchresult {
        font-size: 95%;
        width: 38em;
 }
 .mw-search-results {
-       margin-left: 0.4em;
+       margin-left: 0;
        float: left;
 }
 .mw-search-results li {
@@ -51,9 +57,9 @@ div.searchresult {
        padding-left: 0.25em;
 }
 .mw-search-profile-tabs div.search-types ul {
-       margin: 0 !important;
-       padding: 0 !important;
-       list-style: none !important;
+       margin: 0;
+       padding: 0;
+       list-style: none;
 }
 .mw-search-profile-tabs div.search-types ul li {
        float: left;
@@ -81,11 +87,11 @@ div.searchresult {
 
 fieldset#mw-searchoptions {
        margin: 0;
-       padding: 0.5em 0.75em 0.75em 0.75em !important;
+       padding: 0.5em 0.75em 0.75em 0.75em;
        border: none;
        background-color: #f9f9f9;
-       border: 1px solid silver !important;
-       border-top-width: 0 !important;
+       border: 1px solid silver;
+       border-top-width: 0;
 }
 fieldset#mw-searchoptions legend {
        display: none;
index 9fcec02..8c89ed9 100644 (file)
@@ -85,7 +85,9 @@
                },
 
                setWarning: function ( warning ) {
-                       $( '#wpDestFile-warning' ).html( warning );
+                       var $warning = $( $.parseHTML( warning ) );
+                       mw.hook( 'wikipage.content' ).fire( $warning );
+                       $( '#wpDestFile-warning' ).empty().append( $warning );
 
                        // Set a value in the form indicating that the warning is acknowledged and
                        // doesn't need to be redisplayed post-upload
index 30f000b..831ba8c 100644 (file)
@@ -38,7 +38,7 @@ section.mw-form-header {
        margin-top: 6px;
 }
 
-.mw-createacct-captcha-container {
+.fancycaptcha-captcha-container {
        background-color: #f8f8f8;
        border: 1px solid #c9c9c9;
        padding: 10px;
@@ -52,7 +52,7 @@ section.mw-form-header {
 }
 
 /* Put a border around the fancycaptcha-image-container. */
-.mw-createacct-captcha-and-reload {
+.fancycaptcha-captcha-and-reload {
        border: 1px solid #c9c9c9;
        /* Other display formats end up too wide */
        display: table-cell;
diff --git a/resources/src/mediawiki.special/mediawiki.special.watchlist.js b/resources/src/mediawiki.special/mediawiki.special.watchlist.js
new file mode 100644 (file)
index 0000000..a35f4d1
--- /dev/null
@@ -0,0 +1,15 @@
+/*!
+ * JavaScript for Special:Watchlist
+ *
+ * This script is only loaded, if the user opt-in a setting in Special:Preferences,
+ * that the watchlist should be automatically reloaded, when a filter option is
+ * changed in the header form.
+ */
+jQuery( function ( $ ) {
+       // add a listener on all form elements in the header form
+       $( '#mw-watchlist-form input, #mw-watchlist-form select' ).on( 'change', function () {
+               // submit the form, when one of the input fields was changed
+               $( '#mw-watchlist-form' ).submit();
+       } );
+
+} );
index 77b3f9d..600b771 100644 (file)
@@ -12,9 +12,6 @@
 //
 // Styleguide 2.
 
-@transitionDuration: .1s;
-@transitionFunction: ease-in-out;
-
 // Neutral button styling
 //
 // These are the main actions on the page/workflow. The page should have only one of progressive, constructive and desctructive buttons, the rest being quiet.
@@ -66,8 +63,6 @@
                cursor: default;
        }
 
-       .transition(background @transitionDuration @transitionFunction, color @transitionDuration @transitionFunction, box-shadow @transitionDuration @transitionFunction;);
-
        // Styling for specific button types
        // -----------------------------------------
 
@@ -243,6 +238,12 @@ a.mw-ui-button {
        &:focus {
                text-decoration: none;
        }
+
+       // a-tags behave different to inputs if the line-height attribute is inherited
+       // from another element (e.g. mw-body-content). They appear bigger as input
+       // tags. See Bug T116427. To fix that, apply the correct line-height (used
+       // for inputs) to a-tags, too.
+       line-height: normal;
 }
 
 // Button groups
index ac5becb..bd5dd4a 100644 (file)
@@ -72,7 +72,6 @@
 
                // the pseudo before element of the label after the checkbox now looks like a checkbox
                & + label::before {
-                       .transition( 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) );
                        content: '';
                        cursor: pointer;
                        .box-sizing(border-box);
index 2f76131..62f0e83 100644 (file)
@@ -39,7 +39,6 @@
        font-family: inherit;
        font-size: inherit;
        line-height: inherit;
-       .transition(~"border 0.2s cubic-bezier(0.39, 0.575, 0.565, 1), box-shadow 0.2s cubic-bezier(0.39, 0.575, 0.565, 1)");
 
        // Placeholder text styling must be set individually for each browser @winter
        &::-webkit-input-placeholder { // webkit
index 1928699..52effd6 100644 (file)
@@ -63,7 +63,6 @@
 
                // the pseudo before element of the label after the radio now looks like a radio
                & + label::before {
-                       .transition( 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) );
                        content: '';
                        cursor: pointer;
                        .box-sizing(border-box);
index d5e5b96..7a7b9cd 100644 (file)
         * internally and for dates accepted by #setDate and returned by #getDate.
         *
         * @private
-        * @returns {string} Format
+        * @return {string} Format
         */
        mw.widgets.CalendarWidget.prototype.getDateFormat = function () {
                return {
         * Get the date precision this calendar uses, 'day' or 'month'.
         *
         * @private
-        * @returns {string} Precision, 'day' or 'month'
+        * @return {string} Precision, 'day' or 'month'
         */
        mw.widgets.CalendarWidget.prototype.getPrecision = function () {
                return this.precision;
         * Get list of possible display layers.
         *
         * @private
-        * @returns {string[]} Layers
+        * @return {string[]} Layers
         */
        mw.widgets.CalendarWidget.prototype.getDisplayLayers = function () {
                return [ 'month', 'year', 'duodecade' ].slice( this.precision === 'month' ? 1 : 0 );
         * Get current date, in the format 'YYYY-MM-DD' or 'YYYY-MM', depending on precision. Digits will
         * not be localised.
         *
-        * @returns {string|null} Date string
+        * @return {string|null} Date string
         */
        mw.widgets.CalendarWidget.prototype.getDate = function () {
                return this.date;
index 24b0e72..6db7c12 100644 (file)
                        title = new ForeignTitle( this.title.getPrefixedText() ), // HACK
                        prefix = this.apiUrl.replace( '/w/api.php', '' ); // HACK
 
+               this.missing = missing;
+
                if ( !missing ) {
                        this.$link
                                .attr( 'href', prefix + title.getUrl() )
+                               .attr( 'title', title.getPrefixedText() )
                                .removeClass( 'new' );
                } else {
                        this.$link
                                .attr( 'href', prefix + title.getUrl( { action: 'edit', redlink: 1 } ) )
+                               .attr( 'title', mw.msg( 'red-link-title', title.getPrefixedText() ) )
                                .addClass( 'new' );
                }
        };
index 0c6c15e..ddae9b1 100644 (file)
 
        OO.inheritClass( mw.widgets.ComplexTitleInputWidget, OO.ui.Widget );
 
+       /* Static Methods */
+       /*jshint -W024*/
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+               config = mw.widgets.ComplexTitleInputWidget.parent.static.reusePreInfuseDOM( node, config );
+               config.namespace = mw.widgets.NamespaceInputWidget.static.reusePreInfuseDOM(
+                       $( node ).find( '.mw-widget-namespaceInputWidget' ),
+                       config.namespace
+               );
+               config.title = mw.widgets.TitleInputWidget.static.reusePreInfuseDOM(
+                       $( node ).find( '.mw-widget-titleInputWidget' ),
+                       config.title
+               );
+               return config;
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+               var state = mw.widgets.ComplexTitleInputWidget.parent.static.gatherPreInfuseState( node, config );
+               state.namespace = mw.widgets.NamespaceInputWidget.static.gatherPreInfuseState(
+                       $( node ).find( '.mw-widget-namespaceInputWidget' ),
+                       config.namespace
+               );
+               state.title = mw.widgets.TitleInputWidget.static.gatherPreInfuseState(
+                       $( node ).find( '.mw-widget-titleInputWidget' ),
+                       config.title
+               );
+               return state;
+       };
+
+       /*jshint +W024*/
+
        /* Methods */
 
        /**
                this.title.setNamespace( Number( this.namespace.getValue() ) );
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.ComplexTitleInputWidget.prototype.restorePreInfuseState = function ( state ) {
+               mw.widgets.ComplexTitleInputWidget.parent.prototype.restorePreInfuseState.call( this, state );
+               this.namespace.restorePreInfuseState( state.namespace );
+               this.title.restorePreInfuseState( state.title );
+       };
+
 }( jQuery, mediaWiki ) );
index b1e5151..1ffcc66 100644 (file)
         * @private
         * @param {string} date Date string, to be valid, must be in 'YYYY-MM-DD' or 'YYYY-MM' format or
         *     (unless the field is required) empty
-        * @returns {boolean}
+        * @return {boolean}
         */
        mw.widgets.DateInputWidget.prototype.validateDate = function ( date ) {
                var isValid;
        /**
         * @private
         * @param {string} date Date string, to be valid, must be in 'YYYY-MM-DD' or 'YYYY-MM' format
-        * @returns {boolean}
+        * @return {boolean}
         */
        mw.widgets.DateInputWidget.prototype.isValidDate = function ( date ) {
                // "Half-strict mode": for example, for the format 'YYYY-MM-DD', 2015-1-3 instead of 2015-01-03
         * @private
         * @param {string} date Date string, to be valid, must be empty (no date selected) or in
         *     'YYYY-MM-DD' or 'YYYY-MM' format to be valid
-        * @returns {boolean}
+        * @return {boolean}
         */
        mw.widgets.DateInputWidget.prototype.isInRange = function ( date ) {
                var momentDate = moment( date, 'YYYY-MM-DD' ),
index 0e2546f..96f9549 100644 (file)
@@ -11,6 +11,7 @@
         *
         * @class
         * @extends OO.ui.SearchWidget
+        * @mixins OO.ui.mixin.RequestManager
         * @mixins mw.widgets.TitleWidget
         *
         * @constructor
@@ -23,6 +24,7 @@
 
                // Mixin constructors
                mw.widgets.TitleWidget.call( this, config );
+               OO.ui.mixin.RequestManager.call( this, config );
 
                this.query.setValidation( this.isQueryValid.bind( this ) );
 
@@ -46,6 +48,7 @@
        /* Setup */
 
        OO.inheritClass( mw.widgets.TitleSearchWidget, OO.ui.SearchWidget );
+       OO.mixinClass( mw.widgets.TitleSearchWidget, OO.ui.mixin.RequestManager );
        OO.mixinClass( mw.widgets.TitleSearchWidget, mw.widgets.TitleWidget );
 
        /* Methods */
        mw.widgets.TitleSearchWidget.prototype.onQueryChange = function () {
                var widget = this;
 
-               this.getSuggestionsPromise().done( function ( response ) {
+               this.getRequestData().done( function ( data ) {
                        // Parent method
                        mw.widgets.TitleSearchWidget.parent.prototype.onQueryChange.call( widget );
-
-                       widget.results.addItems( widget.getOptionsFromData( response.query || {} ) );
+                       widget.results.addItems( widget.getOptionsFromData( data ) );
                } );
        };
 
+       /**
+        * @inheritdoc OO.ui.mixin.RequestManager
+        */
+       mw.widgets.TitleSearchWidget.prototype.getRequestQuery = function () {
+               return this.getQueryValue();
+       };
+       /**
+        * @inheritdoc OO.ui.mixin.RequestManager
+        */
+       mw.widgets.TitleSearchWidget.prototype.getRequest = function () {
+               return this.getSuggestionsPromise();
+       };
+       /**
+        * @inheritdoc OO.ui.mixin.RequestManager
+        */
+       mw.widgets.TitleSearchWidget.prototype.getRequestCacheDataFromResponse = function ( response ) {
+               return response.query || {};
+       };
+
 }( jQuery, mediaWiki ) );
index 0ef5095..abe1228 100644 (file)
         * @cfg {number} [limit=10] Number of results to show
         * @cfg {number} [namespace] Namespace to prepend to queries
         * @cfg {number} [maxLength=255] Maximum query length
-        * @cfg {boolean} [relative=true] If a namespace is set, return a title relative to it
+        * @cfg {boolean} [relative=true] If a namespace is set, display titles relative to it
         * @cfg {boolean} [suggestions=true] Display search suggestions
         * @cfg {boolean} [showRedirectTargets=true] Show the targets of redirects
         * @cfg {boolean} [showRedlink] Show red link to exact match if it doesn't exist
         * @cfg {boolean} [showImages] Show page images
         * @cfg {boolean} [showDescriptions] Show page descriptions
+        * @cfg {boolean} [validateTitle=true] Whether the input must be a valid title
         * @cfg {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument
         */
        mw.widgets.TitleWidget = function MwWidgetsTitleWidget( config ) {
@@ -44,6 +45,7 @@
                this.showRedlink = !!config.showRedlink;
                this.showImages = !!config.showImages;
                this.showDescriptions = !!config.showDescriptions;
+               this.validateTitle = config.validateTitle !== undefined ? config.validateTitle : true;
                this.cache = config.cache;
 
                // Initialization
         * Get option widgets from the server response
         *
         * @param {Object} data Query result
-        * @returns {OO.ui.OptionWidget[]} Menu items
+        * @return {OO.ui.OptionWidget[]} Menu items
         */
        mw.widgets.TitleWidget.prototype.getOptionsFromData = function ( data ) {
                var i, len, index, pageExists, pageExistsExact, suggestionPage, page, redirect, redirects,
                                redirect: suggestionPage.redirect !== undefined,
                                disambiguation: OO.getProp( suggestionPage, 'pageprops', 'disambiguation' ) !== undefined,
                                imageUrl: OO.getProp( suggestionPage, 'thumbnail', 'source' ),
-                               description: OO.getProp( suggestionPage, 'terms', 'description' )
+                               description: OO.getProp( suggestionPage, 'terms', 'description' ),
+                               // sort index
+                               index: suggestionPage.index
                        };
 
                        // Throw away pages from wrong namespaces. This can happen when 'showRedirectTargets' is true
                        }
                }
 
+               titles.sort( function ( a, b ) {
+                       return pageData[ a ].index - pageData[ b ].index;
+               } );
+
                // If not found, run value through mw.Title to avoid treating a match as a
                // mismatch where normalisation would make them matching (bug 48476)
 
         * Get title object corresponding to given value, or #getQueryValue if not given.
         *
         * @param {string} [value] Value to get a title for
-        * @returns {mw.Title|null} Title object, or null if value is invalid
+        * @return {mw.Title|null} Title object, or null if value is invalid
         */
        mw.widgets.TitleWidget.prototype.getTitle = function ( value ) {
                var title = value !== undefined ? value : this.getQueryValue(),
         * @return {boolean} The query is valid
         */
        mw.widgets.TitleWidget.prototype.isQueryValid = function () {
-               return !!this.getTitle();
+               return this.validateTitle ? !!this.getTitle() : true;
        };
 
 }( jQuery, mediaWiki ) );
index 2eb8c55..86d4cfe 100644 (file)
@@ -22,7 +22,7 @@
                        min-height: 3.75em;
                        padding-left: 4.75em;
 
-                       &:not(:last-child) {
+                       &:not( :last-child ) {
                                margin-bottom: 2px;
                        }
 
                        }
 
                        &.oo-ui-iconElement {
-                               >.oo-ui-iconElement-icon {
+                               > .oo-ui-iconElement-icon {
                                        display: block;
                                        width: 3.75em;
                                        height: 3.75em;
                                        left: 0;
-                                       background-color: #ccc;
-                                       opacity: 0.4;
-                               }
-
-                               > .mw-widget-titleOptionWidget-hasImage {
-                                       border: 0;
-                                       background-size: cover;
-                                       opacity: 0.7;
+                                       &:not( .mw-widget-titleOptionWidget-hasImage ) {
+                                               background-color: #ccc;
+                                               opacity: 0.4;
+                                       }
+                                       &.mw-widget-titleOptionWidget-hasImage {
+                                               border: 0;
+                                               background-size: cover;
+                                               opacity: 0.7;
+                                       }
                                }
                        }
-               }
 
-               &.oo-ui-optionWidget-highlighted, &.oo-ui-optionWidget-selected {
-                       &.oo-ui-iconElement > .mw-widget-titleOptionWidget-hasImage {
-                               opacity: 1;
+                       &.oo-ui-optionWidget-highlighted, &.oo-ui-optionWidget-selected {
+                               &.oo-ui-iconElement > .mw-widget-titleOptionWidget-hasImage {
+                                       opacity: 1;
+                               }
                        }
                }
        }
index 0d0fb73..164fd20 100644 (file)
@@ -99,7 +99,7 @@
         * Get list of menu items from a server response.
         *
         * @param {Object} data Query result
-        * @returns {OO.ui.MenuOptionWidget[]} Menu items
+        * @return {OO.ui.MenuOptionWidget[]} Menu items
         */
        mw.widgets.UserInputWidget.prototype.getLookupMenuOptionsFromData = function ( data ) {
                var len, i, user,
index 5f82b18..10e0c56 100644 (file)
                // Keyed by ajax url and symbolic name for the individual request
                promises = {};
 
+       function mapLegacyToken( action ) {
+               // Legacy types for backward-compatibility with API action=tokens.
+               var csrfActions = [
+                       'edit',
+                       'delete',
+                       'protect',
+                       'move',
+                       'block',
+                       'unblock',
+                       'email',
+                       'import',
+                       'options'
+               ];
+               return $.inArray( action, csrfActions ) !== -1 ? 'csrf' : action;
+       }
+
        // Pre-populate with fake ajax promises to save http requests for tokens
        // we already have on the page via the user.tokens module (bug 34733).
        promises[ defaultOptions.ajax.url ] = {};
                /**
                 * Get a token for a certain action from the API.
                 *
-                * The assert parameter is only for internal use by postWithToken.
+                * The assert parameter is only for internal use by #postWithToken.
                 *
-                * @param {string} type Token type
-                * @return {jQuery.Promise}
-                * @return {Function} return.done
-                * @return {string} return.done.token Received token.
                 * @since 1.22
+                * @param {string} type Token type
+                * @return {jQuery.Promise} Received token.
                 */
                getToken: function ( type, assert ) {
-                       var apiPromise,
-                               promiseGroup = promises[ this.defaults.ajax.url ],
-                               d = promiseGroup && promiseGroup[ type + 'Token' ];
+                       var apiPromise, promiseGroup, d;
+                       type = mapLegacyToken( type );
+                       promiseGroup = promises[ this.defaults.ajax.url ];
+                       d = promiseGroup && promiseGroup[ type + 'Token' ];
 
                        if ( !d ) {
-                               apiPromise = this.get( { action: 'tokens', type: type, assert: assert } );
-
+                               apiPromise = this.get( {
+                                       action: 'query',
+                                       meta: 'tokens',
+                                       type: type,
+                                       assert: assert
+                               } );
                                d = apiPromise
-                                       .then( function ( data ) {
-                                               if ( data.tokens && data.tokens[ type + 'token' ] ) {
-                                                       return data.tokens[ type + 'token' ];
+                                       .then( function ( res ) {
+                                               // If token type is unknown, it is omitted from the response
+                                               if ( !res.query.tokens[ type + 'token' ] ) {
+                                                       return $.Deferred().reject( 'token-missing', res );
                                                }
 
-                                               // If token type is not available for this user,
-                                               // key '...token' is either missing or set to boolean false
-                                               return $.Deferred().reject( 'token-missing', data );
+                                               return res.query.tokens[ type + 'token' ];
                                        }, function () {
                                                // Clear promise. Do not cache errors.
                                                delete promiseGroup[ type + 'Token' ];
+
                                                // Pass on to allow the caller to handle the error
                                                return this;
                                        } )
                 */
                badToken: function ( type ) {
                        var promiseGroup = promises[ this.defaults.ajax.url ];
+
+                       type = mapLegacyToken( type );
                        if ( promiseGroup ) {
                                delete promiseGroup[ type + 'Token' ];
                        }
diff --git a/resources/src/mediawiki/api/messages.js b/resources/src/mediawiki/api/messages.js
new file mode 100644 (file)
index 0000000..df21eb2
--- /dev/null
@@ -0,0 +1,55 @@
+/**
+ * Allows to retrieve a specific or a set of
+ * messages to be added to mw.messages and returned
+ * by the Api.
+ *
+ * @class mw.Api.plugin.messages
+ * @since 1.27
+ */
+( function ( mw, $ ) {
+       'use strict';
+
+       $.extend( mw.Api.prototype, {
+               /**
+                * Get a set of messages.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @return {jQuery.Promise}
+                */
+               getMessages: function ( messages ) {
+                       return this.get( {
+                               action: 'query',
+                               meta: 'allmessages',
+                               ammessages: messages,
+                               amlang: mw.config.get( 'wgUserLanguage' ),
+                               formatversion: 2
+                       } ).then( function ( data ) {
+                               var result = {};
+
+                               $.each( data.query.allmessages, function ( i, obj ) {
+                                       if ( !obj.missing ) {
+                                               result[ obj.name ] = obj.content;
+                                       }
+                               } );
+
+                               return result;
+                       } );
+               },
+
+               /**
+                * Loads a set of mesages and add them to mw.messages.
+                *
+                * @param {Array} messages Messages to retrieve
+                * @return {jQuery.Promise}
+                */
+               loadMessages: function ( messages ) {
+                       return this.getMessages( messages ).then( $.proxy( mw.messages, 'set' ) );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.messages
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/api/user.js b/resources/src/mediawiki/api/user.js
new file mode 100644 (file)
index 0000000..e7b4b6d
--- /dev/null
@@ -0,0 +1,37 @@
+/**
+ * @class mw.Api.plugin.user
+ * @since 1.27
+ */
+( function ( mw, $ ) {
+
+       $.extend( mw.Api.prototype, {
+
+               /**
+                * Get the current user's groups and rights.
+                *
+                * @return {jQuery.Promise}
+                * @return {Function} return.done
+                * @return {Object} return.done.userInfo
+                * @return {string[]} return.done.userInfo.groups User groups that the current user belongs to
+                * @return {string[]} return.done.userInfo.rights Current user's rights
+                */
+               getUserInfo: function () {
+                       return this.get( {
+                               action: 'query',
+                               meta: 'userinfo',
+                               uiprop: [ 'groups', 'rights' ]
+                       } ).then( function ( data ) {
+                               if ( data.query && data.query.userinfo ) {
+                                       return data.query.userinfo;
+                               }
+                               return $.Deferred().reject().promise();
+                       } );
+               }
+       } );
+
+       /**
+        * @class mw.Api
+        * @mixins mw.Api.plugin.user
+        */
+
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/bookletlayout/option2/ccbysa.png b/resources/src/mediawiki/bookletlayout/option2/ccbysa.png
new file mode 100644 (file)
index 0000000..b39ecb6
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option2/ccbysa.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option2/ccbysa.svg b/resources/src/mediawiki/bookletlayout/option2/ccbysa.svg
new file mode 100644 (file)
index 0000000..13eb85f
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
+       .st1{fill-rule:evenodd;clip-rule:evenodd;}\r
+</style>\r
+<g>\r
+       <circle class="st0" cx="74.9" cy="75.1" r="58.1"/>\r
+       <g>\r
+               <path class="st1" d="M74.1,63.4c-4-7.3-10.8-10.2-18.7-10.2c-11.5,0-20.6,8.1-20.6,21.9c0,14,8.6,21.9,21,21.9\r
+                       c8,0,14.8-4.4,18.5-11l-8.8-4.5c-2,4.7-4.9,6.1-8.7,6.1c-6.5,0-9.5-5.4-9.5-12.5c0-7.1,2.5-12.5,9.5-12.5c1.9,0,5.6,1,7.8,5.7\r
+                       L74.1,63.4z"/>\r
+               <path class="st1" d="M114.8,63.4c-4-7.3-10.8-10.2-18.7-10.2c-11.5,0-20.6,8.1-20.6,21.9c0,14,8.6,21.9,21,21.9\r
+                       c8,0,14.8-4.4,18.5-11l-8.8-4.5c-2,4.7-4.9,6.1-8.7,6.1c-6.5,0-9.5-5.4-9.5-12.5c0-7.1,2.5-12.5,9.5-12.5c1.9,0,5.6,1,7.8,5.7\r
+                       L114.8,63.4z"/>\r
+       </g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option2/noderiv.png b/resources/src/mediawiki/bookletlayout/option2/noderiv.png
new file mode 100644 (file)
index 0000000..afac81f
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option2/noderiv.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option2/noderiv.svg b/resources/src/mediawiki/bookletlayout/option2/noderiv.svg
new file mode 100644 (file)
index 0000000..c3ee55b
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
+       .st1{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
+       .st2{stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
+</style>\r
+<g>\r
+       \r
+               <rect x="7.8" y="34.6" transform="matrix(0.2182 0.9759 -0.9759 0.2182 113.5065 3.8061)" class="st0" width="93.2" height="76.2"/>\r
+       <circle class="st1" cx="54.4" cy="72.7" r="26.1"/>\r
+</g>\r
+<g>\r
+       \r
+               <rect x="51.6" y="41.7" transform="matrix(-0.1524 0.9883 -0.9883 -0.1524 192.0548 -5.1264)" class="st0" width="93.2" height="76.2"/>\r
+       <circle class="st2" cx="98.2" cy="79.8" r="26.1"/>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option2/ownwork.png b/resources/src/mediawiki/bookletlayout/option2/ownwork.png
new file mode 100644 (file)
index 0000000..69df378
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option2/ownwork.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option2/ownwork.svg b/resources/src/mediawiki/bookletlayout/option2/ownwork.svg
new file mode 100644 (file)
index 0000000..639775f
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:none;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
+       .st1{stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
+</style>\r
+<polygon class="st0" points="6.3,43.3 38.4,43.3 46,34.4 78.4,34.4 85.5,42.6 142.6,42.6 142.6,115 6.3,115 "/>\r
+<g>\r
+       <circle class="st0" cx="63.3" cy="78.8" r="25.8"/>\r
+       <circle class="st1" cx="63.3" cy="78.8" r="16.2"/>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option2/useful.png b/resources/src/mediawiki/bookletlayout/option2/useful.png
new file mode 100644 (file)
index 0000000..d5b9429
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option2/useful.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option2/useful.svg b/resources/src/mediawiki/bookletlayout/option2/useful.svg
new file mode 100644 (file)
index 0000000..baa982b
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 150 150" style="enable-background:new 0 0 150 150;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-miterlimit:10;}\r
+</style>\r
+<circle class="st0" cx="72.7" cy="62.5" r="47.1"/>\r
+<path d="M76,128.8c34.8,0,63.2-28.3,63.2-63.2c0-18.3-7.9-34.9-20.4-46.4l11.8-11.8L129.1,6l-11.8,11.8c0,0,0,0,0,0l-1.4,1.4\r
+       c13,11.2,21.3,27.8,21.3,46.4c0,33.7-27.4,61.2-61.2,61.2c-18.5,0-35.1-8.3-46.4-21.3l-0.4,0.4l0,0l-13,13l1.4,1.4l11.9-11.9\r
+       c10.9,11.9,26.4,19.6,43.6,20.4v15.7H49.7v2h48.9v-2H75.1v-15.7C75.4,128.8,75.7,128.8,76,128.8z"/>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option4/camera.png b/resources/src/mediawiki/bookletlayout/option4/camera.png
new file mode 100644 (file)
index 0000000..a48f9fb
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option4/camera.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/camera.svg b/resources/src/mediawiki/bookletlayout/option4/camera.svg
new file mode 100644 (file)
index 0000000..dc43b5d
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 264 162" height="162" width="264" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:#00AF89;}\r
+       .st1{fill:#FFFFFF;}\r
+       .st2{fill:#FFFFFF;stroke:#E5E5E5;stroke-miterlimit:10;}\r
+       .st3{fill:#E5E5E5;}\r
+       .st4{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
+       .st5{fill:#9B9A9A;}\r
+       .st6{fill:none;stroke:#E5E5E5;stroke-linejoin:round;stroke-miterlimit:10;}\r
+</style>\r
+<rect x="62.3" y="28.1" class="st0" width="137.6" height="105"/>\r
+<g>\r
+       <path class="st1" d="M73.1,57v64.4h45.3V78.5h25.3v42.9h45.3V57H73.1z M94.3,107.6H80.9V94.3h13.3V107.6z M94.3,91.9H80.9V78.5\r
+               h13.3V91.9z M109.9,107.6H96.6V94.3h13.3V107.6z M109.9,91.9H96.6V78.5h13.3V91.9z M164.3,107.6h-13.3V94.3h13.3V107.6z\r
+                M164.3,91.9h-13.3V78.5h13.3V91.9z M179.9,107.6h-13.3V94.3h13.3V107.6z M179.9,91.9h-13.3V78.5h13.3V91.9z"/>\r
+       <rect x="73.1" y="48.5" class="st1" width="116" height="5.7"/>\r
+       <rect x="73.1" y="39.9" class="st1" width="116" height="5.7"/>\r
+</g>\r
+<rect x="62.3" y="124" class="st1" width="137.6" height="1.7"/>\r
+<g>\r
+       <g>\r
+               <rect x="6.7" y="7.4" class="st2" width="35.3" height="12.7"/>\r
+               <rect x="42" y="11.1" class="st3" width="2.3" height="5.7"/>\r
+       </g>\r
+       <rect x="8.2" y="9.1" class="st3" width="5.2" height="9.2"/>\r
+       <rect x="14.5" y="9.1" class="st3" width="5.2" height="9.2"/>\r
+       <rect x="21" y="9.1" class="st3" width="5.2" height="9.2"/>\r
+</g>\r
+<circle class="st3" cx="252.7" cy="12.1" r="6.2"/>\r
+<rect x="239.3" y="9.1" class="st3" width="5.3" height="7.7"/>\r
+<rect x="233" y="9.1" class="st3" width="5.3" height="7.7"/>\r
+<rect x="214" y="143.3" class="st3" width="5.3" height="7.7"/>\r
+<rect x="207.6" y="143.3" class="st3" width="5.3" height="7.7"/>\r
+<rect x="50.4" y="143.3" class="st3" width="5.3" height="7.7"/>\r
+<rect x="39" y="143.3" class="st3" width="5.3" height="7.7"/>\r
+<line class="st4" x1="73.1" y1="148" x2="189.1" y2="148"/>\r
+<line class="st4" x1="132" y1="143.1" x2="132" y2="152.9"/>\r
+<line class="st4" x1="189.1" y1="144.3" x2="189.1" y2="151.7"/>\r
+<line class="st4" x1="73.1" y1="144.3" x2="73.1" y2="151.7"/>\r
+<line class="st4" x1="86" y1="145.5" x2="86" y2="150.5"/>\r
+<line class="st4" x1="100.7" y1="145.5" x2="100.7" y2="150.5"/>\r
+<line class="st4" x1="115.3" y1="145.5" x2="115.3" y2="150.5"/>\r
+<line class="st4" x1="145.8" y1="145.5" x2="145.8" y2="150.5"/>\r
+<line class="st4" x1="160.5" y1="145.5" x2="160.5" y2="150.5"/>\r
+<line class="st4" x1="175.2" y1="145.5" x2="175.2" y2="150.5"/>\r
+<g>\r
+       <rect x="113.8" y="154.1" class="st5" width="3.2" height="4.7"/>\r
+       <polygon class="st5" points="113.8,154.1 115.3,152.3 116.9,154.1        "/>\r
+</g>\r
+<g>\r
+       <g>\r
+               <polyline class="st6" points="34.3,147.1 31.5,147.1 34.3,144.3 31.5,147.1 34.3,147.1 31.5,149.9                 "/>\r
+       </g>\r
+       <polygon class="st3" points="33.9,149.5 32.1,151.7 30.3,149.5   "/>\r
+</g>\r
+<line class="st6" x1="48.9" y1="143.2" x2="45.9" y2="151.1"/>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option4/graphics.png b/resources/src/mediawiki/bookletlayout/option4/graphics.png
new file mode 100644 (file)
index 0000000..5613f88
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option4/graphics.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/graphics.svg b/resources/src/mediawiki/bookletlayout/option4/graphics.svg
new file mode 100644 (file)
index 0000000..ff3d682
--- /dev/null
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
+       .st1{fill:none;stroke:#9B9A9A;stroke-miterlimit:10;}\r
+       .st2{fill:#E5E5E5;}\r
+       .st3{fill:#9B9A9A;}\r
+       .st4{fill:#00AF89;}\r
+       .st5{fill:#FFFFFF;}\r
+       .st6{fill:none;stroke:#FFFFFF;stroke-width:5;stroke-miterlimit:10;}\r
+</style>\r
+<line class="st0" x1="2" y1="10.5" x2="262" y2="10.5"/>\r
+<line class="st0" x1="2" y1="24.8" x2="262" y2="24.8"/>\r
+<g>\r
+       <rect x="6.9" y="32.8" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="32.8" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="42.1" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="42.1" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="51.4" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="51.4" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="60.8" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="60.8" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="70.1" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="70.1" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="79.4" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="79.4" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="88.8" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="88.8" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="98.1" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="98.1" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="107.4" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="107.4" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="6.9" y="116.8" class="st1" width="9.3" height="9.3"/>\r
+       <rect x="16.2" y="116.8" class="st1" width="9.3" height="9.3"/>\r
+</g>\r
+<rect x="3.2" y="12.7" class="st2" width="9.3" height="9.3"/>\r
+<rect x="3.2" y="3.4" class="st2" width="4.7" height="4.7"/>\r
+<rect x="10.2" y="3.4" class="st2" width="4.7" height="4.7"/>\r
+<rect x="16.9" y="3.4" class="st2" width="4.7" height="4.7"/>\r
+<rect x="249.2" y="3.4" class="st2" width="4.7" height="4.7"/>\r
+<rect x="255.9" y="3.4" class="st2" width="4.7" height="4.7"/>\r
+<rect x="14.6" y="12.7" class="st2" width="9.3" height="9.3"/>\r
+<rect x="239.9" y="12.7" class="st2" width="9.3" height="9.3"/>\r
+<rect x="228.9" y="12.7" class="st2" width="9.3" height="9.3"/>\r
+<rect x="251.2" y="12.7" class="st2" width="9.3" height="9.3"/>\r
+<g>\r
+       <path class="st2" d="M73.5,13.7V21H26.6v-7.3H73.5 M74.5,12.7H25.6V22h48.9V12.7L74.5,12.7z"/>\r
+</g>\r
+<g>\r
+       <path class="st2" d="M117.8,13.7V21H76.9v-7.3H117.8 M118.8,12.7H75.9V22h42.9V12.7L118.8,12.7z"/>\r
+</g>\r
+<g>\r
+       <path class="st2" d="M162.5,13.7V21h-40.9v-7.3H162.5 M163.5,12.7h-42.9V22h42.9V12.7L163.5,12.7z"/>\r
+</g>\r
+<rect x="209.7" y="30.3" class="st2" width="50.9" height="32.3"/>\r
+<rect x="209.7" y="30.3" class="st3" width="50.9" height="5.7"/>\r
+<g>\r
+       <rect x="212.2" y="38.5" class="st3" width="6.2" height="6.2"/>\r
+       <rect x="239.9" y="38.5" class="st3" width="6.2" height="2.5"/>\r
+       <rect x="239.9" y="42.2" class="st3" width="6.2" height="2.5"/>\r
+       <g>\r
+               <path class="st3" d="M237.2,39.5v4.2H221v-4.2H237.2 M238.2,38.5H220v6.2h18.2V38.5L238.2,38.5z"/>\r
+       </g>\r
+</g>\r
+<g>\r
+       <rect x="212.2" y="46.5" class="st3" width="6.2" height="6.2"/>\r
+       <rect x="239.9" y="46.5" class="st3" width="6.2" height="2.5"/>\r
+       <rect x="239.9" y="50.2" class="st3" width="6.2" height="2.5"/>\r
+       <g>\r
+               <path class="st3" d="M237.2,47.5v4.2H221v-4.2H237.2 M238.2,46.5H220v6.2h18.2V46.5L238.2,46.5z"/>\r
+       </g>\r
+</g>\r
+<rect x="209.7" y="66.6" class="st2" width="50.9" height="32.3"/>\r
+<rect x="209.7" y="66.6" class="st3" width="50.9" height="5.7"/>\r
+<g>\r
+       <path class="st3" d="M257.2,75.8V80h-44.1v-4.2H257.2 M258.2,74.8h-46.1V81h46.1V74.8L258.2,74.8z"/>\r
+</g>\r
+<g>\r
+       <path class="st3" d="M257.2,81v4.2h-44.1V81H257.2 M258.2,80h-46.1v6.2h46.1V80L258.2,80z"/>\r
+</g>\r
+<g>\r
+       <path class="st3" d="M257.2,86.2v4.2h-44.1v-4.2H257.2 M258.2,85.2h-46.1v6.2h46.1V85.2L258.2,85.2z"/>\r
+</g>\r
+<g>\r
+       <path class="st3" d="M257.2,91.3v4.2h-44.1v-4.2H257.2 M258.2,90.3h-46.1v6.2h46.1V90.3L258.2,90.3z"/>\r
+</g>\r
+<ellipse class="st1" cx="218.3" cy="85.7" rx="0" ry="10.2"/>\r
+<rect x="69.5" y="47.5" class="st4" width="108" height="82.4"/>\r
+<circle class="st5" cx="123.5" cy="88.7" r="6.6"/>\r
+<circle class="st5" cx="116.9" cy="106.2" r="6.6"/>\r
+<circle class="st5" cx="154.5" cy="80.3" r="6.6"/>\r
+<circle class="st5" cx="93.1" cy="81.5" r="6.6"/>\r
+<circle class="st5" cx="141.7" cy="114.1" r="6.6"/>\r
+<circle class="st6" cx="123.5" cy="88.7" r="18.2"/>\r
+<circle class="st6" cx="123.5" cy="88.7" r="31.7"/>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option4/guide.html b/resources/src/mediawiki/bookletlayout/option4/guide.html
new file mode 100644 (file)
index 0000000..c747851
--- /dev/null
@@ -0,0 +1,12 @@
+<div class="mw-foreignStructuredUpload-bookletLayout-guide">
+       <div class="mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good">
+               <span></span>
+       </div>
+       <div class="mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad">
+               <span></span>
+       </div>
+       <div class="mw-foreignStructuredUpload-bookletLayout-guide-image mw-foreignStructuredUpload-bookletLayout-guide-image-camera"></div>
+       <div class="mw-foreignStructuredUpload-bookletLayout-guide-image mw-foreignStructuredUpload-bookletLayout-guide-image-graphics"></div>
+       <div class="mw-foreignStructuredUpload-bookletLayout-guide-image mw-foreignStructuredUpload-bookletLayout-guide-image-website"></div>
+       <div class="mw-foreignStructuredUpload-bookletLayout-guide-image mw-foreignStructuredUpload-bookletLayout-guide-image-search"></div>
+</div>
diff --git a/resources/src/mediawiki/bookletlayout/option4/search-ltr.png b/resources/src/mediawiki/bookletlayout/option4/search-ltr.png
new file mode 100644 (file)
index 0000000..26d6beb
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option4/search-ltr.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/search-ltr.svg b/resources/src/mediawiki/bookletlayout/option4/search-ltr.svg
new file mode 100644 (file)
index 0000000..7bcf826
--- /dev/null
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{display:none;}\r
+       .st1{display:inline;}\r
+       .st2{fill:#FFFFFF;}\r
+       .st3{fill:#E5E5E5;}\r
+       .st4{opacity:0.5;fill:#E5E5E5;enable-background:new    ;}\r
+       .st5{fill:#E5E5E5;stroke:#E5E5E5;}\r
+       .st6{fill:#9B9B9B;}\r
+       .st7{fill:#4470B6;}\r
+       .st8{fill:#D0D1D1;}\r
+       .st9{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
+       .st10{fill:none;stroke:#D02227;stroke-miterlimit:10;}\r
+       .st11{fill:#D02227;}\r
+</style>\r
+<g id="Layer_1" class="st0">\r
+       <g class="st1">\r
+               <path class="st2" d="M24.8,151.4l-11.5,10l-12.9-9.6V0.5h263v151.7l-9,6.7V42.5h-39v112.6l-4.4-3.7l-7.6,5.3V42.5h-155v110.8\r
+                       l-9.8,8L24.8,151.4z"/>\r
+               <path class="st3" d="M263,1v151l-8,6V42h-40v112l-3.3-2.8l-0.6-0.5l-0.6,0.4l-6.5,4.6V42H48v111.1l-9.3,7.7l-13.3-9.6l-0.6-0.5\r
+                       l-0.6,0.5l-10.9,9.5L1,151.5V1L263,1L263,1z M264,0H0v152l13.4,10l11.5-10l13.9,10l10.2-8.4V43h154v114.7l8.1-5.7l4.9,4.2V43h38\r
+                       v116.9l10-7.4V0L264,0z M203,43H49v110.6l2.1-1.6l12.6,10l13.8-10l14.2,10l13-10l13,10l13.8-10l12.1,10l13.4-10l14.2,10l13-10\r
+                       l13,10l5.8-4.3L203,43L203,43z"/>\r
+               <path class="st4" d="M254,43h-38v113.2l7.6,5.8l13.8-10l13.9,10l2.7-2.1V43z"/>\r
+               <path class="st5" d="M2,14.5h260"/>\r
+               <path class="st3" d="M232.5,5h26v6h-26V5z M208.5,5h22v6h-22V5z M142,6v4H50V6H142z M143,5H49v6h94V5z M184.5,5h22v6h-22V5z\r
+                        M161.5,5h13v6h-13V5z M176.5,5h6v6h-6V5z M153.5,5h6v6h-6V5z M9,5h32v6H9V5z M52,7h2v2h-2V7z M11,36c0-7.7,6.3-14,14-14\r
+                       s14,6.3,14,14s-6.3,14-14,14S11,43.7,11,36z M38,107V72H13v35H38z M38,59v-5H13v5H38z"/>\r
+       </g>\r
+       <g class="st1">\r
+               <path class="st6" d="M123.8,68H85.6v7.8h38.1L123.8,68L123.8,68z M180.5,103v-8.8h-50.8v8.8H180.5z M90.8,80.6H69.9v8.6h20.8V80.6\r
+                       z M189.3,88.4v-7.8h-37.7v7.8H189.3z M100.7,94.1H75v7.8h25.7V94.1z M175.2,68H129v7.8h46.2V68z"/>\r
+               <path class="st7" d="M94.7,80.6v9.2h51.6v-9.2L94.7,80.6z"/>\r
+       </g>\r
+       <g class="st1">\r
+               <path class="st2" d="M94,94h75v44H94V94z"/>\r
+               <path class="st7" d="M169,94h-31v44h31V94z M150.8,118.1l5.9,9.7l3.2-3l4.8,6.1l-21.1,0l6.2-12.8H150.8z"/>\r
+               <g transform="scale(-1 1)">\r
+                       <path class="st8" d="M-102,100h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0\r
+                               C-101,100.2-101.4,100-102,100z"/>\r
+                       <path class="st8" d="M-102,104h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0\r
+                               C-101,104.2-101.4,104-102,104z"/>\r
+                       <path class="st8" d="M-102,108h-18c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h18c0.6,0,1-0.2,1-0.5l0,0\r
+                               C-101,108.2-101.4,108-102,108z"/>\r
+                       <path class="st8" d="M-102,112h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
+                               C-101,112.2-101.4,112-102,112z"/>\r
+                       <path class="st8" d="M-102,116h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
+                               C-101,116.2-101.4,116-102,116z"/>\r
+                       <path class="st8" d="M-102,120h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
+                               C-101,120.2-101.4,120-102,120z"/>\r
+                       <path class="st8" d="M-102,124h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
+                               C-101,124.2-101.4,124-102,124z"/>\r
+                       <path class="st8" d="M-102,128h-26c-0.6,0-1,0.2-1,0.5l0,0c0,0.3,0.4,0.5,1,0.5h26c0.6,0,1-0.2,1-0.5l0,0\r
+                               C-101,128.2-101.4,128-102,128z"/>\r
+               </g>\r
+       </g>\r
+</g>\r
+<g id="Layer_2">\r
+       <g>\r
+               <rect x="4.8" y="5.5" class="st2" width="93" height="5"/>\r
+               <path class="st3" d="M97.2,6v4h-92V6H97.2 M98.2,5h-94v6h94V5L98.2,5z"/>\r
+       </g>\r
+       <polygon class="st3" points="177.7,8 176.4,8 109.6,8 108.2,8 106,14 111.8,14 174.2,14 180,14    "/>\r
+       <polygon class="st3" points="256.5,8 255.2,8 188.3,8 187,8 184.7,14 190.6,14 252.9,14 258.8,14  "/>\r
+       <line class="st9" x1="2" y1="14.5" x2="262" y2="14.5"/>\r
+       <line class="st9" x1="2" y1="32.8" x2="262" y2="32.8"/>\r
+       <g>\r
+               <circle class="st10" cx="8.9" cy="22.6" r="3.6"/>\r
+               <line class="st10" x1="11.6" y1="25" x2="15" y2="28.5"/>\r
+       </g>\r
+       <rect x="20.9" y="19" class="st3" width="57.6" height="9.5"/>\r
+       <rect x="4.3" y="37" class="st3" width="69.2" height="32.7"/>\r
+       <rect x="4.3" y="72.5" class="st3" width="90.1" height="56.8"/>\r
+       <rect x="97" y="72.5" class="st11" width="106.5" height="56.8"/>\r
+       <rect x="206.3" y="72.5" class="st3" width="52.4" height="56.8"/>\r
+       <rect x="4.3" y="132.2" class="st3" width="36.5" height="25.3"/>\r
+       <rect x="43.7" y="132.2" class="st3" width="62.3" height="25.3"/>\r
+       <rect x="109.3" y="132.2" class="st3" width="18.1" height="25.3"/>\r
+       <rect x="169.1" y="132.2" class="st3" width="18.1" height="25.3"/>\r
+       <rect x="189.8" y="132.2" class="st3" width="18.1" height="25.3"/>\r
+       <rect x="210.6" y="132.2" class="st3" width="48.1" height="25.3"/>\r
+       <rect x="130" y="132.2" class="st3" width="36" height="25.3"/>\r
+       <rect x="115.2" y="37" class="st3" width="36.5" height="32.7"/>\r
+       <rect x="76.1" y="37" class="st3" width="36.5" height="32.7"/>\r
+       <rect x="154.6" y="37" class="st3" width="56" height="32.7"/>\r
+       <rect x="213.3" y="37" class="st3" width="45.4" height="32.7"/>\r
+       <path class="st2" d="M102.4,115.4l9.5-9.5l12.8,12.8l26.1-26.1l31.8,31.8h-80.3L102.4,115.4z"/>\r
+</g>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option4/search-rtl.png b/resources/src/mediawiki/bookletlayout/option4/search-rtl.png
new file mode 100644 (file)
index 0000000..3305928
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option4/search-rtl.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/search-rtl.svg b/resources/src/mediawiki/bookletlayout/option4/search-rtl.svg
new file mode 100644 (file)
index 0000000..408f9e6
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:#FFFFFF;}\r
+       .st1{fill:#E5E5E5;}\r
+       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
+       .st3{fill:none;stroke:#D02227;stroke-miterlimit:10;}\r
+       .st4{fill:#D02227;}\r
+</style>\r
+<g>\r
+       <rect x="166.2" y="5.5" class="st0" width="93" height="5"/>\r
+       <path class="st1" d="M258.8,6v4h-92V6H258.8 M259.8,5h-94v6h94V5L259.8,5z"/>\r
+</g>\r
+<polygon class="st1" points="86.3,8 87.6,8 154.4,8 155.8,8 158,14 152.2,14 89.8,14 84,14 "/>\r
+<polygon class="st1" points="7.5,8 8.8,8 75.7,8 77,8 79.3,14 73.4,14 11.1,14 5.2,14 "/>\r
+<line class="st2" x1="262" y1="14.5" x2="2" y2="14.5"/>\r
+<line class="st2" x1="262" y1="32.8" x2="2" y2="32.8"/>\r
+<g>\r
+       <circle class="st3" cx="255.1" cy="22.6" r="3.6"/>\r
+       <line class="st3" x1="252.4" y1="25" x2="249" y2="28.5"/>\r
+</g>\r
+<rect x="185.5" y="19" class="st1" width="57.6" height="9.5"/>\r
+<rect x="190.5" y="37" class="st1" width="69.2" height="32.7"/>\r
+<rect x="169.7" y="72.5" class="st1" width="90.1" height="56.8"/>\r
+<rect x="60.4" y="72.5" class="st4" width="106.5" height="56.8"/>\r
+<rect x="5.2" y="72.5" class="st1" width="52.4" height="56.8"/>\r
+<rect x="223.3" y="132.2" class="st1" width="36.5" height="25.3"/>\r
+<rect x="158" y="132.2" class="st1" width="62.3" height="25.3"/>\r
+<rect x="136.6" y="132.2" class="st1" width="18.1" height="25.3"/>\r
+<rect x="76.8" y="132.2" class="st1" width="18.1" height="25.3"/>\r
+<rect x="56.1" y="132.2" class="st1" width="18.1" height="25.3"/>\r
+<rect x="5.2" y="132.2" class="st1" width="48.1" height="25.3"/>\r
+<rect x="97.9" y="132.2" class="st1" width="36" height="25.3"/>\r
+<rect x="112.3" y="37" class="st1" width="36.5" height="32.7"/>\r
+<rect x="151.4" y="37" class="st1" width="36.5" height="32.7"/>\r
+<rect x="53.4" y="37" class="st1" width="56" height="32.7"/>\r
+<rect x="5.2" y="37" class="st1" width="45.4" height="32.7"/>\r
+<path class="st0" d="M161.7,124.3H81.4l31.8-31.8l26.1,26.1l12.8-12.8l9.5,9.5L161.7,124.3z"/>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option4/website-ltr.png b/resources/src/mediawiki/bookletlayout/option4/website-ltr.png
new file mode 100644 (file)
index 0000000..7e00751
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option4/website-ltr.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/website-ltr.svg b/resources/src/mediawiki/bookletlayout/option4/website-ltr.svg
new file mode 100644 (file)
index 0000000..c6bf6fe
--- /dev/null
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:#FFFFFF;}\r
+       .st1{fill:#E5E5E5;}\r
+       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
+       .st3{fill:#D02227;}\r
+       .st4{fill:#9B9A9A;}\r
+</style>\r
+<g>\r
+       <rect x="4.8" y="5.5" class="st0" width="93" height="5"/>\r
+       <path class="st1" d="M97.2,6v4h-92V6H97.2 M98.2,5h-94v6h94V5L98.2,5z"/>\r
+</g>\r
+<polygon class="st1" points="177.7,8 176.4,8 109.6,8 108.2,8 106,14 111.8,14 174.2,14 180,14 "/>\r
+<polygon class="st1" points="256.5,8 255.2,8 188.3,8 187,8 184.7,14 190.6,14 252.9,14 258.8,14 "/>\r
+<line class="st2" x1="2" y1="14.5" x2="262" y2="14.5"/>\r
+<rect x="44" y="48.4" class="st3" width="106.5" height="56.8"/>\r
+<path class="st0" d="M49.3,91.2l9.5-9.5l12.8,12.8l26.1-26.1l31.8,31.8H49.3L49.3,91.2z"/>\r
+<circle class="st1" cx="55" cy="32.3" r="11.9"/>\r
+<g>\r
+       <rect x="70.7" y="27.4" class="st4" width="76.2" height="7"/>\r
+       <rect x="70.7" y="35.5" class="st4" width="22.3" height="1.7"/>\r
+       <rect x="95" y="35.5" class="st4" width="28.2" height="1.7"/>\r
+</g>\r
+<rect x="44" y="107.8" class="st1" width="23.3" height="23.3"/>\r
+<rect x="70.7" y="107.8" class="st1" width="79.8" height="1.8"/>\r
+<rect x="70.7" y="114" class="st1" width="79.8" height="1.8"/>\r
+<rect x="70.7" y="120.2" class="st1" width="79.8" height="1.8"/>\r
+<rect x="70.7" y="126.4" class="st1" width="79.8" height="1.8"/>\r
+<rect x="44" y="134.4" class="st1" width="106.5" height="1.8"/>\r
+<rect x="44" y="140.6" class="st1" width="106.5" height="1.8"/>\r
+<rect x="44" y="146.8" class="st1" width="106.5" height="1.8"/>\r
+<rect x="44" y="153" class="st1" width="106.5" height="1.8"/>\r
+<g>\r
+       <rect x="155.7" y="37.2" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="43.4" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="49.6" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="55.8" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="27.4" class="st1" width="57.3" height="7"/>\r
+</g>\r
+<g>\r
+       <rect x="155.7" y="78.2" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="84.4" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="90.6" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="96.8" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="68.4" class="st1" width="57.3" height="7"/>\r
+</g>\r
+<g>\r
+       <rect x="155.7" y="116.7" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="122.9" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="129.1" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="135.3" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="155.7" y="106.9" class="st1" width="57.3" height="7"/>\r
+</g>\r
+</svg>\r
diff --git a/resources/src/mediawiki/bookletlayout/option4/website-rtl.png b/resources/src/mediawiki/bookletlayout/option4/website-rtl.png
new file mode 100644 (file)
index 0000000..83ba6d3
Binary files /dev/null and b/resources/src/mediawiki/bookletlayout/option4/website-rtl.png differ
diff --git a/resources/src/mediawiki/bookletlayout/option4/website-rtl.svg b/resources/src/mediawiki/bookletlayout/option4/website-rtl.svg
new file mode 100644 (file)
index 0000000..080045a
--- /dev/null
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        viewBox="0 0 264 162" style="enable-background:new 0 0 264 162;" xml:space="preserve">\r
+<style type="text/css">\r
+       .st0{fill:#FFFFFF;}\r
+       .st1{fill:#E5E5E5;}\r
+       .st2{fill:none;stroke:#E5E5E5;stroke-miterlimit:10;}\r
+       .st3{fill:#D02227;}\r
+       .st4{fill:#9B9A9A;}\r
+</style>\r
+<g>\r
+       <rect x="166.2" y="5.5" class="st0" width="93" height="5"/>\r
+       <path class="st1" d="M258.8,6v4h-92V6H258.8 M259.8,5h-94v6h94V5L259.8,5z"/>\r
+</g>\r
+<polygon class="st1" points="86.3,8 87.6,8 154.4,8 155.8,8 158,14 152.2,14 89.8,14 84,14 "/>\r
+<polygon class="st1" points="7.5,8 8.8,8 75.7,8 77,8 79.3,14 73.4,14 11.1,14 5.2,14 "/>\r
+<line class="st2" x1="262" y1="14.5" x2="2" y2="14.5"/>\r
+<rect x="113.5" y="48.4" class="st3" width="106.5" height="56.8"/>\r
+<path class="st0" d="M214.7,100.2h-80.3l31.8-31.8l26.1,26.1l12.8-12.8l9.5,9.5L214.7,100.2z"/>\r
+<circle class="st1" cx="209" cy="32.3" r="11.9"/>\r
+<g>\r
+       <rect x="117" y="27.4" class="st4" width="76.2" height="7"/>\r
+       <rect x="171" y="35.5" class="st4" width="22.3" height="1.7"/>\r
+       <rect x="140.8" y="35.5" class="st4" width="28.2" height="1.7"/>\r
+</g>\r
+<rect x="196.7" y="107.8" class="st1" width="23.3" height="23.3"/>\r
+<rect x="113.5" y="107.8" class="st1" width="79.8" height="1.8"/>\r
+<rect x="113.5" y="114" class="st1" width="79.8" height="1.8"/>\r
+<rect x="113.5" y="120.2" class="st1" width="79.8" height="1.8"/>\r
+<rect x="113.5" y="126.4" class="st1" width="79.8" height="1.8"/>\r
+<rect x="113.5" y="134.4" class="st1" width="106.5" height="1.8"/>\r
+<rect x="113.5" y="140.6" class="st1" width="106.5" height="1.8"/>\r
+<rect x="113.5" y="146.8" class="st1" width="106.5" height="1.8"/>\r
+<rect x="113.5" y="153" class="st1" width="106.5" height="1.8"/>\r
+<g>\r
+       <rect x="51" y="37.2" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="43.4" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="49.6" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="55.8" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="27.4" class="st1" width="57.3" height="7"/>\r
+</g>\r
+<g>\r
+       <rect x="51" y="78.2" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="84.4" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="90.6" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="96.8" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="68.4" class="st1" width="57.3" height="7"/>\r
+</g>\r
+<g>\r
+       <rect x="51" y="116.7" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="122.9" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="129.1" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="135.3" class="st1" width="57.3" height="1.8"/>\r
+       <rect x="51" y="106.9" class="st1" width="57.3" height="7"/>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+<g>\r
+</g>\r
+</svg>\r
diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.css
deleted file mode 100644 (file)
index 4143520..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-.mw-foreignStructuredUpload-bookletLayout-license {
-       font-size: 90%;
-       line-height: 1.4em;
-       color: #555;
-}
index 86fb91b..7ba73bf 100644 (file)
         * @inheritdoc
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.initialize = function () {
-               mw.ForeignStructuredUpload.BookletLayout.parent.prototype.initialize.call( this );
-               // Point the CategorySelector to the right wiki as soon as we know what the right wiki is
-               this.upload.apiPromise.done( function ( api ) {
-                       // If this is a ForeignApi, it will have a apiUrl, otherwise we don't need to do anything
-                       if ( api.apiUrl ) {
-                               // Can't reuse the same object, CategorySelector calls #abort on its mw.Api instance
-                               this.categoriesWidget.api = new mw.ForeignApi( api.apiUrl );
-                       }
-               }.bind( this ) );
+               var deferred = $.Deferred();
+               mw.ForeignStructuredUpload.BookletLayout.parent.prototype.initialize.call( this )
+                       .done( function () {
+                               // Point the CategorySelector to the right wiki
+                               this.upload.apiPromise.done( function ( api ) {
+                                       // If this is a ForeignApi, it will have a apiUrl, otherwise we don't need to do anything
+                                       if ( api.apiUrl ) {
+                                               // Can't reuse the same object, CategorySelector calls #abort on its mw.Api instance
+                                               this.categoriesWidget.api = new mw.ForeignApi( api.apiUrl );
+                                       }
+                                       deferred.resolve();
+                               }.bind( this ) );
+                       }.bind( this ) );
+               return deferred.promise();
        };
 
        /**
         * @inheritdoc
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm = function () {
+               var
+                       query = /[?&]uploadbucket=(\d)/.exec( location.search ),
+                       isTestEnabled = !!mw.config.get( 'wgForeignUploadTestEnabled' ),
+                       defaultBucket = mw.config.get( 'wgForeignUploadTestDefault' ) || 1,
+                       userId = mw.config.get( 'wgUserId' );
+
+               if ( query && query[ 1 ] ) {
+                       // Testing and debugging
+                       this.shouldRecordBucket = false;
+                       this.bucket = Number( query[ 1 ] );
+               } else if ( !userId || !isTestEnabled ) {
+                       // a) Anonymous user. This can actually happen, because our software sucks.
+                       // b) Test is not enabled on this wiki.
+                       // In either case, display the old interface and don't record bucket on uploads.
+                       this.shouldRecordBucket = false;
+                       this.bucket = defaultBucket;
+               } else {
+                       // Regular logged in user on a wiki where the test is running
+                       this.shouldRecordBucket = true;
+                       this.bucket = ( userId % 4 ) + 1; // 1, 2, 3, 4
+               }
+
+               return this[ 'renderUploadForm' + this.bucket ]();
+       };
+
+       /**
+        * Test option 1, the original one. See T120867.
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm1 = function () {
                var fieldset, $ownWorkMessage, $notOwnWorkMessage,
+                       onUploadFormChange,
                        ownWorkMessage, notOwnWorkMessage, notOwnWorkLocal,
                        validTargets = mw.config.get( 'wgForeignUploadTargets' ),
                        target = this.target || validTargets[ 0 ] || 'local',
                        layout = this;
 
+               // Temporary override to make my life easier during A/B test
+               target = 'shared';
+
                // foreign-structured-upload-form-label-own-work-message-local
                // foreign-structured-upload-form-label-own-work-message-shared
                ownWorkMessage = mw.message( 'foreign-structured-upload-form-label-own-work-message-' + target );
                        $( '<p>' ).html( notOwnWorkMessage.parse() ),
                        $( '<p>' ).html( notOwnWorkLocal.parse() )
                );
-               $ownWorkMessage.add( $notOwnWorkMessage ).find( 'a' ).attr( 'target', '_blank' );
+               $ownWorkMessage.add( $notOwnWorkMessage ).find( 'a' )
+                       .attr( 'target', '_blank' )
+                       .on( 'click', function ( e ) {
+                               // Some stupid code is trying to prevent default on all clicks, which causes the links to
+                               // not be openable, don't let it
+                               e.stopPropagation();
+                       } );
 
                this.selectFileWidget = new OO.ui.SelectFileWidget();
                this.messageLabel = new OO.ui.LabelWidget( {
                ] );
                this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
 
+               onUploadFormChange = function () {
+                       var file = this.selectFileWidget.getValue(),
+                               ownWork = this.ownWorkCheckbox.isSelected(),
+                               valid = !!file && ownWork;
+                       this.emit( 'uploadValid', valid );
+               };
+
                // Validation
-               this.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );
-               this.ownWorkCheckbox.on( 'change', this.onUploadFormChange.bind( this ) );
+               this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) );
+               this.ownWorkCheckbox.on( 'change', onUploadFormChange.bind( this ) );
 
                return this.uploadForm;
        };
 
        /**
-        * @inheritdoc
+        * Test option 2, idea A from T121021. See T120867.
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm2 = function () {
+               var fieldset, checkboxes, fields, onUploadFormChange;
+
+               this.selectFileWidget = new OO.ui.SelectFileWidget();
+               this.licenseCheckboxes = checkboxes = [
+                       new OO.ui.CheckboxInputWidget(),
+                       new OO.ui.CheckboxInputWidget(),
+                       new OO.ui.CheckboxInputWidget(),
+                       new OO.ui.CheckboxInputWidget()
+               ];
+
+               fields = [
+                       new OO.ui.FieldLayout( this.selectFileWidget, {
+                               align: 'top',
+                               label: mw.msg( 'upload-form-label-select-file' )
+                       } ),
+                       new OO.ui.FieldLayout( new OO.ui.LabelWidget( {
+                               label: mw.message( 'foreign-structured-upload-form-2-label-intro' ).parseDom()
+                       } ), {
+                               align: 'top'
+                       } ),
+                       new OO.ui.FieldLayout( checkboxes[ 0 ], {
+                               align: 'inline',
+                               classes: [
+                                       'mw-foreignStructuredUpload-bookletLayout-withicon',
+                                       'mw-foreignStructuredUpload-bookletLayout-ownwork'
+                               ],
+                               label: mw.message( 'foreign-structured-upload-form-2-label-ownwork' ).parseDom()
+                       } ),
+                       new OO.ui.FieldLayout( checkboxes[ 1 ], {
+                               align: 'inline',
+                               classes: [
+                                       'mw-foreignStructuredUpload-bookletLayout-withicon',
+                                       'mw-foreignStructuredUpload-bookletLayout-noderiv'
+                               ],
+                               label: mw.message( 'foreign-structured-upload-form-2-label-noderiv' ).parseDom()
+                       } ),
+                       new OO.ui.FieldLayout( checkboxes[ 2 ], {
+                               align: 'inline',
+                               classes: [
+                                       'mw-foreignStructuredUpload-bookletLayout-withicon',
+                                       'mw-foreignStructuredUpload-bookletLayout-useful'
+                               ],
+                               label: mw.message( 'foreign-structured-upload-form-2-label-useful' ).parseDom()
+                       } ),
+                       new OO.ui.FieldLayout( checkboxes[ 3 ], {
+                               align: 'inline',
+                               classes: [
+                                       'mw-foreignStructuredUpload-bookletLayout-withicon',
+                                       'mw-foreignStructuredUpload-bookletLayout-ccbysa'
+                               ],
+                               label: mw.message( 'foreign-structured-upload-form-2-label-ccbysa' ).parseDom()
+                       } ),
+                       new OO.ui.FieldLayout( new OO.ui.LabelWidget( {
+                               label: $()
+                                       .add( $( '<p>' ).msg( 'foreign-structured-upload-form-2-label-alternative' ) )
+                                       .add( $( '<p>' ).msg( 'foreign-structured-upload-form-2-label-termsofuse' )
+                                               .addClass( 'mw-foreignStructuredUpload-bookletLayout-license' ) )
+                       } ), {
+                               align: 'top'
+                       } )
+               ];
+
+               fieldset = new OO.ui.FieldsetLayout( { items: fields } );
+               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               this.uploadForm.$element.find( 'a' )
+                       .attr( 'target', '_blank' )
+                       .on( 'click', function ( e ) {
+                               // Some stupid code is trying to prevent default on all clicks, which causes the links to
+                               // not be openable, don't let it
+                               e.stopPropagation();
+                       } );
+
+               onUploadFormChange = function () {
+                       var file = this.selectFileWidget.getValue(),
+                               checks = checkboxes.every( function ( checkbox ) {
+                                       return checkbox.isSelected();
+                               } ),
+                               valid = !!file && checks;
+                       this.emit( 'uploadValid', valid );
+               };
+
+               // Validation
+               this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) );
+               checkboxes[ 0 ].on( 'change', onUploadFormChange.bind( this ) );
+               checkboxes[ 1 ].on( 'change', onUploadFormChange.bind( this ) );
+               checkboxes[ 2 ].on( 'change', onUploadFormChange.bind( this ) );
+               checkboxes[ 3 ].on( 'change', onUploadFormChange.bind( this ) );
+
+               return this.uploadForm;
+       };
+
+       /**
+        * Test option 3, idea D from T121021. See T120867.
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm3 = function () {
+               var ownWorkCheckbox, fieldset, yesMsg, noMsg, selects, selectFields,
+                       alternativeField, fields, onUploadFormChange;
+
+               this.selectFileWidget = new OO.ui.SelectFileWidget();
+               this.ownWorkCheckbox = ownWorkCheckbox = new OO.ui.CheckboxInputWidget();
+
+               yesMsg = mw.message( 'foreign-structured-upload-form-3-label-yes' ).text();
+               noMsg = mw.message( 'foreign-structured-upload-form-3-label-no' ).text();
+               selects = [
+                       new OO.ui.RadioSelectWidget( {
+                               items: [
+                                       new OO.ui.RadioOptionWidget( { data: false, label: yesMsg } ),
+                                       new OO.ui.RadioOptionWidget( { data: true, label: noMsg } )
+                               ]
+                       } ),
+                       new OO.ui.RadioSelectWidget( {
+                               items: [
+                                       new OO.ui.RadioOptionWidget( { data: true, label: yesMsg } ),
+                                       new OO.ui.RadioOptionWidget( { data: false, label: noMsg } )
+                               ]
+                       } ),
+                       new OO.ui.RadioSelectWidget( {
+                               items: [
+                                       new OO.ui.RadioOptionWidget( { data: false, label: yesMsg } ),
+                                       new OO.ui.RadioOptionWidget( { data: true, label: noMsg } )
+                               ]
+                       } )
+               ];
+
+               this.licenseSelectFields = selectFields = [
+                       new OO.ui.FieldLayout( selects[ 0 ], {
+                               align: 'top',
+                               classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ],
+                               label: mw.message( 'foreign-structured-upload-form-3-label-question-website' ).parseDom()
+                       } ),
+                       new OO.ui.FieldLayout( selects[ 1 ], {
+                               align: 'top',
+                               classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ],
+                               label: mw.message( 'foreign-structured-upload-form-3-label-question-ownwork' ).parseDom()
+                       } ).toggle( false ),
+                       new OO.ui.FieldLayout( selects[ 2 ], {
+                               align: 'top',
+                               classes: [ 'mw-foreignStructuredUpload-bookletLayout-question' ],
+                               label: mw.message( 'foreign-structured-upload-form-3-label-question-noderiv' ).parseDom()
+                       } ).toggle( false )
+               ];
+
+               alternativeField = new OO.ui.FieldLayout( new OO.ui.LabelWidget( {
+                       label: mw.message( 'foreign-structured-upload-form-3-label-alternative' ).parseDom()
+               } ), {
+                       align: 'top'
+               } ).toggle( false );
+
+               // Choosing the right answer to each question shows the next question.
+               // Switching to wrong answer hides all subsequent questions.
+               selects.forEach( function ( select, i ) {
+                       select.on( 'choose', function ( selectedOption ) {
+                               var isRightAnswer = !!selectedOption.getData();
+                               alternativeField.toggle( !isRightAnswer );
+                               if ( i + 1 === selectFields.length ) {
+                                       // Last question
+                                       return;
+                               }
+                               if ( isRightAnswer ) {
+                                       selectFields[ i + 1 ].toggle( true );
+                               } else {
+                                       selectFields.slice( i + 1 ).forEach( function ( field ) {
+                                               field.fieldWidget.selectItem( null );
+                                               field.toggle( false );
+                                       } );
+                               }
+                       } );
+               } );
+
+               fields = [
+                       new OO.ui.FieldLayout( this.selectFileWidget, {
+                               align: 'top',
+                               label: mw.msg( 'upload-form-label-select-file' )
+                       } ),
+                       selectFields[ 0 ],
+                       selectFields[ 1 ],
+                       selectFields[ 2 ],
+                       alternativeField,
+                       new OO.ui.FieldLayout( ownWorkCheckbox, {
+                               classes: [ 'mw-foreignStructuredUpload-bookletLayout-checkbox' ],
+                               align: 'inline',
+                               label: mw.message( 'foreign-structured-upload-form-label-own-work-message-shared' ).parseDom()
+                       } )
+               ];
+
+               // Must be done late, after it's been associated with the FieldLayout
+               ownWorkCheckbox.setDisabled( true );
+
+               fieldset = new OO.ui.FieldsetLayout( { items: fields } );
+               this.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );
+
+               this.uploadForm.$element.find( 'a' )
+                       .attr( 'target', '_blank' )
+                       .on( 'click', function ( e ) {
+                               // Some stupid code is trying to prevent default on all clicks, which causes the links to
+                               // not be openable, don't let it
+                               e.stopPropagation();
+                       } );
+
+               onUploadFormChange = function () {
+                       var file = this.selectFileWidget.getValue(),
+                               checkbox = ownWorkCheckbox.isSelected(),
+                               rightAnswers = selects.every( function ( select ) {
+                                       return select.getSelectedItem() && !!select.getSelectedItem().getData();
+                               } ),
+                               valid = !!file && checkbox && rightAnswers;
+                       ownWorkCheckbox.setDisabled( !rightAnswers );
+                       if ( !rightAnswers ) {
+                               ownWorkCheckbox.setSelected( false );
+                       }
+                       this.emit( 'uploadValid', valid );
+               };
+
+               // Validation
+               this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) );
+               this.ownWorkCheckbox.on( 'change', onUploadFormChange.bind( this ) );
+               selects[ 0 ].on( 'choose', onUploadFormChange.bind( this ) );
+               selects[ 1 ].on( 'choose', onUploadFormChange.bind( this ) );
+               selects[ 2 ].on( 'choose', onUploadFormChange.bind( this ) );
+
+               return this.uploadForm;
+       };
+
+       /**
+        * Test option 4, idea E from T121021. See T120867.
         */
-       mw.ForeignStructuredUpload.BookletLayout.prototype.onUploadFormChange = function () {
-               var file = this.selectFileWidget.getValue(),
-                       ownWork = this.ownWorkCheckbox.isSelected(),
-                       valid = !!file && ownWork;
-               this.emit( 'uploadValid', valid );
+       mw.ForeignStructuredUpload.BookletLayout.prototype.renderUploadForm4 = function () {
+               var fieldset, $guide;
+               this.renderUploadForm1();
+               fieldset = this.uploadForm.getItems()[ 0 ];
+
+               $guide = mw.template.get( 'mediawiki.ForeignStructuredUpload.BookletLayout', 'guide.html' ).render();
+               $guide.find( '.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good span' )
+                       .msg( 'foreign-structured-upload-form-4-label-good' );
+               $guide.find( '.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad span' )
+                       .msg( 'foreign-structured-upload-form-4-label-bad' );
+
+               // Note the index, we insert after the SelectFileWidget field
+               fieldset.addItems( [
+                       new OO.ui.FieldLayout( new OO.ui.Widget( {
+                               $content: $guide
+                       } ), {
+                               align: 'top'
+                       } )
+               ], 1 );
+
+               // Hook for custom styles
+               fieldset.getItems()[ 2 ].$element.addClass( 'mw-foreignStructuredUpload-bookletLayout-guide-checkbox' );
+
+               // Streamline: remove mention of local Special:Upload
+               fieldset.getItems()[ 3 ].$element.find( 'p' ).last().remove();
+
+               return this.uploadForm;
        };
 
+       /**
+        * @inheritdoc
+        */
+       mw.ForeignStructuredUpload.BookletLayout.prototype.onUploadFormChange = function () {};
+
        /**
         * @inheritdoc
         */
         * @inheritdoc
         */
        mw.ForeignStructuredUpload.BookletLayout.prototype.getText = function () {
-               this.upload.addDescription( 'en', this.descriptionWidget.getValue() );
+               var language = mw.config.get( 'wgContentLanguage' );
+               this.upload.clearDescriptions();
+               this.upload.addDescription( language, this.descriptionWidget.getValue() );
                this.upload.setDate( this.dateWidget.getValue() );
+               this.upload.clearCategories();
                this.upload.addCategories( this.categoriesWidget.getItemsData() );
                return this.upload.getText();
        };
        mw.ForeignStructuredUpload.BookletLayout.prototype.clear = function () {
                mw.ForeignStructuredUpload.BookletLayout.parent.prototype.clear.call( this );
 
-               this.ownWorkCheckbox.setSelected( false );
+               if ( this.ownWorkCheckbox ) {
+                       this.ownWorkCheckbox.setSelected( false );
+               }
+               if ( this.licenseCheckboxes ) {
+                       this.licenseCheckboxes.forEach( function ( checkbox ) {
+                               checkbox.setSelected( false );
+                       } );
+               }
+               if ( this.licenseSelectFields ) {
+                       this.licenseSelectFields.forEach( function ( field, i ) {
+                               field.fieldWidget.selectItem( null );
+                               if ( i !== 0 ) {
+                                       field.toggle( false );
+                               }
+                       } );
+               }
+
                this.categoriesWidget.setItemsFromData( [] );
                this.dateWidget.setValue( '' ).setValidityFlag( true );
        };
diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.less b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.less
new file mode 100644 (file)
index 0000000..fa15a2e
--- /dev/null
@@ -0,0 +1,136 @@
+@import "mediawiki.mixins";
+
+/* All */
+
+.mw-foreignStructuredUpload-bookletLayout-license {
+       font-size: 90%;
+       line-height: 1.4em;
+       color: #555;
+}
+
+/* Option 2 */
+
+.mw-foreignStructuredUpload-bookletLayout-withicon.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline {
+       background-repeat: no-repeat;
+       background-size: 3.5em;
+       min-height: 4em;
+       margin-bottom: 0.25em;
+       display: table;
+       vertical-align: middle;
+       -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+       box-sizing: border-box;
+       width: 100%;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-withicon.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline > .oo-ui-fieldLayout-body {
+       /* Together with 'display: table' above, and FieldLayout styles, this aligns the text */
+       /* vertically to the middle. Don't try this at home, kids. */
+       display: table-row;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-ownwork {
+       .background-image-svg('bookletlayout/option2/ownwork.svg', 'bookletlayout/option2/ownwork.png');
+       background-position: right center;
+       padding-right: 4.5em;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-noderiv {
+       .background-image-svg('bookletlayout/option2/noderiv.svg', 'bookletlayout/option2/noderiv.png');
+       background-position: right center;
+       padding-right: 4.5em;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-useful {
+       .background-image-svg('bookletlayout/option2/useful.svg', 'bookletlayout/option2/useful.png');
+       background-position: right center;
+       padding-right: 4.5em;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-ccbysa {
+       .background-image-svg('bookletlayout/option2/ccbysa.svg', 'bookletlayout/option2/ccbysa.png');
+       background-position: right center;
+       padding-right: 4.5em;
+}
+
+/* Option 3 */
+
+.mw-foreignStructuredUpload-bookletLayout-question .oo-ui-radioOptionWidget {
+       display: inline-block;
+       margin-right: 2em;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-checkbox.oo-ui-fieldLayout-disabled > .oo-ui-fieldLayout-body > .oo-ui-labelElement-label {
+       /* No unreadable greys, please. This is the lightest WCAG AA compliant grey. */
+       color: #707070;
+}
+
+/* Option 4 */
+
+.mw-foreignStructuredUpload-bookletLayout-guide {
+       position: relative;
+       height: 315px;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good,
+.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad {
+       display: table;
+       width: 150px;
+       height: 140px;
+       position: absolute;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good span,
+.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad span {
+       display: table-cell;
+       vertical-align: middle;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-good {
+       top: 0;
+       left: 0;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-text-wrapper-bad {
+       bottom: 0;
+       right: 0;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-image {
+       position: absolute;
+       width: 200px;
+       height: 122px;
+       background-color: #fff;
+       background-size: 200px;
+       background-repeat: no-repeat;
+       border: 1px solid #e5e5e5;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-image-camera {
+       .background-image-svg('bookletlayout/option4/camera.svg','bookletlayout/option4/camera.png');
+       top: 0;
+       right: 80px;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-image-graphics {
+       .background-image-svg('bookletlayout/option4/graphics.svg','bookletlayout/option4/graphics.png');
+       top: 50px;
+       right: 0;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-image-website {
+       .background-image-svg('bookletlayout/option4/website-ltr.svg','bookletlayout/option4/website-ltr.png');
+       left: 0;
+       bottom: 50px;
+}
+
+.mw-foreignStructuredUpload-bookletLayout-guide-image-search {
+       .background-image-svg('bookletlayout/option4/search-ltr.svg','bookletlayout/option4/search-ltr.png');
+       left: 80px;
+       bottom: 0;
+}
+
+.oo-ui-fieldLayout.oo-ui-fieldLayout-align-inline.mw-foreignStructuredUpload-bookletLayout-guide-checkbox {
+       /* We're really tight on vertical space. */
+       margin-bottom: 0;
+}
index dd28ddd..768efc3 100644 (file)
                }
        };
 
+       /**
+        * Empty the list of categories for the upload.
+        */
+       ForeignStructuredUpload.prototype.clearCategories = function () {
+               this.categories = [];
+       };
+
        /**
         * Add a description to the upload.
         *
                } );
        };
 
+       /**
+        * Empty the list of descriptions for the upload.
+        */
+       ForeignStructuredUpload.prototype.clearDescriptions = function () {
+               this.descriptions = [];
+       };
+
        /**
         * Set the date of creation for the upload.
         *
@@ -70,6 +84,7 @@
         */
        ForeignStructuredUpload.prototype.getText = function () {
                return (
+                       '== {{int:filedesc}} ==\n' +
                        '{{' +
                        this.getTemplateName() +
                        '\n|description=' +
@@ -81,6 +96,7 @@
                        '\n|author=' +
                        this.getUser() +
                        '\n}}\n\n' +
+                       '== {{int:license-header}} ==\n' +
                        this.getLicense() +
                        '\n\n' +
                        this.getCategories()
 
                for ( i = 0; i < this.descriptions.length; i++ ) {
                        desc = this.descriptions[ i ];
-                       templateCalls.push( '{{' + desc.language + '|' + desc.text + '}}' );
+                       templateCalls.push( '{{' + desc.language + '|1=' + desc.text + '}}' );
                }
 
                return templateCalls.join( '\n' );
        ForeignStructuredUpload.prototype.getCategories = function () {
                var i, cat, categoryLinks = [];
 
+               if ( this.categories.length === 0 ) {
+                       return '{{subst:unc}}';
+               }
+
                for ( i = 0; i < this.categories.length; i++ ) {
                        cat = this.categories[ i ];
                        categoryLinks.push( '[[Category:' + cat + ']]' );
         * @return {string}
         */
        ForeignStructuredUpload.prototype.getUser = function () {
-               return mw.config.get( 'wgUserName' );
+               var username = mw.config.get( 'wgUserName' );
+               // Do not localise 'User:', we don't know the language of target wiki
+               return '[[User:' + username + '|' + username + ']]';
        };
 
        mw.ForeignStructuredUpload = ForeignStructuredUpload;
index 910a78f..47250ee 100644 (file)
                        thumbPhpRegex = /thumb\.php/,
                        regexes = [
                                // Thumbnails
-                               /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[^\s\/]+-(?:\1|thumbnail)[^\s\/]*$/,
+                               /\/[a-f0-9]\/[a-f0-9]{2}\/([^\s\/]+)\/[^\s\/]+-[^\s\/]*$/,
 
                                // Thumbnails in non-hashed upload directories
                                /\/([^\s\/]+)\/[^\s\/]+-(?:\1|thumbnail)[^\s\/]*$/,
index dd199ce..60c9991 100644 (file)
 
        /**
         * Initialize for a new upload
+        *
+        * @return {jQuery.Promise} Promise resolved when everything is initialized
         */
        mw.Upload.BookletLayout.prototype.initialize = function () {
+               var
+                       apiPromise,
+                       booklet = this,
+                       deferred = $.Deferred();
+
                this.clear();
                this.upload = this.createUpload();
                this.setPage( 'upload' );
+
+               apiPromise = this.upload.apiPromise || $.Deferred.resolve( this.upload.api );
+               apiPromise.done( function ( api ) {
+                       // If the user can't upload anything, don't give them the option to.
+                       api.getUserInfo().done( function ( userInfo ) {
+                               if ( userInfo.rights.indexOf( 'upload' ) === -1 ) {
+                                       // TODO Use a better error message when not all logged-in users can upload
+                                       booklet.getPage( 'upload' ).$element.msg( 'api-error-mustbeloggedin' );
+                               }
+                       } ).always( function () {
+                               deferred.resolve();
+                       } );
+               } );
+
+               return deferred.promise();
        };
 
        /**
                this.filenameWidget.setValue( file.name );
                this.setPage( 'info' );
 
+               if ( this.shouldRecordBucket ) {
+                       this.upload.bucket = this.bucket;
+               }
+
                this.upload.setFile( file );
                // Explicitly set the filename so that the old filename isn't used in case of retry
                this.upload.setFilenameFromFile();
         *
         * @protected
         * @fires fileSaved
-        * @returns {jQuery.Promise} Rejects the promise with an
+        * @return {jQuery.Promise} Rejects the promise with an
         * {@link OO.ui.Error error}, or resolves if the upload was successful.
         */
        mw.Upload.BookletLayout.prototype.saveFile = function () {
         * state and state details.
         *
         * @protected
-        * @returns {OO.ui.Error} Error to display for given state and details.
+        * @return {OO.ui.Error} Error to display for given state and details.
         */
        mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = function () {
                var message,
                        // won't help the fact that the file already exists.
                        if ( warnings.stashfailed !== undefined ) {
                                return new OO.ui.Error(
-                                       $( '<p>' ).html(
-                                               mw.message( 'api-error-stashfailed' ).parse()
-                                       ),
+                                       $( '<p>' ).msg( 'api-error-stashfailed' ),
                                        { recoverable: false }
                                );
                        } else if ( warnings.exists !== undefined ) {
                                return new OO.ui.Error(
-                                       $( '<p>' ).html(
-                                               mw.message( 'fileexists', 'File:' + warnings.exists ).parse()
-                                       ),
+                                       $( '<p>' ).msg( 'fileexists', 'File:' + warnings.exists ),
                                        { recoverable: false }
                                );
                        } else if ( warnings[ 'page-exists' ] !== undefined ) {
                                return new OO.ui.Error(
-                                       $( '<p>' ).html(
-                                               mw.message( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ).parse()
-                                       ),
+                                       $( '<p>' ).msg( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ),
                                        { recoverable: false }
                                );
                        } else if ( warnings.duplicate !== undefined ) {
                                return new OO.ui.Error(
-                                       $( '<p>' ).html(
-                                               mw.message( 'api-error-duplicate', warnings.duplicate.length ).parse()
-                                       ),
+                                       $( '<p>' ).msg( 'api-error-duplicate', warnings.duplicate.length ),
                                        { recoverable: false }
                                );
                        } else if ( warnings[ 'thumb-name' ] !== undefined ) {
                                return new OO.ui.Error(
-                                       $( '<p>' ).html(
-                                               mw.message( 'filename-thumb-name' ).parse()
-                                       ),
+                                       $( '<p>' ).msg( 'filename-thumb-name' ),
                                        { recoverable: false }
                                );
                        } else if ( warnings[ 'bad-prefix' ] !== undefined ) {
                                return new OO.ui.Error(
-                                       $( '<p>' ).html(
-                                               mw.message( 'filename-bad-prefix', warnings[ 'bad-prefix' ] ).parse()
-                                       ),
+                                       $( '<p>' ).msg( 'filename-bad-prefix', warnings[ 'bad-prefix' ] ),
                                        { recoverable: false }
                                );
                        } else if ( warnings[ 'duplicate-archive' ] !== undefined ) {
                                return new OO.ui.Error(
-                                       $( '<p>' ).html(
-                                               mw.message( 'api-error-duplicate-archive', 1 ).parse()
-                                       ),
+                                       $( '<p>' ).msg( 'api-error-duplicate-archive', 1 ),
                                        { recoverable: false }
                                );
                        } else if ( warnings.badfilename !== undefined ) {
                                // TODO This might not really be the best place to do this
                                this.filenameWidget.setValue( warnings.badfilename );
                                return new OO.ui.Error(
-                                       $( '<p>' ).html(
-                                               mw.message( 'badfilename', warnings.badfilename ).parse()
-                                       )
+                                       $( '<p>' ).msg( 'badfilename', warnings.badfilename )
                                );
                        } else {
                                return new OO.ui.Error(
         *
         * @protected
         * @fires selectFile
-        * @returns {OO.ui.FormLayout}
+        * @return {OO.ui.FormLayout}
         */
        mw.Upload.BookletLayout.prototype.renderUploadForm = function () {
                var fieldset;
         * property.
         *
         * @protected
-        * @returns {OO.ui.FormLayout}
+        * @return {OO.ui.FormLayout}
         */
        mw.Upload.BookletLayout.prototype.renderInfoForm = function () {
                var fieldset;
         * sets the {@link #insertForm insertForm} property.
         *
         * @protected
-        * @returns {OO.ui.FormLayout}
+        * @return {OO.ui.FormLayout}
         */
        mw.Upload.BookletLayout.prototype.renderInsertForm = function () {
                var fieldset;
         * {@link #uploadForm upload form}.
         *
         * @protected
-        * @returns {File|null}
+        * @return {File|null}
         */
        mw.Upload.BookletLayout.prototype.getFile = function () {
                return this.selectFileWidget.getValue();
         * {@link #infoForm information form}.
         *
         * @protected
-        * @returns {string}
+        * @return {string}
         */
        mw.Upload.BookletLayout.prototype.getFilename = function () {
                return this.filenameWidget.getValue();
         * {@link #infoForm information form}.
         *
         * @protected
-        * @returns {string}
+        * @return {string}
         */
        mw.Upload.BookletLayout.prototype.getText = function () {
                return this.descriptionWidget.getValue();
index 220a3fe..e8a85f1 100644 (file)
         * @inheritdoc
         */
        mw.Upload.Dialog.prototype.getBodyHeight = function () {
-               return 300;
+               return 600;
        };
 
        /**
        mw.Upload.Dialog.prototype.getSetupProcess = function ( data ) {
                return mw.Upload.Dialog.parent.prototype.getSetupProcess.call( this, data )
                        .next( function () {
-                               this.uploadBooklet.initialize();
+                               return this.uploadBooklet.initialize();
                        }, this );
        };
 
                                this.uploadBooklet.clear();
                        }, this );
        };
-
 }( jQuery, mediaWiki ) );
index 4f8789d..d80b4eb 100644 (file)
                        upload.setState( Upload.State.UPLOADING );
 
                        return finishStash( {
+                               bucket: upload.bucket, // Automatically ignored if undefined
                                watchlist: ( upload.getWatchlist() ) ? 1 : undefined,
                                comment: upload.getComment(),
                                filename: upload.getFilename(),
index 9d29b4c..835b423 100644 (file)
@@ -68,9 +68,8 @@
                if ( val === undefined || val === null || val === '' ) {
                        return '';
                }
-               /* jshint latedef:false */
+
                return pre + ( raw ? val : mw.Uri.encode( val ) ) + post;
-               /* jshint latedef:true */
        }
 
        /**
                }() );
 
                /**
-                * @class mw.Uri
-                * @constructor
-                *
                 * Construct a new URI object. Throws error if arguments are illegal/impossible, or
                 * otherwise don't parse.
                 *
+                * @class mw.Uri
+                * @constructor
                 * @param {Object|string} [uri] URI string, or an Object with appropriate properties (especially
                 *  another URI object to clone). Object must have non-blank `protocol`, `host`, and `path`
                 *  properties. If omitted (or set to `undefined`, `null` or empty string), then an object
                 * @param {boolean} [options.overrideKeys=false] Whether to let duplicate query parameters
                 *  override each other (`true`) or automagically convert them to an array (`false`).
                 */
-               /* jshint latedef:false */
                function Uri( uri, options ) {
                        var prop,
                                defaultUri = getDefaultUri();
index b62e8d1..ad1069f 100644 (file)
@@ -76,7 +76,7 @@
                 *  that the user will be assigned to that bucket
                 * @param {string} token A token that uniquely identifies the user for the
                 *  duration of the experiment
-                * @returns {string} The bucket
+                * @return {string} The bucket
                 */
                getBucket: function ( experiment, token ) {
                        var buckets = experiment.buckets,
index d226ed9..7afb9d3 100644 (file)
@@ -38,6 +38,7 @@
         * @param {Object} [config] Configuration object
         * @cfg {mw.Title} [title="Feedback"] The title of the page where you collect
         *  feedback.
+        * @cfg {string} [apiUrl] api.php URL if the feedback page is on another wiki
         * @cfg {string} [dialogTitleMessageKey="feedback-dialog-title"] Message key for the
         *  title of the dialog box
         * @cfg {mw.Uri|string} [bugsLink="//phabricator.wikimedia.org/maniphest/task/create/"] URL where
@@ -57,7 +58,7 @@
                // Feedback page title
                this.feedbackPageTitle = config.title || new mw.Title( 'Feedback' );
 
-               this.messagePosterPromise = mw.messagePoster.factory.create( this.feedbackPageTitle );
+               this.messagePosterPromise = mw.messagePoster.factory.create( this.feedbackPageTitle, config.apiUrl );
 
                // Links
                this.bugsTaskSubmissionLink = config.bugsLink || '//phabricator.wikimedia.org/maniphest/task/create/';
                        case 'submitted':
                                dialogConfig = {
                                        title: mw.msg( 'feedback-thanks-title' ),
-                                       message: $( '<span>' ).append(
-                                               mw.message(
-                                                       'feedback-thanks',
-                                                       this.feedbackPageTitle.getNameText(),
-                                                       $( '<a>' )
-                                                               .attr( {
-                                                                       target: '_blank',
-                                                                       href: this.feedbackPageTitle.getUrl()
-                                                               } )
-                                               ).parse()
+                                       message: $( '<span>' ).msg(
+                                               'feedback-thanks',
+                                               this.feedbackPageTitle.getNameText(),
+                                               $( '<a>' ).attr( {
+                                                       target: '_blank',
+                                                       href: this.feedbackPageTitle.getUrl()
+                                               } )
                                        ),
                                        actions: [
                                                {
        /**
         * Get the bug report link
         *
-        * @returns {string} Link to the external bug report form
+        * @return {string} Link to the external bug report form
         */
        mw.Feedback.Dialog.prototype.getBugReportLink = function () {
                return this.bugReportLink;
index a07a403..4a2a367 100644 (file)
@@ -6,8 +6,6 @@ a.feedlink {
         * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
        background-image: url(images/feed-icon.png);
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/feed-icon.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/feed-icon.svg);
        background-position: center left;
        background-repeat: no-repeat;
index e41248c..c3341bb 100644 (file)
@@ -1,7 +1,7 @@
 /* HTMLForm styles */
 
 table.mw-htmlform-nolabel td.mw-label {
-       width: 1px;
+       display: none;
 }
 
 .mw-htmlform-invalid-input td.mw-input input {
@@ -31,8 +31,6 @@ tr.mw-htmlform-vertical-label td.mw-label {
         * http://pauginer.tumblr.com/post/36614680636/invisible-gradient-technique */
        background-image: url(images/question.png);
        /* @embed */
-       background-image: -webkit-linear-gradient(transparent, transparent), url(images/question.svg);
-       /* @embed */
        background-image: linear-gradient(transparent, transparent), url(images/question.svg);
        background-repeat: no-repeat;
        background-size: 13px 13px;
index de63a18..e905f69 100644 (file)
@@ -53,7 +53,6 @@
                        // applies to direct calls to jqueryMsg. The default for mediawiki.js itself
                        // is 'text', including when it uses jqueryMsg.
                        format: 'parse'
-
                };
 
        /**
         * @return {jQuery} return.return
         */
        function getFailableParserFn( options ) {
-               var parser = new mw.jqueryMsg.parser( options );
-
                return function ( args ) {
                        var fallback,
+                               parser = new mw.jqueryMsg.parser( options ),
                                key = args[ 0 ],
                                argsArray = $.isArray( args[ 1 ] ) ? args[ 1 ] : slice.call( args, 1 );
                        try {
         * @param {Object} data
         */
        mw.jqueryMsg.setParserDefaults = function ( data ) {
-               if ( data.allowedHtmlElements ) {
-                       parserDefaults.allowedHtmlElements = data.allowedHtmlElements;
-               }
+               $.extend( parserDefaults, data );
+       };
+
+       /**
+        * Get current parser defaults.
+        *
+        * Primarily used for the unit test. Returns a copy.
+        *
+        * @private
+        * @return {Object}
+        */
+       mw.jqueryMsg.getParserDefaults = function () {
+               return $.extend( {}, parserDefaults );
        };
 
        /**
         * @return {string} return.return Rendered HTML.
         */
        mw.jqueryMsg.getMessageFunction = function ( options ) {
-               var failableParserFn = getFailableParserFn( options ),
-                       format;
+               var failableParserFn, format;
 
                if ( options && options.format !== undefined ) {
                        format = options.format;
                }
 
                return function () {
+                       if ( !failableParserFn ) {
+                               failableParserFn = getFailableParserFn( options );
+                       }
                        var failableResult = failableParserFn( arguments );
                        if ( format === 'text' || format === 'escaped' ) {
                                return failableResult.text();
         * @return {jQuery} return.return
         */
        mw.jqueryMsg.getPlugin = function ( options ) {
-               var failableParserFn = getFailableParserFn( options );
+               var failableParserFn;
 
                return function () {
+                       if ( !failableParserFn ) {
+                               failableParserFn = getFailableParserFn( options );
+                       }
                        var $target = this.empty();
                        appendWithoutParsing( $target, failableParserFn( arguments ) );
                        return $target;
        mw.jqueryMsg.parser = function ( options ) {
                this.settings = $.extend( {}, parserDefaults, options );
                this.settings.onlyCurlyBraceTransform = ( this.settings.format === 'text' || this.settings.format === 'escaped' );
+               this.astCache = {};
 
                this.emitter = new mw.jqueryMsg.htmlEmitter( this.settings.language, this.settings.magic );
        };
 
        mw.jqueryMsg.parser.prototype = {
-               /**
-                * Cache mapping MediaWiki message keys and the value onlyCurlyBraceTransform, to the AST of the message.
-                *
-                * In most cases, the message is a string so this is identical.
-                * (This is why we would like to move this functionality server-side).
-                *
-                * The two parts of the key are separated by colon.  For example:
-                *
-                *     "message-key:true": ast
-                *
-                * if they key is "message-key" and onlyCurlyBraceTransform is true.
-                *
-                * This cache is shared by all instances of mw.jqueryMsg.parser.
-                *
-                * NOTE: We promise, it's static - when you create this empty object
-                * in the prototype, each new instance of the class gets a reference
-                * to the same object.
-                *
-                * @static
-                * @property {Object}
-                */
-               astCache: {},
-
                /**
                 * Where the magic happens.
                 * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
                 * @return {jQuery}
                 */
                parse: function ( key, replacements ) {
-                       return this.emitter.emit( this.getAst( key ), replacements );
+                       var ast = this.getAst( key );
+                       return this.emitter.emit( ast, replacements );
                },
 
                /**
                 * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
                 */
                getAst: function ( key ) {
-                       var wikiText,
-                               cacheKey = [ key, this.settings.onlyCurlyBraceTransform ].join( ':' );
+                       var wikiText;
 
-                       if ( this.astCache[ cacheKey ] === undefined ) {
+                       if ( !this.astCache.hasOwnProperty( key ) ) {
                                wikiText = this.settings.messages.get( key );
                                if ( typeof wikiText !== 'string' ) {
                                        wikiText = '\\[' + key + '\\]';
                                }
-                               this.astCache[ cacheKey ] = this.wikiTextToAst( wikiText );
+                               this.astCache[ key ] = this.wikiTextToAst( wikiText );
                        }
-                       return this.astCache[ cacheKey ];
+                       return this.astCache[ key ];
                },
 
                /**
                        // I am deferring the work of turning it into prototypes & objects. It's quite fast enough
                        // finally let's do some actual work...
 
-                       // If you add another possible rootExpression, you must update the astCache key scheme.
                        result = start( this.settings.onlyCurlyBraceTransform ? curlyBraceTransformExpression : expression );
 
                        /*
                                        $el.attr( 'href', textify( arg ) );
                                }
                        }
-                       return appendWithoutParsing( $el, contents );
+                       return appendWithoutParsing( $el.empty(), contents );
                },
 
                /**
                                number = nodes[ 0 ];
 
                        return this.language.convertNumber( number, isInteger );
+               },
+
+               /**
+                * Lowercase text
+                *
+                * @param {Array} nodes List of nodes
+                * @return {string} The given text, all in lowercase
+                */
+               lc: function ( nodes ) {
+                       return textify( nodes[ 0 ] ).toLowerCase();
+               },
+
+               /**
+                * Uppercase text
+                *
+                * @param {Array} nodes List of nodes
+                * @return {string} The given text, all in uppercase
+                */
+               uc: function ( nodes ) {
+                       return textify( nodes[ 0 ] ).toUpperCase();
+               },
+
+               /**
+                * Lowercase first letter of input, leaving the rest unchanged
+                *
+                * @param {Array} nodes List of nodes
+                * @return {string} The given text, with the first character in lowercase
+                */
+               lcfirst: function ( nodes ) {
+                       var text = textify( nodes[ 0 ] );
+                       return text.charAt( 0 ).toLowerCase() + text.slice( 1 );
+               },
+
+               /**
+                * Uppercase first letter of input, leaving the rest unchanged
+                *
+                * @param {Array} nodes List of nodes
+                * @return {string} The given text, with the first character in uppercase
+                */
+               ucfirst: function ( nodes ) {
+                       var text = textify( nodes[ 0 ] );
+                       return text.charAt( 0 ).toUpperCase() + text.slice( 1 );
                }
        };
 
        // Replace the default message parser with jqueryMsg
        oldParser = mw.Message.prototype.parser;
        mw.Message.prototype.parser = function () {
-               var messageFunction;
-
-               // TODO: should we cache the message function so we don't create a new one every time? Benchmark this maybe?
-               // Caching is somewhat problematic, because we do need different message functions for different maps, so
-               // we'd have to cache the parser as a member of this.map, which sounds a bit ugly.
-               // Do not use mw.jqueryMsg unless required
                if ( this.format === 'plain' || !/\{\{|[\[<>&]/.test( this.map.get( this.key ) ) ) {
                        // Fall back to mw.msg's simple parser
                        return oldParser.apply( this );
                }
 
-               messageFunction = mw.jqueryMsg.getMessageFunction( {
-                       messages: this.map,
-                       // For format 'escaped', escaping part is handled by mediawiki.js
-                       format: this.format
-               } );
-               return messageFunction( this.key, this.parameters );
+               if ( !this.map.hasOwnProperty( this.format ) ) {
+                       this.map[ this.format ] = mw.jqueryMsg.getMessageFunction( {
+                               messages: this.map,
+                               // For format 'escaped', escaping part is handled by mediawiki.js
+                               format: this.format
+                       } );
+               }
+               return this.map[ this.format ]( this.key, this.parameters );
        };
 
+       /**
+        * Parse the message to DOM nodes, rather than HTML string like #parse.
+        *
+        * This method is only available when jqueryMsg is loaded.
+        *
+        * @method parseDom
+        * @member mw.Message
+        * @return {jQuery}
+        */
+       mw.Message.prototype.parseDom = ( function () {
+               var reusableParent = $( '<div>' );
+               return function () {
+                       return reusableParent.msg( this.key, this.parameters ).contents().detach();
+               };
+       } )();
+
 }( mediaWiki, jQuery ) );
index 568bfd4..322c579 100644 (file)
                 */
                params: function ( parameters ) {
                        var i;
-                       for ( i = 0; i < parameters.length; i += 1 ) {
+                       for ( i = 0; i < parameters.length; i++ ) {
                                this.parameters.push( parameters[ i ] );
                        }
                        return this;
                                // Selector cache for the marker element. Use getMarker() to get/use the marker!
                                $marker = null,
 
-                               // Buffer for #addEmbeddedCSS
+                               // For #addEmbeddedCSS
                                cssBuffer = '',
-
-                               // Callbacks for #addEmbeddedCSS
+                               cssBufferTimer = null,
                                cssCallbacks = $.Callbacks();
 
                        function getMarker() {
                                        cssCallbacks.add( callback );
                                }
 
-                               // Yield once before inserting the <style> tag. There are likely
-                               // more calls coming up which we can combine this way.
-                               // Appending a stylesheet and waiting for the browser to repaint
-                               // is fairly expensive, this reduces that (bug 45810)
+                               // Yield once before creating the <style> tag. This lets multiple stylesheets
+                               // accumulate into one buffer, allowing us to reduce how often new stylesheets
+                               // are inserted in the browser. Appending a stylesheet and waiting for the
+                               // browser to repaint is fairly expensive. (T47810)
                                if ( cssText ) {
-                                       // Be careful not to extend the buffer with css that needs a new stylesheet.
-                                       // cssText containing `@import` rules needs to go at the start of a buffer,
-                                       // since those only work when placed at the start of a stylesheet; bug 35562.
+                                       // Don't extend the buffer if the item needs its own stylesheet.
+                                       // Keywords like `@import` are only valid at the start of a stylesheet (T37562).
                                        if ( !cssBuffer || cssText.slice( 0, '@import'.length ) !== '@import' ) {
                                                // Linebreak for somewhat distinguishable sections
-                                               // (the rl-cachekey comment separating each)
                                                cssBuffer += '\n' + cssText;
-                                               // TODO: Use requestAnimationFrame in the future which will
-                                               // perform even better by not injecting styles while the browser
-                                               // is painting.
-                                               setTimeout( function () {
-                                                       // Can't pass addEmbeddedCSS to setTimeout directly because Firefox
-                                                       // (below version 13) has the non-standard behaviour of passing a
-                                                       // numerical "lateness" value as first argument to this callback
-                                                       // http://benalman.com/news/2009/07/the-mysterious-firefox-settime/
-                                                       addEmbeddedCSS();
-                                               } );
+                                               // TODO: Using requestAnimationFrame would perform better by not injecting
+                                               // styles while the browser is busy painting.
+                                               if ( !cssBufferTimer ) {
+                                                       cssBufferTimer = setTimeout( function () {
+                                                               // Support: Firefox < 13
+                                                               // Firefox 12 has non-standard behaviour of passing a number
+                                                               // as first argument to a setTimeout callback.
+                                                               // http://benalman.com/news/2009/07/the-mysterious-firefox-settime/
+                                                               addEmbeddedCSS();
+                                                       } );
+                                               }
                                                return;
                                        }
 
-                               // This is a delayed call and we got a buffer still
-                               } else if ( cssBuffer ) {
+                               // This is a scheduled flush for the buffer
+                               } else {
+                                       cssBufferTimer = null;
                                        cssText = cssBuffer;
                                        cssBuffer = '';
-
-                               } else {
-                                       // This is a delayed call, but buffer was already cleared by
-                                       // another delayed call.
-                                       return;
                                }
 
                                // By default, always create a new <style>. Appending text to a <style>
                                }
 
                                // Execute all jobs whose dependencies are either all satisfied or contain at least one failed module.
-                               for ( j = 0; j < jobs.length; j += 1 ) {
+                               for ( j = 0; j < jobs.length; j++ ) {
                                        hasErrors = anyFailed( jobs[ j ].dependencies );
                                        if ( hasErrors || allReady( jobs[ j ].dependencies ) ) {
                                                // All dependencies satisfied, or some have errors
                         * @throws {Error} If any unregistered module or a dependency loop is encountered
                         */
                        function sortDependencies( module, resolved, unresolved ) {
-                               var n, deps, len, skip;
+                               var i, deps, skip;
 
                                if ( !hasOwn.call( registry, module ) ) {
                                        throw new Error( 'Unknown dependency: ' + module );
                                }
                                // Tracks down dependencies
                                deps = registry[ module ].dependencies;
-                               len = deps.length;
-                               for ( n = 0; n < len; n += 1 ) {
-                                       if ( $.inArray( deps[ n ], resolved ) === -1 ) {
-                                               if ( unresolved[ deps[ n ] ] ) {
-                                                       throw new Error(
-                                                               'Circular reference detected: ' + module +
-                                                               ' -> ' + deps[ n ]
-                                                       );
+                               for ( i = 0; i < deps.length; i++ ) {
+                                       if ( $.inArray( deps[ i ], resolved ) === -1 ) {
+                                               if ( unresolved[ deps[ i ] ] ) {
+                                                       throw new Error( mw.format(
+                                                               'Circular reference detected: $1 -> $2',
+                                                               module,
+                                                               deps[ i ]
+                                                       ) );
                                                }
 
                                                // Add to unresolved
                                                unresolved[ module ] = true;
-                                               sortDependencies( deps[ n ], resolved, unresolved );
-                                               delete unresolved[ module ];
+                                               sortDependencies( deps[ i ], resolved, unresolved );
                                        }
                                }
-                               resolved[ resolved.length ] = module;
+                               resolved.push( module );
                        }
 
                        /**
-                        * Get a list of module names that a module depends on in their proper dependency
-                        * order.
+                        * Get names of module that a module depends on, in their proper dependency order.
                         *
                         * @private
                         * @param {string[]} modules Array of string module names
                        }
 
                        /**
-                        * Load and execute a script with callback.
+                        * Load and execute a script.
                         *
                         * @private
                         * @param {string} src URL to script, will be used as the src attribute in the script tag
                                                // Array of css strings in key 'css',
                                                // or back-compat array of urls from media-type
                                                if ( $.isArray( value ) ) {
-                                                       for ( i = 0; i < value.length; i += 1 ) {
+                                                       for ( i = 0; i < value.length; i++ ) {
                                                                if ( key === 'bc-url' ) {
                                                                        // back-compat: { <media>: [url, ..] }
                                                                        addLink( media, value[ i ] );
                                                        // { "url": { <media>: [url, ..] } }
                                                        for ( media in value ) {
                                                                urls = value[ media ];
-                                                               for ( i = 0; i < urls.length; i += 1 ) {
+                                                               for ( i = 0; i < urls.length; i++ ) {
                                                                        addLink( media, urls[ i ] );
                                                                }
                                                        }
                                        }
                                }
                                a.sort();
-                               for ( key = 0; key < a.length; key += 1 ) {
+                               for ( key = 0; key < a.length; key++ ) {
                                        sorted[ a[ key ] ] = o[ a[ key ] ];
                                }
                                return sorted;
                                        maxQueryLength = mw.config.get( 'wgResourceLoaderMaxQueryLength', 2000 );
 
                                        // Appends a list of modules from the queue to the batch
-                                       for ( q = 0; q < queue.length; q += 1 ) {
+                                       for ( q = 0; q < queue.length; q++ ) {
                                                // Only request modules which are registered
                                                if ( hasOwn.call( registry, queue[ q ] ) && registry[ queue[ q ] ].state === 'registered' ) {
                                                        // Prevent duplicate entries
                                                        if ( $.inArray( queue[ q ], batch ) === -1 ) {
-                                                               batch[ batch.length ] = queue[ q ];
+                                                               batch.push( queue[ q ] );
                                                                // Mark registered modules as loading
                                                                registry[ queue[ q ] ].state = 'loading';
                                                        }
                                        batch.sort();
 
                                        // Split batch by source and by group.
-                                       for ( b = 0; b < batch.length; b += 1 ) {
+                                       for ( b = 0; b < batch.length; b++ ) {
                                                bSource = registry[ batch[ b ] ].source;
                                                bGroup = registry[ batch[ b ] ].group;
                                                if ( !hasOwn.call( splits, bSource ) ) {
                                                        splits[ bSource ][ bGroup ] = [];
                                                }
                                                bSourceGroup = splits[ bSource ][ bGroup ];
-                                               bSourceGroup[ bSourceGroup.length ] = batch[ b ];
+                                               bSourceGroup.push( batch[ b ] );
                                        }
 
                                        // Clear the batch - this MUST happen before we append any
 
                                                        moduleMap = {}; // { prefix: [ suffixes ] }
 
-                                                       for ( i = 0; i < modules.length; i += 1 ) {
+                                                       for ( i = 0; i < modules.length; i++ ) {
                                                                // Determine how many bytes this module would add to the query string
                                                                lastDotIndex = modules[ i ].lastIndexOf( '.' );
 
                                /**
                                 * Register a source.
                                 *
-                                * The #work method will use this information to split up requests by source.
+                                * The #work() method will use this information to split up requests by source.
                                 *
                                 *     mw.loader.addSource( 'mediawikiwiki', '//www.mediawiki.org/w/load.php' );
                                 *
-                                * @param {string} id Short string representing a source wiki, used internally for
-                                *  registered modules to indicate where they should be loaded from (usually lowercase a-z).
-                                * @param {Object|string} loadUrl load.php url, may be an object for backwards-compatibility
-                                * @return {boolean}
+                                * @param {string|Object} id Source ID, or object mapping ids to load urls
+                                * @param {string} loadUrl Url to a load.php end point
+                                * @throws {Error} If source id is already registered
                                 */
                                addSource: function ( id, loadUrl ) {
                                        var source;
                                                for ( source in id ) {
                                                        mw.loader.addSource( source, id[ source ] );
                                                }
-                                               return true;
+                                               return;
                                        }
 
                                        if ( hasOwn.call( sources, id ) ) {
                                                throw new Error( 'source already registered: ' + id );
                                        }
 
-                                       if ( typeof loadUrl === 'object' ) {
-                                               loadUrl = loadUrl.loadScript;
-                                       }
-
                                        sources[ id ] = loadUrl;
-
-                                       return true;
                                },
 
                                /**
                                 * @param {string} [skip=null] Script body of the skip function
                                 */
                                register: function ( module, version, dependencies, group, source, skip ) {
-                                       var i, len;
+                                       var i;
                                        // Allow multiple registration
                                        if ( typeof module === 'object' ) {
                                                resolveIndexedDependencies( module );
-                                               for ( i = 0, len = module.length; i < len; i++ ) {
+                                               for ( i = 0; i < module.length; i++ ) {
                                                        // module is an array of module names
                                                        if ( typeof module[ i ] === 'string' ) {
                                                                mw.loader.register( module[ i ] );
                                        },
 
                                        /**
-                                        * Sync modules to localStorage.
+                                        * Sync in-memory store back to localStorage.
                                         *
-                                        * This function debounces localStorage updates. When called multiple times in
-                                        * quick succession, the calls are coalesced into a single update operation.
-                                        * This allows us to call #update without having to consider the module load
-                                        * queue; the call to localStorage.setItem will be naturally deferred until the
-                                        * page is quiescent.
+                                        * This function debounces updates. When called with a flush already pending,
+                                        * the call is coalesced into the pending update. The call to
+                                        * localStorage.setItem will be naturally deferred until the page is quiescent.
                                         *
-                                        * Because localStorage is shared by all pages with the same origin, if multiple
+                                        * Because localStorage is shared by all pages from the same origin, if multiple
                                         * pages are loaded with different module sets, the possibility exists that
                                         * modules saved by one page will be clobbered by another. But the impact would
                                         * be minor and the problem would be corrected by subsequent page views.
                                         * @method
                                         */
                                        update: ( function () {
-                                               var timer;
+                                               var hasPendingWrite = false;
 
-                                               function flush() {
-                                                       var data,
-                                                               key = mw.loader.store.getStoreKey();
-
-                                                       if ( !mw.loader.store.enabled ) {
-                                                               return false;
+                                               function flushWrites() {
+                                                       var data, key;
+                                                       if ( !hasPendingWrite || !mw.loader.store.enabled ) {
+                                                               return;
                                                        }
+
                                                        mw.loader.store.prune();
+                                                       key = mw.loader.store.getStoreKey();
                                                        try {
                                                                // Replacing the content of the module store might fail if the new
                                                                // contents would exceed the browser's localStorage size limit. To
                                                        } catch ( e ) {
                                                                mw.track( 'resourceloader.exception', { exception: e, source: 'store-localstorage-update' } );
                                                        }
+
+                                                       hasPendingWrite = false;
                                                }
 
                                                return function () {
-                                                       clearTimeout( timer );
-                                                       timer = setTimeout( flush, 2000 );
+                                                       if ( !hasPendingWrite ) {
+                                                               hasPendingWrite = true;
+                                                               mw.requestIdleCallback( flushWrites );
+                                                       }
                                                };
                                        }() )
                                }
                                 * Create an HTML element string, with safe escaping.
                                 *
                                 * @param {string} name The tag name.
-                                * @param {Object} attrs An object with members mapping element names to values
-                                * @param {Mixed} contents The contents of the element. May be either:
+                                * @param {Object} [attrs] An object with members mapping element names to values
+                                * @param {string|mw.html.Raw|mw.html.Cdata|null} [contents=null] The contents of the element.
                                 *
-                                *  - string: The string is escaped.
-                                *  - null or undefined: The short closing form is used, e.g. `<br/>`.
-                                *  - this.Raw: The value attribute is included without escaping.
-                                *  - this.Cdata: The value attribute is included, and an exception is
-                                *    thrown if it contains an illegal ETAGO delimiter.
-                                *    See <http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.3.2>.
+                                *  - string: Text to be escaped.
+                                *  - null: The element is treated as void with short closing form, e.g. `<br/>`.
+                                *  - this.Raw: The raw value is directly included.
+                                *  - this.Cdata: The raw value is directly included. An exception is
+                                *    thrown if it contains any illegal ETAGO delimiter.
+                                *    See <http://www.w3.org/TR/html401/appendix/notes.html#h-B.3.2>.
                                 * @return {string} HTML
                                 */
                                element: function ( name, attrs, contents ) {
                                        var v, attrName, s = '<' + name;
 
-                                       for ( attrName in attrs ) {
-                                               v = attrs[ attrName ];
-                                               // Convert name=true, to name=name
-                                               if ( v === true ) {
-                                                       v = attrName;
-                                               // Skip name=false
-                                               } else if ( v === false ) {
-                                                       continue;
+                                       if ( attrs ) {
+                                               for ( attrName in attrs ) {
+                                                       v = attrs[ attrName ];
+                                                       // Convert name=true, to name=name
+                                                       if ( v === true ) {
+                                                               v = attrName;
+                                                       // Skip name=false
+                                                       } else if ( v === false ) {
+                                                               continue;
+                                                       }
+                                                       s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
                                                }
-                                               s += ' ' + attrName + '="' + this.escape( String( v ) ) + '"';
                                        }
                                        if ( contents === undefined || contents === null ) {
                                                // Self close tag
index 82ccd4f..188af6a 100644 (file)
@@ -5,6 +5,8 @@
        width: 20em;
        line-height: 1.35;
        z-index: 10000;
+       /* Avoid horizontal scrollbar on fade in and on fade out */
+       overflow: hidden;
 }
 
 .mw-notification {
index 3f7b8fd..36b45f1 100644 (file)
         * The underscore in the name is to avoid a bug <https://github.com/senchalabs/jsduck/issues/304>.
         * It is not part of the actual class name.
         *
+        * The constructor is not publicly accessible; use mw.notification#notify instead.
+        * This does not insert anything into the document (see #start).
+        *
         * @class mw.Notification_
         * @alternateClassName mw.Notification
-        *
-        * @constructor The constructor is not publicly accessible; use mw.notification#notify instead.
-        *  This does not insert anything into the document (see #start).
+        * @constructor
         * @private
         */
        function Notification( message, options ) {
diff --git a/resources/src/mediawiki/mediawiki.raggett.css b/resources/src/mediawiki/mediawiki.raggett.css
new file mode 100644 (file)
index 0000000..1e1e973
--- /dev/null
@@ -0,0 +1,3 @@
+.mw-empty-li {
+       display: none;
+}
diff --git a/resources/src/mediawiki/mediawiki.requestIdleCallback.js b/resources/src/mediawiki/mediawiki.requestIdleCallback.js
new file mode 100644 (file)
index 0000000..796639f
--- /dev/null
@@ -0,0 +1,50 @@
+/*!
+ * An interface for scheduling background tasks.
+ *
+ * Loosely based on https://w3c.github.io/requestidlecallback/
+ */
+( function ( mw, $ ) {
+       var tasks = [],
+               maxIdleDuration = 50,
+               timeout = null;
+
+       function schedule( trigger ) {
+               clearTimeout( timeout );
+               timeout = setTimeout( trigger, 700 );
+       }
+
+       function triggerIdle() {
+               var elapsed,
+                       start = mw.now();
+
+               while ( tasks.length ) {
+                       elapsed = mw.now() - start;
+                       if ( elapsed < maxIdleDuration ) {
+                               tasks.shift().callback();
+                       } else {
+                               // Idle moment expired, try again later
+                               schedule( triggerIdle );
+                               break;
+                       }
+               }
+       }
+
+       mw.requestIdleCallbackInternal = function ( callback ) {
+               var task = { callback: callback };
+               tasks.push( task );
+
+               $( function () { schedule( triggerIdle ); } );
+       };
+
+       /**
+        * Schedule a deferred task to run in the background.
+        *
+        * @member mw
+        * @param {Function} callback
+        */
+       mw.requestIdleCallback = window.requestIdleCallback
+               ? function ( callback ) {
+                       window.requestIdleCallback( callback );
+               }
+               : mw.requestIdleCallbackInternal;
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki/mediawiki.toc.css b/resources/src/mediawiki/mediawiki.toc.css
new file mode 100644 (file)
index 0000000..835a451
--- /dev/null
@@ -0,0 +1,11 @@
+.tochidden,
+.toctoggle {
+       -moz-user-select: none;
+       -webkit-user-select: none;
+       -ms-user-select: none;
+       user-select: none;
+}
+
+.toctoggle {
+       font-size: 94%;
+}
diff --git a/resources/src/mediawiki/mediawiki.toc.print.css b/resources/src/mediawiki/mediawiki.toc.print.css
new file mode 100644 (file)
index 0000000..da2c08f
--- /dev/null
@@ -0,0 +1,4 @@
+#toc.tochidden,
+.toctoggle {
+       display: none;
+}
index b4baa66..d2f2abd 100644 (file)
@@ -4,41 +4,20 @@
  */
 ( function ( mw, $ ) {
        var i,
-               deferreds = {},
+               userInfoPromise,
                byteToHex = [];
 
        /**
         * Get the current user's groups or rights
         *
         * @private
-        * @param {string} info One of 'groups' or 'rights'
         * @return {jQuery.Promise}
         */
-       function getUserInfo( info ) {
-               var api;
-               if ( !deferreds[ info ] ) {
-
-                       deferreds.rights = $.Deferred();
-                       deferreds.groups = $.Deferred();
-
-                       api = new mw.Api();
-                       api.get( {
-                               action: 'query',
-                               meta: 'userinfo',
-                               uiprop: 'rights|groups'
-                       } ).always( function ( data ) {
-                               var rights, groups;
-                               if ( data.query && data.query.userinfo ) {
-                                       rights = data.query.userinfo.rights;
-                                       groups = data.query.userinfo.groups;
-                               }
-                               deferreds.rights.resolve( rights || [] );
-                               deferreds.groups.resolve( groups || [] );
-                       } );
-
+       function getUserInfo() {
+               if ( !userInfoPromise ) {
+                       userInfoPromise = new mw.Api().getUserInfo();
                }
-
-               return deferreds[ info ].promise();
+               return userInfoPromise;
        }
 
        // Map from numbers 0-255 to a hex string (with padding)
                 * @return {jQuery.Promise}
                 */
                getGroups: function ( callback ) {
-                       return getUserInfo( 'groups' ).done( callback );
+                       return getUserInfo().then(
+                               function ( userInfo ) { return userInfo.groups; },
+                               function () { return []; }
+                       ).done( callback );
                },
 
                /**
                 * @return {jQuery.Promise}
                 */
                getRights: function ( callback ) {
-                       return getUserInfo( 'rights' ).done( callback );
+                       return getUserInfo().then(
+                               function ( userInfo ) { return userInfo.rights; },
+                               function () { return []; }
+                       ).done( callback );
                }
        } );
 
index dfccf21..79937e5 100644 (file)
@@ -25,7 +25,7 @@
                        rows = [],
                        $gallery = $( this );
 
-               $gallery.children( 'li' ).each( function () {
+               $gallery.children( 'li.gallerybox' ).each( function () {
                        // Math.floor to be paranoid if things are off by 0.00000000001
                        var top = Math.floor( $( this ).position().top ),
                                $this = $( this );
        }
 
        function handleResizeStart() {
-               $galleries.children( 'li' ).each( function () {
+               $galleries.children( 'li.gallerybox' ).each( function () {
                        var imgWidth = $( this ).data( 'imgWidth' ),
                                imgHeight = $( this ).data( 'imgHeight' ),
                                width = $( this ).data( 'width' ),
index d858b62..a097b17 100644 (file)
        }
 
        $( function () {
-               if ( mw.config.get( 'wgNamespaceNumber' ) !== 6 ) {
+               if ( mw.config.get( 'wgCanonicalNamespace' ) !== 'File' ) {
                        return;
                }
                $multipageimage = $( 'table.multipageimage' );
index 708dcb5..f2509e2 100644 (file)
                 *   root)
                 */
                mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
+
+               var $diff = $( 'table.diff' );
+               if ( $diff.length ) {
+                       /**
+                        * Fired when the diff is added to a page containing a diff
+                        *
+                        * Similar to the {@link mw.hook#event-wikipage_content wikipage.content hook}
+                        * $diff may still be detached when the hook is fired.
+                        *
+                        * @event wikipage_diff
+                        * @member mw.hook
+                        * @param {jQuery} $diff The root element of the MediaWiki diff (`table.diff`).
+                        */
+                       mw.hook( 'wikipage.diff' ).fire( $diff.eq( 0 ) );
+               }
        } );
 
 }( mediaWiki, jQuery ) );
diff --git a/resources/src/oojs-ui-local.js b/resources/src/oojs-ui-local.js
new file mode 100644 (file)
index 0000000..84ec92d
--- /dev/null
@@ -0,0 +1,5 @@
+// Connect OOjs UI to MediaWiki's localisation system
+( function ( mw ) {
+       OO.ui.getUserLanguages = mw.language.getFallbackLanguageChain;
+       OO.ui.msg = mw.msg;
+}( mediaWiki ) );
diff --git a/serialized/commonpasswords.cdb b/serialized/commonpasswords.cdb
new file mode 100644 (file)
index 0000000..7b7b043
Binary files /dev/null and b/serialized/commonpasswords.cdb differ
index 093748d..1c48515 100644 (file)
@@ -77,9 +77,6 @@ $wgAutoloadClasses += array(
        'WikitextContentTest' => "$testDir/phpunit/includes/content/WikitextContentTest.php",
 
        # tests/phpunit/includes/db
-       'ORMRowTest' => "$testDir/phpunit/includes/db/ORMRowTest.php",
-       'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
-       'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
        'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
 
        # tests/phpunit/includes/diff
index b2232e6..35eb153 100644 (file)
 #   bundle exec cucumber
 #
 mw-vagrant-host: &default
+  user_factory: true
   mediawiki_url: http://127.0.0.1:8080/wiki/
-  mediawiki_user: Selenium_user
-  mediawiki_password: vagrant
 
 mw-vagrant-guest:
+  user_factory: true
   mediawiki_url: http://127.0.0.1/wiki/
-  mediawiki_user: Selenium_user
-  mediawiki_password: vagrant
 
 beta:
   mediawiki_url: http://en.wikipedia.beta.wmflabs.org/wiki/
@@ -34,4 +32,8 @@ test2:
   mediawiki_user: Selenium_user
   # mediawiki_password: SET THIS IN THE ENVIRONMENT!
 
+integration:
+  user_factory: true
+  # mediawiki_url: THIS WILL BE SET BY JENKINS
+
 default: *default
index 5eff4ce..c1072b2 100644 (file)
@@ -1,4 +1,3 @@
-require 'mediawiki_selenium'
-
-require 'mediawiki_selenium/support'
+require 'mediawiki_selenium/cucumber'
+require 'mediawiki_selenium/pages'
 require 'mediawiki_selenium/step_definitions'
index 005ade5..b91a5bc 100644 (file)
@@ -964,7 +964,7 @@ class ParserTest {
                        'site_stats', 'ipblocks', 'image', 'oldimage',
                        'recentchanges', 'watchlist', 'interwiki', 'logging',
                        'querycache', 'objectcache', 'job', 'l10n_cache', 'redirect', 'querycachetwo',
-                       'archive', 'user_groups', 'page_props', 'category', 'msg_resource', 'msg_resource_links'
+                       'archive', 'user_groups', 'page_props', 'category'
                );
 
                if ( in_array( $this->db->getType(), array( 'mysql', 'sqlite', 'oracle' ) ) ) {
@@ -1054,7 +1054,7 @@ class ParserTest {
                        'media_type' => MEDIATYPE_BITMAP,
                        'mime' => 'image/jpeg',
                        'metadata' => serialize( array() ),
-                       'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
+                       'sha1' => Wikimedia\base_convert( '1', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123500' ), $user );
 
@@ -1068,7 +1068,7 @@ class ParserTest {
                        'media_type' => MEDIATYPE_BITMAP,
                        'mime' => 'image/png',
                        'metadata' => serialize( array() ),
-                       'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+                       'sha1' => Wikimedia\base_convert( '2', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20130225203040' ), $user );
 
@@ -1081,7 +1081,7 @@ class ParserTest {
                                'media_type'  => MEDIATYPE_DRAWING,
                                'mime'        => 'image/svg+xml',
                                'metadata'    => serialize( array() ),
-                               'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+                               'sha1'        => Wikimedia\base_convert( '', 16, 36, 31 ),
                                'fileExists'  => true
                ), $this->db->timestamp( '20010115123500' ), $user );
 
@@ -1095,7 +1095,7 @@ class ParserTest {
                        'media_type' => MEDIATYPE_BITMAP,
                        'mime' => 'image/jpeg',
                        'metadata' => serialize( array() ),
-                       'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
+                       'sha1' => Wikimedia\base_convert( '3', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123500' ), $user );
 
@@ -1134,7 +1134,7 @@ class ParserTest {
 </OBJECT>
 </BODY>
 </DjVuXML>',
-                       'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                       'sha1' => Wikimedia\base_convert( '', 16, 36, 31 ),
                        'fileExists' => true
                ), $this->db->timestamp( '20010115123600' ), $user );
        }
index f245826..c456fcb 100644 (file)
@@ -14,9 +14,8 @@
 # Plus any combination of these:
 #
 # cat           add category links
-#               (ignored by Parsoid, since it emits <link>s)
 # ill           add inter-language links
-#               (ignored by Parsoid, since it emits <links>s)
+#               (ignored by Parsoid, since it emits <link>s)
 # subpage       enable subpages (disabled by default)
 # noxml         don't check for XML well-formedness
 # title=[[XXX]] run test using article title XXX
@@ -3330,18 +3329,14 @@ parsoid=wt2html,wt2wt
 <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":" [[Category:foo]]"}},"i":0}}]}'> </span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1"> <!-- No pre&#x2D;wrapping -->
 !! end
 
-## We used to, but no longer wt2wt this test since the default serializer
-## will normalize all categories to serialize on their own line.
-## This wikitext usage is going to be fairly uncommon in production and
-## selser will take care of preserving formatting in those scenarios.
 !! test
 7b. Indent-pre and category links
 !! options
-parsoid=wt2html
+parsoid=wt2html,wt2wt
 !! wikitext
  [[Category:foo]] a
  [[Category:foo]] {{echo|b}}
-!! html/parsoid
+!! html
 <pre><link rel="mw:PageProp/Category" href="./Category:Foo"> a
  <link rel="mw:PageProp/Category" href="./Category:Foo"> <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"b"}},"i":0}}]}'>b</span></pre>
 !! end
@@ -10865,14 +10860,8 @@ Un-closed <includeonly>
 !! html
 !! end
 
-## We used to, but no longer wt2wt this test since the default serializer
-## will normalize the include directives to serialize on their own line.
-## Selser will take care of preserving formatting in scenarios where they
-## intermingled with other wikitext.
 !! test
 Includes and comments at SOL
-!! options
-parsoid=wt2html,html2html
 !! wikitext
 <!-- comment --><noinclude><!-- comment --></noinclude><!-- comment -->== hu ==
 
@@ -11053,14 +11042,10 @@ parsoid=wt2html,wt2wt
 </tbody></table>
 !!end
 
-## We used to, but no longer wt2wt this test since the default serializer
-## will normalize the include directives to serialize on their own line.
-## Selser will take care of preserving formatting in scenarios where they
-## intermingled with other wikitext.
 !!test
 2. Table tag in SOL posn. should get reparsed correctly with valid TSR
 !!options
-parsoid=wt2html
+parsoid=wt2html,wt2wt
 !!wikitext
 <includeonly>a</includeonly>{| {{{b}}}
 |c
@@ -14275,22 +14260,15 @@ pst
 [[Category:Foo (bar)|Foo]]
 !! end
 
-## We used to, but no longer wt2wt this test since the default serializer
-## will normalize all categories to serialize on their own line.
-## This wikitext usage is going to be fairly uncommon in production and
-## selser will take care of preserving formatting in those scenarios.
 !! test
 Category with link tail
 !! options
 cat
 pst
-parsoid=wt2html
 !! wikitext
 123[[Category:Foo]]456
-!! html/php
+!! html
 123[[Category:Foo]]456
-!! html/parsoid
-<p>123<link rel="mw:PageProp/Category" href="Category:Foo"/>456</p>
 !! end
 
 !! test
@@ -14326,14 +14304,8 @@ pst
 [[Category:{{echo|Foo}}|{{echo|Bar}}]]
 !! end
 
-## We used to, but no longer wt2wt this test since the default serializer
-## will normalize all categories to serialize on their own line.
-## This wikitext usage is going to be fairly uncommon in production and
-## selser will take care of preserving formatting in those scenarios.
 !! test
 Category / paragraph interactions
-!! options
-parsoid=wt2html
 !! wikitext
 Foo [[Category:Baz]] Bar
 
@@ -14360,7 +14332,7 @@ Bar
 [[Category:Baz]]
  {{echo|[[Category:Baz]]}}
 [[Category:Baz]]
-!! html/php
+!! html
 <p>Foo Bar
 </p><p>Foo
 Bar
@@ -14370,32 +14342,20 @@ Bar
 </p><p>Foo
 Bar
 </p>
-!! html/parsoid
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar</p>
-<p>Foo <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> Bar <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz"/> <link rel="mw:PageProp/Category" href="Category:Baz" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"[[Category:Baz]]"}},"i":0}}]}'/></p>
-<link rel="mw:PageProp/Category" href="Category:Baz"/>
 !! end
 
-## We used to, but no longer wt2wt this test since the default serializer
-## will normalize all categories to serialize on their own line.
-## This wikitext usage is going to be fairly uncommon in production and
-## selser will take care of preserving formatting in those scenarios.
-##
 ## The whitespace on the empty line is part of the test. Please do not delete
 !! test
 1. Categories and newlines: All preceding newlines should be suppressed (courtesy bug 87)
 !! options
-parsoid=wt2html
+parsoid=wt2html,wt2wt
 !! wikitext
 This
    
 [[Category:Foo]] and this should be part of same paragraph (not an indent-pre)
    
 {{echo|[[Category:Foo]] and so should this!}}
-!! html/php
+!! html
 <p>This and this should be part of same paragraph (not an indent-pre) and so should this!
 </p>
 !! html/parsoid
@@ -14493,14 +14453,8 @@ parsoid=wt2html
 <link rel="mw:PageProp/Category" href="./Category:Foo" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/>
 !! end
 
-## We used to, but no longer wt2wt this test since the default serializer
-## will normalize all categories to serialize on their own line.
-## This wikitext usage is going to be fairly uncommon in production and
-## selser will take care of preserving formatting in those scenarios.
 !! test
 6. Categories and newlines: migrateTrailingCategories dom pass should not migrate categories not preceded by newlines
-!! options
-parsoid=wt2html
 !! wikitext
 * a [[Category:Foo]]
 !! html/parsoid
@@ -14516,7 +14470,7 @@ parsoid=wt2html
 * {{echo|a
 [[Category:Foo]]}}
 !! html/parsoid
-<ul><li> <span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n[[Category:Foo]]"}},"i":0}}]}'>a</span><span about="#mwt1">
+<ul><li> <span about="#mwt1" typeof="mw:Transclusion" data-parsoid='{"pi":[[{"k":"1","spc":["","","",""]}]]}' data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"a\n[[Category:Foo]]"}},"i":0}}]}'>a
 </span><link rel="mw:PageProp/Category" href="./Category:Foo" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Category:Foo"},"sa":{"href":"Category:Foo"}}'/></li></ul>
 !! end
 
@@ -14551,20 +14505,13 @@ parsoid
 </p>
 !! end
 
-# We used to, but no longer wt2wt this test since the default serializer
-# will normalize all categories to serialize on their own line.
-# This wikitext usage is going to be fairly uncommon in production and
-# selser will take care of preventing whitespace insertion if this
-# occurs in an article.
-#
-# html2html disabled for the same reason (whitespace insertion between
-# x and y).
-#
-# html2wt disabled because it localizes the "Category" namespace.
+# html2wt localizes the "Category" namespace.
+# XXX the <link> element needs an empty data-parsoid attribute, or
+# else the html2html test fails because spaces are inserted.
 !! test
 Link prefix/suffixes aren't applied to category links
 !! options
-parsoid=wt2html
+parsoid=wt2html,wt2wt,html2html
 language=is
 !! wikitext
 x[[Category:Foo]]y
@@ -17173,8 +17120,8 @@ Special page transclusion
 !! wikitext
 {{Special:Prefixindex/Xyzzyx}}
 !! html
-<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
-</ul></div>
+<ul class="mw-prefixindex-list"><li><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></li>
+</ul>
 
 !! end
 
@@ -17185,10 +17132,10 @@ Special page transclusion twice (bug 5021)
 {{Special:Prefixindex/Xyzzyx}}
 {{Special:Prefixindex/Xyzzyx}}
 !! html
-<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
-</ul></div>
-<div class="mw-prefixindex-body"><ul class="mw-prefixindex-list"><li> <a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a> </li>
-</ul></div>
+<ul class="mw-prefixindex-list"><li><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></li>
+</ul>
+<ul class="mw-prefixindex-list"><li><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></li>
+</ul>
 
 !! end
 
@@ -19264,25 +19211,17 @@ Category:分類
 blah
 !! endarticle
 
-## We used to, but no longer wt2wt this test since the default serializer
-## will normalize all categories to serialize on their own line.
-## This wikitext usage is going to be fairly uncommon in production and
-## selser will take care of preserving formatting in those scenarios.
 !! test
 Don't convert blue categorylinks to another variant (bug 33210)
 !! options
-cat
-language=zh
-parsoid=wt2html
+language=zh cat
 !! wikitext
 [[A]][[Category:分类]]
-!! html/php
+!! html
 <a href="/wiki/Category:%E5%88%86%E7%B1%BB" title="Category:分类">分类</a>
-!! html/parsoid
-<p><a rel="mw:WikiLink" href="A" title="A">A</a></p>
-<link rel="mw:PageProp/Category" href="Category:分类"/>
 !! end
 
+
 !! test
 Stripping -{}- tags (language variants)
 !! options
@@ -23281,7 +23220,7 @@ parsoid=html2wt
 <p>this is not a link: http://example.com
 </p>
 !! wikitext
-<nowiki>this is not a link: http://example.com</nowiki>
+this is not a link: <nowiki>http://example.com</nowiki>
 !! end
 
 !! test
@@ -23626,8 +23565,7 @@ parsoid=html2wt
 
  __TOC__ foo
 
-__TOC__
- bar
+__TOC__ bar
 !! end
 
 #### --------------- HTML tags ---------------
@@ -25433,7 +25371,7 @@ parsoid=html2wt
 !! html/parsoid
 <p>http://example.com is not a link.</p>
 !! wikitext
-<nowiki>http://example.com is not a link.</nowiki>
+<nowiki>http://example.com</nowiki> is not a link.
 !! end
 
 !! test
@@ -25443,7 +25381,7 @@ parsoid=html2wt
 !! html/parsoid
 <p><a rel="mw:ExtLink" href="http://example.com">http://example.com</a> http://example.com is not a link.</p>
 !! wikitext
-http://example.com<nowiki> http://example.com is not a link.</nowiki>
+http://example.com <nowiki>http://example.com</nowiki> is not a link.
 !! end
 
 !! test
@@ -25686,26 +25624,6 @@ parsoid=html2wt
 # Tests spec'ing wikitext serialization norms |
 # --------------------------------------------
 
-!! test
-1. Categories should always be serialized on their own line
-!! options
-parsoid=html2wt
-!! html/parsoid
-foo<link rel="mw:PageProp/Category" href="./Category:Foo">bar
-!! wikitext
-foo
-[[Category:Foo]]
-bar
-!! end
-
-!! test
-2. Categories that are part of templates should not introduce a line break
-!! wikitext
-foo {{echo|<span>bar</span> [[Category:baz]]}} bar
-!! html/parsoid
-<p>foo <span about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"&lt;span>bar&lt;/span> [[Category:baz]]"}},"i":0}}]}'>bar</span><span about="#mwt1"> </span><link rel="mw:PageProp/Category" href="./Category:Baz" about="#mwt1" data-parsoid='{"stx":"simple","a":{"href":"./Category:Baz"},"sa":{"href":"Category:baz"}}'/> bar</p>
-!! end
-
 !! test
 Lists: Add space after bullets
 !! options
@@ -26405,3 +26323,28 @@ B <ref group="X" name="b" />
 <ref name="b"><span id="Z">foo</span>bar</ref>
 </references>
 !! end
+
+!! test
+Empty LI (T49673)
+!! wikitext
+* a
+* 
+*
+* b
+!! html/php+tidy
+<ul>
+<li>a</li>
+<li class="mw-empty-li"></li>
+<li class="mw-empty-li"></li>
+<li>b</li>
+</ul>
+!! end
+
+!! test
+reserved data attributes stripped
+!! wikitext
+<div data-mw="foo" data-parsoid="bar" data-mw-someext="baz" data-ok="fred" data-ooui="xyzzy">d</div>
+!! html
+<div data-ok="fred">d</div>
+
+!! end
index 9e4a984..fc2f743 100644 (file)
@@ -520,10 +520,17 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @since 1.21
         */
        public static function teardownTestDB() {
+               global $wgJobClasses;
+
                if ( !self::$dbSetup ) {
                        return;
                }
 
+               foreach ( $wgJobClasses as $type => $class ) {
+                       // Delete any jobs under the clone DB (or old prefix in other stores)
+                       JobQueueGroup::singleton()->get( $type )->delete();
+               }
+
                CloneDatabase::changePrefix( self::$oldTablePrefix );
 
                self::$oldTablePrefix = false;
index 325b20e..1863929 100644 (file)
@@ -13,7 +13,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
                                'modules' => 'startup',
                                'only' => 'scripts',
                                'skin' => 'vector',
-                               'target' => 'test',
+                               'target' => 'phpunit',
                ) );
                $ctx = $this->getMockBuilder( 'ResourceLoaderContext' )
                        ->setConstructorArgs( array( $resourceLoader, $request ) )
@@ -60,6 +60,7 @@ abstract class ResourceLoaderTestCase extends MediaWikiTestCase {
 /* Stubs */
 
 class ResourceLoaderTestModule extends ResourceLoaderModule {
+       protected $messages = array();
        protected $dependencies = array();
        protected $group = null;
        protected $source = 'local';
@@ -67,7 +68,7 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        protected $styles = '';
        protected $skipFunction = null;
        protected $isRaw = false;
-       protected $targets = array( 'test' );
+       protected $targets = array( 'phpunit' );
 
        public function __construct( $options = array() ) {
                foreach ( $options as $key => $value ) {
@@ -83,6 +84,10 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
                return array( '' => $this->styles );
        }
 
+       public function getMessages() {
+               return $this->messages;
+       }
+
        public function getDependencies( ResourceLoaderContext $context = null ) {
                return $this->dependencies;
        }
index e69fa20..2a2b603 100644 (file)
@@ -136,8 +136,9 @@ class BlockTest extends MediaWikiLangTestCase {
        public function testBlockedUserCanNotCreateAccount() {
                $username = 'BlockedUserToCreateAccountWith';
                $u = User::newFromName( $username );
-               $u->setId( 14146 );
                $u->addToDatabase();
+               $userId = $u->getId();
+               $this->assertNotEquals( 0, $userId, 'sanity' );
                TestUser::setPasswordForUser( $u, 'NotRandomPass' );
                unset( $u );
 
@@ -157,7 +158,7 @@ class BlockTest extends MediaWikiLangTestCase {
                // Foreign perspective (blockee not on current wiki)...
                $blockOptions = array(
                        'address' => $username,
-                       'user' => 14146,
+                       'user' => $userId,
                        'reason' => 'crosswiki block...',
                        'timestamp' => wfTimestampNow(),
                        'expiry' => $this->db->getInfinity(),
@@ -205,13 +206,13 @@ class BlockTest extends MediaWikiLangTestCase {
                // Local perspective (blockee on current wiki)...
                $user = User::newFromName( 'UserOnForeignWiki' );
                $user->addToDatabase();
-               // Set user ID to match the test value
-               $this->db->update( 'user', array( 'user_id' => 14146 ), array( 'user_id' => $user->getId() ) );
+               $userId = $user->getId();
+               $this->assertNotEquals( 0, $userId, 'sanity' );
 
                // Foreign perspective (blockee not on current wiki)...
                $blockOptions = array(
                        'address' => 'UserOnForeignWiki',
-                       'user' => 14146,
+                       'user' => $user->getId(),
                        'reason' => 'crosswiki block...',
                        'timestamp' => wfTimestampNow(),
                        'expiry' => $this->db->getInfinity(),
@@ -234,7 +235,7 @@ class BlockTest extends MediaWikiLangTestCase {
                        $block->getTarget()->getName(),
                        'Correct blockee name'
                );
-               $this->assertEquals( '14146', $block->getTarget()->getId(), 'Correct blockee id' );
+               $this->assertEquals( $userId, $block->getTarget()->getId(), 'Correct blockee id' );
                $this->assertEquals( 'MetaWikiUser', $block->getBlocker(), 'Correct blocker name' );
                $this->assertEquals( 'MetaWikiUser', $block->getByName(), 'Correct blocker name' );
                $this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
index e28a92c..786e05d 100644 (file)
@@ -10,7 +10,6 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
 
                if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
                        $this->markTestSkipped( 'The version of xdiff extension is lower than 1.5.0' );
-
                        return;
                }
        }
@@ -28,7 +27,13 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
                        "Hash of " . addcslashes( $input, "\0..\37!@\@\177..\377" ) );
        }
 
-       public static function provideXdiffAdler32() {
+       public function provideXdiffAdler32() {
+               // Hack non-empty early return since PHPUnit expands this provider before running
+               // the setUp() which marks the test as skipped.
+               if ( !function_exists( 'xdiff_string_rabdiff' ) ) {
+                       return array( array( '', 'Empty string' ) );
+               }
+
                return array(
                        array( '', 'Empty string' ),
                        array( "\0", 'Null' ),
index 7b60fb3..46ec6bc 100644 (file)
@@ -21,7 +21,6 @@ class ExtraParserTest extends MediaWikiTestCase {
                        'wgLanguageCode' => 'en',
                        'wgContLang' => $contLang,
                        'wgLang' => Language::factory( 'en' ),
-                       'wgMemc' => new EmptyBagOStuff,
                        'wgCleanSignatures' => true,
                ) );
 
diff --git a/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php b/tests/phpunit/includes/GlobalFunctions/wfBaseConvertTest.php
deleted file mode 100644 (file)
index 9d55e85..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-<?php
-/**
- * @group GlobalFunctions
- * @covers ::wfBaseConvert
- */
-class WfBaseConvertTest extends MediaWikiTestCase {
-       public static function provideSingleDigitConversions() {
-               return array(
-                       //      2    3    5    8   10   16   36
-                       array( '0', '0', '0', '0', '0', '0', '0' ),
-                       array( '1', '1', '1', '1', '1', '1', '1' ),
-                       array( '10', '2', '2', '2', '2', '2', '2' ),
-                       array( '11', '10', '3', '3', '3', '3', '3' ),
-                       array( '100', '11', '4', '4', '4', '4', '4' ),
-                       array( '101', '12', '10', '5', '5', '5', '5' ),
-                       array( '110', '20', '11', '6', '6', '6', '6' ),
-                       array( '111', '21', '12', '7', '7', '7', '7' ),
-                       array( '1000', '22', '13', '10', '8', '8', '8' ),
-                       array( '1001', '100', '14', '11', '9', '9', '9' ),
-                       array( '1010', '101', '20', '12', '10', 'a', 'a' ),
-                       array( '1011', '102', '21', '13', '11', 'b', 'b' ),
-                       array( '1100', '110', '22', '14', '12', 'c', 'c' ),
-                       array( '1101', '111', '23', '15', '13', 'd', 'd' ),
-                       array( '1110', '112', '24', '16', '14', 'e', 'e' ),
-                       array( '1111', '120', '30', '17', '15', 'f', 'f' ),
-                       array( '10000', '121', '31', '20', '16', '10', 'g' ),
-                       array( '10001', '122', '32', '21', '17', '11', 'h' ),
-                       array( '10010', '200', '33', '22', '18', '12', 'i' ),
-                       array( '10011', '201', '34', '23', '19', '13', 'j' ),
-                       array( '10100', '202', '40', '24', '20', '14', 'k' ),
-                       array( '10101', '210', '41', '25', '21', '15', 'l' ),
-                       array( '10110', '211', '42', '26', '22', '16', 'm' ),
-                       array( '10111', '212', '43', '27', '23', '17', 'n' ),
-                       array( '11000', '220', '44', '30', '24', '18', 'o' ),
-                       array( '11001', '221', '100', '31', '25', '19', 'p' ),
-                       array( '11010', '222', '101', '32', '26', '1a', 'q' ),
-                       array( '11011', '1000', '102', '33', '27', '1b', 'r' ),
-                       array( '11100', '1001', '103', '34', '28', '1c', 's' ),
-                       array( '11101', '1002', '104', '35', '29', '1d', 't' ),
-                       array( '11110', '1010', '110', '36', '30', '1e', 'u' ),
-                       array( '11111', '1011', '111', '37', '31', '1f', 'v' ),
-                       array( '100000', '1012', '112', '40', '32', '20', 'w' ),
-                       array( '100001', '1020', '113', '41', '33', '21', 'x' ),
-                       array( '100010', '1021', '114', '42', '34', '22', 'y' ),
-                       array( '100011', '1022', '120', '43', '35', '23', 'z' )
-               );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase2( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base2, wfBaseConvert( $base3, '3', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base5, '5', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base8, '8', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base10, '10', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base16, '16', '2' ) );
-               $this->assertSame( $base2, wfBaseConvert( $base36, '36', '2' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase3( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base3, wfBaseConvert( $base2, '2', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base5, '5', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base8, '8', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base10, '10', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base16, '16', '3' ) );
-               $this->assertSame( $base3, wfBaseConvert( $base36, '36', '3' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase5( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base5, wfBaseConvert( $base2, '2', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base3, '3', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base8, '8', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base10, '10', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base16, '16', '5' ) );
-               $this->assertSame( $base5, wfBaseConvert( $base36, '36', '5' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase8( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base8, wfBaseConvert( $base2, '2', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base3, '3', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base5, '5', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base10, '10', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base16, '16', '8' ) );
-               $this->assertSame( $base8, wfBaseConvert( $base36, '36', '8' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase10( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base10, wfBaseConvert( $base2, '2', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base3, '3', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base5, '5', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base8, '8', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base16, '16', '10' ) );
-               $this->assertSame( $base10, wfBaseConvert( $base36, '36', '10' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase16( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base16, wfBaseConvert( $base2, '2', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base3, '3', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base5, '5', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base8, '8', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base10, '10', '16' ) );
-               $this->assertSame( $base16, wfBaseConvert( $base36, '36', '16' ) );
-       }
-
-       /**
-        * @dataProvider provideSingleDigitConversions
-        */
-       public function testDigitToBase36( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
-               $this->assertSame( $base36, wfBaseConvert( $base2, '2', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base3, '3', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base5, '5', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base8, '8', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base10, '10', '36' ) );
-               $this->assertSame( $base36, wfBaseConvert( $base16, '16', '36' ) );
-       }
-
-       public function testLargeNumber() {
-               $this->assertSame( '1100110001111010000000101110100', wfBaseConvert( 'sd89ys', 36, 2 ) );
-               $this->assertSame( '11102112120221201101', wfBaseConvert( 'sd89ys', 36, 3 ) );
-               $this->assertSame( '12003102232400', wfBaseConvert( 'sd89ys', 36, 5 ) );
-               $this->assertSame( '14617200564', wfBaseConvert( 'sd89ys', 36, 8 ) );
-               $this->assertSame( '1715274100', wfBaseConvert( 'sd89ys', 36, 10 ) );
-               $this->assertSame( '663d0174', wfBaseConvert( 'sd89ys', 36, 16 ) );
-       }
-
-       public static function provideNumbers() {
-               $x = array();
-               $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
-               for ( $i = 0; $i < 50; $i++ ) {
-                       $base = mt_rand( 2, 36 );
-                       $len = mt_rand( 10, 100 );
-
-                       $str = '';
-                       for ( $j = 0; $j < $len; $j++ ) {
-                               $str .= $chars[mt_rand( 0, $base - 1 )];
-                       }
-
-                       $x[] = array( $base, $str );
-               }
-
-               return $x;
-       }
-
-       /**
-        * @dataProvider provideNumbers
-        */
-       public function testIdentity( $base, $number ) {
-               $this->assertSame( $number, wfBaseConvert( $number, $base, $base, strlen( $number ) ) );
-       }
-
-       public function testInvalid() {
-               $this->assertFalse( wfBaseConvert( '101', 1, 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 1 ) );
-               $this->assertFalse( wfBaseConvert( '101', 37, 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 37 ) );
-               $this->assertFalse( wfBaseConvert( 'abcde', 10, 11 ) );
-               $this->assertFalse( wfBaseConvert( '12930', 2, 10 ) );
-               $this->assertFalse( wfBaseConvert( '101', 'abc', 15 ) );
-               $this->assertFalse( wfBaseConvert( '101', 15, 'abc' ) );
-       }
-
-       public function testPadding() {
-               $number = "10101010101";
-               $this->assertSame(
-                       strlen( $number ) + 5,
-                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) + 5 ) )
-               );
-               $this->assertSame(
-                       strlen( $number ),
-                       strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) )
-               );
-       }
-
-       public function testLeadingZero() {
-               $this->assertSame( '24', wfBaseConvert( '010', 36, 16 ) );
-               $this->assertSame( '37d4', wfBaseConvert( '0b10', 36, 16 ) );
-               $this->assertSame( 'a734', wfBaseConvert( '0x10', 36, 16 ) );
-       }
-}
index 4ce51c6..a5b65f2 100644 (file)
@@ -149,9 +149,6 @@ class WfTimestampTest extends MediaWikiTestCase {
        }
 
        /**
-        * The Resource Loader uses wfTimestamp() to convert timestamps
-        * from If-Modified-Since header. Thus it must be able to parse all
-        * rfc2616 date formats
         * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
         * @dataProvider provideHttpDates
         */
index 8ee2ad5..9c22430 100644 (file)
@@ -9,16 +9,8 @@
  */
 class ImportTest extends MediaWikiLangTestCase {
 
-       private function getInputStreamSource( $xml ) {
-               if ( ini_get( 'allow_url_fopen' ) != 1 ) {
-                       $this->markTestSkipped( 'bug 73283: this test needs allow_url_fopen to be enabled' );
-               }
-               $file = 'data:application/xml,' . $xml;
-               $status = ImportStreamSource::newFromFile( $file );
-               if ( !$status->isGood() ) {
-                       throw new MWException( "Cannot create InputStreamSource." );
-               }
-               return $status->value;
+       private function getDataSource( $xml ) {
+               return new ImportStringSource( $xml );
        }
 
        /**
@@ -28,7 +20,7 @@ class ImportTest extends MediaWikiLangTestCase {
         * @param string|null $redirectTitle
         */
        public function testHandlePageContainsRedirect( $xml, $redirectTitle ) {
-               $source = $this->getInputStreamSource( $xml );
+               $source = $this->getDataSource( $xml );
 
                $redirect = null;
                $callback = function ( Title $title, ForeignTitle $foreignTitle, $revCount,
@@ -114,7 +106,7 @@ EOF
         * @param array|null $namespaces
         */
        public function testSiteInfoContainsNamespaces( $xml, $namespaces ) {
-               $source = $this->getInputStreamSource( $xml );
+               $source = $this->getDataSource( $xml );
 
                $importNamespaces = null;
                $callback = function ( array $siteinfo, $innerImporter ) use ( &$importNamespaces ) {
index 5f21e07..f5ef016 100644 (file)
@@ -375,7 +375,6 @@ class NullMessageBlobStore extends MessageBlobStore {
        }
 
        public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
-               return;
        }
 
        public function updateMessage( $key ) {
index 5841bb6..fe431b6 100644 (file)
@@ -45,36 +45,36 @@ class PreferencesTest extends MediaWikiTestCase {
         * Placeholder to verify bug 34302
         * @covers Preferences::profilePreferences
         */
-       public function testEmailFieldsWhenUserHasNoEmail() {
+       public function testEmailAuthenticationFieldWhenUserHasNoEmail() {
                $prefs = $this->prefsFor( 'noemail' );
                $this->assertArrayHasKey( 'cssclass',
-                       $prefs['emailaddress']
+                       $prefs['emailauthentication']
                );
-               $this->assertEquals( 'mw-email-none', $prefs['emailaddress']['cssclass'] );
+               $this->assertEquals( 'mw-email-none', $prefs['emailauthentication']['cssclass'] );
        }
 
        /**
         * Placeholder to verify bug 34302
         * @covers Preferences::profilePreferences
         */
-       public function testEmailFieldsWhenUserEmailNotAuthenticated() {
+       public function testEmailAuthenticationFieldWhenUserEmailNotAuthenticated() {
                $prefs = $this->prefsFor( 'notauth' );
                $this->assertArrayHasKey( 'cssclass',
-                       $prefs['emailaddress']
+                       $prefs['emailauthentication']
                );
-               $this->assertEquals( 'mw-email-not-authenticated', $prefs['emailaddress']['cssclass'] );
+               $this->assertEquals( 'mw-email-not-authenticated', $prefs['emailauthentication']['cssclass'] );
        }
 
        /**
         * Placeholder to verify bug 34302
         * @covers Preferences::profilePreferences
         */
-       public function testEmailFieldsWhenUserEmailIsAuthenticated() {
+       public function testEmailAuthenticationFieldWhenUserEmailIsAuthenticated() {
                $prefs = $this->prefsFor( 'auth' );
                $this->assertArrayHasKey( 'cssclass',
-                       $prefs['emailaddress']
+                       $prefs['emailauthentication']
                );
-               $this->assertEquals( 'mw-email-authenticated', $prefs['emailaddress']['cssclass'] );
+               $this->assertEquals( 'mw-email-authenticated', $prefs['emailauthentication']['cssclass'] );
        }
 
        /** Helper */
index 3b37f4a..ddef24a 100644 (file)
@@ -12,7 +12,6 @@ class TemplateParserTest extends MediaWikiTestCase {
 
                $this->setMwGlobals( array(
                        'wgSecretKey' => 'foo',
-                       'wgMemc' => new EmptyBagOStuff(),
                ) );
 
                $this->templateDir = dirname( __DIR__ ) . '/data/templates/';
index 1318d10..4dc8350 100644 (file)
@@ -31,7 +31,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $localOffset = date( 'Z' ) / 60;
 
                $this->setMwGlobals( array(
-                       'wgMemc' => new EmptyBagOStuff,
                        'wgContLang' => $langObj,
                        'wgLanguageCode' => 'en',
                        'wgLang' => $langObj,
diff --git a/tests/phpunit/includes/UserArrayFromResultTest.php b/tests/phpunit/includes/UserArrayFromResultTest.php
deleted file mode 100644 (file)
index 469ad29..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-
-/**
- * @author Adam Shorland
- * @covers UserArrayFromResult
- */
-class UserArrayFromResultTest extends MediaWikiTestCase {
-
-       private function getMockResultWrapper( $row = null, $numRows = 1 ) {
-               $resultWrapper = $this->getMockBuilder( 'ResultWrapper' )
-                       ->disableOriginalConstructor();
-
-               $resultWrapper = $resultWrapper->getMock();
-               $resultWrapper->expects( $this->atLeastOnce() )
-                       ->method( 'current' )
-                       ->will( $this->returnValue( $row ) );
-               $resultWrapper->expects( $this->any() )
-                       ->method( 'numRows' )
-                       ->will( $this->returnValue( $numRows ) );
-
-               return $resultWrapper;
-       }
-
-       private function getRowWithUsername( $username = 'fooUser' ) {
-               $row = new stdClass();
-               $row->user_name = $username;
-               return $row;
-       }
-
-       private function getUserArrayFromResult( $resultWrapper ) {
-               return new UserArrayFromResult( $resultWrapper );
-       }
-
-       /**
-        * @covers UserArrayFromResult::__construct
-        */
-       public function testConstructionWithFalseRow() {
-               $row = false;
-               $resultWrapper = $this->getMockResultWrapper( $row );
-
-               $object = $this->getUserArrayFromResult( $resultWrapper );
-
-               $this->assertEquals( $resultWrapper, $object->res );
-               $this->assertSame( 0, $object->key );
-               $this->assertEquals( $row, $object->current );
-       }
-
-       /**
-        * @covers UserArrayFromResult::__construct
-        */
-       public function testConstructionWithRow() {
-               $username = 'addshore';
-               $row = $this->getRowWithUsername( $username );
-               $resultWrapper = $this->getMockResultWrapper( $row );
-
-               $object = $this->getUserArrayFromResult( $resultWrapper );
-
-               $this->assertEquals( $resultWrapper, $object->res );
-               $this->assertSame( 0, $object->key );
-               $this->assertInstanceOf( 'User', $object->current );
-               $this->assertEquals( $username, $object->current->mName );
-       }
-
-       public static function provideNumberOfRows() {
-               return array(
-                       array( 0 ),
-                       array( 1 ),
-                       array( 122 ),
-               );
-       }
-
-       /**
-        * @dataProvider provideNumberOfRows
-        * @covers UserArrayFromResult::count
-        */
-       public function testCountWithVaryingValues( $numRows ) {
-               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper(
-                       $this->getRowWithUsername(),
-                       $numRows
-               ) );
-               $this->assertEquals( $numRows, $object->count() );
-       }
-
-       /**
-        * @covers UserArrayFromResult::current
-        */
-       public function testCurrentAfterConstruction() {
-               $username = 'addshore';
-               $userRow = $this->getRowWithUsername( $username );
-               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper( $userRow ) );
-               $this->assertInstanceOf( 'User', $object->current() );
-               $this->assertEquals( $username, $object->current()->mName );
-       }
-
-       public function provideTestValid() {
-               return array(
-                       array( $this->getRowWithUsername(), true ),
-                       array( false, false ),
-               );
-       }
-
-       /**
-        * @dataProvider provideTestValid
-        * @covers UserArrayFromResult::valid
-        */
-       public function testValid( $input, $expected ) {
-               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper( $input ) );
-               $this->assertEquals( $expected, $object->valid() );
-       }
-
-       // @todo unit test for key()
-       // @todo unit test for next()
-       // @todo unit test for rewind()
-}
diff --git a/tests/phpunit/includes/UserTest.php b/tests/phpunit/includes/UserTest.php
deleted file mode 100644 (file)
index 4c6f083..0000000
+++ /dev/null
@@ -1,534 +0,0 @@
-<?php
-
-define( 'NS_UNITTEST', 5600 );
-define( 'NS_UNITTEST_TALK', 5601 );
-
-/**
- * @group Database
- */
-class UserTest extends MediaWikiTestCase {
-       /**
-        * @var User
-        */
-       protected $user;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->setMwGlobals( array(
-                       'wgGroupPermissions' => array(),
-                       'wgRevokePermissions' => array(),
-               ) );
-
-               $this->setUpPermissionGlobals();
-
-               $this->user = new User;
-               $this->user->addGroup( 'unittesters' );
-       }
-
-       private function setUpPermissionGlobals() {
-               global $wgGroupPermissions, $wgRevokePermissions;
-
-               # Data for regular $wgGroupPermissions test
-               $wgGroupPermissions['unittesters'] = array(
-                       'test' => true,
-                       'runtest' => true,
-                       'writetest' => false,
-                       'nukeworld' => false,
-               );
-               $wgGroupPermissions['testwriters'] = array(
-                       'test' => true,
-                       'writetest' => true,
-                       'modifytest' => true,
-               );
-
-               # Data for regular $wgRevokePermissions test
-               $wgRevokePermissions['formertesters'] = array(
-                       'runtest' => true,
-               );
-
-               # For the options test
-               $wgGroupPermissions['*'] = array(
-                       'editmyoptions' => true,
-               );
-       }
-
-       /**
-        * @covers User::getGroupPermissions
-        */
-       public function testGroupPermissions() {
-               $rights = User::getGroupPermissions( array( 'unittesters' ) );
-               $this->assertContains( 'runtest', $rights );
-               $this->assertNotContains( 'writetest', $rights );
-               $this->assertNotContains( 'modifytest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-
-               $rights = User::getGroupPermissions( array( 'unittesters', 'testwriters' ) );
-               $this->assertContains( 'runtest', $rights );
-               $this->assertContains( 'writetest', $rights );
-               $this->assertContains( 'modifytest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-       }
-
-       /**
-        * @covers User::getGroupPermissions
-        */
-       public function testRevokePermissions() {
-               $rights = User::getGroupPermissions( array( 'unittesters', 'formertesters' ) );
-               $this->assertNotContains( 'runtest', $rights );
-               $this->assertNotContains( 'writetest', $rights );
-               $this->assertNotContains( 'modifytest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-       }
-
-       /**
-        * @covers User::getRights
-        */
-       public function testUserPermissions() {
-               $rights = $this->user->getRights();
-               $this->assertContains( 'runtest', $rights );
-               $this->assertNotContains( 'writetest', $rights );
-               $this->assertNotContains( 'modifytest', $rights );
-               $this->assertNotContains( 'nukeworld', $rights );
-       }
-
-       /**
-        * @dataProvider provideGetGroupsWithPermission
-        * @covers User::getGroupsWithPermission
-        */
-       public function testGetGroupsWithPermission( $expected, $right ) {
-               $result = User::getGroupsWithPermission( $right );
-               sort( $result );
-               sort( $expected );
-
-               $this->assertEquals( $expected, $result, "Groups with permission $right" );
-       }
-
-       public static function provideGetGroupsWithPermission() {
-               return array(
-                       array(
-                               array( 'unittesters', 'testwriters' ),
-                               'test'
-                       ),
-                       array(
-                               array( 'unittesters' ),
-                               'runtest'
-                       ),
-                       array(
-                               array( 'testwriters' ),
-                               'writetest'
-                       ),
-                       array(
-                               array( 'testwriters' ),
-                               'modifytest'
-                       ),
-               );
-       }
-
-       /**
-        * @dataProvider provideIPs
-        * @covers User::isIP
-        */
-       public function testIsIP( $value, $result, $message ) {
-               $this->assertEquals( $this->user->isIP( $value ), $result, $message );
-       }
-
-       public static function provideIPs() {
-               return array(
-                       array( '', false, 'Empty string' ),
-                       array( ' ', false, 'Blank space' ),
-                       array( '10.0.0.0', true, 'IPv4 private 10/8' ),
-                       array( '10.255.255.255', true, 'IPv4 private 10/8' ),
-                       array( '192.168.1.1', true, 'IPv4 private 192.168/16' ),
-                       array( '203.0.113.0', true, 'IPv4 example' ),
-                       array( '2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff', true, 'IPv6 example' ),
-                       // Not valid IPs but classified as such by MediaWiki for negated asserting
-                       // of whether this might be the identifier of a logged-out user or whether
-                       // to allow usernames like it.
-                       array( '300.300.300.300', true, 'Looks too much like an IPv4 address' ),
-                       array( '203.0.113.xxx', true, 'Assigned by UseMod to cloaked logged-out users' ),
-               );
-       }
-
-       /**
-        * @dataProvider provideUserNames
-        * @covers User::isValidUserName
-        */
-       public function testIsValidUserName( $username, $result, $message ) {
-               $this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
-       }
-
-       public static function provideUserNames() {
-               return array(
-                       array( '', false, 'Empty string' ),
-                       array( ' ', false, 'Blank space' ),
-                       array( 'abcd', false, 'Starts with small letter' ),
-                       array( 'Ab/cd', false, 'Contains slash' ),
-                       array( 'Ab cd', true, 'Whitespace' ),
-                       array( '192.168.1.1', false, 'IP' ),
-                       array( 'User:Abcd', false, 'Reserved Namespace' ),
-                       array( '12abcd232', true, 'Starts with Numbers' ),
-                       array( '?abcd', true, 'Start with ? mark' ),
-                       array( '#abcd', false, 'Start with #' ),
-                       array( 'Abcdകഖഗഘ', true, ' Mixed scripts' ),
-                       array( 'ജോസ്‌തോമസ്', false, 'ZWNJ- Format control character' ),
-                       array( 'Ab cd', false, ' Ideographic space' ),
-                       array( '300.300.300.300', false, 'Looks too much like an IPv4 address' ),
-                       array( '302.113.311.900', false, 'Looks too much like an IPv4 address' ),
-                       array( '203.0.113.xxx', false, 'Reserved for usage by UseMod for cloaked logged-out users' ),
-               );
-       }
-
-       /**
-        * Test, if for all rights a right- message exist,
-        * which is used on Special:ListGroupRights as help text
-        * Extensions and core
-        */
-       public function testAllRightsWithMessage() {
-               // Getting all user rights, for core: User::$mCoreRights, for extensions: $wgAvailableRights
-               $allRights = User::getAllRights();
-               $allMessageKeys = Language::getMessageKeysFor( 'en' );
-
-               $rightsWithMessage = array();
-               foreach ( $allMessageKeys as $message ) {
-                       // === 0: must be at beginning of string (position 0)
-                       if ( strpos( $message, 'right-' ) === 0 ) {
-                               $rightsWithMessage[] = substr( $message, strlen( 'right-' ) );
-                       }
-               }
-
-               sort( $allRights );
-               sort( $rightsWithMessage );
-
-               $this->assertEquals(
-                       $allRights,
-                       $rightsWithMessage,
-                       'Each user rights (core/extensions) has a corresponding right- message.'
-               );
-       }
-
-       /**
-        * Test User::editCount
-        * @group medium
-        * @covers User::getEditCount
-        */
-       public function testEditCount() {
-               $user = User::newFromName( 'UnitTestUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               // let the user have a few (3) edits
-               $page = WikiPage::factory( Title::newFromText( 'Help:UserTest_EditCount' ) );
-               for ( $i = 0; $i < 3; $i++ ) {
-                       $page->doEdit( (string)$i, 'test', 0, false, $user );
-               }
-
-               $user->clearInstanceCache();
-               $this->assertEquals(
-                       3,
-                       $user->getEditCount(),
-                       'After three edits, the user edit count should be 3'
-               );
-
-               // increase the edit count and clear the cache
-               $user->incEditCount();
-
-               $user->clearInstanceCache();
-               $this->assertEquals(
-                       4,
-                       $user->getEditCount(),
-                       'After increasing the edit count manually, the user edit count should be 4'
-               );
-       }
-
-       /**
-        * Test changing user options.
-        * @covers User::setOption
-        * @covers User::getOption
-        */
-       public function testOptions() {
-               $user = User::newFromName( 'UnitTestUser' );
-
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               $user->setOption( 'userjs-someoption', 'test' );
-               $user->setOption( 'cols', 200 );
-               $user->saveSettings();
-
-               $user = User::newFromName( 'UnitTestUser' );
-               $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
-               $this->assertEquals( 200, $user->getOption( 'cols' ) );
-       }
-
-       /**
-        * Bug 37963
-        * Make sure defaults are loaded when setOption is called.
-        * @covers User::loadOptions
-        */
-       public function testAnonOptions() {
-               global $wgDefaultUserOptions;
-               $this->user->setOption( 'userjs-someoption', 'test' );
-               $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
-               $this->assertEquals( 'test', $this->user->getOption( 'userjs-someoption' ) );
-       }
-
-       /**
-        * Test password validity checks. There are 3 checks in core,
-        *      - ensure the password meets the minimal length
-        *      - ensure the password is not the same as the username
-        *      - ensure the username/password combo isn't forbidden
-        * @covers User::checkPasswordValidity()
-        * @covers User::getPasswordValidity()
-        * @covers User::isValidPassword()
-        */
-       public function testCheckPasswordValidity() {
-               $this->setMwGlobals( array(
-                       'wgPasswordPolicy' => array(
-                               'policies' => array(
-                                       'sysop' => array(
-                                               'MinimalPasswordLength' => 8,
-                                               'MinimumPasswordLengthToLogin' => 1,
-                                               'PasswordCannotMatchUsername' => 1,
-                                       ),
-                                       'default' => array(
-                                               'MinimalPasswordLength' => 6,
-                                               'PasswordCannotMatchUsername' => true,
-                                               'PasswordCannotMatchBlacklist' => true,
-                                               'MaximalPasswordLength' => 30,
-                                       ),
-                               ),
-                               'checks' => array(
-                                       'MinimalPasswordLength' => 'PasswordPolicyChecks::checkMinimalPasswordLength',
-                                       'MinimumPasswordLengthToLogin' => 'PasswordPolicyChecks::checkMinimumPasswordLengthToLogin',
-                                       'PasswordCannotMatchUsername' => 'PasswordPolicyChecks::checkPasswordCannotMatchUsername',
-                                       'PasswordCannotMatchBlacklist' => 'PasswordPolicyChecks::checkPasswordCannotMatchBlacklist',
-                                       'MaximalPasswordLength' => 'PasswordPolicyChecks::checkMaximalPasswordLength',
-                               ),
-                       ),
-               ) );
-
-               $user = User::newFromName( 'Useruser' );
-               // Sanity
-               $this->assertTrue( $user->isValidPassword( 'Password1234' ) );
-
-               // Minimum length
-               $this->assertFalse( $user->isValidPassword( 'a' ) );
-               $this->assertFalse( $user->checkPasswordValidity( 'a' )->isGood() );
-               $this->assertTrue( $user->checkPasswordValidity( 'a' )->isOK() );
-               $this->assertEquals( 'passwordtooshort', $user->getPasswordValidity( 'a' ) );
-
-               // Maximum length
-               $longPass = str_repeat( 'a', 31 );
-               $this->assertFalse( $user->isValidPassword( $longPass ) );
-               $this->assertFalse( $user->checkPasswordValidity( $longPass )->isGood() );
-               $this->assertFalse( $user->checkPasswordValidity( $longPass )->isOK() );
-               $this->assertEquals( 'passwordtoolong', $user->getPasswordValidity( $longPass ) );
-
-               // Matches username
-               $this->assertFalse( $user->checkPasswordValidity( 'Useruser' )->isGood() );
-               $this->assertTrue( $user->checkPasswordValidity( 'Useruser' )->isOK() );
-               $this->assertEquals( 'password-name-match', $user->getPasswordValidity( 'Useruser' ) );
-
-               // On the forbidden list
-               $this->assertFalse( $user->checkPasswordValidity( 'Passpass' )->isGood() );
-               $this->assertEquals( 'password-login-forbidden', $user->getPasswordValidity( 'Passpass' ) );
-       }
-
-       /**
-        * @covers User::getCanonicalName()
-        * @dataProvider provideGetCanonicalName
-        */
-       public function testGetCanonicalName( $name, $expectedArray, $msg ) {
-               foreach ( $expectedArray as $validate => $expected ) {
-                       $this->assertEquals(
-                               $expected,
-                               User::getCanonicalName( $name, $validate === 'false' ? false : $validate ),
-                               $msg . ' (' . $validate . ')'
-                       );
-               }
-       }
-
-       public static function provideGetCanonicalName() {
-               return array(
-                       array( ' Trailing space ', array( 'creatable' => 'Trailing space' ), 'Trailing spaces' ),
-                       // @todo FIXME: Maybe the creatable name should be 'Talk:Username' or false to reject?
-                       array( 'Talk:Username', array( 'creatable' => 'Username', 'usable' => 'Username',
-                               'valid' => 'Username', 'false' => 'Talk:Username' ), 'Namespace prefix' ),
-                       array( ' name with # hash', array( 'creatable' => false, 'usable' => false ), 'With hash' ),
-                       array( 'Multi  spaces', array( 'creatable' => 'Multi spaces',
-                               'usable' => 'Multi spaces' ), 'Multi spaces' ),
-                       array( 'lowercase', array( 'creatable' => 'Lowercase' ), 'Lowercase' ),
-                       array( 'in[]valid', array( 'creatable' => false, 'usable' => false, 'valid' => false,
-                               'false' => 'In[]valid' ), 'Invalid' ),
-                       array( 'with / slash', array( 'creatable' => false, 'usable' => false, 'valid' => false,
-                               'false' => 'With / slash' ), 'With slash' ),
-               );
-       }
-
-       /**
-        * @covers User::equals
-        */
-       public function testEquals() {
-               $first = User::newFromName( 'EqualUser' );
-               $second = User::newFromName( 'EqualUser' );
-
-               $this->assertTrue( $first->equals( $first ) );
-               $this->assertTrue( $first->equals( $second ) );
-               $this->assertTrue( $second->equals( $first ) );
-
-               $third = User::newFromName( '0' );
-               $fourth = User::newFromName( '000' );
-
-               $this->assertFalse( $third->equals( $fourth ) );
-               $this->assertFalse( $fourth->equals( $third ) );
-
-               // Test users loaded from db with id
-               $user = User::newFromName( 'EqualUnitTestUser' );
-               if ( !$user->getId() ) {
-                       $user->addToDatabase();
-               }
-
-               $id = $user->getId();
-
-               $fifth = User::newFromId( $id );
-               $sixth = User::newFromName( 'EqualUnitTestUser' );
-               $this->assertTrue( $fifth->equals( $sixth ) );
-       }
-
-       /**
-        * @covers User::getId
-        */
-       public function testGetId() {
-               $user = User::newFromName( 'UTSysop' );
-               $this->assertTrue( $user->getId() > 0 );
-
-       }
-
-       /**
-        * @covers User::isLoggedIn
-        * @covers User::isAnon
-        */
-       public function testLoggedIn() {
-               $user = User::newFromName( 'UTSysop' );
-               $this->assertTrue( $user->isLoggedIn() );
-               $this->assertFalse( $user->isAnon() );
-
-               // Non-existent users are perceived as anonymous
-               $user = User::newFromName( 'UTNonexistent' );
-               $this->assertFalse( $user->isLoggedIn() );
-               $this->assertTrue( $user->isAnon() );
-
-               $user = new User;
-               $this->assertFalse( $user->isLoggedIn() );
-               $this->assertTrue( $user->isAnon() );
-       }
-
-       /**
-        * @covers User::checkAndSetTouched
-        */
-       public function testCheckAndSetTouched() {
-               $user = TestingAccessWrapper::newFromObject( User::newFromName( 'UTSysop' ) );
-               $this->assertTrue( $user->isLoggedIn() );
-
-               $touched = $user->getDBTouched();
-               $this->assertTrue(
-                       $user->checkAndSetTouched(), "checkAndSetTouched() succeded" );
-               $this->assertGreaterThan(
-                       $touched, $user->getDBTouched(), "user_touched increased with casOnTouched()" );
-
-               $touched = $user->getDBTouched();
-               $this->assertTrue(
-                       $user->checkAndSetTouched(), "checkAndSetTouched() succeded #2" );
-               $this->assertGreaterThan(
-                       $touched, $user->getDBTouched(), "user_touched increased with casOnTouched() #2" );
-       }
-
-       public static function setExtendedLoginCookieDataProvider() {
-               $data = array();
-               $now = time();
-
-               $secondsInDay = 86400;
-
-               // Arbitrary durations, in units of days, to ensure it chooses the
-               // right one.  There is a 5-minute grace period (see testSetExtendedLoginCookie)
-               // to work around slow tests, since we're not currently mocking time() for PHP.
-
-               $durationOne = $secondsInDay * 5;
-               $durationTwo = $secondsInDay * 29;
-               $durationThree = $secondsInDay * 17;
-
-               // If $wgExtendedLoginCookieExpiration is null, then the expiry passed to
-               // set cookie is time() + $wgCookieExpiration
-               $data[] = array(
-                       null,
-                       $durationOne,
-                       $now + $durationOne,
-               );
-
-               // If $wgExtendedLoginCookieExpiration isn't null, then the expiry passed to
-               // set cookie is $now + $wgExtendedLoginCookieExpiration
-               $data[] = array(
-                       $durationTwo,
-                       $durationThree,
-                       $now + $durationTwo,
-               );
-
-               return $data;
-       }
-
-       /**
-        * @dataProvider setExtendedLoginCookieDataProvider
-        * @covers User::getRequest
-        * @covers User::setCookie
-        * @backupGlobals enabled
-        */
-       public function testSetExtendedLoginCookie(
-               $extendedLoginCookieExpiration,
-               $cookieExpiration,
-               $expectedExpiry
-       ) {
-               $this->setMwGlobals( array(
-                       'wgExtendedLoginCookieExpiration' => $extendedLoginCookieExpiration,
-                       'wgCookieExpiration' => $cookieExpiration,
-               ) );
-
-               $response = $this->getMock( 'WebResponse' );
-               $setcookieSpy = $this->any();
-               $response->expects( $setcookieSpy )
-                       ->method( 'setcookie' );
-
-               $request = new MockWebRequest( $response );
-               $user = new UserProxy( User::newFromSession( $request ) );
-               $user->setExtendedLoginCookie( 'name', 'value', true );
-
-               $setcookieInvocations = $setcookieSpy->getInvocations();
-               $setcookieInvocation = end( $setcookieInvocations );
-               $actualExpiry = $setcookieInvocation->parameters[2];
-
-               // TODO: ± 300 seconds compensates for
-               // slow-running tests. However, the dependency on the time
-               // function should be removed.  This requires some way
-               // to mock/isolate User->setExtendedLoginCookie's call to time()
-               $this->assertEquals( $expectedExpiry, $actualExpiry, '', 300 );
-       }
-}
-
-class UserProxy extends User {
-
-       /**
-        * @var User
-        */
-       protected $user;
-
-       public function __construct( User $user ) {
-               $this->user = $user;
-       }
-
-       public function setExtendedLoginCookie( $name, $value, $secure ) {
-               $this->user->setExtendedLoginCookie( $name, $value, $secure );
-       }
-}
index 3e5f355..a08a86e 100644 (file)
@@ -3,7 +3,7 @@
 /**
  * @group API
  */
-class ApiErrorFormatterTest extends MediaWikiTestCase {
+class ApiErrorFormatterTest extends MediaWikiLangTestCase {
 
        /**
         * @covers ApiErrorFormatter
index 51154ae..fff05c7 100644 (file)
@@ -36,6 +36,10 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->any() )
                        ->method( 'getOptionKinds' )->will( $this->returnCallback( array( $this, 'getOptionKinds' ) ) );
 
+               // No actual DB data
+               $this->mUserMock->expects( $this->any() )
+                       ->method( 'getInstanceForUpdate' )->will( $this->returnValue( $this->mUserMock ) );
+
                // Create a new context
                $this->mContext = new DerivativeContext( new RequestContext() );
                $this->mContext->getContext()->setTitle( Title::newFromText( 'Test' ) );
@@ -283,21 +287,21 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->at( 2 ) )
                        ->method( 'getOptions' );
 
-               $this->mUserMock->expects( $this->at( 4 ) )
+               $this->mUserMock->expects( $this->at( 5 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'willBeNull' ), $this->identicalTo( null ) );
 
-               $this->mUserMock->expects( $this->at( 5 ) )
+               $this->mUserMock->expects( $this->at( 6 ) )
                        ->method( 'getOptions' );
 
-               $this->mUserMock->expects( $this->at( 6 ) )
+               $this->mUserMock->expects( $this->at( 7 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) );
 
-               $this->mUserMock->expects( $this->at( 7 ) )
+               $this->mUserMock->expects( $this->at( 8 ) )
                        ->method( 'getOptions' );
 
-               $this->mUserMock->expects( $this->at( 8 ) )
+               $this->mUserMock->expects( $this->at( 9 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
 
@@ -317,17 +321,17 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->once() )
                        ->method( 'resetOptions' );
 
-               $this->mUserMock->expects( $this->at( 4 ) )
+               $this->mUserMock->expects( $this->at( 5 ) )
                        ->method( 'getOptions' );
 
-               $this->mUserMock->expects( $this->at( 5 ) )
+               $this->mUserMock->expects( $this->at( 6 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
 
-               $this->mUserMock->expects( $this->at( 6 ) )
+               $this->mUserMock->expects( $this->at( 7 ) )
                        ->method( 'getOptions' );
 
-               $this->mUserMock->expects( $this->at( 7 ) )
+               $this->mUserMock->expects( $this->at( 8 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
 
@@ -350,19 +354,19 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->never() )
                        ->method( 'resetOptions' );
 
-               $this->mUserMock->expects( $this->at( 3 ) )
+               $this->mUserMock->expects( $this->at( 4 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'testmultiselect-opt1' ), $this->identicalTo( true ) );
 
-               $this->mUserMock->expects( $this->at( 4 ) )
+               $this->mUserMock->expects( $this->at( 5 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'testmultiselect-opt2' ), $this->identicalTo( null ) );
 
-               $this->mUserMock->expects( $this->at( 5 ) )
+               $this->mUserMock->expects( $this->at( 6 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'testmultiselect-opt3' ), $this->identicalTo( false ) );
 
-               $this->mUserMock->expects( $this->at( 6 ) )
+               $this->mUserMock->expects( $this->at( 7 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'testmultiselect-opt4' ), $this->identicalTo( false ) );
 
@@ -429,7 +433,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mUserMock->expects( $this->never() )
                        ->method( 'resetOptions' );
 
-               $this->mUserMock->expects( $this->at( 3 ) )
+               $this->mUserMock->expects( $this->once() )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'userjs-option' ), $this->equalTo( '1' ) );
 
index d43db71..9dbde3d 100644 (file)
@@ -458,6 +458,13 @@ class ApiResultTest extends MediaWikiTestCase {
                        );
                }
 
+               // Add two values and some metadata, but ensure metadata is not counted
+               $result = new ApiResult( 100 );
+               $obj = array( 'attr' => '12345' );
+               ApiResult::setContentValue( $obj, 'content', '1234567890' );
+               $this->assertTrue( $result->addValue( null, 'foo', $obj ) );
+               $this->assertSame( 15, $result->getSize() );
+
                $result = new ApiResult( 10 );
                $formatter = new ApiErrorFormatter( $result, Language::factory( 'en' ), 'none', false );
                $result->setErrorFormatter( $formatter );
index 21345ac..01113a6 100644 (file)
@@ -37,7 +37,6 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                );
 
                $this->setMwGlobals( array(
-                       'wgMemc' => new EmptyBagOStuff(),
                        'wgAuth' => new StubObject( 'wgAuth', 'AuthPlugin' ),
                        'wgRequest' => new FauxRequest( array() ),
                        'wgUser' => self::$users['sysop']->user,
index 6374cfa..e27ba1c 100644 (file)
@@ -256,7 +256,8 @@ class RandomImageGenerator {
                        $shape->addAttribute( 'points', self::shapePointsToString( $drawSpec['shape'] ) );
                }
 
-               if ( !$fh = fopen( $filename, 'w' ) ) {
+               $fh = fopen( $filename, 'w' );
+               if ( !$fh ) {
                        throw new Exception( "couldn't open $filename for writing" );
                }
                fwrite( $fh, $svg->asXML() );
diff --git a/tests/phpunit/includes/api/format/ApiFormatDbgTest.php b/tests/phpunit/includes/api/format/ApiFormatDbgTest.php
deleted file mode 100644 (file)
index addd16a..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-/**
- * @group API
- * @covers ApiFormatDbg
- */
-class ApiFormatDbgTest extends ApiFormatTestBase {
-
-       protected $printerName = 'dbg';
-
-       public static function provideGeneralEncoding() {
-               $warning = "\n  'warnings' => \n  array (\n    'dbg' => \n    array (\n" .
-                       "      '*' => 'format=dbg has been deprecated. Please use format=json instead.',\n" .
-                       "    ),\n  ),";
-
-               return array(
-                       // Basic types
-                       array( array( null ), "array ({$warning}\n  0 => NULL,\n)" ),
-                       array( array( true ), "array ({$warning}\n  0 => '',\n)" ),
-                       array( array( false ), "array ({$warning}\n)" ),
-                       array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
-                               "array ({$warning}\n  0 => true,\n)" ),
-                       array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
-                               "array ({$warning}\n  0 => false,\n)" ),
-                       array( array( 42 ), "array ({$warning}\n  0 => 42,\n)" ),
-                       array( array( 42.5 ), "array ({$warning}\n  0 => 42.5,\n)" ),
-                       array( array( 1e42 ), "array ({$warning}\n  0 => 1.0E+42,\n)" ),
-                       array( array( 'foo' ), "array ({$warning}\n  0 => 'foo',\n)" ),
-                       array( array( 'fóo' ), "array ({$warning}\n  0 => 'fóo',\n)" ),
-
-                       // Arrays and objects
-                       array(
-                               array( array() ),
-                               "array ({$warning}\n  0 => \n  array (\n  ),\n)"
-                       ),
-                       array(
-                               array( array( 1 ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)"
-                       ),
-                       array(
-                               array( array( 'x' => 1 ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)"
-                       ),
-                       array(
-                               array( array( 2 => 1 ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    2 => 1,\n  ),\n)"
-                       ),
-                       array(
-                               array( (object)array() ),
-                               "array ({$warning}\n  0 => \n  array (\n  ),\n)"
-                       ),
-                       array(
-                               array( array( 1, ApiResult::META_TYPE => 'assoc' ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)"
-                       ),
-                       array(
-                               array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    0 => 1,\n  ),\n)"
-                       ),
-                       array(
-                               array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)"
-                       ),
-                       array(
-                               array( array(
-                                       'x' => 1,
-                                       ApiResult::META_TYPE => 'BCkvp',
-                                       ApiResult::META_KVP_KEY_NAME => 'key'
-                               ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    0 => \n    " .
-                                       "array (\n      'key' => 'x',\n      '*' => 1,\n    ),\n  ),\n)"
-                       ),
-                       array(
-                               array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    'x' => 1,\n  ),\n)"
-                       ),
-                       array(
-                               array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ),
-                               "array ({$warning}\n  0 => \n  array (\n    0 => 'a',\n    1 => 'b',\n  ),\n)"
-                       ),
-
-                       // Content
-                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
-                               "array ({$warning}\n  '*' => 'foo',\n)" ),
-
-                       // BC Subelements
-                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
-                               "array ({$warning}\n  'foo' => \n  array (\n    '*' => 'foo',\n  ),\n)" ),
-               );
-       }
-
-}
diff --git a/tests/phpunit/includes/api/format/ApiFormatTxtTest.php b/tests/phpunit/includes/api/format/ApiFormatTxtTest.php
deleted file mode 100644 (file)
index c779a3c..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-/**
- * @group API
- * @covers ApiFormatTxt
- */
-class ApiFormatTxtTest extends ApiFormatTestBase {
-
-       protected $printerName = 'txt';
-
-       public static function provideGeneralEncoding() {
-               // @codingStandardsIgnoreStart Generic.Files.LineLength
-               $warning = "\n    [warnings] => Array\n        (\n            [txt] => Array\n                (\n" .
-                       "                    [*] => format=txt has been deprecated. Please use format=json instead.\n" .
-                       "                )\n\n        )\n";
-
-               return array(
-                       // Basic types
-                       array( array( null ), "Array\n({$warning}\n    [0] => \n)\n" ),
-                       array( array( true ), "Array\n({$warning}\n    [0] => \n)\n" ),
-                       array( array( false ), "Array\n({$warning}\n)\n" ),
-                       array( array( true, ApiResult::META_BC_BOOLS => array( 0 ) ),
-                               "Array\n({$warning}\n    [0] => 1\n)\n" ),
-                       array( array( false, ApiResult::META_BC_BOOLS => array( 0 ) ),
-                               "Array\n({$warning}\n    [0] => \n)\n" ),
-                       array( array( 42 ), "Array\n({$warning}\n    [0] => 42\n)\n" ),
-                       array( array( 42.5 ), "Array\n({$warning}\n    [0] => 42.5\n)\n" ),
-                       array( array( 1e42 ), "Array\n({$warning}\n    [0] => 1.0E+42\n)\n" ),
-                       array( array( 'foo' ), "Array\n({$warning}\n    [0] => foo\n)\n" ),
-                       array( array( 'fóo' ), "Array\n({$warning}\n    [0] => fóo\n)\n" ),
-
-                       // Arrays and objects
-                       array( array( array() ), "Array\n({$warning}\n    [0] => Array\n        (\n        )\n\n)\n" ),
-                       array( array( array( 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => 1\n        )\n\n)\n" ),
-                       array( array( array( 'x' => 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [x] => 1\n        )\n\n)\n" ),
-                       array( array( array( 2 => 1 ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [2] => 1\n        )\n\n)\n" ),
-                       array( array( (object)array() ), "Array\n({$warning}\n    [0] => Array\n        (\n        )\n\n)\n" ),
-                       array( array( array( 1, ApiResult::META_TYPE => 'assoc' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => 1\n        )\n\n)\n" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'array' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => 1\n        )\n\n)\n" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'kvp' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [x] => 1\n        )\n\n)\n" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCkvp', ApiResult::META_KVP_KEY_NAME => 'key' ) ),
-                               "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => Array\n                (\n                    [key] => x\n                    [*] => 1\n                )\n\n        )\n\n)\n" ),
-                       array( array( array( 'x' => 1, ApiResult::META_TYPE => 'BCarray' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [x] => 1\n        )\n\n)\n" ),
-                       array( array( array( 'a', 'b', ApiResult::META_TYPE => 'BCassoc' ) ), "Array\n({$warning}\n    [0] => Array\n        (\n            [0] => a\n            [1] => b\n        )\n\n)\n" ),
-
-                       // Content
-                       array( array( 'content' => 'foo', ApiResult::META_CONTENT => 'content' ),
-                               "Array\n({$warning}\n    [*] => foo\n)\n" ),
-
-                       // BC Subelements
-                       array( array( 'foo' => 'foo', ApiResult::META_BC_SUBELEMENTS => array( 'foo' ) ),
-                               "Array\n({$warning}\n    [foo] => Array\n        (\n            [*] => foo\n        )\n\n)\n" ),
-               );
-               // @codingStandardsIgnoreEnd
-       }
-
-}
index 61b992b..eb1ad26 100644 (file)
@@ -61,7 +61,7 @@ class ApiQueryTest extends ApiTestCase {
        public function testTitlesAreRejectedIfInvalid() {
                $title = false;
                while ( !$title || Title::newFromText( $title )->exists() ) {
-                       $title = md5( mt_rand( 0, 10000 ) + rand( 0, 999000 ) );
+                       $title = md5( mt_rand( 0, 100000 ) );
                }
 
                $data = $this->doApiRequest( array(
index 58735bc..4da8274 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class CssContentHandlerTest extends MediaWikiTestCase {
+class CssContentHandlerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideMakeRedirectContent
index 69fc9af..d9487a0 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-class JavaScriptContentHandlerTest extends MediaWikiTestCase {
+class JavaScriptContentHandlerTest extends MediaWikiLangTestCase {
 
        /**
         * @dataProvider provideMakeRedirectContent
index b97842c..a636e56 100644 (file)
@@ -258,7 +258,9 @@ class JavaScriptContentTest extends TextContentTest {
        public function testUpdateRedirect( $oldText, $expectedText ) {
                $this->setMwGlobals( array(
                        'wgServer' => '//example.org',
-                       'wgScriptPath' => '/w/index.php',
+                       'wgScriptPath' => '/w',
+                       'wgScript' => '/w/index.php',
+                       'wgResourceBasePath' => '/w',
                ) );
                $target = Title::newFromText( "testUpdateRedirect_target" );
 
@@ -317,7 +319,9 @@ class JavaScriptContentTest extends TextContentTest {
        public function testGetRedirectTarget( $title, $text ) {
                $this->setMwGlobals( array(
                        'wgServer' => '//example.org',
-                       'wgScriptPath' => '/w/index.php',
+                       'wgScriptPath' => '/w',
+                       'wgScript' => '/w/index.php',
+                       'wgResourceBasePath' => '/w',
                ) );
                $content = new JavaScriptContent( $text );
                $target = $content->getRedirectTarget();
index 8c09471..31e4f5b 100644 (file)
@@ -247,4 +247,13 @@ class DatabaseMysqlBaseTest extends MediaWikiTestCase {
                );
        }
 
+       function testMasterPos() {
+               $pos1 = new MySQLMasterPos( 'db1034-bin.000976', '843431247' );
+               $pos2 = new MySQLMasterPos( 'db1034-bin.000976', '843431248' );
+
+               $this->assertTrue( $pos1->hasReached( $pos1 ) );
+               $this->assertTrue( $pos2->hasReached( $pos2 ) );
+               $this->assertTrue( $pos2->hasReached( $pos1 ) );
+               $this->assertFalse( $pos1->hasReached( $pos2 ) );
+       }
 }
index 0db7af9..c742f74 100644 (file)
@@ -100,7 +100,8 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
 
                $this->assertTrue( $re !== false, 'query failed' );
 
-               if ( $row = $re->fetchRow() ) {
+               $row = $re->fetchRow();
+               if ( $row ) {
                        if ( $value instanceof Blob ) {
                                $value = $value->fetch();
                        }
index 7e70439..5f2a6fe 100644 (file)
@@ -234,4 +234,30 @@ class DatabaseTest extends MediaWikiTestCase {
                $this->assertFalse( $this->db->tableExists( 'foobarbaz' ) );
                $this->assertInternalType( 'int', $res->numRows() );
        }
+
+       public function testTransactionIdle() {
+               $db = $this->db;
+
+               $db->setFlag( DBO_TRX );
+               $flagSet = null;
+               $db->onTransactionIdle( function() use ( $db, &$flagSet ) {
+                       $flagSet = $db->getFlag( DBO_TRX );
+               } );
+               $this->assertFalse( $flagSet, 'DBO_TRX off in callback' );
+               $this->assertTrue( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
+
+               $db->clearFlag( DBO_TRX );
+               $flagSet = null;
+               $db->onTransactionIdle( function() use ( $db, &$flagSet ) {
+                       $flagSet = $db->getFlag( DBO_TRX );
+               } );
+               $this->assertFalse( $flagSet, 'DBO_TRX off in callback' );
+               $this->assertFalse( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
+
+               $db->clearFlag( DBO_TRX );
+               $db->onTransactionIdle( function() use ( $db ) {
+                       $db->setFlag( DBO_TRX );
+               } );
+               $this->assertFalse( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
+       }
 }
index cb2d7db..519d3a0 100644 (file)
@@ -146,4 +146,64 @@ class LBFactoryTest extends MediaWikiTestCase {
                $factory->shutdown();
                $lb->closeAll();
        }
+
+       public function testChronologyProtector() {
+               // (a) First HTTP request
+               $mPos = new MySQLMasterPos( 'db1034-bin.000976', '843431247' );
+
+               $mockDB = $this->getMockBuilder( 'DatabaseMysql' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mockDB->expects( $this->any() )
+                       ->method( 'doneWrites' )->will( $this->returnValue( true ) );
+               $mockDB->expects( $this->any() )
+                       ->method( 'getMasterPos' )->will( $this->returnValue( $mPos ) );
+
+               $lb = $this->getMockBuilder( 'LoadBalancer' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $lb->expects( $this->any() )
+                       ->method( 'getConnection' )->will( $this->returnValue( $mockDB ) );
+               $lb->expects( $this->any() )
+                       ->method( 'getServerCount' )->will( $this->returnValue( 2 ) );
+               $lb->expects( $this->any() )
+                       ->method( 'parentInfo' )->will( $this->returnValue( array( 'id' => "main-DEFAULT" ) ) );
+               $lb->expects( $this->any() )
+                       ->method( 'getAnyOpenConnection' )->will( $this->returnValue( $mockDB ) );
+
+               $bag = new HashBagOStuff();
+               $cp = new ChronologyProtector(
+                       $bag,
+                       array(
+                               'ip' => '127.0.0.1',
+                               'agent' => "Totally-Not-FireFox"
+                       )
+               );
+
+               $mockDB->expects( $this->exactly( 2 ) )->method( 'doneWrites' );
+
+               // Nothing to wait for
+               $cp->initLB( $lb );
+               // Record in stash
+               $cp->shutdownLB( $lb );
+               $cp->shutdown();
+
+               // (b) Second HTTP request
+               $cp = new ChronologyProtector(
+                       $bag,
+                       array(
+                               'ip' => '127.0.0.1',
+                               'agent' => "Totally-Not-FireFox"
+                       )
+               );
+
+               $lb->expects( $this->once() )
+                       ->method( 'waitFor' )->with( $this->equalTo( $mPos ) );
+
+               // Wait
+               $cp->initLB( $lb );
+               // Record in stash
+               $cp->shutdownLB( $lb );
+               $cp->shutdown();
+       }
 }
diff --git a/tests/phpunit/includes/db/ORMRowTest.php b/tests/phpunit/includes/db/ORMRowTest.php
deleted file mode 100644 (file)
index 807bd14..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-<?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
- *
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-abstract class ORMRowTest extends \MediaWikiTestCase {
-
-       /**
-        * @since 1.20
-        * @return string
-        */
-       abstract protected function getRowClass();
-
-       /**
-        * @since 1.20
-        * @return IORMTable
-        */
-       abstract protected function getTableInstance();
-
-       /**
-        * @since 1.20
-        * @return array
-        */
-       abstract public 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 bool $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 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 testSaveAndRemove( 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 );
-
-               $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!
-
-}
diff --git a/tests/phpunit/includes/db/ORMTableTest.php b/tests/phpunit/includes/db/ORMTableTest.php
deleted file mode 100644 (file)
index 764560d..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-/**
- * Abstract class to construct tests for ORMTable 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.21
- *
- * @ingroup Test
- *
- * @group ORM
- * @group Database
- *
- * @covers PageORMTableForTesting
- *
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- * @author Daniel Kinzler
- */
-
-class ORMTableTest extends MediaWikiTestCase {
-
-       /**
-        * @since 1.21
-        * @return string
-        */
-       protected function getTableClass() {
-               return 'PageORMTableForTesting';
-       }
-
-       /**
-        * @since 1.21
-        * @return IORMTable
-        */
-       public function getTable() {
-               $class = $this->getTableClass();
-
-               return $class::singleton();
-       }
-
-       /**
-        * @since 1.21
-        * @return string
-        */
-       public function getRowClass() {
-               return $this->getTable()->getRowClass();
-       }
-
-       /**
-        * @since 1.21
-        */
-       public function testSingleton() {
-               $class = $this->getTableClass();
-
-               $this->assertInstanceOf( $class, $class::singleton() );
-               $this->assertTrue( $class::singleton() === $class::singleton() );
-       }
-}
-
-/**
- * Dummy ORM table for testing, reading Title objects from the page table.
- *
- * @since 1.21
- */
-
-class PageORMTableForTesting extends ORMTable {
-
-       public function __construct() {
-               $this->fieldPrefix = 'page_';
-       }
-
-       /**
-        * @see ORMTable::getName
-        *
-        * @return string
-        */
-       public function getName() {
-               return 'page';
-       }
-
-       /**
-        * @see ORMTable::getRowClass
-        *
-        * @return string
-        */
-       public function getRowClass() {
-               return 'Title';
-       }
-
-       /**
-        * @see ORMTable::newRow
-        *
-        * @return IORMRow
-        */
-       public function newRow( array $data, $loadDefaults = false ) {
-               return Title::makeTitle( $data['namespace'], $data['title'] );
-       }
-
-       /**
-        * @see ORMTable::getFields
-        *
-        * @return array
-        */
-       public function getFields() {
-               return array(
-                       'id' => 'int',
-                       'namespace' => 'int',
-                       'title' => 'str',
-               );
-       }
-}
diff --git a/tests/phpunit/includes/db/TestORMRowTest.php b/tests/phpunit/includes/db/TestORMRowTest.php
deleted file mode 100644 (file)
index 04bb9f3..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-<?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
- * @ingroup Test
- * @author Jeroen De Dauw < jeroendedauw@gmail.com >
- */
-
-/**
- * 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.
- *
- * 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.
- *
- * @since 1.20
- *
- * @group ORM
- * @group Database
- * @group medium
- * @covers TestORMRow
- */
-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();
-       }
-
-       protected function setUp() {
-               parent::setUp();
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               $isSqlite = $GLOBALS['wgDBtype'] === 'sqlite';
-               $isPostgres = $GLOBALS['wgDBtype'] === 'postgres';
-
-               $idField = $isSqlite ? 'INTEGER' : 'INT unsigned';
-               $primaryKey = $isSqlite ? 'PRIMARY KEY AUTOINCREMENT' : 'auto_increment PRIMARY KEY';
-
-               if ( $isPostgres ) {
-                       $dbw->query(
-                               'CREATE TABLE IF NOT EXISTS ' . $dbw->tableName( 'orm_test' ) . "(
-                                       test_id serial PRIMARY KEY,
-                                       test_name TEXT NOT NULL DEFAULT '',
-                                       test_age INTEGER NOT NULL DEFAULT 0,
-                                       test_height REAL NOT NULL DEFAULT 0,
-                                       test_awesome INTEGER NOT NULL DEFAULT 0,
-                                       test_stuff BYTEA,
-                                       test_moarstuff BYTEA,
-                                       test_time TIMESTAMPTZ
-                                       );",
-                                       __METHOD__
-                               );
-               } else {
-                       $dbw->query(
-                               '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
-                               );',
-                               __METHOD__
-                       );
-               }
-       }
-
-       protected function tearDown() {
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->dropTable( 'orm_test', __METHOD__ );
-
-               parent::tearDown();
-       }
-
-       public function constructorTestProvider() {
-               $dbw = wfGetDB( DB_MASTER );
-               return array(
-                       array(
-                               array(
-                                       'name' => 'Foobar',
-                                       'time' => $dbw->timestamp( '20120101020202' ),
-                                       '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
-                       ),
-               );
-       }
-
-       /**
-        * @since 1.21
-        * @return array
-        */
-       protected function getMockValues() {
-               return array(
-                       'id' => 1,
-                       'str' => 'foobar4645645',
-                       'int' => 42,
-                       'float' => 4.2,
-                       'bool' => '',
-                       'array' => array( 42, 'foobar' ),
-                       'blob' => new stdClass()
-               );
-       }
-}
-
-class TestORMRow extends ORMRow {
-}
-
-class TestORMTable extends ORMTable {
-
-       public function __construct() {
-               $this->fieldPrefix = 'test_';
-       }
-
-       /**
-        * 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' => 'str', // TS_MW
-               );
-       }
-}
diff --git a/tests/phpunit/includes/deferred/CdnCacheUpdateTest.php b/tests/phpunit/includes/deferred/CdnCacheUpdateTest.php
new file mode 100644 (file)
index 0000000..de77ad5
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+class CdnCacheUpdateTest extends MediaWikiTestCase {
+       public function testPurgeMergeWeb() {
+               $this->setMwGlobals( 'wgCommandLineMode', false );
+
+               $urls1 = array();
+               $title = Title::newMainPage();
+               $urls1[] = $title->getCanonicalURL( '?x=1' );
+               $urls1[] = $title->getCanonicalURL( '?x=2' );
+               $urls1[] = $title->getCanonicalURL( '?x=3' );
+               $update1 = new CdnCacheUpdate( $urls1 );
+               DeferredUpdates::addUpdate( $update1 );
+
+               $urls2 = array();
+               $urls2[] = $title->getCanonicalURL( '?x=2' );
+               $urls2[] = $title->getCanonicalURL( '?x=3' );
+               $urls2[] = $title->getCanonicalURL( '?x=4' );
+               $update2 = new CdnCacheUpdate( $urls2 );
+               DeferredUpdates::addUpdate( $update2 );
+
+               $wrapper = TestingAccessWrapper::newFromObject( $update1 );
+               $this->assertEquals( array_merge( $urls1, $urls2 ), $wrapper->urls );
+       }
+}
index df4213a..736f6e8 100644 (file)
@@ -34,6 +34,31 @@ class DeferredUpdatesTest extends MediaWikiTestCase {
                $this->expectOutputString( implode( '', $updates ) );
 
                DeferredUpdates::doUpdates();
+
+               $x = null;
+               $y = null;
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( &$x ) {
+                               $x = 'Sherity';
+                       },
+                       DeferredUpdates::PRESEND
+               );
+               DeferredUpdates::addCallableUpdate(
+                       function () use ( &$y ) {
+                               $y = 'Marychu';
+                       },
+                       DeferredUpdates::POSTSEND
+               );
+
+               $this->assertNull( $x, "Update not run yet" );
+               $this->assertNull( $y, "Update not run yet" );
+
+               DeferredUpdates::doUpdates( 'run', DeferredUpdates::PRESEND );
+               $this->assertEquals( "Sherity", $x, "PRESEND update ran" );
+               $this->assertNull( $y, "POSTSEND update not run yet" );
+
+               DeferredUpdates::doUpdates( 'run', DeferredUpdates::POSTSEND );
+               $this->assertEquals( "Marychu", $y, "POSTSEND update ran" );
        }
 
        public function testDoUpdatesCLI() {
index 25ee5ec..016a7aa 100644 (file)
@@ -1,10 +1,12 @@
 <?php
 
 /**
+ * @group LinksUpdate
  * @group Database
  * ^--- make sure temporary tables are used.
  */
-class LinksUpdateTest extends MediaWikiTestCase {
+class LinksUpdateTest extends MediaWikiLangTestCase {
+       protected $testingPageId;
 
        function __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
@@ -44,7 +46,8 @@ class LinksUpdateTest extends MediaWikiTestCase {
        }
 
        public function addDBData() {
-               $this->insertPage( 'Testing' );
+               $res = $this->insertPage( 'Testing' );
+               $this->testingPageId = $res['id'];
                $this->insertPage( 'Some_other_page' );
                $this->insertPage( 'Template:TestingTemplate' );
        }
@@ -63,8 +66,9 @@ class LinksUpdateTest extends MediaWikiTestCase {
         * @covers ParserOutput::addLink
         */
        public function testUpdate_pagelinks() {
+               /** @var Title $t */
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
 
                $po->addLink( Title::newFromText( "Foo" ) );
                $po->addLink( Title::newFromText( "Special:Foo" ) ); // special namespace should be ignored
@@ -77,7 +81,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
                        'pagelinks',
                        'pl_namespace,
                        pl_title',
-                       'pl_from = 111',
+                       'pl_from = ' . $this->testingPageId,
                        array( array( NS_MAIN, 'Foo' ) )
                );
                $this->assertArrayEquals( array(
@@ -96,7 +100,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
                        'pagelinks',
                        'pl_namespace,
                        pl_title',
-                       'pl_from = 111',
+                       'pl_from = ' . $this->testingPageId,
                        array(
                                array( NS_MAIN, 'Bar' ),
                                array( NS_TALK, 'Bar' ),
@@ -116,13 +120,20 @@ class LinksUpdateTest extends MediaWikiTestCase {
         */
        public function testUpdate_externallinks() {
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
 
                $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' ),
-               ) );
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'externallinks',
+                       'el_to, el_index',
+                       'el_from = ' . $this->testingPageId,
+                       array(
+                               array( 'http://testing.com/wiki/Foo', 'http://com.testing./wiki/Foo' ),
+                       )
+               );
        }
 
        /**
@@ -132,13 +143,18 @@ class LinksUpdateTest extends MediaWikiTestCase {
                /** @var ParserOutput $po */
                $this->setMwGlobals( 'wgCategoryCollation', 'uppercase' );
 
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
 
                $po->addCategory( "Foo", "FOO" );
 
-               $this->assertLinksUpdate( $t, $po, 'categorylinks', 'cl_to, cl_sortkey', 'cl_from = 111', array(
-                       array( 'Foo', "FOO\nTESTING" ),
-               ) );
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'categorylinks',
+                       'cl_to, cl_sortkey',
+                       'cl_from = ' . $this->testingPageId,
+                       array( array( 'Foo', "FOO\nTESTING" ) )
+               );
        }
 
        public function testOnAddingAndRemovingCategory_recentChangesRowIsAdded() {
@@ -147,6 +163,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
                $title = Title::newFromText( 'Testing' );
                $wikiPage = new WikiPage( $title );
                $wikiPage->doEditContent( new WikitextContent( '[[Category:Foo]]' ), 'added category' );
+               $this->runAllRelatedJobs();
 
                $this->assertRecentChangeByCategorization(
                        $title,
@@ -155,7 +172,9 @@ class LinksUpdateTest extends MediaWikiTestCase {
                        array( array( 'Foo', '[[:Testing]] added to category' ) )
                );
 
-               $wikiPage->doEditContent( new WikitextContent( '[[Category:Bar]]' ), 'added category' );
+               $wikiPage->doEditContent( new WikitextContent( '[[Category:Bar]]' ), 'replaced category' );
+               $this->runAllRelatedJobs();
+
                $this->assertRecentChangeByCategorization(
                        $title,
                        $wikiPage->getParserOutput( new ParserOptions() ),
@@ -184,15 +203,27 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
                $wikiPage = new WikiPage( Title::newFromText( 'Testing' ) );
                $wikiPage->doEditContent( new WikitextContent( '{{TestingTemplate}}' ), 'added template' );
+               $this->runAllRelatedJobs();
+
                $otherWikiPage = new WikiPage( Title::newFromText( 'Some_other_page' ) );
                $otherWikiPage->doEditContent( new WikitextContent( '{{TestingTemplate}}' ), 'added template' );
-               $templatePage->doEditContent( new WikitextContent( '[[Category:Foo]]' ), 'added category' );
+               $this->runAllRelatedJobs();
 
                $this->assertRecentChangeByCategorization(
                        $templateTitle,
                        $templatePage->getParserOutput( new ParserOptions() ),
-                       Title::newFromText( 'Foo' ),
-                       array( array( 'Foo', '[[:Template:TestingTemplate]] and 2 pages added to category' ) )
+                       Title::newFromText( 'Baz' ),
+                       array()
+               );
+
+               $templatePage->doEditContent( new WikitextContent( '[[Category:Baz]]' ), 'added category' );
+               $this->runAllRelatedJobs();
+
+               $this->assertRecentChangeByCategorization(
+                       $templateTitle,
+                       $templatePage->getParserOutput( new ParserOptions() ),
+                       Title::newFromText( 'Baz' ),
+                       array( array( 'Baz', '[[:Template:TestingTemplate]] and 2 pages added to category' ) )
                );
        }
 
@@ -201,14 +232,19 @@ class LinksUpdateTest extends MediaWikiTestCase {
         */
        public function testUpdate_iwlinks() {
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
 
                $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' ),
-               ) );
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'iwlinks',
+                       'iwl_prefix, iwl_title',
+                       'iwl_from = ' . $this->testingPageId,
+                       array( array( 'linksupdatetest', 'Foo' ) )
+               );
        }
 
        /**
@@ -216,7 +252,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
         */
        public function testUpdate_templatelinks() {
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
 
                $po->addTemplate( Title::newFromText( "Template:Foo" ), 23, 42 );
 
@@ -226,7 +262,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
                        'templatelinks',
                        'tl_namespace,
                        tl_title',
-                       'tl_from = 111',
+                       'tl_from = ' . $this->testingPageId,
                        array( array( NS_TEMPLATE, 'Foo' ) )
                );
        }
@@ -236,13 +272,18 @@ class LinksUpdateTest extends MediaWikiTestCase {
         */
        public function testUpdate_imagelinks() {
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
 
                $po->addImage( "Foo.png" );
 
-               $this->assertLinksUpdate( $t, $po, 'imagelinks', 'il_to', 'il_from = 111', array(
-                       array( 'Foo.png' ),
-               ) );
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'imagelinks',
+                       'il_to',
+                       'il_from = ' . $this->testingPageId,
+                       array( array( 'Foo.png' ) )
+               );
        }
 
        /**
@@ -254,13 +295,18 @@ class LinksUpdateTest extends MediaWikiTestCase {
                ) );
 
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
 
                $po->addLanguageLink( Title::newFromText( "en:Foo" )->getFullText() );
 
-               $this->assertLinksUpdate( $t, $po, 'langlinks', 'll_lang, ll_title', 'll_from = 111', array(
-                       array( 'En', 'Foo' ),
-               ) );
+               $this->assertLinksUpdate(
+                       $t,
+                       $po,
+                       'langlinks',
+                       'll_lang, ll_title',
+                       'll_from = ' . $this->testingPageId,
+                       array( array( 'En', 'Foo' ) )
+               );
        }
 
        /**
@@ -270,7 +316,7 @@ class LinksUpdateTest extends MediaWikiTestCase {
                global $wgPagePropsHaveSortkey;
 
                /** @var ParserOutput $po */
-               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", 111 );
+               list( $t, $po ) = $this->makeTitleAndParserOutput( "Testing", $this->testingPageId );
 
                $fields = array( 'pp_propname', 'pp_value' );
                $expected = array();
@@ -302,7 +348,8 @@ class LinksUpdateTest extends MediaWikiTestCase {
                        }
                }
 
-               $this->assertLinksUpdate( $t, $po, 'page_props', $fields, 'pp_page = 111', $expected );
+               $this->assertLinksUpdate(
+                       $t, $po, 'page_props', $fields, 'pp_page = ' . $this->testingPageId, $expected );
        }
 
        public function testUpdate_page_props_without_sortkey() {
@@ -330,13 +377,6 @@ class LinksUpdateTest extends MediaWikiTestCase {
        protected function assertRecentChangeByCategorization(
                Title $pageTitle, ParserOutput $parserOutput, Title $categoryTitle, $expectedRows
        ) {
-               $update = new LinksUpdate( $pageTitle, $parserOutput );
-               $revision = Revision::newFromTitle( $pageTitle );
-               $update->setRevision( $revision );
-               $update->beginTransaction();
-               $update->doUpdate();
-               $update->commitTransaction();
-
                $this->assertSelect(
                        'recentchanges',
                        'rc_title, rc_comment',
@@ -348,4 +388,16 @@ class LinksUpdateTest extends MediaWikiTestCase {
                        $expectedRows
                );
        }
+
+       private function runAllRelatedJobs() {
+               $queueGroup = JobQueueGroup::singleton();
+               while ( $job = $queueGroup->pop( 'refreshLinksPrioritized' ) ) {
+                       $job->run();
+                       $queueGroup->ack( $job );
+               }
+               while ( $job = $queueGroup->pop( 'categoryMembershipChange' ) ) {
+                       $job->run();
+                       $queueGroup->ack( $job );
+               }
+       }
 }
index 0d15b75..0763a2e 100644 (file)
@@ -18,7 +18,6 @@ class FileBackendTest extends MediaWikiTestCase {
        protected function setUp() {
                global $wgFileBackends;
                parent::setUp();
-               $uniqueId = time() . '-' . mt_rand();
                $tmpDir = $this->getNewTempDirectory();
                if ( $this->getCliArg( 'use-filebackend' ) ) {
                        if ( self::$backendToUse ) {
@@ -58,7 +57,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        'name' => 'localtesting',
                        'lockManager' => LockManagerGroup::singleton()->get( 'fsLockManager' ),
                        'parallelize' => 'implicit',
-                       'wikiId' => wfWikiId() . $uniqueId,
+                       'wikiId' => wfWikiId() . wfRandomString(),
                        'backends' => array(
                                array(
                                        'name' => 'localmultitesting1',
@@ -80,11 +79,6 @@ class FileBackendTest extends MediaWikiTestCase {
                ) );
        }
 
-       protected function tearDown() {
-               parent::tearDown();
-               DeferredUpdates::forceDeferral( false );
-       }
-
        private static function baseStorePath() {
                return 'mwstore://localtesting';
        }
@@ -1716,7 +1710,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( strlen( $fileBContents ),
                        $this->backend->getFileSize( array( 'src' => $fileC ) ),
                        "Correct file size of $fileC" );
-               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+               $this->assertEquals( Wikimedia\base_convert( sha1( $fileBContents ), 16, 36, 31 ),
                        $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
                        "Correct file SHA-1 of $fileC" );
        }
@@ -1815,7 +1809,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( strlen( $fileBContents ),
                        $this->backend->getFileSize( array( 'src' => $fileC ) ),
                        "Correct file size of $fileC" );
-               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+               $this->assertEquals( Wikimedia\base_convert( sha1( $fileBContents ), 16, 36, 31 ),
                        $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
                        "Correct file SHA-1 of $fileC" );
        }
@@ -1892,7 +1886,7 @@ class FileBackendTest extends MediaWikiTestCase {
                $this->assertEquals( strlen( $fileBContents ),
                        $this->backend->getFileSize( array( 'src' => $fileA ) ),
                        "Correct file size of $fileA" );
-               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+               $this->assertEquals( Wikimedia\base_convert( sha1( $fileBContents ), 16, 36, 31 ),
                        $this->backend->getFileSha1Base36( array( 'src' => $fileA ) ),
                        "Correct file SHA-1 of $fileA" );
        }
@@ -2397,6 +2391,42 @@ class FileBackendTest extends MediaWikiTestCase {
                        "Scoped unlocking of files succeeded with OK status ($backendName)." );
        }
 
+       /**
+        * @dataProvider provider_testGetContentType
+        */
+       public function testGetContentType( $mimeCallback, $mimeFromString ) {
+               global $IP;
+
+               $be = TestingAccessWrapper::newFromObject( new MemoryFileBackend(
+                       array(
+                               'name' => 'testing',
+                               'class' => 'MemoryFileBackend',
+                               'wikiId' => 'meow',
+                               'mimeCallback' => $mimeCallback
+                       )
+               ) );
+
+               $dst = 'mwstore://testing/container/path/to/file_no_ext';
+               $src = "$IP/tests/phpunit/data/media/srgb.jpg";
+               $this->assertEquals( 'image/jpeg', $be->getContentType( $dst, null, $src ) );
+               $this->assertEquals(
+                       $mimeFromString ? 'image/jpeg' : 'unknown/unknown',
+                       $be->getContentType( $dst, file_get_contents( $src ), null ) );
+
+               $src = "$IP/tests/phpunit/data/media/Png-native-test.png";
+               $this->assertEquals( 'image/png', $be->getContentType( $dst, null, $src ) );
+               $this->assertEquals(
+                       $mimeFromString ? 'image/png' : 'unknown/unknown',
+                       $be->getContentType( $dst, file_get_contents( $src ), null ) );
+       }
+
+       public static function provider_testGetContentType() {
+               return array(
+                       array( null, false ),
+                       array( array( FileBackendGroup::singleton(), 'guessMimeInternal' ), true )
+               );
+       }
+
        public function testReadAffinity() {
                $be = TestingAccessWrapper::newFromObject(
                        new FileBackendMultiWrite( array(
@@ -2468,7 +2498,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        ) )
                );
 
-               DeferredUpdates::forceDeferral( true );
+               $this->setMwGlobals( 'wgCommandLineMode', false );
 
                $p = 'container/test-cont/file.txt';
                $be->quickCreate( array(
@@ -2486,7 +2516,6 @@ class FileBackendTest extends MediaWikiTestCase {
                );
 
                DeferredUpdates::doUpdates();
-               DeferredUpdates::forceDeferral( false );
 
                $this->assertEquals(
                        'cattitude',
@@ -2495,6 +2524,37 @@ class FileBackendTest extends MediaWikiTestCase {
                );
        }
 
+       public function testSanitizeOpHeaders() {
+               $be = TestingAccessWrapper::newFromObject( new MemoryFileBackend( array(
+                       'name' => 'localtesting',
+                       'wikiId' => wfWikiID()
+               ) ) );
+
+               $name = wfRandomString( 300 );
+
+               $input = array(
+                       'headers' => array(
+                               'content-Disposition' => FileBackend::makeContentDisposition( 'inline', $name ),
+                               'Content-dUration' => 25.6,
+                               'X-LONG-VALUE' => str_pad( '0', 300 ),
+                               'CONTENT-LENGTH' => 855055,
+                       )
+               );
+               $expected = array(
+                       'headers' => array(
+                               'content-disposition' => FileBackend::makeContentDisposition( 'inline', $name ),
+                               'content-duration' => 25.6,
+                               'content-length' => 855055
+                       )
+               );
+
+               MediaWiki\suppressWarnings();
+               $actual = $be->sanitizeOpHeaders( $input );
+               MediaWiki\restoreWarnings();
+
+               $this->assertEquals( $expected, $actual, "Header sanitized properly" );
+       }
+
        // helper function
        private function listToArray( $iter ) {
                return is_array( $iter ) ? $iter : iterator_to_array( $iter );
index c839bc4..ee0cf2d 100644 (file)
@@ -11,7 +11,7 @@ class MigrateFileRepoLayoutTest extends MediaWikiTestCase {
 
                $filename = 'Foo.png';
 
-               $this->tmpPrefix = wfTempDir() . '/migratefilelayout-test-' . time() . '-' . mt_rand();
+               $this->tmpPrefix = $this->getNewTempDirectory();
 
                $backend = new FSFileBackend( array(
                        'name' => 'local-migratefilerepolayouttest',
index ea1a4f6..47277d9 100644 (file)
@@ -19,8 +19,6 @@ class JobQueueTest extends MediaWikiTestCase {
                global $wgJobTypeConf;
                parent::setUp();
 
-               $this->setMwGlobals( 'wgMemc', new HashBagOStuff() );
-
                if ( $this->getCliArg( 'use-jobqueue' ) ) {
                        $name = $this->getCliArg( 'use-jobqueue' );
                        if ( !isset( $wgJobTypeConf[$name] ) ) {
@@ -43,9 +41,6 @@ class JobQueueTest extends MediaWikiTestCase {
                foreach ( $variants as $q => $settings ) {
                        try {
                                $this->$q = JobQueue::factory( $settings + $baseConfig );
-                               if ( !( $this->$q instanceof JobQueueDB ) ) {
-                                       $this->$q->setTestingPrefix( 'unittests-' . wfRandomString( 32 ) );
-                               }
                        } catch ( MWException $e ) {
                                // unsupported?
                                // @todo What if it was another error?
@@ -128,8 +123,6 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->flushCaches();
                if ( $recycles ) {
                        $this->assertEquals( 1, $queue->getAcquiredCount(), "Active job count ($desc)" );
-               } else {
-                       $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
                }
 
                $job2 = $queue->pop();
@@ -139,8 +132,6 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->flushCaches();
                if ( $recycles ) {
                        $this->assertEquals( 2, $queue->getAcquiredCount(), "Active job count ($desc)" );
-               } else {
-                       $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
                }
 
                $queue->ack( $job1 );
@@ -148,8 +139,6 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->flushCaches();
                if ( $recycles ) {
                        $this->assertEquals( 1, $queue->getAcquiredCount(), "Active job count ($desc)" );
-               } else {
-                       $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
                }
 
                $queue->ack( $job2 );
@@ -215,8 +204,6 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
                if ( $recycles ) {
                        $this->assertEquals( 1, $queue->getAcquiredCount(), "Active job count ($desc)" );
-               } else {
-                       $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
                }
 
                $queue->ack( $job1 );
@@ -225,6 +212,29 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
        }
 
+       /**
+        * @dataProvider provider_queueLists
+        * @covers JobQueue
+        */
+       public function testDeduplicationWhileClaimed( $queue, $recycles, $desc ) {
+               $queue = $this->$queue;
+               if ( !$queue ) {
+                       $this->markTestSkipped( $desc );
+               }
+
+               $job = $this->newDedupedJob();
+               $queue->push( $job );
+
+               // De-duplication does not apply to already-claimed jobs
+               $j = $queue->pop();
+               $queue->push( $job );
+               $queue->ack( $j );
+
+               $j = $queue->pop();
+               // Make sure ack() of the twin did not delete the sibling data
+               $this->assertType( 'NullJob', $j );
+       }
+
        /**
         * @dataProvider provider_queueLists
         * @covers JobQueue
@@ -319,6 +329,30 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
        }
 
+       /**
+        * @covers JobQueue
+        */
+       public function testQueueAggregateTable() {
+               $queue = $this->queueFifo;
+               if ( !$queue || !method_exists( $queue, 'getServerQueuesWithJobs' ) ) {
+                       $this->markTestSkipped();
+               }
+
+               $this->assertNotContains(
+                       array( $queue->getType(), $queue->getWiki() ),
+                       $queue->getServerQueuesWithJobs(),
+                       "Null queue not in listing"
+               );
+
+               $queue->push( $this->newJob( 0 ) );
+
+               $this->assertContains(
+                       array( $queue->getType(), $queue->getWiki() ),
+                       $queue->getServerQueuesWithJobs(),
+                       "Null queue in listing"
+               );
+       }
+
        public static function provider_queueLists() {
                return array(
                        array( 'queueRand', false, 'Random queue without ack()' ),
index 577dc3c..f338633 100644 (file)
@@ -79,6 +79,45 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $this->assertInternalType( 'string', $obj->setterArgs[0] );
                $this->assertSame( 'unwrapped', $obj->setterArgs[0] );
        }
+
+       /**
+        * @covers ObjectFactory::constructClassInstance
+        * @dataProvider provideConstructClassInstance
+        */
+       public function testConstructClassInstance( $args ) {
+               $obj = ObjectFactory::constructClassInstance(
+                       'ObjectFactoryTestFixture', $args
+               );
+               $this->assertSame( $args, $obj->args );
+       }
+
+       public function provideConstructClassInstance() {
+               // These args go to 11. I thought about making 10 one louder, but 11!
+               return array(
+                       '0 args' => array( array() ),
+                       '1 args' => array( array( 1, ) ),
+                       '2 args' => array( array( 1, 2, ) ),
+                       '3 args' => array( array( 1, 2, 3, ) ),
+                       '4 args' => array( array( 1, 2, 3, 4, ) ),
+                       '5 args' => array( array( 1, 2, 3, 4, 5, ) ),
+                       '6 args' => array( array( 1, 2, 3, 4, 5, 6, ) ),
+                       '7 args' => array( array( 1, 2, 3, 4, 5, 6, 7, ) ),
+                       '8 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, ) ),
+                       '9 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, ) ),
+                       '10 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ) ),
+                       '11 args' => array( array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ) ),
+               );
+       }
+
+       /**
+        * @expectedException InvalidArgumentException
+        */
+       public function testNamedArgs() {
+               $args = array( 'foo' => 1, 'bar' => 2, 'baz' => 3 );
+               $obj = ObjectFactory::constructClassInstance(
+                       'ObjectFactoryTestFixture', $args
+               );
+       }
 }
 
 class ObjectFactoryTestFixture {
diff --git a/tests/phpunit/includes/libs/RunningStatTest.php b/tests/phpunit/includes/libs/RunningStatTest.php
deleted file mode 100644 (file)
index 35a8e4f..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-/**
- * PHP Unit tests for RunningStat class.
- * @covers RunningStat
- */
-class RunningStatTest extends PHPUnit_Framework_TestCase {
-
-       public $points = array(
-               49.7168, 74.3804,  7.0115, 96.5769, 34.9458,
-               36.9947, 33.8926, 89.0774, 23.7745, 73.5154,
-               86.1322, 53.2124, 16.2046, 73.5130, 10.4209,
-               42.7299, 49.3330, 47.0215, 34.9950, 18.2914,
-       );
-
-       /**
-        * Verify that the statistical moments and extrema computed by RunningStat
-        * match expected values.
-        * @covers RunningStat::push
-        * @covers RunningStat::count
-        * @covers RunningStat::getMean
-        * @covers RunningStat::getVariance
-        * @covers RunningStat::getStdDev
-        */
-       public function testRunningStatAccuracy() {
-               $rstat = new RunningStat();
-               foreach ( $this->points as $point ) {
-                       $rstat->push( $point );
-               }
-
-               $mean = array_sum( $this->points ) / count( $this->points );
-               $variance = array_sum( array_map( function ( $x ) use ( $mean ) {
-                       return pow( $mean - $x, 2 );
-               }, $this->points ) ) / ( count( $rstat ) - 1 );
-               $stddev = sqrt( $variance );
-
-               $this->assertEquals( count( $rstat ), count( $this->points ) );
-               $this->assertEquals( $rstat->min, min( $this->points ) );
-               $this->assertEquals( $rstat->max, max( $this->points ) );
-               $this->assertEquals( $rstat->getMean(), $mean );
-               $this->assertEquals( $rstat->getVariance(), $variance );
-               $this->assertEquals( $rstat->getStdDev(), $stddev );
-       }
-
-       /**
-        * When one RunningStat instance is merged into another, the state of the
-        * target RunningInstance should have the state that it would have had if
-        * all the data had been accumulated by it alone.
-        * @covers RunningStat::merge
-        * @covers RunningStat::count
-        */
-       public function testRunningStatMerge() {
-               $expected = new RunningStat();
-
-               foreach ( $this->points as $point ) {
-                       $expected->push( $point );
-               }
-
-               // Split the data into two sets
-               $sets = array_chunk( $this->points, floor( count( $this->points ) / 2 ) );
-
-               // Accumulate the first half into one RunningStat object
-               $first = new RunningStat();
-               foreach ( $sets[0] as $point ) {
-                       $first->push( $point );
-               }
-
-               // Accumulate the second half into another RunningStat object
-               $second = new RunningStat();
-               foreach ( $sets[1] as $point ) {
-                       $second->push( $point );
-               }
-
-               // Merge the second RunningStat object into the first
-               $first->merge( $second );
-
-               $this->assertEquals( count( $first ), count( $this->points ) );
-               $this->assertEquals( $first, $expected );
-       }
-}
diff --git a/tests/phpunit/includes/libs/TimingTest.php b/tests/phpunit/includes/libs/TimingTest.php
new file mode 100644 (file)
index 0000000..93e9d6b
--- /dev/null
@@ -0,0 +1,111 @@
+<?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
+ * @author Ori Livneh <ori@wikimedia.org>
+ */
+
+class TimingTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @covers Timing::clearMarks
+        * @covers Timing::getEntries
+        */
+       public function testClearMarks() {
+               $timing = new Timing;
+               $this->assertCount( 1, $timing->getEntries() );
+
+               $timing->mark( 'a' );
+               $timing->mark( 'b' );
+               $this->assertCount( 3, $timing->getEntries() );
+
+               $timing->clearMarks( 'a' );
+               $this->assertNull( $timing->getEntryByName( 'a' ) );
+               $this->assertNotNull( $timing->getEntryByName( 'b' ) );
+
+               $timing->clearMarks();
+               $this->assertCount( 1, $timing->getEntries() );
+       }
+
+       /**
+        * @covers Timing::mark
+        * @covers Timing::getEntryByName
+        */
+       public function testMark() {
+               $timing = new Timing;
+               $timing->mark( 'a' );
+
+               $entry = $timing->getEntryByName( 'a' );
+               $this->assertEquals( 'a', $entry['name'] );
+               $this->assertEquals( 'mark', $entry['entryType'] );
+               $this->assertArrayHasKey( 'startTime', $entry );
+               $this->assertEquals( 0, $entry['duration'] );
+
+               $timing->mark( 'a' );
+               $newEntry = $timing->getEntryByName( 'a' );
+               $this->assertGreaterThan( $entry['startTime'], $newEntry['startTime'] );
+       }
+
+       /**
+        * @covers Timing::measure
+        */
+       public function testMeasure() {
+               $timing = new Timing;
+
+               $timing->mark( 'a' );
+               $a = $timing->getEntryByName( 'a' );
+
+               $timing->mark( 'b' );
+               $b = $timing->getEntryByName( 'b' );
+
+               $timing->measure( 'a_to_b', 'a', 'b' );
+
+               $entry = $timing->getEntryByName( 'a_to_b' );
+               $this->assertEquals( 'a_to_b', $entry['name'] );
+               $this->assertEquals( 'measure', $entry['entryType'] );
+               $this->assertEquals( $a['startTime'], $entry['startTime'] );
+               $this->assertEquals( $b['startTime'] - $a['startTime'], $entry['duration'] );
+       }
+
+       /**
+        * @covers Timing::getEntriesByType
+        */
+       public function testGetEntriesByType() {
+               $timing = new Timing;
+
+               $timing->mark( 'mark_a' );
+               usleep( 100 );
+               $timing->mark( 'mark_b' );
+               usleep( 100 );
+               $timing->mark( 'mark_c' );
+
+               $timing->measure( 'measure_a', 'mark_a', 'mark_b' );
+               $timing->measure( 'measure_b', 'mark_b', 'mark_c' );
+
+               $marks = array_map( function ( $entry ) {
+                       return $entry['name'];
+               }, $timing->getEntriesByType( 'mark' ) );
+
+               $this->assertEquals( array( 'requestStart', 'mark_a', 'mark_b', 'mark_c' ), $marks );
+
+               $measures = array_map( function ( $entry ) {
+                       return $entry['name'];
+               }, $timing->getEntriesByType( 'measure' ) );
+
+               $this->assertEquals( array( 'measure_a', 'measure_b' ), $measures );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/BagOStuffTest.php
new file mode 100644 (file)
index 0000000..94b74cb
--- /dev/null
@@ -0,0 +1,243 @@
+<?php
+/**
+ * @author Matthias Mullie <mmullie@wikimedia.org>
+ * @group BagOStuff
+ */
+class BagOStuffTest extends MediaWikiTestCase {
+       /** @var BagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               // type defined through parameter
+               if ( $this->getCliArg( 'use-bagostuff' ) ) {
+                       $name = $this->getCliArg( 'use-bagostuff' );
+
+                       $this->cache = ObjectCache::newFromId( $name );
+               } else {
+                       // no type defined - use simple hash
+                       $this->cache = new HashBagOStuff;
+               }
+
+               $this->cache->delete( wfMemcKey( 'test' ) );
+       }
+
+       /**
+        * @covers BagOStuff::makeGlobalKey
+        * @covers BagOStuff::makeKeyInternal
+        */
+       public function testMakeKey() {
+               $cache = ObjectCache::newFromId( 'hash' );
+
+               $localKey = $cache->makeKey( 'first', 'second', 'third' );
+               $globalKey = $cache->makeGlobalKey( 'first', 'second', 'third' );
+
+               $this->assertStringMatchesFormat(
+                       '%Sfirst%Ssecond%Sthird%S',
+                       $localKey,
+                       'Local key interpolates parameters'
+               );
+
+               $this->assertStringMatchesFormat(
+                       'global%Sfirst%Ssecond%Sthird%S',
+                       $globalKey,
+                       'Global key interpolates parameters and contains global prefix'
+               );
+
+               $this->assertNotEquals(
+                       $localKey,
+                       $globalKey,
+                       'Local key and global key with same parameters should not be equal'
+               );
+
+               $this->assertNotEquals(
+                       $cache->makeKeyInternal( 'prefix', array( 'a', 'bc:', 'de' ) ),
+                       $cache->makeKeyInternal( 'prefix', array( 'a', 'bc', ':de' ) )
+               );
+       }
+
+       /**
+        * @covers BagOStuff::merge
+        * @covers BagOStuff::mergeViaLock
+        */
+       public function testMerge() {
+               $key = wfMemcKey( 'test' );
+
+               $usleep = 0;
+
+               /**
+                * Callback method: append "merged" to whatever is in cache.
+                *
+                * @param BagOStuff $cache
+                * @param string $key
+                * @param int $existingValue
+                * @use int $usleep
+                * @return int
+                */
+               $callback = function ( BagOStuff $cache, $key, $existingValue ) use ( &$usleep ) {
+                       // let's pretend this is an expensive callback to test concurrent merge attempts
+                       usleep( $usleep );
+
+                       if ( $existingValue === false ) {
+                               return 'merged';
+                       }
+
+                       return $existingValue . 'merged';
+               };
+
+               // merge on non-existing value
+               $merged = $this->cache->merge( $key, $callback, 0 );
+               $this->assertTrue( $merged );
+               $this->assertEquals( $this->cache->get( $key ), 'merged' );
+
+               // merge on existing value
+               $merged = $this->cache->merge( $key, $callback, 0 );
+               $this->assertTrue( $merged );
+               $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' );
+
+               /*
+                * Test concurrent merges by forking this process, if:
+                * - not manually called with --use-bagostuff
+                * - pcntl_fork is supported by the system
+                * - cache type will correctly support calls over forks
+                */
+               $fork = (bool)$this->getCliArg( 'use-bagostuff' );
+               $fork &= function_exists( 'pcntl_fork' );
+               $fork &= !$this->cache instanceof HashBagOStuff;
+               $fork &= !$this->cache instanceof EmptyBagOStuff;
+               $fork &= !$this->cache instanceof MultiWriteBagOStuff;
+               if ( $fork ) {
+                       // callback should take awhile now so that we can test concurrent merge attempts
+                       $pid = pcntl_fork();
+                       if ( $pid == -1 ) {
+                               // can't fork, ignore this test...
+                       } elseif ( $pid ) {
+                               // wait a little, making sure that the child process is calling merge
+                               usleep( 3000 );
+
+                               // attempt a merge - this should fail
+                               $merged = $this->cache->merge( $key, $callback, 0, 1 );
+
+                               // merge has failed because child process was merging (and we only attempted once)
+                               $this->assertFalse( $merged );
+
+                               // make sure the child's merge is completed and verify
+                               usleep( 3000 );
+                               $this->assertEquals( $this->cache->get( $key ), 'mergedmergedmerged' );
+                       } else {
+                               $this->cache->merge( $key, $callback, 0, 1 );
+
+                               // Note: I'm not even going to check if the merge worked, I'll
+                               // compare values in the parent process to test if this merge worked.
+                               // I'm just going to exit this child process, since I don't want the
+                               // child to output any test results (would be rather confusing to
+                               // have test output twice)
+                               exit;
+                       }
+               }
+       }
+
+       /**
+        * @covers BagOStuff::add
+        */
+       public function testAdd() {
+               $key = wfMemcKey( 'test' );
+               $this->assertTrue( $this->cache->add( $key, 'test' ) );
+       }
+
+       public function testGet() {
+               $value = array( 'this' => 'is', 'a' => 'test' );
+
+               $key = wfMemcKey( 'test' );
+               $this->cache->add( $key, $value );
+               $this->assertEquals( $this->cache->get( $key ), $value );
+       }
+
+       /**
+        * @covers BagOStuff::getWithSetCallback
+        */
+       public function testGetWithSetCallback() {
+               $key = wfMemcKey( 'test' );
+               $value = $this->cache->getWithSetCallback(
+                       $key,
+                       30,
+                       function () {
+                               return 'hello kitty';
+                       }
+               );
+
+               $this->assertEquals( 'hello kitty', $value );
+               $this->assertEquals( $value, $this->cache->get( $key ) );
+       }
+
+       /**
+        * @covers BagOStuff::incr
+        */
+       public function testIncr() {
+               $key = wfMemcKey( 'test' );
+               $this->cache->add( $key, 0 );
+               $this->cache->incr( $key );
+               $expectedValue = 1;
+               $actualValue = $this->cache->get( $key );
+               $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
+       }
+
+       /**
+        * @covers BagOStuff::getMulti
+        */
+       public function testGetMulti() {
+               $value1 = array( 'this' => 'is', 'a' => 'test' );
+               $value2 = array( 'this' => 'is', 'another' => 'test' );
+               $value3 = array( 'testing a key that may be encoded when sent to cache backend' );
+               $value4 = array( 'another test where chars in key will be encoded' );
+
+               $key1 = wfMemcKey( 'test1' );
+               $key2 = wfMemcKey( 'test2' );
+               // internally, MemcachedBagOStuffs will encode to will-%25-encode
+               $key3 = wfMemcKey( 'will-%-encode' );
+               $key4 = wfMemcKey(
+                       'flowdb:flow_ref:wiki:by-source:v3:Parser\'s_"broken"_+_(page)_&_grill:testwiki:1:4.7'
+               );
+
+               $this->cache->add( $key1, $value1 );
+               $this->cache->add( $key2, $value2 );
+               $this->cache->add( $key3, $value3 );
+               $this->cache->add( $key4, $value4 );
+
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2, $key3 => $value3, $key4 => $value4 ),
+                       $this->cache->getMulti( array( $key1, $key2, $key3, $key4 ) )
+               );
+
+               // cleanup
+               $this->cache->delete( $key1 );
+               $this->cache->delete( $key2 );
+               $this->cache->delete( $key3 );
+               $this->cache->delete( $key4 );
+       }
+
+       /**
+        * @covers BagOStuff::getScopedLock
+        */
+       public function testGetScopedLock() {
+               $key = wfMemcKey( 'test' );
+               $value1 = $this->cache->getScopedLock( $key, 0 );
+               $value2 = $this->cache->getScopedLock( $key, 0 );
+
+               $this->assertType( 'ScopedCallback', $value1, 'First call returned lock' );
+               $this->assertNull( $value2, 'Duplicate call returned no lock' );
+
+               unset( $value1 );
+
+               $value3 = $this->cache->getScopedLock( $key, 0 );
+               $this->assertType( 'ScopedCallback', $value3, 'Lock returned callback after release' );
+               unset( $value3 );
+
+               $value1 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
+               $value2 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
+
+               $this->assertType( 'ScopedCallback', $value1, 'First reentrant call returned lock' );
+               $this->assertType( 'ScopedCallback', $value1, 'Second reentrant call returned lock' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php
new file mode 100644 (file)
index 0000000..5194e8d
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * @group BagOStuff
+ */
+class HashBagOStuffTest extends PHPUnit_Framework_TestCase {
+
+       public function testDelete() {
+               $cache = new HashBagOStuff();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+                       $cache->delete( "key$i" );
+                       $this->assertEquals( false, $cache->get( "key$i" ) );
+               }
+       }
+
+       public function testClear() {
+               $cache = new HashBagOStuff();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+               }
+               $cache->clear();
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $this->assertEquals( false, $cache->get( "key$i" ) );
+               }
+       }
+
+       public function testExpire() {
+               $cache = new HashBagOStuff();
+               $cacheInternal = TestingAccessWrapper::newFromObject( $cache );
+               $cache->set( 'foo', 1 );
+               $cache->set( 'bar', 1, 10 );
+               $cache->set( 'baz', 1, -10 );
+
+               $this->assertEquals( 0, $cacheInternal->bag['foo'][$cache::KEY_EXP], 'Indefinite' );
+               // 2 seconds tolerance
+               $this->assertEquals( time() + 10, $cacheInternal->bag['bar'][$cache::KEY_EXP], 'Future', 2 );
+               $this->assertEquals( time() - 10, $cacheInternal->bag['baz'][$cache::KEY_EXP], 'Past', 2 );
+
+               $this->assertEquals( 1, $cache->get( 'bar' ), 'Key not expired' );
+               $this->assertEquals( false, $cache->get( 'baz' ), 'Key expired' );
+       }
+
+       /**
+        * Ensure maxKeys eviction prefers keeping new keys.
+        */
+       public function testEvictionAdd() {
+               $cache = new HashBagOStuff( array( 'maxKeys' => 10 ) );
+               for ( $i = 0; $i < 10; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+               }
+               for ( $i = 10; $i < 20; $i++ ) {
+                       $cache->set( "key$i", 1 );
+                       $this->assertEquals( 1, $cache->get( "key$i" ) );
+                       $this->assertEquals( false, $cache->get( "key" . $i - 10 ) );
+               }
+       }
+
+       /**
+        * Ensure maxKeys eviction prefers recently set keys
+        * even if the keys pre-exist.
+        */
+       public function testEvictionSet() {
+               $cache = new HashBagOStuff( array( 'maxKeys' => 3 ) );
+
+               foreach ( array( 'foo', 'bar', 'baz' ) as $key ) {
+                       $cache->set( $key, 1 );
+               }
+
+               // Set existing key
+               $cache->set( 'foo', 1 );
+
+               // Add a 4th key (beyond the allowed maximum)
+               $cache->set( 'quux', 1 );
+
+               // Foo's life should have been extended over Bar
+               foreach ( array( 'foo', 'baz', 'quux' ) as $key ) {
+                       $this->assertEquals( 1, $cache->get( $key ), "Kept $key" );
+               }
+               $this->assertEquals( false, $cache->get( 'bar' ), 'Evicted bar' );
+       }
+
+       /**
+        * Ensure maxKeys eviction prefers recently retrieved keys (LRU).
+        */
+       public function testEvictionGet() {
+               $cache = new HashBagOStuff( array( 'maxKeys' => 3 ) );
+
+               foreach ( array( 'foo', 'bar', 'baz' ) as $key ) {
+                       $cache->set( $key, 1 );
+               }
+
+               // Get existing key
+               $cache->get( 'foo', 1 );
+
+               // Add a 4th key (beyond the allowed maximum)
+               $cache->set( 'quux', 1 );
+
+               // Foo's life should have been extended over Bar
+               foreach ( array( 'foo', 'baz', 'quux' ) as $key ) {
+                       $this->assertEquals( 1, $cache->get( $key ), "Kept $key" );
+               }
+               $this->assertEquals( false, $cache->get( 'bar' ), 'Evicted bar' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/MultiWriteBagOStuffTest.php
new file mode 100644 (file)
index 0000000..1d8f43a
--- /dev/null
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * @group Database
+ */
+class MultiWriteBagOStuffTest extends MediaWikiTestCase {
+       /** @var HashBagOStuff */
+       private $cache1;
+       /** @var HashBagOStuff */
+       private $cache2;
+       /** @var MultiWriteBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->cache1 = new HashBagOStuff();
+               $this->cache2 = new HashBagOStuff();
+               $this->cache = new MultiWriteBagOStuff( array(
+                       'caches' => array( $this->cache1, $this->cache2 ),
+                       'replication' => 'async',
+                       'asyncHandler' => 'DeferredUpdates::addCallableUpdate'
+               ) );
+       }
+
+       public function testSetImmediate() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+       }
+
+       public function testSyncMerge() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $func = function () use ( $value ) {
+                       return $value;
+               };
+
+               // XXX: DeferredUpdates bound to transactions in CLI mode
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin();
+               $this->cache->merge( $key, $func );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Not yet set in tier 2
+               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
+
+               $dbw->commit();
+
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+
+               $key = wfRandomString();
+
+               $dbw->begin();
+               $this->cache->merge( $key, $func, 0, 1, BagOStuff::WRITE_SYNC );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Also set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+
+               $dbw->commit();
+       }
+
+       public function testSetDelayed() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               // XXX: DeferredUpdates bound to transactions in CLI mode
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin();
+               $this->cache->set( $key, $value );
+
+               // Set in tier 1
+               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
+               // Not yet set in tier 2
+               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
+
+               $dbw->commit();
+
+               // Set in tier 2
+               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php b/tests/phpunit/includes/libs/objectcache/ReplicatedBagOStuffTest.php
new file mode 100644 (file)
index 0000000..a419f5b
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+
+class ReplicatedBagOStuffTest extends MediaWikiTestCase {
+       /** @var HashBagOStuff */
+       private $writeCache;
+       /** @var HashBagOStuff */
+       private $readCache;
+       /** @var ReplicatedBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->writeCache = new HashBagOStuff();
+               $this->readCache = new HashBagOStuff();
+               $this->cache = new ReplicatedBagOStuff( array(
+                       'writeFactory' => $this->writeCache,
+                       'readFactory' => $this->readCache,
+               ) );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::set
+        */
+       public function testSet() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               // Write to master.
+               $this->assertEquals( $this->writeCache->get( $key ), $value );
+               // Don't write to slave. Replication is deferred to backend.
+               $this->assertEquals( $this->readCache->get( $key ), false );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::get
+        */
+       public function testGet() {
+               $key = wfRandomString();
+
+               $write = wfRandomString();
+               $this->writeCache->set( $key, $write );
+               $read = wfRandomString();
+               $this->readCache->set( $key, $read );
+
+               // Read from slave.
+               $this->assertEquals( $this->cache->get( $key ), $read );
+       }
+
+       /**
+        * @covers ReplicatedBagOStuff::get
+        */
+       public function testGetAbsent() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->writeCache->set( $key, $value );
+
+               // Don't read from master. No failover if value is absent.
+               $this->assertEquals( $this->cache->get( $key ), false );
+       }
+}
diff --git a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
new file mode 100644 (file)
index 0000000..efc37d2
--- /dev/null
@@ -0,0 +1,540 @@
+<?php
+
+class WANObjectCacheTest extends MediaWikiTestCase {
+       /** @var WANObjectCache */
+       private $cache;
+       /**@var BagOStuff */
+       private $internalCache;
+
+       protected function setUp() {
+               parent::setUp();
+
+               if ( $this->getCliArg( 'use-wanobjectcache' ) ) {
+                       $name = $this->getCliArg( 'use-wanobjectcache' );
+
+                       $this->cache = ObjectCache::getWANInstance( $name );
+               } else {
+                       $this->cache = new WANObjectCache( array(
+                               'cache' => new HashBagOStuff(),
+                               'pool' => 'testcache-hash',
+                               'relayer' => new EventRelayerNull( array() )
+                       ) );
+               }
+
+               $wanCache = TestingAccessWrapper::newFromObject( $this->cache );
+               $this->internalCache = $wanCache->cache;
+       }
+
+       /**
+        * @dataProvider provideSetAndGet
+        * @covers WANObjectCache::set()
+        * @covers WANObjectCache::get()
+        * @param mixed $value
+        * @param integer $ttl
+        */
+       public function testSetAndGet( $value, $ttl ) {
+               $key = wfRandomString();
+               $this->cache->set( $key, $value, $ttl );
+
+               $curTTL = null;
+               $this->assertEquals( $value, $this->cache->get( $key, $curTTL ) );
+               if ( is_infinite( $ttl ) || $ttl == 0 ) {
+                       $this->assertTrue( is_infinite( $curTTL ), "Current TTL is infinite" );
+               } else {
+                       $this->assertGreaterThan( 0, $curTTL, "Current TTL > 0" );
+                       $this->assertLessThanOrEqual( $ttl, $curTTL, "Current TTL < nominal TTL" );
+               }
+       }
+
+       public static function provideSetAndGet() {
+               return array(
+                       array( 14141, 3 ),
+                       array( 3535.666, 3 ),
+                       array( array(), 3 ),
+                       array( null, 3 ),
+                       array( '0', 3 ),
+                       array( (object)array( 'meow' ), 3 ),
+                       array( INF, 3 ),
+                       array( '', 3 ),
+                       array( 'pizzacat', INF ),
+               );
+       }
+
+       /**
+        * @covers WANObjectCache::get()
+        */
+       public function testGetNotExists() {
+               $key = wfRandomString();
+               $curTTL = null;
+               $value = $this->cache->get( $key, $curTTL );
+
+               $this->assertFalse( $value, "Non-existing key has false value" );
+               $this->assertNull( $curTTL, "Non-existing key has null current TTL" );
+       }
+
+       /**
+        * @covers WANObjectCache::set()
+        */
+       public function testSetOver() {
+               $key = wfRandomString();
+               for ( $i = 0; $i < 3; ++$i ) {
+                       $value = wfRandomString();
+                       $this->cache->set( $key, $value, 3 );
+
+                       $this->assertEquals( $this->cache->get( $key ), $value );
+               }
+       }
+
+       /**
+        * @covers WANObjectCache::set()
+        */
+       public function testStaleSet() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value, 3, array( 'since' => microtime( true ) - 30 ) );
+
+               $this->assertFalse( $this->cache->get( $key ), "Stale set() value ignored" );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        * @covers WANObjectCache::doGetWithSetCallback()
+        */
+       public function testGetWithSetCallback() {
+               $cache = $this->cache;
+
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $cKey1 = wfRandomString();
+               $cKey2 = wfRandomString();
+
+               $wasSet = 0;
+               $func = function( $old, &$ttl ) use ( &$wasSet, $value ) {
+                       ++$wasSet;
+                       $ttl = 20; // override with another value
+                       return $value;
+               };
+
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated" );
+
+               $curTTL = null;
+               $cache->get( $key, $curTTL );
+               $this->assertLessThanOrEqual( 20, $curTTL, 'Current TTL between 19-20 (overriden)' );
+               $this->assertGreaterThanOrEqual( 19, $curTTL, 'Current TTL between 19-20 (overriden)' );
+
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func, array(
+                       'lowTTL' => 0,
+                       'lockTSE' => 5,
+               ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func,
+                       array( 'checkKeys' => array( $cKey1, $cKey2 ) ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check keys generated on miss' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
+
+               $priorTime = microtime( true );
+               $wasSet = 0;
+               $v = $cache->getWithSetCallback( $key, 30, $func,
+                       array( 'checkKeys' => array( $cKey1, $cKey2 ) ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertLessThanOrEqual( $priorTime, $t1, 'Check keys did not change again' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertLessThanOrEqual( $priorTime, $t2, 'Check keys did not change again' );
+
+               $curTTL = null;
+               $v = $cache->get( $key, $curTTL, array( $cKey1, $cKey2 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
+
+               $wasSet = 0;
+               $key = wfRandomString();
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'pcTTL' => 5 ) );
+               $this->assertEquals( $value, $v, "Value returned" );
+               $cache->delete( $key );
+               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'pcTTL' => 5 ) );
+               $this->assertEquals( $value, $v, "Value still returned after deleted" );
+               $this->assertEquals( 1, $wasSet, "Value process cached while deleted" );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        * @covers WANObjectCache::doGetWithSetCallback()
+        */
+       public function testLockTSE() {
+               $cache = $this->cache;
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               $calls = 0;
+               $func = function() use ( &$calls, $value ) {
+                       ++$calls;
+                       return $value;
+               };
+
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Value was populated' );
+
+               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
+               $this->internalCache->lock( $key, 0 );
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Callback was not used' );
+       }
+
+       /**
+        * @covers WANObjectCache::getWithSetCallback()
+        * @covers WANObjectCache::doGetWithSetCallback()
+        */
+       public function testLockTSESlow() {
+               $cache = $this->cache;
+               $key = wfRandomString();
+               $value = wfRandomString();
+
+               $calls = 0;
+               $func = function( $oldValue, &$ttl, &$setOpts ) use ( &$calls, $value ) {
+                       ++$calls;
+                       $setOpts['since'] = microtime( true ) - 10;
+                       return $value;
+               };
+
+               // Value should be marked as stale due to snapshot lag
+               $curTTL = null;
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( $value, $cache->get( $key, $curTTL ), 'Value was populated' );
+               $this->assertLessThan( 0, $curTTL, 'Value has negative curTTL' );
+               $this->assertEquals( 1, $calls, 'Value was generated' );
+
+               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
+               $this->internalCache->lock( $key, 0 );
+               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
+               $this->assertEquals( $value, $ret );
+               $this->assertEquals( 1, $calls, 'Callback was not used' );
+       }
+
+       /**
+        * @covers WANObjectCache::getMulti()
+        */
+       public function testGetMulti() {
+               $cache = $this->cache;
+
+               $value1 = array( 'this' => 'is', 'a' => 'test' );
+               $value2 = array( 'this' => 'is', 'another' => 'test' );
+
+               $key1 = wfRandomString();
+               $key2 = wfRandomString();
+               $key3 = wfRandomString();
+
+               $cache->set( $key1, $value1, 5 );
+               $cache->set( $key2, $value2, 10 );
+
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
+                       'Result array populated'
+               );
+
+               $this->assertEquals( 2, count( $curTTLs ), "Two current TTLs in array" );
+               $this->assertGreaterThan( 0, $curTTLs[$key1], "Key 1 has current TTL > 0" );
+               $this->assertGreaterThan( 0, $curTTLs[$key2], "Key 2 has current TTL > 0" );
+
+               $cKey1 = wfRandomString();
+               $cKey2 = wfRandomString();
+
+               $priorTime = microtime( true );
+               usleep( 1 );
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
+                       "Result array populated even with new check keys"
+               );
+               $t1 = $cache->getCheckKeyTime( $cKey1 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key 1 generated on miss' );
+               $t2 = $cache->getCheckKeyTime( $cKey2 );
+               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check key 2 generated on miss' );
+               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs array set" );
+               $this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
+               $this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
+
+               usleep( 1 );
+               $curTTLs = array();
+               $this->assertEquals(
+                       array( $key1 => $value1, $key2 => $value2 ),
+                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
+                       "Result array still populated even with new check keys"
+               );
+               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs still array set" );
+               $this->assertLessThan( 0, $curTTLs[$key1], 'Key 1 has negative current TTL' );
+               $this->assertLessThan( 0, $curTTLs[$key2], 'Key 2 has negative current TTL' );
+       }
+
+       /**
+        * @covers WANObjectCache::getMulti()
+        * @covers WANObjectCache::processCheckKeys()
+        */
+       public function testGetMultiCheckKeys() {
+               $cache = $this->cache;
+
+               $checkAll = wfRandomString();
+               $check1 = wfRandomString();
+               $check2 = wfRandomString();
+               $check3 = wfRandomString();
+               $value1 = wfRandomString();
+               $value2 = wfRandomString();
+
+               // Fake initial check key to be set in the past. Otherwise we'd have to sleep for
+               // several seconds during the test to assert the behaviour.
+               foreach ( array( $checkAll, $check1, $check2 ) as $checkKey ) {
+                       $cache->touchCheckKey( $checkKey, WANObjectCache::HOLDOFF_NONE );
+               }
+               usleep( 100 );
+
+               $cache->set( 'key1', $value1, 10 );
+               $cache->set( 'key2', $value2, 10 );
+
+               $curTTLs = array();
+               $result = $cache->getMulti( array( 'key1', 'key2', 'key3' ), $curTTLs, array(
+                       'key1' => $check1,
+                       $checkAll,
+                       'key2' => $check2,
+                       'key3' => $check3,
+               ) );
+               $this->assertEquals(
+                       array( 'key1' => $value1, 'key2' => $value2 ),
+                       $result,
+                       'Initial values'
+               );
+               $this->assertGreaterThanOrEqual( 9.5, $curTTLs['key1'], 'Initial ttls' );
+               $this->assertLessThanOrEqual( 10.5, $curTTLs['key1'], 'Initial ttls' );
+               $this->assertGreaterThanOrEqual( 9.5, $curTTLs['key2'], 'Initial ttls' );
+               $this->assertLessThanOrEqual( 10.5, $curTTLs['key2'], 'Initial ttls' );
+
+               $cache->touchCheckKey( $check1 );
+
+               $curTTLs = array();
+               $result = $cache->getMulti( array( 'key1', 'key2', 'key3' ), $curTTLs, array(
+                       'key1' => $check1,
+                       $checkAll,
+                       'key2' => $check2,
+                       'key3' => $check3,
+               ) );
+               $this->assertEquals(
+                       array( 'key1' => $value1, 'key2' => $value2 ),
+                       $result,
+                       'key1 expired by check1, but value still provided'
+               );
+               $this->assertLessThan( 0, $curTTLs['key1'], 'key1 TTL expired' );
+               $this->assertGreaterThan( 0, $curTTLs['key2'], 'key2 still valid' );
+
+               $cache->touchCheckKey( $checkAll );
+
+               $curTTLs = array();
+               $result = $cache->getMulti( array( 'key1', 'key2', 'key3' ), $curTTLs, array(
+                       'key1' => $check1,
+                       $checkAll,
+                       'key2' => $check2,
+                       'key3' => $check3,
+               ) );
+               $this->assertEquals(
+                       array( 'key1' => $value1, 'key2' => $value2 ),
+                       $result,
+                       'All keys expired by checkAll, but value still provided'
+               );
+               $this->assertLessThan( 0, $curTTLs['key1'], 'key1 expired by checkAll' );
+               $this->assertLessThan( 0, $curTTLs['key2'], 'key2 expired by checkAll' );
+       }
+
+       /**
+        * @covers WANObjectCache::get()
+        * @covers WANObjectCache::processCheckKeys()
+        */
+       public function testCheckKeyInitHoldoff() {
+               $cache = $this->cache;
+
+               for ( $i = 0; $i < 500; ++$i ) {
+                       $key = wfRandomString();
+                       $checkKey = wfRandomString();
+                       // miss, set, hit
+                       $cache->get( $key, $curTTL, array( $checkKey ) );
+                       $cache->set( $key, 'val', 10 );
+                       $curTTL = null;
+                       $v = $cache->get( $key, $curTTL, array( $checkKey ) );
+
+                       $this->assertEquals( 'val', $v );
+                       $this->assertLessThan( 0, $curTTL, "Step $i: CTL < 0 (miss/set/hit)" );
+               }
+
+               for ( $i = 0; $i < 500; ++$i ) {
+                       $key = wfRandomString();
+                       $checkKey = wfRandomString();
+                       // set, hit
+                       $cache->set( $key, 'val', 10 );
+                       $curTTL = null;
+                       $v = $cache->get( $key, $curTTL, array( $checkKey ) );
+
+                       $this->assertEquals( 'val', $v );
+                       $this->assertLessThan( 0, $curTTL, "Step $i: CTL < 0 (set/hit)" );
+               }
+       }
+
+       /**
+        * @covers WANObjectCache::delete()
+        */
+       public function testDelete() {
+               $key = wfRandomString();
+               $value = wfRandomString();
+               $this->cache->set( $key, $value );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertEquals( $value, $v, "Key was created with value" );
+               $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
+
+               $this->cache->delete( $key );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertFalse( $v, "Deleted key has false value" );
+               $this->assertLessThan( 0, $curTTL, "Deleted key has current TTL < 0" );
+
+               $this->cache->set( $key, $value . 'more' );
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertFalse( $v, "Deleted key is tombstoned and has false value" );
+               $this->assertLessThan( 0, $curTTL, "Deleted key is tombstoned and has current TTL < 0" );
+
+               $this->cache->set( $key, $value );
+               $this->cache->delete( $key, WANObjectCache::HOLDOFF_NONE );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertFalse( $v, "Deleted key has false value" );
+               $this->assertNull( $curTTL, "Deleted key has null current TTL" );
+
+               $this->cache->set( $key, $value );
+               $v = $this->cache->get( $key, $curTTL );
+               $this->assertEquals( $value, $v, "Key was created with value" );
+               $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
+       }
+
+       /**
+        * @covers WANObjectCache::touchCheckKey()
+        * @covers WANObjectCache::resetCheckKey()
+        * @covers WANObjectCache::getCheckKeyTime()
+        */
+       public function testTouchKeys() {
+               $key = wfRandomString();
+
+               $priorTime = microtime( true );
+               usleep( 100 );
+               $t0 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
+
+               $priorTime = microtime( true );
+               usleep( 100 );
+               $this->cache->touchCheckKey( $key );
+               $t1 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
+
+               $t2 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t1, $t2, 'Check key time did not change' );
+
+               usleep( 100 );
+               $this->cache->touchCheckKey( $key );
+               $t3 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
+
+               $t4 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t3, $t4, 'Check key time did not change' );
+
+               usleep( 100 );
+               $this->cache->resetCheckKey( $key );
+               $t5 = $this->cache->getCheckKeyTime( $key );
+               $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
+
+               $t6 = $this->cache->getCheckKeyTime( $key );
+               $this->assertEquals( $t5, $t6, 'Check key time did not change' );
+       }
+
+       /**
+        * @covers WANObjectCache::getMulti()
+        */
+       public function testGetWithSeveralCheckKeys() {
+               $key = wfRandomString();
+               $tKey1 = wfRandomString();
+               $tKey2 = wfRandomString();
+               $value = 'meow';
+
+               // Two check keys are newer (given hold-off) than $key, another is older
+               $this->internalCache->set(
+                       WANObjectCache::TIME_KEY_PREFIX . $tKey2,
+                       WANObjectCache::PURGE_VAL_PREFIX . ( microtime( true ) - 3 )
+               );
+               $this->internalCache->set(
+                       WANObjectCache::TIME_KEY_PREFIX . $tKey2,
+                       WANObjectCache::PURGE_VAL_PREFIX . ( microtime( true ) - 5 )
+               );
+               $this->internalCache->set(
+                       WANObjectCache::TIME_KEY_PREFIX . $tKey1,
+                       WANObjectCache::PURGE_VAL_PREFIX . ( microtime( true ) - 30 )
+               );
+               $this->cache->set( $key, $value, 30 );
+
+               $curTTL = null;
+               $v = $this->cache->get( $key, $curTTL, array( $tKey1, $tKey2 ) );
+               $this->assertEquals( $value, $v, "Value matches" );
+               $this->assertLessThan( -4.9, $curTTL, "Correct CTL" );
+               $this->assertGreaterThan( -5.1, $curTTL, "Correct CTL" );
+       }
+
+       /**
+        * @covers WANObjectCache::set()
+        */
+       public function testSetWithLag() {
+               $value = 1;
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 300, 'since' => microtime( true ) );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( $value, $this->cache->get( $key ), "Rep-lagged value written." );
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 0, 'since' => microtime( true ) - 300 );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Trx-lagged value not written." );
+
+               $key = wfRandomString();
+               $opts = array( 'lag' => 5, 'since' => microtime( true ) - 5 );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Lagged value not written." );
+       }
+
+       /**
+        * @covers WANObjectCache::set()
+        */
+       public function testWritePending() {
+               $value = 1;
+
+               $key = wfRandomString();
+               $opts = array( 'pending' => true );
+               $this->cache->set( $key, $value, 30, $opts );
+               $this->assertEquals( false, $this->cache->get( $key ), "Pending value not written." );
+       }
+}
diff --git a/tests/phpunit/includes/logging/ImportLogFormatterTest.php b/tests/phpunit/includes/logging/ImportLogFormatterTest.php
new file mode 100644 (file)
index 0000000..5e67c6b
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+
+class ImportLogFormatterTest extends LogFormatterTestCase {
+
+       /**
+        * Provide different rows from the logging table to test
+        * for backward compatibility.
+        * Do not change the existing data, just add a new database row
+        */
+       public static function provideUploadLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'import',
+                                       'action' => 'upload',
+                                       'comment' => 'upload comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ImportPage',
+                                       'params' => array(
+                                               '4:number:count' => '1',
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User imported ImportPage by file upload (1 revision)',
+                                       'api' => array(
+                                               'count' => 1,
+                                       ),
+                               ),
+                       ),
+
+                       // old format - without details
+                       array(
+                               array(
+                                       'type' => 'import',
+                                       'action' => 'upload',
+                                       'comment' => '1 revision: import comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ImportPage',
+                                       'params' => array(),
+                               ),
+                               array(
+                                       'text' => 'User imported ImportPage by file upload',
+                                       'api' => array(),
+                               ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideUploadLogDatabaseRows
+        */
+       public function testUploadLogDatabaseRows( $row, $extra ) {
+               $this->doTestLogFormatter( $row, $extra );
+       }
+
+       /**
+        * Provide different rows from the logging table to test
+        * for backward compatibility.
+        * Do not change the existing data, just add a new database row
+        */
+       public static function provideInterwikiLogDatabaseRows() {
+               return array(
+                       // Current format
+                       array(
+                               array(
+                                       'type' => 'import',
+                                       'action' => 'interwiki',
+                                       'comment' => 'interwiki comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ImportPage',
+                                       'params' => array(
+                                               '4:number:count' => '1',
+                                               '5:title-link:interwiki' => 'importiw:PageImport',
+                                       ),
+                               ),
+                               array(
+                                       'text' => 'User imported ImportPage from importiw:PageImport (1 revision)',
+                                       'api' => array(
+                                               'count' => 1,
+                                               'interwiki_ns' => 0,
+                                               'interwiki_title' => 'importiw:PageImport',
+                                       ),
+                               ),
+                       ),
+
+                       // old format - without details
+                       array(
+                               array(
+                                       'type' => 'import',
+                                       'action' => 'interwiki',
+                                       'comment' => '1 revision from importiw:PageImport: interwiki comment',
+                                       'namespace' => NS_MAIN,
+                                       'title' => 'ImportPage',
+                                       'params' => array(),
+                               ),
+                               array(
+                                       'text' => 'User imported ImportPage from another wiki',
+                                       'api' => array(),
+                               ),
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideInterwikiLogDatabaseRows
+        */
+       public function testInterwikiLogDatabaseRows( $row, $extra ) {
+               // Setup importiw: as interwiki prefix
+               $this->setMwGlobals( 'wgHooks', array(
+                       'InterwikiLoadPrefix' => array(
+                               function ( $prefix, &$data ) {
+                                       if ( $prefix == 'importiw' ) {
+                                               $data = array( 'iw_url' => 'wikipedia' );
+                                       }
+                                       return false;
+                               }
+                       )
+               ) );
+
+               $this->doTestLogFormatter( $row, $extra );
+       }
+}
diff --git a/tests/phpunit/includes/objectcache/BagOStuffTest.php b/tests/phpunit/includes/objectcache/BagOStuffTest.php
deleted file mode 100644 (file)
index 466b9f5..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-<?php
-/**
- * @author Matthias Mullie <mmullie@wikimedia.org>
- * @group BagOStuff
- */
-class BagOStuffTest extends MediaWikiTestCase {
-       /** @var BagOStuff */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               // type defined through parameter
-               if ( $this->getCliArg( 'use-bagostuff' ) ) {
-                       $name = $this->getCliArg( 'use-bagostuff' );
-
-                       $this->cache = ObjectCache::newFromId( $name );
-               } else {
-                       // no type defined - use simple hash
-                       $this->cache = new HashBagOStuff;
-               }
-
-               $this->cache->delete( wfMemcKey( 'test' ) );
-       }
-
-       /**
-        * @covers BagOStuff::makeGlobalKey
-        * @covers BagOStuff::makeKeyInternal
-        */
-       public function testMakeKey() {
-               $cache = ObjectCache::newFromId( 'hash' );
-
-               $localKey = $cache->makeKey( 'first', 'second', 'third' );
-               $globalKey = $cache->makeGlobalKey( 'first', 'second', 'third' );
-
-               $this->assertStringMatchesFormat(
-                       '%Sfirst%Ssecond%Sthird%S',
-                       $localKey,
-                       'Local key interpolates parameters'
-               );
-
-               $this->assertStringMatchesFormat(
-                       'global%Sfirst%Ssecond%Sthird%S',
-                       $globalKey,
-                       'Global key interpolates parameters and contains global prefix'
-               );
-
-               $this->assertNotEquals(
-                       $localKey,
-                       $globalKey,
-                       'Local key and global key with same parameters should not be equal'
-               );
-       }
-
-       /**
-        * @covers BagOStuff::merge
-        * @covers BagOStuff::mergeViaLock
-        */
-       public function testMerge() {
-               $key = wfMemcKey( 'test' );
-
-               $usleep = 0;
-
-               /**
-                * Callback method: append "merged" to whatever is in cache.
-                *
-                * @param BagOStuff $cache
-                * @param string $key
-                * @param int $existingValue
-                * @use int $usleep
-                * @return int
-                */
-               $callback = function ( BagOStuff $cache, $key, $existingValue ) use ( &$usleep ) {
-                       // let's pretend this is an expensive callback to test concurrent merge attempts
-                       usleep( $usleep );
-
-                       if ( $existingValue === false ) {
-                               return 'merged';
-                       }
-
-                       return $existingValue . 'merged';
-               };
-
-               // merge on non-existing value
-               $merged = $this->cache->merge( $key, $callback, 0 );
-               $this->assertTrue( $merged );
-               $this->assertEquals( $this->cache->get( $key ), 'merged' );
-
-               // merge on existing value
-               $merged = $this->cache->merge( $key, $callback, 0 );
-               $this->assertTrue( $merged );
-               $this->assertEquals( $this->cache->get( $key ), 'mergedmerged' );
-
-               /*
-                * Test concurrent merges by forking this process, if:
-                * - not manually called with --use-bagostuff
-                * - pcntl_fork is supported by the system
-                * - cache type will correctly support calls over forks
-                */
-               $fork = (bool)$this->getCliArg( 'use-bagostuff' );
-               $fork &= function_exists( 'pcntl_fork' );
-               $fork &= !$this->cache instanceof HashBagOStuff;
-               $fork &= !$this->cache instanceof EmptyBagOStuff;
-               $fork &= !$this->cache instanceof MultiWriteBagOStuff;
-               if ( $fork ) {
-                       // callback should take awhile now so that we can test concurrent merge attempts
-                       $pid = pcntl_fork();
-                       if ( $pid == -1 ) {
-                               // can't fork, ignore this test...
-                       } elseif ( $pid ) {
-                               // wait a little, making sure that the child process is calling merge
-                               usleep( 3000 );
-
-                               // attempt a merge - this should fail
-                               $merged = $this->cache->merge( $key, $callback, 0, 1 );
-
-                               // merge has failed because child process was merging (and we only attempted once)
-                               $this->assertFalse( $merged );
-
-                               // make sure the child's merge is completed and verify
-                               usleep( 3000 );
-                               $this->assertEquals( $this->cache->get( $key ), 'mergedmergedmerged' );
-                       } else {
-                               $this->cache->merge( $key, $callback, 0, 1 );
-
-                               // Note: I'm not even going to check if the merge worked, I'll
-                               // compare values in the parent process to test if this merge worked.
-                               // I'm just going to exit this child process, since I don't want the
-                               // child to output any test results (would be rather confusing to
-                               // have test output twice)
-                               exit;
-                       }
-               }
-       }
-
-       /**
-        * @covers BagOStuff::add
-        */
-       public function testAdd() {
-               $key = wfMemcKey( 'test' );
-               $this->assertTrue( $this->cache->add( $key, 'test' ) );
-       }
-
-       public function testGet() {
-               $value = array( 'this' => 'is', 'a' => 'test' );
-
-               $key = wfMemcKey( 'test' );
-               $this->cache->add( $key, $value );
-               $this->assertEquals( $this->cache->get( $key ), $value );
-       }
-
-       /**
-        * @covers BagOStuff::getWithSetCallback
-        */
-       public function testGetWithSetCallback() {
-               $key = wfMemcKey( 'test' );
-               $value = $this->cache->getWithSetCallback(
-                       $key,
-                       30,
-                       function () {
-                               return 'hello kitty';
-                       }
-               );
-
-               $this->assertEquals( 'hello kitty', $value );
-               $this->assertEquals( $value, $this->cache->get( $key ) );
-       }
-
-       /**
-        * @covers BagOStuff::incr
-        */
-       public function testIncr() {
-               $key = wfMemcKey( 'test' );
-               $this->cache->add( $key, 0 );
-               $this->cache->incr( $key );
-               $expectedValue = 1;
-               $actualValue = $this->cache->get( $key );
-               $this->assertEquals( $expectedValue, $actualValue, 'Value should be 1 after incrementing' );
-       }
-
-       /**
-        * @covers BagOStuff::getMulti
-        */
-       public function testGetMulti() {
-               $value1 = array( 'this' => 'is', 'a' => 'test' );
-               $value2 = array( 'this' => 'is', 'another' => 'test' );
-               $value3 = array( 'testing a key that may be encoded when sent to cache backend' );
-               $value4 = array( 'another test where chars in key will be encoded' );
-
-               $key1 = wfMemcKey( 'test1' );
-               $key2 = wfMemcKey( 'test2' );
-               // internally, MemcachedBagOStuffs will encode to will-%25-encode
-               $key3 = wfMemcKey( 'will-%-encode' );
-               $key4 = wfMemcKey(
-                       'flowdb:flow_ref:wiki:by-source:v3:Parser\'s_"broken"_+_(page)_&_grill:testwiki:1:4.7'
-               );
-
-               $this->cache->add( $key1, $value1 );
-               $this->cache->add( $key2, $value2 );
-               $this->cache->add( $key3, $value3 );
-               $this->cache->add( $key4, $value4 );
-
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2, $key3 => $value3, $key4 => $value4 ),
-                       $this->cache->getMulti( array( $key1, $key2, $key3, $key4 ) )
-               );
-
-               // cleanup
-               $this->cache->delete( $key1 );
-               $this->cache->delete( $key2 );
-               $this->cache->delete( $key3 );
-               $this->cache->delete( $key4 );
-       }
-
-       /**
-        * @covers BagOStuff::getScopedLock
-        */
-       public function testGetScopedLock() {
-               $key = wfMemcKey( 'test' );
-               $value1 = $this->cache->getScopedLock( $key, 0 );
-               $value2 = $this->cache->getScopedLock( $key, 0 );
-
-               $this->assertType( 'ScopedCallback', $value1, 'First call returned lock' );
-               $this->assertNull( $value2, 'Duplicate call returned no lock' );
-
-               unset( $value1 );
-
-               $value3 = $this->cache->getScopedLock( $key, 0 );
-               $this->assertType( 'ScopedCallback', $value3, 'Lock returned callback after release' );
-               unset( $value3 );
-
-               $value1 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
-               $value2 = $this->cache->getScopedLock( $key, 0, 5, 'reentry' );
-
-               $this->assertType( 'ScopedCallback', $value1, 'First reentrant call returned lock' );
-               $this->assertType( 'ScopedCallback', $value1, 'Second reentrant call returned lock' );
-       }
-}
diff --git a/tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php b/tests/phpunit/includes/objectcache/MemcachedBagOStuffTest.php
new file mode 100644 (file)
index 0000000..904ddbb
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+/**
+ * @group BagOStuff
+ */
+class MemcachedBagOStuffTest extends MediaWikiTestCase {
+       /** @var MemcachedBagOStuff */
+       private $cache;
+
+       protected function setUp() {
+               parent::setUp();
+               $this->cache = new MemcachedBagOStuff( array( 'keyspace' => 'test' ) );
+       }
+
+       /**
+        * @covers MemcachedBagOStuff::makeKey
+        */
+       public function testKeyNormalization() {
+               $this->assertEquals(
+                       'test:vanilla',
+                       $this->cache->makeKey( 'vanilla' )
+               );
+
+               $this->assertEquals(
+                       'test:punctuation_marks_are_ok:!@$^&*()',
+                       $this->cache->makeKey( 'punctuation_marks_are_ok', '!@$^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:but_spaces:hashes%23:and%0Anewlines:are_not',
+                       $this->cache->makeKey( 'but spaces', 'hashes#', "and\nnewlines", 'are_not' )
+               );
+
+               $this->assertEquals(
+                       'test:this:key:contains:%F0%9D%95%9E%F0%9D%95%A6%F0%9D%95%9D%F0%9D%95%A5%F0%9' .
+                               'D%95%9A%F0%9D%95%93%F0%9D%95%AA%F0%9D%95%A5%F0%9D%95%96:characters',
+                       $this->cache->makeKey( 'this', 'key', 'contains', '𝕞𝕦𝕝𝕥𝕚𝕓𝕪𝕥𝕖', 'characters' )
+               );
+
+               $this->assertEquals(
+                       'test:this:key:contains:#c118f92685a635cb843039de50014c9c',
+                       $this->cache->makeKey( 'this', 'key', 'contains', '𝕥𝕠𝕠 𝕞𝕒𝕟𝕪 𝕞𝕦𝕝𝕥𝕚𝕓𝕪𝕥𝕖 𝕔𝕙𝕒𝕣𝕒𝕔𝕥𝕖𝕣𝕤' )
+               );
+
+               $this->assertEquals(
+                       'test:##dc89dcb43b28614da27660240af478b5',
+                       $this->cache->makeKey( '𝕖𝕧𝕖𝕟', '𝕚𝕗', '𝕨𝕖', '𝕄𝔻𝟝', '𝕖𝕒𝕔𝕙',
+                               '𝕒𝕣𝕘𝕦𝕞𝕖𝕟𝕥', '𝕥𝕙𝕚𝕤', '𝕜𝕖𝕪', '𝕨𝕠𝕦𝕝𝕕', '𝕤𝕥𝕚𝕝𝕝', '𝕓𝕖', '𝕥𝕠𝕠', '𝕝𝕠𝕟𝕘' )
+               );
+
+               $this->assertEquals(
+                       'test:%23%235820ad1d105aa4dc698585c39df73e19',
+                       $this->cache->makeKey( '##5820ad1d105aa4dc698585c39df73e19' )
+               );
+
+               $this->assertEquals(
+                       'test:percent_is_escaped:!@$%25^&*()',
+                       $this->cache->makeKey( 'percent_is_escaped', '!@$%^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:colon_is_escaped:!@$%3A^&*()',
+                       $this->cache->makeKey( 'colon_is_escaped', '!@$:^&*()' )
+               );
+
+               $this->assertEquals(
+                       'test:long_key_part_hashed:#0244f7b1811d982dd932dd7de01465ac',
+                       $this->cache->makeKey( 'long_key_part_hashed', str_repeat( 'y', 500 ) )
+               );
+       }
+
+       /**
+        * @dataProvider validKeyProvider
+        */
+       public function testValidateKeyEncoding( $key ) {
+               $this->assertSame( $key, $this->cache->validateKeyEncoding( $key ) );
+       }
+
+       public function validKeyProvider() {
+               return array(
+                       'empty' => array( '' ),
+                       'digits' => array( '09' ),
+                       'letters' => array( 'AZaz' ),
+                       'ASCII special characters' => array( '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' ),
+               );
+       }
+
+       /**
+        * @dataProvider invalidKeyProvider
+        */
+       public function testValidateKeyEncodingThrowsException( $key ) {
+               $this->setExpectedException( 'Exception' );
+               $this->cache->validateKeyEncoding( $key );
+       }
+
+       public function invalidKeyProvider() {
+               return array(
+                       array( "\x00" ),
+                       array( ' ' ),
+                       array( "\x1F" ),
+                       array( "\x7F" ),
+                       array( "\x80" ),
+                       array( "\xFF" ),
+               );
+       }
+}
diff --git a/tests/phpunit/includes/objectcache/MultiWriteBagOStuffTest.php b/tests/phpunit/includes/objectcache/MultiWriteBagOStuffTest.php
deleted file mode 100644 (file)
index 1d8f43a..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-
-/**
- * @group Database
- */
-class MultiWriteBagOStuffTest extends MediaWikiTestCase {
-       /** @var HashBagOStuff */
-       private $cache1;
-       /** @var HashBagOStuff */
-       private $cache2;
-       /** @var MultiWriteBagOStuff */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->cache1 = new HashBagOStuff();
-               $this->cache2 = new HashBagOStuff();
-               $this->cache = new MultiWriteBagOStuff( array(
-                       'caches' => array( $this->cache1, $this->cache2 ),
-                       'replication' => 'async',
-                       'asyncHandler' => 'DeferredUpdates::addCallableUpdate'
-               ) );
-       }
-
-       public function testSetImmediate() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value );
-
-               // Set in tier 1
-               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
-               // Set in tier 2
-               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
-       }
-
-       public function testSyncMerge() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $func = function () use ( $value ) {
-                       return $value;
-               };
-
-               // XXX: DeferredUpdates bound to transactions in CLI mode
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin();
-               $this->cache->merge( $key, $func );
-
-               // Set in tier 1
-               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
-               // Not yet set in tier 2
-               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
-
-               $dbw->commit();
-
-               // Set in tier 2
-               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
-
-               $key = wfRandomString();
-
-               $dbw->begin();
-               $this->cache->merge( $key, $func, 0, 1, BagOStuff::WRITE_SYNC );
-
-               // Set in tier 1
-               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
-               // Also set in tier 2
-               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
-
-               $dbw->commit();
-       }
-
-       public function testSetDelayed() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-
-               // XXX: DeferredUpdates bound to transactions in CLI mode
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin();
-               $this->cache->set( $key, $value );
-
-               // Set in tier 1
-               $this->assertEquals( $value, $this->cache1->get( $key ), 'Written to tier 1' );
-               // Not yet set in tier 2
-               $this->assertEquals( false, $this->cache2->get( $key ), 'Not written to tier 2' );
-
-               $dbw->commit();
-
-               // Set in tier 2
-               $this->assertEquals( $value, $this->cache2->get( $key ), 'Written to tier 2' );
-       }
-}
diff --git a/tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php b/tests/phpunit/includes/objectcache/ReplicatedBagOStuffTest.php
deleted file mode 100644 (file)
index a419f5b..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-class ReplicatedBagOStuffTest extends MediaWikiTestCase {
-       /** @var HashBagOStuff */
-       private $writeCache;
-       /** @var HashBagOStuff */
-       private $readCache;
-       /** @var ReplicatedBagOStuff */
-       private $cache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               $this->writeCache = new HashBagOStuff();
-               $this->readCache = new HashBagOStuff();
-               $this->cache = new ReplicatedBagOStuff( array(
-                       'writeFactory' => $this->writeCache,
-                       'readFactory' => $this->readCache,
-               ) );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::set
-        */
-       public function testSet() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value );
-
-               // Write to master.
-               $this->assertEquals( $this->writeCache->get( $key ), $value );
-               // Don't write to slave. Replication is deferred to backend.
-               $this->assertEquals( $this->readCache->get( $key ), false );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::get
-        */
-       public function testGet() {
-               $key = wfRandomString();
-
-               $write = wfRandomString();
-               $this->writeCache->set( $key, $write );
-               $read = wfRandomString();
-               $this->readCache->set( $key, $read );
-
-               // Read from slave.
-               $this->assertEquals( $this->cache->get( $key ), $read );
-       }
-
-       /**
-        * @covers ReplicatedBagOStuff::get
-        */
-       public function testGetAbsent() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->writeCache->set( $key, $value );
-
-               // Don't read from master. No failover if value is absent.
-               $this->assertEquals( $this->cache->get( $key ), false );
-       }
-}
diff --git a/tests/phpunit/includes/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/objectcache/WANObjectCacheTest.php
deleted file mode 100644 (file)
index c3702c5..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-<?php
-
-class WANObjectCacheTest extends MediaWikiTestCase {
-       /** @var WANObjectCache */
-       private $cache;
-       /**@var BagOStuff */
-       private $internalCache;
-
-       protected function setUp() {
-               parent::setUp();
-
-               if ( $this->getCliArg( 'use-wanobjectcache' ) ) {
-                       $name = $this->getCliArg( 'use-wanobjectcache' );
-
-                       $this->cache = ObjectCache::getWANInstance( $name );
-               } else {
-                       $this->cache = new WANObjectCache( array(
-                               'cache' => new HashBagOStuff(),
-                               'pool' => 'testcache-hash',
-                               'relayer' => new EventRelayerNull( array() )
-                       ) );
-               }
-
-               $wanCache = TestingAccessWrapper::newFromObject( $this->cache );
-               $this->internalCache = $wanCache->cache;
-       }
-
-       /**
-        * @dataProvider provider_testSetAndGet
-        * @covers WANObjectCache::set()
-        * @covers WANObjectCache::get()
-        * @param mixed $value
-        * @param integer $ttl
-        */
-       public function testSetAndGet( $value, $ttl ) {
-               $key = wfRandomString();
-               $this->cache->set( $key, $value, $ttl );
-
-               $curTTL = null;
-               $this->assertEquals( $value, $this->cache->get( $key, $curTTL ) );
-               if ( is_infinite( $ttl ) || $ttl == 0 ) {
-                       $this->assertTrue( is_infinite( $curTTL ), "Current TTL is infinite" );
-               } else {
-                       $this->assertGreaterThan( 0, $curTTL, "Current TTL > 0" );
-                       $this->assertLessThanOrEqual( $ttl, $curTTL, "Current TTL < nominal TTL" );
-               }
-       }
-
-       public static function provider_testSetAndGet() {
-               return array(
-                       array( 14141, 3 ),
-                       array( 3535.666, 3 ),
-                       array( array(), 3 ),
-                       array( null, 3 ),
-                       array( '0', 3 ),
-                       array( (object)array( 'meow' ), 3 ),
-                       array( INF, 3 ),
-                       array( '', 3 ),
-                       array( 'pizzacat', INF ),
-               );
-       }
-
-       public function testGetNotExists() {
-               $key = wfRandomString();
-               $curTTL = null;
-               $value = $this->cache->get( $key, $curTTL );
-
-               $this->assertFalse( $value, "Non-existing key has false value" );
-               $this->assertNull( $curTTL, "Non-existing key has null current TTL" );
-       }
-
-       public function testSetOver() {
-               $key = wfRandomString();
-               for ( $i = 0; $i < 3; ++$i ) {
-                       $value = wfRandomString();
-                       $this->cache->set( $key, $value, 3 );
-
-                       $this->assertEquals( $this->cache->get( $key ), $value );
-               }
-       }
-
-       public function testStaleSet() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value, 3, array( 'since' => microtime( true ) - 30 ) );
-
-               $this->assertFalse( $this->cache->get( $key ), "Stale set() value ignored" );
-       }
-
-       /**
-        * @covers WANObjectCache::getWithSetCallback()
-        */
-       public function testGetWithSetCallback() {
-               $cache = $this->cache;
-
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $cKey1 = wfRandomString();
-               $cKey2 = wfRandomString();
-
-               $wasSet = 0;
-               $func = function( $old, &$ttl ) use ( &$wasSet, $value ) {
-                       ++$wasSet;
-                       $ttl = 20; // override with another value
-                       return $value;
-               };
-
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 1, $wasSet, "Value regenerated" );
-
-               $curTTL = null;
-               $cache->get( $key, $curTTL );
-               $this->assertLessThanOrEqual( 20, $curTTL, 'Current TTL between 19-20 (overriden)' );
-               $this->assertGreaterThanOrEqual( 19, $curTTL, 'Current TTL between 19-20 (overriden)' );
-
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, 30, $func, array(
-                       'lowTTL' => 0,
-                       'lockTSE' => 5,
-               ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
-
-               $priorTime = microtime( true );
-               usleep( 1 );
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, 30, $func,
-                       array( 'checkKeys' => array( $cKey1, $cKey2 ) ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 1, $wasSet, "Value regenerated due to check keys" );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check keys generated on miss' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check keys generated on miss' );
-
-               $priorTime = microtime( true );
-               $wasSet = 0;
-               $v = $cache->getWithSetCallback( $key, 30, $func,
-                       array( 'checkKeys' => array( $cKey1, $cKey2 ) ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 1, $wasSet, "Value regenerated due to still-recent check keys" );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertLessThanOrEqual( $priorTime, $t1, 'Check keys did not change again' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertLessThanOrEqual( $priorTime, $t2, 'Check keys did not change again' );
-
-               $curTTL = null;
-               $v = $cache->get( $key, $curTTL, array( $cKey1, $cKey2 ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertLessThanOrEqual( 0, $curTTL, "Value has current TTL < 0 due to check keys" );
-
-               $wasSet = 0;
-               $key = wfRandomString();
-               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'pcTTL' => 5 ) );
-               $this->assertEquals( $value, $v, "Value returned" );
-               $cache->delete( $key );
-               $v = $cache->getWithSetCallback( $key, 30, $func, array( 'pcTTL' => 5 ) );
-               $this->assertEquals( $value, $v, "Value still returned after deleted" );
-               $this->assertEquals( 1, $wasSet, "Value process cached while deleted" );
-       }
-
-       /**
-        * @covers WANObjectCache::getWithSetCallback()
-        */
-       public function testLockTSE() {
-               $cache = $this->cache;
-               $key = wfRandomString();
-               $value = wfRandomString();
-
-               $calls = 0;
-               $func = function() use ( &$calls, $value ) {
-                       ++$calls;
-                       return $value;
-               };
-
-               $cache->delete( $key );
-               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $value, $ret );
-               $this->assertEquals( 1, $calls, 'Value was populated' );
-
-               // Acquire a lock to verify that getWithSetCallback uses lockTSE properly
-               $this->internalCache->lock( $key, 0 );
-               $ret = $cache->getWithSetCallback( $key, 30, $func, array( 'lockTSE' => 5 ) );
-               $this->assertEquals( $value, $ret );
-               $this->assertEquals( 1, $calls, 'Callback was not used' );
-       }
-
-       /**
-        * @covers WANObjectCache::getMulti()
-        */
-       public function testGetMulti() {
-               $cache = $this->cache;
-
-               $value1 = array( 'this' => 'is', 'a' => 'test' );
-               $value2 = array( 'this' => 'is', 'another' => 'test' );
-
-               $key1 = wfRandomString();
-               $key2 = wfRandomString();
-               $key3 = wfRandomString();
-
-               $cache->set( $key1, $value1, 5 );
-               $cache->set( $key2, $value2, 10 );
-
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs )
-               );
-
-               $this->assertEquals( 2, count( $curTTLs ), "Two current TTLs in array" );
-               $this->assertGreaterThan( 0, $curTTLs[$key1], "Key 1 has current TTL > 0" );
-               $this->assertGreaterThan( 0, $curTTLs[$key2], "Key 2 has current TTL > 0" );
-
-               $cKey1 = wfRandomString();
-               $cKey2 = wfRandomString();
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs ),
-                       'Result array populated'
-               );
-
-               $priorTime = microtime( true );
-               usleep( 1 );
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
-                       "Result array populated even with new check keys"
-               );
-               $t1 = $cache->getCheckKeyTime( $cKey1 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key 1 generated on miss' );
-               $t2 = $cache->getCheckKeyTime( $cKey2 );
-               $this->assertGreaterThanOrEqual( $priorTime, $t2, 'Check key 2 generated on miss' );
-               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs array set" );
-               $this->assertLessThanOrEqual( 0, $curTTLs[$key1], 'Key 1 has current TTL <= 0' );
-               $this->assertLessThanOrEqual( 0, $curTTLs[$key2], 'Key 2 has current TTL <= 0' );
-
-               usleep( 1 );
-               $curTTLs = array();
-               $this->assertEquals(
-                       array( $key1 => $value1, $key2 => $value2 ),
-                       $cache->getMulti( array( $key1, $key2, $key3 ), $curTTLs, array( $cKey1, $cKey2 ) ),
-                       "Result array still populated even with new check keys"
-               );
-               $this->assertEquals( 2, count( $curTTLs ), "Current TTLs still array set" );
-               $this->assertLessThan( 0, $curTTLs[$key1], 'Key 1 has negative current TTL' );
-               $this->assertLessThan( 0, $curTTLs[$key2], 'Key 2 has negative current TTL' );
-       }
-
-       /**
-        * @covers WANObjectCache::delete()
-        */
-       public function testDelete() {
-               $key = wfRandomString();
-               $value = wfRandomString();
-               $this->cache->set( $key, $value );
-
-               $curTTL = null;
-               $v = $this->cache->get( $key, $curTTL );
-               $this->assertEquals( $value, $v, "Key was created with value" );
-               $this->assertGreaterThan( 0, $curTTL, "Existing key has current TTL > 0" );
-
-               $this->cache->delete( $key );
-
-               $curTTL = null;
-               $v = $this->cache->get( $key, $curTTL );
-               $this->assertFalse( $v, "Deleted key has false value" );
-               $this->assertLessThan( 0, $curTTL, "Deleted key has current TTL < 0" );
-
-               $this->cache->set( $key, $value . 'more' );
-               $this->assertFalse( $v, "Deleted key is tombstoned and has false value" );
-               $this->assertLessThan( 0, $curTTL, "Deleted key is tombstoned and has current TTL < 0" );
-       }
-
-       /**
-        * @covers WANObjectCache::touchCheckKey()
-        * @covers WANObjectCache::resetCheckKey()
-        * @covers WANObjectCache::getCheckKeyTime()
-        */
-       public function testTouchKeys() {
-               $key = wfRandomString();
-
-               $priorTime = microtime( true );
-               usleep( 100 );
-               $t0 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThanOrEqual( $priorTime, $t0, 'Check key auto-created' );
-
-               $priorTime = microtime( true );
-               usleep( 100 );
-               $this->cache->touchCheckKey( $key );
-               $t1 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThanOrEqual( $priorTime, $t1, 'Check key created' );
-
-               $t2 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t1, $t2, 'Check key time did not change' );
-
-               usleep( 100 );
-               $this->cache->touchCheckKey( $key );
-               $t3 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThan( $t2, $t3, 'Check key time increased' );
-
-               $t4 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t3, $t4, 'Check key time did not change' );
-
-               usleep( 100 );
-               $this->cache->resetCheckKey( $key );
-               $t5 = $this->cache->getCheckKeyTime( $key );
-               $this->assertGreaterThan( $t4, $t5, 'Check key time increased' );
-
-               $t6 = $this->cache->getCheckKeyTime( $key );
-               $this->assertEquals( $t5, $t6, 'Check key time did not change' );
-       }
-}
index a21fc8a..0a46f8a 100644 (file)
@@ -212,25 +212,6 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
        }
 
-       /**
-        * @covers WikiPage::doQuickEdit
-        */
-       public function testDoQuickEdit() {
-               global $wgUser;
-
-               $this->hideDeprecated( "WikiPage::doQuickEdit" );
-
-               // NOTE: assume help namespace will default to wikitext
-               $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
-
-               $text = "quick text";
-               $page->doQuickEdit( $text, $wgUser, "testing q" );
-
-               # ---------------------
-               $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $text, $page->getText() );
-       }
-
        /**
         * @covers WikiPage::doQuickEditContent
         */
index 95822ad..cd0f139 100644 (file)
@@ -7,6 +7,7 @@ require_once __DIR__ . '/NewParserTest.php';
  * an PHPUnit_Framework_Test object
  *
  * @group Parser
+ * @group ParserTests
  * @group Database
  */
 class MediaWikiParserTest {
index ff4a527..5c6c17d 100644 (file)
@@ -243,7 +243,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'media_type' => MEDIATYPE_BITMAP,
                                        'mime' => 'image/jpeg',
                                        'metadata' => serialize( array() ),
-                                       'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
+                                       'sha1' => Wikimedia\base_convert( '1', 16, 36, 31 ),
                                        'fileExists' => true ),
                                $this->db->timestamp( '20010115123500' ), $user
                        );
@@ -263,7 +263,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'media_type' => MEDIATYPE_BITMAP,
                                        'mime' => 'image/png',
                                        'metadata' => serialize( array() ),
-                                       'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+                                       'sha1' => Wikimedia\base_convert( '2', 16, 36, 31 ),
                                        'fileExists' => true ),
                                $this->db->timestamp( '20130225203040' ), $user
                        );
@@ -284,7 +284,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'media_type' => MEDIATYPE_BITMAP,
                                        'mime' => 'image/jpeg',
                                        'metadata' => serialize( array() ),
-                                       'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
+                                       'sha1' => Wikimedia\base_convert( '3', 16, 36, 31 ),
                                        'fileExists' => true ),
                                $this->db->timestamp( '20010115123500' ), $user
                        );
@@ -299,7 +299,7 @@ class NewParserTest extends MediaWikiTestCase {
                                        'media_type'  => MEDIATYPE_DRAWING,
                                        'mime'        => 'image/svg+xml',
                                        'metadata'    => serialize( array() ),
-                                       'sha1'        => wfBaseConvert( '', 16, 36, 31 ),
+                                       'sha1'        => Wikimedia\base_convert( '', 16, 36, 31 ),
                                        'fileExists'  => true
                        ), $this->db->timestamp( '20010115123500' ), $user );
                }
@@ -340,7 +340,7 @@ class NewParserTest extends MediaWikiTestCase {
 </OBJECT>
 </BODY>
 </DjVuXML>',
-                               'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+                               'sha1' => Wikimedia\base_convert( '', 16, 36, 31 ),
                                'fileExists' => true
                        ), $this->db->timestamp( '20140115123600' ), $user );
                }
@@ -640,11 +640,12 @@ class NewParserTest extends MediaWikiTestCase {
                        $backend->delete( array( 'src' => $file ), array( 'force' => 1 ) );
                }
                foreach ( $files as $file ) {
-                       $tmp = $file;
-                       while ( $tmp = FileBackend::parentStoragePath( $tmp ) ) {
+                       $tmp = FileBackend::parentStoragePath( $file );
+                       while ( $tmp ) {
                                if ( !$backend->clean( array( 'dir' => $tmp ) )->isOK() ) {
                                        break;
                                }
+                               $tmp = FileBackend::parentStoragePath( $tmp );
                        }
                }
        }
@@ -672,6 +673,7 @@ class NewParserTest extends MediaWikiTestCase {
 
        /**
         * @group medium
+        * @group ParserTests
         * @dataProvider parserTestProvider
         * @param string $desc
         * @param string $input
index 0d11f62..24ea4b2 100644 (file)
@@ -25,7 +25,7 @@ class DerivativeResourceLoaderContextTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals( $derived->getModules(), array( 'test.context' ) );
                $this->assertEquals( $derived->getOnly(), 'scripts' );
                $this->assertEquals( $derived->getSkin(), 'fallback' );
-               $this->assertEquals( $derived->getHash(), 'zh|ltr|fallback||||||scripts|' );
+               $this->assertEquals( $derived->getHash(), 'zh|fallback|||scripts|||||' );
        }
 
        public function testSetLanguage() {
@@ -72,7 +72,7 @@ class DerivativeResourceLoaderContextTest extends PHPUnit_Framework_TestCase {
 
                $derived->setLanguage( 'nl' );
                // Assert that subclass is able to clear parent class "hash" member
-               $this->assertEquals( $derived->getHash(), 'nl|ltr|fallback||||||scripts|' );
+               $this->assertEquals( $derived->getHash(), 'nl|fallback|||scripts|||||' );
        }
 
 }
diff --git a/tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php b/tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php
new file mode 100644 (file)
index 0000000..776538a
--- /dev/null
@@ -0,0 +1,167 @@
+<?php
+
+/**
+ * @group Cache
+ * @covers MessageBlobStore
+ */
+class MessageBlobStoreTest extends PHPUnit_Framework_TestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               // MediaWiki tests defaults $wgMainWANCache to CACHE_NONE.
+               // Use hash instead so that caching is observed
+               $this->wanCache = $this->getMockBuilder( 'WANObjectCache' )
+                       ->setConstructorArgs( array( array(
+                               'cache' => new HashBagOStuff(),
+                               'pool' => 'test',
+                               'relayer' => new EventRelayerNull( array() )
+                       ) ) )
+                       ->setMethods( array( 'makePurgeValue' ) )
+                       ->getMock();
+
+               $this->wanCache->expects( $this->any() )
+                       ->method( 'makePurgeValue' )
+                       ->will( $this->returnCallback( function ( $timestamp, $holdoff ) {
+                               // Disable holdoff as it messes with testing
+                               return WANObjectCache::PURGE_VAL_PREFIX . (float)$timestamp . ':0';
+                       } ) );
+       }
+
+       protected function makeBlobStore( $methods = null, $rl = null ) {
+               $blobStore = $this->getMockBuilder( 'MessageBlobStore' )
+                       ->setConstructorArgs( array( $rl ) )
+                       ->setMethods( $methods )
+                       ->getMock();
+
+               $access = TestingAccessWrapper::newFromObject( $blobStore );
+               $access->wanCache = $this->wanCache;
+               return $blobStore;
+       }
+
+       protected function makeModule( array $messages ) {
+               $module = new ResourceLoaderTestModule( array( 'messages' => $messages ) );
+               $module->setName( 'test.blobstore' );
+               return $module;
+       }
+
+       public function testGetBlob() {
+               $module = $this->makeModule( array( 'foo' ) );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+
+               $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+               $blobStore->expects( $this->once() )
+                       ->method( 'fetchMessage' )
+                       ->will( $this->returnValue( 'Example' ) );
+
+               $blob = $blobStore->getBlob( $module, 'en' );
+
+               $this->assertEquals( '{"foo":"Example"}', $blob, 'Generated blob' );
+       }
+
+       public function testGetBlobCached() {
+               $module = $this->makeModule( array( 'example' ) );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+
+               $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+               $blobStore->expects( $this->once() )
+                       ->method( 'fetchMessage' )
+                       ->will( $this->returnValue( 'First' ) );
+
+               $module = $this->makeModule( array( 'example' ) );
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"example":"First"}', $blob, 'Generated blob' );
+
+               $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+               $blobStore->expects( $this->never() )
+                       ->method( 'fetchMessage' )
+                       ->will( $this->returnValue( 'Second' ) );
+
+               $module = $this->makeModule( array( 'example' ) );
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"example":"First"}', $blob, 'Cache hit' );
+       }
+
+       public function testUpdateMessage() {
+               $module = $this->makeModule( array( 'example' ) );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+               $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+               $blobStore->expects( $this->once() )
+                       ->method( 'fetchMessage' )
+                       ->will( $this->returnValue( 'First' ) );
+
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"example":"First"}', $blob, 'Generated blob' );
+
+               $blobStore->updateMessage( 'example' );
+
+               $module = $this->makeModule( array( 'example' ) );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+               $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+               $blobStore->expects( $this->once() )
+                       ->method( 'fetchMessage' )
+                       ->will( $this->returnValue( 'Second' ) );
+
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"example":"Second"}', $blob, 'Updated blob' );
+       }
+
+       public function testValidation() {
+               $module = $this->makeModule( array( 'foo' ) );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+
+               $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+               $blobStore->expects( $this->once() )
+                       ->method( 'fetchMessage' )
+                       ->will( $this->returnValueMap( array(
+                               array( 'foo', 'en', 'Hello' ),
+                       ) ) );
+
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"foo":"Hello"}', $blob, 'Generated blob' );
+
+               // Now, imagine a change to the module is deployed. The module now contains
+               // message 'foo' and 'bar'. While updateMessage() was not called (since no
+               // message values were changed) it should detect the change in list of
+               // message keys.
+               $module = $this->makeModule( array( 'foo', 'bar' ) );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+
+               $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+               $blobStore->expects( $this->exactly( 2 ) )
+                       ->method( 'fetchMessage' )
+                       ->will( $this->returnValueMap( array(
+                               array( 'foo', 'en', 'Hello' ),
+                               array( 'bar', 'en', 'World' ),
+                       ) ) );
+
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"foo":"Hello","bar":"World"}', $blob, 'Updated blob' );
+       }
+
+       public function testClear() {
+               $module = $this->makeModule( array( 'example' ) );
+               $rl = new ResourceLoader();
+               $rl->register( $module->getName(), $module );
+               $blobStore = $this->makeBlobStore( array( 'fetchMessage' ), $rl );
+               $blobStore->expects( $this->exactly( 2 ) )
+                       ->method( 'fetchMessage' )
+                       ->will( $this->onConsecutiveCalls( 'First', 'Second' ) );
+
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"example":"First"}', $blob, 'Generated blob' );
+
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"example":"First"}', $blob, 'Cache-hit' );
+
+               $blobStore->clear();
+
+               $blob = $blobStore->getBlob( $module, 'en' );
+               $this->assertEquals( '{"example":"Second"}', $blob, 'Updated blob' );
+       }
+}
index 9d97b28..a6d1d05 100644 (file)
@@ -21,7 +21,7 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
 
        private static function getModules() {
                $base = array(
-                       'localBasePath' => realpath( dirname( __FILE__ ) ),
+                       'localBasePath' => realpath( __DIR__ ),
                );
 
                return array(
index f700348..3f2a5e2 100644 (file)
@@ -4,7 +4,6 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
 
        /**
         * @covers ResourceLoaderModule::getVersionHash
-        * @group Broken
         */
        public function testGetVersionHash() {
                $context = $this->getResourceLoaderContext();
@@ -69,6 +68,8 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
         * @covers ResourceLoaderModule::validateScriptFile
         */
        public function testValidateScriptFile() {
+               $this->setMwGlobals( 'wgResourceLoaderValidateJS', true );
+
                $context = $this->getResourceLoaderContext();
 
                $module = new ResourceLoaderTestModule( array(
index cb91614..9a36d18 100644 (file)
@@ -2,6 +2,17 @@
 
 class ResourceLoaderStartUpModuleTest extends ResourceLoaderTestCase {
 
+       // Version hash for a blank file module.
+       // Result of ResourceLoader::makeHash(), ResourceLoaderTestModule
+       // and ResourceLoaderFileModule::getDefinitionSummary().
+       protected static $blankVersion = 'GqV9IPpY';
+
+       protected static function expandPlaceholders( $text ) {
+               return strtr( $text, array(
+                       '{blankVer}' => self::$blankVersion
+               ) );
+       }
+
        public static function provideGetModuleRegistrations() {
                return array(
                        array( array(
@@ -25,7 +36,7 @@ mw.loader.addSource( {
 mw.loader.register( [
     [
         "test.blank",
-        "wvTifjse"
+        "{blankVer}"
     ]
 ] );',
                        ) ),
@@ -43,17 +54,17 @@ mw.loader.addSource( {
 mw.loader.register( [
     [
         "test.blank",
-        "wvTifjse"
+        "{blankVer}"
     ],
     [
         "test.group.foo",
-        "wvTifjse",
+        "{blankVer}",
         [],
         "x-foo"
     ],
     [
         "test.group.bar",
-        "wvTifjse",
+        "{blankVer}",
         [],
         "x-bar"
     ]
@@ -72,7 +83,7 @@ mw.loader.addSource( {
 mw.loader.register( [
     [
         "test.blank",
-        "wvTifjse"
+        "{blankVer}"
     ]
 ] );'
                        ) ),
@@ -95,7 +106,7 @@ mw.loader.addSource( {
 mw.loader.register( [
     [
         "test.blank",
-        "wvTifjse",
+        "{blankVer}",
         [],
         null,
         "example"
@@ -132,11 +143,11 @@ mw.loader.addSource( {
 mw.loader.register( [
     [
         "test.x.core",
-        "wvTifjse"
+        "{blankVer}"
     ],
     [
         "test.x.polyfill",
-        "wvTifjse",
+        "{blankVer}",
         [],
         null,
         null,
@@ -144,7 +155,7 @@ mw.loader.register( [
     ],
     [
         "test.y.polyfill",
-        "wvTifjse",
+        "{blankVer}",
         [],
         null,
         null,
@@ -152,7 +163,7 @@ mw.loader.register( [
     ],
     [
         "test.z.foo",
-        "wvTifjse",
+        "{blankVer}",
         [
             0,
             1,
@@ -229,36 +240,36 @@ mw.loader.addSource( {
 mw.loader.register( [
     [
         "test.blank",
-        "wvTifjse"
+        "{blankVer}"
     ],
     [
         "test.x.core",
-        "wvTifjse"
+        "{blankVer}"
     ],
     [
         "test.x.util",
-        "wvTifjse",
+        "{blankVer}",
         [
             1
         ]
     ],
     [
         "test.x.foo",
-        "wvTifjse",
+        "{blankVer}",
         [
             1
         ]
     ],
     [
         "test.x.bar",
-        "wvTifjse",
+        "{blankVer}",
         [
             2
         ]
     ],
     [
         "test.x.quux",
-        "wvTifjse",
+        "{blankVer}",
         [
             3,
             4,
@@ -267,25 +278,25 @@ mw.loader.register( [
     ],
     [
         "test.group.foo.1",
-        "wvTifjse",
+        "{blankVer}",
         [],
         "x-foo"
     ],
     [
         "test.group.foo.2",
-        "wvTifjse",
+        "{blankVer}",
         [],
         "x-foo"
     ],
     [
         "test.group.bar.1",
-        "wvTifjse",
+        "{blankVer}",
         [],
         "x-bar"
     ],
     [
         "test.group.bar.2",
-        "wvTifjse",
+        "{blankVer}",
         [],
         "x-bar",
         "example"
@@ -309,12 +320,12 @@ mw.loader.register( [
 
                $context = $this->getResourceLoaderContext();
                $rl = $context->getResourceLoader();
-
                $rl->register( $case['modules'] );
-
                $module = new ResourceLoaderStartUpModule();
+               $out = ltrim( $case['out'], "\n" );
+
                $this->assertEquals(
-                       ltrim( $case['out'], "\n" ),
+                       self::expandPlaceholders( $out ),
                        $module->getModuleRegistrations( $context ),
                        $case['msg']
                );
@@ -348,13 +359,15 @@ mw.loader.register( [
                $rl = $context->getResourceLoader();
                $rl->register( $modules );
                $module = new ResourceLoaderStartUpModule();
+               $out = 'mw.loader.addSource({"local":"/w/load.php"});' . "\n"
+               . 'mw.loader.register(['
+               . '["test.blank","{blankVer}"],'
+               . '["test.min","{blankVer}",[0],null,null,'
+               . '"return!!(window.JSON\u0026\u0026JSON.parse\u0026\u0026JSON.stringify);"'
+               . ']]);';
+
                $this->assertEquals(
-'mw.loader.addSource({"local":"/w/load.php"});' . "\n"
-. 'mw.loader.register(['
-. '["test.blank","wvTifjse"],'
-. '["test.min","wvTifjse",[0],null,null,'
-. '"return!!(window.JSON\u0026\u0026JSON.parse\u0026\u0026JSON.stringify);"'
-. ']]);',
+                       self::expandPlaceholders( $out ),
                        $module->getModuleRegistrations( $context ),
                        'Minified output'
                );
@@ -368,18 +381,18 @@ mw.loader.register( [
                $rl = $context->getResourceLoader();
                $rl->register( $modules );
                $module = new ResourceLoaderStartUpModule();
-               $this->assertEquals(
+               $out =
 'mw.loader.addSource( {
     "local": "/w/load.php"
 } );
 mw.loader.register( [
     [
         "test.blank",
-        "wvTifjse"
+        "{blankVer}"
     ],
     [
         "test.min",
-        "wvTifjse",
+        "{blankVer}",
         [
             0
         ],
@@ -387,7 +400,10 @@ mw.loader.register( [
         null,
         "return !!(    window.JSON \u0026\u0026    JSON.parse \u0026\u0026    JSON.stringify);"
     ]
-] );',
+] );';
+
+               $this->assertEquals(
+                       self::expandPlaceholders( $out ),
                        $module->getModuleRegistrations( $context ),
                        'Unminified output'
                );
index d6c58cf..c7562f5 100644 (file)
@@ -216,7 +216,7 @@ class SiteListTest extends MediaWikiTestCase {
        public function testSerialization( SiteList $list ) {
                $serialization = serialize( $list );
                /**
-                * @var SiteArray $copy
+                * @var SiteList $copy
                 */
                $copy = unserialize( $serialization );
 
index df9b552..f32eeca 100644 (file)
@@ -181,6 +181,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( $mockSearchEngine ) );
 
                $search->getContext()->setTitle( Title::makeTitle( NS_SPECIAL, 'Search' ) );
+               $search->getContext()->setLanguage( Language::factory( 'en' ) );
                $search->load();
                $search->showResults( 'this is a fake search' );
 
diff --git a/tests/phpunit/includes/user/CentralIdLookupTest.php b/tests/phpunit/includes/user/CentralIdLookupTest.php
new file mode 100644 (file)
index 0000000..386e7ab
--- /dev/null
@@ -0,0 +1,181 @@
+<?php
+
+/**
+ * @covers CentralIdLookup
+ * @group Database
+ */
+class CentralIdLookupTest extends MediaWikiTestCase {
+
+       public function testFactory() {
+               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+
+               $this->setMwGlobals( array(
+                       'wgCentralIdLookupProviders' => array(
+                               'local' => array( 'class' => 'LocalIdLookup' ),
+                               'local2' => array( 'class' => 'LocalIdLookup' ),
+                               'mock' => array( 'factory' => function () use ( $mock ) {
+                                       return $mock;
+                               } ),
+                               'bad' => array( 'class' => 'stdClass' ),
+                       ),
+                       'wgCentralIdLookupProvider' => 'mock',
+               ) );
+
+               $this->assertSame( $mock, CentralIdLookup::factory() );
+               $this->assertSame( $mock, CentralIdLookup::factory( 'mock' ) );
+               $this->assertSame( 'mock', $mock->getProviderId() );
+
+               $local = CentralIdLookup::factory( 'local' );
+               $this->assertNotSame( $mock, $local );
+               $this->assertInstanceOf( 'LocalIdLookup', $local );
+               $this->assertSame( $local, CentralIdLookup::factory( 'local' ) );
+               $this->assertSame( 'local', $local->getProviderId() );
+
+               $local2 = CentralIdLookup::factory( 'local2' );
+               $this->assertNotSame( $local, $local2 );
+               $this->assertInstanceOf( 'LocalIdLookup', $local2 );
+               $this->assertSame( 'local2', $local2->getProviderId() );
+
+               $this->assertNull( CentralIdLookup::factory( 'unconfigured' ) );
+               $this->assertNull( CentralIdLookup::factory( 'bad' ) );
+       }
+
+       public function testCheckAudience() {
+               $mock = TestingAccessWrapper::newFromObject(
+                       $this->getMockForAbstractClass( 'CentralIdLookup' )
+               );
+
+               $user = User::newFromName( 'UTSysop' );
+               $this->assertSame( $user, $mock->checkAudience( $user ) );
+
+               $user = $mock->checkAudience( CentralIdLookup::AUDIENCE_PUBLIC );
+               $this->assertInstanceOf( 'User', $user );
+               $this->assertSame( 0, $user->getId() );
+
+               $this->assertNull( $mock->checkAudience( CentralIdLookup::AUDIENCE_RAW ) );
+
+               try {
+                       $mock->checkAudience( 100 );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( InvalidArgumentException $ex ) {
+                       $this->assertSame( 'Invalid audience', $ex->getMessage() );
+               }
+       }
+
+       public function testNameFromCentralId() {
+               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock->expects( $this->once() )->method( 'lookupCentralIds' )
+                       ->with(
+                               $this->equalTo( array( 15 => null ) ),
+                               $this->equalTo( CentralIdLookup::AUDIENCE_RAW ),
+                               $this->equalTo( CentralIdLookup::READ_LATEST )
+                       )
+                       ->will( $this->returnValue( array( 15 => 'FooBar' ) ) );
+
+               $this->assertSame(
+                       'FooBar',
+                       $mock->nameFromCentralId( 15, CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST )
+               );
+       }
+
+       /**
+        * @dataProvider provideLocalUserFromCentralId
+        * @param string $name
+        * @param bool $succeeds
+        */
+       public function testLocalUserFromCentralId( $name, $succeeds ) {
+               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock->expects( $this->any() )->method( 'isAttached' )
+                       ->will( $this->returnValue( true ) );
+               $mock->expects( $this->once() )->method( 'lookupCentralIds' )
+                       ->with(
+                               $this->equalTo( array( 42 => null ) ),
+                               $this->equalTo( CentralIdLookup::AUDIENCE_RAW ),
+                               $this->equalTo( CentralIdLookup::READ_LATEST )
+                       )
+                       ->will( $this->returnValue( array( 42 => $name ) ) );
+
+               $user = $mock->localUserFromCentralId(
+                       42, CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST
+               );
+               if ( $succeeds ) {
+                       $this->assertInstanceOf( 'User', $user );
+                       $this->assertSame( $name, $user->getName() );
+               } else {
+                       $this->assertNull( $user );
+               }
+
+               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock->expects( $this->any() )->method( 'isAttached' )
+                       ->will( $this->returnValue( false ) );
+               $mock->expects( $this->once() )->method( 'lookupCentralIds' )
+                       ->with(
+                               $this->equalTo( array( 42 => null ) ),
+                               $this->equalTo( CentralIdLookup::AUDIENCE_RAW ),
+                               $this->equalTo( CentralIdLookup::READ_LATEST )
+                       )
+                       ->will( $this->returnValue( array( 42 => $name ) ) );
+               $this->assertNull(
+                       $mock->localUserFromCentralId( 42, CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST )
+               );
+       }
+
+       public static function provideLocalUserFromCentralId() {
+               return array(
+                       array( 'UTSysop', true ),
+                       array( 'UTDoesNotExist', false ),
+                       array( null, false ),
+                       array( '', false ),
+                       array( '<X>', false ),
+               );
+       }
+
+       public function testCentralIdFromName() {
+               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock->expects( $this->once() )->method( 'lookupUserNames' )
+                       ->with(
+                               $this->equalTo( array( 'FooBar' => 0 ) ),
+                               $this->equalTo( CentralIdLookup::AUDIENCE_RAW ),
+                               $this->equalTo( CentralIdLookup::READ_LATEST )
+                       )
+                       ->will( $this->returnValue( array( 'FooBar' => 23 ) ) );
+
+               $this->assertSame(
+                       23,
+                       $mock->centralIdFromName( 'FooBar', CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST )
+               );
+       }
+
+       public function testCentralIdFromLocalUser() {
+               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock->expects( $this->any() )->method( 'isAttached' )
+                       ->will( $this->returnValue( true ) );
+               $mock->expects( $this->once() )->method( 'lookupUserNames' )
+                       ->with(
+                               $this->equalTo( array( 'FooBar' => 0 ) ),
+                               $this->equalTo( CentralIdLookup::AUDIENCE_RAW ),
+                               $this->equalTo( CentralIdLookup::READ_LATEST )
+                       )
+                       ->will( $this->returnValue( array( 'FooBar' => 23 ) ) );
+
+               $this->assertSame(
+                       23,
+                       $mock->centralIdFromLocalUser(
+                               User::newFromName( 'FooBar' ), CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST
+                       )
+               );
+
+               $mock = $this->getMockForAbstractClass( 'CentralIdLookup' );
+               $mock->expects( $this->any() )->method( 'isAttached' )
+                       ->will( $this->returnValue( false ) );
+               $mock->expects( $this->never() )->method( 'lookupUserNames' );
+
+               $this->assertSame(
+                       0,
+                       $mock->centralIdFromLocalUser(
+                               User::newFromName( 'FooBar' ), CentralIdLookup::AUDIENCE_RAW, CentralIdLookup::READ_LATEST
+                       )
+               );
+       }
+
+}
diff --git a/tests/phpunit/includes/user/LocalIdLookupTest.php b/tests/phpunit/includes/user/LocalIdLookupTest.php
new file mode 100644 (file)
index 0000000..2bea575
--- /dev/null
@@ -0,0 +1,149 @@
+<?php
+
+/**
+ * @covers LocalIdLookup
+ * @group Database
+ */
+class LocalIdLookupTest extends MediaWikiTestCase {
+       private $localUsers = array();
+
+       protected function setUp() {
+               global $wgGroupPermissions;
+
+               parent::setUp();
+
+               $this->stashMwGlobals( array( 'wgGroupPermissions' ) );
+               $wgGroupPermissions['local-id-lookup-test']['hideuser'] = true;
+       }
+
+       public function addDBData() {
+               for ( $i = 1; $i <= 4; $i++ ) {
+                       $user = User::newFromName( "UTLocalIdLookup$i" );
+                       if ( $user->getId() == 0 ) {
+                               $user->addToDatabase();
+                       }
+                       $this->localUsers["UTLocalIdLookup$i"] = $user->getId();
+               }
+
+               User::newFromName( 'UTLocalIdLookup1' )->addGroup( 'local-id-lookup-test' );
+
+               $block = new Block( array(
+                       'address' => 'UTLocalIdLookup3',
+                       'by' => User::idFromName( 'UTSysop' ),
+                       'reason' => __METHOD__,
+                       'expiry' => '1 day',
+                       'hideName' => false,
+               ) );
+               $block->insert();
+
+               $block = new Block( array(
+                       'address' => 'UTLocalIdLookup4',
+                       'by' => User::idFromName( 'UTSysop' ),
+                       'reason' => __METHOD__,
+                       'expiry' => '1 day',
+                       'hideName' => true,
+               ) );
+               $block->insert();
+       }
+
+       public function testLookupCentralIds() {
+               $lookup = new LocalIdLookup();
+               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+               $user2 = User::newFromName( 'UTLocalIdLookup2' );
+
+               $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
+               $this->assertFalse( $user2->isAllowed( 'hideuser' ), 'sanity check' );
+
+               $this->assertSame( array(), $lookup->lookupCentralIds( array() ) );
+
+               $expect = array_flip( $this->localUsers );
+               $expect[123] = 'X';
+               ksort( $expect );
+
+               $expect2 = $expect;
+               $expect2[$this->localUsers['UTLocalIdLookup4']] = '';
+
+               $arg = array_fill_keys( array_keys( $expect ), 'X' );
+
+               $this->assertSame( $expect2, $lookup->lookupCentralIds( $arg ) );
+               $this->assertSame( $expect, $lookup->lookupCentralIds( $arg, CentralIdLookup::AUDIENCE_RAW ) );
+               $this->assertSame( $expect, $lookup->lookupCentralIds( $arg, $user1 ) );
+               $this->assertSame( $expect2, $lookup->lookupCentralIds( $arg, $user2 ) );
+       }
+
+       public function testLookupUserNames() {
+               $lookup = new LocalIdLookup();
+               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+               $user2 = User::newFromName( 'UTLocalIdLookup2' );
+
+               $this->assertTrue( $user1->isAllowed( 'hideuser' ), 'sanity check' );
+               $this->assertFalse( $user2->isAllowed( 'hideuser' ), 'sanity check' );
+
+               $this->assertSame( array(), $lookup->lookupUserNames( array() ) );
+
+               $expect = $this->localUsers;
+               $expect['UTDoesNotExist'] = 'X';
+               ksort( $expect );
+
+               $expect2 = $expect;
+               $expect2['UTLocalIdLookup4'] = 'X';
+
+               $arg = array_fill_keys( array_keys( $expect ), 'X' );
+
+               $this->assertSame( $expect2, $lookup->lookupUserNames( $arg ) );
+               $this->assertSame( $expect, $lookup->lookupUserNames( $arg, CentralIdLookup::AUDIENCE_RAW ) );
+               $this->assertSame( $expect, $lookup->lookupUserNames( $arg, $user1 ) );
+               $this->assertSame( $expect2, $lookup->lookupUserNames( $arg, $user2 ) );
+       }
+
+       public function testIsAttached() {
+               $lookup = new LocalIdLookup();
+               $user1 = User::newFromName( 'UTLocalIdLookup1' );
+               $user2 = User::newFromName( 'DoesNotExist' );
+
+               $this->assertTrue( $lookup->isAttached( $user1 ) );
+               $this->assertFalse( $lookup->isAttached( $user2 ) );
+
+               $wiki = wfWikiId();
+               $this->assertTrue( $lookup->isAttached( $user1, $wiki ) );
+               $this->assertFalse( $lookup->isAttached( $user2, $wiki ) );
+
+               $wiki = 'not-' . wfWikiId();
+               $this->assertFalse( $lookup->isAttached( $user1, $wiki ) );
+               $this->assertFalse( $lookup->isAttached( $user2, $wiki ) );
+       }
+
+       /**
+        * @dataProvider provideIsAttachedShared
+        * @param bool $sharedDB $wgSharedDB is set
+        * @param bool $sharedTable $wgSharedTables contains 'user'
+        * @param bool $localDBSet $wgLocalDatabases contains the shared DB
+        */
+       public function testIsAttachedShared( $sharedDB, $sharedTable, $localDBSet ) {
+               global $wgDBName;
+               $this->setMwGlobals( array(
+                       'wgSharedDB' => $sharedDB ? $wgDBName : null,
+                       'wgSharedTables' => $sharedTable ? array( 'user' ) : array(),
+                       'wgLocalDatabases' => $localDBSet ? array( 'shared' ) : array(),
+               ) );
+
+               $lookup = new LocalIdLookup();
+               $this->assertSame(
+                       $sharedDB && $sharedTable && $localDBSet,
+                       $lookup->isAttached( User::newFromName( 'UTLocalIdLookup1' ), 'shared' )
+               );
+       }
+
+       public static function provideIsAttachedShared() {
+               $ret = array();
+               for ( $i = 0; $i < 7; $i++ ) {
+                       $ret[] = array(
+                               (bool)( $i & 1 ),
+                               (bool)( $i & 2 ),
+                               (bool)( $i & 4 ),
+                       );
+               }
+               return $ret;
+       }
+
+}
diff --git a/tests/phpunit/includes/user/UserArrayFromResultTest.php b/tests/phpunit/includes/user/UserArrayFromResultTest.php
new file mode 100644 (file)
index 0000000..469ad29
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * @author Adam Shorland
+ * @covers UserArrayFromResult
+ */
+class UserArrayFromResultTest extends MediaWikiTestCase {
+
+       private function getMockResultWrapper( $row = null, $numRows = 1 ) {
+               $resultWrapper = $this->getMockBuilder( 'ResultWrapper' )
+                       ->disableOriginalConstructor();
+
+               $resultWrapper = $resultWrapper->getMock();
+               $resultWrapper->expects( $this->atLeastOnce() )
+                       ->method( 'current' )
+                       ->will( $this->returnValue( $row ) );
+               $resultWrapper->expects( $this->any() )
+                       ->method( 'numRows' )
+                       ->will( $this->returnValue( $numRows ) );
+
+               return $resultWrapper;
+       }
+
+       private function getRowWithUsername( $username = 'fooUser' ) {
+               $row = new stdClass();
+               $row->user_name = $username;
+               return $row;
+       }
+
+       private function getUserArrayFromResult( $resultWrapper ) {
+               return new UserArrayFromResult( $resultWrapper );
+       }
+
+       /**
+        * @covers UserArrayFromResult::__construct
+        */
+       public function testConstructionWithFalseRow() {
+               $row = false;
+               $resultWrapper = $this->getMockResultWrapper( $row );
+
+               $object = $this->getUserArrayFromResult( $resultWrapper );
+
+               $this->assertEquals( $resultWrapper, $object->res );
+               $this->assertSame( 0, $object->key );
+               $this->assertEquals( $row, $object->current );
+       }
+
+       /**
+        * @covers UserArrayFromResult::__construct
+        */
+       public function testConstructionWithRow() {
+               $username = 'addshore';
+               $row = $this->getRowWithUsername( $username );
+               $resultWrapper = $this->getMockResultWrapper( $row );
+
+               $object = $this->getUserArrayFromResult( $resultWrapper );
+
+               $this->assertEquals( $resultWrapper, $object->res );
+               $this->assertSame( 0, $object->key );
+               $this->assertInstanceOf( 'User', $object->current );
+               $this->assertEquals( $username, $object->current->mName );
+       }
+
+       public static function provideNumberOfRows() {
+               return array(
+                       array( 0 ),
+                       array( 1 ),
+                       array( 122 ),
+               );
+       }
+
+       /**
+        * @dataProvider provideNumberOfRows
+        * @covers UserArrayFromResult::count
+        */
+       public function testCountWithVaryingValues( $numRows ) {
+               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper(
+                       $this->getRowWithUsername(),
+                       $numRows
+               ) );
+               $this->assertEquals( $numRows, $object->count() );
+       }
+
+       /**
+        * @covers UserArrayFromResult::current
+        */
+       public function testCurrentAfterConstruction() {
+               $username = 'addshore';
+               $userRow = $this->getRowWithUsername( $username );
+               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper( $userRow ) );
+               $this->assertInstanceOf( 'User', $object->current() );
+               $this->assertEquals( $username, $object->current()->mName );
+       }
+
+       public function provideTestValid() {
+               return array(
+                       array( $this->getRowWithUsername(), true ),
+                       array( false, false ),
+               );
+       }
+
+       /**
+        * @dataProvider provideTestValid
+        * @covers UserArrayFromResult::valid
+        */
+       public function testValid( $input, $expected ) {
+               $object = $this->getUserArrayFromResult( $this->getMockResultWrapper( $input ) );
+               $this->assertEquals( $expected, $object->valid() );
+       }
+
+       // @todo unit test for key()
+       // @todo unit test for next()
+       // @todo unit test for rewind()
+}
diff --git a/tests/phpunit/includes/user/UserTest.php b/tests/phpunit/includes/user/UserTest.php
new file mode 100644 (file)
index 0000000..45c4b8c
--- /dev/null
@@ -0,0 +1,534 @@
+<?php
+
+define( 'NS_UNITTEST', 5600 );
+define( 'NS_UNITTEST_TALK', 5601 );
+
+/**
+ * @group Database
+ */
+class UserTest extends MediaWikiTestCase {
+       /**
+        * @var User
+        */
+       protected $user;
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgGroupPermissions' => array(),
+                       'wgRevokePermissions' => array(),
+               ) );
+
+               $this->setUpPermissionGlobals();
+
+               $this->user = new User;
+               $this->user->addGroup( 'unittesters' );
+       }
+
+       private function setUpPermissionGlobals() {
+               global $wgGroupPermissions, $wgRevokePermissions;
+
+               # Data for regular $wgGroupPermissions test
+               $wgGroupPermissions['unittesters'] = array(
+                       'test' => true,
+                       'runtest' => true,
+                       'writetest' => false,
+                       'nukeworld' => false,
+               );
+               $wgGroupPermissions['testwriters'] = array(
+                       'test' => true,
+                       'writetest' => true,
+                       'modifytest' => true,
+               );
+
+               # Data for regular $wgRevokePermissions test
+               $wgRevokePermissions['formertesters'] = array(
+                       'runtest' => true,
+               );
+
+               # For the options test
+               $wgGroupPermissions['*'] = array(
+                       'editmyoptions' => true,
+               );
+       }
+
+       /**
+        * @covers User::getGroupPermissions
+        */
+       public function testGroupPermissions() {
+               $rights = User::getGroupPermissions( array( 'unittesters' ) );
+               $this->assertContains( 'runtest', $rights );
+               $this->assertNotContains( 'writetest', $rights );
+               $this->assertNotContains( 'modifytest', $rights );
+               $this->assertNotContains( 'nukeworld', $rights );
+
+               $rights = User::getGroupPermissions( array( 'unittesters', 'testwriters' ) );
+               $this->assertContains( 'runtest', $rights );
+               $this->assertContains( 'writetest', $rights );
+               $this->assertContains( 'modifytest', $rights );
+               $this->assertNotContains( 'nukeworld', $rights );
+       }
+
+       /**
+        * @covers User::getGroupPermissions
+        */
+       public function testRevokePermissions() {
+               $rights = User::getGroupPermissions( array( 'unittesters', 'formertesters' ) );
+               $this->assertNotContains( 'runtest', $rights );
+               $this->assertNotContains( 'writetest', $rights );
+               $this->assertNotContains( 'modifytest', $rights );
+               $this->assertNotContains( 'nukeworld', $rights );
+       }
+
+       /**
+        * @covers User::getRights
+        */
+       public function testUserPermissions() {
+               $rights = $this->user->getRights();
+               $this->assertContains( 'runtest', $rights );
+               $this->assertNotContains( 'writetest', $rights );
+               $this->assertNotContains( 'modifytest', $rights );
+               $this->assertNotContains( 'nukeworld', $rights );
+       }
+
+       /**
+        * @dataProvider provideGetGroupsWithPermission
+        * @covers User::getGroupsWithPermission
+        */
+       public function testGetGroupsWithPermission( $expected, $right ) {
+               $result = User::getGroupsWithPermission( $right );
+               sort( $result );
+               sort( $expected );
+
+               $this->assertEquals( $expected, $result, "Groups with permission $right" );
+       }
+
+       public static function provideGetGroupsWithPermission() {
+               return array(
+                       array(
+                               array( 'unittesters', 'testwriters' ),
+                               'test'
+                       ),
+                       array(
+                               array( 'unittesters' ),
+                               'runtest'
+                       ),
+                       array(
+                               array( 'testwriters' ),
+                               'writetest'
+                       ),
+                       array(
+                               array( 'testwriters' ),
+                               'modifytest'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideIPs
+        * @covers User::isIP
+        */
+       public function testIsIP( $value, $result, $message ) {
+               $this->assertEquals( $this->user->isIP( $value ), $result, $message );
+       }
+
+       public static function provideIPs() {
+               return array(
+                       array( '', false, 'Empty string' ),
+                       array( ' ', false, 'Blank space' ),
+                       array( '10.0.0.0', true, 'IPv4 private 10/8' ),
+                       array( '10.255.255.255', true, 'IPv4 private 10/8' ),
+                       array( '192.168.1.1', true, 'IPv4 private 192.168/16' ),
+                       array( '203.0.113.0', true, 'IPv4 example' ),
+                       array( '2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff', true, 'IPv6 example' ),
+                       // Not valid IPs but classified as such by MediaWiki for negated asserting
+                       // of whether this might be the identifier of a logged-out user or whether
+                       // to allow usernames like it.
+                       array( '300.300.300.300', true, 'Looks too much like an IPv4 address' ),
+                       array( '203.0.113.xxx', true, 'Assigned by UseMod to cloaked logged-out users' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideUserNames
+        * @covers User::isValidUserName
+        */
+       public function testIsValidUserName( $username, $result, $message ) {
+               $this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
+       }
+
+       public static function provideUserNames() {
+               return array(
+                       array( '', false, 'Empty string' ),
+                       array( ' ', false, 'Blank space' ),
+                       array( 'abcd', false, 'Starts with small letter' ),
+                       array( 'Ab/cd', false, 'Contains slash' ),
+                       array( 'Ab cd', true, 'Whitespace' ),
+                       array( '192.168.1.1', false, 'IP' ),
+                       array( 'User:Abcd', false, 'Reserved Namespace' ),
+                       array( '12abcd232', true, 'Starts with Numbers' ),
+                       array( '?abcd', true, 'Start with ? mark' ),
+                       array( '#abcd', false, 'Start with #' ),
+                       array( 'Abcdകഖഗഘ', true, ' Mixed scripts' ),
+                       array( 'ജോസ്‌തോമസ്', false, 'ZWNJ- Format control character' ),
+                       array( 'Ab cd', false, ' Ideographic space' ),
+                       array( '300.300.300.300', false, 'Looks too much like an IPv4 address' ),
+                       array( '302.113.311.900', false, 'Looks too much like an IPv4 address' ),
+                       array( '203.0.113.xxx', false, 'Reserved for usage by UseMod for cloaked logged-out users' ),
+               );
+       }
+
+       /**
+        * Test, if for all rights a right- message exist,
+        * which is used on Special:ListGroupRights as help text
+        * Extensions and core
+        */
+       public function testAllRightsWithMessage() {
+               // Getting all user rights, for core: User::$mCoreRights, for extensions: $wgAvailableRights
+               $allRights = User::getAllRights();
+               $allMessageKeys = Language::getMessageKeysFor( 'en' );
+
+               $rightsWithMessage = array();
+               foreach ( $allMessageKeys as $message ) {
+                       // === 0: must be at beginning of string (position 0)
+                       if ( strpos( $message, 'right-' ) === 0 ) {
+                               $rightsWithMessage[] = substr( $message, strlen( 'right-' ) );
+                       }
+               }
+
+               sort( $allRights );
+               sort( $rightsWithMessage );
+
+               $this->assertEquals(
+                       $allRights,
+                       $rightsWithMessage,
+                       'Each user rights (core/extensions) has a corresponding right- message.'
+               );
+       }
+
+       /**
+        * Test User::editCount
+        * @group medium
+        * @covers User::getEditCount
+        */
+       public function testEditCount() {
+               $user = User::newFromName( 'UnitTestUser' );
+
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               // let the user have a few (3) edits
+               $page = WikiPage::factory( Title::newFromText( 'Help:UserTest_EditCount' ) );
+               for ( $i = 0; $i < 3; $i++ ) {
+                       $page->doEdit( (string)$i, 'test', 0, false, $user );
+               }
+
+               $user->clearInstanceCache();
+               $this->assertEquals(
+                       3,
+                       $user->getEditCount(),
+                       'After three edits, the user edit count should be 3'
+               );
+
+               // increase the edit count and clear the cache
+               $user->incEditCount();
+
+               $user->clearInstanceCache();
+               $this->assertEquals(
+                       4,
+                       $user->getEditCount(),
+                       'After increasing the edit count manually, the user edit count should be 4'
+               );
+       }
+
+       /**
+        * Test changing user options.
+        * @covers User::setOption
+        * @covers User::getOption
+        */
+       public function testOptions() {
+               $user = User::newFromName( 'UnitTestUser' );
+
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               $user->setOption( 'userjs-someoption', 'test' );
+               $user->setOption( 'cols', 200 );
+               $user->saveSettings();
+
+               $user = User::newFromName( 'UnitTestUser' );
+               $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
+               $this->assertEquals( 200, $user->getOption( 'cols' ) );
+       }
+
+       /**
+        * Bug 37963
+        * Make sure defaults are loaded when setOption is called.
+        * @covers User::loadOptions
+        */
+       public function testAnonOptions() {
+               global $wgDefaultUserOptions;
+               $this->user->setOption( 'userjs-someoption', 'test' );
+               $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
+               $this->assertEquals( 'test', $this->user->getOption( 'userjs-someoption' ) );
+       }
+
+       /**
+        * Test password validity checks. There are 3 checks in core,
+        *      - ensure the password meets the minimal length
+        *      - ensure the password is not the same as the username
+        *      - ensure the username/password combo isn't forbidden
+        * @covers User::checkPasswordValidity()
+        * @covers User::getPasswordValidity()
+        * @covers User::isValidPassword()
+        */
+       public function testCheckPasswordValidity() {
+               $this->setMwGlobals( array(
+                       'wgPasswordPolicy' => array(
+                               'policies' => array(
+                                       'sysop' => array(
+                                               'MinimalPasswordLength' => 8,
+                                               'MinimumPasswordLengthToLogin' => 1,
+                                               'PasswordCannotMatchUsername' => 1,
+                                       ),
+                                       'default' => array(
+                                               'MinimalPasswordLength' => 6,
+                                               'PasswordCannotMatchUsername' => true,
+                                               'PasswordCannotMatchBlacklist' => true,
+                                               'MaximalPasswordLength' => 30,
+                                       ),
+                               ),
+                               'checks' => array(
+                                       'MinimalPasswordLength' => 'PasswordPolicyChecks::checkMinimalPasswordLength',
+                                       'MinimumPasswordLengthToLogin' => 'PasswordPolicyChecks::checkMinimumPasswordLengthToLogin',
+                                       'PasswordCannotMatchUsername' => 'PasswordPolicyChecks::checkPasswordCannotMatchUsername',
+                                       'PasswordCannotMatchBlacklist' => 'PasswordPolicyChecks::checkPasswordCannotMatchBlacklist',
+                                       'MaximalPasswordLength' => 'PasswordPolicyChecks::checkMaximalPasswordLength',
+                               ),
+                       ),
+               ) );
+
+               $user = User::newFromName( 'Useruser' );
+               // Sanity
+               $this->assertTrue( $user->isValidPassword( 'Password1234' ) );
+
+               // Minimum length
+               $this->assertFalse( $user->isValidPassword( 'a' ) );
+               $this->assertFalse( $user->checkPasswordValidity( 'a' )->isGood() );
+               $this->assertTrue( $user->checkPasswordValidity( 'a' )->isOK() );
+               $this->assertEquals( 'passwordtooshort', $user->getPasswordValidity( 'a' ) );
+
+               // Maximum length
+               $longPass = str_repeat( 'a', 31 );
+               $this->assertFalse( $user->isValidPassword( $longPass ) );
+               $this->assertFalse( $user->checkPasswordValidity( $longPass )->isGood() );
+               $this->assertFalse( $user->checkPasswordValidity( $longPass )->isOK() );
+               $this->assertEquals( 'passwordtoolong', $user->getPasswordValidity( $longPass ) );
+
+               // Matches username
+               $this->assertFalse( $user->checkPasswordValidity( 'Useruser' )->isGood() );
+               $this->assertTrue( $user->checkPasswordValidity( 'Useruser' )->isOK() );
+               $this->assertEquals( 'password-name-match', $user->getPasswordValidity( 'Useruser' ) );
+
+               // On the forbidden list
+               $this->assertFalse( $user->checkPasswordValidity( 'Passpass' )->isGood() );
+               $this->assertEquals( 'password-login-forbidden', $user->getPasswordValidity( 'Passpass' ) );
+       }
+
+       /**
+        * @covers User::getCanonicalName()
+        * @dataProvider provideGetCanonicalName
+        */
+       public function testGetCanonicalName( $name, $expectedArray, $msg ) {
+               foreach ( $expectedArray as $validate => $expected ) {
+                       $this->assertEquals(
+                               $expected,
+                               User::getCanonicalName( $name, $validate === 'false' ? false : $validate ),
+                               $msg . ' (' . $validate . ')'
+                       );
+               }
+       }
+
+       public static function provideGetCanonicalName() {
+               return array(
+                       array( ' Trailing space ', array( 'creatable' => 'Trailing space' ), 'Trailing spaces' ),
+                       // @todo FIXME: Maybe the creatable name should be 'Talk:Username' or false to reject?
+                       array( 'Talk:Username', array( 'creatable' => 'Username', 'usable' => 'Username',
+                               'valid' => 'Username', 'false' => 'Talk:Username' ), 'Namespace prefix' ),
+                       array( ' name with # hash', array( 'creatable' => false, 'usable' => false ), 'With hash' ),
+                       array( 'Multi  spaces', array( 'creatable' => 'Multi spaces',
+                               'usable' => 'Multi spaces' ), 'Multi spaces' ),
+                       array( 'lowercase', array( 'creatable' => 'Lowercase' ), 'Lowercase' ),
+                       array( 'in[]valid', array( 'creatable' => false, 'usable' => false, 'valid' => false,
+                               'false' => 'In[]valid' ), 'Invalid' ),
+                       array( 'with / slash', array( 'creatable' => false, 'usable' => false, 'valid' => false,
+                               'false' => 'With / slash' ), 'With slash' ),
+               );
+       }
+
+       /**
+        * @covers User::equals
+        */
+       public function testEquals() {
+               $first = User::newFromName( 'EqualUser' );
+               $second = User::newFromName( 'EqualUser' );
+
+               $this->assertTrue( $first->equals( $first ) );
+               $this->assertTrue( $first->equals( $second ) );
+               $this->assertTrue( $second->equals( $first ) );
+
+               $third = User::newFromName( '0' );
+               $fourth = User::newFromName( '000' );
+
+               $this->assertFalse( $third->equals( $fourth ) );
+               $this->assertFalse( $fourth->equals( $third ) );
+
+               // Test users loaded from db with id
+               $user = User::newFromName( 'EqualUnitTestUser' );
+               if ( !$user->getId() ) {
+                       $user->addToDatabase();
+               }
+
+               $id = $user->getId();
+
+               $fifth = User::newFromId( $id );
+               $sixth = User::newFromName( 'EqualUnitTestUser' );
+               $this->assertTrue( $fifth->equals( $sixth ) );
+       }
+
+       /**
+        * @covers User::getId
+        */
+       public function testGetId() {
+               $user = User::newFromName( 'UTSysop' );
+               $this->assertTrue( $user->getId() > 0 );
+
+       }
+
+       /**
+        * @covers User::isLoggedIn
+        * @covers User::isAnon
+        */
+       public function testLoggedIn() {
+               $user = User::newFromName( 'UTSysop' );
+               $this->assertTrue( $user->isLoggedIn() );
+               $this->assertFalse( $user->isAnon() );
+
+               // Non-existent users are perceived as anonymous
+               $user = User::newFromName( 'UTNonexistent' );
+               $this->assertFalse( $user->isLoggedIn() );
+               $this->assertTrue( $user->isAnon() );
+
+               $user = new User;
+               $this->assertFalse( $user->isLoggedIn() );
+               $this->assertTrue( $user->isAnon() );
+       }
+
+       /**
+        * @covers User::checkAndSetTouched
+        */
+       public function testCheckAndSetTouched() {
+               $user = TestingAccessWrapper::newFromObject( User::newFromName( 'UTSysop' ) );
+               $this->assertTrue( $user->isLoggedIn() );
+
+               $touched = $user->getDBTouched();
+               $this->assertTrue(
+                       $user->checkAndSetTouched(), "checkAndSetTouched() succeded" );
+               $this->assertGreaterThan(
+                       $touched, $user->getDBTouched(), "user_touched increased with casOnTouched()" );
+
+               $touched = $user->getDBTouched();
+               $this->assertTrue(
+                       $user->checkAndSetTouched(), "checkAndSetTouched() succeded #2" );
+               $this->assertGreaterThan(
+                       $touched, $user->getDBTouched(), "user_touched increased with casOnTouched() #2" );
+       }
+
+       public static function setExtendedLoginCookieDataProvider() {
+               $data = array();
+               $now = time();
+
+               $secondsInDay = 86400;
+
+               // Arbitrary durations, in units of days, to ensure it chooses the
+               // right one.  There is a 5-minute grace period (see testSetExtendedLoginCookie)
+               // to work around slow tests, since we're not currently mocking time() for PHP.
+
+               $durationOne = $secondsInDay * 5;
+               $durationTwo = $secondsInDay * 29;
+               $durationThree = $secondsInDay * 17;
+
+               // If $wgExtendedLoginCookieExpiration is null, then the expiry passed to
+               // set cookie is time() + $wgCookieExpiration
+               $data[] = array(
+                       null,
+                       $durationOne,
+                       $now + $durationOne,
+               );
+
+               // If $wgExtendedLoginCookieExpiration isn't null, then the expiry passed to
+               // set cookie is $now + $wgExtendedLoginCookieExpiration
+               $data[] = array(
+                       $durationTwo,
+                       $durationThree,
+                       $now + $durationTwo,
+               );
+
+               return $data;
+       }
+
+       /**
+        * @dataProvider setExtendedLoginCookieDataProvider
+        * @covers User::getRequest
+        * @covers User::setCookie
+        * @backupGlobals enabled
+        */
+       public function testSetExtendedLoginCookie(
+               $extendedLoginCookieExpiration,
+               $cookieExpiration,
+               $expectedExpiry
+       ) {
+               $this->setMwGlobals( array(
+                       'wgExtendedLoginCookieExpiration' => $extendedLoginCookieExpiration,
+                       'wgCookieExpiration' => $cookieExpiration,
+               ) );
+
+               $response = $this->getMock( 'WebResponse' );
+               $setcookieSpy = $this->any();
+               $response->expects( $setcookieSpy )
+                       ->method( 'setcookie' );
+
+               $request = new MockWebRequest( $response );
+               $user = new UserProxy( User::newFromSession( $request ) );
+               $user->setExtendedLoginCookie( 'name', 'value', true );
+
+               $setcookieInvocations = $setcookieSpy->getInvocations();
+               $setcookieInvocation = end( $setcookieInvocations );
+               $actualExpiry = $setcookieInvocation->parameters[2];
+
+               // TODO: ± 600 seconds compensates for
+               // slow-running tests. However, the dependency on the time
+               // function should be removed.  This requires some way
+               // to mock/isolate User->setExtendedLoginCookie's call to time()
+               $this->assertEquals( $expectedExpiry, $actualExpiry, '', 600 );
+       }
+}
+
+class UserProxy extends User {
+
+       /**
+        * @var User
+        */
+       protected $user;
+
+       public function __construct( User $user ) {
+               $this->user = $user;
+       }
+
+       public function setExtendedLoginCookie( $name, $value, $secure ) {
+               $this->user->setExtendedLoginCookie( $name, $value, $secure );
+       }
+}
index fedcc76..7123b94 100644 (file)
@@ -18,7 +18,7 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals( true, ctype_digit( $id ), "UID made of digit characters" );
                $this->assertLessThanOrEqual( $digitlen, strlen( $id ),
                        "UID has the right number of digits" );
-               $this->assertLessThanOrEqual( $bits, strlen( wfBaseConvert( $id, 10, 2 ) ),
+               $this->assertLessThanOrEqual( $bits, strlen( Wikimedia\base_convert( $id, 10, 2 ) ),
                        "UID has the right number of bits" );
 
                $ids = array();
@@ -31,8 +31,8 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                $this->assertSame( array_unique( $ids ), $ids, "All generated IDs are unique." );
 
                foreach ( $ids as $id ) {
-                       $id_bin = wfBaseConvert( $id, 10, 2 );
-                       $lastId_bin = wfBaseConvert( $lastId, 10, 2 );
+                       $id_bin = Wikimedia\base_convert( $id, 10, 2 );
+                       $lastId_bin = Wikimedia\base_convert( $lastId, 10, 2 );
 
                        $this->assertGreaterThanOrEqual(
                                substr( $lastId_bin, 0, $tbits ),
@@ -62,16 +62,46 @@ class UIDGeneratorTest extends PHPUnit_Framework_TestCase {
                );
        }
 
+       /**
+        * @covers UIDGenerator::newUUIDv1
+        */
+       public function testUUIDv1() {
+               $ids = array();
+               for ( $i = 0; $i < 100; $i++ ) {
+                       $id = UIDGenerator::newUUIDv1();
+                       $this->assertEquals( true,
+                               preg_match( '!^[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$!', $id ),
+                               "UID $id has the right format" );
+                       $ids[] = $id;
+
+                       $id = UIDGenerator::newRawUUIDv1();
+                       $this->assertEquals( true,
+                               preg_match( '!^[0-9a-f]{12}1[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
+                               "UID $id has the right format" );
+
+                       $id = UIDGenerator::newRawUUIDv1( UIDGenerator::QUICK_RAND );
+                       $this->assertEquals( true,
+                               preg_match( '!^[0-9a-f]{12}1[0-9a-f]{3}[89ab][0-9a-f]{15}$!', $id ),
+                               "UID $id has the right format" );
+               }
+
+               $this->assertEquals( array_unique( $ids ), $ids, "All generated IDs are unique." );
+       }
+
        /**
         * @covers UIDGenerator::newUUIDv4
         */
        public function testUUIDv4() {
+               $ids = array();
                for ( $i = 0; $i < 100; $i++ ) {
                        $id = UIDGenerator::newUUIDv4();
+                       $ids[] = $id;
                        $this->assertEquals( true,
                                preg_match( '!^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$!', $id ),
                                "UID $id has the right format" );
                }
+
+               $this->assertEquals( array_unique( $ids ), $ids, 'All generated IDs are unique.' );
        }
 
        /**
index d4ccca9..8fc0bee 100644 (file)
@@ -13,7 +13,6 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
                        'wgContLang' => Language::factory( 'tg' ),
                        'wgLanguageCode' => 'tg',
                        'wgDefaultLanguageVariant' => false,
-                       'wgMemc' => new EmptyBagOStuff,
                        'wgRequest' => new FauxRequest( array() ),
                        'wgUser' => new User,
                ) );
index 4fca002..77c3c02 100644 (file)
@@ -261,6 +261,16 @@ class LanguageTest extends LanguageClassesTestCase {
                        $this->getLang()->truncate( "1234567890", 5, 'XXX', false ),
                        'truncate without adjustment'
                );
+               $this->assertEquals(
+                       "泰乐菌...",
+                       $this->getLang()->truncate( "泰乐菌素123456789", 11, '...', false ),
+                       'truncate does not chop Unicode characters in half'
+               );
+               $this->assertEquals(
+                       "\n泰乐菌...",
+                       $this->getLang()->truncate( "\n泰乐菌素123456789", 12, '...', false ),
+                       'truncate does not chop Unicode characters in half if there is a preceding newline'
+               );
        }
 
        /**
index 49b91c3..aaa7751 100755 (executable)
@@ -113,6 +113,11 @@ class PHPUnitMaintClass extends Maintenance {
                );
                // xdebug's default of 100 is too low for MediaWiki
                ini_set( 'xdebug.max_nesting_level', 1000 );
+
+               // Bug T116683 serialize_precision of 100
+               // may break testing against floating point values
+               // treated with PHP's serialize()
+               ini_set( 'serialize_precision', 17 );
        }
 
        public function execute() {
index ae0d325..3282665 100644 (file)
@@ -232,7 +232,6 @@ class ResourcesTest extends MediaWikiTestCase {
                        'lists' => array(
                                'scripts',
                                'debugScripts',
-                               'loaderScripts',
                                'styles',
                        ),
 
index d93dafb..bdabdc1 100644 (file)
@@ -24,6 +24,10 @@ phpunit.php enables colors for other OSs at runtime
                <testsuite name="languages">
                        <directory>languages</directory>
                </testsuite>
+               <testsuite name="parsertests">
+                       <file>includes/parser/MediaWikiParserTest.php</file>
+                       <file>suites/ExtensionsParserTestSuite.php</file>
+               </testsuite>
                <testsuite name="skins">
                        <directory>skins</directory>
                        <directory>structure</directory>
index e867250..80893da 100644 (file)
@@ -21,6 +21,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                        $wgParserCacheType, $wgNamespaceAliases, $wgNamespaceProtection,
                        $parserMemc;
 
+               $tmpDir = $this->getNewTempDirectory();
                $tmpGlobals = array();
 
                $tmpGlobals['wgScript'] = '/index.php';
@@ -38,10 +39,10 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                                'name' => 'local-backend',
                                'wikiId' => wfWikiId(),
                                'containerPaths' => array(
-                                       'local-public' => wfTempDir() . '/test-repo/public',
-                                       'local-thumb' => wfTempDir() . '/test-repo/thumb',
-                                       'local-temp' => wfTempDir() . '/test-repo/temp',
-                                       'local-deleted' => wfTempDir() . '/test-repo/delete',
+                                       'local-public' => "{$tmpDir}/test-repo/public",
+                                       'local-thumb' => "{$tmpDir}/test-repo/thumb",
+                                       'local-temp' => "{$tmpDir}/test-repo/temp",
+                                       'local-deleted' => "{$tmpDir}/test-repo/delete",
                                )
                        ) ),
                );
@@ -176,17 +177,11 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                                return $dir;
                        }
                } else {
-                       $dir = wfTempDir() . "/mwParser-" . mt_rand() . "-images";
+                       $dir = $this->getNewTempDirectory();
                }
 
                wfDebug( "Creating upload directory $dir\n" );
 
-               if ( file_exists( $dir ) ) {
-                       wfDebug( "Already exists!\n" );
-
-                       return $dir;
-               }
-
                wfMkdirParents( $dir . '/3/3a', null, __METHOD__ );
                copy( "$IP/tests/phpunit/data/upload/headbg.jpg", "$dir/3/3a/Foobar.jpg" );
 
index f9ddcf2..545718a 100644 (file)
@@ -63,6 +63,7 @@ return array(
                        'tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.textSelection.test.js',
                        'tests/qunit/data/mediawiki.jqueryMsg.data.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.requestIdleCallback.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.errorLogger.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js',
@@ -71,6 +72,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.test.js',
+                       'tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js',
                        'tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js',
@@ -79,6 +81,7 @@ return array(
                        'tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js',
+                       'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
                        'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js',
@@ -109,6 +112,7 @@ return array(
                        'jquery.textSelection',
                        'mediawiki.api',
                        'mediawiki.api.category',
+                       'mediawiki.api.messages',
                        'mediawiki.api.options',
                        'mediawiki.api.parse',
                        'mediawiki.api.upload',
index cf34fc1..532a6ce 100644 (file)
@@ -22,7 +22,7 @@
                        [ 'Mozilla/5.0 (X11; Linux i686) KHTML/4.9.1 (like Gecko) Konqueror/4.9', 'Linux i686', 'ctrl-' ],
                        // Opera
                        [ 'Opera/9.80 (Windows NT 5.1)', 'Win32', 'shift-esc-' ],
-                       [ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'shift-esc-' ],
+                       [ 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.130', 'Win32', 'alt-shift-' ],
                        // Chrome
                        [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30', 'MacIntel', 'ctrl-option-' ],
                        [ 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30', 'Linux i686', 'alt-shift-' ]
diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js
new file mode 100644 (file)
index 0000000..5880962
--- /dev/null
@@ -0,0 +1,31 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.api.messages', QUnit.newMwEnvironment( {
+               setup: function () {
+                       this.server = this.sandbox.useFakeServer();
+               }
+       } ) );
+
+       QUnit.test( '.getMessages()', function ( assert ) {
+               QUnit.expect( 1 );
+
+               var api = new mw.Api();
+               api.getMessages( [ 'foo', 'baz' ] ).then( function ( messages ) {
+                       assert.deepEqual(
+                               messages,
+                               {
+                                       foo: 'Foo bar',
+                                       baz: 'Baz Quux'
+                               }
+                       );
+               } );
+
+               this.server.respond( /ammessages=foo%7Cbaz/, [
+                       200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "query": { "allmessages": [' +
+                               '{ "name": "foo", "content": "Foo bar" },' +
+                               '{ "name": "baz", "content": "Baz Quux" }' +
+                               '] } }'
+               ] );
+       } );
+}( mediaWiki ) );
index c0a6585..a0cfba9 100644 (file)
@@ -27,9 +27,9 @@
                // until after the server.respond call, which confuses sinon terribly. This sucks a lot.
                api.getToken( 'options' );
                this.server.respond(
-                       /action=tokens.*&type=options/,
+                       /meta=tokens&type=csrf/,
                        [ 200, { 'Content-Type': 'application/json' },
-                               '{ "tokens": { "optionstoken": "+\\\\" } }' ]
+                               '{ "query": { "tokens": { "csrftoken": "+\\\\" } } }' ]
                );
 
                api.saveOptions( {} ).done( function () {
@@ -71,7 +71,7 @@
                                                '{ "options": "success" }' );
                                        break;
                                default:
-                                       assert.ok( false, 'Unexpected request:' + request.requestBody );
+                                       assert.ok( false, 'Unexpected request: ' + request.requestBody );
                        }
                } );
        } );
index 56a346f..394f3bd 100644 (file)
                var api = new mw.Api();
 
                this.server.respondWith( /type=testuncached/, [ 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testuncachedtoken": "good" } }'
+                       '{ "query": { "tokens": { "testuncachedtoken": "good" } } }'
                ] );
 
                // Get a token of a type that isn't prepopulated by user.tokens.
                this.server.respondWith( /type=testerror/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
                        [
                                '{ "error": { "code": "bite-me", "info": "Smite me, O Mighty Smiter" } }',
-                               '{ "tokens": { "testerrortoken": "good" } }'
+                               '{ "query": { "tokens": { "testerrortoken": "good" } } }'
                        ]
                ) );
 
                } );
        } );
 
+       QUnit.test( 'getToken() - deprecated', function ( assert ) {
+               QUnit.expect( 2 );
+               // Cache API endpoint from default to avoid cachehit in mw.user.tokens
+               var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
+
+               this.server.respondWith( /type=csrf/, [ 200, { 'Content-Type': 'application/json' },
+                       '{ "query": { "tokens": { "csrftoken": "csrfgood" } } }'
+               ] );
+
+               // Get a token of a type that is in the legacy map.
+               api.getToken( 'email' )
+                       .done( function ( token ) {
+                               assert.equal( token, 'csrfgood', 'Token' );
+                       } )
+                       .fail( function ( err ) {
+                               assert.equal( err, '', 'API error' );
+                       } );
+
+               assert.equal( this.server.requests.length, 1, 'Requests made' );
+       } );
+
        QUnit.test( 'badToken()', function ( assert ) {
                QUnit.expect( 2 );
                var api = new mw.Api(),
 
                this.server.respondWith( /type=testbad/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
                        [
-                               '{ "tokens": { "testbadtoken": "bad" } }',
-                               '{ "tokens": { "testbadtoken": "good" } }'
+                               '{ "query": { "tokens": { "testbadtoken": "bad" } } }',
+                               '{ "query": { "tokens": { "testbadtoken": "good" } } }'
                        ]
                ) );
 
 
        } );
 
+       QUnit.test( 'badToken( legacy )', function ( assert ) {
+               QUnit.expect( 2 );
+               var api = new mw.Api( { ajax: { url: '/badTokenLegacy/api.php' } } ),
+                       test = this;
+
+               this.server.respondWith( /type=csrf/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
+                       [
+                               '{ "query": { "tokens": { "csrftoken": "badlegacy" } } }',
+                               '{ "query": { "tokens": { "csrftoken": "goodlegacy" } } }'
+                       ]
+               ) );
+
+               api.getToken( 'options' )
+                       .then( function () {
+                               api.badToken( 'options' );
+                               return api.getToken( 'options' );
+                       } )
+                       .then( function ( token ) {
+                               assert.equal( token, 'goodlegacy', 'The token' );
+                               assert.equal( test.server.requests.length, 2, 'Request made' );
+                       } );
+
+       } );
+
        QUnit.test( 'postWithToken( tokenType, params )', function ( assert ) {
                QUnit.expect( 1 );
                var api = new mw.Api( { ajax: { url: '/postWithToken/api.php' } } );
 
                this.server.respondWith( 'GET', /type=testpost/, [ 200, { 'Content-Type': 'application/json' },
-                       '{ "tokens": { "testposttoken": "good" } }'
+                       '{ "query": { "tokens": { "testposttoken": "good" } } }'
                ] );
                this.server.respondWith( 'POST', /api/, function ( request ) {
                        if ( request.requestBody.match( /token=good/ ) ) {
 
                this.server.respondWith( /type=testbadtoken/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
                        [
-                               '{ "tokens": { "testbadtokentoken": "bad" } }',
-                               '{ "tokens": { "testbadtokentoken": "good" } }'
+                               '{ "query": { "tokens": { "testbadtokentoken": "bad" } } }',
+                               '{ "query": { "tokens": { "testbadtokentoken": "good" } } }'
                        ]
                ) );
                this.server.respondWith( 'POST', /api/, function ( request ) {
 
                this.server.respondWith( /type=testonce/, sequenceBodies( 200, { 'Content-Type': 'application/json' },
                        [
-                               '{ "tokens": { "testoncetoken": "good-A" } }',
-                               '{ "tokens": { "testoncetoken": "good-B" } }'
+                               '{ "query": { "tokens": { "testoncetoken": "good-A" } } }',
+                               '{ "query": { "tokens": { "testoncetoken": "good-B" } } }'
                        ]
                ) );
                sequenceA = sequenceBodies( 200, { 'Content-Type': 'application/json' },
index 641a5a5..4bcb12e 100644 (file)
                assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
        } );
 
-       QUnit.test( 'newFromImg', 40, function ( assert ) {
+       QUnit.test( 'newFromImg', 44, function ( assert ) {
                var title, i, thisCase, prefix,
                        cases = [
                                {
                                        nameText: 'Princess Alexandra of Denmark (later Queen Alexandra, wife of Edward VII) with her two eldest sons, Prince Albert Victor (Eddy) and George Frederick Ernest Albert (later George V)',
                                        prefixedText: 'File:Princess Alexandra of Denmark (later Queen Alexandra, wife of Edward VII) with her two eldest sons, Prince Albert Victor (Eddy) and George Frederick Ernest Albert (later George V).jpg'
                                },
+
+                               {
+                                       url: '//upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Princess_Alexandra_of_Denmark_%28later_Queen_Alexandra%2C_wife_of_Edward_VII%29_with_her_two_eldest_sons%2C_Prince_Albert_Victor_%28Eddy%29_and_George_Frederick_Ernest_Albert_%28later_George_V%29.jpg/939px-ki708pr1r6g2dl5lbhvwdqxenhait13.jpg',
+                                       typeOfUrl: 'Hashed thumb with sha1-ed path',
+                                       nameText: 'Princess Alexandra of Denmark (later Queen Alexandra, wife of Edward VII) with her two eldest sons, Prince Albert Victor (Eddy) and George Frederick Ernest Albert (later George V)',
+                                       prefixedText: 'File:Princess Alexandra of Denmark (later Queen Alexandra, wife of Edward VII) with her two eldest sons, Prince Albert Victor (Eddy) and George Frederick Ernest Albert (later George V).jpg'
+                               },
+
                                {
                                        url: '/wiki/images/thumb/9/91/Anticlockwise_heliotrope%27s.jpg/99px-Anticlockwise_heliotrope%27s.jpg',
                                        typeOfUrl: 'Normal hashed directory thumbnail',
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js
new file mode 100644 (file)
index 0000000..b4028ec
--- /dev/null
@@ -0,0 +1,105 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.html' );
+
+       QUnit.test( 'escape', 2, function ( assert ) {
+               assert.throws(
+                       function () {
+                               mw.html.escape();
+                       },
+                       TypeError,
+                       'throw a TypeError if argument is not a string'
+               );
+
+               assert.equal(
+                       mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
+                       '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;',
+                       'Escape special characters to html entities'
+               );
+       } );
+
+       QUnit.test( 'element()', 1, function ( assert ) {
+               assert.equal(
+                       mw.html.element(),
+                       '<undefined/>',
+                       'return valid html even without arguments'
+               );
+       } );
+
+       QUnit.test( 'element( tagName )', 1, function ( assert ) {
+               assert.equal( mw.html.element( 'div' ), '<div/>', 'DIV' );
+       } );
+
+       QUnit.test( 'element( tagName, attrs )', 2, function ( assert ) {
+               assert.equal( mw.html.element( 'div', {} ), '<div/>', 'DIV' );
+
+               assert.equal(
+                       mw.html.element(
+                               'div', {
+                                       id: 'foobar'
+                               }
+                       ),
+                       '<div id="foobar"/>',
+                       'DIV with attribs'
+               );
+       } );
+
+       QUnit.test( 'element( tagName, attrs, content )', 8, function ( assert ) {
+
+               assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'DIV with empty attributes and content' );
+
+               assert.equal( mw.html.element( 'p', {}, 12 ), '<p>12</p>', 'numbers as content cast to strings' );
+
+               assert.equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'number as attribute value' );
+
+               assert.equal(
+                       mw.html.element(
+                               'div',
+                               {},
+                               new mw.html.Raw(
+                                       mw.html.element( 'img', { src: '<' } )
+                               )
+                       ),
+                       '<div><img src="&lt;"/></div>',
+                       'unescaped content with mw.html.Raw'
+               );
+
+               assert.equal(
+                       mw.html.element(
+                               'option',
+                               {
+                                       selected: true
+                               },
+                               'Foo'
+                       ),
+                       '<option selected="selected">Foo</option>',
+                       'boolean true attribute value'
+               );
+
+               assert.equal(
+                       mw.html.element(
+                               'option',
+                               {
+                                       value: 'foo',
+                                       selected: false
+                               },
+                               'Foo'
+                       ),
+                       '<option value="foo">Foo</option>',
+                       'boolean false attribute value'
+               );
+
+               assert.equal(
+                       mw.html.element( 'div', null, 'a' ),
+                       '<div>a</div>',
+                       'Skip attributes with null' );
+
+               assert.equal(
+                       mw.html.element( 'a', {
+                               href: 'http://mediawiki.org/w/index.php?title=RL&action=history'
+                       }, 'a' ),
+                       '<a href="http://mediawiki.org/w/index.php?title=RL&amp;action=history">a</a>',
+                       'Andhor tag with attributes and content'
+               );
+       } );
+
+}( mediaWiki ) );
index 4f273bc..43b324e 100644 (file)
        QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
                setup: function () {
                        this.originalMwLanguage = mw.language;
+                       this.parserDefaults = mw.jqueryMsg.getParserDefaults();
+                       mw.jqueryMsg.setParserDefaults( {
+                               magic: {
+                                       SITENAME: 'Wiki'
+                               }
+                       } );
 
                        specialCharactersPageName = '"Who" wants to be a millionaire & live on \'Exotic Island\'?';
 
                        expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
                        expectedListUsersSitename = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户' +
-                               mw.config.get( 'wgSiteName' ) + '</a>';
+                               'Wiki</a>';
 
                        expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
 
@@ -32,6 +38,7 @@
                },
                teardown: function () {
                        mw.language = this.originalMwLanguage;
+                       mw.jqueryMsg.setParserDefaults( this.parserDefaults );
                },
                config: {
                        wgArticlePath: '/wiki/$1',
                assert.equal( formatParse( 'plural-msg', 1 ), 'Found 1 item', 'Singular test for english' );
                assert.equal( formatParse( 'plural-msg', 2 ), 'Found 2 items', 'Plural test for english' );
                assert.equal( formatParse( 'plural-msg-explicit-forms-nested', 6 ), 'Found 6 results', 'Plural message with explicit plural forms' );
-               assert.equal( formatParse( 'plural-msg-explicit-forms-nested', 0 ), 'Found no results in ' + mw.config.get( 'wgSiteName' ), 'Plural message with explicit plural forms, with nested {{SITENAME}}' );
+               assert.equal( formatParse( 'plural-msg-explicit-forms-nested', 0 ), 'Found no results in Wiki', 'Plural message with explicit plural forms, with nested {{SITENAME}}' );
                assert.equal( formatParse( 'plural-msg-explicit-forms-nested', 1 ), 'Found 1 result', 'Plural message with explicit plural forms with placeholder nested' );
        } );
 
                mw.user.options.set( 'gender', originalGender );
        } );
 
+       QUnit.test( 'Case changing', 8, function ( assert ) {
+               mw.messages.set( 'to-lowercase', '{{lc:thIS hAS MEsSed uP CapItaliZatiON}}' );
+               assert.equal( formatParse( 'to-lowercase' ), 'this has messed up capitalization', 'To lowercase' );
+
+               mw.messages.set( 'to-caps', '{{uc:thIS hAS MEsSed uP CapItaliZatiON}}' );
+               assert.equal( formatParse( 'to-caps' ), 'THIS HAS MESSED UP CAPITALIZATION', 'To caps' );
+
+               mw.messages.set( 'uc-to-lcfirst', '{{lcfirst:THis hAS MEsSed uP CapItaliZatiON}}' );
+               mw.messages.set( 'lc-to-lcfirst', '{{lcfirst:thIS hAS MEsSed uP CapItaliZatiON}}' );
+               assert.equal( formatParse( 'uc-to-lcfirst' ), 'tHis hAS MEsSed uP CapItaliZatiON', 'Lcfirst caps' );
+               assert.equal( formatParse( 'lc-to-lcfirst' ), 'thIS hAS MEsSed uP CapItaliZatiON', 'Lcfirst lowercase' );
+
+               mw.messages.set( 'uc-to-ucfirst', '{{ucfirst:THis hAS MEsSed uP CapItaliZatiON}}' );
+               mw.messages.set( 'lc-to-ucfirst', '{{ucfirst:thIS hAS MEsSed uP CapItaliZatiON}}' );
+               assert.equal( formatParse( 'uc-to-ucfirst' ), 'THis hAS MEsSed uP CapItaliZatiON', 'Ucfirst caps' );
+               assert.equal( formatParse( 'lc-to-ucfirst' ), 'ThIS hAS MEsSed uP CapItaliZatiON', 'Ucfirst lowercase' );
+
+               mw.messages.set( 'mixed-to-sentence', '{{ucfirst:{{lc:thIS hAS MEsSed uP CapItaliZatiON}}}}' );
+               assert.equal( formatParse( 'mixed-to-sentence' ), 'This has messed up capitalization', 'To sentence case' );
+               mw.messages.set( 'all-caps-except-first', '{{lcfirst:{{uc:thIS hAS MEsSed uP CapItaliZatiON}}}}' );
+               assert.equal( formatParse( 'all-caps-except-first' ), 'tHIS HAS MESSED UP CAPITALIZATION', 'To opposite sentence case' );
+       } );
+
        QUnit.test( 'Grammar', 2, function ( assert ) {
-               assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'Grammar Test with sitename' );
+               assert.equal( formatParse( 'grammar-msg' ), 'Przeszukaj Wiki', 'Grammar Test with sitename' );
 
                mw.messages.set( 'grammar-msg-wrong-syntax', 'Przeszukaj {{GRAMMAR:grammar_case_xyz}}' );
                assert.equal( formatParse( 'grammar-msg-wrong-syntax' ), 'Przeszukaj ', 'Grammar Test with wrong grammar template syntax' );
 
                assertBothModes( assert, [ 'plural-msg', 5 ], 'Found 5 items', 'plural is resolved' );
 
-               assertBothModes( assert, [ 'grammar-msg' ], 'Przeszukaj ' + mw.config.get( 'wgSiteName' ), 'grammar is resolved' );
+               assertBothModes( assert, [ 'grammar-msg' ], 'Przeszukaj Wiki', 'grammar is resolved' );
 
                mw.config.set( 'wgUserLanguage', 'en' );
                assertBothModes( assert, [ 'formatnum-msg', '987654321.654321' ], '987,654,321.654', 'formatnum is resolved' );
                        message[ format ]();
                        assert.strictEqual( outerCalled, shouldCall, 'Outer function called for ' + key );
                        assert.strictEqual( innerCalled, shouldCall, 'Inner function called for ' + key );
+                       delete mw.messages[ format ];
                }
 
                verifyGetMessageFunction( 'curly-brace', 'parse', true );
                assert.equal( logSpy.callCount, 2, 'mw.log.warn calls' );
        } );
 
+       QUnit.test( 'Integration', 5, function ( assert ) {
+               var expected, logSpy, msg;
+
+               expected = '<b><a title="Bold" href="/wiki/Bold">Bold</a>!</b>';
+               mw.messages.set( 'integration-test', '<b>[[Bold]]!</b>' );
+
+               this.suppressWarnings();
+               logSpy = this.sandbox.spy( mw.log, 'warn' );
+               assert.equal(
+                       window.gM( 'integration-test' ),
+                       expected,
+                       'Global function gM() works correctly'
+               );
+               assert.equal( logSpy.callCount, 1, 'mw.log.warn called' );
+               this.restoreWarnings();
+
+               assert.equal(
+                       mw.message( 'integration-test' ).parse(),
+                       expected,
+                       'mw.message().parse() works correctly'
+               );
+
+               assert.equal(
+                       $( '<span>' ).msg( 'integration-test' ).html(),
+                       expected,
+                       'jQuery plugin $.fn.msg() works correctly'
+               );
+
+               mw.messages.set( 'integration-test-extlink', '[$1 Link]' );
+               msg = mw.message(
+                       'integration-test-extlink',
+                       $( '<a>' ).attr( 'href', 'http://example.com/' )
+               );
+               msg.parse(); // Not a no-op
+               assert.equal(
+                       msg.parse(),
+                       '<a href="http://example.com/">Link</a>',
+                       'Calling .parse() multiple times does not duplicate link contents'
+               );
+       } );
+
 }( mediaWiki, jQuery ) );
diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.requestIdleCallback.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.requestIdleCallback.test.js
new file mode 100644 (file)
index 0000000..3772097
--- /dev/null
@@ -0,0 +1,121 @@
+( function ( mw ) {
+       QUnit.module( 'mediawiki.requestIdleCallback', QUnit.newMwEnvironment( {
+               setup: function () {
+                       var time = mw.now(),
+                               clock = this.clock = this.sandbox.useFakeTimers();
+
+                       this.tick = function ( forward ) {
+                               time += forward;
+                               clock.tick( forward );
+                       };
+                       this.sandbox.stub( mw, 'now', function () {
+                               return time;
+                       } );
+
+                       // Don't test the native version (if available)
+                       this.mwRIC = mw.requestIdleCallback;
+                       mw.requestIdleCallback = mw.requestIdleCallbackInternal;
+               },
+               teardown: function () {
+                       mw.requestIdleCallback = this.mwRIC;
+               }
+       } ) );
+
+       // Basic scheduling of callbacks
+       QUnit.test( 'callback', 3, function ( assert ) {
+               var sequence,
+                       tick = this.tick;
+
+               mw.requestIdleCallback( function () {
+                       sequence.push( 'x' );
+                       tick( 30 );
+               } );
+               mw.requestIdleCallback( function () {
+                       tick( 5 );
+                       sequence.push( 'y' );
+                       tick( 30 );
+               } );
+               // Task Z is not run in the first sequence because the
+               // first two tasks consumed the available 50ms budget.
+               mw.requestIdleCallback( function () {
+                       sequence.push( 'z' );
+                       tick( 30 );
+               } );
+
+               sequence = [];
+               tick( 1000 );
+               assert.deepEqual( sequence, [ 'x', 'y' ] );
+
+               sequence = [];
+               tick( 1000 );
+               assert.deepEqual( sequence, [ 'z' ] );
+
+               sequence = [];
+               tick( 1000 );
+               assert.deepEqual( sequence, [] );
+       } );
+
+       // Schedule new callbacks within a callback that tick
+       // the clock. If the budget is exceeded, the newly scheduled
+       // task is delayed until the next idle period.
+       QUnit.test( 'nest-tick', 3, function ( assert ) {
+               var sequence,
+                       tick = this.tick;
+
+               mw.requestIdleCallback( function () {
+                       sequence.push( 'x' );
+                       tick( 30 );
+               } );
+               // Task Y is a task that schedules another task.
+               mw.requestIdleCallback( function () {
+                       function other() {
+                               sequence.push( 'y' );
+                               tick( 35 );
+                       }
+                       mw.requestIdleCallback( other );
+               } );
+               mw.requestIdleCallback( function () {
+                       sequence.push( 'z' );
+                       tick( 30 );
+               } );
+
+               sequence = [];
+               tick( 1000 );
+               assert.deepEqual( sequence, [ 'x', 'z' ] );
+
+               sequence = [];
+               tick( 1000 );
+               assert.deepEqual( sequence, [ 'y' ] );
+
+               sequence = [];
+               tick( 1000 );
+               assert.deepEqual( sequence, [] );
+       } );
+
+       // Schedule new callbacks within a callback that run quickly.
+       // Note how the newly scheduled task gets to run as part of the
+       // current idle period (budget allowing).
+       QUnit.test( 'nest-quick', 2, function ( assert ) {
+               var sequence,
+                       tick = this.tick;
+
+               mw.requestIdleCallback( function () {
+                       sequence.push( 'x' );
+                       mw.requestIdleCallback( function () {
+                               sequence.push( 'x-expand' );
+                       } );
+               } );
+               mw.requestIdleCallback( function () {
+                       sequence.push( 'y' );
+               } );
+
+               sequence = [];
+               tick( 1000 );
+               assert.deepEqual( sequence, [ 'x', 'y', 'x-expand' ] );
+
+               sequence = [];
+               tick( 1000 );
+               assert.deepEqual( sequence, [] );
+       } );
+
+}( mediaWiki ) );
index ac4f16c..ed3f2cd 100644 (file)
                this.restoreWarnings();
        } );
 
+       QUnit.test( 'mw.format', 2, function ( assert ) {
+               assert.equal(
+                       mw.format( 'Format $1 $2', 'foo', 'bar' ),
+                       'Format foo bar',
+                       'Simple parameters'
+               );
+               assert.equal(
+                       mw.format( 'Format $1 $2' ),
+                       'Format $1 $2',
+                       'Missing parameters'
+               );
+       } );
+
        QUnit.test( 'mw.Map', 35, function ( assert ) {
                var arry, conf, funky, globalConf, nummy, someValues;
 
                } );
        } );
 
-       QUnit.asyncTest( 'mw.loader.using( .. ).promise', 2, function ( assert ) {
+       QUnit.asyncTest( 'mw.loader.using( .. ) Promise', 2, function ( assert ) {
                var isAwesomeDone;
 
                mw.loader.testCallback = function () {
        } );
 
        // @import (bug 31676)
-       QUnit.asyncTest( 'mw.loader.implement( styles has @import)', 7, function ( assert ) {
+       QUnit.asyncTest( 'mw.loader.implement( styles has @import )', 7, function ( assert ) {
                var isJsExecuted, $element;
 
                mw.loader.implement(
                } );
        } );
 
-       QUnit.test( 'mw.loader erroneous indirect dependency', 4, function ( assert ) {
+       QUnit.test( 'mw.loader with broken indirect dependency', 4, function ( assert ) {
                // don't emit an error event
                this.sandbox.stub( mw, 'track' );
 
                assert.strictEqual( mw.track.callCount, 1 );
        } );
 
+       QUnit.test( 'mw.loader with circular dependency', 1, function ( assert ) {
+               mw.loader.register( [
+                       [ 'test.circle1', '0', [ 'test.circle2' ] ],
+                       [ 'test.circle2', '0', [ 'test.circle3' ] ],
+                       [ 'test.circle3', '0', [ 'test.circle1' ] ]
+               ] );
+               assert.throws( function () {
+                       mw.loader.using( 'test.circle3' );
+               }, /Circular/, 'Detect circular dependency' );
+       } );
+
        QUnit.test( 'mw.loader out-of-order implementation', 9, function ( assert ) {
                mw.loader.register( [
                        [ 'test.module4', '0' ],
                } ).always( QUnit.start );
        } );
 
-       QUnit.test( 'mw.html', 13, function ( assert ) {
-               assert.throws( function () {
-                       mw.html.escape();
-               }, TypeError, 'html.escape throws a TypeError if argument given is not a string' );
-
-               assert.equal( mw.html.escape( '<mw awesome="awesome" value=\'test\' />' ),
-                       '&lt;mw awesome=&quot;awesome&quot; value=&#039;test&#039; /&gt;', 'escape() escapes special characters to html entities' );
-
-               assert.equal( mw.html.element(),
-                       '<undefined/>', 'element() always returns a valid html string (even without arguments)' );
-
-               assert.equal( mw.html.element( 'div' ), '<div/>', 'element() Plain DIV (simple)' );
-
-               assert.equal( mw.html.element( 'div', {}, '' ), '<div></div>', 'element() Basic DIV (simple)' );
-
-               assert.equal(
-                       mw.html.element(
-                               'div', {
-                                       id: 'foobar'
-                               }
-                       ),
-                       '<div id="foobar"/>',
-                       'html.element DIV (attribs)' );
-
-               assert.equal( mw.html.element( 'p', null, 12 ), '<p>12</p>', 'Numbers are valid content and should be casted to a string' );
-
-               assert.equal( mw.html.element( 'p', { title: 12 }, '' ), '<p title="12"></p>', 'Numbers are valid attribute values' );
-
-               // Example from https://www.mediawiki.org/wiki/ResourceLoader/Default_modules#mediaWiki.html
-               assert.equal(
-                       mw.html.element(
-                               'div',
-                               {},
-                               new mw.html.Raw(
-                                       mw.html.element( 'img', { src: '<' } )
-                               )
-                       ),
-                       '<div><img src="&lt;"/></div>',
-                       'Raw inclusion of another element'
-               );
-
-               assert.equal(
-                       mw.html.element(
-                               'option', {
-                                       selected: true
-                               }, 'Foo'
-                       ),
-                       '<option selected="selected">Foo</option>',
-                       'Attributes may have boolean values. True copies the attribute name to the value.'
-               );
-
-               assert.equal(
-                       mw.html.element(
-                               'option', {
-                                       value: 'foo',
-                                       selected: false
-                               }, 'Foo'
-                       ),
-                       '<option value="foo">Foo</option>',
-                       'Attributes may have boolean values. False keeps the attribute from output.'
-               );
-
-               assert.equal( mw.html.element( 'div',
-                       null, 'a' ),
-                       '<div>a</div>',
-                       'html.element DIV (content)' );
-
-               assert.equal( mw.html.element( 'a',
-                       { href: 'http://mediawiki.org/w/index.php?title=RL&action=history' }, 'a' ),
-                       '<a href="http://mediawiki.org/w/index.php?title=RL&amp;action=history">a</a>',
-                       'html.element DIV (attribs + content)' );
-
-       } );
-
        QUnit.test( 'mw.hook', 13, function ( assert ) {
                var hook, add, fire, chars, callback;
 
index 5ea7a81..d3c4748 100644 (file)
                        'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)',
                        'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)',
                        'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)',
+                       'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko',
                        // IE Mobile
                        'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; NOKIA; Lumia 800)',
+                       // Edge
+                       'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246',
+                       // Edge Mobile
+                       'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 640 XL LTE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Edge/12.10166',
                        // BlackBerry 6+
                        'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.570 Mobile Safari/534.8+',
                        'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+',
index bd14e41..fed0258 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -21,6 +21,8 @@
  * @ingroup Media
  */
 
+use MediaWiki\Logger\LoggerFactory;
+
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 require __DIR__ . '/includes/WebStart.php';
 
@@ -262,7 +264,8 @@ function wfStreamThumb( array $params ) {
                );
                return;
        } catch ( MWException $e ) {
-               wfThumbError( 500, $e->getHTML() );
+               wfThumbError( 500, $e->getHTML(), 'Exception caught while extracting thumb name',
+                       array( 'exception' => $e ) );
                return;
        }
 
@@ -310,13 +313,14 @@ function wfStreamThumb( array $params ) {
        $thumbPath = $img->getThumbPath( $thumbName );
        if ( $img->getRepo()->fileExists( $thumbPath ) ) {
                $starttime = microtime( true );
-               $success = $img->getRepo()->streamFile( $thumbPath, $headers );
+               $status = $img->getRepo()->streamFileWithStatus( $thumbPath, $headers );
                $streamtime = microtime( true ) - $starttime;
 
-               if ( !$success ) {
-                       wfThumbError( 500, 'Could not stream the file' );
-               } else {
+               if ( $status->isOK() ) {
                        RequestContext::getMain()->getStats()->timing( 'media.thumbnail.stream', $streamtime );
+               } else {
+                       wfThumbError( 500, 'Could not stream the file', null, array( 'file' => $thumbName,
+                               'path' => $thumbPath, 'error' => $status->getWikiText() ) );
                }
                return;
        }
@@ -356,12 +360,13 @@ function wfStreamThumb( array $params ) {
        }
 
        if ( $errorMsg !== false ) {
-               wfThumbError( $errorCode, $errorMsg );
+               wfThumbError( $errorCode, $errorMsg, null, array( 'file' => $thumbName, 'path' => $thumbPath ) );
        } else {
                // Stream the file if there were no errors
-               $success = $thumb->streamFile( $headers );
-               if ( !$success ) {
-                       wfThumbError( 500, 'Could not stream the file' );
+               $status = $thumb->streamFileWithStatus( $headers );
+               if ( !$status->isOK() ) {
+                       wfThumbError( 500, 'Could not stream the file', null, array(
+                               'file' => $thumbName, 'path' => $thumbPath, 'error' => $status->getWikiText() ) );
                }
        }
 }
@@ -376,23 +381,28 @@ function wfStreamThumb( array $params ) {
  * @return array (MediaTransformOutput|bool, string|bool error message HTML)
  */
 function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath ) {
-       global $wgMemc, $wgAttemptFailureEpoch;
+       global $wgAttemptFailureEpoch;
 
-       $key = wfMemcKey( 'attempt-failures', $wgAttemptFailureEpoch,
-               $file->getRepo()->getName(), $file->getSha1(), md5( $thumbName ) );
+       $cache = ObjectCache::getLocalClusterInstance();
+       $key = $cache->makeKey(
+               'attempt-failures',
+               $wgAttemptFailureEpoch,
+               $file->getRepo()->getName(),
+               $file->getSha1(),
+               md5( $thumbName )
+       );
 
        // Check if this file keeps failing to render
-       if ( $wgMemc->get( $key ) >= 4 ) {
+       if ( $cache->get( $key ) >= 4 ) {
                return array( false, wfMessage( 'thumbnail_image-failure-limit', 4 ) );
        }
 
        $done = false;
        // Record failures on PHP fatals in addition to caching exceptions
-       register_shutdown_function( function () use ( &$done, $key ) {
+       register_shutdown_function( function () use ( $cache, &$done, $key ) {
                if ( !$done ) { // transform() gave a fatal
-                       global $wgMemc;
                        // Randomize TTL to reduce stampedes
-                       $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+                       $cache->incrWithInit( $key, $cache::TTL_HOUR + mt_rand( 0, 300 ) );
                }
        } );
 
@@ -415,18 +425,15 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
                                'doWork' => function () use ( $file, $params ) {
                                        return $file->transform( $params, File::RENDER_NOW );
                                },
-                               'getCachedWork' => function () use ( $file, $params, $thumbPath ) {
+                               'doCachedWork' => function () use ( $file, $params, $thumbPath ) {
                                        // If the worker that finished made this thumbnail then use it.
                                        // Otherwise, it probably made a different thumbnail for this file.
                                        return $file->getRepo()->fileExists( $thumbPath )
                                                ? $file->transform( $params, File::RENDER_NOW )
                                                : false; // retry once more in exclusive mode
                                },
-                               'fallback' => function () {
-                                       return wfMessage( 'generic-pool-error' )->parse();
-                               },
                                'error' => function ( Status $status ) {
-                                       return $status->getHTML();
+                                       return wfMessage( 'generic-pool-error' )->parse() . '<hr>' . $status->getHTML();
                                }
                        )
                );
@@ -445,7 +452,7 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
 
        if ( !$thumb || $thumb->isError() ) {
                // Randomize TTL to reduce stampedes
-               $wgMemc->incrWithInit( $key, 3600 + mt_rand( 0, 300 ) );
+               $cache->incrWithInit( $key, $cache::TTL_HOUR + mt_rand( 0, 300 ) );
        }
 
        return array( $thumb, $errorHtml );
@@ -577,9 +584,12 @@ function wfThumbErrorText( $status, $msgText ) {
  *
  * @param int $status
  * @param string $msgHtml HTML
+ * @param string $msgText Short error description, for internal logging. Defaults to $msgHtml.
+ *   Only used for HTTP 500 errors.
+ * @param array $context Error context, for internal logging. Only used for HTTP 500 errors.
  * @return void
  */
-function wfThumbError( $status, $msgHtml ) {
+function wfThumbError( $status, $msgHtml, $msgText = null, $context = array() ) {
        global $wgShowHostnames;
 
        header( 'Cache-Control: no-cache' );
@@ -590,6 +600,7 @@ function wfThumbError( $status, $msgHtml ) {
                HttpStatus::header( 403 );
                header( 'Vary: Cookie' );
        } else {
+               LoggerFactory::getInstance( 'thumb' )->error( $msgText ?: $msgHtml, $context );
                HttpStatus::header( 500 );
        }
        if ( $wgShowHostnames ) {